Git
英文 ▾ 主题 ▾ 最新版本 ▾ gitremote-helpers 最后更新于 2.45.0

名称

gitremote-helpers - 与远程存储库交互的辅助程序

概要

git remote-<transport> <repository> [<URL>]

描述

远程辅助程序通常不会被最终用户直接使用,但当 Git 需要与 Git 本身不支持的远程存储库交互时,Git 会调用它们。给定的辅助程序将实现此处记录的功能子集。当 Git 需要使用远程辅助程序与存储库交互时,它会将辅助程序作为独立进程生成,将命令发送到辅助程序的标准输入,并期望从辅助程序的标准输出中获取结果。由于远程辅助程序作为独立于 Git 的进程运行,因此无需重新链接 Git 以添加新的辅助程序,也无需将辅助程序与 Git 的实现链接。

每个辅助程序都必须支持“capabilities”命令,Git 使用该命令来确定辅助程序将接受哪些其他命令。这些其他命令可用于发现和更新远程引用、在对象数据库和远程存储库之间传输对象以及更新本地对象存储。

Git 附带了一系列“curl”远程辅助程序,它们处理各种传输协议,例如git-remote-httpgit-remote-httpsgit-remote-ftpgit-remote-ftps。它们实现了fetchoptionpush功能。

调用

远程辅助程序使用一个或(可选)两个参数调用。第一个参数指定 Git 中的远程存储库;它是已配置远程的名称或 URL。第二个参数指定一个 URL;它通常采用<transport>://<address>的形式,但任何任意字符串都是可能的。GIT_DIR环境变量为远程辅助程序设置,可用于确定存储其他数据的位置或从哪个目录调用辅助 Git 命令。

当 Git 遇到<transport>://<address>形式的 URL 时,其中<transport>是它无法本地处理的协议,它会自动调用git remote-<transport>,并将完整 URL 作为第二个参数。如果在命令行上直接遇到此类 URL,则第一个参数与第二个参数相同;如果在已配置的远程中遇到,则第一个参数为该远程的名称。

<transport>::<address>形式的 URL 明确指示 Git 调用git remote-<transport>,并将<address>作为第二个参数。如果在命令行上直接遇到此类 URL,则第一个参数为<address>;如果在已配置的远程中遇到,则第一个参数为该远程的名称。

此外,当已配置的远程的remote.<name>.vcs设置为<transport>时,Git 会显式调用git remote-<transport>,并将<name>作为第一个参数。如果设置,第二个参数为remote.<name>.url;否则,第二个参数将被省略。

输入格式

Git 将命令列表发送到远程辅助程序的标准输入,每行一个命令。第一个命令始终是capabilities命令,作为响应,远程辅助程序必须打印其支持的功能列表(见下文),后跟一个空行。对 capabilities 命令的响应确定 Git 在命令流的其余部分中使用的命令。

命令流以一个空行终止。在某些情况下(在相关命令的文档中指示),此空行后跟一些其他协议中的有效负载(例如,pack 协议),而在其他情况下,它表示输入结束。

功能

每个远程辅助程序都预期仅支持命令子集。辅助程序支持的操作在对capabilities命令的响应中声明给 Git(见下文的命令)。

在下面,我们列出了所有已定义的功能,并为每个功能列出了具有该功能的辅助程序必须提供的命令。

推送功能

connect

可以尝试连接到git receive-pack(用于推送)、git upload-pack等,以使用 Git 的原生 packfile 协议进行通信。这需要双向全双工连接。

支持的命令:connect

stateless-connect

实验性;仅供内部使用。可以尝试连接到远程服务器,以使用 Git 的线协议版本 2 进行通信。有关更多信息,请参阅 stateless-connect 命令的文档。

支持的命令:stateless-connect

push

可以发现远程引用并将本地提交以及通往它们的提交历史推送到新的或现有的远程引用。

支持的命令:list for-pushpush

export

可以发现远程引用并将 fast-import 流中指定的特定对象推送到远程引用。

支持的命令:list for-pushexport

如果辅助程序声明了connect,则 Git 会在可能的情况下使用它,如果辅助程序在连接时请求,则回退到其他功能(请参阅命令下的connect命令)。在pushexport之间进行选择时,Git 更倾向于push。其他前端可能具有其他优先级顺序。

no-private-update

使用refspec功能时,git 通常会在成功推送后更新私有引用。当远程辅助程序声明no-private-update功能时,此更新将被禁用。

获取功能

connect

可以尝试连接到git upload-pack(用于获取)、git receive-pack等,以使用 Git 的原生 packfile 协议进行通信。这需要双向全双工连接。

支持的命令:connect

stateless-connect

实验性;仅供内部使用。可以尝试连接到远程服务器,以使用 Git 的线协议版本 2 进行通信。有关更多信息,请参阅 stateless-connect 命令的文档。

支持的命令:stateless-connect

fetch

可以发现远程引用并将从中可达的对象传输到本地对象存储。

支持的命令:listfetch

import

可以发现远程引用并将从中可达的对象作为 fast-import 格式的流输出。

支持的命令:listimport

check-connectivity

可以保证在请求克隆时,接收到的包是自包含的并且是连接的。

get

可以使用get命令从给定 URI 下载文件。

如果辅助程序声明了connect,则 Git 会在可能的情况下使用它,如果辅助程序在连接时请求,则回退到其他功能(请参阅命令下的connect命令)。在fetchimport之间进行选择时,Git 更倾向于fetch。其他前端可能具有其他优先级顺序。

其他功能

option

用于指定设置,例如verbosity(向 stderr 写入多少输出)和depth(浅克隆情况下需要多少历史记录),这些设置会影响其他命令的执行方式。

refspec <refspec>

对于实现importexport的远程辅助程序,此功能允许将引用约束到私有命名空间,而不是直接写入 refs/heads 或 refs/remotes。建议所有提供import功能的导入器都使用此功能。对于export来说,它是强制性的。

辅助程序可以多次声明此功能。第一个适用的 refspec 优先。使用此功能声明的 refspec 的左侧必须涵盖列表命令报告的所有引用。如果没有声明refspec功能,则有一个隐式的refspec *:*

为去中心化版本控制系统编写远程辅助程序时,建议保留存储库的本地副本进行交互,并让私有命名空间引用指向此本地存储库,而 refs/remotes 命名空间用于跟踪远程存储库。

This capability can be advertised multiple times. The first applicable refspec takes precedence. The left-hand of refspecs advertised with this capability must cover all refs reported by the list command. If no refspec capability is advertised, there is an implied refspec *:*.

bidi-import

此功能修改了 import 功能。远程助手可以使用 fast-import 命令 cat-blobls 来检索 fast-import 内存中已存在的 Blob 和树的信息。这需要从 fast-import 到远程助手的通道。如果它除了 "import" 之外还被广告,Git 会从 fast-import 到远程助手标准输入建立一个管道。这意味着 Git 和 fast-import 都连接到远程助手的标准输入。由于 Git 可以向远程助手发送多个命令,因此要求使用 bidi-import 的助手在将数据发送到 fast-import 之前缓冲批处理中的所有 import 命令。这是为了防止在助手的标准输入上混合命令和 fast-import 响应。

export-marks <file>

此功能修改了 export 功能,指示 Git 在完成后将内部标记表转储到 <file>。有关详细信息,请参阅 git-fast-export[1] 中的 --export-marks=<file>

import-marks <file>

此功能修改了 export 功能,指示 Git 在处理任何输入之前加载 <file> 中指定的标记。有关详细信息,请参阅 git-fast-export[1] 中的 --import-marks=<file>

signed-tags

此功能修改了 export 功能,指示 Git 将 --signed-tags=verbatim 传递给 git-fast-export[1]。在没有此功能的情况下,Git 将使用 --signed-tags=warn-strip

object-format

这表示助手能够使用显式哈希算法扩展与远程端交互。

命令

调用者在助手的标准输入上给出命令,每行一个。

capabilities

列出助手的功能,每行一个,以空行结束。每个功能前面可能带有 *,这表示它们对于使用远程助手进行理解的 Git 版本是强制性的。任何未知的强制性功能都是致命错误。

对该命令的支持是强制性的。

list

列出引用,每行一个,格式为“<value> <name> [<attr> …​]”。值可以是十六进制 sha1 哈希、“@<dest>” 表示符号引用、“:<keyword> <value>” 表示键值对,或“?” 表示助手无法获取引用的值。名称后跟一个空格分隔的属性列表;无法识别的属性将被忽略。列表以空行结束。

请参阅 REF LIST ATTRIBUTES 以获取当前定义的属性列表。请参阅 REF LIST KEYWORDS 以获取当前定义的关键字列表。

如果助手具有“fetch”或“import”功能,则支持。

list for-push

类似于 list,但仅当调用者希望使用生成的引用列表来准备推送命令时才使用。支持推送和获取的助手可以使用此功能来区分将使用 list 输出执行哪个操作,从而可能减少需要执行的工作量。

如果助手具有“push”或“export”功能,则支持。

option <name> <value>

将传输助手选项 <name> 设置为 <value>。输出一行包含以下内容之一:ok(选项已成功设置)、unsupported(选项无法识别)或 error <msg>(选项 <name> 受支持,但 <value> 对其无效)。应在其他命令之前设置选项,并且可能会影响这些命令的行为。

请参阅 OPTIONS 以获取当前定义的选项列表。

如果助手具有“option”功能,则支持。

fetch <sha1> <name>

获取给定的对象,并将必要的对象写入数据库。获取命令以批处理的形式发送,每行一个,以空行结束。当同一批次中的所有获取命令都完成后,输出一个空行。只有在 list 的输出中报告了 sha1 的对象才能通过这种方式获取。

可以选择输出 lock <file> 行,指示 $GIT_DIR/objects/pack 下文件的完整路径,该文件在引用可以适当地更新之前保留包。路径必须以 .keep 结尾。这是一种通过仅给出 keep 组件来命名 <pack,idx,keep> 元组的机制。即使在获取完成之前其对象可能未被引用,保留的包也不会被并发重新打包删除。.keep 文件将在获取结束时删除。

如果请求了 check-connectivity 选项,则如果克隆是自包含且连接的,助手必须输出 connectivity-ok

如果助手具有“fetch”功能,则支持。

push +<src>:<dst>

将给定的本地 <src> 提交或分支推送到由 <dst> 描述的远程分支。一个或多个 push 命令的批处理序列以空行结束(如果只有一个要推送的引用,则单个 push 命令后跟一个空行)。例如,以下将是两批 push,第一批要求远程助手将本地引用 master 推送到远程引用 master,并将本地 HEAD 推送到远程 branch,第二批要求推送引用 foo 到引用 bar(由 + 请求强制更新)。

push refs/heads/master:refs/heads/master
push HEAD:refs/heads/branch
\n
push +refs/heads/foo:refs/heads/bar
\n

在最后一批 push 命令之后,但在批处理的终止空行之前,可以输入零个或多个协议选项。

推送完成后,输出一个或多个 ok <dst>error <dst> <why>? 行以指示每个已推送引用的成功或失败。状态报告输出以空行结束。如果选项字段 <why> 包含 LF,则可以在 C 样式字符串中引用它。

如果助手具有“push”功能,则支持。

import <name>

生成一个 fast-import 流,该流导入命名引用的当前值。它还可以根据需要导入其他引用,以有效地构建历史记录。脚本写入助手特定的私有命名空间。命名引用的值应写入此命名空间中的一个位置,该位置是通过将“refspec”功能中的 refspec 应用于引用的名称得出的。

对于与外部版本控制系统进行互操作特别有用。

就像 push 一样,一个或多个 import 的批处理序列以空行结束。对于每一批 import,远程助手应生成一个以 done 命令结束的 fast-import 流。

请注意,如果使用 bidi-import 功能,则必须在开始将数据发送到 fast-import 之前缓冲完整的批处理序列,以防止在助手的标准输入上混合命令和 fast-import 响应。

如果助手具有“import”功能,则支持。

export

指示远程助手任何后续输入都是 fast-import 流的一部分(由 git fast-export 生成),其中包含应推送到远程的对象。

对于与外部版本控制系统进行互操作特别有用。

如果指定了 export-marksimport-marks 功能,则它们会影响此命令,因为它们被传递给 git fast-export,然后 git fast-export 将加载/存储本地对象的标记表。这可用于实现增量操作。

如果助手具有“export”功能,则支持。

connect <service>

连接到给定的服务。助手的标准输入和标准输出连接到远程端指定的服务(git 前缀包含在服务名称中,例如获取使用 git-upload-pack 作为服务)。此命令的有效回复为空行(连接已建立)、fallback(没有智能传输支持,回退到哑传输)以及仅退出并打印错误消息(无法连接,不要费心尝试回退)。在换行符终止正响应(空)后,服务的输出开始。连接结束后,远程助手退出。

如果助手具有“connect”功能,则支持。

stateless-connect <service>

实验性;仅供内部使用。连接到给定的远程服务以使用 git 的线协议版本 2 进行通信。此命令的有效回复为空行(连接已建立)、fallback(没有智能传输支持,回退到哑传输)以及仅退出并打印错误消息(无法连接,不要费心尝试回退)。在换行符终止正响应(空)后,服务的输出开始。消息(请求和响应)必须由零个或多个 PKT-LINE 组成,以刷新数据包结束。然后,响应消息将在刷新数据包后具有响应结束数据包以指示响应的结束。客户端不得期望服务器在请求-响应对之间存储任何状态。连接结束后,远程助手退出。

如果助手具有“stateless-connect”功能,则支持。

get <uri> <path>

从给定的 <uri> 下载文件到给定的 <path>。如果 <path>.temp 存在,则 Git 假设 .temp 文件是先前尝试的部分下载,并将从该位置恢复下载。

如果发生致命错误,程序会将错误消息写入 stderr 并退出。如果子进程关闭连接而没有完成当前命令的有效响应,则调用者应期望已打印了合适的错误消息。

可能支持其他命令,这可以从助手报告的功能中确定。

REF LIST ATTRIBUTES

list 命令生成一个引用列表,其中每个引用后面可能跟着一个属性列表。定义了以下引用列表属性。

unchanged

自上次导入或获取以来,此引用未更改,尽管助手不一定能够确定生成该值的具体内容。

REF LIST KEYWORDS

list 命令可能会生成一个键值对列表。定义了以下键。

object-format

引用使用给定的哈希算法。仅当服务器和客户端都支持 object-format 扩展时,才会使用此关键字。

选项

如果远程助手具有 option 功能,则定义以下选项,并且(在适当的情况下)由 Git 设置。

option verbosity <n>

更改助手显示的消息的详细程度。<n> 的值为 0 表示进程静默运行,助手仅产生错误输出。1 是默认详细程度级别,<n> 的较高值对应于命令行上传递的 -v 标志的数量。

option progress {true|false}

在命令期间启用(或禁用)传输助手显示的进度消息。

option depth <depth>

加深浅层仓库的历史记录。

选项 deepen-since <时间戳>

基于时间加深浅层仓库的历史记录。

选项 deepen-not <引用>

加深浅层仓库的历史记录,但不包括引用。多个选项累加。

选项 deepen-relative {true|false}

相对于当前边界加深浅层仓库的历史记录。仅在与“选项 depth”一起使用时有效。

选项 followtags {true|false}

如果启用,则助手应在获取命令期间传输标签指向的对象时自动获取带注释的标签对象。如果助手未获取标签,则通常会发送第二个获取命令来专门请求标签。某些助手可以使用此选项来避免第二次网络连接。

选项 dry-run {true|false}:如果为真,则假装操作已成功完成,但实际上不更改任何存储库数据。对于大多数助手,这仅适用于(如果支持)push

选项 servpath <c-style-quoted-path>

设置下次连接的服务路径(--upload-pack、--receive-pack 等)。远程助手可能支持此选项,但不应依赖于连接请求发生之前设置此选项。

选项 check-connectivity {true|false}

请求助手检查克隆的连接性。

选项 force {true|false}

请求助手执行强制更新。默认为 false

选项 cloning {true|false}

通知助手这是一个克隆请求(即当前存储库保证为空)。

选项 update-shallow {true|false}

允许扩展 .git/shallow,如果新的引用需要它。

选项 pushcert {true|false}

使用 GPG 签名推送。

选项 push-option <字符串>

将 <字符串> 作为推送选项进行传输。由于推送选项不能包含 LF 或 NUL 字符,因此字符串不会被编码。

选项 from-promisor {true|false}

指示这些对象是从承诺者获取的。

选项 no-dependents {true|false}

指示只需要获取所需的对象,而不是它们的依赖项。

选项 atomic {true|false}

推送时,请求远程服务器以单个原子事务更新引用。如果成功,则所有引用都将更新,或者都不更新。如果远程端不支持此功能,则推送将失败。

选项 object-format true

指示调用者希望将哈希算法信息从远程传递回来。此模式用于获取引用时。

Git

git[1] 套件的一部分

scroll-to-top