克隆git存储库而不在本地保留修订

时间:2014-06-12 21:15:19

标签: git

是否可以在git中克隆存储库而不是保留所有修订版?

我的存储库很大(几十GB)。我不想在工作副本中加倍存储空间。我只想要文件并知道推送/拉取更新的位置。这甚至可以使用git还是我需要返回subversion?

4 个答案:

答案 0 :(得分:1)

您可以创建一个“浅层”克隆,但它会创建一个只读存储库,您无法从中获取或推入它。 这是命令: git clone repoUrl.git --depth 1 --branch branch_name

答案 1 :(得分:1)

我认为您最接近的目的是使用--depth选项git clone来限制被吸引的历史记录数量。这也意味着您不会拥有git log和朋友可以使用的所有历史记录 - 您无法针对远程存储库运行git log

也就是说,还有其他一些需要考虑的因素。 Git确实尝试将类似对象打包在一起,在构建包时给予它良好的压缩。这确实意味着文件本身需要以某种方式相似。这对于源代码非常有用,但对于某些二进制格式,它可能不太好。

对于大文件,Git也不是那么出色。 Git倾向于将整个文件加载到内存中,尽管已经做了一些努力来减少它。因此,您可能需要进行一些测试,以确保您不会遇到任何边缘。

答案 2 :(得分:1)

  

是否可以在git中克隆存储库而不是保留所有修订版?

由于没有那么严格的纪律,您可以使用--reference存储库在站点范围内只保留一个仓库,用于回购的大而稳定的部分,其中" site"被定义为"可以访问公共共享文件系统的机器"。

使其与共享文件系统一样安全:

  1. 制作一个只发布稳定引用的裸仓库。最简单的可能是制作一个完整的克隆,然后删除所有不稳定的克隆。

      

    git clone --bare u://r/l/to/real/upstream /path/to/reference/repo
      cd !$
      git tag -d all the tags that have even a whiff of instability about them
      git branch -D every branch
      git rev-parse any-tag > HEAD

  2. 使用此repo作为参考。克隆真正的上游时,

      

    git clone --reference /path/to/reference/repo u://r/l/to/real/upstream

  3. 而且真的就是在内部使用它。学科部分是,您必须确保带有您的软件仓库的文件系统始终可用于引用它的任何内容,并且对您的软件仓库的任何更改都不会留下未引用的提交。 chmod -R a-w会做得很好。

    如果人们以这种方式克隆到他们的笔记本电脑并将他们带到某个地方而无法访问软件仓库,他们需要先将他们的克隆从软件仓库中断开:

    # disconnect from depot:
    git repack -Ad \
    && rm .git/objects/info/alternates
    

    注意:

    对于真正动力不足的笔记本电脑和非常大的回购,重新包装可能不方便。另一种方法是:

    # disconnect from depots, minimal cpu load for underpowered localhost:
    cp -r $(cat .git/objects/info/alternates) .git \
    && rm .git/objects/info/alternates
    

    也可以打包"正是你所需要的"适用于git pack-objectsgit rev-list的公路旅行。这是一种方法:

    # pack up what I have locally, mark it as reliably-present:
    
    git repack -l
    for pack in .git/objects/pack/*.pack; do 
        touch $pack.keep
    done
    
    # pack up everything I still don't have that might actually be useful
    # no need to list tags that are ancestors of other tags here:
    
    git rev-list --objects --all ^tag-I-dont-need ^another ^etc \
    | git pack-objects --honor-pack-keep .git/objects/pack/pack
    mv .git/objects/info/alternates{,.inaccessible}
    
    # let git gc at what's here when needed
    rm .git/objects/pack/pack-*.keep
    

    并在返回折叠时,将替换文件放回原位。

答案 3 :(得分:1)

如果克隆将位于同一文件系统卷上,请使用git clone --local

它使用硬链接来节省空间。

git-clone手册页中查找。

这意味着您可以拥有完整的历史记录,而不会增加空间要求。