git将所有分支从一个远程推送到另一个远程

时间:2016-06-17 15:04:14

标签: git github

我有两个遥控器:上游和原点。上游是我无法推动的。起源是我自己的回购。如何从上游获取所有分支然后将它们推送到原点? 我试过了:

git fetch upstream
git push --all origin

但它不起作用。

7 个答案:

答案 0 :(得分:19)

您可能想尝试使用/* Define all types here */ #define SPLIT_int int COMMA #define SPLIT_char char COMMA #define SPLIT_float float COMMA #define SPLIT_double double COMMA #define FIRST_(a, ...) a #define SECOND_(a, b, ...) b #define FIRST(...) FIRST_(__VA_ARGS__,) #define SECOND(...) SECOND_(__VA_ARGS__,) #define EMPTY() #define EVAL(...) EVAL1024(__VA_ARGS__) #define EVAL1024(...) EVAL512(EVAL512(__VA_ARGS__)) #define EVAL512(...) EVAL256(EVAL256(__VA_ARGS__)) #define EVAL256(...) EVAL128(EVAL128(__VA_ARGS__)) #define EVAL128(...) EVAL64(EVAL64(__VA_ARGS__)) #define EVAL64(...) EVAL32(EVAL32(__VA_ARGS__)) #define EVAL32(...) EVAL16(EVAL16(__VA_ARGS__)) #define EVAL16(...) EVAL8(EVAL8(__VA_ARGS__)) #define EVAL8(...) EVAL4(EVAL4(__VA_ARGS__)) #define EVAL4(...) EVAL2(EVAL2(__VA_ARGS__)) #define EVAL2(...) EVAL1(EVAL1(__VA_ARGS__)) #define EVAL1(...) __VA_ARGS__ #define DEFER1(m) m EMPTY() #define DEFER2(m) m EMPTY EMPTY()() #define DEFER3(m) m EMPTY EMPTY EMPTY()()() #define DEFER4(m) m EMPTY EMPTY EMPTY EMPTY()()()() #define IS_PROBE(...) SECOND(__VA_ARGS__, 0) #define PROBE() ~, 1 #define CAT(a,b) a ## b #define NOT(x) IS_PROBE(CAT(_NOT_, x)) #define _NOT_0 PROBE() #define BOOL(x) NOT(NOT(x)) #define IF_ELSE(condition) _IF_ELSE(BOOL(condition)) #define _IF_ELSE(condition) CAT(_IF_, condition) #define _IF_1(...) __VA_ARGS__ _IF_1_ELSE #define _IF_0(...) _IF_0_ELSE #define _IF_1_ELSE(...) #define _IF_0_ELSE(...) __VA_ARGS__ #define HAS_ARGS(...) BOOL(FIRST(_END_OF_ARGUMENTS_ __VA_ARGS__)()) #define _END_OF_ARGUMENTS_() 0 #define MAP(m, first, ...) \ m(first) \ IF_ELSE(HAS_ARGS(__VA_ARGS__))( \ COMMA DEFER2(_MAP)()(m, __VA_ARGS__) \ )( \ /* Do nothing, just terminate */ \ ) #define _MAP() MAP #define COMMA , #define CALL(A,B) A B #define SPLIT(D) EVAL1(CAT(SPLIT_, D)) #define TYPE_NAME(D) CALL(SECOND,(SPLIT(D))) 选项克隆您的上游回购,然后使用--mirror选项推送到您的新远程

您将拥有以下流程:

--mirror

答案 1 :(得分:17)

我只需要将一个存储库从Bitbucket复制到GitHub,这些步骤假设您的远程对象称为源,所有分支和标签都将被复制:

git remote add neworigin url-to-new-remote
git push neworigin --tags refs/remotes/origin/*:refs/heads/*

这样做的好处是,您的工作副本中的文件不会被修改。

答案 2 :(得分:2)

希望这会有所帮助:

git remote add your-new-origin url-to-repo/repo.git
git push --all your-new-origin //pushes all branches
git push --tags your-new-origin //pushes all tags

答案 3 :(得分:1)

从一个(裸)存储库克隆到另一个(裸)存储库并采用所有分支(不仅是已签出的分支)的一个完整答案是克隆一个本地裸存储库作为中介。然后将所有分支作为克隆的一部分拉出,并进行git push --all将全部推入。从github到gitlab在Windows上执行的示例:

  1. git clone --bare git@github.com:robe070 / cookbooks.git
  2. cd cookbooks.git
  3. git远程添加gitlab git@gitlab.com:robe071 / cookbookstest2.git
  4. git push --force --all gitlab
  5. git push --force-标记gitlab

结果:25个分支被推送到gitlab

请注意,并非所有分支机构都需要git checkout,对于裸仓库也毫无意义。

答案 4 :(得分:1)

UI 方法:
您也可以通过 Github.com 的用户界面执行此操作 - Private 和 Public Repos 均可使用。

  1. 在您的组织中在 github.com 上创建一个新的存储库 - 单击绿色的“创建存储库”按钮 Create new Repo Screen

  2. 在下一个屏幕上,列出的最后一个选项允许您将旧存储库克隆到 Github。 (参见蓝色突出显示) Select Repository Source

  3. 接下来输入您的旧 bitbucket 存储库网址,如下所示。
    (是的,私人仓库很好 - 继续阅读 - 下一步是 auth :p) Old repo url in bitbucket

  4. 最后,它会询问您的登录凭据,输入它们并去煮些咖啡。老实说不会花很长时间。 Who might you be sir?

BAM - 大功告成。就我个人而言,我只是使用 CLI + Mirror,具有讽刺意味的是,这是这里接受的答案,但前几天我的团队中的一位开发人员向我询问了这个问题,并认为有替代方案会有所帮助。

答案 5 :(得分:0)

当您git push <REMOTE> --allgit push <REMOTE> --tags时,所有分支和标签将从您的本地历史记录推送到REMOTE中。这样,如果您要将push的所有分支和标签从一个远程站点(即起源)(不仅是本地历史记录)转移到另一个远程站点(即上游), em>)执行以下过程:

  1. 从原点接收所有分支和标签,并使用原点远程删除本地历史记录中不匹配的分支:
    • git fetch --prune
      
    • git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
      
    • git fetch --all
      
  2. 添加新的远程URL:
    • git remote add upstream <the-url-path-of-a-remote.git>
      
  3. 现在,您的本地已同步。接下来,您可以将所有分支和标签push移至新的遥控器:
    • git push --all upstream
      git push --tags upstream
      

TL; DR

git fetch --prune
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git remote add upstream <the-url-path-of-a-remote.git>
git push --all upstream
git push --tags upstream

答案 6 :(得分:0)

您可以将以下命令作为 bash 脚本运行,第一个输入是您现有的源代码库,第二个输入是您的目标代码库。

mkdir migrate
git clone $1 migrate
cd migrate
git fetch origin
git remote add new-origin $2
git push -u new-origin --all
git push new-origin --tags
git remote set-head origin -d
git push new-origin refs/remotes/origin/*:refs/heads/*

这假设您已经创建了目标存储库。