我必须在一段时间内生成一个git存储库中的更改列表。 为此,我注意到了提交ID并将其与最近的HEAD进行比较,以生成git存储库中的更改列表。例如:
$ git diff --name-status OLD_COMMIT..HEAD
这给出了git存储库中的修改列表。
但是,最近我注意到这种方法存在缺陷,因为它没有列出删除的目录。虽然它正确地列出了已删除的文件。
如何在git存储库中获取正确的删除列表? (因为,如果它可以列出已删除的目录,那么可以理解所有文件都已被删除。因此,不会有大量已删除的文件但只有一行显示已删除的目录!!!)< / p>
答案 0 :(得分:7)
git
会跟踪表示目录的树对象。虽然从对象模型的角度来看技术上可行,但git不会保留空的树。相反,git
将从其父树中删除空树的任何条目。
命令git diff-tree
生成一个输出,显示所有树条目在树之间的变化情况。
git diff-tree origin/master master
这将输出给定树中的所有条目(即本例中给定提交的根树)的更改方式。
格式在git-diff-tree
man page中描述,但基本上任何已创建或删除的目录在第二列或第一列中分别为040000,在第一列或第二列中分别为000000。这是左右条目的树条目“模式”。
如果要递归并查找子树中的树条目,则必须使用-t
选项,而不仅仅是-r
选项,因为默认情况下-r
显示树的子条目而不是树条目本身,-t
将显示两者。
如果您对已更改的目录感兴趣(添加或删除,或更改为或从其他类型更改 - 例如符号链接)而不仅仅是不同的内容,那么您可能需要过滤掉以:040000 040000
开头的条目。< / p>
这是一个可能的命令行。
git diff-tree -t origin/master master | grep 040000 | grep -v -E '^:040000 040000'