![](/img/trans.png)
[英]remove all binary files recursively from git repo and commit history
[英]How to remove binary files from all of the bitbucket git history, when the repo is already very close to 2GB?
Bitbucket git repo 的大小限制为 2GB,现在我有一个 repo(我们称之为bigsize repo),由于大量二进制文件(扩展名为dll
的msm
). 它是如此接近限制,以至于我害怕涉及二进制文件的提交操作会将大小超过 2GB,因此提交将失败并且无法继续。
现在,如何通过减少 bigsize repo 大小来优化 go?
我正在考虑使用LFS 功能,但是 LFS 空间有 1GB 的限制,我担心这不足以使用这个 repo(因为大部分 repo 大小来自二进制文件我想存储在 LFS 中)。
因此,我正在考虑从存储库和历史记录中删除所有二进制文件(我不介意从源代码控制中丢失它们,因为它们在本地驱动器上),考虑到当前大小,如何最好地做到这一点我的大型回购?
我的攻击计划:
*.dll
的提交并使用git rm -rf -cached
命令)。 这是必需的,因为“默认情况下,BFG 不会修改您在 master(或“HEAD”)分支上的最新提交的内容,即使它会清除之前的所有提交。 ” 该方法是否适用于非常接近 2GB 的存储库? 我担心在第 1 步,当我使用git rm
时,它会添加到历史记录并将 repo 大小推到 2GB 以上,因此会失败。
重要细节:
对于 Git 2.22 或更高版本,请使用git filter-repo
:
git filter-repo --path your/big/file --invert-path
或者:
git filter-repo --strip-blobs-bigger-than 10M
这是我使用BFG repo clean解决问题的方法。 我把它写下来,以便对将来可能面临与我相同情况的人有所帮助。
甚至在开始之前,请确保您的所有分支都是“清晰的”,即:您想要的所有更改都被推送到它们各自的分支中。 让我们将我们巨大的 repo 命名为big repo,并假设它位于D:\MyCompany\big
。
此外,您可能想在实际处理生产存储库之前在玩具存储库上尝试此操作。
git clone --mirror git@bitbucket.org:YourUserName/big.git
),确保这个新文件夹不在你原来的大仓库文件夹中。 您需要非常确定这是与D:\MyCompany\big
完全不同的东西(因此您可以毫无畏惧地对其进行试验)。 假设这个文件夹是D:\big_work
,你将能够在克隆后找到D:\big_work\big.git
文件夹。big.git
文件夹到另一个地方,我们把它放在D:\backup
。 确定您的二进制文件确实超出了 bitbucket(或您的 repo 提供商)提供的 LFS 限制。 在这里,我需要确定我的二进制文件大小小于 1GB。 为此,请通过 BFG 将 big.git 的big.git
转换为 LFS。 在命令行:
3.1。 cd D:\big_work
3.2. java -jar <path to>bfg-xxxjar --convert-to-git-lfs "*.{dll, msm}" --no-blob-protection big.git
里面有D:\big_work
文件夹)
现在检查D:\big_work\big.git\lfs
文件夹的大小,是否超过 1GB? 如果不是,您可以从此处的步骤 4 继续将二进制文件转换为lfs
。 无需阅读 rest。
lfs
文件夹超过 1GB,则必须从 repo 中删除二进制文件并重写历史记录。D:big_work
中删除big.git
文件夹,然后从D:\backup
中恢复它(您在步骤 2 中执行的备份)。 这是最重要的一步:实际删除。 许多指南都讨论了为什么在执行此步骤之前首先确保提交是干净的(意味着当前 state 的存储库中没有更多的二进制文件)很重要。 但我确实发现诸如此类不必要且令人分心的建议。 因为我们已经非常清楚我们想要什么——也就是说,从我们的仓库中删除所有二进制文件,现在和过去,从所有分支中,合并或未合并,并且仓库应该看起来好像它从未被二进制文件污染在任何一个时间点——我们应该忽略这个警告。 为此,我们带来了我们的核武器no-blob-protection
。
7.1。 cd D:\big_work
7.2. java -jar <path to>bfg-xxxjar --delete-files "*.{dll,msm}" --no-blob-protection big.git
cd D:\big_work\big.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
D:\MyCompany\big
并且您的 sourcetree 书签指向此文件夹,因此您需要首先删除 sourcetree 书签,并将D:\MyCompany\big
重命名为D:\MyCompany\big_old
我的D:\MyCompany\big_old
。 暂时不要删除big_old
文件夹,因为即使您不希望二进制文件位于 repo 中,但您仍希望它们位于硬盘上,而big_old
文件夹提供了自然备份。 在您确定它确实没有任何价值之后,您可以在将来的某个时间删除big_old
文件夹。D:\MyCompany\big
文件夹以避免任何重大更改。D:\MyCompany\big
文件夹。big_old
到big
文件夹中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.