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

我从其他人那里收到了git签出,我试图将未分阶段的更改提交到本地存储库。然而,很多(如果不是每个)文件显示为修改,即使内容完全相同。

我已经将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。Hexdumps明确指出文件是不同的,但我不知道是什么原因导致的,以及如何修复它。

头版本:

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.
267281 次浏览

更新:根据这个问题的评论,问题已经解决了:

这很简单:第一个文件有CRLF行结束符(windows),第二个 低频(Unix)。file util(在git\usr\bin中可用)将告诉你(file a b将回复 类似于a: ASCII文本,带有CRLF行终止符b: ASCII 文本> < /代码)< / p >

原答案如下:


你所显示的diff 显示一个不同的行。你能发布.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

Git常见问题解答有一个可能相关的答案,尽管我以前从未遇到过这个:

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

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

git status为你显示了什么?

在我看来,你的配置中唯一可疑的条目是core.ignorecase。你可以试着用:

  git config --unset core.ignorecase

... 并查看git statusgit diff的输出是否不同。

你改变文件模式了吗? 我在我的机器上做了,本地开发机器给所有文件777,而repo有755,显示每个文件都被修改过。我做了git diff,它显示旧模式和新模式是不同的。 如果这是问题所在,那么你可以很容易地忽略他们 git config core.filemode false
欢呼声< / p >

在将我的本地存储库和工作副本复制到另一个文件夹(顺便说一下,在Windows上)后,我有四个文件一直显示为更改,并尝试了其他答案中列出的每一个建议。最后,为我解决这个问题的是删除本地分支并从远程重新下载它。在我的情况下,我猜这与复制本地存储库有关,而不是克隆。

我也有同样的问题。在win->lin copy之后,我已经修改了所有文件。 我用fromdos来固定行结束,然后用

git add -uv

添加更改。它添加了3个文件(不是全部),我实际上修改了这些文件。之后,git状态只显示3个修改过的文件。在git提交之后,git状态一切正常。

然而,很多(如果不是每个)文件显示为修改,即使内容完全相同。

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

如果是这样,德文·G·罗德添加在评论中:

我通过在repo中添加一个.gitattributes文件来解决这个问题,其中只有* text=auto

检查,参见提交a7630bd(2016年1月16日)by Torsten Bögershausen (tboegi)
(由Junio C Hamano—gitster in 提交05 f1539合并,03 Feb 2016)

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

来显示索引('__ABC0')中的数据中使用了什么eol约定,在工作树('w')中,以及对于所显示的每个路径,哪个属性是有效的

我可以通过更换内核来解决Windows机器上的问题。从false到core. selflf =输入

git config core.autocrlf input

正如在https://stackoverflow.com/a/1112313/52277中所建议的那样

我已经通过以下步骤解决了这个问题

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

    git rm --cached -r .

  2. 重写Git索引以获取所有新的行结束符。

    git reset --hard

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

所以,我在这里尝试了几乎所有的方法,想再贡献一个解决我所有问题的解决方案。我的问题不是行尾或实际权限或类似的东西。这是因为我已经安装了Cygwin和大量附带的东西,我不知道它也安装了自己的git版本。我从来没有注意到这一点,只是我遇到了一些奇怪的问题,用户和文件被标记为已更改(因为烫发更改)。

事实证明,我发现这是因为我认为我应该将Git更新到最新版本,我这样做了,但运行git --version返回旧版本号。在随后寻找原因后,我在我的环境路径中找到了cygwin bin目录根目录,其中包含一个git可执行文件,以旧版本号运行。图。

这也很难找到,因为我安装了TortoiseGit。由于路径回退,我的命令行工具将使用cygwin版本,而TortoiseGit被配置为使用windows版本,这使它更加令人困惑。

希望这能帮助到一些人。

在我的案例中,文件在更改文件权限之后被修改。

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

# For the current repository
git config core.filemode false


# Globally
git config --global core.filemode false

以下是我如何在Linux上修复这个问题,而我克隆了一个在Windows上创建的项目:

在Linux上,为了让事情正常工作,你必须有这样的设置:core. selff =input

这是如何设置它:git config --global core.autocrlf input

然后克隆项目再次从github。

对我来说,这是因为2个linux虚拟机都映射到同一个主文件系统。 一台虚拟机运行git-1.7.1,另一台虚拟机运行git-2.14

运行git-1.7.1的虚拟机将始终显示4个更改后的文件(即使内容和行尾是相同的)。

一旦在运行g-2.14的虚拟机上运行'git status',那么两个虚拟机都将开始报告存储库为干净。'git status'有副作用。它不是一个不可变的操作。git-1.7.1不像git-2+那样理解世界。

我只是将filemode = false设置为.git/config文件中的[core]部分,它为我工作。

filemode = false

对我来说,问题在于文件中的个案差异。

我重命名文件并提交删除,它显示了要删除的文件的大写和小写版本。

在提交删除后,我将文件重命名为原来的名称并按下。

最近,我把本地回购从一个Windows x64系统转移到了另一个。我第一次使用它时,我一半的文件似乎被更改了。感谢Jacek Szybisz将我发送到配置Git来处理行结束,在那里我发现了以下一行程序,从Gitkraken的更改队列中删除了所有无更改文件:

git config --global core.autocrlf true

在我的例子中,文件是完全相同的(内容、行结束符、文件模式、md5校验和,一切),但仍然在git status中可见。

有帮助的是

# Garbage collect stuffs from .git
git gc


# commit stuff
git add .
git commit -m "temporary"


# this doesn't change contents
git reset HEAD^1 --soft

之后,git status只显示了我编辑过的一个编辑过的文件。

在我的情况下,git克隆很慢,所以我只是将克隆的回购从我的Mac复制到Windows,这些都没有帮助。什么帮助是做复制的回购和使用的克隆,而不是,这似乎已经解决了它。我假设有一些默认设置的选项,不同的平台可能会导致这个问题。

如果文件模式或行尾或空格相同,可能只是git索引使它们保持修改。在这种情况下,简单的命令可以帮助:

git reset

对我来说,IDE会自动将文件添加到索引中,所以当我删除它们,然后将相同的文件放回去时,令人惊讶的是它们显示为已修改。

你运行格式化程序了吗?检查引号。

对我来说,这种现象发生在我运行格式化程序之后。经过比较,我没有看到任何变化,因为开始和结束可见长度是相同的,字符的大小是相同的。

最后,过了一段时间,我意识到单引号已经被更新为双引号了,我总是找不到它们,因为这两种类型的引号占用了相同的字符空间!

例如,这里有一个git变化的例子

-here is a contrived line for 'illustration' purposes
+here is a contrived line for "illustration" purposes

我来到这里是因为git diff file.abc将显示,文件被完全删除。但在路上,他们没有改变。

问题是:我正在使用git过滤器进行清理,其中一个命令给出了一个错误,这不是由git diff file.abc显示的。警告信息只在git reset file.abc期间出现。

如果git diff显示你的文件内容消失了,试着禁用.gitattribute中的过滤器。

最后我找到了答案:

我们有两种类型的行结束会导致git diff,但git diff没有显示任何东西

$ecsConfig->lineEnding("\n"); // or \r\n

你可以搜索更多关于\n LF和\r\n CRLF的信息,它们是由代码风格检查器或编辑器创建的,

我正在使用易于代码标准包,它正在使用PHP_EOL,这是CRLF一般,所以vscode EOL是LF,这是为我创造灾难。

i fixed with: Git stash &&Git stash pop