局部浅git克隆与硬链接

Jef*_*eff 5 git clone

在我的本地文件系统上,我希望能够只克隆git repo(A)的头部,所以没有历史记录来到新的git repo(B).但我希望现在B中的文件的硬链接的好处可以节省空间.有没有办法做到这一点?回购A改变后,硬链接是否有帮助?

谢谢!

use*_*342 6

似乎不可能在对象数据库之间用硬链接进行局部浅层克隆,至少从git 1.7.12开始.git clone --depth 1 --single-branch显式警告--depth在本地克隆中被忽略并使用file://.因此,您需要在硬链接和浅层克隆之间进行选择.

即使存储库发生更改,硬链接也会起作用,至少在一段时间内,因为git会将新对象添加到新文件中,并且永远不会修改现有文件.但是,它偶尔会重新打包对象数据库以提高效率,我不知道如何保存硬链接.

如果选择浅层克隆,则可以使用git clone --single-branch --depth 1 file://old_repo_dir选项创建克隆.我觉得这很烦人,这--depth 1意味着1项历史记录,所以你不仅会获得最新的提交,而且还会得到它的父级(如果它是合并,则为父级).父级从原始存储库获取提交消息,但提交消息的存在是因为实际提交包含整个树的创建.

我更喜欢从单个提交开始,使用我选择的提交消息来创建初始树.这是通过首先在旧仓库中创建没有历史记录的新分支,然后将该分支拉入新的空仓库中获得的.我在一个巨大的repo上测试了这个,它有一个664MB的对象数据库和673k对象(Emacs bzr存储库转换为git).当新的repo收到了pull,它有一个36MB的对象数据库,有3477个对象 - 所以多余的内容显然被修剪了.以下是确切的步骤:

# at the old repo:
git checkout --orphan tmp-snapshot
git commit -m "Initial commit."

# at the new repo location:
git init
git pull OLD_REPO_DIR tmp-snapshot:master

# back at the old repo:
git branch -D tmp-snapshot   # no longer serves a purpose
Run Code Online (Sandbox Code Playgroud)

现在,master新repo 的分支包含一个提交,其中一棵树与旧repo的树相同,并且没有任何历史记录.