当我想获取git diff文件时,我发现有人使用了
git diff-index --cached --diff-filter=AM --name-only HEAD
如果我使用
git diff --cached --diff-filter=AM --name-only HEAD
可以获得相同的结果。 那么“git diff”和“git diff-index”之间有什么区别呢? 何时必须使用“git diff-index”,而不是“git diff”?
当我想获取git diff文件时,我发现有人使用了
git diff-index --cached --diff-filter=AM --name-only HEAD
如果我使用
git diff --cached --diff-filter=AM --name-only HEAD
可以获得相同的结果。 那么“git diff”和“git diff-index”之间有什么区别呢? 何时必须使用“git diff-index”,而不是“git diff”?
git diff-index
是对索引或工作树进行的差异比较:
它比较树对象中找到的blob的内容和模式与工作树中的相应跟踪文件,或与索引中的相应路径。
git diff
更加灵活,可以比较两个文件、两个提交,或者(像diff-index一样)比较树和索引。
在您的情况下,diff HEAD
确实会将HEAD与索引进行比较,这也是diff-index
所做的。
git diff --cached
}}”(man)代码路径在fsmonitor知道文件是干净的时候没有填充必要的stat信息,结果表现得好像它不是干净的,这在Git 2.43(2023年第四季度)中已经得到了修正。sokac
)完成。gitster
--在提交 671eaaa中合并,2023年9月20日)
diff-lib
:修复fsmonitor开启时的check_removed
签名:Josip Sokcevic
git diff-index
(man) 在使用 fsmonitor 的存储库中可能会返回错误的删除条目。cache_entry
设置了 CE_FSMONITOR_VALID
,则不会初始化 stat *st
。fsmonitor
: skip lstat deletion check during git diff-index
", 2021-03-17, Git v2.32.0-rc0 -- merge listed in batch #4)。 strace -f -e file -o diff-index.log git diff-index HEAD
wc diff-index.log
less diff-index.log
https://git-scm.com/docs/git-update-index#_using_assume_unchanged_bit
https://public-inbox.org/git/loom.20160331T143733-916@post.gmane.org/
在研究了这两个命令的区别后,我发现了奇怪的行为:
看起来 git diff-index
对文件是否被更改但内容没有变化敏感,而git diff
在这种情况下不敏感。
换句话说,如果您想知道一个文件是否未更改,但不关心最近更改的时间戳是否有变化,请使用 git diff
。
git diff-index
的这种特异性。 - Bergi