如何强制git检测更改的文件(由于工作树编码)



我刚刚发现,当一些文件实际上是UTF16时,它们被标记为简单文本,而git在做diff时不喜欢这样。我玩了.gitattributes(专门为那些文件text working-tree-encoding=UTF-16设置(,然后在一些文件上做了一些iconv。然后我恢复了所有这些更改(包括.gitattributes(。实际上做了一个git reset --hard,但有些文件仍然一团糟,git看不出有什么不同。也尝试过git update-index --no-assume-unchanged,但没有成功。

如何强制git实际检测更改的文件?

LE:我删除了文件并恢复了它,它实际上解决了问题,但我不想手动这样做(即检查所有文件并删除它们(。还检查了另一个目录中的克隆,混乱的文件是可以的

这(我认为(是由于Git中的一种错误。Git几乎在任何时候都试图在其索引中保留有关工作树中文件的信息,以及这些文件的内容与索引引用的副本的比较。这就是为什么(以及如何(索引充当缓存,因此第三个名称的来源:Git将其索引称为暂存区以及;索引";,但在一些地方;高速缓存">1

在任何情况下,.gitattributes文件(和.git/info/attributes(都会影响Git在读取索引和写入工作树时进行数据转换的方式,反之亦然。这意味着,如果更改.gitattributes文件的内容,则某些或所有缓存副本可能会无效。然而,git status命令和其他Git命令并没有注意到这一点。

从工作树中删除一个文件会导致Git意识到该文件的缓存信息已过期。然而,这是相当激烈的。还有另一个相当激烈的替代方案,它可以快速使所有文件的Git缓存数据无效:

rm .git/index; git reset
# assumes Unix-like commands and a Unix-style shell

这将删除所有阶段性更改,但不会影响您的工作树文件小心!这不是官方批准的处理问题的方法,将来可能会停止工作。

Git需要开始注意属性文件的更新(这将有助于自动解决问题,这样你就不必自己做任何事情(,和/或获得一个正式的命令来宣布缓存数据过期,这样你才能明确地强制刷新(git update-index --really-refresh已经关闭,但在这里实际上不起作用(。不过,在此之前,如果更改.gitattributes设置(或core.autocrlf设置(,则可以强制Git使用此处的remove and reset方法从头开始重建索引。


1我们现在主要在标志中看到这一点:例如,git rm --cached分期区域术语通常更优越,--staged现在通常是一个选项,其含义与--cached完全相同,例如在git diff中。不过,Git并不以一致性著称,因此git rm仍然缺少--staged,而git restore只有--staged来引用索引副本。同时git apply使用了含义不同的--index--cached,没有--staged选项!

最新更新