[编辑: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 mv
orgit rm --cached
和git add
根据需要),您可以将它们转换为常规提交对象git write-tree
其次是git commit-tree
。使新提交的父级成为现有refs/notes/commits
提交,并使用git update-ref
更新refs/notes/commits
指向新提交,您的注释应该重新出现,过滤后。
(一旦你有这样的东西工作,它会很高兴加入git filter-branch
和/或 BFG 本身。)