我有两个遥控器:上游和原点。上游是我无法推动的。起源是我自己的回购。如何从上游获取所有分支然后将它们推送到原点? 我试过了:
git fetch upstream
git push --all origin
但它不起作用。
答案 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上执行的示例:
结果:25个分支被推送到gitlab
请注意,并非所有分支机构都需要git checkout,对于裸仓库也毫无意义。
答案 4 :(得分:1)
UI 方法:
您也可以通过 Github.com 的用户界面执行此操作 - Private 和 Public Repos 均可使用。
BAM - 大功告成。就我个人而言,我只是使用 CLI + Mirror,具有讽刺意味的是,这是这里接受的答案,但前几天我的团队中的一位开发人员向我询问了这个问题,并认为有替代方案会有所帮助。
答案 5 :(得分:0)
当您git push <REMOTE> --all
或git push <REMOTE> --tags
时,所有分支和标签将从您的本地历史记录推送到REMOTE中。这样,如果您要将push
的所有分支和标签从一个远程站点(即起源)(不仅是本地历史记录)转移到另一个远程站点(即上游), em>)执行以下过程:
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>
push
移至新的遥控器:
git push --all upstream
git push --tags upstream
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/*
这假设您已经创建了目标存储库。