65.9K
CodeProject 正在变化。 阅读更多。
Home

减小 Github 源代码仓库大小

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2015年9月3日

CPOL

3分钟阅读

viewsIcon

14011

一篇关于如何减小臃肿的 Github 仓库大小的文章。

引言

在使用 Github 相对较长时间后,你可能会遇到仓库大小变得过大的问题。 这条建议将帮助你减小仓库大小,并改善任何可能吸引到的贡献者的整体体验。

背景

我们已经在 Github 上开发一个项目两年了。 期间创建了许多特性分支,并且添加/删除了许多文件。 所有这些文件仍然存在于 Git 历史记录中,每次克隆仓库时都会下载。 在高峰期,仓库大小达到了 200MB 以上,而有用的/活动代码只有几 MB 大小。 此时,仓库大小开始影响平台上开发人员的效率。 我们研究了几种减小大小的方案。 主要的顾虑是在保留仍然活动文件的历史记录的同时,也允许我们现有的客户能够查看和合并对其旧版本的更改。

解决方案

最终,我们使用了 https://rtyley.github.io/bfg-repo-cleaner/ 的工具。 它允许快速从 Git 历史记录中删除大文件,同时保留最新的 HEAD 文件。 这意味着我们不必担心删除仍然使用的东西。 我们希望删除尽可能多的二进制文件和 DLL。 最重要的是,库被移动到 nuget 包中,并且只有那些没有最新 nuget 仓库的文件才保留下来。 其中一个要求是保留与 1.x 版本相关的文件和历史记录,该版本目前在 1.x 分支中。 我们必须将其删除以减小仓库大小,因为它包含许多不再在当前 2.x 中使用的文件。 为了解决这个问题,我们决定将整个分支移动到一个新的仓库,这样就可以保留 1.x 的完整历史记录(包括大文件)。 要移动仓库,我们使用了以下命令

git push https://github.com/VirtoCommerce/vc-community-1.x.git v1.x:master

该命令会将分支推送到 vc-community-1.x Github 仓库并重命名为“master”。

其余命令与从现有仓库中删除大文件有关

git clone --mirror https://github.com/VirtoCommerce/vc-community.git .git
java -jar bfg.jar --delete-folders '{.nuget,Architecture,Projects,SDK,
Shared,Tests,Tools,packages,src}' --protect-blobs-from master,dev .git
java -jar bfg.jar --delete-files '*.{dll,exe,lib,pfx,nupkg,zip,eot,otf,
ttf,woff,bmp,gif,ico,jpg,jpeg,png,sql}' --protect-blobs-from master,dev .git
java -jar bfg.jar --strip-blobs-bigger-than 100K --protect-blobs-from master,dev .git
cd .git
git reflog expire --expire=now --all; git gc --prune=now --aggressive
git push

上面的脚本会将干净的仓库克隆到本地文件夹,不包含任何内容文件,删除大文件,然后将所有更改推回到仓库。

Counting objects: 47842, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12659/12659), done.
Writing objects: 100% (47842/47842), 13.03 MiB | 377.00 KiB/s, done.
Total 47842 (delta 34134), reused 47842 (delta 34134)
To https://github.com/VirtoCommerce/vc-community.git
 + cda685f...b8cf9ab dev -> dev (forced update)
 + f763931...5e12fb4 master -> master (forced update)
 + 80c1ae1...af480a0 community/dev -> community/dev (forced update)
 + 96c221b...b96e4b5 v1.10 -> v1.10 (forced update)
 + b835d58...0c9a746 v1.11 -> v1.11 (forced update)
 + 19f286e...f3c251a v1.12 -> v1.12 (forced update)
 + 192d38a...c646866 v1.13 -> v1.13 (forced update)
 + 30b0f11...368e912 v1.9 -> v1.9 (forced update)
 + 48aae27...a79c544 v1.9.732 -> v1.9.732 (forced update)
 + bec5eaa...211d6d6 v2.1 -> v2.1 (forced update)
 + 3da7501...c6f6cb2 v2.2 -> v2.2 (forced update)
 + 54ce0ac...75fc554 v2.3 -> v2.3 (forced update)
 + 788b7fd...0d53a8d v2.4 -> v2.4 (forced update)
 ! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/1/merge -> refs/pull/1/merge (deny updating a hidden ref)
 ! [remote rejected] refs/pull/2/head -> refs/pull/2/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/3/head -> refs/pull/3/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/37/head -> refs/pull/37/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/37/merge -> refs/pull/37/merge (deny updating a hidden ref)
 ! [remote rejected] refs/pull/4/head -> refs/pull/4/head (deny updating a hidden ref)
 ! [remote rejected] refs/pull/4/merge -> refs/pull/4/merge (deny updating a hidden ref)

error: failed to push some refs to 'https://github.com/VirtoCommerce/vc-community.git'

所以,它未能重写一些隐藏的引用,Github 上的仓库大小是 94 MB,但是如果你进行普通的克隆,它会缩小到 14 MB。

结论

使用 Git 社区提供的工具,这个过程非常简单。 我还想提到另一个工具是 Git Extensions – http://gitextensions.github.io/。 它包含一个大文件插件,只需打开仓库就可以显示仓库中的所有大文件。 这是一个非常有用的功能,可以弄清楚为什么你的仓库变得臃肿。

现在我们在向仓库添加二进制文件时非常小心,因为 Github 对这些文件的处理不太好。

© . All rights reserved.