Skip to content

Reorganize git commands #263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Sep 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 12 additions & 145 deletions committing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -268,23 +268,6 @@ understands the justification for the change). Also, if a non-core developer
contributed to the resolution, it is good practice to credit them.


Reverting a Commit
------------------

To revert a merged pull request, press the ``Revert`` button at the bottom of
the pull request. It will bring up the page to create a new pull request where
the commit can be reverted. It also creates a new branch on the main CPython
repository. Delete the branch once the pull request has been merged.

Always include the reason for reverting the commit to help others understand
why it was done. The reason should be included as part of the commit message,
for example::

Revert bpo-NNNN: Fix Spam Module (GH-111)

Reverts python/cpython#111.
Reason: This commit broke the buildbot.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has been moved after the section about backporting.


Working with Git_
=================
Expand Down Expand Up @@ -313,107 +296,6 @@ into a state you aren't happy with.
.. _Git: https://git-scm.com/


Minimal Configuration
---------------------

If you use Git as a committer of patches (your own or others), you should
set up some basic options. Here are the minimal options you need to activate:

* Your *name* and *email*: these settings defines what will be used when you
commit changes::

git config --global user.name "Your Name"
git config --global user.email [email protected]

``--global`` flag sets configuration options at a global level, if instead you
want to set it at a project level use ``--local``, instead.

* *Under Windows*, you should also enable the *autocrlf* option, which will
fix any Windows-specific line endings your text editor might insert when you
create or modify versioned files. The public repository has a hook which
will reject all changesets having the wrong line endings, so enabling this
extension on your local computer is in your best interest.
::

git config --global core.autocrlf input


Remotes Setup
-------------


.. _remote-configuration:

Configuration
'''''''''''''

There are several possible ways how to set up your git repository. This section
discusses the simplest approach of having a single directory with two remotes,
one pointing to private fork, the other one being the official repository.

Assuming you have :ref:`cloned the official repository <checkout>` here is how
your current setup should look like::

$ git remote -v # show remotes
origin https://github.com/python/cpython (fetch)
origin https://github.com/python/cpython (push)

You can have multiple remotes defined for a single repository, the usual approach
is to have ``origin`` pointing to your :ref:`private fork <forking>`, and ``upstream``
pointing to the official repository. To do so, here are the steps needed to have
that setup::

git remote set-url origin https://github.com/<your-username>/cpython
git remote add upstream https://github.com/python/cpython

After that, your remotes configuration should look like this::

$ git remote -v # show remotes
origin https://github.com/<your-username>/cpython (fetch)
origin https://github.com/<your-username>/cpython (push)
upstream https://github.com/python/cpython (fetch)
upstream https://github.com/python/cpython (push)

At any point in time you can use SSH-based URL instead of HTTPS-based ones.


.. _committing-push-changes:

Pushing changes
'''''''''''''''

You have two remotes configured (see previous section for setup). Publishing
your changes to any of them is as simple as specifying the name of the remote
upon your push. Assuming I am working on a local branch ``bug1234`` and I want to
push it to my private fork I do::

git push origin bug1234

Option ``-u|--set-upstream`` creates a remote-tracking branch that tracks what
have been pushed to ``origin``::

git push -u origin bug1234

That allows to avoid rebasing beyond already pushed commits.
``git status --branch`` and ``git branch --verbose`` remind that the branch(es)
have not pushed commits.


Synchronizing remotes
'''''''''''''''''''''

To synchronize your fork, from the official repository you need to execute following
commands::

git fetch upstream # fetch remote changes
git checkout master # checkout your current master branch
git merge upstream/master # merge remote changes into your local master branch
git push origin master # publish changes to your private fork

The above steps can be executed against any branch you wish to, just replace master
with an appropriate branch name.


Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the stuff in this chunk either got added to the bootcamp or it was already there

.. _committing-active-branches:

Active branches
Expand Down Expand Up @@ -454,34 +336,19 @@ Developers can apply labels to GitHub pull requests).
.. _cherry_picker.py: https://github.com/python/core-workflow/tree/master/cherry_picker


.. _forking:

Forking repository
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is already in the bootcamp (and somewhere else too).

------------------

Forking a repository on GitHub is as simple as clicking Fork button in the right
upper corner at https://github.com/python/cpython.

Reverting a Merged Pull Request
-------------------------------

Maintaining a repository
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After asking around during the sprint, the consensus was to remove this section.

------------------------
To revert a merged pull request, press the ``Revert`` button at the bottom of
the pull request. It will bring up the page to create a new pull request where
the commit can be reverted. It also creates a new branch on the main CPython
repository. Delete the branch once the pull request has been merged.

The Git object database and other files/directories under ``.git`` require
periodic maintenance and cleanup. For example, commit editing leaves
unreferenced objects (dangling objects, in git terminology) and these
objects should be pruned to avoid collecting cruft in the DB. The
command ``git gc`` is used for maintenance. Git automatically runs
``git gc --auto`` as a part of some commands to do quick maintenance.
Users are recommended to run ``git gc --aggressive`` from time to
time; ``git help gc`` recommends to run it every few hundred
changesets; for CPython it should be something like once a week
(GitHub itself runs the command weekly, so new checkouts do not need to
perform this step).
Always include the reason for reverting the commit to help others understand
why it was done. The reason should be included as part of the commit message,
for example::

``git gc --aggressive`` not only removes dangling objects, it also
repacks object database into indexed and better optimized pack(s); it
also packs symbolic references (branches and tags).
Revert bpo-NNNN: Fix Spam Module (GH-111)

From time to time run ``git fsck --strict`` to verify integrity of
the database. ``git fsck`` may produce a list of dangling objects;
that's not an error, just a reminder to perform regular maintenance.
Reverts python/cpython#111.
Reason: This commit broke the buildbot.
55 changes: 54 additions & 1 deletion gitbootcamp.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ relevant to CPython's workflow.

.. contents::

.. _fork-cpython:

Forking CPython GitHub Repository
---------------------------------
Expand All @@ -24,24 +25,61 @@ You'll only need to do this once.

4. Your fork will be created at https://github.com/<username>/cpython.

.. _clone-your-fork:

Cloning The Forked CPython Repository
-------------------------------------

You'll only need to do this once. From your command line::

$ git clone [email protected]:<username>/cpython.git

It is also recommended to configure an ``upstream`` remote::

$ cd cpython
$ git remote add upstream [email protected]:python/cpython.git

You can also use SSH-based or HTTPS-based URLs.

Listing the Remote Repositories
-------------------------------

To list the remote repositories that are configured, along with their urls::
To list the remote repositories that are configured, along with their URLs::

$ git remote -v

You should have two remotes: ``origin`` pointing to your fork,
and ``upstream`` pointing to the official CPython repository::

origin [email protected]:<your-username>/devguide.git (fetch)
origin [email protected]:<your-username>/devguide.git (push)
upstream [email protected]:python/devguide.git (fetch)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this doc will often be used by contributors that do not have push privileges for CPython, the upstream remote should point to https://github.com/python/cpython in the doc here.

Perhaps a note for committers that they should use what you have here for upstream.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAICT, with this URL, they still should be able to fetch. If they try to push they will get an error because they don't have privileges, but that's OK since they are not supposed to push on upstream anyway. Unless I'm missing something, this URL should be fine for both contributors and core devs.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @willingc and @ezio-melotti. I'm thinking it's fine to leave the upstream using SSH url.
For contributors, they would have to configure SSH key anyway.

upstream [email protected]:python/devguide.git (push)


.. _set-up-name-email:

Setting Up Your Name and Email Address
--------------------------------------
::

$ git config --global user.name "Your Name"
$ git config --global user.email [email protected]

The ``--global`` flag sets these globally,
``--local`` sets them only for the current project.

.. _autocrlf:

Enabling ``autocrlf`` on Windows
--------------------------------

The *autocrlf* option will fix automatically any Windows-specific line endings.
This should be enabled on Windows, since the public repository has a hook which
will reject all changesets having the wrong line endings.
::

$ git config --global core.autocrlf input

Creating and Switching Branches
-------------------------------
Expand Down Expand Up @@ -139,6 +177,21 @@ To re-apply the last stashed change::

$ git stash pop

.. _commit-changes:

Committing Changes
------------------

Add the files you want to commit::

$ git add <filename>

Commit the files::

$ git commit -m '<message>'


.. _push-changes:

Pushing Changes
---------------
Expand Down
11 changes: 6 additions & 5 deletions pullrequest.rst
Original file line number Diff line number Diff line change
Expand Up @@ -107,21 +107,22 @@ Here is a quick overview of how you can contribute to CPython on GitHub:

#. :ref:`Get started <setup>` and set up your system

#. Fork `CPython`_ on GitHub (using the Fork button in the upper-right on GitHub)
#. :ref:`Fork CPython <fork-cpython>` (using the Fork button in the
upper-right on GitHub)

#. :ref:`Clone your GitHub fork and add an "upstream" remote <clone-your-fork>`

#. :ref:`Build Python <compiling>` on your system

#. :ref:`Run tests <runtests>` after you have built Python

#. :ref:`Add an "upstream" Remote in Git <remote-configuration>` (using SSH,
or you can `use HTTPS`_)

#. :ref:`Create a Branch in Git <pullrequest-steps>` where you can work on
changes

#. :ref:`Run tests <runtests>` again

#. :ref:`Push commits <committing-push-changes>` to your GitHub repo
#. :ref:`Commit <commit-changes>` and :ref:`push <push-changes>`
changes to your GitHub fork

#. `Create Pull Request`_ on GitHub to merge a branch from your fork

Expand Down
29 changes: 10 additions & 19 deletions setup.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,36 +34,27 @@ installation directions. You may also want to consider a graphical client
such as `TortoiseGit <https://tortoisegit.org/>`_ or
`GitHub Desktop <https://desktop.github.com/>`_.

You may also wish to
`set up an SSH key <https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/>`_
You may also wish to set up :ref:`your name and email <set-up-name-email>`
and `an SSH key
<https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/>`_
as this will allow you to interact with GitHub without typing a username
and password each time you execute a command, such as ``git pull``,
``git push``, or ``git fetch``.

``git push``, or ``git fetch``. On Windows, you should also
:ref:`enable autocrlf <autocrlf>`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIce! 👍


.. _checkout:

Getting the Source Code
-----------------------

One should always work from a working copy of the CPython source code.
While it may
be tempting to work from the copy of Python you already have installed on your
machine, it is very likely that you will be working from out-of-date code as
the Python core developers are constantly updating and fixing things in their
:abbr:`VCS (version control system)`. It also means you will have better tool
support through the VCS as it will provide a diff tool, etc.

To get a working copy of the :ref:`in-development <indevbranch>` branch of
CPython, run::

git clone https://github.com/python/cpython
In order to get a copy of the source code you should first :ref:`fork the
Python repository on GitHub <fork-cpython>` and then :ref:`create a local
clone of your private fork and configure the remotes <clone-your-fork>`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

private I know what you are trying to say here but the fork is public. I think it is better to use ...clone of your fork and configure...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Personal" is probably the word I was looking for, but "your fork" is clear enough without additional qualifiers.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like personal 👍

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed this in #265


If you want a working copy of an already-released version of Python,
i.e., a version in :ref:`maintenance mode <maintbranch>`, you can checkout
a release branch. For instance, to checkout a working copy of Python 3.5, do::

git checkout 3.5
a release branch. For instance, to checkout a working copy of Python 3.5,
do ``git checkout 3.5``.

You will need to re-compile CPython when you do such an update.

Expand Down