[英]Merging master into all origin branches using bash
我正在尋找一個shell / bash腳本來執行以下Git命令:
我能夠使用Python做到這一點:
tmp_folder = "tmp-clone"
if os.path.exists(tmp_folder):
shutil.rmtree(tmp_folder)
g = git.Git()
g.execute(["git", "clone", "...", tmp_folder])
g = git.Git("tmp-clone")
branches = g.execute(["git", "branch", "-r"])
matches = [item for item in re.findall(r"origin/([\w-]+)", branches) if item not in ("HEAD", "master")]
for branch in matches:
print("merge master -> %s" % branch)
g.execute(["git", "checkout", branch])
g.execute(["git", "merge", "master"])
g.execute(["git", "push"])
但我希望在沒有Python的情況下執行此操作。 任何人? 我最初的猜測是做類似的事情
for BRANCH in $(git branch -r); (...); done
但是, git branch -r
輸出
原點/頭->原點/主
起源/主人
起源/ some_branch_a
起源/ some_branch_b
並且(在此示例中)我只對some_branch_a
和some_branch_b
(因此在我的Python中使用正則表達式)感興趣,因此在bash腳本中我還需要某種正則表達式。 但是,我的bash腳本編寫技能非常有限:
for BRANCH in $(git branch -r);
if $BRANCH matches "origin/([\w-]+)" ???
git checkout $BRANCH;
git merge origin/master;
git push $BRANCH;
fi
done
注意:假設不會發生沖突。
您的Python代碼不執行您的文本描述所建議的。 以下內容基於代碼,而非說明。
使用git for-each-ref
,它在命名空間的某些部分中找到引用。 這里的命名空間是refs/remotes/origin
:
git for-each-ref --format='%(refname:short)' refs/remotes/origin |
while read refname; do
...
done
去除origin/
:
name=${refname#origin/}
檢查並丟棄HEAD
和master
因為您不想對其進行操作:
case "$name" in
HEAD|master) continue;;
esac
(或以相同的if
你願意)。
現在,您可以像以前一樣使用git checkout $name
, git merge master
和git push
了。 請注意,對每個名稱進行一次最終的git push
效率更高,但這有點復雜。
要檢查您的腳本是否真的准備就緒,請在執行任何操作之前使其回顯應執行的命令:
git for-each-ref --format='%(refname:short)' refs/remotes/origin |
while read refname; do
name=${refname#origin/}
case "$name" in
HEAD|master) continue;;
esac
echo git checkout $name
echo git merge master
echo git push $name
done
注意:以上均未經測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.