问题 git在pre-push hook中提交


我添加了类似的内容 pre-push 钩:

gs0=$(git status)
pip-dump
gs1=$(git status)
if [ "gs0" != "gs1" ]
then
    git commit -m "pip-dump"
fi

(这是更新我的点数要求文件)

看起来推送并不是推动新提交,而是HEAD在脚本开头的时候。

如何解决?


2561
2018-01-24 13:55


起源

你最好不要包装或别名 git-push 做这两个步骤。 - AD7six


答案:


你不能: push 命令计算出在调用钩子之前提交推送,并在钩子退出0时推送它。

我看到三个选项:

  1. 退出非零,告诉用户“推送被拒绝,因为我添加了提交”
  2. 退出零,告诉用户“推送通过,但你需要再次推送,因为我添加了提交”
  3. 在添加新提交之后执行另一个(不同的)推入钩子,注意你的钩子不会无休止地递归,因为“内部”推动运行钩子,决定做另一个“内部再次”推动等。然后,在宣布你必须进行“内部”推动以获得额外的提交后,退出非零,中止“外部”推送。

我个人的偏好是第一个。预推钩是 意味着 作为“验证此推送是否正常”的操作,不是“改变此推动意味着其他一些不同的推动”操作。这意味着你不会违背软件的“意图”。使用预推钩作为验证器;如果你想要一个调用的脚本 git push 自动添加后 pip-dump 如果需要,提交,使用不同的名称将其写为脚本,例如 dump-and-push


15
2018-01-24 14:20



我很好,选项1是最好的。但是 dump-and-push 解决方案对我不利,因为我对自己或我的团队没有信心,没有忘记 git push 不被使用。 - lajarre
好吧,在拒绝推送是因为需要转储,你可以发出一条线说“顺便说一下,如果你使用这个其他脚本,它就会工作,那会不会更容易?提示提示!:-)” - torek
@lajarre你怎么能相信你的团队安装了钩子?长期隐藏在git push中可能会成为某种问题。 - AD7six
@ AD7six有一个好点:如果你 真 想要强制执行,您需要在集中式服务器上使用预接收或更新挂钩。 - torek
这是完全正确的,唯一的是我不能强制执行服务器端... - lajarre