在 Git Commit 中仅克隆新上传的文件

Posted

技术标签:

【中文标题】在 Git Commit 中仅克隆新上传的文件【英文标题】:Cloning Only Newly Uploaded Files In Git Commit 【发布时间】:2019-01-12 17:26:22 【问题描述】:

我正在尝试从在线存储库下载文件,主要是 PDF。

但是,我只想下载特定提交的文件。总存档超过 1400 个文件,最近一次提交在总存档中增加了大约 300 个文件。

如何仅从存储库中克隆新上传的 300 个文件?

与我遇到的与下载单个文件有关的其他类似问题不同,我想下载整个提交,即超过 300 个文件。作为参考,repo 在这里:

https://github.com/KingOfCramers/sidtoday

...我想下载的新文件(到我的本地计算机)的提交在这里:

https://github.com/KingOfCramers/sidtoday/commit/07b7008f215ffe784068d9d2d14fb5d76875ca24

【问题讨论】:

How to checkout only one file from git repository ('sparse checkout')?的可能重复 你好约翰尼,我不认为这就是我要找的。我正在尝试从整个提交中复制许多文件,而不仅仅是下载一个文件。 商业的 git 单位是提交。如果您希望内容可以作为一个单元下载,请提交该内容。 我已经从另一个用户那里分叉了整个存储库,否则我不会遇到这个问题。我很困惑你的意思——真的没有办法简单地克隆/下载单个提交上传的文件吗?我觉得在这里获取屏幕上显示的文件应该不难......github.com/KingOfCramers/sidtoday/commit/… 内容又名快照又名提交和提交之间差异的分析/构造之间存在差异。 Web 浏览器会向您显示提交与其父级之间的哪些文件不同,这很有用。 【参考方案1】:

真的没有办法简单地克隆/下载单个提交上传的文件吗?

是的,确实没有办法简单地克隆或下载在单个提交中更新的文件

至少,没有 in-Git 方式。如果您控制服务器,您可以将 Git 作为一个工具 来构建您喜欢的任何东西。如果服务器是 GitHub,那么,看最后一段。

这个问题的根源在于一次提交不只包含更改的文件,也不包含更改:每个提交都是所有的完整快照 文件。因此,要找出发生了什么变化,您必须从 两个 快照开始。将其视为Spot the Difference 游戏之一:获得一张照片对您没有好处,您必须同时获得两者。

作为一个整体,Git 旨在提供所有快照。这些是提交;提交是存储库中的内容;所以这些就是你得到的。如果您想要不同的结果,Git-on-the-server 拥有所有快照,并且可以进行比较,您可以使用它来编写自己的软件来执行您想做的任何事情,但您需要控制 Git 服务器上的软件。幸运的是,您可以将整个存储库克隆到您的客户端上,然后您的客户端是一个非常好的服务器。

请注意,一旦你有一个克隆,git fetchinto 克隆使用的协议试图通过让两个 Git 比较注释来最小化网络流量。然后,服务器准备一个所谓的 thin pack,其中包含您已经拥有的对象的增量,只要可行,您就可以真正获得增量更改!但要使其正常工作,您必须有一个现有的克隆。

请注意,如果您的服务器专门是 GitHub,GitHub 提供了一个 REST API(嗯,可能有多个 API:当前一个是 version 3),您可以使用该 API比较提交和下载文件。具体参见https://developer.github.com/v3/git/trees/ 关于获取树(每个提交中的快照是一棵树)。请注意,有长度限制,如果超过,无论如何都会强制您进行克隆。

【讨论】:

虽然实际上不可能只下载更改的文件,但您可以使用git archive 从某些提交中下载一些文件,正如我在评论中指出的那样。也可以下载整个提交。 @JohnnyWiller:是的,取决于服务器,你通常可以下载一个存档(来自git archive),如果它有一个分支或标签名称,甚至是任意提交哈希 ID。对于相同的情况,您还可以使用--depth 1 进行--single-branch 克隆。因为git archive 动态构建存档,所以这些可能会有些不同。

以上是关于在 Git Commit 中仅克隆新上传的文件的主要内容,如果未能解决你的问题,请参考以下文章

vue上传和克隆

git 遇到的无法成功push的问题

IDEA中Git的使用

git 上传文件到github,以及克隆

git vs sourcetree

Git 中 6 个基本常用命令