15

我想将我的远程 git 存储库及其所有分支移动到新的远程存储库。

旧遥控器 =git@github.com:thunderrabbit/thunderrabbit.github.com.git

新遥控器 =git@newhub.example.net:tr/tr.newrepo.git

4

4 回答 4

12

在本地机器上的终端中:

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
于 2013-01-21T03:43:05.380 回答
8

因此,这些其他答案都没有很好地解释的是,如果您想使用 Git 的push 机制将所有远程存储库的分支移动到新的远程,那么您需要每个远程分支的本地分支版本。

您可以使用git branch创建本地分支。这将在您的目录下创建一个分支引用.git/refs/heads/,所有本地分支引用都存储在其中。

然后您可以使用git pushand--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/headsand .git/refs/tags,这可能不是您想要推送到远程的内容。

例如,--mirror可以从位于 下的旧遥控器.git/refs/remotes/<remote>/以及其他引用(例如)推送远程跟踪分支.git/refs/original/,这是git filter-branch.

于 2014-04-27T19:20:39.360 回答
4

整个想法是为每个旧的远程分支做:

  • 查看
  • 推送到新的遥控器(不要忘记标签!)

像那样:

#!/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
于 2013-01-21T04:08:51.893 回答
1

您可以简单地更改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
于 2013-01-21T09:23:48.767 回答