我已经看过所有类似的问题,但是我已经仔细检查过了,肯定有一些奇怪的事情发生了。

在一台服务器(带有git 1.8.1的Solaris)上,我克隆了git存储库,然后将.git文件夹复制到现有的Live文件中。这个很好用,我可以跑了

git status

然后

git diff [filename]

检查任何不同的文件。

但在另一台服务器上(使用git 1.7.6的Solaris),我做的完全一样。

git diff [filename]

即使文件的内容绝对不同,也不显示任何内容。我还测试了添加一个新文件,提交然后编辑。同一问题,git status显示文件已更改,但git diff未显示任何内容。如果我下载更改的文件并在本地运行diff,那么我会得到diff输出。

它在你的索引里吗?如果是这样,您可以使用git diff --cached查看差异。

git diff --cached也给了我空白输出。

git log也没有输出。

假设确实存在一个bug,您应该能够创建一个最小的示例。尝试复制并共享样本。

1)文件模式已更改?在这里寻找core.fileMode选项2)另外,当console2实际运行时,console2 config(我在git下有)也面临类似的问题。可能有点像文件锁,使得文件发生了变化。

我将文件添加到索引:

git add file_name

然后跑:

git diff --cached file_name

您可以在这里看到gitdiff的描述。

如果您需要撤消git添加,那么请参见以下内容:如何在提交之前撤消"git添加"?

好极了!!这正是我要找的!谢谢!

要撤消添加,只需运行git reset HEAD,它将把所有内容从您的临时区域中带出。如果需要特定的文件,可以执行git reset HEAD /path/to/file。

还是什么都没有。现在呢?

git status可能有一些不同的原因,但git diff可能没有。

文件的模式(权限位)已更改——例如,从777更改为700。

换行样式从crlf(dos)改为lf(unix)

最简单的方法是运行git format-patch HEAD^并查看生成的补丁的内容。

如果更改权限文件,则应用:git config core.filemode false作为忽略文件权限

这对于许多情况都是非常有用的命令。

您如何发现从CRLF到LF的换行是Git状态将显示差异而Git Diff将不显示的情况之一?

有一个使用Windows的同事可以帮助你找到关于行尾的各种有趣的事情。我认为可能是"git diff"确实显示了从crlf到lf的变化的情况,不过——这可能取决于您的配置。我已经有一段时间没有使用Windows了,所以我不知道默认值是什么样子的。

对我来说,这与文件权限有关。我的项目中有一个Mac/Linux的用户似乎提交了一些非默认权限的文件,而我的Windows Git客户端无法复制这些文件。我的解决方案是告诉Git忽略文件权限:

git config core.fileMode false

其他见解:如何使git忽略文件模式(chmod)更改?

这解决了我在处理一堆文件时遇到的一个问题,尽管我认为是在创建/修改文件的时候。

我遇到了一个问题,一些程序修改了数百个行尾,gitdiff列出了所有更改后的源文件。在修复了行尾之后,git status仍然列出了修改后的文件。

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

git add -A

git reset

core.filemode设为假。

真的很奇怪,但似乎有用!

谢谢您!工作得很有魅力!

是的,Git重置工作!

我怀疑您的Git安装或存储库有问题。

试运行:

GIT_TRACE=2 git

看看有没有什么有用的。如果这不起作用,就走着瞧到底出了什么问题:

strace git

@汤伊:既然这值得你赏金,我很想看看你对你同样失败的原因了解多少。

在我的例子中,我将-F标志添加到LESSenv变量中,如果要显示的信息少于一个屏幕,该变量会告诉less退出。因为Git使用较少的寻呼机,而我有一个小的差异,所以没有显示任何内容。要么我不得不将-X添加到LESSenv中,它在屏幕上显示内容,即使退出较少,要么删除-F。GIT_TRACE显示LESS正在执行,这提醒我最近我更改了LESS变量。在@rcwxok的回答中也有同样的原因,但他想就GIT_TRACE的帮助发表评论。

这个答案给我提供了"寻呼机"的提示,并引导我找到在.gitconfig中设置core.pager的解决方案,这对我来说非常有效。

我有一个类似的问题:git diff会显示出差异,但git diff不会。结果我把LESS设置为一个字符串,包括-F(--quit-if-one-screen)。删除那个标志解决了问题。

除了删除-F,添加-X也可能有效,关于类似的情况,请参阅下面的答案。

谢谢你!把我逼疯了。

遇到这个问题。我的案例类似于@rcwxok发布的LESS期。

在我的例子中,我将PAGER环境变量设置为PAGER='less -RSF'。

但是,与前面的答案不同,我不想删除-F选项,因为我明确地将它放在那里,希望避免显示LESS中的差异(如果它比屏幕短)。

为了得到预期的结果,我没有删除-F,而是添加了-X:PAGER='less -RSFX'。这两者都解决了git diff的问题,而且还防止了与LESS之间的短期差异。

希望这能帮助别人。

大写看起来很奇怪。你的意思是"更少的rsfx"而不是"更少的rsfx"?选项是否正确?

是的,谢谢,这是个错误。不知道是怎么回事。现在固定。

简短回答

运行git add有时会有所帮助。例子

Git状态显示已更改的文件,而Git Diff未显示任何内容…

> git status

On branch master

Changes not staged for commit:

(use"git add ..." to update what will be committed)

(use"git checkout -- ..." 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

>

在我看来,这就像是"战胜症状"而不是"治愈疾病"…;)

@Einjohn你认为这个病例中的疾病是什么?

这种病可能是好几件事。正如其他人所提到的,这可能是权限问题,或者是行尾的问题。它也可能已经是阶段性的更改。但是,最后一种可能性不适合您的示例。然而,有了你的解决方案,你将不知道原因(疾病),你只需消除问题(看似错误的空差异(症状))。明确地说:我不是说这是一个坏的解决方案。如果他/她只是想让问题消失,这可能会对某人有所帮助。…希望我能对我的疾病隐喻有所了解。:)

@Einjohn大部分时间都是行尾。似乎status和diff有不同的处理方式。

我也遇到过类似的问题。git diff file没有显示任何内容,因为我在git索引中添加了文件,文件名的某些部分大写:GeoJSONContainer.js。后来,我把它改名为GeoJSONContainer.js,更改不再被跟踪。git diff GeoJsonContainer.js什么也没显示。必须从索引中删除带有强制标志的文件,然后再次添加该文件:

git rm -f GeoJSONContainer.js

git add GeoJSONContainer.js

您并没有真正问一个实际的问题,但是由于这是一个通用的用例,我经常使用这里的功能。您可以自己尝试,看看错误是否仍然存在。

我对您的用例的假设:您有一个包含文件和目录的现有目录,现在希望将其转换为从其他地方克隆的Git存储库,而不更改当前目录中的任何数据。

有两种方法。

clone repo-mv .gitgit reset--硬

这个方法就是您所做的——将现有的repo克隆到一个空目录中,然后将.git目录移到目标目录中。要无问题地工作,通常需要运行

git reset --hard

但是,这将更改当前目录中文件的状态。您可以在目录的完整副本/rsync上尝试此操作,并研究所做的更改。至少在之后,您应该不再看到git log和status之间的差异。

初始新回购-指向原点

第二个不那么令人不安:CD进入你的目的地,开始一个新的回购

git init

然后你告诉新回购,它在其他地方有一个祖先:

git remote add origin original_git_repo_path

然后安全

git fetch origin master

在不更改本地文件的情况下复制数据。现在一切都会好起来的。

我总是推荐第二种方法来减少错误的发生。

你似乎暗示这是一个git错误。好吧,可以。我仍然认为我缺乏适当的Git理解,因为我不如Linus聪明;-)

@托伊:不,我不是在暗示这是个git错误,也不是在暗示相反的情况。我不熟悉Git的内部结构。但作为一般经验法则,通过将.git文件夹移动到其他工作区,我们可能会违反git的假设。如果这导致不稳定的行为,我们不能责怪Git,我们必须责怪自己玩了Git的把戏。git提供了修复方法,例如reset --hard。只是那不是我们想要的。这正是推荐使用init/remote add方式的原因,而且一切都很好。

@Towi和Oliver P:虽然我理解您希望解决您的特定错误案例,但有时建议您遵循一般建议—尤其是如果它们完全适合您的用例。也没有数据丢失。而remote add的做事方式仍然适用于像奥利弗P所描述的那种混乱的情况。

没有评论的投反对票对改善这个答案没有帮助,整个网站也没有帮助。不管谁投反对票,请留下评论,这样问题就可以解决了。

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

例如,我有一个mainpage.xaml文件。在文件资源管理器中,我将新的mainpage.xaml文件粘贴到当前repo中的文件上。我在另一台机器上完成了这项工作,然后把文件粘贴在这里。

4b6a213ef0b195e5b21b53dd390c0ecc.png

文件显示修改,但当我运行gitdiff时,它不会显示更改。这可能是因为文件上的文件信息已经更改,Git知道它实际上不是同一个文件。有趣。

f104895cb99f696deaa37ec9fd1af7cf.png

您可以看到,当我对文件运行diff时,它不显示任何内容,只返回提示。

我用以下方式描述了这个问题:如果我打字

$ git diff

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

如果我打字

$ git diff

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

最后,通过阅读,我注意到GitDiff实际上调用mingw64indiff.exe来完成这项工作。

成交了。我正在运行Windows,安装了另一个bash实用程序,它改变了我的路径,因此它不再指向我的mingw64in目录。

所以如果你键入:差异比较它只是返回提示,您可能有这个问题。

The actual diff.exe which is run by git is located in your mingw64\bin

directory

最后,为了解决这个问题,我实际上将mingw64in目录复制到了git正在查找的位置。我试过了,但还是没用。

然后,我关闭了我的GitBash窗口,再次打开它,我的同一个回购失败了,现在它工作了。

希望这对你也有帮助。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐