首页 > 解决方案 > Gitlab:重置/回滚在预接收挂钩中不起作用

问题描述

当脚本“Check.py”在预接收挂钩中返回 0 或 1 时,我试图将提交回滚到以前的版本(请参阅以下代码)。我的问题是即使“git reset --soft $i^1”确实执行了,我仍然看到 GitLab 上的最新提交。我想要实现的是当 $ret 等于 0 或 1 时,我想将提交回滚到当前分支中的前一个。

谢谢大家的帮助!

read oldrev newrev branch

mapfile -t my_array < <(git rev-list $oldrev..$newrev)
 
for i in ${my_array[@]}
do
        git show $i > /tmp/$$.temp
        python /script/Check.py /tmp/$$.temp
        ret=$?
        if [ $ret -ne 2 ]; then
            git reset --soft $i^1
        fi
done

标签: bashgitgitlab

解决方案


在更新某些参考名称(例如,)之前运行预接收挂钩。refs/heads/foobranch它的工作是:

  • 阅读所有行(您只阅读了一个,即您假设只建议更新一个名称);
  • 检查这些行以查看是否允许推送更新所有这些名称;和
  • 退出 0 以允许更新开始,一次一个,或退出非零以拒绝整个推送。

你的脚本从来没有任何明确exit的,所以它会以最后一次命令运行的状态退出(但见下文)。零表示允许所有更新。

除此之外,您的脚本运行git reset --soft,它重置当前分支,不管是什么。当前分支与此特定更新的分支和/或标签无关git push,除非是偶然的。

然而,最直接的错误可能是:

当脚本“Check.py”返回 0 或 1 时,我试图将提交回滚到以前的版本......

您的脚本检查$ret -ne 2. 退出状态python /script/Check.py /tmp/$$.temp是 in $?,不是$ret。这会产生一个语法错误,然后 bash 简单地退出(在我的测试中为零;我发现这有点令人惊讶,但它可以解释你的结果)。 编辑:现在你有了ret=$?,脚本本身将运行,但如果HEAD命名一个git push更新的分支,并且如果你允许git push继续,分支名称将被更新并消除重置的影响。(如果您退出非零,重置可能会生效,但没有发生推送,这是一个坏主意。)

解决这个问题仍然会给您留下剩余的问题。解决这些问题需要知道你真正想要实现的目标,你在这里没有提到。


推荐阅读