mirror of
https://git.rtems.org/rtems-docs/
synced 2025-05-15 07:16:37 +08:00
eng/vc-authors: Convert wiki page to Rest (GCI 2018)
Converted https://devel.rtems.org/wiki/Developer/Git/Committers to Rest, and TBDs and wiki TODOs into comments. Also changed http links to https (the ones that are possible), corrected some typos, created a folder for eng images and added some formatting. This work was part of GCI 2018.
This commit is contained in:
parent
32a4a0aded
commit
f4782c99b8
@ -7,5 +7,356 @@
|
||||
Software Development (Git Writers)
|
||||
**********************************
|
||||
|
||||
TBD - Convert https://devel.rtems.org/wiki/Developer/Git/Committers
|
||||
TBD - and insert here.
|
||||
.. COMMENT: TBD - Convert https://devel.rtems.org/wiki/Developer/Git/Committers
|
||||
.. COMMENT: TBD - and insert here.
|
||||
|
||||
.. COMMENT: TBD - Some guidelines for anyone who wishes to contribute to
|
||||
.. COMMENT: TBD - rtems... Patches? Pull Requests?...
|
||||
|
||||
The preferred workflow for making changes to RTEMS is to push patches to a
|
||||
committer's personal repository in public view and then merge changes from
|
||||
there. For working on enhancements or bug fixes committers are encouraged to
|
||||
push to branches on their personal repositories and to merge into the main
|
||||
RTEMS repository from their personal repository. Personal branches should
|
||||
not be pushed to the RTEMS repository.
|
||||
|
||||
SSH Access
|
||||
----------
|
||||
|
||||
Currently all committer's should have an ssh account on the main git server,
|
||||
dispatch.rtems.org. If you have been granted commit access and do have an
|
||||
account on dispatch.rtems.org one should be requested on the devel@… list.
|
||||
SSH access for git uses key logins instead of passwords. The key should be at
|
||||
least 1024bits in length.
|
||||
|
||||
The public repositories can by cloned with
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
git clone ssh://user@dispatch.rtems.org/data/git/rtems.git
|
||||
|
||||
Or replace `rtems.git` with another repo to clone another one.
|
||||
|
||||
Personal Repository
|
||||
-------------------
|
||||
Personal repositories keep the clutter away from the master repository. A
|
||||
user with a personal repository can make commits, create and delete branches,
|
||||
plus more without interfering with the master repository. Commits to the
|
||||
master repository generate email to the vc@… list and development type commits
|
||||
by a developer would only add noise and lessen the effectiveness of the commit
|
||||
list
|
||||
|
||||
A committer should maintain a personal clone of the RTEMS repository through
|
||||
which all changes merged into the RTEMS head are sent. The personal repository
|
||||
is also a good place for committers to push branches that contain works in
|
||||
progress. The following instructions show how to setup a personal repositor
|
||||
that by default causes commits to go to your private local repository and
|
||||
pushes to go to your publicly visible personal repository. The RTEMS head is
|
||||
configured as a remote repository named 'upstream' to which you can push
|
||||
changes that have been approved for merging into RTEMS.
|
||||
|
||||
Branches aren't automatically pushed until you tell git to do the initial push
|
||||
after which the branch is pushed automatically. In order to keep code private
|
||||
just put it on a branch in your local clone and do not push the branch.
|
||||
|
||||
Create a personal repository
|
||||
----------------------------
|
||||
|
||||
Set up the server side repository. In the following substitute user with your
|
||||
username.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# ssh git.rtems.org
|
||||
[user@git ~]$ ln -s /data/git/user git
|
||||
[user@git ~]$ ls -l
|
||||
lrwxrwxrwx 1 user rtems 16 Feb 1 11:52 git -> /data/git/user
|
||||
[user@git ~]$ cd git
|
||||
[user@git git]$ git clone --mirror /data/git/rtems.git
|
||||
|
||||
Provide a description for the repository, for example "Clone of master
|
||||
repository."
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
[user@git git]$ echo "Clone of master repository." > rtems.git/description
|
||||
[user@git git]$ logout
|
||||
|
||||
Clone the repository on your local machine
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git clone ssh://user@dispatch.rtems.org/home/user/git/rtems.git
|
||||
# cd rtems
|
||||
|
||||
Add the RTEMS repository as a remote repository and get the remote tags
|
||||
and branches
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git remote add upstream ssh://user@dispatch.rtems.org/data/git/rtems.git
|
||||
# git fetch upstream
|
||||
|
||||
After a little while you should be able to see your personal repo
|
||||
at https://git.rtems.org/@USER@/rtems.git/ and you can create other
|
||||
repositories in your git directory that will propagate
|
||||
to https://git.rtems.org/@USER@/ if you need. For example, `joel`'s personal
|
||||
repos appear at https://git.rtems.org/joel/.
|
||||
|
||||
|
||||
.. figure:: ../images/eng/Git-personalrepo.png
|
||||
:width: 50%
|
||||
:align: center
|
||||
:alt: Git Personal Repositories
|
||||
|
||||
Check your setup
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
git remote show origin
|
||||
|
||||
Should print something similar to
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
* remote origin
|
||||
Fetch URL: ssh://user@dispatch.rtems.org/home/user/git/rtems.git
|
||||
Push URL: ssh://user@dispatch.rtems.org/home/user/git/rtems.git
|
||||
HEAD branch: master
|
||||
Remote branches:
|
||||
4.10 tracked
|
||||
4.8 tracked
|
||||
4.9 tracked
|
||||
master tracked
|
||||
Local branch configured for 'git pull':
|
||||
master merges with remote master
|
||||
Local ref configured for 'git push':
|
||||
master pushes to master (up to date)
|
||||
|
||||
Push commits to personal repo master from local master
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git push
|
||||
|
||||
Push a branch onto personal repo
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git push origin branchname
|
||||
|
||||
Update from upstream master (RTEMS head)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When you have committed changes on a branch that is private (hasn't been
|
||||
pushed to your personal repo) then you can use rebase to obtain a linear
|
||||
history and avoid merge commit messages.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git checkout new_features
|
||||
# git pull --rebase upstream master
|
||||
|
||||
If you cannot do a fast-forward merge then you could use the ``--no-commit``
|
||||
flag to prevent merge from issuing an automatic merge commit message.
|
||||
|
||||
When you have committed changes on a branch that is public/shared with another
|
||||
developer you should not rebase that branch.
|
||||
|
||||
GIT Push Configuration
|
||||
----------------------
|
||||
|
||||
People with write access to the main repository should make sure that they
|
||||
push the right branch with the git push command. The above setup ensures
|
||||
that git push will not touch the main repository, which is identified as
|
||||
upstream, unless you specify the upstream (by ``git push upstream master``).
|
||||
|
||||
Lets suppose we have a test branch intended for integration into the master
|
||||
branch of the main repository.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git branch
|
||||
master
|
||||
* test
|
||||
|
||||
There are two options for pushing with the branch. First,
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git push origin test
|
||||
|
||||
Will push the test branch to the personal repository. To delete the remote
|
||||
branch
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git push origin :test
|
||||
|
||||
You'll still need to delete your local branch if you are done with it.
|
||||
|
||||
If you are going to work exclusively with one branch for a while, you might
|
||||
want to configure git to automatically push that branch when you use git push.
|
||||
By default git push will use the local master branch, but you can use the
|
||||
`test` branch as the source of your changes:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git config remote.origin.push test:master
|
||||
|
||||
Now git push will merge into your master branch on your personal repository.
|
||||
You can also setup a remote branch:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git config remote.origin.push test:test
|
||||
|
||||
You can see what branch is configured for pushing with
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git remote show origin
|
||||
|
||||
And reset to the default
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git config remote.origin.push master
|
||||
|
||||
Pull a Developer's Repo
|
||||
-----------------------
|
||||
|
||||
The procedures for creating personal repositories ensure that every developer
|
||||
can post branches that anyone else can review. To pull a developer's personal
|
||||
repository into your local RTEMS git clone, just add a new remote repo:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git remote add devname git://dispatch.rtems.org/devname/rtems.git
|
||||
# git fetch devname
|
||||
# git remote show devname
|
||||
# git branch -a
|
||||
|
||||
Replace devname with the developer's user name on git, which you can see by
|
||||
accessing https://git.rtems.org. Now you can switch to the branches
|
||||
for this developer.
|
||||
|
||||
Use a tracking branch if the developer's branch is changing:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git branch --track new_feature devname/new_feature
|
||||
|
||||
Committing
|
||||
----------
|
||||
|
||||
Ticket Updates
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Our trac instance supports updating a related ticket with the commit message.
|
||||
|
||||
Any references to a ticket for example #1234 will insert the message into
|
||||
he ticket as an 'update'. No command is required.
|
||||
|
||||
Closing a ticket can be done by prefixing the ticket number with any of the
|
||||
following commands:
|
||||
|
||||
``close``, ``closed``, ``closes``, ``fix``, ``fixed``, or ``fixes``
|
||||
|
||||
For example:
|
||||
|
||||
``closes #1234``
|
||||
|
||||
``This is a random update it closes #1234 and updates #5678``
|
||||
|
||||
Commands
|
||||
~~~~~~~~
|
||||
|
||||
When merging someone's work, whether your own or otherwise, we have some
|
||||
suggested procedures to follow.
|
||||
|
||||
* Never work in the master branch. Checkout a new branch and apply
|
||||
patches/commits to it.
|
||||
* Before pushing upstream:
|
||||
- Update master by fetching from the server
|
||||
- Rebase the working branch against the updated master
|
||||
- Push the working branch to the server master
|
||||
|
||||
The basic workflow looks like
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git checkout -b somebranch upstream/master
|
||||
# patch .. git add/rm/etc
|
||||
# git commit ...
|
||||
# git pull --rebase upstream master
|
||||
# git push upstream somebranch:master
|
||||
|
||||
If someone pushed since you updated the server rejects your push until you
|
||||
are up to date.
|
||||
|
||||
For example a workflow where you will commit a series of patches from
|
||||
``../patches/am/`` directory:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
# git checkout -b am
|
||||
# git am ../patches/am*
|
||||
# git pull --rebase upstream master
|
||||
# git push upstream am:master
|
||||
# git checkout master
|
||||
# git pull upstream master
|
||||
# git log
|
||||
# git branch -d am
|
||||
# git push
|
||||
|
||||
The git log stage will show your newly pushed patches if everything worked
|
||||
properly, and you can delete the am branch created. The git push at the end
|
||||
will push the changes up to your personal repository.
|
||||
|
||||
Another way to do this which pushes directly to the upstream is shown here
|
||||
in an example which simply (and quickly) applies a patch to the branch:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
git checkout -b rtems4.10 --track remotes/upstream/4.10
|
||||
cat /tmp/sp.diff | patch
|
||||
vi sparc.t
|
||||
git add sparc.t
|
||||
git commit -m "sparc.t: Correct for V8/V9"
|
||||
git push upstream rtems4.10:4.10
|
||||
git checkout master
|
||||
git log
|
||||
git branch -d rtems4.10
|
||||
|
||||
Pushing Multiple Commits
|
||||
------------------------
|
||||
|
||||
A push with more than one commit results in Trac missing them. Please use the
|
||||
following script to push a single commit at a time:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
#! /bin/sh
|
||||
commits=$(git log --format='%h' origin/master..HEAD | tail -r)
|
||||
for c in $commits
|
||||
do
|
||||
cmd=$(echo $c | sed 's%\(.*\)%git push origin \1:master%')
|
||||
echo $cmd
|
||||
$cmd
|
||||
done
|
||||
|
||||
Ooops!
|
||||
------
|
||||
|
||||
So you pushed something upstream and broke the repository. First things first:
|
||||
stop what you're doing and notify devel@... so that (1) you can get help and
|
||||
(2) no one pulls from the broken repo. For an extended outage also notify
|
||||
users@.... Now, breathe easy and let's figure out what happened. One thing
|
||||
that might work is to just `undo the push
|
||||
<https://stackoverflow.com/questions/1270514/undoing-a-git-push>`_. To get an
|
||||
idea of what you did, run ``git reflog``, which might be useful for getting
|
||||
assistance in undoing whatever badness was done.
|
||||
|
BIN
images/eng/Git-personalrepo.png
Normal file
BIN
images/eng/Git-personalrepo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
Loading…
x
Reference in New Issue
Block a user