我使用Subgit导入SVN存储库,这是一个很好的工具,可以快速完成并支持自定义svn布局。 Subgit保存git commit - > git notes
中的svn修订引用。每个提交都有备注中的修订号,您可以使用git log
查看。
在SVN-> git import之后我使用BFG repo清理器从像jar,dll等二进制文件清理旧的项目存储库。
BFG不会重写git注释和更改提交之间的链接,但幸运的是它会留下object-id-map.old-new.txt
文件。
我使用此文件将旧提交中的注释复制到新提交:
cat object-id-map.old-new.txt | git notes copy --stdin
复制笔记后,我将它们从旧对象中删除:
cat object-id-map.old-new.txt | cut -d' ' -f 1 | git notes remove --stdin --ignore-missing
问题是,在修复git后,注册表的存储库大小变大了2倍(即使我克隆时没有--bare
)。为什么呢?
示例:我已使用Subgit从svn导入repo并拥有400Mb .git
。然后我应用BFG并获得40 Mb裸存储库。我想通过上面的2个命令移动(复制和删除)它们来恢复git音符,但遗憾的是repo的大小从40 Mb增加到80 Mb。
我尝试执行BFG推荐的git notes prune
和git reflog expire --expire=now --all && git gc --prune=now --aggressive
,但仍然有80 Mb。
UPD:现在无法重现40 Mb回购:/ BFG清理后为80,复制后为86
答案 0 :(得分:1)
Git 的三个演变(自 2017 年以来)和围绕 Git 的工具应该有助于解决这个问题:
git filter-repo
(即我 mentioned here)现在取代了 BFG 或 gilter-branch。 Install it first。 (python3 -m pip install --user git-filter-repo
)。git filter-repo --strip-blobs-bigger-than 10M
git notes prune
”修剪掉({{ 3}})).请参阅 man 的 commit fa9ab02(2021 年 2 月 10 日)。
(2021 年 2 月 25 日在 Martin von Zweigbergk (martinvonz
) 被 Junio C Hamano -- gitster
-- 合并)
签字人:Martin von Zweigbergk
<块引用>"[...] it will keep [..] objects referenced by the index,
remote-tracking branches, notes saved by git notes under refs/notes/"
我理解的意思是说附有笔记的对象被保留了,但事实并非如此。
让我们通过将关于 man(git notes
) 的部分移到一个单独的句子来澄清文档。
git gc
现在包含在其 man 中:
索引引用的对象、远程跟踪分支、引用日志
(可能会引用后来被修改的分支中的提交或
倒带),以及 refs/*
命名空间中的任何其他内容。
注意一个注意事项
(由“git notes
”创建的那种)附加到对象上
有助于保持对象存活。
如果你期待一些
要删除的对象但它们不是,请检查所有这些位置
并决定在您的情况下删除这些是否有意义
参考资料。