簡體   English   中英

使用bash將master合並到所有原始分支

[英]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_asome_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/}

檢查並丟棄HEADmaster因為您不想對其進行操作:

    case "$name" in
    HEAD|master) continue;;
    esac

(或以相同的if你願意)。

現在,您可以像以前一樣使用git checkout $namegit merge mastergit 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.

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