众所周知,git-status 通过检查其大小和修改时间来发现对象已更改。有时它不起作用,例如对于限制性文件系统等的 repos。如何强制 git-status 通过计算 SHA-1 总和来检查实际差异?这将更长,但仍然是上述用例的解决方案。
最佳答案
长话短说
使用 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 那样告诉您特定更改是否已经上演。为此,您实际上必须将工作树与缓存索引进行比较。例如,假设您已经使用 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 - 如何强制 git-status 使用哈希检查差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28595724/