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

在一台服务器上(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安装或存储库有问题。

尝试运行:

GIT_TRACE=2 git <command>

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

strace git <command>

其他回答

对我来说,这与文件权限有关。 在我的项目上使用Mac/Linux的人似乎提交了一些具有非默认权限的文件,我的Windows Git客户端未能重现。

我的解决方案是告诉Git忽略文件权限:

git config core.fileMode false

其他见解:如何让Git忽略文件模式(chmod)的更改?

许多其他答案涉及到行尾和核心的差异。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.

我遇到了同样的问题,描述如下: 如果我输入

$ git diff

Git只是返回到提示符,没有任何错误。

如果我输入

$ git diff <filename>

Git只是返回到提示符,没有任何错误。

最后,通过阅读,我注意到git diff实际上调用mingw64\bin\diff.exe来完成这项工作。

是这样的。我正在运行Windows,并安装了另一个Bash实用程序,它改变了我的路径,因此它不再指向我的mingw64\bin目录。

如果你输入:

git diff

它只是返回到提示符,你可能有这个问题。

由git运行的div .exe位于你的mingw64\bin中 目录

最后,为了解决这个问题,我实际上复制了我的mingw64\bin目录到Git正在寻找的位置。我试过了,还是不行。

然后,我关闭我的Git Bash窗口并再次打开它,去到我的同一个存储库,现在它可以工作了。

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

博士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添加它们,更改就会消失。