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

时间:2019-04-17 09:09:31

标签: git push githooks git-push

我需要一个钩子来检查private boolean inSplitScreenMode(List<AccessibilityWindowInfo> windows) { for (AccessibilityWindowInfo window : windows) { if (window.getType() == AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER) { return true; } } return false; } 操作。

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

基本上我想避免这种情况

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if ((event.getEventType() & AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) != 0) {
        if (inSplitScreenMode(getWindows()) {
            Log.d(TAG, "Split screen mode detected");
        } else {
            Log.d(TAG, "No split screen");
        }
    }
}

如果没有与此新分支相关的提交,我想阻塞第二行。有没有办法用git hooks来解决这个问题?

非常感谢

2 个答案:

答案 0 :(得分: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的稳定性有些担心。如果碰巧是偶然更新的,则该钩子将无法检测到其更改,因此无法按预期失败。

答案 1 :(得分:0)

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

  

该挂钩对每个要更新的引用执行一次,并带有三个参数:

     
      
  • 要更新的裁判的名字
  •   
  • 存储在引用中的旧对象名称
  •   
  • 以及要存储在引用中的新对象名称。
  •   

然后我会做这样的事情:

#!/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

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

来自documentation

  

在更新远程存储库上的ref之前,请使用更新挂钩   被调用。其退出状态决定了交易成功或失败。   引用更新。