Git的预置钩子pre-push脚本无法通过STDIN接收输入。

8
Git-hooks pre-push文档指出,stdin的第一行将包含本地引用和SHA以及远程引用和SHA,格式如下: <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF 然而,我的简单pre-push脚本:
#!/bin/bash

echo "params=[$@]"

read line
echo "stdin=[$line]"

exit 1

当运行$git push时,返回以下输出:
params=[origin [url]:[branch].git]
stdin=[]
error: failed to push some refs to '[remote]'

脚本的参数如文档中所述(远程名称和路径)。预期出现错误,因为我的脚本以 1 的状态退出。但是,我似乎无法弄清楚为什么我没有像文档中规定的那样从 stdin 中接收本地和远程引用。
这是 git 的一个 bug 吗?还是我漏掉了什么?
1个回答

12

如果没有要推送的东西,就不会有任何标准输入行。如下所示,示例.git/hooks/pre-push.sample中有一个while循环:

IFS=' '
while read local_ref local_sha remote_ref remote_sha
do
    ...
done

当我在该循环内部添加一个"echo",不做其他操作时,看起来它能正常工作 - 因为当没有需要推送的内容时,我什么也不会得到输出,而有内容需要推送时,我将得到输出。


我还没有检查,但我肯定这正是发生的事情。问题在于我误解了您上面描述的约定。感谢您的澄清! - dcow
@dcow 这表明需要一个小的文档补丁来澄清这个问题;-) https://github.com/git/git/blob/master/Documentation/SubmittingPatches - Philip Oakley
@PhilipOakley在邮件列表上发布了消息。您能否帮忙看一下? - dcow
@PhilipOakley 这三份副本是我尝试更新最初的补丁所致。笔记中链接到这个问题的URL是错误的,所以我进行了修复并进行了回复。在Gmail中显示的消息格式错乱,因此我仔细检查了一切并重试了一次。结果看起来仍然一样,所以我猜这只是Gmail的小问题。感谢您的评论! - dcow
1
显然还有另一种可能性:如果推送是非快进的,但没有提供--force,则会调用脚本,但在stdin上没有任何输入。如果在原始命令行中添加--force,则stdin将按预期输入。这仍未记录(不像参数,感谢各位;) - stefanct
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接