在Github上更新派生仓库的多个分支

4
我有一个fork了的github仓库(称之为repo-O,我的分支为repo-F),其中包含大约8个分支。其他参与者已经在repo-O上进行了几百次提交,并且在多个repo-O的分支上进行了提交。我现在想将这些更改拉取到我的forked repo(repo-F)中。由于要挑选大约3000个提交,所以我不能使用fork queue,而我更愿意通过命令行来完成此操作。
因此...我克隆了我的repo,将repo-O添加为远程(upstream),并获取了更改,然后合并origin/upstream...然后将更改推送回repo-F。
这似乎已经将更改应用于主分支,但没有应用于任何其他分支...
我该如何重复上述过程,以更新“所有”分支?
谢谢
2个回答

4
你想要实现的是“对于repo-o上的每个远程分支,如果我没有,则创建指向repo-o分支的相同分支,或从repo-o同一分支上拉取本地分支的信息,并在最后将所有这些分支推送到我的repo-f”。假设你的远程仓库名称确实为repo-o和repo-f,那么建议尝试以下代码(使用bash):
for repo_o_branch in \
    $(git branch -a|grep repo-o|perl -nle's,^\s*repo\-o/,,;print $_';
do
    (                                                              \
       ( git checkout $repo_o_branch                               \
         && git pull --rebase repo-o $repo_o_branch)               \
       || ( git checkout -b $repo_o_branch repo-o/$repo_o_branch ) \
    ) && git push repo-f $repo_o_branch;
done

对于所有的“repo o branches”(由git branch -a显示为“ repo-o/branchname”,不包括其中的“空格和'repo-o /'”部分),

  • 尝试检出该分支并在其中执行git pull --rebase repo-o branchname
  • 或者,如果git checkout失败(因为您没有那个分支):检出一个以repo-o的分支名称命名的新分支,并将其指向repo-o的branchname。
  • 如果上述两种任意一种成功,则将新创建或更新的分支名称推送到您的repo-f中。

根据口味调整;最好在新创建的git克隆中尝试,其中添加了远程repo-o,以防万一出现问题;)


非常感谢,这很有道理...我希望有一种方法可以让git自动合并所有分支,但是这个脚本看起来可以解决问题。谢谢。 - mrwooster

1

带有一些合并技巧的awk版本

sync_all_branch () {
  git fetch upstream
  for upstream_branch in   $( git branch -a |awk 'BEGIN {FS="/"} $2=="upstream" {print $3}' ) ;
  do
      if git checkout $upstream_branch
      then
          echo merge $upstream_branch
          git merge -s recursive -Xours upstream/$upstream_branch 
      else
          echo create $upstream_branch
          git checkout -b $upstream_branch upstream/$upstream_branch
      fi
  done
  git checkout master
  git push --all
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接