本地浅层次的Git克隆与硬链接

5
在我的本地文件系统中,我希望只克隆git repo (A)的头部,以便不会将历史记录带到新的git repo (B)中。但是,我希望现在在B中的文件可以获得硬链接的好处,以节省空间。有没有办法做到这一点?一旦repo A发生变化,硬链接是否还有用?
谢谢!
2个回答

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个项目,因此您将获得最新提交以及其父项(如果是合并,则为其父项)。父项从原始存储库获取提交消息,但是提交消息是错误的,因为实际上提交包含整个树的创建。
我更喜欢从我选择的提交消息开始,创建一个单独的提交来创建初始树。这是通过首先在旧存储库中创建没有历史记录的新分支,然后将该分支拉入新的空存储库来实现的。我在一个巨大的存储库上进行了测试,该存储库具有664MB的对象数据库和673k个对象(将Emacs bzr存储库转换为git)。当新存储库接收到拉取请求时,它具有一个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

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


父分支会发生什么? - Jeff
如果你不需要它,可以使用 git branch -D 命令将其删除。该分支在父存储库中不需要额外的空间,因为它只包含一个指向已经存在于存储库中的树的提交。 - user4815162342
在当前的Git版本中,--depth意味着--single-branch - sphakka

2
您可以克隆它,然后重新创建头提交并剥离父项。考虑到您原始仓库的对象很可能在包中,您会硬链接更多内容,无论如何。是的,硬链接将保持完整一段时间,但一旦开始执行gc或类似操作,效果很可能会消失。您也可以使用替代方法而不是硬链接。
查找有关git commit-tree的文档以从树创建提交,我无法告诉您确切的语法。

2
git checkout --orphan 后跟 git commit 可以在不使用管道的情况下从树中创建提交。 - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接