Imported Upstream version 6.1
[platform/upstream/ffmpeg.git] / doc / git-howto.texi
index 44e1cc6..f4e2f2e 100644 (file)
@@ -1,9 +1,10 @@
 \input texinfo @c -*- texinfo -*-
+@documentencoding UTF-8
 
-@settitle Using git to develop FFmpeg
+@settitle Using Git to develop FFmpeg
 
 @titlepage
-@center @titlefont{Using git to develop FFmpeg}
+@center @titlefont{Using Git to develop FFmpeg}
 @end titlepage
 
 @top
@@ -12,9 +13,9 @@
 
 @chapter Introduction
 
-This document aims in giving some quick references on a set of useful git
+This document aims in giving some quick references on a set of useful Git
 commands. You should always use the extensive and detailed documentation
-provided directly by git:
+provided directly by Git:
 
 @example
 git --help
@@ -31,29 +32,28 @@ man git-<command>
 shows information about the subcommand <command>.
 
 Additional information could be found on the
-@url{http://gitref.org, Git Reference} website
+@url{http://gitref.org, Git Reference} website.
 
 For more information about the Git project, visit the
-
-@url{http://git-scm.com/, Git website}
+@url{http://git-scm.com/, Git website}.
 
 Consult these resources whenever you have problems, they are quite exhaustive.
 
 What follows now is a basic introduction to Git and some FFmpeg-specific
-guidelines to ease the contribution to the project
+guidelines to ease the contribution to the project.
 
 @chapter Basics Usage
 
-@section Get GIT
+@section Get Git
 
-You can get git from @url{http://git-scm.com/}
+You can get Git from @url{http://git-scm.com/}
 Most distribution and operating system provide a package for it.
 
 
 @section Cloning the source tree
 
 @example
-git clone git://source.ffmpeg.org/ffmpeg <target>
+git clone https://git.ffmpeg.org/ffmpeg.git <target>
 @end example
 
 This will put the FFmpeg sources into the directory @var{<target>}.
@@ -65,6 +65,21 @@ git clone git@@source.ffmpeg.org:ffmpeg <target>
 This will put the FFmpeg sources into the directory @var{<target>} and let
 you push back your changes to the remote repository.
 
+@example
+git clone gil@@ffmpeg.org:ffmpeg-web <target>
+@end example
+
+This will put the source of the FFmpeg website into the directory
+@var{<target>} and let you push back your changes to the remote repository.
+(Note that @var{gil} stands for GItoLite and is not a typo of @var{git}.)
+
+If you don't have write-access to the ffmpeg-web repository, you can
+create patches after making a read-only ffmpeg-web clone:
+
+@example
+git clone git://ffmpeg.org/ffmpeg-web <target>
+@end example
+
 Make sure that you do not have Windows line endings in your checkouts,
 otherwise you may experience spurious compilation failures. One way to
 achieve this is to run
@@ -74,6 +89,7 @@ git config --global core.autocrlf false
 @end example
 
 
+@anchor{Updating the source tree to the latest revision}
 @section Updating the source tree to the latest revision
 
 @example
@@ -106,7 +122,7 @@ git add [-A] <filename/dirname>
 git rm [-r] <filename/dirname>
 @end example
 
-GIT needs to get notified of all changes you make to your working
+Git needs to get notified of all changes you make to your working
 directory that makes files appear or disappear.
 Line moves across files are automatically tracked.
 
@@ -126,8 +142,8 @@ will show all local modifications in your working directory as unified diff.
 git log <filename(s)>
 @end example
 
-You may also use the graphical tools like gitview or gitk or the web
-interface available at http://source.ffmpeg.org/
+You may also use the graphical tools like @command{gitview} or @command{gitk}
+or the web interface available at @url{http://source.ffmpeg.org/}.
 
 @section Checking source tree status
 
@@ -148,6 +164,7 @@ git diff --check
 to double check your changes before committing them to avoid trouble later
 on. All experienced developers do this on each and every commit, no matter
 how small.
+
 Every one of them has been saved from looking like a fool by this many times.
 It's very easy for stray debug output or cosmetic modifications to slip in,
 please avoid problems through this extra level of scrutiny.
@@ -170,14 +187,21 @@ to make sure you don't have untracked files or deletions.
 git add [-i|-p|-A] <filenames/dirnames>
 @end example
 
-Make sure you have told git your name and email address
+Make sure you have told Git your name, email address and GPG key
 
 @example
 git config --global user.name "My Name"
 git config --global user.email my@@email.invalid
+git config --global user.signingkey ABCDEF0123245
+@end example
+
+Enable signing all commits or use -S
+
+@example
+git config --global commit.gpgsign true
 @end example
 
-Use @var{--global} to set the global configuration for all your git checkouts.
+Use @option{--global} to set the global configuration for all your Git checkouts.
 
 Git will select the changes to the files for commit. Optionally you can use
 the interactive or the patch mode to select hunk by hunk what should be
@@ -200,15 +224,45 @@ git config --global core.editor
 or set by one of the following environment variables:
 @var{GIT_EDITOR}, @var{VISUAL} or @var{EDITOR}.
 
-Log messages should be concise but descriptive. Explain why you made a change,
-what you did will be obvious from the changes themselves most of the time.
-Saying just "bug fix" or "10l" is bad. Remember that people of varying skill
-levels look at and educate themselves while reading through your code. Don't
-include filenames in log messages, Git provides that information.
+@section Writing a commit message
+
+Log messages should be concise but descriptive.
+
+The first line must contain the context, a colon and a very short
+summary of what the commit does. Details can be added, if necessary,
+separated by an empty line. These details should not exceed 60-72 characters
+per line, except when containing code.
+
+Example of a good commit message:
 
-Possibly make the commit message have a terse, descriptive first line, an
-empty line and then a full description. The first line will be used to name
-the patch by git format-patch.
+@example
+avcodec/cbs: add a helper to read extradata within packet side data
+
+Using ff_cbs_read() on the raw buffer will not parse it as extradata,
+resulting in parsing errors for example when handling ISOBMFF avcC.
+This helper works around that.
+@end example
+
+@example
+ptr might be NULL
+@end example
+
+If the summary on the first line is not enough, in the body of the message,
+explain why you made a change, what you did will be obvious from the changes
+themselves most of the time. Saying just "bug fix" or "10l" is bad. Remember
+that people of varying skill levels look at and educate themselves while
+reading through your code. Don't include filenames in log messages except in
+the context, Git provides that information.
+
+If the commit fixes a registered issue, state it in a separate line of the
+body: @code{Fix Trac ticket #42.}
+
+The first line will be used to name
+the patch by @command{git format-patch}.
+
+Common mistakes for the first line, as seen in @command{git log --oneline}
+include: missing context at the beginning; description of what the code did
+before the patch; line too long or wrapped to the second line.
 
 @section Preparing a patchset
 
@@ -299,7 +353,7 @@ the current branch history.
 git commit --amend
 @end example
 
-allows to amend the last commit details quickly.
+allows one to amend the last commit details quickly.
 
 @example
 git rebase -i origin/master
@@ -324,12 +378,14 @@ faulty commit disappear from the history.
 @section Pushing changes to remote trees
 
 @example
-git push
+git push origin master --dry-run
 @end example
 
-Will push the changes to the default remote (@var{origin}).
+Will simulate a push of the local master branch to the default remote
+(@var{origin}). And list which branches and ranges or commits would have been
+pushed.
 Git will prevent you from pushing changes if the local and remote trees are
-out of sync. Refer to and to sync the local tree.
+out of sync. Refer to @ref{Updating the source tree to the latest revision}.
 
 @example
 git remote add <name> <url>
@@ -348,23 +404,24 @@ branches matching the local ones.
 
 @section Finding a specific svn revision
 
-Since version 1.7.1 git supports @var{:/foo} syntax for specifying commits
+Since version 1.7.1 Git supports @samp{:/foo} syntax for specifying commits
 based on a regular expression. see man gitrevisions
 
 @example
 git show :/'as revision 23456'
 @end example
 
-will show the svn changeset @var{r23456}. With older git versions searching in
+will show the svn changeset @samp{r23456}. With older Git versions searching in
 the @command{git log} output is the easiest option (especially if a pager with
 search capabilities is used).
+
 This commit can be checked out with
 
 @example
 git checkout -b svn_23456 :/'as revision 23456'
 @end example
 
-or for git < 1.7.1 with
+or for Git < 1.7.1 with
 
 @example
 git checkout -b svn_23456 $SHA1
@@ -373,7 +430,20 @@ git checkout -b svn_23456 $SHA1
 where @var{$SHA1} is the commit hash from the @command{git log} output.
 
 
-@chapter pre-push checklist
+@chapter gpg key generation
+
+If you have no gpg key yet, we recommend that you create a ed25519 based key as it
+is small, fast and secure. Especially it results in small signatures in git.
+
+@example
+gpg --default-new-key-algo "ed25519/cert,sign+cv25519/encr" --quick-generate-key "human@@server.com"
+@end example
+
+When generating a key, make sure the email specified matches the email used in git as some sites like
+github consider mismatches a reason to declare such commits unverified. After generating a key you
+can add it to the MAINTAINER file and upload it to a keyserver.
+
+@chapter Pre-push checklist
 
 Once you have a set of commits that you feel are ready for pushing,
 work through the following checklist to doublecheck everything is in
@@ -384,21 +454,21 @@ Apply your common sense, but if in doubt, err on the side of caution.
 First, make sure that the commits and branches you are going to push
 match what you want pushed and that nothing is missing, extraneous or
 wrong. You can see what will be pushed by running the git push command
-with --dry-run first. And then inspecting the commits listed with
+with @option{--dry-run} first. And then inspecting the commits listed with
 @command{git log -p 1234567..987654}. The @command{git status} command
 may help in finding local changes that have been forgotten to be added.
 
-Next let the code pass through a full run of our testsuite.
+Next let the code pass through a full run of our test suite.
 
 @itemize
 @item @command{make distclean}
 @item @command{/path/to/ffmpeg/configure}
-@item @command{make check}
+@item @command{make fate}
 @item if fate fails due to missing samples run @command{make fate-rsync} and retry
 @end itemize
 
 Make sure all your changes have been checked before pushing them, the
-testsuite only checks against regressions and that only to some extend. It does
+test suite only checks against regressions and that only to some extend. It does
 obviously not check newly added features/code to be working unless you have
 added a test for that (which is recommended).
 
@@ -411,5 +481,5 @@ recommended.
 
 @chapter Server Issues
 
-Contact the project admins @email{root@@ffmpeg.org} if you have technical
-problems with the GIT server.
+Contact the project admins at @email{root@@ffmpeg.org} if you have technical
+problems with the Git server.