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

在一台服务器上(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 svn,有一个文件有这个问题。对文件的每个祖先使用ls-tree,我注意到其中一个有两个子文件夹——Submit和Submit。由于我使用的是Windows,所以不能同时签出它们,从而导致了这个问题。

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

其他回答

我将文件添加到索引中:

git add file_name

然后跑着说:

git diff --cached file_name

你可以在这里看到git diff的描述。

如果你需要撤销你的git添加,那么请参阅这里:我如何在提交前撤销'git add' ?

我对你的用例的假设:

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

实际上有两种方法。

克隆repo - mv .git - git重置-硬

此方法就是您所做的—将现有存储库克隆到一个空目录中,然后将.git目录移动到目标目录中。为了顺利工作,通常需要运行

git reset --hard

但是,这会改变当前目录中文件的状态。您可以在目录的完整复制/rsync上尝试此操作,并研究有哪些变化。至少之后你应该不再看到git日志和状态之间的差异。

Init新存储库-指向原点

第二种方法不那么麻烦:cd到您的目的地,并用

git init

然后你告诉这个新的存储库,它在其他地方有一个祖先:

git remote add origin original_git_repo_path

然后安全

git fetch origin master

在不更改本地文件的情况下复制数据。现在应该没事了。

我总是推荐第二种更不容易出错的方法。

有几个原因可以解释为什么git status可能会显示不同,而git diff可能不会。

文件的模式(权限位)发生了变化——例如,从777变为700。 换行风格从CRLF (DOS)到LF (UNIX)

要知道发生了什么,最简单的方法是运行git format-patch HEAD^,看看生成的补丁说了什么。

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

我也遇到过类似的问题。git diff文件没有显示任何内容,因为我将文件添加到git索引中,其中部分名称是大写的:GeoJSONContainer.js。

之后,我将其重命名为GeoJsonContainer.js,并停止跟踪更改。git diff GeoJsonContainer.js没有显示任何东西。我必须用强制标志从索引中删除文件,并再次添加文件:

git rm -f GeoJSONContainer.js
git add GeoJSONContainer.js