【问题标题】:What are exact steps to share a public fork of a private repo?共享私人回购的公共分叉的具体步骤是什么?
【发布时间】:2014-07-26 00:09:22
【问题描述】:

我想开源一堆我们的私有代码,同时仍然允许我们私下工作,与公共社区共享子集,并将社区更改合并回我们的私有存储库。我相信 GitHub 可以做到这一切,但我很难让它在实践中发挥作用。你能帮我弄清楚如何完成这项工作吗?

我相当精通 git/GitHub 的基本流程,但我对这个练习的深度不够。我已经看到了一个很好的概述here,但它留下了很多细节作为“读者练习”——我无法弄清楚。具体来说,这是我到目前为止所做的测试(非常详细,供其他人将来参考):

  1. Expensify/dbarrett_PrivateTest 中创建了一个新的私有仓库,只包含一个README.md 文件(无法链接到它,因为它是私有的)

  2. 在本地克隆它: git clone git@github.com:Expensify/dbarrett_PrivateTest.git

  3. 创建了一个新的公共仓库:https://github.com/Expensify/dbarrett_PublicTest

  4. 在本地创建了私有仓库的“裸克隆”: git clone --bare git@github.com:Expensify/dbarrett_PrivateTest.git

  5. 已将其推送到公共仓库: cd dbarrett_PrivateTest.git git push --mirror git@github.com:Expensify/dbarrett_PublicTest.git

  6. 拉下我的公共回购(现在很高兴地填充了私人提交): git clone git@github.com:Expensify/dbarrett_PublicTest.git

  7. 在公共 repo 中编辑 README.md 并推送公共提交: vim README.md git commit -a git push origin master

  8. 很高兴我成功地将公开提交推送到公共存储库,就像我希望未来的开源贡献者一样。

  9. 在我的私有仓库中重放 (7) 中的相同步骤,并成功将私有提交推送到我的私有仓库(并确认它没有出现在公共仓库中)。

    不过,我已经做到了。这是我接下来想做的,但不知道怎么做:

  10. 将公共提交拉到我的私人仓库中,模拟我如何将公共贡献合并到我的私人代码库中。

  11. 将私有提交推送到公共存储库,模拟我将如何将自己的更改贡献回社区。​​p>

我看到过一些比我知道如何处理(远程、获取等)更高级的 git 概念的讨论,所以我有点不知所措,无法弄清楚下一步。你能提出任何建议吗?谢谢!

【问题讨论】:

    标签: git github open-source


    【解决方案1】:

    如果您使用相同的本地存储库来管理私有和公共存储库,而不是将它们放在不同的本地文件夹中,这可能会更容易。您将拥有一个 master 分支、一个 origin/master(可能是私有远程仓库)和 public/master(公共远程仓库)。在本地为私有和公共存储库(master_private vs master_public)设置不同的分支名称也很有意义,以便在同一个存储库中轻松地分别管理它们。

    master_public 跟踪公共存储库上的主分支。 master_private(或只是简单的 master)跟踪私有存储库上的 master 分支。

    处理第 10 步:

    git fetch public
    git checkout master_public
    git merge public/master
    
    #local master_public is now updated with 
    #changes in public repository's master branch
    
    git checkout master_private
    git merge master_public
    #local master_private now contains changes from public repo
    
    git push origin master_private:master
    #remote private repo now contains changes from public repo
    

    处理第 11 步:

    git fetch origin
    #origin is the private remote name
    git checkout master_private
    ...commit work locally or merge with feature branch ...
    git push master_public:master
    
    #remote private repo has local changes you made but public repo does not
    
    git checkout master_public
    git merge master_private
    #local master_public branch has private changes
    git push master_public:public
    
    #public remote has changes from private remote now
    

    如果您只想从私有存储库中获取更改的子集,那就另当别论了。管理起来会比较繁琐。如果你想要那个,我认为 git cherry-pick 会帮助你http://git-scm.com/docs/git-cherry-pick

    【讨论】:

    • 哦,这很有趣:在本地使用两个分支,并将每个分支推送到全局单独的 GH 存储库——一个公共的,一个私有的?那很有意思。挑战在于私有分支将拥有大量永远不应该进入公共分支的代码(例如,依赖于相同共享代码但未开源的项目)。我担心不小心将大量私有代码推送到公共仓库。因此,您可能是对的,唯一安全的方法是使用樱桃挑选,这将非常乏味。也许使用 diff/patch 手动操作更容易/更安全。
    • 无论如何,我都会接受这个答案,因为它似乎是一个很好的解决方案,尽管我一开始就开始怀疑整个方法。谢谢!
    • 我担心这就是你想要做的。就个人而言,我会考虑你想做的傻事。在不了解您的项目的情况下,您想要公开的更改很可能与私人更改交织在一起,以至于即使采摘樱桃也无法正常工作。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2014-07-14
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多