完全分叉git repo?

时间:2012-07-16 08:56:49

标签: git

我还没有完全从这里的大量答案和博客文章中把我想知道的东西拼凑起来,所以我问这个问题:

我如何分叉git repo以便获得所有分支&上游的标签?

我尝试的是:

git init
git remote add origin <ORIGIN_URL> # i.e. my repo
git remote add upstream <UPSTREAM_URL> # i.e. the repo I want to fork
git fetch upstream
git push --all origin

但是当我希望它工作时,最后一行失败了。我明白了:

$ git push --all origin
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to <ORIGIN_URL>

有什么想法吗?

编辑:

也许你可以把这个问题想象成“当你点击fork按钮时GitHub实际上做了什么?”,因为那是我试图复制的行为。

2 个答案:

答案 0 :(得分:4)

试镜子:

git clone --mirror

这样,创建了远程(名为origin)而没有分支的命名空间。 IOW,镜像中的refs / heads / master完全对应(并绑定)原始存储库中的refs / heads / master。

现在只使用此存储库而不是原始上游存储库。如果您想更新镜像,请在其中执行以下操作:

cd upstream-mirror.git && git --bare fetch upstream

警告:如果您进入镜像,修改上游分支,上游仓库和镜像将发散。并且推送(没有-f选项)将失败,以防止这种情况。

镜像实际上是上游回购的精确镜像,您作为其所有者可以选择修改它。

答案 1 :(得分:1)

这就是我想出的最好的方式来做我想做的事情似乎有效并且得到与GitHub相似的行为:

git clone --mirror <UPSTREAM> myrepo
cd myrepo
git remote rename origin upstream
git remote add origin <MY_ORIGIN>
git push --all
git push --tags

然后调整.git/config以将upstream遥控器更改为不再镜像,因为这肯定不是我现在想要的。