Git只从远程复制特定文件

时间:2017-03-17 11:57:19

标签: git git-clone git-archive git-sparse-checkout

我正在尝试了解 Git remote 仅复制特定目录的特定文件的方式(如果可行)。 (对继续处理这些文件或获取历史记录不感兴趣

例如,假设远程主分支(以及许多其他分支)拥有名称为\src的目录,其中包含.cpp.h个文件。如何才能获得所有标题.h文件的副本?

当然,我正在研究是否存在导致重新编写回购或其他任何不良副作用的方法。简单地说,只从遥控器获取一些指定文件的本地副本。

我考虑过git archivesparse-checkout,但无法理解我是否可以用它们来实现我的目标。

1 个答案:

答案 0 :(得分:1)

您可以在git clone期间指定两种子集:

  1. -b branchname --single-branch只允许您获取直接导致branchname的历史记录部分。它将跳过不必完全描述branchname
  2. 的所有内容
  3. --depth n允许您截断超出一定深度的历史记录。
  4. 除此之外,clone(以及commitpushpullmerge)依此类推始终通过设计过程从根开始整个目录树。 commit(对象)是他们使用的项目,他们不知道单个文件(例如,CVS或SubVersion,它可以并且经常对单个文件起作用)。

    有一些方法可以使用特定的文件/目录,但这些方法相当低级,可能不是您想要的。例如,您可以使用git协议直接获取单个git对象(提交,树,blob ......)但我觉得这不是您所要求的。

    更新:如果您只想抓取文件并忽略历史记录,那么您可以使用--depth 1(获取整个目录树,但只需一次提交),抓住你的文件,并完成它。你仍然需要下载比你需要的更多的东西,但至少它将比整个历史记录更小(对于像Linux内核那样大的东西)。

    更新2:我很确定,除了自己实现git网络协议之外,没有办法用git命令从远程获取单个位片。如果你自己谈论协议,那当然是(相对)容易的。 http://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols描述了它,并且自己使用它似乎并不难。