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

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


当前回答

许多其他答案涉及到行尾和核心的差异。autocrlf设置。确实是这样,但我想指出另一个类似的问题:git过滤器。

如果核心。如果selflf =true,那么该行为就像一个git涂抹或清除过滤器,当文本在工作树和索引之间移动时自动处理文本。

类似地,如果你在文件最后一次提交时改变了你的git过滤器设置,它可能会导致git状态的难以捉摸的差异,而这种差异不会在git diff中显示出来。即使git添加了X;git diff——cached——X,取决于配置的过滤器的性质。

This problem happened to me when using nbstripout, a python package that implements git filters that filter out metadata before adding Jupyter notebook files to the index and before diffing them. I resolved it by reverting the filter config settings to how they were before, running git restore on the affected files, and then re-applying the changes to my filter config (because I wanted to keep the new settings long-term). For me, the settings were stored in .git/config under the filter.nbstripout and diff.ipynb sections.

其他回答

博士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 diff会显示差异,但git diff <filename>不会。结果是我将LESS设置为一个包含-F(——quit-if-one-screen)的字符串。移除那面旗帜就解决了问题。

我使用git svn,有一个文件有这个问题。对文件的每个祖先使用ls-tree,我注意到其中一个有两个子文件夹——Submit和Submit。由于我使用的是Windows,所以不能同时签出它们,从而导致了这个问题。

解决方案是直接从TortoiseSVN Repo-browser中删除其中一个,然后运行git svn fetch,然后执行git reset——hard origin/trunk。

正如在前面的回答中已经提到的,这种情况可能是由于行结束问题(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.

Git diff -a将所有文件视为文本,它为我工作。