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

Kir*_*tov 5 git git-status

已知 git-status 通过检查对象的大小和修改时间来发现对象已更改。有时它不起作用,例如用于限制性文件系统上的存储库等。如何通过计算 SHA-1 总和来强制 git-status 检查实际差异?这将更长,但仍然是上述用例的解决方案。

Tod*_*obs 1

长话短说

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

使用 Git Diff 检查工作树的状态

根据您实际尝试在输出中显示的内容,您可能会考虑将git-diff--name-status标志一起使用,而不是依赖于git-status的内部实现。例如:

$ git diff --name-status HEAD^
M       foo.sh
D       bar.rb
Run Code Online (Sandbox Code Playgroud)

这将表明foo.sh已被修改,并且bar.rb已被删除。无论如何,这通常是您真正想了解当前工作目录的信息:哪些文件是脏的,以及提交时将添加或删除哪些文件。

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

上述方法非常适合确定您的工作树是否脏。但是,它不会告诉您特定的更改是否已经按照 git-status 的方式进行。为此,您实际上必须将工作树与缓存索引进行比较。例如,假设您已经使用 暂存删除了bar.rb git rm 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
Run Code Online (Sandbox Code Playgroud)

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