【问题标题】:Is it possible to avoid to `git push` a branch to REMOTES - ORIGIN if any commits was done?如果完成了任何提交,是否可以避免“git push”分支到 REMOTES - ORIGIN?
【发布时间】:2019-09-07 11:39:24
【问题描述】:

我需要一个检查 git push 操作的钩子。

如果创建了一个全新的分支并且它与 master 相同,我想要一个防止将其推送到远程源的钩子。 一旦完成了对该分支的第一次提交,就可以推送到原点。

基本上我想避免这种情况

$ (master) git checkout -b ticket-abc master

$ (ticket-abc) git push origin ticket-abc

如果没有与这个新分支相关的提交,我想阻止第二行。有没有办法用 git hooks 管理这个?

非常感谢

【问题讨论】:

  • 将分支推送到原点是什么意思?你的意思是合并?
  • 我编辑了问题
  • 你想避免什么影响?您描述的操作无效,因为新的 ref 与旧的相同。不会在远程修改任何内容并在本地输出“一切都是最新的”。
  • 好吧,一个新的分支被推送到远程源中,名称为ticket-abc。我需要避免在遥控器上推送分支 - 与 master 相同的来源,所以在任何完成提交之前。
  • 好的,所以如果他们不带来任何新的提交,你不希望创建新的分支。但我还是不明白……这种情况是否如此频繁以至于它会弄乱你的遥控器?这些新分支最终不会更新提交吗?您没有定期清洁分支机构的程序吗?抱歉所有问题:-)

标签: git push githooks git-push


【解决方案1】:

可以采用钩子pre-push

#!/bin/bash

master_sha=$(git rev-parse refs/heads/master)
while read local_ref local_sha remote_ref remote_sha;do
    if [[ "${local_sha}" = "${master_sha}" ]];then
        echo error: ${local_ref} points at the same commit with master
        echo error: push failed
        exit 1
    fi        
done
exit 0

但是我有点担心本地master的稳定性。如果不小心更新了,那么钩子就无法检测到它的变化,从而无法按预期推送失败。

【讨论】:

  • 你能更好地定义“意外更新”吗?你什么意思?
  • foo 是从master 创建的,mastergit pullgit commit 或其他将master 移动到foo 之前的新提交的命令更新推。
  • 我不得不说,在我的场景中,推送已经完成,所以钩子没有工作
  • @axel 钩子被调用了吗? ${local_sha}${master_sha} 的值是多少?
【解决方案2】:

我会使用 update 服务器端挂钩:

钩子对每个要更新的 ref 执行一次,并接受三个参数:

  • 正在更新的 ref 的名称,
  • 存储在 ref 中的旧对象名称,
  • 以及要存储在引用中的新对象名称。

然后我会做这样的事情:

#!/bin/sh

refname="$1"
oldrev="$2"
newrev="$3"

master=$(git rev-parse refs/heads/master)

if [ "$newrev" = "$master" ]; then
    echo "Rejected: $refname has no new commits compared to master" >&2
    exit 1
fi

exit 0

在这里,我们只是将被推送的分支 (refname) 引用的提交 (newrev) 的 SHA-1 与 master 引用的提交的 SHA-1 进行比较。如果它们相等,我们会以错误代码退出,从而防止在服务器上创建该特定分支

来自documentation

就在更新远程存储库上的 ref 之前,更新挂钩 被调用。它的退出状态决定了它的成功或失败 参考更新。

【讨论】:

  • 我不得不说,在我的场景中,推送已经完成,所以钩子没有工作
  • 这个钩子在服务器上运行,所以很自然地,它会对正在完成的push 操作做出反应。但是,它将阻止分支在远程创建
猜你喜欢
  • 2020-08-11
  • 2020-08-01
  • 2012-05-22
  • 2019-08-03
  • 2016-01-04
  • 2011-11-06
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多