- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不认为这是行结束差异问题 - p4merge 认为文件中没有任何更改,即使设置为识别行结束和空格差异也是如此。
我的问题是有时会发生以下情况:
git status
显示没有未提交的更改。git status
列出了一些已更改的文件。git diff
对任何这些“更改的文件”显示文件的每一行都已更改。更改后的版本看起来与原始版本相同。为什么会这样?为什么 git 认为文件已经更改,而他们似乎没有这样做?为什么只检查另一个分支会导致这个?
我的第一个想法是行尾,但我不知道为什么 p4merge 不会检测到这些。第二个想法是文件模式更改。我不知道如何确定是否是这种情况。 git config --list
显示 core.filemode 设置为 false。 git config --global --list
和 git 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/
我是一名优秀的程序员,十分优秀!