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