Python 为新分支上的GitHub上的存储库作出贡献

Python 为新分支上的GitHub上的存储库作出贡献,python,git,python-3.x,github,Python,Git,Python 3.x,Github,假设某人拥有一个存储库,其中只有一个master托管与python2.7.X兼容的代码。我希望通过自己对新分支new\u branch的更改为该存储库做出贡献,以提供与python3兼容的存储库变体 我遵循以下步骤: 我以我的帐户在GitHub上创建了存储库 我在本地机器上克隆了我的叉子 我在本地创建了一个新分支 我做了相关的修改 我在GitHub上提交并将更改推送到我自己的fork 我在浏览器上转到官方存储库的GitHub页面,请求一个pull请求 上述操作有效,但它执行了一个从我的账户:新的

假设某人拥有一个存储库,其中只有一个
master
托管与
python2.7.X
兼容的代码。我希望通过自己对新分支
new\u branch
的更改为该存储库做出贡献,以提供与
python3
兼容的存储库变体

我遵循以下步骤:

  • 我以我的帐户在GitHub上创建了存储库
  • 我在本地机器上克隆了我的叉子
  • 我在本地创建了一个新分支
  • 我做了相关的修改
  • 我在GitHub上提交并将更改推送到我自己的fork
  • 我在浏览器上转到官方存储库的GitHub页面,请求一个pull请求

  • 上述操作有效,但它执行了一个从
    我的账户:新的分支机构
    官方账户:主账户
    的拉取请求。这不是我想要的,因为
    python2.7.x
    python3
    彼此不兼容。我想做的是在官方存储库上创建一个新分支机构的PR(例如,使用相同的名称
    “新分支机构”
    )。我该怎么做?这可能吗?

    你真的不想这样做。但首先我会解释如何做,然后我会回来解释为什么不做

    GitHub有一个非常好的概述,特别是“更改分支范围和目标存储库”一节。如果您使用主题分支,并让上游所有者创建一个同名的主题分支,这是最简单的;然后你只需下拉菜单,菜单上写着“base:master”,选项就在那里,他只需点击“merge”按钮,就不会有任何惊喜了

    那么,你为什么不想这样做呢

    首先,它不适合GitHub模型。主题分支永远与主分支并行,并且有多个分支,这使得维护和可视化变得更加困难

    第二,您的代码需要一个git URL和一个https URL。您需要人们能够共享链接,
    pip安装
    从树的顶部,只需克隆repo,而不是克隆然后签出另一个分支,等等。这都意味着您的代码必须位于主分支上

    第三,如果您希望人们能够在PyPI上安装您的3.x版本,在readthedocs上查找文档,等等,那么您需要一个具有单一源代码树的单一项目。大多数这样的网站只有一个最新版本,而不是每个Python版本的最新版本,而且肯定不是同一版本的多个变体。(您可以完全安装fork项目,并创建一个单独的
    foo3
    项目。但是对于人们来说,能够
    pip安装foo
    要比让他们尝试、失败、这么做并询问为什么不起作用容易得多,并且被告知他们可能有python3,需要
    pip安装foo3


    如何将两个版本合并到一个包中?应该有最新的建议,但简单地说:如果有可能创建一个在两个版本上运行的代码库,那就很理想了;如果没有,并且如果在安装时运行
    2to3
    3to2
    无法使事情正常进行,请为3.x代码创建一个并行目录(例如,在
    foo
    旁边的
    foo3
    ),并在安装时选择适当的目录。(您始终可以从这一点开始,逐步朝着统一的代码库工作。)

    您可以通过单击pull请求顶部的edit按钮来编辑基本分支。。。但我不确定这是否真的可以创建一个新的分支;上游可能需要有该分支才能开始。(顺便说一句,通过创建一个在2和3上都运行的版本来在库中支持Python 3似乎现在更为常见…)谢谢@Wooble。在这个主题上,我实际上使用了
    2to3
    来移植代码。您知道
    2to3
    是否已经输出了与两者兼容的代码?它不知道。根据我的经验,也不太可能生成在Python3上工作得很好的代码。有一些很好的信息。@Wooble:只要做了足够的工作,您实际上可以使
    2to3
    生成在2.x中运行的代码(使用six.foo import*
    \uuuuuu future\uuuu
    语句中的一些
    )和3.x。我已经做过几次了。但这仍然比在安装时让它生成3.x代码并使用2.x的原始代码需要更多的工作,唯一的微小好处是,有时您可以在开发目录之外使用该包;一旦我意识到这一点,我就停止了尝试。我现在只使用
    2to3
    (和
    3to2
    )作为移植时的一个linting工具或手动重构辅助工具。谢谢,关于最后一段:运行
    2to3
    ,然后依次运行
    3to2
    ,理论上会生成同时在Python2和Python3中运行的Python代码吗,我从你的帖子中了解到,除非GitHub回购所有者创建主题分支,否则我无法针对它进行公关。换句话说,我不能PR到一个尚未创建的分支,对吗?@user815423426:在3.x中运行
    3to2
    code从来都不是一个真正的目标
    2to3
    ,至少参与其中的一些人在某个时候希望这样,所以我怀疑你只使用
    2to3
    比两者都要幸运。也许
    futurize
    代替/配合
    3to2
    会做得更好。
    2to3
    的更好用法是生成一些3.x代码,找出错误并修复,然后手动尝试将原始代码和3.x代码合并在一起(自由使用
    six
    modernize
    ),并使用
    3to2
    来验证它没有提出任何您没有想到的建议。@user815423426:另外,如果 2to3几乎给了你有用的3。x代码,你可能需要考虑调整你的2。x代码,这样它仍然能在2。x和<