5

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

4

1 回答 1

1

TL;博士

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

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

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

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

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

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

上述方法非常适合确定您的工作树是否脏。但是,它不会告诉您特定更改是否已经按 git-status 的方式进行。为此,您实际上必须将工作树与缓存索引进行比较。例如,假设您已经使用 暂存了bar.rb的删除,但使用编辑器对foo.shgit rm bar.rb进行了更改,但尚未暂存修改后的文件。在这种情况下,您需要以下内容:

$ 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 由于某种原因不能满足您的需求,那么这种替代方法应该使您能够比较工作目录的实际内容不依赖于时间戳或文件大小的索引。

于 2015-02-19T07:12:57.803 回答