summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eng/vc-users.rst643
1 files changed, 641 insertions, 2 deletions
diff --git a/eng/vc-users.rst b/eng/vc-users.rst
index ebd79bb..efa29e0 100644
--- a/eng/vc-users.rst
+++ b/eng/vc-users.rst
@@ -7,5 +7,644 @@
Software Development (Git Users)
********************************
-TBD - Convert https://devel.rtems.org/wiki/Developer/Git/Users to Rest
-TBD - and insert here.
+.. COMMENT: TBD - Convert https://devel.rtems.org/wiki/Developer/Git/Users to
+.. COMMENT: TBD - Rest and insert here.
+
+.. COMMENT: TBD - Managing a (private/public) Git mirror, using GitHub,
+.. COMMENT: TBD - submitting pull requests...
+
+Browse the Git Repository Online
+--------------------------------
+
+You can browse all available repositories online by
+accessing https://git.rtems.org/.
+
+Using the Git Repository
+------------------------
+
+The following examples demonstrate how to use the RTEMS' Git repos. These
+examples are provided for the main rtems module, but they are also valid
+for the other modules.
+
+First, we need to obtain our own local copy of the RTEMS Git repository:
+
+.. code-block:: shell
+
+ git clone git://git.rtems.org/rtems.git rtems
+
+This command will create a folder named rtems in the current directory. This
+folder will contain a full-featured RTEMS' Git repository and the current HEAD
+revision checked out. Since all the history is available we can check out any
+release of RTEMS. Major RTEMS releases are available as separate branches in
+the repo.
+
+To see all available remote branches issue the following command:
+
+.. code-block:: shell
+
+ git branch -r
+
+We can check out one of those remote branches (e.g. rtems-4.10 branch) using
+the command:
+
+.. code-block:: shell
+
+ git checkout -b rtems410 origin/4.10
+
+This will create a local branch named "rtems410", containing the rtems-4.10
+release, that will track the remote branch "rtems-4-10-branch" in origin
+(​git://git.rtems.org/rtems.git). The ``git branch`` command prints a list of
+the current local branches, indicating the one currently checked out.
+
+If you want to switch between local branches:
+
+.. code-block:: shell
+
+ git checkout <branch-name>
+
+With time your local repository will diverge from the main RTEMS repository. To
+keep your local copy up to date you need to issue:
+
+.. code-block:: shell
+
+ git pull origin
+
+This command will update all your local branches with any new code revisions
+available on the central repository.
+
+Making Changes
+--------------
+
+Git allows you to make changes in the RTEMS source tree and track those changes
+locally. We recommend you make all your changes in local branches. If you are
+working on a few different changes or a progression of changes it is best to
+use a local branch for each change.
+
+A branch for each change lets your repo's master branch track the upstream
+RTEMS' master branch without interacting with any of the changes you are
+working on. A completed change is emailed to the developer's list for review
+and this can take time. While this is happening the upstream's master branch
+may be updated and you may need to rebase your work and test again if you are
+required to change or update your patch. A local branch isolates a specific
+change from others and helps you manage the process.
+
+First, you need to clone the repository:
+
+.. code-block:: shell
+
+ git clone git://git.rtems.org/rtems.git rtems
+
+Or if you already cloned it before, then you might want to update to the latest
+version before making your changes:
+
+.. code-block:: shell
+
+ cd rtems
+ git pull
+
+Create a local branch to make your changes in, in this example, the change is
+``faster-context-switch``:
+
+.. code-block:: shell
+
+ git checkout -b faster-context-switch
+
+Next, make your changes to files. If you add, delete ormove/rename files you
+need to inform Git
+
+.. code-block:: shell
+
+ git add /some/new/file
+ git rm /some/old/file
+ git mv /some/old/file /some/new/file
+
+When you're satisfied with the changes you made, commit them (locally)
+
+.. code-block:: shell
+
+ git commit -a
+
+The ``-a`` flag commits all the changes that were made, but you can also
+control which changes to commit by individually adding files as you modify
+them by using. You can also specify other options to commit, such as a message
+with the ``-m`` flag.
+
+.. code-block:: shell
+
+ git add /some/changed/files
+ git commit
+
+Create a patch from your branch, in this case, we have two commits we want to
+send for review:
+
+.. code-block:: shell
+
+ git format-patch -2
+
+ There are new changes pushed to the RTEMS' master branch and our local branch
+ needs to be updated:
+
+.. code-block:: shell
+
+ git checkout master
+ git pull
+ git checkout faster-context-switch
+ git rebase master
+
+Working with Branches
+---------------------
+
+Branches facilitate trying out new code and creating patches.
+
+The previous releases of RTEMS are available through remote branches. To check
+out a remote branch, first query the Git repository for the list of branches:
+
+.. code-block:: shell
+
+ git branch -r
+
+Then check out the desired remote branch, for example:
+
+.. code-block:: shell
+
+ git checkout -b rtems410 origin/4.10
+
+Or if you have previously checked out the remote branch then you should see it
+in your local branches:
+
+.. code-block:: shell
+
+ git branch
+
+You can change to an existing local branch easily:
+
+.. code-block:: shell
+
+ git checkout rtems410
+
+You can also create a new branch and switch to it:
+
+.. code-block:: shell
+
+ git branch temporary
+ git checkout temporary
+
+Or more concisely:
+
+.. code-block:: shell
+
+ git checkout -b temporary
+
+If you forget which branch you are on
+
+.. code-block:: shell
+
+ git branch
+
+shows you by placing a * next to the current one.
+
+When a branch is no longer useful you can delete it.
+
+.. code-block:: shell
+
+ git checkout master
+ git branch -d temporary
+
+If you have unmerged changes in the old branch Git complains and you need to
+use ``-D`` instead of ``-d``.
+
+Viewing Changes
+---------------
+
+To view all changes since the last commit:
+
+.. code-block:: shell
+
+ git diff HEAD
+
+To view all changes between the current branch and another branch, say master:
+
+.. code-block:: shell
+
+ git diff master..HEAD
+
+To view descriptions of committed changes:
+
+.. code-block:: shell
+
+ git log
+
+Or view the changeset for some file (or directory):
+
+.. code-block:: shell
+
+ git log /some/file
+
+To view the changesets made between two branches:
+
+.. code-block:: shell
+
+ git log master..HEAD
+
+Or for a more brief description use shortlog:
+
+.. code-block:: shell
+
+ git shortlog master..HEAD
+
+Reverting Changes
+-----------------
+
+To remove all (uncommitted) changes on a branch
+
+.. code-block:: shell
+
+ git checkout -f
+
+Or to selectively revert (uncommited) files, for example if you
+accidentally deleted ./some/file
+
+.. code-block:: shell
+
+ git checkout -- ./some/file
+
+or
+
+.. code-block:: shell
+
+ git checkout HEAD ./some/file
+
+To remove commits there are two useful options, reset and revert. ``git reset``
+should only be used on local branches that no one else is accessing remotely.
+``git revert`` is cleaner and is the right way to revert changes that have
+already been pushed/pulled remotely.
+
+git reset
+---------
+
+``git reset`` is a powerful and tricky command that should only be used on
+local (un-pushed) branches): A good description of what it enables to do can be
+found ​here. The following are a few useful examples. Note that adding a ~
+after HEAD refers to the most recent commit, and you can add a number after
+the ~ to refer to commits even further back; HEAD by itself refers to the
+current working directory (changes since the last commit).
+
+.. code-block:: shell
+
+ git reset HEAD~
+
+Will undo the last commit and unstage those changes. Your working directory
+will remain the same, therefore a ``git status`` will yield any changes you
+made plus the changes made in your last commit. This can be used to fix the
+last commit. You will need to add the files again.
+
+.. code-block:: shell
+
+ git reset --soft HEAD~
+
+Will just undo the last commit. The changes from the last commit will still be
+staged (just as if you finished git adding them). This can be used to amend the
+last commit (e.g. You forgot to add a file to the last commit).
+
+.. code-block:: shell
+
+ git reset --hard HEAD~
+
+Will revert everything, including the working directory, to the previous
+commit. This is dangerous and can lead to you losing all your changes; the
+``--hard`` flag ignores errors.
+
+.. code-block:: shell
+
+ git reset HEAD
+
+Will unstage any change. This is used to revert a wrong ``git add``. (e.g. You
+added a file that shouldn't be there, but you haven't 'committed')
+
+Will revert your working directory to a HEAD state. You will lose any change
+you made to files after the last commit. This is used when you just want to
+destroy all changes you made since the last commit.
+
+git revert
+----------
+
+``git revert`` does the same as reset but creates a new commit with the
+reverted changes instead of modifying the local repository directly.
+
+.. code-block:: shell
+
+ git revert HEAD
+
+This will create a new commit which undoes the change in HEAD. You will be
+given a chance to edit the commit message for the new commit.
+
+Merging Changes
+---------------
+
+Suppose you commit changes in two different branches, branch1 and branch2,
+and want to create a new branch containing both sets of changes:
+
+.. code-block:: shell
+
+ git checkout -b merged
+ git merge branch1
+ git merge branch2
+
+Or you might want to bring the changes in one branch into the other:
+
+.. code-block:: shell
+
+ git checkout branch1
+ git merge branch2
+
+And now that branch2 is merged you might get rid of it:
+
+.. code-block:: shell
+
+ git branch -d branch2
+
+If you have done work on a branch, say branch1, and have gone out-of-sync
+with the remote repository, you can pull the changes from the remote repo and
+then merge them into your branch:
+
+.. code-block:: shell
+
+ git checkout master
+ git pull
+ git checkout branch1
+ git merge master
+
+If all goes well the new commits you pulled into your master branch will be
+merged into your branch1, which will now be up-to-date. However, if branch1
+has not been pushed remotely then rebasing might be a good alternative to
+merging because the merge generates a commit.
+
+Rebasing
+--------
+
+An alternative to the merge command is rebase, which replays the changes
+(commits) on one branch onto another. ``git rebase`` finds the common ancestor
+of the two branches, stores each commit of the branch you’re on to temporary
+files and applies each commit in order.
+
+For example
+
+.. code-block:: shell
+
+ git checkout branch1
+ git rebase master
+
+or more concisely
+
+.. code-block:: shell
+
+ git rebase master branch1
+
+will bring the changes of master into branch1, and then you can fast-forward
+master to include branch1 quite easily
+
+.. code-block:: shell
+
+ git checkout master
+ git merge branch1
+
+Rebasing makes a cleaner history than merging; the log of a rebased branch
+looks like a linear history as if the work was done serially rather than in
+parallel. A primary reason to rebase is to ensure commits apply cleanly on a
+remote branch, e.g. when submitting patches to RTEMS that you create by working
+on a branch in a personal repository. Using rebase to merge your work with the
+remote branch eliminates most integration work for the committer/maintainer.
+
+There is one caveat to using rebase: Do not rebase commits that you have pushed
+to a public repository. Rebase abandons existing commits and creates new ones
+that are similar but different. If you push commits that others pull down, and
+then you rewrite those commits with ``git rebase`` and push them up again, the
+others will have to re-merge their work and trying to integrate their work
+into yours can become messy.
+
+Accessing a developer's repository
+----------------------------------
+
+RTEMS developers with Git commit access have personal repositories
+on https://git.rtems.org/ that can be cloned to view cutting-edge
+development work shared there.
+
+Creating a Patch
+----------------
+
+Before submitting a patch read about `Contributing
+<https://devel.rtems.org/wiki/Developer/Contributing>`_ to RTEMS and the
+`Commit Message <https://devel.rtems.org/wiki/Developer/Git#GitCommits>`_
+formatting we require.
+
+The recommended way to create a patch is to branch the Git repository master
+and use one commit for each logical change. Then you can use
+``git format-patch`` to turn your commits into patches and easily submit them.
+
+.. code-block:: shell
+
+ git format-patch master
+
+Creates a separate patch for each commit that has been made between the master
+branch and the current branch and writes them in the current directory. Use the
+``-o`` flag to redirect the files to a different directory.
+
+If you are re-submitting a patch that has previously been reviewed, you should
+specify a version number for your patch, for example, use
+
+.. code-block:: shell
+
+ git format-patch -v2 ...
+
+to indicate the second version of a patch, ``-v3`` for a third, and so forth.
+
+Patches created using ``git format-patch`` are formatted so they can be emailed
+and rely on having Git configured with your name and email address, for example
+
+.. code-block:: shell
+
+ git config --global user.name "Your Name"
+ git config --global user.email name@domain.com
+
+Please use a real name, we do not allow pseudonyms or anonymous contributions.
+
+Submitting a Patch
+------------------
+
+Using ``git send-email`` you can easily contribute your patches. You will need
+to install ``git send-email`` first:
+
+.. code-block:: shell
+
+ sudo yum install git-email
+
+or
+
+.. code-block:: shell
+
+ sudo dnf install git-email
+
+or
+
+.. code-block:: shell
+
+ sudo apt install git-email
+
+Then you will need to configure an SMTP server. You could install one on your
+localhost, or you can connect to a mail server such as Gmail.
+
+Configuring git send-email to use Gmail
+---------------------------------------
+
+Configure Git to use Gmail:
+
+.. code-block:: shell
+
+ git config --global sendemail.smtpserver smtp.gmail.com
+ git config --global sendemail.smtpserverport 587
+ git config --global sendemail.smtpencryption tls
+ git config --global sendemail.smtpuser your_email@gmail.com
+
+It will ask for your password each time you use ``git send-email``. Optionally
+you can also put it in your ``git config``:
+
+.. code-block:: shell
+
+ git config --global sendemail.smtppass your_password
+
+Sending Email
+-------------
+
+To send your patches just
+
+.. code-block:: shell
+
+ git send-email /path/to/patch --to devel@rtems.org
+
+To send multiple related patches (if you have more than one commit in your
+branch) specify a path to a directory containing all of the patches created by
+``git format-patch``. ``git send-email`` has some useful options such as:
+
+* ``--annotate`` to show/edit your patch
+* ``--cover-letter`` to prepend a summary
+* ``--cc=<address>`` to cc someone
+
+You can configure the to address:
+
+.. code-block:: shell
+
+ git config --global sendemail.to devel@rtems.org
+
+So all you need is:
+
+.. code-block:: shell
+
+ git send-email /path/to/patch
+
+Troubleshooting
+---------------
+
+Some restrictive corporate firewalls block access through the Git protocol
+(​git://). If you are unable to reach the server ​git://git.rtems.org/ you can
+try accessing through http. To clone the rtems repository using the http
+protocol use the following command:
+
+.. code-block:: shell
+
+ git clone http://git.rtems.org/rtems/ rtems
+
+This access through http is slower (way slower!) than through the git protocol,
+therefore, the Git protocol is preferred.
+
+Manage Your Code
+----------------
+
+You may prefer to keep your application and development work in a Git
+repository for all the good reasons that come with version control.
+For public repositories, you may like to try `GitHub <https://github.com/>`_
+or `BitBucket <https://bitbucket.org/>`_. RTEMS maintains
+`mirrors on GitHub <https://github.com/RTEMS>`_ which can make synchronizing
+with upstream changes relatively simple. If you need to keep your work private,
+you can use one of those services with private repositories or manage your own
+server. The details of setting up a server are outside the scope of this
+document, but if you have a server with SSH access you should be able to `find
+instructions
+<https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server>`_ on
+how to set up Git access. Once you have git configured on the server, adding
+repositories is a snap.
+
+Private Servers
+---------------
+
+In the following, replace @USER@ with your username on your server, @REPO@ with
+the name of your repository, and @SERVER@ with your server's name or address.
+
+To push a mirror to your private server, first create a bare repository on your
+server.
+
+.. code-block:: shell
+
+ cd /home/@USER@
+ mkdir git
+ mkdir git/@REPO@.git
+ cd git/@REPO@.git
+ git --bare init
+
+Now from your client machine (e.g. your work laptop/desktop), push a git,
+perhaps one you cloned from elsewhere, or one that you made locally with
+``git init``, by adding a remote and pushing:
+
+.. code-block:: shell
+
+ git remote add @SERVER@ ssh://@SERVER@/home/@USER@/git/@REPO@.git
+ git push @SERVER@ master
+
+You can replace the @SERVER@ with another name for your remote if you like.
+And now you can push other branches that you might have created. Now you can
+push and pull between your client and your server. Use SSH keys to authenticate
+with your server if you want to save on password typing; remember to put a
+passphrase on your SSH key if there is a risk the private key file might get
+compromised.
+
+The following is an example scenario that might be useful for RTEMS users that
+uses a slightly different approach than the one just outlined:
+
+.. code-block:: shell
+
+ ssh @SERVER@
+ mkdir git
+ git clone --mirror git://git.rtems.org/rtems.git
+ ## Add your ssh key to ~/.ssh/authorized_keys
+ exit
+ git clone ssh://@SERVER@/home/@USER@/git/rtems.git
+ cd rtems
+ git remote add upstream git://git.rtems.org/rtems.git
+ git fetch upstream
+ git pull upstream master
+ git push
+ ## If you want to track RTEMS on your personal master branch,
+ ## you should only push changes to origin/master that you pull
+ ## from upstream. The basic workflow should look something like:
+ git checkout master
+ git pull upstream master
+ git push
+ git checkout -b anewbranch
+ ## Repeat: do work, git commit -a
+ git push origin anewbranch
+
+ ## delete a remote branch
+ git push origin :anewbranch
+ ## delete a local branch
+ git branch -d anewbranch
+
+Learn more about Git
+--------------------
+
+Links to the sites with good Git information:
+
+* http://gitready.com/ - An excellent resource from beginner to very advanced.
+* http://progit.org/book/ - Covers Git basics and some advanced features.
+ Includes some useful workflow examples.
+* https://lab.github.com/ - Learn to use Git and GitHub while doing a series of
+ projects.
+* https://git-scm.com/docs - The official Git reference.