局部浅git克隆与硬链接

时间:2012-09-19 18:59:39

标签: git clone

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

谢谢!

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

您可以克隆它,然后重新创建剥离父级的头部提交。考虑到你的原始回购品的对象可能是包装,无论如何,你的硬链接比你想要的要多。是的,硬链接将保持原状一段时间,但一旦你开始做gc或其他一些,效果可能会消失。您也可以使用替代品而不是硬链接。

查找git commit-tree的文档以从树中创建提交,我无法告诉您确切的语法。