即使内容相同,Git状态也会显示文件已更改


192

我收到其他人的git checkout,并尝试将未进行的更改提交到本地存储库。但是,即使内容完全相同,也会有很多(如果不是每个)文件被修改

我已经设置core.fileMode为false,也设置core.autocrlf为false,但是没有成功。

值得一提的是,我收到的Git存储库来自使用Windows的人,而我使用的是Linux。

我该怎么做才能进行实际更改?

编辑:的输出git config -l

user.name=Aron Rotteveel
user.email=<removed>
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=auto
color.ui=true
color.pager=true
color.branch.current=yellow reverse
color.branch.local=yellow
color.branch.remote=green
color.diff.meta=yellow bold
color.diff.frag=magenta bold
color.diff.old=red bold
color.diff.new=green bold
color.status.added=yellow
color.status.changed=green
color.status.untracked=cyan
core.pager=less -FRSX
core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
alias.co=checkout
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.autocrlf=false
remote.origin.url=<removed>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

更新:添加了一些随机示例文件。这些文件只是纯文本,因此最容易包含。

原始文件位于此处:https : //gist.github.com/c3c5302430935155ef3d。十六进制转储明确表示文件不同,但是我不知道是什么原因导致的,以及如何修复它。

HEAD版本:

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740d  HTML.SafeObject.
0000010: 0a54 5950 453a 2062 6f6f 6c0d 0a56 4552  .TYPE: bool..VER
0000020: 5349 4f4e 3a20 332e 312e 310d 0a44 4546  SION: 3.1.1..DEF
0000030: 4155 4c54 3a20 6661 6c73 650d 0a2d 2d44  AULT: false..--D
0000040: 4553 4352 4950 5449 4f4e 2d2d 0d0a 3c70  ESCRIPTION--..<p
0000050: 3e0d 0a20 2020 2057 6865 7468 6572 206f  >..    Whether o
0000060: 7220 6e6f 7420 746f 2070 6572 6d69 7420  r not to permit 
0000070: 6f62 6a65 6374 2074 6167 7320 696e 2064  object tags in d
0000080: 6f63 756d 656e 7473 2c20 7769 7468 2061  ocuments, with a
0000090: 206e 756d 6265 7220 6f66 2065 7874 7261   number of extra
00000a0: 0d0a 2020 2020 7365 6375 7269 7479 2066  ..    security f
00000b0: 6561 7475 7265 7320 6164 6465 6420 746f  eatures added to
00000c0: 2070 7265 7665 6e74 2073 6372 6970 7420   prevent script 
00000d0: 6578 6563 7574 696f 6e2e 2054 6869 7320  execution. This 
00000e0: 6973 2073 696d 696c 6172 2074 6f0d 0a20  is similar to.. 
00000f0: 2020 2077 6861 7420 7765 6273 6974 6573     what websites
0000100: 206c 696b 6520 4d79 5370 6163 6520 646f   like MySpace do
0000110: 2074 6f20 6f62 6a65 6374 2074 6167 732e   to object tags.
0000120: 2020 596f 7520 7368 6f75 6c64 2061 6c73    You should als
0000130: 6f20 656e 6162 6c65 0d0a 2020 2020 254f  o enable..    %O
0000140: 7574 7075 742e 466c 6173 6843 6f6d 7061  utput.FlashCompa
0000150: 7420 696e 206f 7264 6572 2074 6f20 6765  t in order to ge
0000160: 6e65 7261 7465 2049 6e74 6572 6e65 7420  nerate Internet 
0000170: 4578 706c 6f72 6572 0d0a 2020 2020 636f  Explorer..    co
0000180: 6d70 6174 6962 696c 6974 7920 636f 6465  mpatibility code
0000190: 2066 6f72 2079 6f75 7220 6f62 6a65 6374   for your object
00001a0: 2074 6167 732e 0d0a 3c2f 703e 0d0a 2d2d   tags...</p>..--
00001b0: 2320 7669 6d3a 2065 7420 7377 3d34 2073  # vim: et sw=4 s
00001c0: 7473 3d34 0d0a                           ts=4..

复制版本:

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740a  HTML.SafeObject.
0000010: 5459 5045 3a20 626f 6f6c 0a56 4552 5349  TYPE: bool.VERSI
0000020: 4f4e 3a20 332e 312e 310a 4445 4641 554c  ON: 3.1.1.DEFAUL
0000030: 543a 2066 616c 7365 0a2d 2d44 4553 4352  T: false.--DESCR
0000040: 4950 5449 4f4e 2d2d 0a3c 703e 0a20 2020  IPTION--.<p>.   
0000050: 2057 6865 7468 6572 206f 7220 6e6f 7420   Whether or not 
0000060: 746f 2070 6572 6d69 7420 6f62 6a65 6374  to permit object
0000070: 2074 6167 7320 696e 2064 6f63 756d 656e   tags in documen
0000080: 7473 2c20 7769 7468 2061 206e 756d 6265  ts, with a numbe
0000090: 7220 6f66 2065 7874 7261 0a20 2020 2073  r of extra.    s
00000a0: 6563 7572 6974 7920 6665 6174 7572 6573  ecurity features
00000b0: 2061 6464 6564 2074 6f20 7072 6576 656e   added to preven
00000c0: 7420 7363 7269 7074 2065 7865 6375 7469  t script executi
00000d0: 6f6e 2e20 5468 6973 2069 7320 7369 6d69  on. This is simi
00000e0: 6c61 7220 746f 0a20 2020 2077 6861 7420  lar to.    what 
00000f0: 7765 6273 6974 6573 206c 696b 6520 4d79  websites like My
0000100: 5370 6163 6520 646f 2074 6f20 6f62 6a65  Space do to obje
0000110: 6374 2074 6167 732e 2020 596f 7520 7368  ct tags.  You sh
0000120: 6f75 6c64 2061 6c73 6f20 656e 6162 6c65  ould also enable
0000130: 0a20 2020 2025 4f75 7470 7574 2e46 6c61  .    %Output.Fla
0000140: 7368 436f 6d70 6174 2069 6e20 6f72 6465  shCompat in orde
0000150: 7220 746f 2067 656e 6572 6174 6520 496e  r to generate In
0000160: 7465 726e 6574 2045 7870 6c6f 7265 720a  ternet Explorer.
0000170: 2020 2020 636f 6d70 6174 6962 696c 6974      compatibilit
0000180: 7920 636f 6465 2066 6f72 2079 6f75 7220  y code for your 
0000190: 6f62 6a65 6374 2074 6167 732e 0a3c 2f70  object tags..</p
00001a0: 3e0a 2d2d 2320 7669 6d3a 2065 7420 7377  >.--# vim: et sw
00001b0: 3d34 2073 7473 3d34 0a                   =4 sts=4.

1
如果未core.filemode设置或设置为true,输出是否不同?
Mark Longair 2011年

另一个有用的重要信息是git --version
Mark Longair

2
@AronRotteveel:很简单:第一个文件具有CRLF行尾(Windows),第二个文件具有CRLF行尾(Unix)
2011年

3
git 2.8(2016年3月)引入git ls-files --eol,以快速查看是否涉及eol。请在下面
VonC

Windows上的人可以运行git config --global core.autocrlf true来解决此问题。
Inyoka

Answers:


62

更新:根据对此问题的评论,问题已解决:

这很容易:第一个文件具有CRLF行尾(Windows),第二个文件具有LF(Unix)。该fileUTIL(Git中的\ usr \ bin中提供)会告诉你,(file a b将回复类似a: ASCII text, with CRLF line terminators b: ASCII text

原始答案如下:


您显示的差异不会显示任何不同的行。你可以发布.git / config(或更好git config -l)。

您可能激活了一些空白忽略

您应该尝试禁用core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol

git show HEAD:myfile|md5sum
md5sum myfile

可以用来验证文件是否确实不同。使用外部差异也可以工作

git show HEAD:myfile > /tmp/myfile.HEAD

diff -u myfile /tmp/myfile.HEAD

# or if you prefer an interactive tool like e.g.:
vim -d myfile /tmp/myfile.HEAD

奇怪的是,两个文件的md5sums不同,但是我找不到任何空格差异。(我认为是这种情况,但我看不到)。任何帮助都将受到欢迎。
阿隆·罗特维

只需将示例上传到某处即可(gist.github.com将适合此操作)。我认为最后一行是换行符,通常是字节顺序标记或非规范UTF8编码。您可以随时看xxdbdiff做二进制的diff太
sehe

谢谢你的提示。xdd对我来说是新的。很棒的工具!我用示例更新了我的帖子。
Aron Rotteveel 2011年

1
@AronRotteveel:很简单:第一个文件具有CRLF行尾(Windows),第二个文件具有LF(Unix)。编辑fileUTIL会告诉你,(file a b将回复类似a: ASCII text, with CRLF line terminators b: ASCII text
sehe

这些不应该在VIM中实际显示为^ M吗?(我看不到)。显然,我相信您,但是我对您实际上如何注意到这一点非常感兴趣:)
Aron Rotteveel 2011年

134

我已经使用以下步骤解决了这个问题

1)从Git的索引中删除每个文件。

git rm --cached -r .

2)重写Git索引以拾取所有新行结尾。

git reset --hard

请注意,步骤2可能会删除您的本地更改。解决方案是git网站https://help.github.com/articles/dealing-with-line-endings/上描述的步骤的一部分


就我而言,我对一些文件做了很多笔记,然后将没有.git文件夹的回购复制到了新计算机上。当我意识到我缺少.git软件包时,为时已晚,无法返回并检索它。所以我:1.签出整个仓库的新副本2.用更改后的文件替换了原始文件3.在OP的帖子中执行了第一步:git rm --cached -r .4.这执行了更改(以及其他所有已替换的文件) ),因此我取消了它们的演出。至此,我的存储库已恢复正常。
科迪

2
辉煌。谢谢你
rupi

6
一定要小心,否则将丢失任何其他更改。
Mohy Eldeen '19

将我的repo文件夹从Windows复制并粘贴到Ubuntu后,出现了这个问题。没有本地更改,但是由于某些原因,git认为每个文件都已更改。此解决方案解决了此问题。
Linek

86

您是否更改了文件的模式?我是在我的机器上完成的,本地dev机器上的所有文件都分配了777,而repo上的755则显示每个文件都已修改。我这样做了git diff,它表明旧模式和新模式是不同的。如果那是问题,那么您可以通过git config core.filemode false
干杯轻松地忽略它们


2
在Windows文件系统中使用Windows 10 lxss(即Ubuntu Bash)和Linux中的git使用Windows文件系统中的存储库,我以为这是行尾问题。甚至都没有考虑过文件模式的不同。
Matt L

当我将本地操作系统从Ubuntu更改为Windows时,这对我有用。干杯
Mark Bucknell

@MattL和itsandy我通常使用Git Bash在Win 10上进行开发,但是今天我在Mac上,看到git认为.gitignore文件没有更改就已经更改了。在此Mac上,以git config core.filemode响应true。我将其更改为false,但这没有帮助。
瑞安

43

我有同样的问题。win-> lin复制后,我修改了所有文件。
我用fromdos修复行尾
,然后

git add -uv 

添加更改。
它添加了3个文件(不是全部),我实际上对其进行了修改。在那之后git status仅显示3个修改的文件。之后git的承诺一切都确定了git的状态


2
谢谢,这就是我所需要的。我使用@sehe的建议比较md5sum来验证文件是否相同(在我的情况下它们是相同的)。之后,使用-u标志正确过滤那些与更改没有实际差异的文件。
STW

谢谢,这很有帮助。npm i在我的项目的根源完成后,我遇到了这个问题。不知何故,许多文件的行尾都不同,这就是造成此问题的原因。
哈利洛夫服务器

这就是我所期望的...所做的更改仍然存在,其余的操作都将撤消
Deepak


24

在我的情况下,更改文件权限后文件显示为已修改

要使git忽略权限更改,请执行以下操作:

# For the current repository
git config core.filemode false   

# Globally
git config --global core.filemode false

1
您的回答为我节省了很多时间。谢谢!
Pavel_K

完成此操作后,我建议存储/分段所需的更改,重置/签出已更改其权限的文​​件,然后重新启用core.filemode。:)
XtraSimplicity

将文件从一台笔记本电脑复制到另一台笔记本电脑后,出现了此问题。您的固定文件已保存。谢谢!
山姆

23

但是,即使内容完全相同,也会有很多(如果不是每个)文件被修改。

使用git 2.8(2016年3月),您将能够快速检查这些更改是否与eol相关。

看到 提交a7630bd(2016年1月16日)由托斯滕Bögershausen( )tboegi
(由Junio C gitsterHamano合并--commit 05f1539中,2016年2月3日)

ls-files:添加EOL诊断

在跨平台环境中工作时,用户可能需要检查文本文件是否在存储库中进行了规范化存储以及是否.gitattributes设置正确。

使Git可以在索引和工作树中显示行尾以及有效的text / eol属性。

行尾(“ eolinfo”)如下所示:

"-text"        binary (or with bare CR) file
"none"         text file without any EOL
"lf"           text file with LF
"crlf"         text file with CRLF
"mixed"        text file with mixed line endings.

有效的text / eol属性是以下之一:

"", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf"

git ls-files --eol 给出这样的输出:

i/none   w/none   attr/text=auto      t/t5100/empty
i/-text  w/-text  attr/-text          t/test-binary-2.png
i/lf     w/lf     attr/text eol=lf    t/t5100/rfc2047-info-0007
i/lf     w/crlf   attr/text eol=crlf  doit.bat
i/mixed  w/mixed  attr/               locale/XX.po

以显示在索引中的数据中使用了哪种eol约定('iw每个路径 ')和工作树(' ')以及有效的属性


尽管这显示了问题,但不能解决问题。
格里索

7

这是我克隆Windows上创建的项目时如何解决Linux上的问题的方法:

在Linux上,为了使事情正常运行,您必须具有以下设置:core.autocrlf = input

这是设置方法:git config --global core.autocrlf输入

然后再次从github克隆项目。


在我在Windows上使用Visual Studio的情况下,这对我有用,但是我在命令行的WSL中​​进行了提交和其他检查。在命令行上,每个文件都显示为已更改,但是在Visual Studio中,仅更改了几个文件。我在.gitconfig文件中添加了autoclrf = input,并立即对其进行了修复。谢谢!
大数据布莱恩

5

Git的常见问题有一个答案,可能是相关的,虽然我以前从来没有过这个来:

为什么git diff有时会列出没有更改的文件?

git diff和其他git操作已经过优化,因此它甚至不会查看磁盘上和git索引中状态(大小,修改时间等)不同的文件。这使得git diff在进行小的更改时非常快。如果以某种方式触摸了文件,则git diff必须查看并比较它的内容,即使实际上没有任何更改,这也是一个慢得多的操作。git diff列出文件是为了提醒您未最佳使用它。运行git status不仅会显示状态,还会使用未更改文件磁盘的状态更新索引,从而使后续操作(不仅是diff)更快。导致许多文件被diff列出的典型情况是运行大量编辑命令,例如perl -pi -e'...'。

什么是git status显示你?


git status在修改后的部分仅显示了一个庞大的文件列表。
Aron Rotteveel 2011年

@Aron:根据这个线索,我会说:85%的用户表示线数转换
2011年

4
哇。提醒您一些正式的git文档是多么难以理解。
火星

2

复制本地存储库并将工作副本复制到另一个文件夹(顺便说一下,在Windows上)之后,我有四个文件不断显示,并尝试了其他答案中列出的所有建议。最后,对我来说,解决此问题的方法是删除本地分支,然后再次从远程下载它。就我而言,我想这与复制本地存储库而不是克隆有关。


2

因此,我在这里尝试了几乎所有事情,并希望再提出一个解决我所有问题的解决方案。我的问题不是行尾或实际权限等。这是因为我已经安装了Cygwin以及随之而来的全部东西,而我不知道还安装了自己的git版本。我从来没有注意到这一点,只是我遇到了用户和文件被标记为已更改的奇怪问题(因为烫发发生了更改)。

事实证明,我想出这一点是因为我认为我应该将Git更新到最新版本,但是我正在运行 git --version返回旧版本号。在追查原因之后,我在我的环境路径中找到了cygwin bin目录根目录,该目录包含一个git可执行文件,以旧版本号运行。去搞清楚。

这也很难找到,因为我已经安装了TortoiseGit。由于路径回退,我的命令行工具将使用cygwin版本,并且TortoiseGit被配置为使用Windows版本,从而使其更加混乱。

希望这对某人有帮助。


1
接得好。+1。这就是为什么我总是自己设置PATH的原因,例如stackoverflow.com/a/44351065/6309
VonC

我经常会让安装程序设置PATH,但随后要手动检查它,就像我在这里所做的那样。我之前的安装具有git 2.4.x(x86),而我安装了git 2.13.x(x64)。当我删除x86路径引用并仍然得到2.4时,您可以想象我的困惑!那是当我看到cygwin的bin目录时,这似乎是下一个符合逻辑的地方。因此,如果首先列出Cygwin bin目录,则FWIW设置甚至视觉上检查PATH都可能无法解决该问题!
dudewad

1

我认为您配置中唯一可疑的条目是core.ignorecase。您可以尝试通过以下方式取消设置:

  git config --unset core.ignorecase

...并查看来自git status或的输出git diff是否不同。



0

对我来说,这是因为2个Linux VM都映射到了相同的主文件系统。一个虚拟机正在运行git-1.7.1,另一个正在运行git-2.14

运行git-1.7.1的VM总是会显示4个已更改的文件(即使内容和行尾都相同)。

在运行g-2.14的VM上运行“ git status”后,两个VM都将开始报告存储库为干净。'git status'具有副作用。这不是一成不变的操作。git-1.7.1不能像git-2 +那样理解世界。

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.