提交代码

本部分针对提交者以及任何有兴趣了解如何为Django贡献代码的人员。 如果您是想向Django贡献代码的社区成员,请查看:doc:writing-code / working-with-git

处理 pull 请求

由于Django现在在GitHub上托管,因此大多数补丁都是以pull请求的形式提供的。

提交请求时,请确保每个单独的提交符合下面提到的提交准则。贡献者将尽可能提供最佳的请求。 然而,在实践中,提交者 - 谁可能更熟悉提交准则 - 可能会决定提交一个自己的提交标准。

您可能希望让Jenkins使用其中一个不自动运行的拉取请求构建器测试拉取请求,例如Oracle或Selenium。有关说明,请参阅Jenkins wiki页面。

你可以通过在"~/.gitconfig"文件中添加别名的方式来更简单地在本地获取新的pull request. (例如将"~/.gitconfig"中的upstream设置为"django/django"):

  1. [alias]
  2. pr = !sh -c \"git fetch upstream pull/${1}/head:pr/${1} && git checkout pr/${1}\"

现在你可以轻松地通过执行"git pr ####"来获取对应的pull request.

到了这个阶段,你可以着手于代码.使用"git rebase -i"和"git commit —ammend" 来确保你的提交准确无误. 一旦你准备好了:

  1. $ # Pull in the latest changes from master.
  2. $ git checkout master
  3. $ git pull upstream master
  4. $ # Rebase the pull request on master.
  5. $ git checkout pr/####
  6. $ git rebase master
  7. $ git checkout master
  8. $ # Merge the work as "fast-forward" to master to avoid a merge commit.
  9. $ # (in practice, you can omit "--ff-only" since you just rebased)
  10. $ git merge --ff-only pr/XXXX
  11. $ # If you're not sure if you did things correctly, check that only the
  12. $ # changes you expect will be pushed to upstream.
  13. $ git push --dry-run upstream master
  14. $ # Push!
  15. $ git push upstream master
  16. $ # Delete the pull request branch.
  17. $ git branch -d pr/xxxx
  1. ...\> REM Pull in the latest changes from master.
  2. ...\> git checkout master
  3. ...\> git pull upstream master
  4. ...\> REM Rebase the pull request on master.
  5. ...\> git checkout pr/####
  6. ...\> git rebase master
  7. ...\> git checkout master
  8. ...\> REM Merge the work as "fast-forward" to master to avoid a merge commit.
  9. ...\> REM (in practice, you can omit "--ff-only" since you just rebased)
  10. ...\> git merge --ff-only pr/XXXX
  11. ...\> REM If you're not sure if you did things correctly, check that only the
  12. ...\> REM changes you expect will be pushed to upstream.
  13. ...\> git push --dry-run upstream master
  14. ...\> REM Push!
  15. ...\> git push upstream master
  16. ...\> REM Delete the pull request branch.
  17. ...\> git branch -d pr/xxxx

在对master进行rebase之后但在合并并推送到上游之前强制推送到分支。这允许master和branch上的提交哈希值匹配,从而自动关闭pull请求。

如果拉请求不需要合并为多个提交,则可以在网页上使用Github的“挤压和合并”按钮。根据需要编辑提交消息以符合:ref:`The guidelines<committing-guidelines>`并删除自动附加到消息第一行的请求编号。

当重写pull请求的提交历史时,目标是使Django的提交历史尽可能可用:

  • 如果补丁包含来回提交,则将其重写为一个。例如,如果提交添加了一些代码,第二个提交修复了第一次提交中引入的样式问题,那么这些提交应该在合并之前被压缩。
  • 通过逻辑分组对不同提交进行单独更改:如果在对文件进行其他更改的同时进行样式清理,则将更改分成两个不同的提交将使查看历史记录变得更容易。
  • 注意拉取请求中上游分支的合并。
  • 测试应该通过,文档应该在每次提交后构建。测试和文档都不应该发出警告。
  • 随意和小型的补丁通常最好在一次提交中完成。如果有意义,可以将中型到大型工作分成多个提交。实用性胜过纯度,所以每个贡献者都要决定为拉取请求做多少历史记录。主要观点是参与社区,完成工作以及拥有可用的提交历史记录。

提交指南

此外,在将代码提交到Django的Git存储库时,请遵循以下准则:

  • 永远不要通过强制推动来改变“django / django``分支的已发布历史。如果您绝对必须(出于安全原因),请先与团队讨论情况。

  • 对于任何根据您的判断“中到大”的变化,请在进行更改之前在django开发者邮件列表上提出。

如果你对Django开发人员提出了一些建议,但没有人回应,请不要认为这意味着你的想法很棒,应该立即实施,因为没有人反对。每个人都没有足够的时间立即阅读邮件列表讨论,因此您可能需要等待几天才能得到答复。

  • 以过去时态写出详细的提交消息,而不是现在时。

    • 正确:"Fixed Unicode bug in RSS API."
    • 错误:"Fixes Unicode bug in RSS API."
    • 错误:"Fixing Unicode bug in RSS API."提交消息最多应为72个字符。 应该有一个主题行,用空白行分隔,然后是72个字符行的段落。 限制很软。 对于主题行,越短越好。 在提交消息的主体中,更多细节优于更少:
  1. Fixed #18307 -- Added git workflow guidelines.
  2.  
  3. Refactored the Django's documentation to remove mentions of SVN
  4. specific tasks. Added guidelines of how to use Git, GitHub, and
  5. how to use pull request together with Trac instead.

如果补丁不是拉请求,您应该在提交消息中对贡献者进行评价:“感谢A提供报告,B提供补丁,C提供审查。”

  • 对于提交到分支,请在提交消息前面加上分支名称。例如:“[1.4.x]Fixed XXXX——增加了对思维阅读的支持。”

  • 限制承诺最细微的变化是有意义的。这意味着,使用频繁的小额承诺,而不是很少的大额承诺。例如,如果实现功能X需要对库Y做一个小的更改,那么首先将更改提交到库Y,然后在单独的提交中提交功能X。这对帮助每个人跟踪你的变化有很大的帮助。

  • 将错误修复与功能更改分开。根据:ref:supported versions policy,可能需要将错误修复返回到稳定分支。

  • If your commit closes a ticket in the Django ticket tracker, beginyour commit message with the text "Fixed #xxxxx", where "xxxxx" is thenumber of the ticket your commit fixes. Example: "Fixed #123 — Addedwhizbang feature.". We've rigged Trac so that any commit message in thatformat will automatically close the referenced ticket and post a commentto it with the full commit message.

For the curious, we're using a Trac plugin for this.

注解

Note that the Trac integration doesn't know anything about pull requests.So if you try to close a pull request with the phrase "closes #400" in yourcommit message, GitHub will close the pull request, but the Trac pluginwill also close the same numbered ticket in Trac.

  • If your commit references a ticket in the Django ticket tracker butdoes not close the ticket, include the phrase "Refs #xxxxx", where "xxxxx"is the number of the ticket your commit references. This will automaticallypost a comment to the appropriate ticket.

  • 使用此模式为后端端口编写提交消息:

  1. [<Django version>] Fixed <ticket> -- <description>
  2.  
  3. Backport of <revision> from <branch>.

例如:

  1. [1.3.x] Fixed #17028 -- Changed diveintopython.org -> diveintopython.net.
  2.  
  3. Backport of 80c0cbf1c97047daed2c5b41b296bbc56fe1d7e3 from master.

There's a script on the wikito automate this.

如果提交修复了回归,请将其包含在提交消息中:

  1. Regression in 6ecccad711b52f9273b1acb07a57d3f806e93928.

(使用引入回归的提交哈希)。

恢复提交

没有人是完美的;一些错误可能会被提交

但要努力确保错误不会发生。仅仅因为我们有一个退换货政策,并不能放松你的责任,使你的目标尽可能达到最高的质量。真的:仔细检查你的工作,或者让另一个提交者检查它,在你首先提交它之前

当你发现了一个错误的提交,请遵循如下步骤:

  • 可能的话,让原始作者撤回他们的提交。
  • 不要在未获得原始作者同意的情况下还原其他作者的更改。
  • Use git revert — this will make a reverse commit, but the originalcommit will still be part of the commit history.
  • If the original author can't be reached (within a reasonable amountof time — a day or so) and the problem is severe — crashing bug,major test failures, etc. — then ask for objections on thedjango-developers mailing list then revert if there are none.
  • If the problem is small (a feature commit after feature freeze,say), wait it out.
  • If there's a disagreement between the committer and thereverter-to-be then try to work it out on the django-developersmailing list. If an agreement can't be reached then it shouldbe put to a vote.
  • If the commit introduced a confirmed, disclosed securityvulnerability then the commit may be reverted immediately withoutpermission from anyone.
  • The release branch maintainer may back out commits to the releasebranch without permission if the commit breaks the release branch.
  • If you mistakenly push a topic branch to django/django, just delete it.For instance, if you did: git push upstream feature_antigravity,just do a reverse push: git push upstream :feature_antigravity.