2011-02-15 116 views
187

目前我遇到了版本库问题,尽管我的git-fu通常很好,但似乎无法解决此问题。git克隆后直接修改的文件

当我克隆这个存储库,然后cd到repo中,git-status显示已更改的几个文件。注意:我没有在任何编辑器或任何东西中打开回购。

我试着按照这个指南:http://help.github.com/dealing-with-lineendings/但这并没有帮助我的问题。

我试过git checkout -- .很多次,但它似乎没有做任何事情。

任何帮助/意见将不胜感激

更新1:我在Mac上,并有在回购本身没有子模块。

更新2:文件系统是Mac上的“Journaled HFS +”文件系统,不区分大小写。这些文件是单行的,大约每个79K(是的,你听到的权利),所以看着git diff是不是特别有用。我听说做git config --global core.trustctime false这可能会有所帮助,当我回到计算机时,我会尝试回购它。

更新3:用事实改变了文件系统的细节!并且,我尝试了git config --global core.trustctime false这个效果不好的技巧。

+3

什么`混帐diff`告诉你吗? – 2011-02-15 22:56:56

回答

75

我明白了。所有其他开发人员都在Ubuntu上(我认为),因此具有区分大小写的文件系统。但是,我不(因为我在Mac上)。事实上,当我使用git ls-tree HEAD <path>来看他们时,所有的文件都是小写的双胞胎。

我会让他们中的一个把它整理出来。

50

我假设你正在使用Windows。你链接的那个github页面有细节倒退。问题是,CRLF行结束一直致力于回购已经因为你有core.autocrlf设置为真正输入,混帐要转换行结束到LF这样git status显示每个文件被改变。

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

git config core.autocrlf false 


如果是这样,你将积极参与,并且可以更改提交到一个回购协议。您可能希望通过提交更改repo中所有行结束的提交来解决问题,以使用LF而不是CRLF,然后采取措施防止将来再次发生此问题。

下面是直接从gitattributes man page,应该从一个干净的工作目录中执行。

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 
+5

我没有使用windows。 – 2011-02-15 22:05:00

+1

默认情况下,在非Windows系统上,core.autocrlf设置为false。所以,如果它是由行结束引起的,你甚至不应该遇到这个问题。你可以给你的特殊设置的更多细节,例如:`git的diff`显示这些文件`git的status`说被修改,还您使用的是什么文件系统? – Arrowmaster 2011-02-15 22:45:09

+0

用这些问题的答案更新了问题。将在一两秒钟内再次审视所有细节。我不确定开发团队的其他成员正在使用 – 2011-02-16 09:49:26

124

我在克隆回购软件后在Mac上遇到了同样的问题,它会假设所有文件都已更改。

运行后git config --global core.autocrlf input它仍将所有文件标记为已更改。在寻找修复程序后,我在主目录中遇到了.gitattributes文件,其中包含以下内容。

* text=auto 

我评论它,从现在起任何其他克隆库工作正常。希望这可以帮助那里的任何人。

3

我有同样的问题。还有一台Mac。看着一台Linux机器,我注意到在回购我有两个文件:

geoip.dat和GeoIP.dat

删除了Linux机器上弃用之一,再次克隆库的MAC地址。当存在重复时,我无法从存储库的副本中提取,提交,存储或提取。

14

在Visual Studio中,如果您使用的是Git,则可以自动生成.gitignore和.gitattributes文件。自动生成的.getattributes文件具有以下行:

* text=auto 

此行靠近文件顶部。我们只需要通过在其前面添加#来评论该行。这样做后,事情按预期运作。

1

我也有同样的问题。在我的情况下,我克隆了回购和一些文件立即失踪。

这是由文件的路径引起的,文件名对于Windows来说太长。为了解决这个问题,请尽可能地将回购点尽可能地克隆到hdd根目录,以减少文件路径的长度。将它克隆到C:\ A \ GitRepo而不是C:\ Users文档\ yyy \ Desktop \ GitRepo

3

我想添加一个更直接的“为什么”发生这种情况的答案,因为已经有一个很好的答案要解决这个问题。

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

在我的情况GitHub的主分支上的文件有\r\n结尾。我已拨打回购登录设置,以\n结尾办理登机手续。我不知道git检查了什么。它应该检查与我的Linux机器上的本机结尾(\n),但我想它检出了\r\n结尾的文件。 Git抱怨,因为它看到已检出的\r\n结尾在回购中,并警告我它将检查\n设置。因此文件被“修改”。

这是我现在的理解。

10

也可以从不同的文件权限出现的问题,是我的情况:

新鲜克隆库(在Windows,Cygwin的):

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

裸远程存储库(Linux的):

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

请运行以下命令。这可能会解决这个问题。

# Remove everything from the index. 
git rm --cached -r . 

# Write both the index and working directory from git's database. 
git reset --hard 
0

我将本地存储库复制到另一个文件夹,并显示了一堆修改后的文件。 我的解决方法是:我藏匿修改后的文件,并删除了藏匿。存储库变得干净。

54
git config core.fileMode false 

在我的情况下,解决了这个问题

https://www.kernel.org/pub/software/scm/git/docs/v1.7.10.1/git-config.html

TL; DR;

core.fileMode

如果为false,索引和工作树之间的可执行位的差异被忽略;对破碎的文件系统如FAT很有用。请参阅git-update-index(1)。

默认值是正确的,除了GIT中克隆(1)或GIT-INIT(1)将探测并设置core.fileMode假如果合适的话在创建存储库时。

0

我发现的git是治疗我的文件(.PSD在这种情况下)为文本。将它设置为.gitattributes中的二进制类型解决了它。

称为
*.psd binary 
1

编辑文件:sudo gedit .git/configsudo vim .git/config

[core] 
    repositoryformatversion = 0 
    filemode = false 
    bare = false 
    logallrefupdates = true 
[remote "origin"] 
    url = [email protected]:DigitalPlumbing/unicorn-magento.git 
    fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 
[branch "productapproval"] 
    remote = origin 
    merge = refs/heads/productapproval 

变化FILEMODE =真FILEMODE =假