git - 如何在 Git 中只下载远程项目的必要部分?

标签 git branch repository

如果您正在处理一个大型远程存储库并且您希望将下载限制在您正在处理的几个分支上,那么您如何配置 git-clone 命令,假设它在这种情况下是正确的命令?

最佳答案

回答真正的问题

使用 git 的本地克隆通常不会占用大量额外空间,因为 git 将使用硬链接(hard link)来共享目标文件。这很难注意到——如果你在每个 repo 上运行 du,你会得到完整的大小,但如果你同时在两个上运行它,你应该会看到节省的空间。我假设您已经出于某种原因认为这还不够好。也许您使用的文件系统不支持硬链接(hard link),或者克隆位于单独的驱动器或其他东西上……谁知道呢。

无论如何,如果您希望创建一个轻量级的克隆,以节省一些空间,为什么不节省所有空间呢?在 git 的 contrib 目录中有一个可爱的脚本叫做 git-new-workdir (链接指向 git.git 中的当前版本)。它从一个 repo 创建一个新的工作目录,.git 目录基本上都是通过符号链接(symbolic link)共享的——几乎唯一不是 HEAD 的东西。将脚本放在路径中的某个位置,您就可以像普通的 git 命令一样运行它:

git new-workdir <original-repo> <new-workdir-path>

瞧!你现在有两个工作树,有一个共享的 .git 目录,所以你占用的唯一额外空间是工作树文件。如果你想工作,那就别无选择!

您必须注意的一件事是检查两个存储库中的同一个分支。如果您随后在一个存储库中提交该分支,另一个将变得不同步——工作树和索引将与该分支现在所在的提交不匹配。否则,您可以愉快地在两个存储库中工作!

原始答案

首先让我声明,您基本上没有机会这样做。我是认真的。它几乎不会为您节省任何磁盘空间,而具有硬链接(hard link)对象的存储库(这是默认设置!您甚至无需执行任何操作即可获得它!)将为您节省大量空间。

几乎在每种情况下,分支机构都共享其大部分历史记录。节省空间的潜力只存在于它们最近出现分歧的一小部分。查看 git log branchA..branchB。这些提交是您将避免复制其对象的提交。那里有巨大的二进制文件吗?任何 1000 行差异?不?那就别管这个了。它不会帮助你。

还在读书吗?好吧,我认为 git-clone 不会让你弄乱 refspec(--mirror 除外,但这显然不是我们想要的这里)。如果这样做真的很重要,您可以通过创建一个空存储库并 pull 来管理它,然后小心地进行克隆会完成的其余设置:

mkdir foo && cd foo && git init
git remote add origin <url>
# set up a refspec to get the branch(es) you want
git config remote.origin.fetch "+refs/heads/foo:refs/remotes/origin/foo ..."
git fetch origin

您仍然缺少一些配置 - 特别是,您有一个本地 master 分支没有跟踪任何东西。

这是一个非常奇怪的设置,没有从原点抓取所有分支,但我想它应该可以工作。当然,正如我在评论中所说,您可能不会为自己省去很多麻烦。获取其他远程分支并不意味着您必须创建相应的本地分支,除非那些被排除在外的分支与您所获取的分支存在极大差异(即包含许多独特的内容),否则您不会节省太多带宽或磁盘空间。

关于git - 如何在 Git 中只下载远程项目的必要部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189869/

相关文章:

Git pull 恢复了 master 中的提交?

git - Pycharm,git : merge from master into branch

version-control - 分支和合并策略

github - 如何删除github上的远程仓库?

Git 历史 - 通过关键字查找丢失的行

git - git 如何解释冒号后跟路径?

git - 致命 : Could not read from remote repository. Github 错误:无法将某些引用推送到

git - 获取 Git 中两个分支之间的区别

asp.net-mvc - ASP.NET MVC/EF4/POCO/Repository - 如何更新关系?

eclipse - 合并/聚合 eclipse p2 存储库/可扩展的 p2 存储库