在Git克隆后直接显示为已修改的文件


227

目前,我在存储库方面遇到问题,尽管我的Git-fu通常很好,但似乎无法解决此问题。

当我克隆此存储库时,然后cd将其复制到存储库中,将git status显示几个已更改的文件。注意:我尚未在任何编辑器或任何工具中打开存储库。

我尝试遵循以下指南:http : //help.github.com/dealing-with-lineendings/,但这对我的问题完全没有帮助。

我已经尝试了git checkout -- .很多次,但是似乎什么也没做。

我在Mac上,存储库本身没有子模块。

该文件系统是Mac上的“ Journaled HFS +”文件系统,不区分大小写。这些文件为单行,每个文件约为79 KB(是的,您没听错),因此查看git diff并不是特别有用。我听说过这样做git config --global core.trustctime false可能会有所帮助,当我回到装有存储库的计算机时,将尝试这样做。

我用事实改变了文件系统的细节!我尝试了git config --global core.trustctime false效果不佳的技巧。

Answers:


141

克隆存储库后,在Mac上出现了相同的问题。假定所有文件都已更改。

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

* text=auto

我将其注释掉,从现在开始,任何其他克隆的存储库都可以正常工作。


5
谢谢!一整夜都在切换core.autocrlf和apply.whitespace之后,我终于找到了这个。这工作了。谢谢。
xer0x 2012年

5
.gitattributes中令人反感的行来自Mathias Bynen的dotfile,以防其他人遇到。
SeanPONeil 2013年

31
谁能在这个特定配置上提供更多信息?怎么* text=auto办?将其从中删除意味着什么.gitattributes?我看到它为我解决了这个问题,但是我不确定为什么这样做,它实际上在做什么,以及它可能造成什么问题?
丹尼斯

6
@Dennis此设置有助于规范行尾,因此删除它可能不是正确的答案。请参阅此问题的答案和本文。以下@Arrowmaster的答案对我更有用。我使用git addgit commit并对文件进行了规范化处理,摆脱了这个问题。
jtpereyda

4
git config --global core.autocrlf input为我修复它。谢谢。
dimiguel

89

我知道了。我认为所有其他开发人员都在Ubuntu上,因此具有区分大小写的文件系统。但是,我却没有(因为我在Mac上)。的确,当我使用观察它们时,所有文件都有小写的双胞胎git ls-tree HEAD <path>

我将选出其中之一进行整理。


他们有没有解决?我可能遇到相同的问题。
乔什·约翰逊

8
是的,只要让具有区分大小写的文件系统的人从不区分大小写的文件系统上的每组文件中删除重复的文件名中删除所有文件即可。
山姆·埃利奥特

1
从Ubuntu迁移到Mac之后,就遇到了同样的问题。谢谢,您的回答打在了头上。希望投票将它推到第一位。:-)
chmac

1
@Dirk这就是为什么会有多个答案的原因。我接受了适用于我的情况的那,这是不合理的。
山姆·埃利奥特

1
这也是我的问题-不区分大小写的MacOS。但是git ls-tree HEAD <path>只显示一个文件。但是,我能够在GitHub.com UI中看到重复的文件,并且还可以使用该UI删除一个版本。
Orion elenzil

74
git config core.fileMode false

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

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

TL; DR;

core.fileMode

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

默认值为true,除了git-clone(1)或git-init(1)将在创建存储库时在适当的情况下探测并设置core.fileMode为false。


2
但这有什么作用?
Siwel

1
我也想知道它的作用,因为它也对我有用。
多纳托

2
当我这样做时git diff,我发现更改仅在文件模式下进行。git拾取了chmod -R 777 .我运行项目时引起的问题,此配置使我可以忽略git的chmod更改git stackoverflow.com/q/1580596/6207775
Ayushya

1
链接已断开(“很抱歉,我们找不到您的内核”)。
彼得·莫滕森

其余的答案都没有用,但这是神奇的!
与Patel见面

53

我假设您正在使用Windows。您链接到的GitHub页面的详细信息向后。问题是CR + LF的行尾已经被提交到存储库中,并且因为您将core.autocrlf设置为trueinput,所以Git希望将行尾转换为LF,因此git status表明每个文件更改。

如果这是您仅想访问但不参与的存储库,则可以运行以下命令仅隐藏问题,而无需实际解决。

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 status在运行之前取消设置其text属性git add -u

manual.pdf      -text

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

weirdchars.txt  text

8
我没有使用Windows。
山姆·埃利奥特

1
在非Windows系统上,默认情况下,core.autocrlf设置为false。因此,如果它是由行尾引起的,那么您甚至都不会遇到这个问题。您能否提供有关您的特定设置的更多详细信息,例如git diff显示git status修改后的那些文件的显示内容,以及您使用的是什么文件系统?
Arrowmaster

用这些问题的答案更新了问题。一两秒钟后,将再次查看所有详细信息。我不确定开发团队的其他成员
Sam Elliott

这对我们有用(git config core.autocrlf false足够了)。客户端在Linux(SL / RHEL)上运行,但Linux会话是通过Windows主机通过x2go启动的,这让我们感到困惑。因此,这很可能是Win + Lin同类环境中最有可能的解决方案。
德克

37

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

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

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

没有其他解决方案对我有用,但这使我重新启动并运行。
rainabba

1
我尝试了这个,对我有用。谢谢利亚马先生!
丹尼尔·里特(Danniel Little)

这使我的存储库变得更糟。在一个没有变化的分支上,运行它后我有277个。我在切换到的其他分支上也进行了相同的更改。谨慎运行。我刚刚被repo重新克隆,并修改了615个文件。:(
程序员Paul

这对我使用git v2.7.4和ubuntu(WSL),适用于Windows的Git v2.18.0.windows.1和posh-git一直有效,我一直有autocrlf false的问题,升级到Windows后,该问题开始于Windows的Git和posh-git今日2.18.0-
吉姆·弗雷内特

我很惊讶这个作品。谢谢您的帮助。对于其他走这条路的人,看似被修改的文件都是由git LFS管理的.png和.bmp文件
David Casper

16

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

* text=auto

该行位于文件顶部附近。我们只需要在行的前面加上#来注释掉行。之后,一切按预期进行。


1
谢谢,一直在为此付出努力
Andrew Berry

这正是我的问题。另一个开发人员通过VS而不是CLI使用了GIT,并创建了这个.gitattributes文件。
乔什·马格

12

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

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

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

裸露的远程存储库(Linux):

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

5

我想添加一个针对“为什么”发生的答案,因为已经有很好的解决方法。

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

就我而言,GitHub的master分支上的文件以\r\n结尾结尾。我已经拨出存储库上的设置以签入\n结尾。我不知道Git会检查什么。应该在本机Linux框(\n)上签出带有本机结尾的文件,但我想它签出了带\r\n结尾的文件。Git抱怨,因为它看到\r\n存储库中已签出的结尾,并警告我它将签入\n设置。因此,文件被“修改”。

这是我目前的理解。


3

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

geoip.dat和GeoIP.dat

我在Linux机器上删除了弃用的存储库,然后再次将存储库克隆到Mac。有重复项时,我无法从存储库副本中提取,提交,隐藏或提取。


3

对我来说同样的问题。我可以在远程Git存储库中看到多个具有相同名称的图像,例如“ textField.png”和“ textfield.png”,但在本地存储库中却看不到。我只能看到项目代码中未使用的“ textField.png”。

事实证明,我的大多数同事都在使用ext4文件系统的Ubuntu上,而我在使用APFS的Mac上。

感谢Sam Elliott的回答,解决方案非常简单。首先,我要求Ubuntu上的一位同事删除带有大写字母的冗余文件版本,然后提交并推送到远程。

然后我运行以下命令:

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

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

最后,我们决定每个开发人员都应更改其Git配置,以防止再次发生这种情况:

# Local Git configuration
git config core.ignorecase = true

要么

# Global Git configuration
git config --global core.ignorecase = true

如果您只是upvoted@kds的答案,那就更好了!
Elharony

似乎命令行命令不应带有等号(=),因为它将最终出现在ignorecase = =配置文件中。
Dmytro

1

我也有同样的问题。就我而言,我克隆了存储库,并且一些文件立即丢失。

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


1

编辑名为的文件.git/config

sudo gedit .git/config

要么:

sudo vim .git/config

内容

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = kharadepramod@bitbucket.org: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=truefilemode = false


这等效于git config core.Filemode false
Guillermo Prandi,

1

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

在我正在处理的存储库中,有一个二进制文件,文件类型为* .app。

这只是一些序列化的数据,但是macOS将所有* .app文件都视为应用程序,并且由于该文件不是用户下载的,因此系统认为它不安全,并添加了com.apple.quarantinefile属性以确保该文件无法执行。

但是在文件上设置此属性也会更改文件,因此它显示在Git更改集中,而没有任何还原方法。

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

解决方案非常简单,只要您不必使用该文件即可。只需添加*.app binary到您的中即可.gitattributes



0

我发现Git将我的文件(在这种情况下为.psd)视为文本。在.gitattributes中将其设置为二进制类型可以解决该问题。

*.psd binary

0

我正在尝试进行交互式变基,但它声称其中包含一些已修改的文件,因此现在不允许我这样做。我尽一切努力返回到干净的存储库,但没有任何效果。其他答案均无济于事。但这终于奏效了...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

繁荣!清理存储库。问题解决了。然后,当我执行我的操作时,我只需要放弃最后一次提交rebase -i,最后一切都变得干净了。怪异的!


0

万一它可以帮助其他人,则可能会导致此问题的另一个原因:不同版本的Git。我在Ubuntu 18.04(Bionic Beaver)盒子上使用的是默认安装的Git版本,并且一切正常,但是当尝试在Ubuntu 16.04上使用Git克隆存储库时,某些文件显示为已修改。

这里没有其他答案可以解决我的问题,但是升级Git的版本以在两个系统上都匹配可以解决问题。


1
知道哪些版本的git不能一起玩会很有帮助(而且很有趣)。
jpaugh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.