如何强制git-status使用哈希值检查差异?

6

git-status被用来通过检查对象的大小和修改时间来发现其是否已更改。有时它无法正常工作,例如对于限制性文件系统上的存储库等。如何强制git-status通过计算SHA-1摘要来检查实际差异?这将需要更长的时间,但仍然是解决上述用例的一种方法。


2
这只是一个完全的猜测,但如果您“touch”所有文件以使它们的修改时间不同,那么它会重新进行哈希处理,这样行吗? - Zerp
1
@Zerp,这个建议看起来很不错。使用git控制的所有文件都可以轻松地触及,只需执行git ls-files | xargs -d $'\n' touch即可。 - Dan Moulding
1个回答

1

简述

使用 Git,完成一个任务的方法通常不止一种。在这种情况下,您不需要比较对象哈希;您可以使用 git-diff 来比较文件或目录以获取所需的信息。

使用 Git Diff 检查工作树状态

根据您实际想要在输出中显示的内容,您可以考虑使用 --name-status 标志与 git-diff 代替依赖于 git-status 的内部实现。例如:

$ git diff --name-status HEAD^
M       foo.sh
D       bar.rb

这将显示 foo.sh 已被修改,bar.rb 已被删除。一般来说,这就是您想了解您当前工作目录中的内容:哪些文件已变更,何时提交将添加或删除哪些文件。

使用GNU Diff和Git Diff检查未暂存的更改

上述方法很适合确定您的工作树是否有更改。然而,它无法像 git-status 那样告诉您特定更改是否已经暂存。为了做到这一点,实际上需要将工作树与缓存的索引进行比较。例如,假设您已经使用 git rm bar.rb 暂存了对 bar.rb 的删除,但使用编辑器对 foo.sh 进行了更改,但尚未暂存修改的文件。在这种情况下,您需要类似以下的命令:

$ diff -u <(git diff --name-status --staged HEAD^) <(git diff --name-status HEAD^)
--- /dev/fd/63  2015-02-19 01:56:22.000000000 -0500
+++ /dev/fd/62  2015-02-19 01:56:22.000000000 -0500
@@ -1 +1,2 @@
 D  bar.rb
+M  foo.sh

可以看到删除是暂存了的,但修改还没有添加到暂存区。显然,输出结果不如git-status那样有吸引力和直观,但如果由于某些原因git-status不能满足您的需求,那么这种替代方法应该能够让您比较工作目录的实际内容与索引的内容,而不依赖时间戳或文件大小。


这似乎并没有回答问题,至少现在不是了(我看到这是一个旧答案,所以可能适用于较早版本的git,但我不确定)。当文件的大小和修改时间没有改变时,状态和差异都会给出相同的输出,即没有更改。 - André Sassi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接