从私有仓库向公共仓库提交GitHub pull request是否可行?

24

我复制了一个公共仓库,并将新仓库设置为私有。

我在私有仓库中添加了一个带有修复内容的新远程分支。

现在,我想从私有仓库中的分支向我从中复制的公共仓库创建拉取请求。

我选择私有仓库中的分支,然后点击“拉取请求”。

我点击“更改提交”。

我无法更改组织/仓库所有者。我只看到我的组织,但看不到公共仓库的组织。我只能创建一个针对私有仓库主分支的拉取请求,但这不是我想要的。

是否不可能在私有仓库中修改公共仓库的内容并随后创建一个拉取请求?


6
我刚刚收到了GitHub支持团队的确认,目前无法从一个私有仓库创建拉取请求到一个你不拥有的公共仓库。 - Sebi
2
与此同时,我发现无论您是否拥有仓库,都无法从私有仓库向公共仓库创建拉取请求。 - Sebi
1
这个问题没有任何意义,它只是显示了您工作流程中的问题。您在 GitHub 上的 fork 应该是公共的,您在笔记本电脑上的克隆是私有的,然后您只将要公开的提交推送到您的公共 fork 中。这是您使用 GitHub 的正常方式。 - mljrg
1
@mljrg 请仅阅读我的先前评论,这些评论解释了为什么在那个时间点需要那样做。 - Sebi
1
您提出的内容已经在5年前发布,并成为被接受的答案。 - Sebi
显示剩余3条评论
3个回答

13
一种解决方案是将原始公共存储库fork到您自己的GitHub公共存储库中。
然后将您fork的公共存储库复制为私有存储库
然后在本地工作站上克隆这两个存储库,并且:
  • 在您的私有本地存储库上进行公共和私有修改
  • 首先将私有修改推送到您的本地公共存储库
  • 然后将它们推送到您在GitHub上fork的公共存储库
  • 从GitHub上fork的公共存储库发出拉取请求。

1
所以基本上我需要添加一个公共仓库,由我拥有,作为中间层来进行间接操作? - Sebi
1
@Sebi:这就是我们的想法,保持公共和私有修改之间的清晰分离。 - VonC
1
我希望这是可能的,没有使用 :-) - Sebi
1
它不起作用。我尝试首先创建一个公共分支,然后基于该分支创建一个私有分支。不幸的是,每个项目只能有一个分支。之后,我尝试使用公共存储库进行分叉,然后使用我的公共分支作为远程分支创建一个新的私有存储库。但是,无法在私有和公共存储库之间创建拉取请求。因此,我需要完全不同的方法。这并不令人满意。 - Sebi
3
@Sebi说:"在私有库和公共库之间创建拉取请求是不可能的。" 但是……你不需要创建那种类型的拉取请求:私有库和公共库都将属于你。如果你无法进行两个forks,请仅进行一次fork,然后将该存储库克隆到本地,并将其推送到您自己的私有存储库(这不是一个fork)。唯一的拉取请求将在您的(fork)公共存储库和原始公共存储库之间进行。任何在您的私有存储库和您的公共存储库之间的通信都通过从您的本地存储库向您的远程存储库推送来完成(不需要请求)。 - VonC
显示剩余2条评论

7

2021年更新

@VonC的答案在概念上是正确的,Github也一直支持这种方法。九年后,@Sebi终于得到了他想要的答案——我消除了VonC答案第二个小节中所提到的“间接性”问题。

对于我的用例,我需要对一个公共存储库进行公开和私有更改。公共提交可以在就绪后定期推送。私人更改必须保留在我的私人存储库中,直到我完成博士研究为止。那时,我将需要通过拉取请求将所有私人更改从我的公共分支流转到原始的公共存储库。

大部分工作都是正确设置事物。我在这个SO答案中提供了详细的步骤。以下步骤仅在eclipse GUI(v2020-12; EGit 5.11)中执行,但可以轻松转换为命令行操作。我使用的存储库如下:

  • eclipse/org.aspectj原始公共存储库;用于获取的upstream远程
  • cb4/org.aspectj 是我的分支;用于推送的origin远程
  • cb4/remPrivAJ 是我的远程私人存储库;用于推送和拉取的private远程
  • I:\local是我工作站上的本地存储库

对于Github身份验证,我使用带有ed25519 ssh密钥的ssh方式(这个SO问题中的方法),因此我的连接URI看起来像这样:ssh://git@github.com/<user>/<repo>

符号说明:->表示鼠标点击或选择;right->double->分别表示右键单击和双击。


我通过将每个更改放在不同的分支中(pub表示公共更改;priv表示私人更改)来区分公共和私人更改。我对git并不是很熟悉,所以可能还有更好的方法来实现它。

  1. 创建和配置分支
  • 1.1 在Eclipse Git Perspective中,在本地存储库下: 打开Branches, 然后打开 Local(每个旁边都有->v)
  • 1.2 对于私有分支:右键-> master -> Create Branch -> 选择 -> private/master -> OK 输入“priv”作为 Branch name: -> 为推送和拉取配置上游 ->当拉取:合并 ->完成
  • 1.3 对于公共分支:右键-> master -> Create Branch 输入“pub”作为Branch name: -> 完成
  • 1.4 结果:我的私有存储库 private/master,我的公共分叉 orign/master 和原始的公共存储库 upstream/master 中所有的提交编号均匹配。config
  1. 进行私有更改并提交
  • 2.1 进行一些更改,然后在Git Perspective中的Git Staging选项卡中查看详细信息
  • 2.2 通过单击绿色加号标记将选定的更改添加到索引中
  • 2.3 或者通过单击绿色双加号标记选择它们所有
  • 2.4 输入提交消息和-> Commit and Push -> 预览 -> 推送 -> 关闭
  • 2.5 注意新的提交编号
    commit
  1. 私有更改推送到公共分叉
  • 右键-> priv -> Push Branch -> 远程:下拉菜单v -> origin: URI (我的是 origin:ssh://git@github.com/cb4/org.aspectj) 在Branch: 文本框中双击 master, 并输入priv 然后 双击-> priv [branch] -> 预览 -> 推送 -> 关闭
  1. 在GitHub上,我的公共分支中的私有更改。注意这里与上面相同的提交编号(单击图像进行放大)。 changes pushed

  1. 要完成这个过程并对原始的公共存储库发起一个私有更改请求,请点击 Compare & pull request,然后就完成了!(单击图像进行放大) pull request

其他功能和函数

  • 当然,您可以将 公共 提交推送到公共分支:右侧 -> 公开 -> 推送分支 -> 预览 -> 推送 -> 关闭
  • 为了减少合并冲突,从原始的公共存储库中频繁拉取和合并更新:在 Remotes 下面 右侧 -> upstream -> Fetch
  • 然后将它们推送到您的分支上:在 Remotes 下面 右侧 -> origin -> Push
  • 并推送到您的私有存储库中:在 Remotes 下面 右侧 -> private -> Push

4
我怀疑GitHub并不想这样做,但你实际上可以通过简单的DOM操作从私有仓库向公共仓库发起拉取请求:
1. 在您的私有仓库上进行更改,可能是在一个新的分支上。 2. 开始一个拉取请求。点击“更改提交”按钮。 3. 打开允许您修改DOM的编辑器。像Firebug、Safari Web Inspector或Chrome开发者工具等工具似乎都可以正常工作。 4. 编辑基础分支存储库。您需要更改所选的选项标记的值。 5. 接下来,点击分支名称(如果需要,请更改它)。您需要这样做才能触发ajax更新。 6. 更新提交范围,然后您就可以开始了。
一些要注意的事项:
- 单击提交链接或查看文件将会对公共仓库或未列为协作者的用户产生404错误。一旦合并完成,所有事情似乎都很好,但对于公共仓库的维护者来说可能会有点奇怪。 - 拉取请求只能从UI中接受。我不认为它会允许任何人手动合并或精选提交。冲突可能需要由私有仓库所有者解决。

2
其实,这听起来像是一个漏洞。我只希望他们的安全模型中没有更多这样的漏洞 :-) - Sebi

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