git - 执行 git 深度扫描以比较文件的真实性

标签 git msysgit

如何使 msysgit 扫描文件以获取真正的更改?

目前它似乎依赖于文件时间戳,因此它会出错:在有差异的地方没有显示差异。

我尝试了 git update-index --refreshgit update-index --really-refresh。这两个命令都会立即退出,并且似乎不会对树中的每个文件执行扫描和二进制比较。

来自 another question 的引文:

Setting core.trustctime to false makes git ignore spurious changes to ctime, which apparently happens on some file systems. I need the opposite behavior: re-computing the file hash even when mtime hasn't changed.

最佳答案

首先,您应该尝试找到问题的根源。 Git 对统计信息(不仅是时间戳,还有大小)的使用通常是非常可靠的。如果您遇到问题,很可能意味着您的系统出现严重损坏。 Git 将不是唯一被破坏的工具(您的备份系统和构建系统很可能也是)。

你可以试试这个(在阅读下面的警告之后):

rm -f .git/index
git reset HEAD

rm 命令显然会丢弃索引中的任何信息,即:Git 在内部使用的所有统计信息,以避免比较文件(你期望的),以及任何 git addgit reset,有关您在索引中可能未提交的未 merge 文件的信息。另一方面,这不会更改任何提交的信息。 git reset HEAD 命令将创建一个与 HEAD 匹配的新索引,即在这个命令之后,Git 认为您没有在索引中暂存更改。

Git 将在 git reset HEAD 时恢复统计信息(即重做整个文件比较),所以这是一个告诉 Git “现在忘记统计信息”的解决方案,在之后运行你破坏了你的统计信息,但这不是告诉 Git “永远不要再使用统计信息”的方法。

关于git - 执行 git 深度扫描以比较文件的真实性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35347406/

相关文章:

windows - 为什么在 windows 或 linux 下对同一个文件使用不同的 SHA-1?

windows - Windows 上的 Git mergetool 一直从 Git 安装而不是存储库根目录中获得文件路径

git - git如何解析文件名和分支名?

git - 默认推送到 --recurse-submodules=check

git - 术语混淆, "theirs"与 "mine"

git - 尝试使用 git 设置文件名长度限制 - 权限被拒绝

来自现有自定义 SVN 的 git-svn 文件夹

Git-nullSha1 : contains entries pointing to null sha1

c - 管理 C 中的代码变体 : changing variable that repeats all over the code

emacs - Windows 上 emacs 中 msysgit bash 的配置