如何获取我的git存储库中删除的目录列表?

时间:2009-08-31 07:36:07

标签: git

我必须在一段时间内生成一个git存储库中的更改列表。 为此,我注意到了提交ID并将其与最近的HEAD进行比较,以生成git存储库中的更改列表。例如:

$ git diff --name-status OLD_COMMIT..HEAD

这给出了git存储库中的修改列表。

但是,最近我注意到这种方法存在缺陷,因为它没有列出删除的目录。虽然它正确地列出了已删除的文件。

如何在git存储库中获取正确的删除列表? (因为,如果它可以列出已删除的目录,那么可以理解所有文件都已被删除。因此,不会有大量已删除的文件但只有一行显示已删除的目录!!!)< / p>

1 个答案:

答案 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'