执行多个git命令

时间:2019-09-06 19:56:30

标签: git git-merge

在我当前的项目中,我们有一个要求,我们必须从特定于发行版的分支(release-0815)进行反向合并,以在每个产品部署后发布。

这需要在具有release-0815分支的多个存储库中完成。目前,我要做的是进入每个存储库并逐个执行以下命令:

git checkout release
git merge release-0815 --no-ff --no-edit
git push origin release

是否有一种方法可以遍历存储库列表并将上述命令作为单个命令执行?

5 个答案:

答案 0 :(得分:2)

  

是否可以循环浏览存储库列表并以单个命令的形式执行以上命令?

您将需要一个脚本来循环遍历可以用任何语言编写的多个存储库。

您的脚本可以是sh,bash,python等

要执行多个git命令,请使用&&运算符

git checkout release && git merge release-0815 --no-ff --no-edit && git push origin release

但是由于您正在进行基础调整和合并,因此不建议在出现冲突的情况下使用

示例脚本

for path in `<repositores list>`; 
    do 
        cd $path; git checkout release && git merge release-0815 --no-ff --no-edit && git push origin release 
done

答案 1 :(得分:1)

要将以上命令作为单个命令执行,如果您使用的是Linux或使用Git Bash,则可以在每个命令之间放置&&

git checkout release && git merge release-0815 --no-ff --no-edit && git push origin release

如果任何命令失败,所有执行将停止。

要遍历多个存储库,可以编写一个bash脚本。

答案 2 :(得分:0)

我不确定循环,但是有一种加入git命令的方法: 或包装到sh脚本中并执行任何操作。

git checkout release && git merge release-0815 --no-ff --no-edit && git push origin release

答案 3 :(得分:0)

假设您的仓库清单位于repos.txt中:

~/repo1
~/repo2
~/repo3

遍历所有存储库

  

有没有办法遍历存储库列表...

bash中的循环存储库

cat $repo_list| while read repo; do
 <your command>
done

作为单个命令执行

  

...并将上述命令作为一个命令执行?

git checkout release && git merge release-0815 --no-ff --no-edit && git push origin release

检查回购是否具有特定分支

  

这需要在具有release-0815分支的多个存储库中完成。

git branch -a | grep 'release-0815' && <foo>

让我们放在一起

release_name='release-0815'
cat $repo_list | while read repo; do
 git branch -a | grep $release_name && git checkout release && git merge $release_name --no-ff --no-edit && git push origin 
done

答案 4 :(得分:0)

如果所有存储库都在同一个目录中,那么就说:

projects/repo1
projects/repo2
projects/repo3

有时候,我发现使用find命令比较方便,例如,更新所有存储库时,我会做类似的事情:

$ cd projects

然后:

$ find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull \;

现在,如果我想在每个项目中运行更多命令,则可以多次使用选项-exec,例如:

$ find . -type d -depth 1 \
-exec git --git-dir={}/.git --work-tree=$PWD/{} pull \; \
-exec git --git-dir={}/.git --work-tree=$PWD/{} remote -v \;

您的情况可能类似于:

$ find . -type d -depth 1 \
-exec git --git-dir={}/.git --work-tree=$PWD/{} checkout release \; \
-exec git --git-dir={}/.git --work-tree=$PWD/{} merge release-0815 --no-ff --no-edit \; \
-exec git --git-dir={}/.git --work-tree=$PWD/{} push origin release \;

请注意,在这种情况下,只有第一个命令成功返回时,第二条命令才会运行。