使用bfg减少git存储库

时间:2015-10-07 12:58:54

标签: git bfg-repo-cleaner

面对编码人员无意义地添加二进制文件,如何减少git存储库,不仅要删除有问题的文件,还要删除树中的历史记录。

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

1 个答案:

答案 0 :(得分:1)

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

首先获取最后一个版本的本地镜像存储库以及所有混乱(可能需要很长时间才能通过互联网。这是唯一可能需要花费大量时间的步骤):

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

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

cp -r myrepo.git myrepo.git.bak

然后create a normal version from the bare version,以便您可以清理:

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 

最后download the 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

要在我开始备份的正常版本的存储库中使用unison的麻烦制造者项目放回文件夹。

首先制作正常版本的备份

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

然后放回我需要的东西。在filesender上的一个拉链或其他替代的usb棒发送给所有贡献者,我们再次启动并运行。