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