Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从远程git存储库中以特定的提交(通过哈希)获取单个文件?_Git - Fatal编程技术网

如何从远程git存储库中以特定的提交(通过哈希)获取单个文件?

如何从远程git存储库中以特定的提交(通过哈希)获取单个文件?,git,Git,我希望在提交时从远程git存储库获取文件,而不获取存储库中的所有对象。我知道git archive不起作用,因为它只能获取分支的尖端 通过稀疏签出和使用协议v2(感谢@bk2204),我可以在提交时创建一个只有自述文件的工作树,但是git传输了10秒的数千个对象和188mb的数据 mkdir linux cd linux git init git config core.sparseCheckout true git config protocol.version 2 git remote ad

我希望在提交时从远程git存储库获取文件,而不获取存储库中的所有对象。我知道git archive不起作用,因为它只能获取分支的尖端

通过稀疏签出和使用协议v2(感谢@bk2204),我可以在提交时创建一个只有自述文件的工作树,但是git传输了10秒的数千个对象和188mb的数据

mkdir linux
cd linux
git init
git config core.sparseCheckout true
git config protocol.version 2
git remote add origin git@github.com:torvalds/linux.git
echo "/README" > .git/info/sparse-checkout
git fetch --depth 1 origin ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7
git checkout ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7
理想情况下,此操作应获取3个对象 -提交(已知的sha)>提交的树>树中的文件

$ git cat-file -p ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7 | grep tree
tree f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8
$ git cat-file -p f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8 | grep README
100644 blob 669ac7c32292798644b21dbb5a0dc657125f444d    README
$ git cat-file -p 669ac7c32292798644b21dbb5a0dc657125f444d

通常,如果不支持部分克隆,则无法获取单个对象。协议不允许这样做。稀疏签出不会阻止您获取所有数据,它只是阻止您将其全部签出

我不知道现在有任何主要的Git主机提供商普遍提供部分克隆支持,尽管我怀疑它很快就会出现。这一特征仍处于相对试验阶段


但是,如果您使用的远程设备支持协议v2,则可以获取特定的提交,即使没有协议v2通常也无法获取。您可以运行
git config protocol.version 2
,然后可以通过散列获取单个提交。在这种特殊情况下,使用
--depth 1
执行此操作是最好的选择。

托管服务应该有API来下载修订版文件或检索其内容。例如,Gitlab有,Github有,Gerrit有


对于简单的自托管存储库,要通过
git fetch
获取随机提交或对象,可以设置
uploadpack.allowareachablesha1inwant=true
uploadpack.allowAnySHA1InWant=true
。在大多数情况下,它们在安全性和性能方面都是错误的(默认情况下)。对于自托管Gerrit,它具有类似的配置选项。我不知道自托管Gitlab。

可能
--depth 1
无法获取您感兴趣的提交。您可以获取所有提交(不带--depth),然后获取文件。获取提交并不意味着克隆。它只带来相关的git数据,git不是一个任意字节范围的服务器。如果您想要为git repo中的对象提供任意字节范围的服务器,您可以使用许多repo服务器产品中的任何一种,并使用http请求从中拾取任意文件甚至字节范围。即使设置了protocol.version 2,我也无法从github获取提交。没有错误消息,但命令退出1。它对我来说确实有效,针对
git/git
进行测试。您确定要获取的是提交而不是树或blob吗?你能编辑你的问题来显示当你尝试这样做时会发生什么,包括你试图获取的哈希值吗?我昨晚在我的笔记本电脑上回复,它有一个旧版本的git,
2.7.4
。在我的2.25.0桌面上,我可以用v2获取提交,但它仍然获取188mb。我将使用协议v2输出编辑我的问题。对于Linux工作树来说,这是一个合理的数据量。稀疏签出不会影响获取的内容,因此188MB是合理的,因为工作树是900MB。不幸的是,无法获取更少的数据。看来我必须等待remotes支持
--filter
选项。或者使用主机提供的api。使用协议v2,我可以通过散列
获取
提交,但即使使用稀疏签出,远程也会发回许多对象。我认为它在递归地扩展除父引用以外的所有引用。@everett稀疏签出不影响
git fetch
。如果已经可以通过哈希获取提交,那么可以添加
--depth 1
--depth 2
以获取尽可能少的对象<如果要生成或应用修补程序,建议使用code>--depth 2
。我确实使用了
fetch--depth 1
,请检查问题中的示例。我猜稀疏签出不会过滤从远程请求的对象。@everett1992是的,稀疏签出是一个本地步骤。它不会影响git fetch
,也不会减少对象的数量。
$ git cat-file -p ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7 | grep tree
tree f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8
$ git cat-file -p f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8 | grep README
100644 blob 669ac7c32292798644b21dbb5a0dc657125f444d    README
$ git cat-file -p 669ac7c32292798644b21dbb5a0dc657125f444d