【问题标题】:Git: how to repack all loose commitsGit:如何重新打包所有松散的提交
【发布时间】:2012-01-07 19:31:35
【问题描述】:

在使用git gcgit repack(带有各种选项)后,我在.git/objects 文件夹中仍有4825 个松散的提交。我想将它们全部放在包文件中,其余的放在另一个包文件中。

我正在做很多提交重写(修改+变基),因此有许多无法访问的提交是完全正常的。我的 .gitconfig 包含这些参数以保持 reflogs 和无法访问的提交很长时间。

[gc]
    reflogExpire = 300 days
    reflogExpireUnreachable = 200 days
    pruneExpire = 90 days

您可能想知道这是否有意义,但我已经需要并且已经恢复了几个月前所做的一些提交。碰巧我们在一组新的高优先级分支上开发了好几个月,然后继续在旧的低优先级分支上。

这个问题的主要原因是git gui 一直抱怨压缩我的数据库,尽管我已经这样做了很多次。 如果我们无法打包那些松散的提交,那么这种“抱怨”可能是git gui 中的一个错误。

【问题讨论】:

标签: git garbage-collection git-gui git-commit


【解决方案1】:

考虑到git bundle 仅用于处理打包对象(调用fetch-pack),您是否尝试过to bundle,然后克隆您的repo?

git bundle create aBundle --all # hopefully package everything, 
                                # the result being *one* file.
git clone aBundle newRepo       # recreate a full repo
# check if the cloned repo contains only packaged object

如果可行,您可以继续使用新的克隆存储库作为您的主存储库。

【讨论】:

  • 恐怕这没有帮助。我创建了这样一个包,它是 60 MB。但是我在 .git/objects/pack 中的文件包是 64 MB,所有松散的对象对象加起来需要 32 MB。我试图在包中引用一个悬空提交(我的存储库),但它不起作用(有人知道怎么做吗?)。
  • @PaulPladijs:但是该捆绑包的克隆是否包含任何未打包的对象?不过,我同意 git 包可能只考虑引用的提交。
【解决方案2】:

来自 git-gui 的警告只是提示您可能需要进行一些维护。对于大多数人来说,拥有大量对象只会减慢它们的速度。在您的情况下,您应该禁用警告。有问题的函数是hint_gc,它是从 git-gui 脚本文件的末尾附近调用的。只需将其注释如下。

if {[is_enabled multicommit]} {
        #after 1000 hint_gc
}

multicommit 业务是一个标志,它确定我们是作为 committool 还是作为通用应用程序运行。

如果您想在其他地方正常使用 git-gui,那么您可以添加一个特定于存储库的标志。比如:

if {[is_enabled multicommit] && ![is_config_true gui.skip_gc_warning]} {
        after 1000 hint_gc
}

应该让您使用 git config --bool gui.skip_gc_warning true 在每个存储库的基础上禁用它。

【讨论】:

  • 这是个好主意!我试过了,但你必须删除 skip_gc_warning 中的下划线 _ 才能使它工作。我仍在等待重新包装解决方案(我很好奇是否可能)。否则这可能成为最佳答案。
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2012-12-12
  • 2014-01-07
相关资源
最近更新 更多