我想将我的远程 git 存储库及其所有分支移动到新的远程存储库。
旧遥控器 =git@github.com:thunderrabbit/thunderrabbit.github.com.git
新遥控器 =git@newhub.example.net:tr/tr.newrepo.git
我想将我的远程 git 存储库及其所有分支移动到新的远程存储库。
旧遥控器 =git@github.com:thunderrabbit/thunderrabbit.github.com.git
新遥控器 =git@newhub.example.net:tr/tr.newrepo.git
在本地机器上的终端中:
cd ~
git clone <old-remote> unique_local_name
cd unique_local_name
for remote in `git branch -r | grep -v master `; \
do git checkout --track $remote ; done
git remote add neworigin <new-remote>
git push --all neworigin
因此,这些其他答案都没有很好地解释的是,如果您想使用 Git 的push
机制将所有远程存储库的分支移动到新的远程,那么您需要每个远程分支的本地分支版本。
您可以使用git branch
创建本地分支。这将在您的目录下创建一个分支引用.git/refs/heads/
,所有本地分支引用都存储在其中。
然后您可以使用git push
and--all
选项--tags
标志:
git push <new-remote> --all # Push all branches under .git/refs/heads
git push <new-remote> --tags # Push all tags under .git/refs/tags
注意--all
和--tags
不能一起使用,所以你必须推两次。
这是相关git push
文档:
--all
不是命名要推送的每个 ref,而是指定推送下的所有 ref
refs/heads/
。--tags
refs/tags
除了在命令行上明确列出的 refspecs 之外,所有的 refs 都会被推送。
--mirror
另请注意,它--mirror
可用于同时推送分支和标记引用,但此标志的问题在于它将所有引用推送到中
.git/refs/
,而不仅仅是.git/refs/heads
and .git/refs/tags
,这可能不是您想要推送到远程的内容。
例如,--mirror
可以从位于 下的旧遥控器.git/refs/remotes/<remote>/
以及其他引用(例如)推送远程跟踪分支.git/refs/original/
,这是git filter-branch
.
整个想法是为每个旧的远程分支做:
像那样:
#!/bin/bash
new_remote_link=git@newhub.example.net:tr/tr.newrepo.git
new_remote=new_remote
old_remote_link=git@github.com:thunderrabbit/thunderrabbit.github.com.git
old_remote=origin
git remote add ${old_remote} ${old_remote_link}
git pull ${old_remote}
BRANCHES=`git ls-remote --heads ${old_remote} | sed 's?.*refs/heads/??'`
git remote add ${new_remote} ${new_remote_link}
for branch in ${BRANCHES}; do
git checkout ${branch}
git pull ${old_remote} ${branch}
git push ${new_remote} ${branch} --tags
printf "\nlatest %s commit\n" ${branch}
git log --pretty=format:"(%cr) %h: %s%n%n" -n1
done
您可以简单地更改origin
存储库的 URL:
git clone <old-remote-url> unique_local_name
cd unique_local_name
git pull --all
git remote set-url origin <new-remote-url>
git push --all