为什么git repack在`filter-repo`中失败?

gijlo24d  于 12个月前  发布在  Git
关注(0)|答案(1)|浏览(105)

我有一个repo,其中git fsck --strict --full返回0,我现在添加一个文件.gitattributes到每一个提交git filter-reposcript here或这里的等价物。指挥官:

FILTER_BRANCH_SQUELCH_WARNING=1 \
    git filter-branch -f \
    --index-filter \
    "cp -f '$outDir/.gitattributes' .gitattributes && git add .gitattributes" \
    --tag-name-filter cat \
    --prune-empty -- --all

失败的是

Repacking your repo and cleaning out old unneeded objects
Counting objects: 100% (571811/571811), done.
Delta compression using up to 14 threads
Compressing objects: 100% (108091/108091), done.
error: bad packed object CRC for e9975de53768c33397b84bdad69b9c3e7a0aaba6
error: bad packed object CRC for e9975de53768c33397b84bdad69b9c3e7a0aaba6
fatal: packed object e9975de

我在这里完全没有希望了,我不知道我做错了什么?如果磁盘已满,不会有另一个故障,我检查了我有足够的空间,也在系统上.?

**注意:**我在Ubuntu:focal上使用git build 2.27.0,在Virtual Box 6.1上使用Windows主机,使用SSD,其中存储库位于.vdi映像中。
**更新:**有时失败,有时通过???

kdfy810k

kdfy810k1#

你可以在Git 2.43(2023年第4季度)中再试一次,因为“git repack“(man)机器学会了注意--filter=选项。
git filter-branchindex-filter可能会触发git repack上的过滤器,这应该得到更好的处理,现在git repack正式支持过滤器。
参见commit 9b96046commit 71c5aeccommit 1cd43a9commit 48a9b67commit 0e4747ecommit be315e9commit ff8504ecommit 66589f8commit 6cfcabf(2023年10月2日),Christian Couder ( chriscool )
(由Junio C Hamano -- gitster --合并于commit 1fdedb7,2023年10月10日)

repack:添加--filter=<filter-spec>选项

导演:Taylor Blau
签字人:蔡俊华
签字人:克里斯蒂安·库德
这个新选项将<filter-spec>指定的对象放入一个单独的packfile中。
例如,如果一些blob占用了快速存储上的大量宝贵空间,而它们很少被访问,那么这可能很有用。
将它们转移到一个单独的更便宜,但速度更慢的存储中可能是有意义的。
可以使用以下方法之一来查找哪个新的packfile包含筛选出的对象:

  • git verify-pack -v ...(男性),
  • test-tool find-pack ...,这是以前提交添加的,
  • --filter-to=<dir>,下面的提交将添加它来指定包含筛选出的对象的包的位置。

此功能通过连续运行git pack-objectsman)两次来实现。
第一个命令使用--filter=<filter-spec>运行,使用指定的过滤器。
它会打包对象,同时忽略过滤器指定的对象。
然后使用--stdin-packs启动另一个git pack-objects命令。
我们将所有先前存在的包传递到它的stdin中,这样它就会将所有对象打包到先前存在的包中。
但是我们也传入了它的stdin,由前面的git pack-objects --filter=<filter-spec>(man)命令创建的包以及保留的包,都以'^'为前缀,这样这些包中的对象将从结果包中省略。
结果是,只有第一个git pack-objects命令过滤掉的对象才在第二个git pack-objects命令生成的包中。
由于与保存包的交互有点棘手,因此添加了一些相关测试。
git repack现在在其手册页中包括:

--filter=<filter-spec>

从生成的包文件中删除与过滤器规范匹配的对象,并将它们放入单独的包文件中。
请注意,工作目录中使用的对象不会被过滤掉。因此,为了使拆分完全工作,最好在裸存储库中执行,并将-a-d选项沿着使用。
另外,应该使用--no-write-bitmap-index(或将repack.writebitmaps配置选项设置为false),否则写入位图索引将失败,因为它假设包含所有对象的单个包文件。请参阅git rev-list以获取有效的<filter-spec>表单。
以及:

gc:添加gc.repackFilter配置选项

签字人:克里斯蒂安·库德
之前的一个提交实现了git repack --filter=<filter-spec>(man),允许用户从主包中过滤出一些对象,并将它们移动到一个新的不同包中。
用户可能希望在执行其他重新打包和清理的同时定期执行这样的清理,作为git gcman)的一部分。
让我们允许他们使用新的gc.repackFilter配置选项配置<filter-spec>
现在,当git gc将使用通过此选项配置的<filter-spec>执行重新打包时,重新打包过程将传递相应的--filter=<filter-spec>参数。
git config现在在其手册页中包括:

gc.repackFilter

重新打包时,使用指定的过滤器将某些对象移动到单独的包文件中。请参阅git repack--filter=<filter-spec>选项。

相关问题