我现在遇到了一个关于存储库的问题,尽管我的Git-fu通常很好,但我似乎无法解决这个问题。

当我克隆这个存储库,然后cd到存储库,git状态显示几个文件被更改。注意:我没有在任何编辑器或其他工具中打开存储库。

我试着遵循这个指南:http://help.github.com/dealing-with-lineendings/,但这对我的问题一点帮助都没有。

我试过git checkout。很多次,但似乎什么也没做。

我使用的是Mac,存储库本身没有子模块。

Mac上的文件系统是“Journaled HFS+”文件系统,不区分大小写。这些文件只有一行,每个文件大约79 KB(是的,您没有听错),因此查看git diff并没有特别有用。我听说过git的全局核心配置。trustctime false,这可能有帮助,当我回到存储库的计算机上时,我会尝试。

我用事实改变了文件系统的细节!我尝试了git配置——全局核心。Trustctime假把戏,效果不太好。


当前回答

我想添加一个关于“为什么”会发生这种情况的更直接的答案,因为关于如何解决它已经有了一个很好的答案。

因此,.gitattributes有一个* text=auto设置,这导致了这个问题。

在我的例子中,GitHub主分支上的文件有\r\n个结尾。我已经拨出了存储库上的设置,以使用\n个结尾签入。但我不知道Git会检查出什么。它应该在我的Linux盒子(\n)上检出本机结尾,但我猜它检出了带有\r\n结尾的文件。Git抱怨是因为它看到了存储库中检出的\r\n个结尾,并警告我它将检入\n个设置。因此文件是“待修改”的。

这是我目前的理解。

其他回答

对于新版本的macOS,这可能是由操作系统的安全特性引起的。

在我工作的存储库中,有一个二进制文件带有*。App作为文件类型。

这只是一些序列化的数据,但macOS处理所有*。App文件作为一个应用程序,由于该文件没有被用户下载,系统认为它是不安全的,并添加了com.apple.quarantine文件属性,以确保该文件不能执行。

但是在文件上设置这个属性也会改变文件,因此它会显示在Git更改集中,而没有任何恢复它的方法。

您可以通过运行$ xattr file.app来检查是否有相同的问题。

解决方案非常简单,只要您不需要使用该文件。只要加上*。应用二进制到你的.gitattributes。

这个问题也可能由不同的文件权限引起,就像我的情况一样:

新克隆的存储库(Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

裸远程存储库(Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

我想添加一个关于“为什么”会发生这种情况的更直接的答案,因为关于如何解决它已经有了一个很好的答案。

因此,.gitattributes有一个* text=auto设置,这导致了这个问题。

在我的例子中,GitHub主分支上的文件有\r\n个结尾。我已经拨出了存储库上的设置,以使用\n个结尾签入。但我不知道Git会检查出什么。它应该在我的Linux盒子(\n)上检出本机结尾,但我猜它检出了带有\r\n结尾的文件。Git抱怨是因为它看到了存储库中检出的\r\n个结尾,并警告我它将检入\n个设置。因此文件是“待修改”的。

这是我目前的理解。

我也遇到了同样的问题。在我的例子中,我克隆了存储库,一些文件立即丢失了。

这是由于文件的路径和文件名对Windows来说太长造成的。要解决该问题,请将存储库克隆到尽可能靠近硬盘驱动器根的位置,以减少文件路径的长度。例如,将其克隆到C:\A\GitRepo,而不是C:\ users Documents\yyy\Desktop\GitRepo。

我也有同样的问题。在Mac上也是如此。在Linux机器上查看存储库,我注意到我有两个文件:

geoip.dat和geoip.dat

我在Linux机器上删除了废弃的版本,并将存储库再次克隆到Mac上。当存在副本时,我无法提取、提交、保存或从我的存储库副本中提取。