git“pre-push”钩子的标准输入为空。

5

我正在尝试创建一个 pre-push 钩子,以防止用户将代码推送到除当前所在分支之外的其他分支。

根据 pre-push.sample 示例(以及我阅读的各种线程),看起来我应该可以通过 stdin 读取我要推送的本地分支和远程分支:

while read local_ref local_sha remote_ref remote_sha
do
...
done

但是当我这样做时,local_ref和其他变量都为空(即使运行未编辑的示例hook,在循环中也从未进入)。

是否有一些配置或其他步骤,我需要访问stdin中的变量?

我正在使用git版本2.17.1


请问您能否展示一下您的 pre-push 脚本长什么样子,以及您如何进行测试?pre-push 脚本可以从 stdin 中接收该信息;如果没有更多上下文,那个循环看起来没问题。 - larsks
3个回答

2

从我的经验来看,我认为你遇到的问题和我一样。如果推送没有任何更改,即当你运行git push时看到“Everything up-to-date”,那么stdin的输入行将是空白的,必须有一些更改被推送才能填充该行。


0

首先,确保你的钩子被正确调用。

  • 这意味着:
  • 它的名称应该是pre-push(没有.sample
  • 它应该是可执行的(除非你在Windows上,在这种情况下它默认是可执行的)

Hooks可以直接使用,就像您正在尝试的那样,也可以使用管理工具。有时,编写Hooks可能会变得很复杂。您可以访问https://githooks.com/了解一些讲座和选项。 - Lovato

0
请检查一下在循环之前是否运行了已经读取标准输入的命令。在我的情况下,我在 pre-push 脚本中有一些 git lfs 的命令。我不得不将循环放在那个命令之前
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting '.git/hooks/pre-push'.\n"; exit 2; }
git lfs pre-push "$@"

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