git状态显示已更改的文件,但git diff不
我已经看过所有类似的问题,但是我已经加倍检查,一些奇怪的事情肯定会发生。
在一台服务器上(Solaris with git 1.8.1),我克隆了git仓库,然后将.git文件夹复制到我现有的活动文件中。 这工作完美,我可以运行
git status
然后
git diff [filename]
检查任何不同的文件。
在另一台服务器上(使用git 1.7.6的Solaris),我正在做同样的事情
git diff [filename]
什么都不显示,即使文件内容完全不同。 我也testing添加一个新的文件,提交然后编辑。 同样的问题, git status
显示文件已更改,但git diff
显示任何内容。 如果我下载更改后的文件并在本地运行diff,则会得到diff输出。
有几个原因为什么git status
可能会显示差异,但git diff
可能不会。
-
文件的模式(权限位)已更改 – 例如,从777到700。
-
换行样式从CRLF(DOS)更改为LF(UNIX)
找出发生的最简单的方法是运行git format-patch HEAD^
并查看生成的补丁说什么。
我将该文件添加到索引 :
git add file_name
然后跑:
git diff --cached file_name
你可以在这里看到git diff的描述。
如果你需要撤消你的git add,那么请看这里: 如何在提交之前撤销“git add”?
对我来说,这与文件权限有关。 有人在我的项目上的Mac / Linux似乎提交了一些非默认权限的文件,我的Windows git客户端无法重现。 我的解决scheme是告诉git忽略文件权限:
git config core.fileMode false
其他见解: 我如何让Git忽略文件模式(chmod)的变化?
我怀疑你的git安装或者你的版本库有问题。
尝试运行:
GIT_TRACE=2 git <command>
看看你是否有用。 如果这样做没有帮助,就直截了当地看看出了什么问题:
strace git <command>
我有一个类似的问题: git diff
会显示差异,但git diff <filename>
不会。 事实certificate,我把LESS
设置为包括-F
(– --quit-if-one-screen
)的string。 删除该标志解决了这个问题。
我遇到了一个问题,其中数百行结尾被某些程序修改,而git diff将所有源文件列为已更改。 修复行结束后,git状态仍然列出修改的文件。
我能够解决这个问题,通过添加所有文件索引,然后重置索引。
git add -A git reset
core.filemode
被设置为false。
跑进这个问题。 我的情况类似于@rcwxok发布的LESS
问题。
在我的情况下,我把PAGER
环境var设置为PAGER='less -RSF'
。
然而,与以前的答案不同,我不想删除-F
选项,因为我明确地将其放在那里,希望能够避免在比屏幕更短的情况下显示差异。
为了得到所需的结果,而不是删除-F
,我加了-X
: PAGER='less -RSFX'
。 这既解决了git diff
问题,另外它可以防止显示短小的差异。
希望这有助于某人。
我刚刚遇到类似的问题。 git diff file
没有显示任何内容,因为我将文件添加到了git索引,其中一部分名字是大写: GeoJSONContainer.js
。 之后,我将其重命名为GeoJsonContainer.js
并且更改停止跟踪。 git diff GeoJsonContainer.js
没有显示任何内容。 不得不用强制标志从索引中删除文件,然后重新添加文件:
git rm -f GeoJSONContainer.js git add GeoJSONContainer.js
你并没有真正问过一个实际的问题,但是因为这是一个普遍的用例,所以我经常使用这个工具。 你可以自己尝试,看看错误是否存在。
我对你的使用案例的假设:你有一个包含文件和目录的现有目录,现在想把它转换成从其他地方克隆的git存储库, 而不改变当前目录中的任何数据。
实际上有两种方法。
克隆回购 – mv .git
– git reset –hard
这个方法就是你所做的 – 将现有的repo克隆到一个空的目录中,然后将.git
目录移动到目标目录中。 要工作没有问题,这通常需要你然后运行
git reset --hard
但是,这将改变当前目录中的文件状态。 你可以在你的目录的完整拷贝/ rsync上试试这个,并研究一下哪些变化。 至less之后,你不应该再看到git log
和status
之间的差异。
初始化新的回购 – 指向原点
第二个不那么令人不安:cd到你的目的地,并开始一个新的回购
git init
那么你告诉那个新的回购,它有一个祖先在其他地方:
git remote add origin original_git_repo_path
然后安全
git fetch origin master
复制数据而不更改您的本地文件。 现在一切都应该好了。
我总是推荐第二种方法来减less错误。
我有以下方式描述相同的问题:如果我键入
$ git diff
git只是简单地返回到没有错误的提示。
如果我input
$ git diff <filename>
git只是简单地返回到没有错误的提示。
最后,通过阅读我注意到,git diff实际上调用了mingw64 \ bin \ diff.exe来完成这项工作。
这是交易。 我正在运行windows,并安装了另一个bash实用程序,它改变了我的path,所以它不再指向我的mingw64 \ bin目录。
所以,如果你input:git diff,它只是返回到提示你可能有这个问题。
由git运行的diff.exe位于你的mingw64 \ bin目录下
最后,为了解决这个问题,我真的把我的mingw64 \ bin目录复制到了git所在的位置。我试过了,但仍然无法工作。
然后,我closures了我的git bash窗口,并再次打开它去了我的同一个回购失败,现在它的工作。
希望这也能帮助你。
简答
运行git add
有时会有所帮助。
例
Git状态显示更改的文件和Git的比较是什么都没有显示…
> 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 >
我又偶然发现了这个问题。 但这一次出现的原因是不同的。 我已经将文件复制到回购站以覆盖以前的版本。 现在我可以看到文件被修改,但是diff不会返回差异。
例如,我有一个mainpage.xaml文件。 在文件资源pipe理器中,我将一个新的mainpage.xaml文件粘贴到当前的回购站中。 我在另一台机器上完成了这个工作,并在这里粘贴了这个文件。
该文件显示修改,但是当我运行git diff时,它不会显示更改。 这可能是因为该文件的文件信息已经改变,并且git知道它不是真正的文件。 有趣。
你可以看到,当我在文件上运行diff时什么都不显示,只是返回提示。