![](/img/trans.png)
[英]Need assistance with creating a Git client-side 'commit-msg' hook
[英]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.