Git 仅从远程复制特定文件

Git copy only specific files from remote

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

例如,假设远程 master 分支拥有(以及许多其他)名称为 \src 的目录,其中有 .cpp.h 文件。怎么可能只得到所有头.h文件的副本?

当然,我正在寻找是否存在一种 不会 导致重写存储库或任何其他不良副作用的方法。很简单,从远程只获取一些指定文件的本地副本。

我考虑过 git archive and sparse-checkout 但不明白我是否可以使用它们来实现我的目标。

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

  1. -b branchname --single-branch 允许您只获取直接导致 branchname 的那些历史部分。它将跳过所有不必要的内容来完整描述 branchname.
  2. --depth n 允许您截断超过一定深度的历史记录。

除此之外,clone(以及commitpushpullmerge)等等总是 设计过程整个目录树从根开始。 commit(对象)是他们使用的项目,他们不知道单个文件(与 CVS 或 SubVersion 相反,例如,它们可以并定期对单个文件进行处理)。

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

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

更新 2: 我很确定,除了自己实现 git 网络协议外,没有办法获取单个零碎的片段从远程使用 git 命令。如果您自己谈论协议,那当然(相对)容易。 http://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols描述了一下,自己用起来好像也不难。