预加载git存储库?

时间:2014-01-03 18:33:08

标签: git

如果我已经在本地拥有相同的文件,而不是从远程存储库中下载大型文件目录,有没有办法用文件“预加载”我的本地存储库?我已经在遥控器上本地拥有相同的文件,它们不在本地存储库中。

这是我的情况:

我有一个远程网站,其中包含大量(许多演出)资源目录(图像,PDF,swfs,flvs)。我已经为这个远程站点设置了一个git存储库,我已经在本地克隆了它,使用.gitignore文件将大资源目录排除在repo中。

我现在想把远程仓库的大资源目录作为一部分,但这会大大增加仓库的大小,当我进行下一次本地拉动时,我需要等待很长时间/下载。所以我基本上希望有一种方法可以告诉git“我会要求你拉回那个突然大得多的回购,但我已经把大部分东西都变得如此之大”?或者这可能是另一种方式,我首先将文件添加到我的本地仓库,然后以某种方式存储库解决它们有相同的文件并且不需要传输?

当新开发人员加入大型项目并且大部分可以在DVD上提供而不是他们必须克隆/下载庞大的回购时,这也会派上用场。

3 个答案:

答案 0 :(得分:0)

我只把git源代码,图片的所有部分,pdf,图片。 ..我会创建一个单独的存储服务器,在我的应用程序中,我链接到存储。

答案 1 :(得分:0)

我建议您在不考虑git-annex等选项的情况下,在git中添加千兆字节的二进制文件时要非常小心。

现在。仅仅在本地使用文件本身并不足以让Git使用它们。您可以使用git hash-object手动将大二进制文件添加到网络鸿沟两侧的Git对象数据库中,并在另一侧创建包含完全相同文件的提交,但是当推送/获取此类提交时,Git isn我们足够聪明,可以发现那些物体已经存在于另一边;因为不存在需要传输的提交,所以大的blob 包含在通过线路传输的结果包文件中。为避免这种情况,您必须手动复制所有提交和树对象,但省略大blob。可行,但可能比它的价值更麻烦。

更现实的方法是对网络传输进行一次攻击,并对未来的传输采取明智措施。您可以拥有一个人们可以克隆的本地镜像。如果这还不够快,则表明你的git太大了。

您还可以使用git clone --reference <ref> <url>克隆git,其中<ref>是包含您正在克隆的git的本地目录。这将重用参考git中的所有对象,使克隆速度极快。但是,正如git clone manpage中所述,新克隆将直接引用旧克隆中的对象,因此如果删除旧克隆,则会遇到麻烦。要实际复制对象,您可以在克隆后运行git repack -a

git clone --reference /some/old/clone http://example.com/some/git dirname
cd dirname
git repack -a
rm .git/objects/info/alternates

最后一个命令删除了引用git的链接,因此Git将来不会尝试在那里查找对象。

在例如分发Git存储库DVD或类似的存储机制会查看git bundle。参见例如How to git bundle a complete repo

答案 2 :(得分:0)

今天(2017年第四季度/ 2018年第一季度,也就是OP问题发布4年后),唯一与Git相关的克隆巨型Git回购的方式将是(2017年2月) GVFS (Git Virtual File System)

作为tweeted,对于270GB的回购:

  

“Windows代码库有超过3.5M的文件。使用GVFS(Git虚拟文件系统),克隆现在需要几分钟而不是12个多小时。“

请参阅github.com/Microsoft/GVFS GVFS基于Git fork github.com/Microsoft/git 并且基于规范为described here的协议。

目前尚未支持EGit,甚至还不支持常规Git,这种机制的整合已经开始,Git 2.16(2018年第一季度),以及窄/部分克隆,其中的对象 步行机械已被教导一种方法来告诉它“过滤”一些 来自枚举的对象。

这是围绕部分克隆documented here(2017年11月)进行讨论的结果,即使问题是highlighted back in May 2013

  

使用大型存储库时,必须获取用户感兴趣的历史区域中的所有对象是浪费的。
  在两种情况下尤其如此:

     
      
  1. 使用稀疏结帐:不太可能需要用户正在查看的目录之外的对象。之后,如果需要的话,用户应该能够获取该目录之外的对象(例如,如果稀疏结账扩展)。当与确定要自动使用的稀疏结账模式的虚拟文件系统(https://blogs.msdn.microsoft.com/devops/2017/02/03/announcing-gvfs-git-virtual-file-system/)结合使用时,这尤其有用。

  2.   
  3. 存储库包含大型二进制文件:为了构建最新版本的代码,不需要历史版本的大文件。
      使用浅层克隆失去了使用“git log”来理解项目在开发过程中的历史记录的能力   使用Git LFS需要提前预测此问题并确定要提前卸载到LFS的文件   在Git中原生支持省略大blob可以避免这种困境。

  4.         

    Microsoft和Google都在内部使用补丁来支持部分克隆并发布了补丁。此问题跟踪将功能合并到Git上游。

结果:

commit f4371a8commit 4875c97(2017年12月5日),commit 9535ce7commit caf3827commit 25ec7bccommit c3a9ad3,{{3} },commit 314f354(2017年11月21日)commit 578d81dJeff Hostetler (jeffhostetler)查看commit 1dde5fa(2017年12月5日) Christian Couder (chriscool)于2017年12月27日Junio C Hamano -- gitster --合并)

  

rev-list / pack-objects:添加列表对象过滤支持

     

教授rev-list以使用traverse_commit_list_filtered()接口提供的过滤来从结果中省略不需要的对象。

     

将来,我们将引入一种“部分克隆”机制,其中从远程获取的回购中的对象可以引用可以在需要时从该远程动态获取的丢失对象。   这种“部分克隆”机制将有一种方法,有时很慢,可以确定缺失的链接是否是该机制预期产生的链接之一。

     

此补丁引入了缺失对象的处理,以帮助调试和开发“部分克隆”机制,并且一旦实现该机制,高级用户就可以执行缺少对象感知的操作,而不会产生检查成本预计缺少一个链接。