bash - 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
解决方案
在更新某些参考名称(例如,)之前运行预接收挂钩。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
继续,分支名称将被更新并消除重置的影响。(如果您退出非零,重置可能会生效,但没有发生推送,这是一个坏主意。)
解决这个问题仍然会给您留下剩余的问题。解决这些问题需要知道你真正想要实现的目标,你在这里没有提到。
推荐阅读
- mysql - 在 1 个 mySQL 查询中使用 2 个 INNER JOINS 的问题
- c# - DLL 注入不断失败并出现不一致的错误
- python - Python 运算符有哪些类型?
- javascript - 如何在 EJS(和 webpack 下)显示主机名
- mule - 如何在 MuleExpression 中访问此哈希图值“id”以将其与 queryparam 进行比较?
- javascript - 由于 mso-application 行,XMLHttpRequest 无法读取 XML InfoPath 表单
- oracle - Oracle 查找不同限制“代码”之间的共同位置
- python - 我的简单功能没有返回预期值
- android - 具有自定义布局的工具栏:左侧的空白区域
- reactjs - 为了钩子的目的,被称为 HOC 等同于常规组件吗?