uTools-Manuals/docs/git/git receive-pack.html
2019-04-08 23:22:26 +08:00

16 lines
13 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="c-markdown doc-markdown"><div class="doc-postil"><div class="c-markdown"><h2>名称</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>git-receive-pack  - 接收推入存储库的内容</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>概要</h2></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">git-receive-pack &lt;directory&gt;</pre></div></div><div class="doc-postil"><div class="c-markdown"><h2>描述</h2></div></div><div class="doc-postil"><div class="c-markdown"><p><code>git send-pack</code>使用从远程端提供的信息调用并更新存储库。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>该命令通常不由最终用户直接调用。该协议的用户界面位于<code>git send-pack</code>侧面程序对旨在用于将更新推送到远程存储库。对于拉操作请参阅git-fetch-pack。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>该命令允许在远端创建和快速转发sha1 refsheads/tags严格来说这是本地最终<code>git-receive-pack</code>运行,但对于坐在发送包端的用户,它正在更新遥远的。)</p></div></div><div class="doc-postil"><div class="c-markdown"><p>在Documentation/howto目录中还有其他一些使用update和post-update钩子的真实例子。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>git-receive-pack</code> 尊重receive.denyNonFastForwards配置选项该选项告诉它是否应该拒绝对ref的更新如果它们不是快进的。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>其他一些receive.* config选项可用于调整其行为请参阅git-config。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>选项</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>&lt;directory&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要同步到的存储库。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>预接收hook</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>在任何ref被更新之前如果$ GIT_DIR/hooks/pre-receive文件存在并且是可执行文件它将被调用一次而没有参数。钩子的标准输入将被更新为每个参考线一行</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">sha1-old SP sha1-new SP refname LF</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>refname的值是相对于$ GIT_DIR; 例如,对于主人的头,这是“裁判/头/主人”。每个refname前的两个sha1值是更新之前和之后的refname的对象名称。要创建的引用将具有等于0 {40}的sha1而要删除的引用将具有等于0 {40}的sha1-new否则sha1-old和sha1-new应该是存储库中的有效对象。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>当接受一个签名推送参见git-push [1]签名推送证书存储在一个blob中并且<code>GIT_PUSH_CERT</code>可以查询其对象名称的环境变量。有关<code>post-receive</code>示例请参阅hook的说明。另外使用GPG验证证书并使用以下环境变量导出结果</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_SIGNER</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>签名推送证书的密钥所有者的名称和电子邮件地址。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_KEY</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>签署推送证书的密钥的GPG密钥ID。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_STATUS</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>GPG验证推送证书的状态使用与命令系列<code>%G?</code>格式相同的助记符<code>git log</code>请参阅git-log</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_NONCE</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>进程要求签名者将其包含在推送证书中的随机数字符串。如果这与推送证书中的“随机数”头中记录的值不匹配则可能表明证书是从单独的“git推送”会话重播的有效证书。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_NONCE_STATUS</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>UNSOLICITED</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>当我们没有要求它发送一个时“git push --signed”发送了一个随机数。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>MISSING</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>“git push --signed”没有发送任何随机头。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>BAD</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>“git push -signed”发送了一个伪造的随机数。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>OK</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>“git push --signed”发送了我们要求它发送的随机数。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>SLOP</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>“git push --signed”发送了一个与我们现在要求它发送的不同但是在之前的会话中。查看<code>GIT_PUSH_CERT_NONCE_SLOP</code>环境变量。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT_NONCE_SLOP</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>“git push --signed”发送了一个与我们要求它现在发送的不同的随机数但是在一个不同的会话中其起始时间与当前会话相差很多秒。只有在<code>GIT_PUSH_CERT_NONCE_STATUS</code>说时才有意义<code>SLOP</code><code>receive.certNonceSlop</code>在git-config中阅读有关变量。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>在更新任何refname之前和执行任何快进检查之前调用此钩子。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>如果预接收hook以非零退出状态退出则不会执行更新更新接收后和更新后钩子也不会被调用。如果更新不被支持这可以快速救助。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>请参阅下面的隔离环境注意事项。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>更新hook</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>在更新每个ref之前如果$ GIT_DIR/hooks/update文件存在并且是可执行文件则每个ref都会调用一次其中包含三个参数</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">$GIT_DIR/hooks/update refname sha1-old sha1-new</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>refname参数是相对于$ GIT_DIR; 例如对于主人的头这是“refs/heads/master”。这两个sha1参数是更新之前和之后refname的对象名称。请注意钩子在更新refname之前被调用所以sha1-old是0 {40}意味着还没有这样的ref或者它应该匹配在refname中记录的内容。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>如果要禁止更新指定的参考值则hook应该以非零状态退出。否则它应该以零退出。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>hook的成功执行零退出状态并不能确保引用实际上会被更新它只是一个先决条件。因此从这个hook发送通知例如电子邮件并不是一个好主意。考虑使用post-receive hook来代替。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>接收后hook</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>在所有ref被更新或试图更新之后如果任何ref更新成功并且$ GIT_DIR/hooks/post-receive文件存在并且是可执行文件则它将被调用一次而没有参数。钩子的标准输入对于每个成功更新的ref都是一行</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">sha1-old SP sha1-new SP refname LF</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>refname的值是相对于$ GIT_DIR; 例如对于主人的头这是“refs/heads/master”。每个refname前的两个sha1值是更新之前和之后的refname的对象名称。创建的Ref将具有等于0 {40}的sha1等号而被删除的ref将具有等于0 {40}的sha1-new否则sha1-old和sha1-new应该是存储库中的有效对象。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><code>GIT_PUSH_CERT*</code>环境变量可以被检查,就如同在<code>pre-receive</code>hook接受签字推后。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>使用这个hook很容易生成描述存储库更新的邮件。此示例脚本每次发送一条邮件消息列出推送到存储库的提交并将具有良好签名的签名推送推送证书记录到记录器服务</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">#!/bin/sh
# mail out commit update information.while read oval nval refdo        if expr "$oval" : '0*$' &gt;/dev/null
        then
                echo "Created a new ref, with the following commits:"
                git rev-list --pretty "$nval"        else
                echo "New commits:"
                git rev-list --pretty "$nval" "^$oval"
        fi |
        mail -s "Changes to ref $ref" commit-list@mydomain
done
# log signed push certificate, if anyif test -n "${GIT_PUSH_CERT-}" &amp;&amp; test ${GIT_PUSH_CERT_STATUS} = Gthen        (
                echo expected nonce is ${GIT_PUSH_NONCE}
                git cat-file blob ${GIT_PUSH_CERT}        ) | mail -s "push certificate from $GIT_PUSH_CERT_SIGNER" push-log@mydomain
fi
exit 0</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>此hook调用的退出代码将被忽略但非零退出代码将生成错误消息。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>请注意当此hook运行时refname可能不会有sha1-new。如果其他用户在更新后修改了ref <code>git-receive-pack</code>但在钩子能够评估之前这很容易发生。建议钩子依赖于sha1-new而不是refname的当前值。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>更新后的hook</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>经过所有其他处理后如果至少更新了一个ref并且$ GIT_DIR/hooks/post-update文件存在并且是可执行文件则更新后将使用已更新的ref列表调用。这可以用来实现任何存储库范围的清理任务。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>该hook调用的退出代码被忽略<code>git-receive-pack</code>无论如何,唯一要做的就是退出。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>例如,<code>git update-server-info</code>如果存储库已打包并通过哑传输进行服务,则可以使用此挂接。</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">#!/bin/sh
exec git update-server-info</pre></div></div><div class="doc-postil"><div class="c-markdown"><h2>隔离环境</h2></div></div><div class="doc-postil"><div class="c-markdown"><p><code>receive-pack</code>接收对象时,它们被放置到目录中的临时“隔离”目录中,<code>$GIT_DIR/objects</code>并且只有在<code>pre-receive</code>钩子完成后才迁移到主对象存储中。如果在此之前推送失败,则完全移除临时目录。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>这有几个用户可见的效果和注意事项:</p></div></div><div class="doc-postil"><div class="c-markdown"><ol class="ol-level-0 list-paddingleft-2"><li><p>推送由于传入包,缺少对象或<code>pre-receive</code>挂钩问题而失败的内容不会留下任何磁盘上的数据。这通常有助于防止重复的失败推送填满磁盘,但可能会使调试更具挑战性。</p></li><li><p><code>pre-receive</code>挂钩创建的任何对象都将在隔离目录中创建(只有在成功时才进行迁移)。</p></li><li><p><code>pre-receive</code>钩子不得更新任何指向隔离对象的参考。访问存储库的其他程序将无法看到对象并且如果预接收挂钩失败则这些引用会损坏。为了安全起见任何来自内部的ref更新都会<code>pre-receive</code>被自动拒绝</p></li></ol></div></div><div class="doc-postil"><div class="c-markdown"><h2>另请参阅</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>git-send-pack[1], gitnamespaces[7]</p></div></div></div>