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

标签 git

我必须在一段时间内生成 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/

相关文章:

python-3.x - pip 安装私有(private) Github 存储库的简单方法?

linux - 为什么我不能重定向标准输出/错误以登录 Linux

git - 将 rsa key 添加到系统

git - 如何恢复几周前丢失的 git 提交?

git - 用黑色重新格式化整个 python 代码库后解决 git 冲突的最佳方法是什么?

git - 如何获取主分支中最新提交的修订号

git - git add 后自动显示状态

git - 从本地存储库推送到 GitHub 托管的远程

git - 如何比较两个 git 存储库?

git - git 的版本库根路径的语法是什么?