我正在我的存储库中进行一些目录级重组。生成的提交显示了大量的文件级重命名,这掩盖了这样一个事实:概念上我所做的只是一两个git mv dir1/ dir2/
命令。
有没有办法让git log
总结这种操作,从概念上讲,整个目录都被移动了?我认为--dirstat
或--summarize
会让我至少接近,但他们似乎没有做我想做的事。
(我知道git的存储库模型不会跟踪有关目录的任何信息,只跟踪文件。但是,文件重命名也是如此,但它能够在事后得到有关文件级重命名的信息。)
这是一个简单的例子:
#setup
git init
mkdir dir1
for f in foo bar baz; do echo $f > dir1/$f; done
git add dir1
git commit -m 'dir1'
#do the directory move
git mv dir1 dir2
git commit -m 'rename dir1 to dir2'
此时我想看到这样的事情:
$ git log -1 --what-options-go-here?
b0ba9c9 rename dir1 to dir2
0 0 {dir1 => dir2}/
相反,我似乎只能制作这样的东西:
$ git log -1 --numstat --oneline
b0ba9c9 rename dir1 to dir2
0 0 {dir1 => dir2}/bar
0 0 {dir1 => dir2}/baz
0 0 {dir1 => dir2}/foo
答案 0 :(得分:1)
Git动态计算文件重命名(使用“相似性索引”,请参阅diff -M
选项;还有-B
和-C
)。如果提交 c1
和 c2
,则路径 path1
已从中消失{em> c1
中出现了path2
和 c2
,这是“重命名候选人”。如果 path2
的文件内容与 path1
的文件内容足够相似,则该文件必须已重命名(并且可能已修改,如果-M
小于100%
)。
要确定重命名是“目录重命名”,您需要添加表单代码:
dir1
中的每个文件都消失了(包括未跟踪和忽略的文件)dir2
没有出现任何文件(包括未跟踪和忽略的文件)dir1
的“足够”文件已重命名,以便dir1
在路径中变为dir2
,而名称的其余部分保持不变< / LI>
确定dir1
已重命名为dir2
。 (最后一点中的“足够”允许在新dir2
之外重命名一些文件。)
这里真正的粘性点是两个括号位,“包括未跟踪和忽略的文件”。很明显,git无法告诉你这些文件的历史。 (当然可以假设没有这样的文件存在,也许是在选项标志的控制下。)我不确定这是否是决定不写那个算法的因素;但据我所知,它不在那里。