gpt4 book ai didi

git 日志 : summarize movement of directories containing lots of files

转载 作者:太空狗 更新时间:2023-10-29 13:45:48 25 4
gpt4 key购买 nike

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

最佳答案

Git 动态计算文件重命名(使用“相似性索引”,参见 diff -M 选项;还有 -B-C ).如果给定提交 c1c2,路径 path1 已从 c1 消失,path2 已出现在 c2,这是一个“重命名候选人”。如果 path2 的文件内容与 path1 的文件内容非常相似,则文件必须已重命名(并且如果 -M 小于 100%,也可能会被修改。

要确定重命名是“目录重命名”,您需要添加以下形式的代码:

  • dir1 中的所有文件都消失了(包括未跟踪和忽略的文件)
  • 之前没有文件出现在dir2中(包括未跟踪和忽略的文件)
  • 鉴于动态检测到的重命名,名称为 dir1 的“足够”文件被重命名,以便 dir1 成为路径中的 dir2,而其余名称保持不变

决定将 dir1 重命名为 dir2。 (最后一点中的“足够”允许在新的 dir2 之外重命名一些文件。)

这里真正棘手的一点是括号中的两个位,“包括未跟踪和忽略的文件”。显然 git 不能告诉你这些文件的历史。 (当然可以假设不存在这样的文件,也许在选项标志的控制下。)我不确定这是否是决定不编写该算法的一个因素;但据我所知,它不在那里。

关于git 日志 : summarize movement of directories containing lots of files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19733972/

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