GitHub:如何将公共存储库的分支私有化?

时间:2012-04-08 19:00:50

标签: github

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

7 个答案:

答案 0 :(得分:339)

答案是正确的,但没有提及如何在公共仓库和分支机构之间同步代码。

以下是完整的工作流程(我们在开源React Native之前已完成此操作):

首先,像其他人所说的那样复制回购(详情here):

通过Github UI创建一个新的回购(让我们称之为private-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

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

最后,创建一个拉取请求私人仓库 - >公共回购:

创建拉取请求的唯一方法是对公共仓库进行推送访问。这是因为您需要推送到那里的分支(here's why)。

git clone https://github.com/exampleuser/public-repo.git
cd public-repo
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创建一个拉取请求,如here所述。

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

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

答案 1 :(得分:90)

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

  1. 创建新的私人仓库
  2. 在空的回购屏幕上有一个" import"选项/按钮 enter image description here
  3. 点击它并放入现有的github repo url 没有提到github选项,但它也适用于github repos。 enter image description here
  4. DONE

答案 2 :(得分:35)

目前的答案有点过时,所以为了清晰起见:

简短的回答是:

  1. 执行公开回购的裸克隆
  2. 创建一个新的私人。
  3. 执行镜像推送到新的私有。
  4. GitHub上记录了这一点:duplicating-a-repository

答案 3 :(得分:24)

您必须复制仓库

你可以看到这个doc(来自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

答案 4 :(得分:8)

GitHub现在提供了一个导入选项,您可以选择想要新导入的公共存储库还是私有存储库

Github Repository import

答案 5 :(得分:5)

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

GitHub Import

在“您的旧存储库的克隆URL”部分中,粘贴所需的存储库URL,并在“隐私”中选择concatTuples

答案 6 :(得分:2)

2021 年更新

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

---> 其他答案中的导入方法仅适用于 Subversion、Mercurial 或 TFS 项目。 GitHub 不支持 git 项目,这是我的第一手资料。它可能有用,但为什么要冒险呢?


存储库和 GitHub 连接

eclipse/org.aspectj原始公共存储库和用于获取的 upstream 远程
cb4/org.aspectjfork 和用于推送的 origin 遥控器
cb4/remPrivAJ远程私有仓库private 是用于推送的远程
I:\local本地存储库

对于 github 身份验证,我使用带有 ed25519 密钥 (steps in this SO answer) 的 ssh,因此我的连接 URI 如下所示:ssh://git@github.com/<user>/<repo>

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


步骤

  1. 在 github 上,fork 原始公共存储库到您的 github 帐户
  2. 在 github 上,create the empty remote private repo
  3. 在 Eclipse Git Perspective 中,将 fork 克隆到新的本地存储库并进行配置
  • 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.将原始公共存储库配置为名为 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 -> 只下载主分支 -> Close

  1. Duplicate the remote public repo 到您的远程私有仓库并配置。这是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 Push 主分支被推送 -> Close

此时,您已将公共存储库分叉到您的私有存储库中。要查看如何将私有更改推送到您的复刻,然后针对原始公共存储库打开拉取请求,see my answer here。生成的配置如下所示:
config