迭代地将一个远程仓库的所有分支推送到另一个远程仓库中。

3

我有一个使用案例,我们正在为一个项目从一个远程位置迁移到另一个远程位置。

legacy_remote:目前存在的远程位置。 new_remote:所有数据都必须从旧远程位置推送到新远程位置。

我正在使用以下命令。

git remote set-url origin <legacy_remote>
git checkout master
git pull
git remote set-url origin <new_remote>
git push --force -u origin --all 
git push origin --tags 

使用force关键字的原因是,每次合并时我不想在新远程库中解决冲突,而是替换其中的内容,因为它到目前为止还没有被使用。
发生的问题是以下命令:
git push --force -u origin --all 

这个命令只同步主分支,但没有将所有分支从旧的远程库移动到新的远程库。 有人能告诉我这个命令缺少了什么吗?

如果新的远程仓库目前并未使用,仅用于当前仓库的镜像,那么你不能使用 --mirror 选项来进行推送吗? - Lasse V. Karlsen
不使用镜像的原因是在新的远程仓库上创建了几个不想被覆盖的新分支。 - Scientist
2个回答

3

不使用镜像的原因是在新的远程仓库上创建了几个不想被覆盖的新分支。

然后尝试:

git push newremote --tags refs/remotes/origin/*:refs/heads/*

git push --force -u origin --all 相比,如此处所述,分支不必先检出。

0
除了 VonC的答案,你还可以这样做:
git push newremote localname1:remotename1 localname2:remotename2 ...

...替换为更多的localname:remotename对,如有需要。每个本地名称可以是分支或远程跟踪名称:refs/heads/branchrefs/remotes/origin/name,每个远程名称通常应该是您想在远程创建或更新的分支名称。总的来说,完全拼写出来,例如refs/heads/somebranch,这是一个好主意;只有当Git不会为您执行此操作时,才真正需要它,但很难预先知道Git何时会为您执行此操作,因此最好直接进行操作。

您可以根据需要使用--force或不使用。

在shell脚本中,您可以构建要推送的名称集:

names=
# use some local branch names
for b in br1 br2 br3; do
    names="$names refs/heads/$b:refs/heads/$b"
done
# and some remote-tracking names
for r in br3 br4 br5; do
    names="$names refs/remotes/origin/$r:refs/heads/$r"
done

# show what we would run
echo git push --force origin $names

运行脚本,调整直到您拥有正确的名称集,然后删除echo并最后再次运行。

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