2

面对编码人员无政府主义地添加二进制文件,如何精简 git 存储库,不仅可以删除有问题的文件,还可以删除它们在树中的历史记录。

我尝试使用bfg,但由于它适用于镜像的裸存储库,因此我在获取整个工作流程方面遇到了困难,需要从网络上的不同地方收集答案。

4

1 回答 1

1

最终对我有用的是在镜像的裸存储库和普通存储库之间来回切换。它可能看起来很长,但它确实包含了从大代表到小代表的所有步骤,而且它实际上很快(1000 万份工作)。

首先获取一个包含所有混乱的最后一个版本的本地镜像存储库(在互联网上可能需要很长时间。这是唯一可能需要很多时间的步骤):

git clone --mirror http://myservice.org/myrepo

然后将结果复制用于备份目的(我不是在开玩笑,我们将在最后使用它):

cp -r myrepo.git myrepo.git.bak

然后从裸版本创建一个普通版本,以便您可以清理:

mkdir myrepo.small 
cd myrepo.small 
mkdir .git
cd .git
cp -r ../../myrepo.git/* .
cd ..
git config --local --bool core.bare false

并假设清理是在主分支上完成的:

git checkout master

要清理,请使用以下命令发现大型曲目:

du -sh *

并消除它们(即使您想让它们不被版本化,我们稍后也会将它们放回去):

git rm bigThings

如果您只想保留一些文件但将它们从 git 历史记录中删除,您可以使用git rm --cached bigFile但我发现删除所有内容更容易,清理历史记录然后将它们放回原处。

只要你愿意,至少在你完成清理时:

git commit -m "big clean up"

您可以尝试将结果推送到镜像存储库,但我发现创建一个新的更容易(从存储库的父文件夹):

rm -rf myrepo.git
git clone --mirror myrepo.small 

最后下载 bfg(你需要安装 java)并在镜像克隆上运行。我想删除 5M 以上所有内容的历史记录,而我下载的 bfg 版本位于,~/Downloads/bfg-1.12.5.jar所以我使用了:

java -jar ~/Downloads/bfg-1.12.5.jar --strip-blobs-bigger-than 5M myrepo.git

确认清理(检查前后尺寸):

cd myrepo.small.git
du -sh 
git reflog expire --expire=now --all && git gc --prune=now --aggressive
du -sh 

它应该感觉更轻。此时我发现:

git push ../myrepo

不工作,所以我只是从干净的镜子中再次创建它:

rm -rf myrepo.small
mkdir myrepo 
cd myrepo 
mkdir .git
cd .git
cp -r ../../myrepo.small.git/* .
cd ..
git config --local --bool core.bare false
git checkout master

实际上,我还发现更容易删除我的存储库(在 bitbucket 上)并将其重新创建为空。当一切都正确时,在 .git/config 和 git push 中设置正确的中央仓库

为了将麻烦制造者项目放回文件夹中,我在开始时备份的正常版本的存储库上使用了一致。

先做一个普通版的备份

mkdir myrepo.bak 
cd myrepo.bak 
mkdir .git
cd .git
cp ../../myrepo.git/* .
git config --local --bool core.bare false
git checkout master
cd ..

然后在两者上同步运行

unison myrepo myrepo.bak

把我需要的东西放回去。在文件发送器或 USB 棒的其他替代品上的压缩包发送给所有贡献者,我们将再次启动并运行。

于 2015-10-07T12:58:54.087 回答