使用bash将master合并到所有原始分支

时间:2018-03-26 12:42:19

标签: bash git shell

我正在寻找shell / bash脚本来执行以下Git命令:

  • 对于远程的每个分支:
    • 合并origin / master

我能够使用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输出

  

origin / HEAD - > origin / master

     

origin / master

     

起源/ 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

注意:假设不会发生冲突。

1 个答案:

答案 0 :(得分:0)

您的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

注意:以上都是未经测试的。

相关问题