Git不会跟踪目录.它只跟踪某些目录中的文件.(请参阅如何将空目录添加到Git存储库?)
但是,如果我有一定的提交历史,我隐含地也有目录树的更改历史记录.
那么我该如何回答以下问题:
我能想出的最接近的是伪代码:
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
Run Code Online (Sandbox Code Playgroud)
显然,这可以用您最喜欢的脚本语言编写.
然后我有所有目录树,我仍然需要以聪明的方式搜索它们,以便回答类型1 - 3的问题.再次,可行,但可能不会在几分钟内.
问题是:
eck*_*kes 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
Run Code Online (Sandbox Code Playgroud)
然后,您有一个存在的目录列表.但仍有重复.将该列表传递给a 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
Run Code Online (Sandbox Code Playgroud)
但是,您丢失了这些目录受影响的提交信息.这是缺点.
并且,这假定foo/bar
仅创建一次并且不再存在.