我看过所有类似的问题。然而,我又检查了一遍,确实发生了一些奇怪的事情。

在一台服务器上(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 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
> 

其他回答

我有一个问题,其中数百行结束修改了一些程序和git diff列出所有源文件更改。在修复行尾之后,git状态仍然将文件列为已修改。

我可以通过将所有文件添加到索引,然后重新设置索引来修复这个问题。

git add -A
git reset

核心。文件模式设置为false。

我对你的用例的假设:

您有一个包含文件和目录的现有目录,现在希望将其转换为从其他地方克隆的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安装或存储库有问题。

尝试运行:

GIT_TRACE=2 git <command>

看看能不能找到有用的线索。如果这没有帮助,只需使用strace,看看哪里出了问题:

strace git <command>

正如在前面的回答中已经提到的,这种情况可能是由于行结束问题(CR/LF vs. LF)而出现的。我用这个命令解决了这个问题(在Git 2.22.0版本下):

git add --renormalize .

根据手册:

       --renormalize
           Apply the "clean" process freshly to all tracked files to
           forcibly add them again to the index. This is useful after
           changing core.autocrlf configuration or the text attribute in
           order to correct files added with wrong CRLF/LF line endings.
           This option implies -u.

我又偶然发现了这个问题。但这一次发生的原因不同。 我将文件复制到存储库中以覆盖以前的版本。现在我可以看到文件被修改了,但是diff没有返回diff。

例如,我有一个主页。xaml文件。 在文件资源管理器中,我粘贴了一个新的主页。Xaml文件超过了我当前存储库中的一个。 我在另一台机器上做了这项工作,只是把文件粘贴到这里。

文件显示已修改,但当我运行git diff时,它不会显示更改。

这可能是因为文件中的fileinfo已经更改,Git知道它实际上不是同一个文件。有趣。

您可以看到,当我在文件上运行diff时,它什么也不显示,只是返回提示符。