【问题标题】:Git copy only specific files from remoteGit 仅从远程复制特定文件
【发布时间】:2017-08-08 23:29:30
【问题描述】:

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

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

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

我考虑过git archivesparse-checkout,但不知道是否可以使用它们来实现我的目标。

【问题讨论】:

  • 我读过其他答案,人们清楚地指出稀疏结帐不能用于此 (stackoverflow.com/a/14527198/3286832)
  • Git 不存储变更集(即颠覆),而是提交(表示某个时间点所有目录和文件的完整状态。
  • @AnoE 那么,是否可以在 Git 中仅从远程克隆特定文件?
  • @Yannis,不,评论的那部分很好。 ;) 我已经添加了答案。
  • 您只需要获取文件的副本还是要继续处理它们并提交并推回存储库?

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


【解决方案1】:

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

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

除此之外,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 描述了它,自己使用它似乎并不难。

【讨论】:

  • 想知道您的答案是否适用于我们只想将文件从远程复制到本地而没有历史记录或跟踪的情况,您知道吗?
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2013-05-23
  • 2019-06-13
  • 1970-01-01
  • 2014-06-06
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多