我有一个repo,其中git fsck --strict --full
返回0
,我现在添加一个文件.gitattributes
到每一个提交git filter-repo
script 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
映像中。
**更新:**有时失败,有时通过???
1条答案
按热度按时间kdfy810k1#
你可以在Git 2.43(2023年第4季度)中再试一次,因为“
git repack
“(man)机器学会了注意--filter=
选项。git filter-branch
的index-filter
可能会触发git repack
上的过滤器,这应该得到更好的处理,现在git repack
正式支持过滤器。参见commit 9b96046、commit 71c5aec、commit 1cd43a9、commit 48a9b67、commit 0e4747e、commit be315e9、commit ff8504e、commit 66589f8、commit 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-objects
(man)两次来实现。第一个命令使用
--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 gc
(man)的一部分。让我们允许他们使用新的gc.repackFilter配置选项配置
<filter-spec>
。现在,当
git gc
将使用通过此选项配置的<filter-spec>
执行重新打包时,重新打包过程将传递相应的--filter=<filter-spec>
参数。git config
现在在其手册页中包括:gc.repackFilter
重新打包时,使用指定的过滤器将某些对象移动到单独的包文件中。请参阅
git repack
的--filter=<filter-spec>
选项。