git-status被用来通过检查对象的大小和修改时间来发现其是否已更改。有时它无法正常工作,例如对于限制性文件系统上的存储库等。如何强制git-status通过计算SHA-1摘要来检查实际差异?这将需要更长的时间,但仍然是解决上述用例的一种方法。
git-status被用来通过检查对象的大小和修改时间来发现其是否已更改。有时它无法正常工作,例如对于限制性文件系统上的存储库等。如何强制git-status通过计算SHA-1摘要来检查实际差异?这将需要更长的时间,但仍然是解决上述用例的一种方法。
使用 Git,完成一个任务的方法通常不止一种。在这种情况下,您不需要比较对象哈希;您可以使用 git-diff 来比较文件或目录以获取所需的信息。
根据您实际想要在输出中显示的内容,您可以考虑使用 --name-status
标志与 git-diff 代替依赖于 git-status 的内部实现。例如:
$ git diff --name-status HEAD^
M foo.sh
D bar.rb
上述方法很适合确定您的工作树是否有更改。然而,它无法像 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 ls-files | xargs -d $'\n' touch
即可。 - Dan Moulding