如何分叉公共存储库,但我的fork是私有的?我确实订阅了支持私有存储库。
答案 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月)
答案 2 :(得分:35)
目前的答案有点过时,所以为了清晰起见:
简短的回答是:
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
答案 4 :(得分:8)
答案 5 :(得分:5)
答案 6 :(得分:2)
我是 git 新手,所以想在 eclipse GUI (v2020-12; EGit v5.11) 中做尽可能多的事情。详情如下。
---> 其他答案中的导入方法仅适用于 Subversion、Mercurial 或 TFS 项目。 GitHub 不支持 git 项目,这是我的第一手资料。它可能有用,但为什么要冒险呢?
存储库和 GitHub 连接
eclipse/org.aspectj
是原始公共存储库和用于获取的 upstream
远程
cb4/org.aspectj
是 fork 和用于推送的 origin
遥控器
cb4/remPrivAJ
是远程私有仓库,private
是用于推送的远程
I:\local
是本地存储库
对于 github 身份验证,我使用带有 ed25519 密钥 (steps in this SO answer) 的 ssh,因此我的连接 URI 如下所示:ssh://git@github.com/<user>/<repo>
。
符号: ->
是鼠标点击或选择; right->
是右键单击。
步骤
-> Clone a Git Repository and add clone to this view -> Clone URI -> Next
-> Next
-> Next
-> Finish
填充本地存储库upstream
的新远程库,用于拉取更新
right-> Remotes -> Create Remote ->
并输入名称 upstream
-> Configure fetch -> Create -> Change ->
输入原始存储库 URI -> Finish
-> Save and Fetch ->
下载所有分支-> Close
-> Advanced
在 Specifications to fetch
下,删除那里的单独条目Add create/update specification -> Source ref: dropdown
下并选择 master [branch] -> +Add Spec -> Force Update
-> Save specifications in upstream configuration -> Finish -> Save and Fetch ->
只下载主分支 -> Close
像这样:
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
private
的新远程进行推送right-> Remotes -> Create Remote ->
并输入名称 private
-> Configure push -> Create -> Change ->
输入远程私有仓库 URI -> Finish
-> Advanced -> Add All Branches Spec -> Force Update -> Save specifications in origin configuration -> Finish
-> Save and Push
主分支被推送 -> Close
此时,您已将公共存储库分叉到您的私有存储库中。要查看如何将私有更改推送到您的复刻,然后针对原始公共存储库打开拉取请求,see my answer here。生成的配置如下所示: