【问题标题】:git commit in pre-push hookgit commit 在 pre-push 钩子中
【发布时间】:2014-02-15 13:18:42
【问题描述】:

我在pre-push钩子中添加了类似的东西:

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

(这是更新我的 pip 需求文件)

似乎推送不是在推送新的提交,而是在脚本开始时 HEAD 所在的那个。

如何解决?

【问题讨论】:

  • 您最好包装或别名 git-push 来执行这两个步骤。

标签: git githooks


【解决方案1】:

您不能:push 命令会在调用钩子之前确定要推送的提交,并在钩子退出 0 时推送。

我看到三个选项:

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

我个人的偏好是第一个。预推送挂钩意味着作为“验证此推送是否正常”操作,而不是“更改此推送以表示其他不同的推送”操作。所以这意味着你没有违背软件的“意图”。使用 pre-push hook 作为验证者;如果您想要一个在需要时自动添加pip-dump 提交后调用git push 的脚本,请将其编写为脚本,使用不同的名称,例如dump-and-push

【讨论】:

  • 我认为选项 1 是最好的。但是dump-and-push 解决方案对我不利,因为我对自己或我的团队没有信心不要忘记不要使用git push
  • 好吧,在因为需要转储而拒绝推送时,您可以发出一行说“顺便说一句,如果您使用这个其他脚本,它会正常工作,不是更容易吗?提示提示!:-)"
  • @AD7six 有一个很好的观点:如果您真的想要强制执行,您需要在集中式服务器上使用预接收或更新挂钩。
  • 谢谢@torek!我需要在每次推送之前运行npm version patch 以自动管理版本。所以我使用选项1,效果很好! github.com/wechaty/wechaty/blob/…
  • 对于选项 3,您可以在脚本中调用 git push --no-verify 进行推送,而无需再次调用钩子
【解决方案2】:

为了补充 torek 的回答,这是 PowerShell 中对选项 #3 执行变体的一种方法。

在添加新的提交后,在钩子内做另一个(不同的)推送,注意你的钩子不会无休止地递归,因为“内部”推送会运行决定做另一个“再次内部”推送的钩子,等等.

不同之处在于我们退出零并执行“内部”推送完成“外部”推送之后。

预推

#!/bin/sh

dir=$(dirname "$0")

pwsh -NoProfile -File "$dir/pre-push.ps1";

pre-push.ps1

Register-EngineEvent PowerShell.Exiting -SupportEvent -Action {

  Write-Host "Registering post-formatting job.";

  try {
    $waitCommand = "while((git status -sb) -match 'ahead') { Start-Sleep -Seconds 1; };";
    $gitCommand = "git commit --allow-empty -m 'format'; git push --no-verify;"
    Import-Module Microsoft.PowerShell.Management;
    Start-Process pwsh `
      -WindowStyle Hidden `
      -ArgumentList "-NoProfile -Command $waitCommand $gitCommand";
  } catch {
    Write-Host $_;
  }

  Write-Host "Registered post-formatting job.";
}

# --------------
# Perform the auto-formatting here.
# --------------

exit 0;

该场景是自动格式化的,但它可以是在提交和推送之前更改代码的任何任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2019-01-08
    • 2014-06-27
    • 2015-08-19
    相关资源
    最近更新 更多