手动创建一个Git分支。

20

如果我理解分叉的话,它在概念上涉及以下步骤:

  1. 将源代码库镜像克隆到目标仓库
  2. 在目标仓库上设置一个“上游”远程指向源代码库
  3. 其他一些东西,比如邮件订阅等(对于这个问题不重要)

它看起来是这样的:

Original <──upstream─── Forked
(server)               (server)
                           ↑
                           │origin
                           │
                        (local)

与克隆的主要区别在于这些步骤是服务器端的,而不是本地的。如何在Git命令行手动复制这个呢?

我已经完成了以下步骤:

  1. 将源代码库克隆到本地库
  2. 更改"origin"远程指向目标代码库
  3. 添加一个指向源代码库的"upstream"远程

此时,我已经在本地存储库中设置好了一切。我可以使用一个中间本地克隆在原始和分叉的存储库之间同步更改。因此,我的情况如下:

Original                Forked
(server)               (server)
    ↑                      ↑
    │                      │origin
    │                      │
    └───────upstream─── (local)

现在我该如何将这个链接推送到服务器上,即使原始存储库成为服务器端分叉存储库的上游远程,以匹配第一个图表?

请注意,这个问题并不是特定于GitHub的 - 我也可能想用BitBucket做同样的事情。理想情况下,我应该能够在不同的网站上进行此操作。我已经阅读了许多类似的问题,但没有明确的答案。

4个回答

11

您可以使用Bitbucket的API在命令行上fork一个项目,但是您需要至少拥有源项目的读取权限。

语法如下:

curl -v --user {username}:"{password}" \
https://bitbucket.org/api/1.0/repositories/{accountname}/{repo_slug}/fork \
--data "name=mynewrepo"
  • 要将账户 ABC 的项目 projectABC 分叉到你的账户 XYZ 并命名为 ProjectXYZ,请使用以下命令:

  • git clone --bare https://github.com/ABC/projectABC.git
    cd projectABC.git
    git push --mirror https://github.com/XYZ/ProjectXYZ.git
    curl -v --user XYZ:"XYZPASSWORDXYZ" \
    https://bitbucket.org/api/1.0/repositories/ABC/ProjectABC/fork \
    --data "name=ProjectXYZ"
    

    查看 Bitbucket 文档 以获取更多详细信息。

  • 现在在本地机器上克隆此项目,

    git clone your_target_git_repository_path
    
    前往您的项目目录,并添加远程upstream,它将指向源存储库。
  • git remote add upstream source_git_repository_path
    
  • 现在,要从源代码库(例如主分支)中随时拉取更改,请使用以下命令:

  • git pull upstream master
    

    要将本地提交推送到服务器上的目标存储库,请使用:git push origin master

  • 当您在目标存储库上的更改准备好与源存储库合并时,请从Bitbucket网站或使用Bitbucket API: Pull Request创建一个拉取请求。


  • 有没有一种跨站点的方法,比如将 Bitbucket 存储库分叉到 GitHub? - metacubed
    请查看Forking from GitHub to Bitbucket,但相反我也在github gist上找到了一个不错的教程。 - Nikhil Supekar
    这些都是基于本地的方法 - 同步是使用中间本地克隆完成的,就像我第二张图所示。我正在寻找一个服务器端的解决方案。 - metacubed
    2
    正如您所知,分支是由Github或Bitbucket数据库在其自己的服务器上跟踪的。因此,如果您将存储库从一个服务器克隆到另一个服务器,则不会被视为分支。 - Nikhil Supekar

    5

    对于GitHub而言,显然你现在可以使用hub CLI命令hub fork来实现此功能。虽然我没有使用过它,但根据文档,你需要这样做:

    git clone git@github.com:some_user_or_organization/some_project.git
    cd some_project
    hub fork
    

    ...然后您将会得到两个远程仓库:origin 指向上游仓库,另一个与您的 GitHub 用户名相同指向您的新分支。(如果 hub 也能将远程仓库名称分别改为 "upstream" 和 "origin" 就更好了,但我认为它没有这样做。)


    1
    当您推送到您的分支时,请尝试使用此选项:--mirror。

    https://git-scm.com/docs/git-push#git-push---mirror

    这可能意味着您需要在克隆时指定--mirror选项,以便将远程分支获取到本地仓库。或者,您可以在您的仓库中包含一个远程设置脚本,并在项目的开发人员设置手册中引用它。

    0

    创建本地副本指向最终派生存储库的步骤如您所述。

    下一步是创建派生存储库。可以使用命令行以Github API的方式完成,而不是使用git;有关更多信息,请参见https://dev59.com/k3E95IYBdhLWcg3wKq2q#2425632

    之后,只需进行简单的git push origin master即可完成手动派生。

    注意:Bitbucket也提供了一个REST API,可以通过命令行创建派生存储库。


    有没有一种跨站点的方法,比如将 Bitbucket 存储库分叉到 GitHub? - metacubed

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