377

如何分叉公共存储库,但将我的分叉设为私有?我确实订阅了支持私有存储库。

4

7 回答 7

553

答案是正确的,但没有提到如何在公共 repo 和 fork 之间同步代码。

这是完整的工作流程(我们在开源React Native之前已经这样做了):


首先,像其他人所说的那样复制 repo(详情请点击此处):

private-repo通过Github UI创建一个新的 repo(我们称之为) 。然后:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

克隆私人仓库,以便您可以使用它:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

从公共回购中获得新的热点:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

太棒了,您的私人仓库现在拥有来自公共仓库的最新代码以及您的更改。


最后,创建一个 pull request 私有 repo -> public repo:

使用 GitHub UI 创建公共 repo 的 fork(公共 repo 页面右上角的小“Fork”按钮)。然后:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

现在,您可以通过 Github UI 为 public-repo 创建一个拉取请求,如此所述。

一旦项目所有者审查了您的拉取请求,他们就可以合并它。

当然,整个过程可以重复(只需省略添加遥控器的步骤)。

于 2015-05-20T14:17:11.943 回答
136

现在还有一个选择(2015 年 1 月)

  1. 创建一个新的私人仓库
  2. 在空的回购屏幕上有一个“导入”选项/按钮 在此处输入图像描述
  3. 单击它并放置现有的 github repo url 没有提及 github 选项,但它也适用于 github repos。 在此处输入图像描述
  4. 完毕
于 2015-01-28T11:35:52.090 回答
44

当前的答案有点过时了,为了清楚起见:

简短的回答是:

  1. 做一个公共回购的裸克隆
  2. 创建一个新的私人。
  3. 对新的私人镜像推送。

这记录在 GitHub 上:duplicating-a-repository

于 2013-05-14T23:51:43.997 回答
34

你必须复制回购

你可以看到这个文档(来自 github)

要在不分叉的情况下创建存储库的副本,您需要对原始存储库运行特殊的克隆命令并将镜像推送到新存储库。

在以下情况下,您尝试推送到的存储库——例如 exampleuser/new-repository 或 exampleuser/mirrored——应该已经存在于 GitHub 上。有关详细信息,请参阅“创建新存储库”。

镜像存储库

要进行精确复制,您需要同时执行裸克隆和镜像推送。

打开命令行,输入以下命令:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

如果您想在另一个位置镜像存储库,包括从原始位置获取更新,您可以克隆一个镜像并定期推送更改。

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

与裸克隆一样,镜像克隆包括所有远程分支和标签,但每次获取时都会覆盖所有本地引用,因此它始终与原始存储库相同。设置推送的 URL 可以简化推送到您的镜像。要更新您的镜像,获取更新并推送,这可以通过运行 cron 作业来自动化。

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository

于 2012-11-08T07:57:58.140 回答
26

GitHub 现在有一个导入选项,可让您选择您希望新导入的存储库公开或私有的任何内容

Github 存储库导入

于 2019-01-11T01:15:07.713 回答
20

只需转到https://github.com/new/import

GitHub 导入

在“您的旧存储库的克隆 URL”部分中粘贴您想要的存储库 URL,然后在“隐私”中选择Private.

于 2020-09-01T03:01:55.400 回答
6

2021 更新

我是 git 新手,所以想在 eclipse GUI(v2020-12;EGit v5.11)中做尽可能多的事情。详情如下。

--->其他答案中的导入方法仅适用于 Subversion、Mercurial 或 TFS 项目。正如我亲身了解到的,GitHub 不支持 git 项目。它可能有效,但为什么要冒险呢?


存储库和 GitHub 连接

eclipse/org.aspectj原始公共仓库upstream远程获取
cb4/org.aspectj分叉origin远程推送
cb4/remPrivAJ远程私有仓库private远程推送
I:\local本地仓库

对于 github 身份验证,我使用 ssh 和 ed25519 密钥(此 SO 答案中的步骤),因此我的连接 URI 如下所示ssh://git@github.com/<user>/<repo>

符号: -> 是鼠标点击或选择;right-> 是右键单击。


脚步

  1. 在 github 上,将原始公共仓库fork到您的 github 帐户
  2. 在 github 上,创建空的远程私有仓库
  3. 在 eclipse Git Perspective 中,将 fork 克隆到新的本地 repo 并进行配置
  • 3.1-> Clone a Git Repository and add clone to this view -> Clone URI -> Next
    • 3.1.1 根据需要输入 URI、连接和身份验证信息-> Next
    • 3.1.2。选择所需的分支(我只选择了master)-> Next
    • 3.1.3. 输入本地仓库的目标目录
    • 3.1.4。现在导入项目或稍后再做,然后-> Finish填充本地仓库
  • 3.2. 将原始公共 repo 配置为一个新的远程,命名upstream为下拉更新
    • 3.2.1。right-> Remotes -> Create Remote ->并输入姓名upstream
    • 3.2.2. -> Configure fetch -> Create -> Change ->输入原始回购 URI-> Finish
    • 3.2.3。-> Save and Fetch ->所有分支都已下载-> Close
    • 3.2.4。注意:我只想要主分支,所以这样做而不是步骤 3.2.3
    • 3.2.5。-> AdvancedSpecifications to fetch,删除那里的唯一条目
    • 3.2.6。在下Add create/update specification -> Source ref: dropdown并选择master [branch] -> +Add Spec -> Force Update
    • 3.2.7。-> Save specifications in upstream configuration -> Finish -> Save and Fetch ->仅下载 master 分支-> Close

  1. 将远程公共存储库复制到您的远程私有存储库并进行配置。这是eclipse中唯一无法完成的步骤,所以我安装了Git for Windows并使用了GitCMD。

像这样:

git clone --bare git://github.com/eclipse/org.aspectj.git tmpRepo
<if prompted, enter ssh passphrase>
cd tmpRepo    
git push --mirror ssh://git@github.com:cb4/private.git
<if prompted, enter ssh passphrase>
cd ..    
rmdir tmpRepo /s /q

  1. 将远程私有仓库配置为一个新的远程命名private为推送
  • 5.1。right-> Remotes -> Create Remote ->并输入姓名private
  • 5.2. -> Configure push -> Create -> Change ->输入远程私有仓库 URI-> Finish
  • 5.3.-> Advanced -> Add All Branches Spec -> Force Update -> Save specifications in origin configuration -> Finish
  • 5.4. -> Save and Pushmaster 分支被推送-> Close

此时,您已将公共存储库分叉到您的私有存储库中。要查看如何将私有更改推送到您的 fork,然后针对原始公共存储库打开拉取请求,请参阅我的答案。生成的配置如下所示:
配置

于 2021-02-28T07:38:00.197 回答