2013-01-21 161 views
9

我想將我的遠程git存儲庫及其所有分支移動到新的遠程存儲庫。如何將我的遠程git倉庫移動到另一個遠程git倉庫?

老遠程= [email protected]:thunderrabbit/thunderrabbit.github.com.git

新的遠程= [email protected]:tr/tr.newrepo.git

+0

我知道這是一個自我回答的問題,但問題本身質量仍然很低。也許嘗試添加一些您嘗試過的想法或在您提出[您的答案](http://stackoverflow.com/a/14432237/456814)之前查看過的文檔。 – 2014-04-27 18:18:25

+0

僅供參考,[umläute的回答](http://stackoverflow.com/a/14435630/456814)不完全正確,請參閱[我的評論](http://stackoverflow.com/questions/14432234/how-do-我 - 移動 - 我 - 遠程混帳回購到另一個遠程-混帳回購#comment35718703_14435630)。 – 2014-04-27 18:59:21

回答

5

所以這些其他答案都沒有解釋得太好,如果你想 移動你所有的遠程倉庫的br使用Git的push 機制,,然後您需要您的每個遠程的 分支機構的本地分支版本。

您可以使用git branch創建本地分支。這將在您的.git/refs/heads/目錄下創建分支 參考,其中存儲了所有本地 分支參考。

然後你可以使用git push--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 documentation

--all 

命名每個裁判推相反的,指定 refs/heads/下的所有裁判推。

--tags 

refs/tags下,所有的裁判都推,除了refspecs在命令行中明確列出 。

--mirror

還要注意--mirror可用於在 推一旦兩個分支或標籤引用,但有這個標誌的問題是,它推動在 .git/refs/,不所有引用只是.git/refs/heads.git/refs/tags,這可能不是 你想推送到你的遠程。

例如,--mirror可以從舊 遠程(一個或多個),它們.git/refs/remotes/<remote>/下,以及其它參考文獻 諸如.git/refs/original/,這是git filter-branch副產品推遠程跟蹤分支。

9

在本地計算機上的終端:

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 
+0

最後一行(git push --all gitlab)是否是一個錯字?它不應該是新的起源,而不是gitlab? –

+0

啊,是的,看起來像。謝謝! –

+1

僅供參考,如果您想推送標籤,那麼您還需要使用'git push --tags'(它不能與'--all'同時使用)。另外,不要使用'git checkout',你也可以使用'git branch',這可能會更快,因爲你不會在工作副本中切換文件。 – 2014-04-27 19:02:16

3

整個想法是每個老遠程分支的更多信息:

  • 結帳
  • 推到新的遠程(不要忘了標籤!)

就像是:

#!/bin/bash 

[email protected]:tr/tr.newrepo.git 
new_remote=new_remote 
[email protected]: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 
0

您可以簡單地改變URL爲您origin庫:

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 
+0

這是不正確的,如果您沒有每個遠程分支的本地分支版本,那麼它們將不會被推送到新的遠程。只有'.git/refs/heads /'下的本地分支纔會被推送。 – 2014-04-27 18:52:28