为什么在复制笔记时存储库大小会翻倍?

时间:2017-05-05 15:25:52

标签: git subgit bfg-repo-cleaner git-notes

我使用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 prunegit reflog expire --expire=now --all && git gc --prune=now --aggressive,但仍然有80 Mb。

UPD:现在无法重现40 Mb回购:/ BFG清理后为80,复制后为86

1 个答案:

答案 0 :(得分:1)

Git 的三个演变(自 2017 年以来)和围绕 Git 的工具应该有助于解决这个问题:

  • 一个:github/git-sizer 之类的工具可以让您了解是什么占用了如此大的空间。
  • 两个:git filter-repo(即我 mentioned here)现在取代了 BFG 或 gilter-branch。 Install it first。 (python3 -m pip install --user git-filter-repo)。
    清理您不想要的 jar/二进制文件后,它会留下更少的数据。
git filter-repo --strip-blobs-bigger-than 10M
  • 三:丢失引用的对象可以被修剪掉,即使它们附有注释(这些注释会变成悬垂的,反过来可以用“git notes prune”修剪掉({{ 3}})).
    这已在 Git 2.31(2021 年第一季度)的文档中阐明。

请参阅 mancommit fa9ab02(2021 年 2 月 10 日)。
(2021 年 2 月 25 日在 Martin von Zweigbergk (martinvonz)Junio C Hamano -- gitster -- 合并)

<块引用>

commit d590ae5: 阐明 refs/notes/ 不会让附加的对象保持活动状态

签字人:Martin von Zweigbergk

<块引用>

docs(git help) gc 包含以下代码段:

"[...] 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”创建的那种)附加到对象上 有助于保持对象存活。
如果你期待一些 要删除的对象但它们不是,请检查所有这些位置 并决定在您的情况下删除这些是否有意义 参考资料。