7

我从 SVN 迁移到 git,并且在每个 git 提交中都有一个注释,引用了 SVN 修订号。在 repo 导入后,我使用 BFG repo 清洁器从二进制文件和其他垃圾中清除 git 历史记录。不幸的是,现在我在键入时看不到注释git log。我想 BFG 忘记更新注释提交的引用。BFG 留下一个 *.txt 报告,将旧对象 ID 映射到新对象 ID,格式如下:

0001b24011381e8885683cd1119ba4cb077fa64b c81149b1b52b9e1e1767d6141f292891d715edb5
00024eecdc31f2f6e67018f7d6f00e7c1ad03f1f 326ee3b508e3dd2934ec1f50069195f86ea1a1c7
00028e04dcc2d59bd835b447bd3a207ae481696c 3d18e9b9d3336e59d62093200b81603ffefcc747

鉴于上述映射,您能否建议一些脚本来快速修复注释?

PS:我几乎可以肯定问题是由未更新的参考文献引起的,因为当我输入git notes第二位时,我可以看到在 BFG 报告中被认为是旧的参考文献object-id-map.old-new.txt

4

2 回答 2

4

我编写了以下 bash 脚本来从旧对象中转移我的笔记。该解决方案在单线程中速度很慢,不确定git notes并行运行多个命令是否安全。

while read string; do
    hashesArray=($string)
    git notes copy ${hashesArray[0]} ${hashesArray[1]}
    git notes remove --ignore-missing ${hashesArray[0]}
done <object-id-map.old-new.txt
于 2016-11-22T00:22:52.240 回答
0

[编辑:Git 2.15 版,于 2017 年 11 月发布,添加--state-branch到过滤器分支。此选项将地图保存在第一个过滤器分支操作创建的分支中的文件中。随后的过滤器分支操作将使用现有的地图。因此,从 Git 2.15 开始,添加--state-branch <name>到您的 filter-branch 操作,然后在新创建的分支中使用地图。]

没有内置的东西可以做到这一点。您必须自己编写脚本或程序。git filter-branch从好的方面来说,BFG 给你留下了地图文件:这比, 把它扔掉要好得多,这样你更新笔记所需的信息就消失了。

注释中的底层实现是refs/notes/commits(或您设置的任何内容core.notesRef)指向普通提交,您至少在理论上可以git checkout(可能指向您为此目的专门设置的临时工作树)。此树包含名称为带注释的提交的文件——仅稍作修改。例如,如果:

0001b24011381e8885683cd1119ba4cb077fa64b c81149b1b52b9e1e1767d6141f292891d715edb5

是一个映射条目,0001b24011381e8885683cd1119ba4cb077fa64b是一个旧的提交,如果0001b24011381e8885683cd1119ba4cb077fa64b有一个注释条目,就会有一个文件,其名称0001b24011381e8885683cd1119ba4cb077fa64b-only,它可能是00/01b2...or 00/01/b2...

所有这些添加的子目录的嵌套深度由注释代码动态管理,总体思路是“根据需要添加尽可能多的树,以便快速查找是否有注释;但不要占用太多树当以0001b2....

您的工作将是在此树中以名称查找每个文件,并将其移动(或复制)到与新提交 ID 匹配的名称。由于在这种情况下的新名称是c81149b1b52b9e1e1767d6141f292891d715edb5,您可以将文件重命名为c8/1149b1b52b9e1e1767d6141f292891d715edb5, orc8/11/49b1b52b9e1e1767d6141f292891d715edb5等​​。一旦您重命名了所有文件(通过索引:使用git mvorgit rm --cachedgit add根据需要),您可以将它们转换为常规提交对象git write-tree其次是git commit-tree。使新提交的父级成为现有refs/notes/commits提交,并使用git update-ref更新refs/notes/commits指向提交,您的注释应该重新出现,过滤后。

(一旦你有这样的东西工作,它会很高兴加入git filter-branch和/或 BFG 本身。)

于 2016-11-21T20:02:01.790 回答