我看过所有类似的问题。然而,我又检查了一遍,确实发生了一些奇怪的事情。
在一台服务器上(Solaris with Git 1.8.1),我克隆了Git存储库,然后将. Git文件夹复制到我现有的活动文件中。这很好,我可以跑了
git status
then
git diff [filename]
检查任何不同的文件。
在另一台服务器上(Solaris with Git 1.7.6),我做的完全相同
git diff [filename]
即使文件内容完全不同,也不会显示任何内容。我还测试了添加一个新文件,提交它,然后编辑。同样的问题,git status显示文件已更改,但git diff没有显示任何内容。如果我下载更改后的文件并在本地运行diff,那么我将得到diff输出。
我对你的用例的假设:
您有一个包含文件和目录的现有目录,现在希望将其转换为从其他地方克隆的Git存储库,而不需要更改当前目录中的任何数据。
实际上有两种方法。
克隆repo - mv .git - git重置-硬
此方法就是您所做的—将现有存储库克隆到一个空目录中,然后将.git目录移动到目标目录中。为了顺利工作,通常需要运行
git reset --hard
但是,这会改变当前目录中文件的状态。您可以在目录的完整复制/rsync上尝试此操作,并研究有哪些变化。至少之后你应该不再看到git日志和状态之间的差异。
Init新存储库-指向原点
第二种方法不那么麻烦:cd到您的目的地,并用
git init
然后你告诉这个新的存储库,它在其他地方有一个祖先:
git remote add origin original_git_repo_path
然后安全
git fetch origin master
在不更改本地文件的情况下复制数据。现在应该没事了。
我总是推荐第二种更不容易出错的方法。
简短的回答
运行git add有时会有所帮助。
例子
Git状态显示已更改的文件和Git diff显示什么都没有…
> git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: package.json
no changes added to commit (use "git add" and/or "git commit -a")
> git diff
>
运行git add可以解决不一致的问题。
> git add
> git status
On branch master
nothing to commit, working directory clean
>
博士TL;
行结束问题:
将自专制设置更改为默认true。例如,在Windows上签出Windows风格的行结束符,并在远程Git存储库中提交linux风格的行结束符:
Git配置——全局核心。autocrlf真实
在Windows机器上,将存储库中的所有文件更改为Windows样式:
unix2dos * *
Git添加所有修改过的文件,修改过的文件将会是:
Git添加。
git状态
背景
平台:Windows, WSL
我偶尔会遇到这个问题,git状态显示我修改了文件,而git diff显示什么都没有。这很可能是行结束符的问题。
根本原因
我经常遇到这个问题的原因是我在一台Windows机器上工作,并且在WSL中与Git交互。在Linux和Windows设置之间切换很容易导致这种行尾问题。由于操作系统中使用的行结束格式不同:
Windows: \ r \ n
OS X / Linux: \n
常见的做法
当你在你的机器上安装Git时,它会要求你选择行结束设置。通常,常见的做法是在远程Git存储库上使用(提交)linux风格的行结束符,并在Windows计算机上检出Windows风格的行结束符。如果您使用默认设置,这就是Git为您做的。
这意味着如果你有一个shell脚本myScript.sh和Bash脚本myScript.sh。在您的存储库中,这些脚本在远程Git存储库中以linux样式的结尾存在,在您的Windows机器上以Windows样式的结尾存在。
我曾经检查shell脚本文件,并使用dos2unix更改脚本行结束,以便在WSL中运行shell脚本。这就是我遇到这个问题的原因。Git一直告诉我对行结束的修改已经更改,并询问是否提交更改。
解决方案
使用默认的行结束设置,如果更改了某些文件的行结束符(如使用dos2unix或dos2unix),请删除更改。
如果行尾更改已经存在,并且您想要删除它,尝试git添加它们,更改就会消失。
我对你的用例的假设:
您有一个包含文件和目录的现有目录,现在希望将其转换为从其他地方克隆的Git存储库,而不需要更改当前目录中的任何数据。
实际上有两种方法。
克隆repo - mv .git - git重置-硬
此方法就是您所做的—将现有存储库克隆到一个空目录中,然后将.git目录移动到目标目录中。为了顺利工作,通常需要运行
git reset --hard
但是,这会改变当前目录中文件的状态。您可以在目录的完整复制/rsync上尝试此操作,并研究有哪些变化。至少之后你应该不再看到git日志和状态之间的差异。
Init新存储库-指向原点
第二种方法不那么麻烦:cd到您的目的地,并用
git init
然后你告诉这个新的存储库,它在其他地方有一个祖先:
git remote add origin original_git_repo_path
然后安全
git fetch origin master
在不更改本地文件的情况下复制数据。现在应该没事了。
我总是推荐第二种更不容易出错的方法。
我又偶然发现了这个问题。但这一次发生的原因不同。
我将文件复制到存储库中以覆盖以前的版本。现在我可以看到文件被修改了,但是diff没有返回diff。
例如,我有一个主页。xaml文件。
在文件资源管理器中,我粘贴了一个新的主页。Xaml文件超过了我当前存储库中的一个。
我在另一台机器上做了这项工作,只是把文件粘贴到这里。
文件显示已修改,但当我运行git diff时,它不会显示更改。
这可能是因为文件中的fileinfo已经更改,Git知道它实际上不是同一个文件。有趣。
您可以看到,当我在文件上运行diff时,它什么也不显示,只是返回提示符。