如果有任何提交,是否可以避免将分支“git push”到 REMOTES - ORIGIN?

Is it possible to avoid to `git push` a branch to REMOTES - ORIGIN if any commits was done?

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

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

基本上我想避免这种情况

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

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

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

非常感谢

挂钩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 的稳定性。如果碰巧不小心被更新了,钩子无法检测到它的变化,因此不会像预期的那样推送失败。

我会选择 update 服务器端挂钩:

The hook executes once for each ref to be updated, and takes three parameters:

  • the name of the ref being updated,
  • the old object name stored in the ref,
  • and the new object name to be stored in the ref.

然后我会做这样的事情:

#!/bin/sh

refname=""
oldrev=""
newrev=""

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 与 [= 引用的提交的 SHA-1 进行比较14=]。如果它们相等,我们将以错误代码退出,从而阻止在服务器上创建 特定分支

来自documentation

Just before updating the ref on the remote repository, the update hook is invoked. Its exit status determines the success or failure of the ref update.