Git不会跟踪目录。它只跟踪某些目录中的文件。 (见How can I add an empty directory to a Git repository?)
但是,如果我有一定的提交历史,我隐含地也有目录树的更改历史记录。
那么如何回答以下问题:
我能想出的最接近的是伪代码:
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的问题。再次,可行,但可能不会在几分钟内。
问题是:
答案 0 :(得分:10)
对于问题1和2,这很容易:
创建目录foo / bar的时间是什么?
git log --oneline -- foo/bar | tail -n 1
当目录foo / bar被删除时?
git log --oneline -- foo/bar | head -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
仅创建一次并且不再存在。
答案 1 :(得分:4)
gitk foo/bar
为您提供了一个用户界面,用于浏览仅限于foo/bar
提交的提交的git历史记录。