我现在遇到了一个关于存储库的问题,尽管我的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假把戏,效果不太好。


当前回答

我发现Git将我的文件(本例中为.psd)视为文本。在.git属性中将其设置为二进制类型就解决了这个问题。

*.psd binary

其他回答

我明白了。所有其他的开发人员都使用Ubuntu(我想),因此都有区分大小写的文件系统。然而,我没有(因为我用的是Mac)。实际上,当我使用git ls-tree HEAD <path>查看它们时,所有文件都有小写双胞胎。

我会让他们中的一个去解决的。

我猜你用的是Windows。你链接到的GitHub页面的细节是相反的。问题是CR + LF行结束已经提交到存储库,因为您有核心。如果将selflf设置为true或input, Git希望将行结束符转换为LF,因此Git状态显示每个文件都被更改了。

如果这是一个您只想访问但不涉及的存储库,则可以运行以下命令来仅仅隐藏问题,而不实际解决问题。

git config core.autocrlf false

如果这是一个您将积极参与并可以提交更改的存储库。您可能希望通过提交将存储库中的所有行结束符更改为使用LF而不是CR + LF来修复这个问题,然后采取措施防止将来再次发生这种情况。

下面的代码直接取自gitattributes手册页,应该在一个干净的工作目录中执行。

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

如果在git状态中出现了任何不应该被规范化的文件,在运行git add -u之前取消设置它们的文本属性。

manual.pdf      -text

相反,Git不检测的文本文件可以手动启用规范化。

weirdchars.txt  text

我在MacOS上遇到了相关问题。

也就是说,有些人可能没有意识到,虽然MacOS的文件系统看起来是区分大小写的,但事实并非如此。它将存储混合的案例文件名,但是,例如,考虑Foo.py和Foo.py是同一个文件。

A colleague had created just such a scenario by making a foo.py from a Foo.py as part of a development scaffolding. (I.e., not only enforcing PEP8 module file naming conventions, but refactoring the contents significantly from the original such that we wanted to do that kind of work in parallel). When I pulled those changes, MacOS overwrote all the modifications from foo.py into Foo.py, which caused git to think I had made local changes, when I hadn't. When doing a fresh clone, git immediately claimed that Foo.py had significant changes even though it was a fresh clone.

解决方案是将foo.py重命名为一个完全不同的文件名,并且不与原始文件名冲突。在做出更改后,这个问题随着存储库的新克隆而消失了。

(有一个系统配置标志可以在MacOS中打开区分大小写的行为,但建议将其保留在默认设置中,因为切换该行为可能会破坏期望区分大小写的行为。)

git config core.fileMode false

解决了我的这个问题

https://git-scm.com/docs/git-config

TL; diana;

core.fileMode

如果为false,则忽略索引和工作树之间的可执行位差异;对FAT等损坏的文件系统很有用。看到git-update-index(1)。

默认为true,除非git-clone(1)或git-init(1)将探测和设置core。在创建存储库时,fileMode为false(如果合适)。

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

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

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

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

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

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