gpt4 book ai didi

git - git中如何列出目录树的变更历史

转载 作者:IT王子 更新时间:2023-10-29 01:30:53 34 4
gpt4 key购买 nike

Git 不跟踪目录本身。它只跟踪存在于某个目录中的文件。(参见 How can I add an empty directory to a Git repository?)

但是,如果我有特定的提交历史,我也隐含地有目录树的更改历史。

那么我该如何回答这样的问题:

  1. 目录 foo/bar 是什么时候创建的(在 git 术语中:该目录中的第一个文件是什么时候创建的)。如果 foo/bar 已经被修改,那么可能会有不止一个符合条件的提交删除了历史上的某个时间并在以后重新创建。
  2. 目录 foo/bar 何时被删除(在 git 术语中:最后一个文件从该目录中删除的时间)。如上所述,可能有多个符合条件的提交。
  3. 历史上任何时间点存在的 foo/bar 的子目录是什么

我能想到的最接近的是伪代码:

loop over all commits (git rev-list --all)
start from repo root directory
do recursively on the directory tree rebuilt so far
call git ls-tree and grep the tree lines
rebuild next level of directory tree
end
end

显然,这可以用您最喜欢的脚本语言编写。

然后我有了所有的目录树,我仍然需要以一种聪明的方式搜索它们,以便回答类型 1 - 3 的问题。同样,可行,但可能不会在几分钟内完成。

问题是:

  1. 有没有更简单的方法?
  2. 如果不是:网上已有的脚本是否合适? (我的谷歌搜索没有显示任何内容,但我也没有找到完美的搜索词)

最佳答案

对于问题 1 和 2,这很简单:

  • 目录 foo/bar 是什么时候创建的?
    git log --oneline -- foo/bar |尾-n 1

  • 目录 foo/bar 是什么时候删除的?
    git log --oneline -- foo/bar |头-n 1

但是,第三部分有点棘手,我无法完全回答。

上面的两个命令为您提供了 $FIRST_REV(已创建)和 $LAST_REV(已删除)。

以下代码片段为您提供了修改树的所有提交:

for rev in $(git rev-list FIRST_REV..LAST_REV)
do
git ls-tree -r -t $rev | grep tree | cut -f 2
done

然后,您有一个存在的目录列表。但是仍然有重复项。将该列表传递给 sort -u 就完成了:

#!/bin/sh
for r in $(git rev-list FIRST_REV..LAST_REV)
do
git ls-tree -r -t $r | grep tree | cut -f 2
done | sort -u

但是,您会丢失这些目录受影响的提交信息。这就是缺点。

并且,这假设 foo/bar 只创建了一次并且不再存在。

关于git - git中如何列出目录树的变更历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7093602/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com