git log:总结包含大量文件的目录的移动

时间:2013-11-01 19:25:43

标签: git rename git-log

我正在我的存储库中进行一些目录级重组。生成的提交显示了大量的文件级重命名,这掩盖了这样一个事实:概念上我所做的只是一两个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

1 个答案:

答案 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无法告诉你这些文件的历史。 (当然可以假设没有这样的文件存在,也许是在选项标志的控制下。)我不确定这是否是决定不写那个算法的因素;但据我所知,它不在那里。