面对编码人员无意义地添加二进制文件,如何减少git存储库,不仅要删除有问题的文件,还要删除树中的历史记录。
我尝试使用bfg,但因为它适用于镜像裸存储库,我在获取整个工作流程时遇到了困难,需要从网络上的不同位置收集答案。
答案 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棒发送给所有贡献者,我们再次启动并运行。