Git:如何压缩所有松散的提交记录

7
在使用git gcgit repack(带有各种选项)之后,文件夹.git/objects中仍然有4825个散落的提交(loose commits)。我想要将它们全部打包到pack文件中,与其他文件一起或者放在另一个pack文件中。
我正在进行大量的提交重写(amend + rebase),因此拥有许多无法访问的提交是完全正常的。我的.gitconfig包含这些参数,以便长时间保留reflogs和不可访问的提交。
[gc]
    reflogExpire = 300 days
    reflogExpireUnreachable = 200 days
    pruneExpire = 90 days

您可能会想知道这是否有意义,但我已经需要并恢复了几个几个月前做出的提交。我们通常会在一组新的优先级更高的分支上开发数个月,然后继续在较旧的优先级较低的分支上进行开发。
这个问题的主要原因是git gui不断地要求我压缩我的数据库,尽管我已经做过很多次了。如果我们无法打包这些松散的提交,那么这种“抱怨”可能是git gui中的一个错误。

哇,我从来不知道人们可以处理那么多松散的提交。 - prusswan
重复/相关?https://dev59.com/Gm865IYBdhLWcg3wivKj - cregox
2个回答

1

考虑到 git bundle 仅用于处理打包对象(调用 fetch-pack),你尝试过 打包, 然后克隆你的仓库吗?

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

如果这个操作成功了,你可以继续使用克隆后的新仓库作为你的主要仓库。

很抱歉,这并没有帮助。我创建了这样一个捆绑包,它有60MB大小。然而,我的文件包在.git/objects/pack中却有64MB大小,而所有的散对象加起来只有32MB大小。我尝试在捆绑包中引用一个悬空提交(来自我的仓库),但它没有成功(有人知道怎么做吗?)。 - Paul Pladijs
1
@PaulPladijs: 但是克隆的那个捆绑包是否包含任何未打包的对象?我同意,一个git捆绑包很可能只考虑引用的提交。 - VonC

1
git-gui的警告只是提示您可能需要进行一些维护。对于大多数人来说,拥有大量对象只会使他们变慢。在您的情况下,您应该禁用警告。相关函数是hint_gc,它在git-gui脚本文件的末尾附近被调用。只需像下面这样将其注释掉即可。
if {[is_enabled multicommit]} {
        #after 1000 hint_gc
}

多提交业务是一个标志,用于确定我们是否作为提交工具或通用应用程序运行。

如果您想在其他地方正常使用 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 中的下划线 _ 才能使其正常工作。我仍在等待重新打包的解决方案(我很好奇是否可能)。否则,这可能会成为最佳答案。 - Paul Pladijs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接