linux git diff 显示,Git状态显示更改的文件,但Git Diff不显示
我已经看过所有类似的问题,但是我已经仔细检查过了,肯定有一些奇怪的事情发生了。在一台服务器(带有git 1.8.1的Solaris)上,我克隆了git存储库,然后将.git文件夹复制到现有的Live文件中。这个很好用,我可以跑了git status然后git diff [filename]检查任何不同的文件。但在另一台服务器上(使用git 1.7.6的Solaris),我做的完全一样。git di
我已经看过所有类似的问题,但是我已经仔细检查过了,肯定有一些奇怪的事情发生了。
在一台服务器(带有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中的文件上。我在另一台机器上完成了这项工作,然后把文件粘贴在这里。
文件显示修改,但当我运行gitdiff时,它不会显示更改。这可能是因为文件上的文件信息已经更改,Git知道它实际上不是同一个文件。有趣。
您可以看到,当我对文件运行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窗口,再次打开它,我的同一个回购失败了,现在它工作了。
希望这对你也有帮助。
更多推荐
所有评论(0)