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


247

我该如何派生一个公共存储库,但将我的派生设置为私有?我确实有订阅来支持私有存储库。

Answers:


393

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

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


首先,按照其他人的说法复制存储库(在此处查看详细信息):

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

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

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


最后,要创建拉取请求私有仓库->公共仓库:

使用GitHub UI创建公共仓库的分支(公共仓库页面右上方的小“ 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拉请求,如描述在这里

项目所有者查看您的拉取请求后,便可以将其合并。

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


2
为什么不能简单地将空的私有仓库作为新的远程仓库添加到公共仓库的普通克隆中,然后再推送到该远程仓库呢?有什么区别?
Falko Menge

@FalkoMenge我有同样的问题。阅读git-scm.com/docs/git-clone,听起来很正常,这git clone将在您不需要的克隆存储库中设置远程跟踪分支以及其他一些配置。--bare克隆仅按原样从远程复制.git目录。
bennlich

1
那是否还会将私人提交历史推向公共分支?
Sukhjinder Singh,

1
@Sukhjinder Singh是的,最后一步将把私有提交历史推送到公共仓库中。如果您不希望这样做,则可以在将提交合并到公共存储库中时压缩提交,并使用所有更改推送一次提交。参见例如stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek

1
我必须一步一步克隆我的私人仓库,然后进行更改然后推送。我所做的任何更改都没有被git注意到。git status显示所有最新信息,无论我如何更改,工作树都是干净的。因此,我无法提交和推送任何内容。我删除了新的私人仓库,尝试再进行两次,但仍然遇到相同的问题。有什么建议?
威尔

92

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

  1. 创建一个新的私人仓库
  2. 在空白存储库屏幕上,有一个“导入”选项/按钮 在此处输入图片说明
  3. 单击它并放入现有的github repo url没有提及github选项,但它也适用于github repos。 在此处输入图片说明
  4. 完成

19
尽管有些不同,但这仍然有效。(我在2015年8月尝试过)。我没有找到导入选项/按钮,所以用谷歌搜索并最终找到了该URL。import.github.com/new在这里,您可以输入现有的github网址,然后单击Check it按钮。验证后,您可以输入新仓库的名称,然后单击“私人”按钮,然后单击“ 开始导入
Shiva

2
我相信@MattvanAndel表示评论正确,而不是原始答案。我也遵循了Shiva的评论,并且奏效了。请注意,您不应该首先创建本地私有存储库!
David H

如果我以这种方式创建了一个私有的“ fork”,并想再次使其成为公共fork,我可以这样做吗?
安德斯·林登

2
@Shiva如果您在评论中给出答案,我会投票赞成。
bebbi

36

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

简短的答案是:

  1. 进行公共回购的裸露克隆
  2. 创建一个新的私人的。
  3. 做一个镜推到新的私人之一。

记录在GitHub:duplicating-a-repository


4
有没有办法拉动上游变化?这对于拥有自由许可证的仓库很重要-我已将仓库私有化,但仍想合并上游变更。
2014年

2
是。您应该能够将另一个仓库添加为新的(跟踪)远程服务器(例如“ other-repo”),然后定期从中获取并合并更改(例如“ git merge other-repo / stable”)。
stefano 2014年

26

您必须复制回购

您可以查看此文档(来自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


这会创建一个仓库的克隆,但不会在GitHub上创建派生。当您在GitHub中创建实际的fork时,它会在fork名称下显示“从exampleuser / repository-to-mirror分支”的文本。当您导航到github.com/exampleuser/new-repository/network/members时,它还会显示所有其他分支的树。
apaatsio

20

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

Github仓库导入


导入仍在大型存储库上运行(5天),检出它们的速度要快得多,但是也许要采取更多步骤才能使其保持最新状态。该缓慢是可以理解的,我想,因为它进口的一切不只是主分支,但我想这是更快...
利亚姆·米切尔

1
我要添加相同的答案,但感谢您先这样做。很高兴自去年1月开始提供Github免费私人回购协议。:D
OBL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.