簡體   English   中英

Git hook prepare-commit-msg 以防止合並禁止的分支 - 將 Ruby 轉換為 Bash

[英]Git hook prepare-commit-msg to prevent merging forbidden branches - translate Ruby to Bash

我正在嘗試實現 git 掛鈎,以防止用戶將我們的環境分支(除主分支外)合並到票證分支中。 這個鈎子正是我需要的,除了它是用 Ruby 編寫的。 我需要我的鈎子在 bash 或 shell 中,這樣我們所有的開發人員都可以輕松采用而無需修改他們的機器。 問題是我正在努力弄清楚如何翻譯它,因為我對 git 的 bash 腳本沒有經驗。

這是 Ruby 中的腳本:

#!/usr/bin/env ruby
FORBIDDEN_BRANCHES = ["uat", "support"]

def merge?
  ARGV[1] == "merge"
end

def merge_msg
  @msg ||= `cat .git/MERGE_MSG`
end

def from_branch
  @from_branch = merge_msg.match(/Merge branch '(.*?)'/)[1]
end

def from_forbidden_branch?
  FORBIDDEN_BRANCHES.include?(from_branch)
end

if merge? && from_forbidden_branch?
  out = `git reset --merge`
  puts
  puts " STOP THE PRESSES!"
  puts " You are trying to merge #{from_branch} into your branch."
  puts " Surely you don't mean that?"
  puts
  puts " run the following command now to discard your working tree changes:"
  puts
  puts " git reset --merge"
  puts
  exit 1
end

這就是我到目前為止所得到的......我已經弄清楚了如何設置 FORBIDDEN_BRANCHES 數組,並檢查當前正在執行的操作是否是合並。 我缺少的是如何獲得實際的 FROM_BRANCH (它目前被硬編碼為“支持”)

#!/bin/bash
FORBIDDEN_BRANCHES=("uat" "support" "develop")
FROM_BRANCH="support"
FROM_FORBIDDEN=0

for i in ${!FORBIDDEN_BRANCHES[@]}; do
  if test ${FORBIDDEN_BRANCHES[$i]} = $FROM_BRANCH
  then
    echo "Merging from $FROM_BRANCH is forbidden"
    FROM_FORBIDDEN=1
  fi
done

echo $FROM_FORBIDDEN

if test "$2" = "merge"
then
    if test $FROM_FORBIDDEN = 1
    then
        echo "STOP!"
        exit 1
    else
        echo "FROM_FORBIDDEN != 1, continuing"
    fi
else
    echo "Not merging"
fi

echo "Got to the end without errors..."

我沒有得到答案,但我確實想出了自己的解決方案,如果其他人需要這個鈎子的話。 它肯定會更好,因為我沒有 bash 腳本的經驗,但它實現了防止從禁止分支合並到任何其他分支的目標

#!/bin/bash
FORBIDDEN_BRANCHES=("uat" "support" "develop" "origin/uat" "origin/support" "origin/develop")
FROM_BRANCH="null"

MSG=`cat .git/MERGE_MSG`

[[ $MSG =~ ^'Merge branch '(.*) ]] && FROM_BRANCH=${BASH_REMATCH[1]}

if test $FROM_BRANCH != "null"
then
    FROM_BRANCH=$(echo $FROM_BRANCH | cut -f 1 -d " ")
    eval BRANCH=$FROM_BRANCH
else
    [[ $MSG =~ ^'Merge remote-tracking branch '(.*) ]] && FROM_BRANCH=${BASH_REMATCH[1]}
    FROM_BRANCH=$(echo $FROM_BRANCH | cut -f 1 -d " ")
    eval BRANCH=$FROM_BRANCH
fi

if test $FROM_BRANCH != "null"
then
    for i in ${!FORBIDDEN_BRANCHES[@]}; do
      if test ${FORBIDDEN_BRANCHES[$i]} = $BRANCH
      then
        echo "Merging from $BRANCH is forbidden"
        echo "Reset your branch using \"git reset --merge\""
        exit 1
      fi
    done
else
    "NOT COMITTING: FROM_BRANCH = $FROM_BRANCH"
fi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM