gpt4 book ai didi

git - 为什么 git 认为未触及的文件的每一行都已更改

转载 作者:太空狗 更新时间:2023-10-29 13:22:07 25 4
gpt4 key购买 nike

我不认为这是行结束差异问题 - p4merge 认为文件中没有任何更改,即使设置为识别行结束和空格差异也是如此。

我的问题是有时会发生以下情况:

  • 起初 git status 显示没有未提交的更改。
  • 然后我检查另一个分支
  • 现在 git status 列出了一些已更改的文件。
  • git diff 对任何这些“更改的文件”显示文件的每一行都已更改。更改后的版本看起来与原始版本相同。

为什么会这样?为什么 git 认为文件已经更改,而他们似乎没有这样做?为什么只检查另一个分支会导致这个?

我的第一个想法是行尾,但我不知道为什么 p4merge 不会检测到这些。第二个想法是文件模式更改。我不知道如何确定是否是这种情况。 git config --list 显示 core.filemode 设置为 false。 git config --global --listgit config --system --list 不显示 core.filemode 的任何设置(我在这里告诉这个,因为我不确定不同的配置级别如何相互覆盖)。 core.autocrlf 设置为 true。

多个开发人员提交到同一个存储库,我正在从中提取更改,所有这些都在 Windows 机器上。我猜某个地方的某些设置导致了这种情况,但我不知道是我在本地还是其他人,或者可能是什么设置。

列为已更改的文件似乎不是随机的 - 如果我删除本地存储库,请从远程再次克隆它(默认为 check out 主分支),然后再次 check out 同一分支, git status 每次都列出与更改完全相同的文件。这些文件有时是最近编辑的,有时是多年未触及的文件。它们不仅是二进制文件(众所周知 core.autocrlf=true 有时会损坏),而且还是文本文件。

执行命令 git rm --cached -r . 后跟 git reset --hard 可以消除更改,但它发生得如此频繁,以至于变得很麻烦。我也很好奇是什么原因造成的。

同一个存储库也导致行结束问题。我认为这是一个单独的问题,所以我可能最终会为此提出另一个问题,但我在这里简要提及它以防万一它毕竟是相关的。检查另一个分支或从远程存储库中提取更改有时会导致文件显示为已更改,并且这些文件上的 git diff 仅输出 warning: LF will be replaced by CRLF in [file]。该文件将在您的工作目录中具有其原始行结尾。

编辑:存储库的 .gitattributes 文件只有行 * text=auto 而没有其他内容。

git config --list 的输出(省略了颜色、编辑器文件路径、远程、difftool、用户名和电子邮件等设置):

core.symlinks=false
core.autocrlf=true3
pack.packsizelimit=2g
rebase.autosquash=true
merge.summary=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false (yes this is there twice, just noticed)
core.ignorecase=true
core.hidedotfiles=dotgitOnly

最佳答案

要在细节中显示这种“不可见”的变化,请使用:

git diff --word-diff-regex=.

这将标记所有更改的字符,甚至是空格。

很可能它会显示行尾的变化。如果您在 Windows 上工作并打开了 core.autocrlf,git 可能会期待其他类型的行结尾并将“错误的”行结尾显示为 diff。

通过关闭 core.autocrlf 告诉 git 不关心行尾应该可以解决你的问题。

关于git - 为什么 git 认为未触及的文件的每一行都已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com