如何在不浪费空间的情况下复制/克隆git存储库?

时间:2009-06-30 15:17:12

标签: git

我正在做一些工作来追踪git支持工具中的感知错误,我想复制一个存储库(可能很多次)用于实验目的。我希望将硬链接创建到原始存储库对象数据库,以免浪费磁盘空间存储具有相同SHA值的相同对象的多个副本。 git clone很好地实现了这一点,但不幸的是我似乎无法找到一种方法让git clone给我一个像原始存储库一样的存储库的新副本:

  1. 克隆指向复制的存储库作为其来源,但我希望它与复制的存储库具有相同的来源
  2. 克隆只有一个分支,但我希望它拥有复制的存储库的所有分支
  3. 我可以通过使用git clone --mirror来改善其中的一部分,但这只会创建一个裸存储库,我正在尝试的存储库不是裸的,我试图调试的支持工具不会在裸存储库上运行。

    我考虑过编写一个快速的shell循环来创建一个新的对象数据库,其中包含原始对象数据库的硬链接,然后将其他所有内容复制到原始的.git目录中,然后执行git checkout,但我担心这很复杂,容易出错,而且我不太了解正确执行这种低级手术,并且会构建一个存在细微错误的存储库。理论上这种方法应该有效吗?

    更好的是,有没有办法将选项传递给git clone以使其能够满足我的需求?

    有没有办法可以创建一个新的存储库,但告诉它它的对象数据库在另一个目录中,基本上告诉它从原始存储库共享对象数据库?

    如果上述方法都不起作用,那么我只剩下一个cp -pr,这将耗费大量空间并且耗时。

3 个答案:

答案 0 :(得分:5)

我认为你正在寻找

git clone --reference=/path/to/existing/repo url

在git lingo中,这称为使用“替代”。如git clone help中所述,此选项存在潜在问题,但它可能适合您的目的。

您可能也对Dustin的助手git-alternates感兴趣。

答案 1 :(得分:0)

使用“git clone --mirror”,然后将其从裸存储库更改为非裸存储库(将repo.git重命名为repo / .git,复制.git / config文件,使用“git checkout HEAD”检出工作目录) 。注意:我没有检查它是否按预期工作!

答案 2 :(得分:0)

将git clone与--no-checkout选项一起使用。使用git fetch而不是git pull更新git存储库以避免签出。