3

我使用 Subgit 导入 SVN 存储库,这是一个出色的工具,可以快速完成并支持自定义 svn 布局。Subgit 将 git commit -> svn 修订参考保存在git notes. 每个提交在注释中都有修订号,您可以使用git log.

在 SVN->git import 之后,我使用 BFG 存储库清理器从 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 notes 存储库大小后会变大 2 倍(即使我没有克隆--bare)。为什么?

示例:我已经使用 Subgit 从 svn 导入了 repo,并且有 400Mb .git。然后我应用 BFG 并获得 40 Mb 裸存储库。我想通过使用上面的 2 个命令移动(复制和删除)它们来恢复 git 笔记,但不幸的是 repo 的大小从 40 Mb 增长到 80 Mb。我尝试执行git notes prunegit reflog expire --expire=now --all && git gc --prune=now --aggressive这是 BFG 推荐的,但仍然有 80 Mb。

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

4

1 回答 1

1

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

  • 一:像github/git-sizer这样的工具可以让你了解是什么占用了这么多空间。
  • 二:(git filter-repo在这里提到的)现在替换了 BFG 或 gilter-branch。 先安装它。( python3 -m pip install --user git-filter-repo)。
    清理不需要的 jars/二进制文件后,它会留下更少的数据。
git filter-repo --strip-blobs-bigger-than 10M
  • 三:丢失引用的对象可以被修剪掉,即使它们附加了注释(这些注释将变得悬空,而这些注释又可以用“ git notes pruneman修剪)。
    这已在 Git 2.31 (Q1 2021) 的文档中阐明,.

请参阅Martin von Zweigbergk ( ) 的提交 fa9ab02(2021 年 2 月 10 日(由Junio C Hamano 合并 -- --d590ae5 提交中,2021 年 2 月 25 日)martinvonz
gitster

docs: 澄清 refs/notes/ 不要让附加的对象保持活动状态

签字人:马丁·冯·茨威格伯格

git help( man ) 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现在在其手册页中包含:

索引引用的对象、远程跟踪分支、reflogs(可能引用分支中的提交,后来被修改或重绕)以及refs/*命名空间中的任何其他内容。

请注意,git notes附在对象上的注释(由“ ”创建的那种)无助于使对象保持活动状态。
如果您希望删除某些对象而实际上并未删除,请检查所有这些位置并确定在您的情况下删除这些引用是否有意义。

于 2021-02-27T10:36:05.013 回答