玩转大体积 Git 仓库

/

大体积 Git 仓库一般有两类:一类有着非常长的 Commit 历史,一类二进制文件占用空间较大,也有可能两者兼而有之。这类仓库系统时间消耗、磁盘占用等都超过普通仓库,怎么样才能减少操作过程中带来的不便呢?

Commit 历史非常长的 Git 仓库

技巧一:shallow clone

git clone --depth n remote-url

shadow clone 仅仅克隆最新的 n 条 Commit 记录到本地,大大节省了时间和空间开销。

技巧二:filter-branch

git filter-branch --tree-filter 'rm -rf /path/to/folder' HEAD

git filter-branch 可以彻底删除仓库中的文件或目录,对整个 Tree 进行重构,不过也会带来后遗症,前面从 Git 仓库中永久删除文件或目录一文中已有详述。

技巧三:仅仅克隆一个分支

对于分支众多的仓库来说,仅仅克隆需要的分支(一般情况下是 master)可以节省不少时间。

git clone URL --branch branch_name --single-branch [folder]

二进制文件占用较大空间的 Git 仓库

技巧一:sparse checkout

这个功能的作用是只 Checkout 出想要的档案,大致步骤如下:

#  Clone the full repository once
git clone URL [folder]
#  Activate the feature
git config core.sparsecheckout true
#  Add folders that are needed to keep on
echo example/ › .git/info/sparse-checkout
#  Read the tree as specified
git read-tree -m -u HEAD

执行上述操作后 Working Tree 下应该只剩 example 档案了。

技巧二:使用 submodules

可以将二进制文件所在的目录划分出来作为 submodule,这样二进制文件就不会频繁的出现在每个 Commit 历史中了。

技巧三:使用 git-annex 或者 git-bigfiles

git-annex 把文件内容存储在特殊的键值非关系型数据库,而把对应位置的符号链接存储在 Git 仓库中。git-bigfiles 是另一个在 Git 中存储大体积文件的解决方案。

参考:How to handle big repositories with git

Comments