从GitHub分叉到Bitbucket

180

我正在基于 CakePHP 的项目上工作,该项目托管在 GitHub 上。而我的项目则托管在 Bitbucket 上。两者都使用 git。基本上我想创建一个“分支”(我不知道是否使用了正确的术语,因为我对 git 很陌生),将 CakePHP 分支到我的 Bitbucket 存储库中,以便能够在不需要下载所有 CakePHP zip/tar 文件并替换文件夹的情况下获取更新,然后提交和推送,但也许需要进行“合并”(?)。


5
参见 https://dev59.com/DHI-5IYBdhLWcg3whYwr,了解如何处理这种工作流的好方法。 - Dolbz
6个回答

152
目前无法在不同的网站之间发送“拉取请求”。我已在Bitbucket问题跟踪器中添加了一个功能请求:#3288。如果您想跟踪此问题,建议您将自己添加为追随者。
但是,您仍然可以将源代码从GitHub移动到Bitbucket,而无需下载任何zip文件或tarballs。您可以从GitHub进行克隆并推送到Bitbucket:
$ git clone https://github.com/cakephp/cakephp
$ cd cakephp
$ git push git@bitbucket.org:mg/cakephp.git master

我先在Bitbucket中创建了一个空的Git存储库mg/cakephp,这样你就可以将GitHub上的更改推送/拉取到Bitbucket上。


3
那么我们怎样才能从上游拉取? - Ruchir Shukla
1
@RuchirShukla:基本上是一样的。您需要通过从上游拉取提交来在自己的机器上移动它们。然后将其推送到另一个托管站点,从而使两者同步。 - Martin Geisler
4
对我来说,这个方法很好用,但在这两个命令之间我需要先执行 cd cakephp。对于有经验的人来说这很显然,但是对于新手来说可能会想知道为什么它不起作用。 - aaronbartell
你能制作一个YouTube视频来演示吗?我无法复制它。我能够按照这些说明操作,但是当我推送并提交时,它仍然试图将其推送到主分支而不是派生分支。 - Wax
这不适用于“fork”。分支和标签不会被复制到BitBucket。 - Joel Karunungan
在一个没有任何重要内容需要覆盖的新存储库上,您可能想在主分支后面添加 --force,例如 "git push https:// user-name@bitbucket.org/user-name/repo-name.git master --force"。这可能会引起问题,但可以避免在初始提交时被拒绝。 - Alexandre Jean

98
以下工作流程将github仓库添加为名为sync的新远程仓库,并将bitbucket远程仓库添加为origin。它还添加了一个名为github的分支来跟踪github仓库,以及一个名为master的分支来跟踪bitbucket仓库。它假设您有一个名为“myrepository”的空的bitbucket仓库。

设置远程仓库

# setup local repo
mkdir myrepository
cd myrepository
git init

# add  bitbucket remote as "origin"
git remote add origin ssh://git@bitbucket.org/aleemb/myrepository.git

# add github remote as "sync"
git remote add sync https://github.com/aleemb/laravel.git

# verify remotes
git remote -v
# should show fetch/push for "origin" and "sync" remotes

设置分支

# first pull from github using the "sync" remote
git pull sync

# setup local "github" branch to track "sync" remote's "master" branch
git branch --track github sync/master

# switch to the new branch
git checkout github

# create new master branched out of github branch
git checkout -b master

# push local "master" branch to "origin" remote (bitbucket)
git push -u origin master

现在,你应该有本地的 github 分支跟踪 github 仓库的 master 分支。同时,你应该有本地的 master 分支跟踪 bitbucket 仓库(默认为 master 分支)。
这样做可以轻松地对 github 分支进行拉取,然后将这些更改合并到 master 分支上(优先使用变基而非合并),最后你可以推送 master 分支(将其推送到 bitbucket)。

这似乎不起作用,但这是一个好主意。有什么方法可以修复它使其工作? - bozdoz
这个很好用,但是缺少一步。在“设置分支”部分的开始之前,您必须先创建“github”分支以拉取“sync”远程分支。 - Timee
1
在Git 2.2.1中,“--set-upstream”已被弃用...但只要在尝试设置上游存储库之前创建“github”分支,它仍然有效。 - Ken Prince
4
不要使用--set-upstream,而是执行以下操作:git fetchgit branch --track github sync/master - Beaudinn Greve
3
我认为缺少的是在执行git branch命令后,需要添加git checkout githubgit checkout -b master。这样你就会得到这些分支(git branch -a):github、master、remotes/origin/master、remotes/sync/master。 - Klemens Zleptnig
显示剩余6条评论

39
如果你想保持你的仓库最新,请使用两个远程仓库:Github(upstream)和Bitbucket(origin),像这样:
# Clone original CakePHP source code from Github
git clone --mirror https://github.com/cakephp/cakephp
cd cakephp
# Rename remote from `origin` to `upstream`
git remote rename origin upstream
# Add your Bitbucket repo (this is where your code will be pushed)
git remote add origin https://bitbucket/your/repo.git
# Push everything to Bitbucket
git push --mirror origin
从 Github 获取 CakePHP 的更新:
git pull upstream master
将您的代码更改推送到Bitbucket:

要将您的代码更改推送到Bitbucket:

git push origin master

我想你在第一个 git 命令中的意思是 git clone https://mybitibucket/cakephp/cakephp,对吧?这是正确的做法... - ribamar
@JoelKarunungan 很好的建议!我认为这应该可以将所有东西(包括分支和标签)推送到远程仓库:git push --all --mirror origin。已更新答案。 - Zubin
@Zubin 你试过这个吗? 致命错误:--all 和 --mirror 不兼容另外: git pull upstream master 会抛出一个致命错误。 致命错误:找不到远程引用master - Joel Karunungan
@JoelKarunungan 抱歉,我没有意识到它们不能一起使用。看起来最好在最初的上游克隆和第一次推送到Bitbucket时使用--mirror标签。回答已更新。 - Zubin
@Zubin 这个问题与本主题无关。如果我将一个 Git 仓库 fork 到 Bitbucket,那么我能否将 cakephp 添加为子模块? - DavidKanes
显示剩余2条评论

14
在 BitBucket 中创建新存储库时,点击右上方的“导入存储库”按钮。在 Github 中,单击要 fork 的存储库下方的“克隆或下载”按钮后,输入所找到的 https url。
给你的存储库命名,配置你的隐私设置,然后就可以开始了!

3
那是克隆,不是分支,它们是不同的东西。 - entropid
7
目前在Bitbucket上,这个功能被标记为“导入仓库”。 - Wild Pottok
1
@entropid,fork 是原始代码库的克隆。在 Git 的世界中,Forking 等同于 cloning。 - enorl76
2
@enorl76 对于一般使用来说并不是特别重要。 - Rig
4
@enorl76 是的,从技术上讲它是。但是分叉是一种保持克隆与原始仓库“连接”的方式,以便从中获取更新并最终将其推送上去。这就是“origin”和“upstream”链接组合发挥基础作用的地方。Github 和 Bitbucket 围绕 upstream 构建了一整套工具,使分叉更加高效和友好,例如“推送请求”等功能 :) - Dan Niero

4
自从 @Martin Geisler 的回答后,我注意到 Bitbucket 已启用了从 github.com 导入存储库的功能
成功地将来自 github.com 的私人 repo 导入到 bitbucket.org 的私人 repo 中。以下是步骤
  1. 点击“Create”按钮并选择“Repository('+' > Repository)”。
  2. 现在,不要创建新存储库,而是从弹出框的右上角选择导入存储库
  3. 在导入存储库的新弹出框中填写您的 github repo URL 和身份验证凭据。
  4. 完成了。一切都可以顺利地从 github 导入到 bitbucket。

{{link1:请注意截图右上角的导入存储库链接}}


-1

我猜你只是想轻松地下载包含你的项目的存储库...并且你不会为cakePHP做出贡献,对吗?

如果是这样,你只需要向你的repo添加一个外部引用。

GIT中等效的SVN:externals是什么?

稍后,即使你想为cakePHP做出贡献,你也可以在原始repo上轻松地完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接