Merge branch 'fc/unpack-trees-leakfix'
authorJunio C Hamano <gitster@pobox.com>
Wed, 4 Sep 2013 19:36:41 +0000 (12:36 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Sep 2013 19:36:42 +0000 (12:36 -0700)
* fc/unpack-trees-leakfix:
unpack-trees: plug a memory leak

60 files changed:
Documentation/CodingGuidelines
Documentation/RelNotes/1.8.4.txt
Documentation/RelNotes/1.8.5.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/git-check-attr.txt
Documentation/git-check-ref-format.txt
Documentation/git-gc.txt
Documentation/git-merge-file.txt
Documentation/git-rev-parse.txt
Documentation/git-stash.txt
Documentation/git-whatchanged.txt
Documentation/git.txt
Documentation/gitcore-tutorial.txt
Documentation/revisions.txt
Documentation/technical/http-protocol.txt [new file with mode: 0644]
GIT-VERSION-GEN
Makefile
RelNotes
builtin/check-attr.c
builtin/check-ignore.c
builtin/for-each-ref.c
builtin/gc.c
builtin/pack-objects.c
builtin/rev-parse.c
builtin/rm.c
builtin/tar-tree.c
compat/apple-common-crypto.h [new file with mode: 0644]
compat/mingw.c
config.c
contrib/completion/git-completion.bash
contrib/completion/git-prompt.sh
contrib/examples/git-log.sh [new file with mode: 0755]
contrib/examples/git-whatchanged.sh [new file with mode: 0755]
contrib/remote-helpers/git-remote-hg
diff.c
editor.c
fast-import.c
fetch-pack.c
git-compat-util.h
git-p4.py
git-sh-setup.sh
git-stash.sh
imap-send.c
perl/Git.pm
perl/Git/SVN/Fetcher.pm
po/TEAMS
po/fr.po
quote.c
quote.h
refs.c
sha1_file.c
sha1_name.c
t/t0070-fundamental.sh
t/t1508-at-combinations.sh
t/t3404-rebase-interactive.sh
t/t3903-stash.sh
t/t5500-fetch-pack.sh
t/t9300-fast-import.sh
t/t9902-completion.sh
templates/hooks--pre-push.sample
index 559d5f9ebf6fefe57b403327ed3e06942d0b822b..e5ca3b75d3778308ee1b7b20e3a86475244f7b96 100644 (file)
@@ -242,6 +242,14 @@ Writing Documentation:
  processed into HTML and manpages (e.g. git.html and git.1 in the
  same directory).
 
+ The documentation liberally mixes US and UK English (en_US/UK)
+ norms for spelling and grammar, which is somewhat unfortunate.
+ In an ideal world, it would have been better if it consistently
+ used only one and not the other, and we would have picked en_US
+ (if you wish to correct the English of some of the existing
+ documentation, please see the documentation-related advice in the
+ Documentation/SubmittingPatches file).
+
  Every user-visible change should be reflected in the documentation.
  The same general rule as for code applies -- imitate the existing
  conventions.  A few commented examples follow to provide reference
index b0a59ec23443f2a59b9eedc63d009809ab107271..02f681b71051a9c964511d8f317b024f4bf1c74e 100644 (file)
@@ -198,9 +198,6 @@ UI, Workflows & Features
    response was to stash them and re-run).  This introduced a corner
    case breakage to "git am --abort" but it has been fixed.
 
- * Instead of typing four capital letters "HEAD", you can say "@" now,
-   e.g. "git log @".
-
  * "check-ignore" (new feature since 1.8.2) has been updated to work
    more like "check-attr" over bidi-pipes.
 
@@ -270,7 +267,7 @@ Performance, Internal Implementation, etc.
    been susceptible to lossage of refs under right conditions, which
    has been tightened up.
 
- * We read loose and packed rerferences in two steps, but after
+ * We read loose and packed references in two steps, but after
    deciding to read a loose ref but before actually opening it to read
    it, another process racing with us can unlink it, which would cause
    us to barf.  The codepath has been updated to retry when such a
@@ -372,12 +369,6 @@ details).
    the user to an unexpected place.
    (merge 3bed291 rr/rebase-checkout-reflog later to maint).
 
- * "git stash save", when your local change turns a tracked file into
-   a directory, has to remove files in that directory in order to
-   revert your working tree to a pristine state.  This will lose
-   untracked files in such a directory, and the command now requires
-   you to "--force" it.
-
  * The configuration variable column.ui was poorly documented.
    (merge 5e62cc1 rr/column-doc later to maint).
 
@@ -388,7 +379,7 @@ details).
 
  * "git apply" parsed patches that add new files, generated by
    programs other than Git, incorrectly.  This is an old breakage in
-   v1.7.11 and will need to be merged down to the maintanance tracks.
+   v1.7.11 and will need to be merged down to the maintenance tracks.
 
  * Older cURL wanted piece of memory we call it with to be stable, but
    we updated the auth material after handing it to a call.
diff --git a/Documentation/RelNotes/1.8.5.txt b/Documentation/RelNotes/1.8.5.txt
new file mode 100644 (file)
index 0000000..2202399
--- /dev/null
@@ -0,0 +1,86 @@
+Git v1.8.5 Release Notes
+========================
+
+Backward compatibility notes (for Git 2.0)
+------------------------------------------
+
+When "git push [$there]" does not say what to push, we have used the
+traditional "matching" semantics so far (all your branches were sent
+to the remote as long as there already are branches of the same name
+over there).  In Git 2.0, the default will change to the "simple"
+semantics that pushes:
+
+ - only the current branch to the branch with the same name, and only
+   when the current branch is set to integrate with that remote
+   branch, if you are pushing to the same remote as you fetch from; or
+
+ - only the current branch to the branch with the same name, if you
+   are pushing to a remote that is not where you usually fetch from.
+
+Use the user preference configuration variable "push.default" to
+change this.  If you are an old-timer who is used to the "matching"
+semantics, you can set the variable to "matching" to keep the
+traditional behaviour.  If you want to live in the future early, you
+can set it to "simple" today without waiting for Git 2.0.
+
+When "git add -u" (and "git add -A") is run inside a subdirectory and
+does not specify which paths to add on the command line, it
+will operate on the entire tree in Git 2.0 for consistency
+with "git commit -a" and other commands.  There will be no
+mechanism to make plain "git add -u" behave like "git add -u .".
+Current users of "git add -u" (without a pathspec) should start
+training their fingers to explicitly say "git add -u ."
+before Git 2.0 comes.  A warning is issued when these commands are
+run without a pathspec and when you have local changes outside the
+current directory, because the behaviour in Git 2.0 will be different
+from today's version in such a situation.
+
+In Git 2.0, "git add <path>" will behave as "git add -A <path>", so
+that "git add dir/" will notice paths you removed from the directory
+and record the removal.  Versions before Git 2.0, including this
+release, will keep ignoring removals, but the users who rely on this
+behaviour are encouraged to start using "git add --ignore-removal <path>"
+now before 2.0 is released.
+
+
+Updates since v1.8.4
+--------------------
+
+Foreign interfaces, subsystems and ports.
+
+
+UI, Workflows & Features
+
+ * "git whatchanged" may still be used by old timers, but mention of
+   it in documents meant for new users will only waste readers' time
+   wonderig what the difference is between it and "git log".  Make it
+   less prominent in the general part of the documentation and explain
+   that it is merely a "git log" with different default behaviour in
+   its own document.
+
+
+Performance, Internal Implementation, etc.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v1.8.4
+------------------
+
+Unless otherwise noted, all the fixes since v1.8.4 in the maintenance
+track are contained in this release (see release notes to them for
+details).
+
+ * Some people still use rather old versions of bash, which cannot
+   grok some constructs like 'printf -v varname' the prompt and
+   completion code started to use recently.
+   (merge a44aa69 bc/completion-for-bash-3.0 later to maint).
+
+ * Code to read configuration from a blob object did not compile on
+   platforms with fgetc() etc. implemented as macros.
+   (merge 49d6cfa hv/config-from-blob later to maint-1.8.3).
+
+ * The recent "short-cut clone connectivity check" topic broke a
+   shallow repository when a fetch operation tries to auto-follow tags.
+   (merge 6da8bdc nd/fetch-pack-shallow-fix later to maint-1.8.3).
index d0a4733e456777d97555ffd475799b468dc8b9de..705557689d7fa46f88f936bb8c42471ffbfb052b 100644 (file)
@@ -65,7 +65,20 @@ feature does not trigger when it shouldn't.  Also make sure that the
 test suite passes after your commit.  Do not forget to update the
 documentation to describe the updated behaviour.
 
-Oh, another thing.  I am picky about whitespaces.  Make sure your
+Speaking of the documentation, it is currently a liberal mixture of US
+and UK English norms for spelling and grammar, which is somewhat
+unfortunate.  A huge patch that touches the files all over the place
+only to correct the inconsistency is not welcome, though.  Potential
+clashes with other changes that can result from such a patch are not
+worth it.  We prefer to gradually reconcile the inconsistencies in
+favor of US English, with small and easily digestible patches, as a
+side effect of doing some other real work in the vicinity (e.g.
+rewriting a paragraph for clarity, while turning en_UK spelling to
+en_US).  Obvious typographical fixes are much more welcomed ("teh ->
+"the"), preferably submitted as independent patches separate from
+other documentation changes.
+
+Oh, another thing.  We are picky about whitespaces.  Make sure your
 changes do not trigger errors with the sample pre-commit hook shipped
 in templates/hooks--pre-commit.  To help ensure this does not happen,
 run git diff --check on your changes before you commit.
index a7be80d48bf6fd6928186116f00f3b48cf564041..00e2aa2df259d449602f59cbec33599346ebd8a0 100644 (file)
@@ -31,8 +31,9 @@ OPTIONS
        Read file names from stdin instead of from the command-line.
 
 -z::
-       Only meaningful with `--stdin`; paths are separated with a
-       NUL character instead of a linefeed character.
+       The output format is modified to be machine-parseable.
+       If `--stdin` is also given, input paths are separated
+       with a NUL character instead of a linefeed character.
 
 \--::
        Interpret all preceding arguments as attributes and all following
@@ -48,6 +49,10 @@ OUTPUT
 The output is of the form:
 <path> COLON SP <attribute> COLON SP <info> LF
 
+unless `-z` is in effect, in which case NUL is used as delimiter:
+<path> NUL <attribute> NUL <info> NUL
+
+
 <path> is the path of a file being queried, <attribute> is an attribute
 being queried and <info> can be either:
 
index fc02959ba4ab1ae6acc3dc5f707e870e42144f1c..a49be1bab49ddcdb65e4b45b578bd183a94657a5 100644 (file)
@@ -54,8 +54,6 @@ Git imposes the following rules on how references are named:
 
 . They cannot contain a sequence `@{`.
 
-. They cannot be the single character `@`.
-
 . They cannot contain a `\`.
 
 These rules make it easy for shell script based tools to parse
index 2402ed68280ded314c340e394da64b3372038113..e158a3b31fce6b7573a3f549a3d9e0ecbf1cdff2 100644 (file)
@@ -9,7 +9,7 @@ git-gc - Cleanup unnecessary files and optimize the local repository
 SYNOPSIS
 --------
 [verse]
-'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]
+'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force]
 
 DESCRIPTION
 -----------
@@ -72,6 +72,10 @@ automatic consolidation of packs.
 --quiet::
        Suppress all progress reports.
 
+--force::
+       Force `git gc` to run even if there may be another `git gc`
+       instance running on this repository.
+
 Configuration
 -------------
 
index d7db2a3737fbdb032747bc6dd2740be1a56dfced..d2fc12ec77b85a5c9457cbfa160e5c05c1a32f43 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 [verse]
 'git merge-file' [-L <current-name> [-L <base-name> [-L <other-name>]]]
        [--ours|--theirs|--union] [-p|--stdout] [-q|--quiet] [--marker-size=<n>]
-       <current-file> <base-file> <other-file>
+       [--[no-]diff3] <current-file> <base-file> <other-file>
 
 
 DESCRIPTION
@@ -66,6 +66,9 @@ OPTIONS
 -q::
        Quiet; do not warn about conflicts.
 
+--diff3::
+       Show conflicts in "diff3" style.
+
 --ours::
 --theirs::
 --union::
index 2b126c0a77f9901eea1ba5ac37a2fb2d66c4d21f..d068a653778d6713d6ab370379dadf0d6f754856 100644 (file)
@@ -24,9 +24,23 @@ distinguish between them.
 
 OPTIONS
 -------
+
+Operation Modes
+~~~~~~~~~~~~~~~
+
+Each of these options must appear first on the command line.
+
 --parseopt::
        Use 'git rev-parse' in option parsing mode (see PARSEOPT section below).
 
+--sq-quote::
+       Use 'git rev-parse' in shell quoting mode (see SQ-QUOTE
+       section below). In contrast to the `--sq` option below, this
+       mode does only quoting. Nothing else is done to command input.
+
+Options for --parseopt
+~~~~~~~~~~~~~~~~~~~~~~
+
 --keep-dashdash::
        Only meaningful in `--parseopt` mode. Tells the option parser to echo
        out the first `--` met instead of skipping it.
@@ -36,10 +50,8 @@ OPTIONS
        the first non-option argument.  This can be used to parse sub-commands
        that take options themselves.
 
---sq-quote::
-       Use 'git rev-parse' in shell quoting mode (see SQ-QUOTE
-       section below). In contrast to the `--sq` option below, this
-       mode does only quoting. Nothing else is done to command input.
+Options for Filtering
+~~~~~~~~~~~~~~~~~~~~~
 
 --revs-only::
        Do not output flags and parameters not meant for
@@ -55,6 +67,9 @@ OPTIONS
 --no-flags::
        Do not output flag parameters.
 
+Options for Output
+~~~~~~~~~~~~~~~~~~
+
 --default <arg>::
        If there is no parameter given by the user, use `<arg>`
        instead.
@@ -110,6 +125,17 @@ can be used.
        strip '{caret}' prefix from the object names that already have
        one.
 
+--abbrev-ref[=(strict|loose)]::
+       A non-ambiguous short name of the objects name.
+       The option core.warnAmbiguousRefs is used to select the strict
+       abbreviation mode.
+
+--short::
+--short=number::
+       Instead of outputting the full SHA-1 values of object names try to
+       abbreviate them to a shorter unique name. When no length is specified
+       7 is used. The minimum length is 4.
+
 --symbolic::
        Usually the object names are output in SHA-1 form (with
        possible '{caret}' prefix); this option makes them output in a
@@ -123,16 +149,8 @@ can be used.
        unfortunately named tag "master"), and show them as full
        refnames (e.g. "refs/heads/master").
 
---abbrev-ref[=(strict|loose)]::
-       A non-ambiguous short name of the objects name.
-       The option core.warnAmbiguousRefs is used to select the strict
-       abbreviation mode.
-
---disambiguate=<prefix>::
-       Show every object whose name begins with the given prefix.
-       The <prefix> must be at least 4 hexadecimal digits long to
-       avoid listing each and every object in the repository by
-       mistake.
+Options for Objects
+~~~~~~~~~~~~~~~~~~~
 
 --all::
        Show all refs found in `refs/`.
@@ -155,18 +173,20 @@ shown.  If the pattern does not contain a globbing character (`?`,
        character (`?`, `*`, or `[`), it is turned into a prefix
        match by appending `/*`.
 
---show-toplevel::
-       Show the absolute path of the top-level directory.
+--disambiguate=<prefix>::
+       Show every object whose name begins with the given prefix.
+       The <prefix> must be at least 4 hexadecimal digits long to
+       avoid listing each and every object in the repository by
+       mistake.
 
---show-prefix::
-       When the command is invoked from a subdirectory, show the
-       path of the current directory relative to the top-level
-       directory.
+Options for Files
+~~~~~~~~~~~~~~~~~
 
---show-cdup::
-       When the command is invoked from a subdirectory, show the
-       path of the top-level directory relative to the current
-       directory (typically a sequence of "../", or an empty string).
+--local-env-vars::
+       List the GIT_* environment variables that are local to the
+       repository (e.g. GIT_DIR or GIT_WORK_TREE, but not GIT_EDITOR).
+       Only the names of the variables are listed, not their value,
+       even if they are set.
 
 --git-dir::
        Show `$GIT_DIR` if defined. Otherwise show the path to
@@ -188,17 +208,27 @@ print a message to stderr and exit with nonzero status.
 --is-bare-repository::
        When the repository is bare print "true", otherwise "false".
 
---local-env-vars::
-       List the GIT_* environment variables that are local to the
-       repository (e.g. GIT_DIR or GIT_WORK_TREE, but not GIT_EDITOR).
-       Only the names of the variables are listed, not their value,
-       even if they are set.
+--resolve-git-dir <path>::
+       Check if <path> is a valid repository or a gitfile that
+       points at a valid repository, and print the location of the
+       repository.  If <path> is a gitfile then the resolved path
+       to the real repository is printed.
 
---short::
---short=number::
-       Instead of outputting the full SHA-1 values of object names try to
-       abbreviate them to a shorter unique name. When no length is specified
-       7 is used. The minimum length is 4.
+--show-cdup::
+       When the command is invoked from a subdirectory, show the
+       path of the top-level directory relative to the current
+       directory (typically a sequence of "../", or an empty string).
+
+--show-prefix::
+       When the command is invoked from a subdirectory, show the
+       path of the current directory relative to the top-level
+       directory.
+
+--show-toplevel::
+       Show the absolute path of the top-level directory.
+
+Other Options
+~~~~~~~~~~~~~
 
 --since=datestring::
 --after=datestring::
@@ -213,12 +243,6 @@ print a message to stderr and exit with nonzero status.
 <args>...::
        Flags and parameters to be parsed.
 
---resolve-git-dir <path>::
-       Check if <path> is a valid repository or a gitfile that
-       points at a valid repository, and print the location of the
-       repository.  If <path> is a gitfile then the resolved path
-       to the real repository is printed.
-
 
 include::revisions.txt[]
 
index 7c8b648fbe8f76d523f781699447586c838b12fc..db7e803038090510609a6534ab7d086245c15270 100644 (file)
@@ -14,8 +14,7 @@ SYNOPSIS
 'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
 'git stash' branch <branchname> [<stash>]
 'git stash' [save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
-            [-u|--include-untracked] [-a|--all] [-f|--force]
-            [<message>]]
+            [-u|--include-untracked] [-a|--all] [<message>]]
 'git stash' clear
 'git stash' create [<message>]
 'git stash' store [-m|--message <message>] [-q|--quiet] <commit>
@@ -45,7 +44,7 @@ is also possible).
 OPTIONS
 -------
 
-save [-p|--patch] [--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-f|--force] [<message>]::
+save [-p|--patch] [--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
 
        Save your local modifications to a new 'stash', and run `git reset
        --hard` to revert them.  The <message> part is optional and gives
@@ -72,13 +71,6 @@ linkgit:git-add[1] to learn how to operate the `--patch` mode.
 +
 The `--patch` option implies `--keep-index`.  You can use
 `--no-keep-index` to override this.
-+
-In some cases, saving a stash could mean irretrievably removing some
-data - if a directory with untracked files replaces a tracked file of
-the same name, the new untracked files are not saved (except in case
-of `--include-untracked`) but the original tracked file shall be restored.
-By default, `stash save` will abort in such a case; `--force` will allow
-it to remove the untracked files.
 
 list [<options>]::
 
index c600b61e2b62013366476807c733837c0e854165..8b63ceb00e71a5e2f09cf7686b0978dcf71d1e03 100644 (file)
@@ -13,43 +13,17 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-Shows commit logs and diff output each commit introduces.  The
-command internally invokes 'git rev-list' piped to
-'git diff-tree', and takes command line options for both of
-these commands.
 
-This manual page describes only the most frequently used options.
+Shows commit logs and diff output each commit introduces.
 
+New users are encouraged to use linkgit:git-log[1] instead.  The
+`whatchanged` command is essentially the same as linkgit:git-log[1]
+but defaults to show the raw format diff output and to skip merges.
 
-OPTIONS
--------
--p::
-       Show textual diffs, instead of the Git internal diff
-       output format that is useful only to tell the changed
-       paths and their nature of changes.
+The command is kept primarily for historical reasons; fingers of
+many people who learned Git long before `git log` was invented by
+reading Linux kernel mailing list are trained to type it.
 
--<n>::
-       Limit output to <n> commits.
-
-<since>..<until>::
-       Limit output to between the two named commits (bottom
-       exclusive, top inclusive).
-
--r::
-       Show Git internal diff output, but for the whole tree,
-       not just the top level.
-
--m::
-       By default, differences for merge commits are not shown.
-       With this flag, show differences to that commit from all
-       of its parents.
-+
-However, it is not very useful in general, although it
-*is* useful on a file-by-file basis.
-
-include::pretty-options.txt[]
-
-include::pretty-formats.txt[]
 
 Examples
 --------
index 3bdd56e8f41bbe1fa695c5ef03a7c6d253e7af62..83edf308b1f7b9779bfc409ab518a812eb231275 100644 (file)
@@ -43,6 +43,11 @@ unreleased) version of Git, that is available from 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
+* link:v1.8.4/git.html[documentation for release 1.8.4]
+
+* release notes for
+  link:RelNotes/1.8.4.txt[1.8.4].
+
 * link:v1.8.3.4/git.html[documentation for release 1.8.3.4]
 
 * release notes for
@@ -818,7 +823,7 @@ for further details.
 'GIT_FLUSH'::
        If this environment variable is set to "1", then commands such
        as 'git blame' (in incremental mode), 'git rev-list', 'git log',
-       'git check-attr', 'git check-ignore', and 'git whatchanged' will
+       'git check-attr' and 'git check-ignore' will
        force a flush of the output stream after each record have been
        flushed. If this
        variable is set to "0", the output of these commands will be done
index f538a870c72dec8a022c23d5023cf5252e9925cf..058a3529809e41dfaf29dc510c2cb626dedb5402 100644 (file)
@@ -534,42 +534,9 @@ all, but just show the actual commit message.
 
 In fact, together with the 'git rev-list' program (which generates a
 list of revisions), 'git diff-tree' ends up being a veritable fount of
-changes. A trivial (but very useful) script called 'git whatchanged' is
-included with Git which does exactly this, and shows a log of recent
-activities.
-
-To see the whole history of our pitiful little git-tutorial project, you
-can do
-
-----------------
-$ git log
-----------------
-
-which shows just the log messages, or if we want to see the log together
-with the associated patches use the more complex (and much more
-powerful)
-
-----------------
-$ git whatchanged -p
-----------------
-
-and you will see exactly what has changed in the repository over its
-short history.
-
-[NOTE]
-When using the above two commands, the initial commit will be shown.
-If this is a problem because it is huge, you can hide it by setting
-the log.showroot configuration variable to false. Having this, you
-can still show it for each command just adding the `--root` option,
-which is a flag for 'git diff-tree' accepted by both commands.
-
-With that, you should now be having some inkling of what Git does, and
-can explore on your own.
-
-[NOTE]
-Most likely, you are not directly using the core
-Git Plumbing commands, but using Porcelain such as 'git add', `git-rm'
-and `git-commit'.
+changes.  You can emulate `git log`, `git log -p`, etc. with a trivial
+script that pipes the output of `git rev-list` to `git diff-tree --stdin`,
+which was exactly how early versions of `git log` were implemented.
 
 
 Tagging a version
index 09896a37b1a7b735b0defc9d2c7eb2a14cc713ab..d477b3f6bcb2c410952b573421d28189d1d1a790 100644 (file)
@@ -58,9 +58,6 @@ the '$GIT_DIR/refs' directory or from the '$GIT_DIR/packed-refs' file.
 While the ref name encoding is unspecified, UTF-8 is preferred as
 some output processing may assume ref names in UTF-8.
 
-'@'::
-  '@' alone is a shortcut for 'HEAD'.
-
 '<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}'::
   A ref followed by the suffix '@' with a date specification
   enclosed in a brace
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
new file mode 100644 (file)
index 0000000..a1173ee
--- /dev/null
@@ -0,0 +1,503 @@
+HTTP transfer protocols
+=======================
+
+Git supports two HTTP based transfer protocols.  A "dumb" protocol
+which requires only a standard HTTP server on the server end of the
+connection, and a "smart" protocol which requires a Git aware CGI
+(or server module).  This document describes both protocols.
+
+As a design feature smart clients can automatically upgrade "dumb"
+protocol URLs to smart URLs.  This permits all users to have the
+same published URL, and the peers automatically select the most
+efficient transport available to them.
+
+
+URL Format
+----------
+
+URLs for Git repositories accessed by HTTP use the standard HTTP
+URL syntax documented by RFC 1738, so they are of the form:
+
+  http://<host>:<port>/<path>?<searchpart>
+
+Within this documentation the placeholder $GIT_URL will stand for
+the http:// repository URL entered by the end-user.
+
+Servers SHOULD handle all requests to locations matching $GIT_URL, as
+both the "smart" and "dumb" HTTP protocols used by Git operate
+by appending additional path components onto the end of the user
+supplied $GIT_URL string.
+
+An example of a dumb client requesting for a loose object:
+
+  $GIT_URL:     http://example.com:8080/git/repo.git
+  URL request:  http://example.com:8080/git/repo.git/objects/d0/49f6c27a2244e12041955e262a404c7faba355
+
+An example of a smart request to a catch-all gateway:
+
+  $GIT_URL:     http://example.com/daemon.cgi?svc=git&q=
+  URL request:  http://example.com/daemon.cgi?svc=git&q=/info/refs&service=git-receive-pack
+
+An example of a request to a submodule:
+
+  $GIT_URL:     http://example.com/git/repo.git/path/submodule.git
+  URL request:  http://example.com/git/repo.git/path/submodule.git/info/refs
+
+Clients MUST strip a trailing '/', if present, from the user supplied
+$GIT_URL string to prevent empty path tokens ('//') from appearing
+in any URL sent to a server.  Compatible clients MUST expand
+'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'.
+
+
+Authentication
+--------------
+
+Standard HTTP authentication is used if authentication is required
+to access a repository, and MAY be configured and enforced by the
+HTTP server software.
+
+Because Git repositories are accessed by standard path components
+server administrators MAY use directory based permissions within
+their HTTP server to control repository access.
+
+Clients SHOULD support Basic authentication as described by RFC 2616.
+Servers SHOULD support Basic authentication by relying upon the
+HTTP server placed in front of the Git server software.
+
+Servers SHOULD NOT require HTTP cookies for the purposes of
+authentication or access control.
+
+Clients and servers MAY support other common forms of HTTP based
+authentication, such as Digest authentication.
+
+
+SSL
+---
+
+Clients and servers SHOULD support SSL, particularly to protect
+passwords when relying on Basic HTTP authentication.
+
+
+Session State
+-------------
+
+The Git over HTTP protocol (much like HTTP itself) is stateless
+from the perspective of the HTTP server side.  All state MUST be
+retained and managed by the client process.  This permits simple
+round-robin load-balancing on the server side, without needing to
+worry about state management.
+
+Clients MUST NOT require state management on the server side in
+order to function correctly.
+
+Servers MUST NOT require HTTP cookies in order to function correctly.
+Clients MAY store and forward HTTP cookies during request processing
+as described by RFC 2616 (HTTP/1.1).  Servers SHOULD ignore any
+cookies sent by a client.
+
+
+General Request Processing
+--------------------------
+
+Except where noted, all standard HTTP behavior SHOULD be assumed
+by both client and server.  This includes (but is not necessarily
+limited to):
+
+If there is no repository at $GIT_URL, or the resource pointed to by a
+location matching $GIT_URL does not exist, the server MUST NOT respond
+with '200 OK' response.  A server SHOULD respond with
+'404 Not Found', '410 Gone', or any other suitable HTTP status code
+which does not imply the resource exists as requested.
+
+If there is a repository at $GIT_URL, but access is not currently
+permitted, the server MUST respond with the '403 Forbidden' HTTP
+status code.
+
+Servers SHOULD support both HTTP 1.0 and HTTP 1.1.
+Servers SHOULD support chunked encoding for both request and response
+bodies.
+
+Clients SHOULD support both HTTP 1.0 and HTTP 1.1.
+Clients SHOULD support chunked encoding for both request and response
+bodies.
+
+Servers MAY return ETag and/or Last-Modified headers.
+
+Clients MAY revalidate cached entities by including If-Modified-Since
+and/or If-None-Match request headers.
+
+Servers MAY return '304 Not Modified' if the relevant headers appear
+in the request and the entity has not changed.  Clients MUST treat
+'304 Not Modified' identical to '200 OK' by reusing the cached entity.
+
+Clients MAY reuse a cached entity without revalidation if the
+Cache-Control and/or Expires header permits caching.  Clients and
+servers MUST follow RFC 2616 for cache controls.
+
+
+Discovering References
+----------------------
+
+All HTTP clients MUST begin either a fetch or a push exchange by
+discovering the references available on the remote repository.
+
+Dumb Clients
+~~~~~~~~~~~~
+
+HTTP clients that only support the "dumb" protocol MUST discover
+references by making a request for the special info/refs file of
+the repository.
+
+Dumb HTTP clients MUST make a GET request to $GIT_URL/info/refs,
+without any search/query parameters.
+
+   C: GET $GIT_URL/info/refs HTTP/1.0
+
+   S: 200 OK
+   S:
+   S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
+   S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
+   S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
+   S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
+
+The Content-Type of the returned info/refs entity SHOULD be
+"text/plain; charset=utf-8", but MAY be any content type.
+Clients MUST NOT attempt to validate the returned Content-Type.
+Dumb servers MUST NOT return a return type starting with
+"application/x-git-".
+
+Cache-Control headers MAY be returned to disable caching of the
+returned entity.
+
+When examining the response clients SHOULD only examine the HTTP
+status code.  Valid responses are '200 OK', or '304 Not Modified'.
+
+The returned content is a UNIX formatted text file describing
+each ref and its known value.  The file SHOULD be sorted by name
+according to the C locale ordering.  The file SHOULD NOT include
+the default ref named 'HEAD'.
+
+  info_refs   =  *( ref_record )
+  ref_record  =  any_ref / peeled_ref
+
+  any_ref     =  obj-id HTAB refname LF
+  peeled_ref  =  obj-id HTAB refname LF
+                obj-id HTAB refname "^{}" LF
+
+Smart Clients
+~~~~~~~~~~~~~
+
+HTTP clients that support the "smart" protocol (or both the
+"smart" and "dumb" protocols) MUST discover references by making
+a parameterized request for the info/refs file of the repository.
+
+The request MUST contain exactly one query parameter,
+'service=$servicename', where $servicename MUST be the service
+name the client wishes to contact to complete the operation.
+The request MUST NOT contain additional query parameters.
+
+   C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
+
+   dumb server reply:
+   S: 200 OK
+   S:
+   S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
+   S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
+   S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
+   S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
+
+   smart server reply:
+   S: 200 OK
+   S: Content-Type: application/x-git-upload-pack-advertisement
+   S: Cache-Control: no-cache
+   S:
+   S: 001e# service=git-upload-pack\n
+   S: 004895dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint\0multi_ack\n
+   S: 0042d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master\n
+   S: 003c2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0\n
+   S: 003fa3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}\n
+
+Dumb Server Response
+^^^^^^^^^^^^^^^^^^^^
+Dumb servers MUST respond with the dumb server reply format.
+
+See the prior section under dumb clients for a more detailed
+description of the dumb server response.
+
+Smart Server Response
+^^^^^^^^^^^^^^^^^^^^^
+If the server does not recognize the requested service name, or the
+requested service name has been disabled by the server administrator,
+the server MUST respond with the '403 Forbidden' HTTP status code.
+
+Otherwise, smart servers MUST respond with the smart server reply
+format for the requested service name.
+
+Cache-Control headers SHOULD be used to disable caching of the
+returned entity.
+
+The Content-Type MUST be 'application/x-$servicename-advertisement'.
+Clients SHOULD fall back to the dumb protocol if another content
+type is returned.  When falling back to the dumb protocol clients
+SHOULD NOT make an additional request to $GIT_URL/info/refs, but
+instead SHOULD use the response already in hand.  Clients MUST NOT
+continue if they do not support the dumb protocol.
+
+Clients MUST validate the status code is either '200 OK' or
+'304 Not Modified'.
+
+Clients MUST validate the first five bytes of the response entity
+matches the regex "^[0-9a-f]{4}#".  If this test fails, clients
+MUST NOT continue.
+
+Clients MUST parse the entire response as a sequence of pkt-line
+records.
+
+Clients MUST verify the first pkt-line is "# service=$servicename".
+Servers MUST set $servicename to be the request parameter value.
+Servers SHOULD include an LF at the end of this line.
+Clients MUST ignore an LF at the end of the line.
+
+Servers MUST terminate the response with the magic "0000" end
+pkt-line marker.
+
+The returned response is a pkt-line stream describing each ref and
+its known value.  The stream SHOULD be sorted by name according to
+the C locale ordering.  The stream SHOULD include the default ref
+named 'HEAD' as the first ref.  The stream MUST include capability
+declarations behind a NUL on the first ref.
+
+  smart_reply     =  PKT-LINE("# service=$servicename" LF)
+                    ref_list
+                    "0000"
+  ref_list        =  empty_list / non_empty_list
+
+  empty_list      =  PKT-LINE(zero-id SP "capabilities^{}" NUL cap-list LF)
+
+  non_empty_list  =  PKT-LINE(obj-id SP name NUL cap_list LF)
+                    *ref_record
+
+  cap-list        =  capability *(SP capability)
+  capability      =  1*(LC_ALPHA / DIGIT / "-" / "_")
+  LC_ALPHA        =  %x61-7A
+
+  ref_record      =  any_ref / peeled_ref
+  any_ref         =  PKT-LINE(obj-id SP name LF)
+  peeled_ref      =  PKT-LINE(obj-id SP name LF)
+                    PKT-LINE(obj-id SP name "^{}" LF
+
+Smart Service git-upload-pack
+------------------------------
+This service reads from the repository pointed to by $GIT_URL.
+
+Clients MUST first perform ref discovery with
+'$GIT_URL/info/refs?service=git-upload-pack'.
+
+   C: POST $GIT_URL/git-upload-pack HTTP/1.0
+   C: Content-Type: application/x-git-upload-pack-request
+   C:
+   C: 0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7\n
+   C: 0032have 441b40d833fdfa93eb2908e52742248faf0ee993\n
+   C: 0000
+
+   S: 200 OK
+   S: Content-Type: application/x-git-upload-pack-result
+   S: Cache-Control: no-cache
+   S:
+   S: ....ACK %s, continue
+   S: ....NAK
+
+Clients MUST NOT reuse or revalidate a cached reponse.
+Servers MUST include sufficient Cache-Control headers
+to prevent caching of the response.
+
+Servers SHOULD support all capabilities defined here.
+
+Clients MUST send at least one 'want' command in the request body.
+Clients MUST NOT reference an id in a 'want' command which did not
+appear in the response obtained through ref discovery unless the
+server advertises capability "allow-tip-sha1-in-want".
+
+  compute_request   =  want_list
+                      have_list
+                      request_end
+  request_end       =  "0000" / "done"
+
+  want_list         =  PKT-LINE(want NUL cap_list LF)
+                      *(want_pkt)
+  want_pkt          =  PKT-LINE(want LF)
+  want              =  "want" SP id
+  cap_list          =  *(SP capability) SP
+
+  have_list         =  *PKT-LINE("have" SP id LF)
+
+TODO: Document this further.
+TODO: Don't use uppercase for variable names below.
+
+The Negotiation Algorithm
+~~~~~~~~~~~~~~~~~~~~~~~~~
+The computation to select the minimal pack proceeds as follows
+(c = client, s = server):
+
+ init step:
+ (c) Use ref discovery to obtain the advertised refs.
+ (c) Place any object seen into set ADVERTISED.
+
+ (c) Build an empty set, COMMON, to hold the objects that are later
+     determined to be on both ends.
+ (c) Build a set, WANT, of the objects from ADVERTISED the client
+     wants to fetch, based on what it saw during ref discovery.
+
+ (c) Start a queue, C_PENDING, ordered by commit time (popping newest
+     first).  Add all client refs.  When a commit is popped from
+     the queue its parents SHOULD be automatically inserted back.
+     Commits MUST only enter the queue once.
+
+ one compute step:
+ (c) Send one $GIT_URL/git-upload-pack request:
+
+   C: 0032want <WANT #1>...............................
+   C: 0032want <WANT #2>...............................
+   ....
+   C: 0032have <COMMON #1>.............................
+   C: 0032have <COMMON #2>.............................
+   ....
+   C: 0032have <HAVE #1>...............................
+   C: 0032have <HAVE #2>...............................
+   ....
+   C: 0000
+
+     The stream is organized into "commands", with each command
+     appearing by itself in a pkt-line.  Within a command line
+     the text leading up to the first space is the command name,
+     and the remainder of the line to the first LF is the value.
+     Command lines are terminated with an LF as the last byte of
+     the pkt-line value.
+
+     Commands MUST appear in the following order, if they appear
+     at all in the request stream:
+
+       * want
+       * have
+
+     The stream is terminated by a pkt-line flush ("0000").
+
+     A single "want" or "have" command MUST have one hex formatted
+     SHA-1 as its value.  Multiple SHA-1s MUST be sent by sending
+     multiple commands.
+
+     The HAVE list is created by popping the first 32 commits
+     from C_PENDING.  Less can be supplied if C_PENDING empties.
+
+     If the client has sent 256 HAVE commits and has not yet
+     received one of those back from S_COMMON, or the client has
+     emptied C_PENDING it SHOULD include a "done" command to let
+     the server know it won't proceed:
+
+   C: 0009done
+
+  (s) Parse the git-upload-pack request:
+
+      Verify all objects in WANT are directly reachable from refs.
+
+      The server MAY walk backwards through history or through
+      the reflog to permit slightly stale requests.
+
+      If no WANT objects are received, send an error:
+
+TODO: Define error if no want lines are requested.
+
+      If any WANT object is not reachable, send an error:
+
+TODO: Define error if an invalid want is requested.
+
+     Create an empty list, S_COMMON.
+
+     If 'have' was sent:
+
+     Loop through the objects in the order supplied by the client.
+     For each object, if the server has the object reachable from
+     a ref, add it to S_COMMON.  If a commit is added to S_COMMON,
+     do not add any ancestors, even if they also appear in HAVE.
+
+  (s) Send the git-upload-pack response:
+
+     If the server has found a closed set of objects to pack or the
+     request ends with "done", it replies with the pack.
+
+TODO: Document the pack based response
+   S: PACK...
+
+     The returned stream is the side-band-64k protocol supported
+     by the git-upload-pack service, and the pack is embedded into
+     stream 1.  Progress messages from the server side MAY appear
+     in stream 2.
+
+     Here a "closed set of objects" is defined to have at least
+     one path from every WANT to at least one COMMON object.
+
+     If the server needs more information, it replies with a
+     status continue response:
+
+TODO: Document the non-pack response
+
+  (c) Parse the upload-pack response:
+
+TODO: Document parsing response
+
+      Do another compute step.
+
+
+Smart Service git-receive-pack
+------------------------------
+This service reads from the repository pointed to by $GIT_URL.
+
+Clients MUST first perform ref discovery with
+'$GIT_URL/info/refs?service=git-receive-pack'.
+
+   C: POST $GIT_URL/git-receive-pack HTTP/1.0
+   C: Content-Type: application/x-git-receive-pack-request
+   C:
+   C: ....0a53e9ddeaddad63ad106860237bbf53411d11a7 441b40d833fdfa93eb2908e52742248faf0ee993 refs/heads/maint\0 report-status
+   C: 0000
+   C: PACK....
+
+   S: 200 OK
+   S: Content-Type: application/x-git-receive-pack-result
+   S: Cache-Control: no-cache
+   S:
+   S: ....
+
+Clients MUST NOT reuse or revalidate a cached reponse.
+Servers MUST include sufficient Cache-Control headers
+to prevent caching of the response.
+
+Servers SHOULD support all capabilities defined here.
+
+Clients MUST send at least one command in the request body.
+Within the command portion of the request body clients SHOULD send
+the id obtained through ref discovery as old_id.
+
+  update_request  =  command_list
+                    "PACK" <binary data>
+
+  command_list    =  PKT-LINE(command NUL cap_list LF)
+                    *(command_pkt)
+  command_pkt     =  PKT-LINE(command LF)
+  cap_list        =  *(SP capability) SP
+
+  command         =  create / delete / update
+  create          =  zero-id SP new_id SP name
+  delete          =  old_id SP zero-id SP name
+  update          =  old_id SP new_id SP name
+
+TODO: Document this further.
+
+
+References
+----------
+
+link:http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
+link:http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
+link:technical/pack-protocol.txt
+link:technical/protocol-capabilities.txt
index 12fef58cbb069967a42c234c6979eb17d8d5ef8a..b444c18f176cb33a80a1378586d6fa54bccd112a 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.8.4-rc3
+DEF_VER=v1.8.4.GIT
 
 LF='
 '
index 3588ca1b6a575e8bb732dcc04b7c59dcb7f15cf4..7051956333422b5d355528568706e4a675d1a246 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1182,6 +1182,9 @@ ifdef NEEDS_SSL_WITH_CRYPTO
 else
        LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
 endif
+ifdef APPLE_COMMON_CRYPTO
+       LIB_4_CRYPTO += -framework Security -framework CoreFoundation
+endif
 endif
 ifdef NEEDS_LIBICONV
        ifdef ICONVDIR
index fce99fb79d16cbeb717ddbe36c7be231a00e4eba..61c3b54134d985cef6071014604d5b0499712df5 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.8.4.txt
\ No newline at end of file
+Documentation/RelNotes/1.8.5.txt
\ No newline at end of file
index 075d01d30c58d40abb48ff820ba6f8d310f785d0..cd46690ec71531cf5fd475814e3423d3f428025d 100644 (file)
@@ -13,14 +13,14 @@ N_("git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"),
 NULL
 };
 
-static int null_term_line;
+static int nul_term_line;
 
 static const struct option check_attr_options[] = {
        OPT_BOOLEAN('a', "all", &all_attrs, N_("report all attributes set on file")),
        OPT_BOOLEAN(0,  "cached", &cached_attrs, N_("use .gitattributes only from the index")),
        OPT_BOOLEAN(0 , "stdin", &stdin_paths, N_("read file names from stdin")),
-       OPT_BOOLEAN('z', NULL, &null_term_line,
-               N_("input paths are terminated by a null character")),
+       OPT_BOOLEAN('z', NULL, &nul_term_line,
+                   N_("terminate input and output records by a NUL character")),
        OPT_END()
 };
 
@@ -38,8 +38,16 @@ static void output_attr(int cnt, struct git_attr_check *check,
                else if (ATTR_UNSET(value))
                        value = "unspecified";
 
-               quote_c_style(file, NULL, stdout, 0);
-               printf(": %s: %s\n", git_attr_name(check[j].attr), value);
+               if (nul_term_line) {
+                       printf("%s%c" /* path */
+                              "%s%c" /* attrname */
+                              "%s%c" /* attrvalue */,
+                              file, 0, git_attr_name(check[j].attr), 0, value, 0);
+               } else {
+                       quote_c_style(file, NULL, stdout, 0);
+                       printf(": %s: %s\n", git_attr_name(check[j].attr), value);
+               }
+
        }
 }
 
@@ -65,7 +73,7 @@ static void check_attr_stdin_paths(const char *prefix, int cnt,
        struct git_attr_check *check)
 {
        struct strbuf buf, nbuf;
-       int line_termination = null_term_line ? 0 : '\n';
+       int line_termination = nul_term_line ? 0 : '\n';
 
        strbuf_init(&buf, 0);
        strbuf_init(&nbuf, 0);
index 4a8fc707c747596e31dcc6f57abf5f965cdf612f..503a559b18bf03aa7d78c2b408289da6297e0cff 100644 (file)
@@ -12,7 +12,7 @@ static const char * const check_ignore_usage[] = {
 NULL
 };
 
-static int null_term_line;
+static int nul_term_line;
 
 static const struct option check_ignore_options[] = {
        OPT__QUIET(&quiet, N_("suppress progress reporting")),
@@ -20,8 +20,8 @@ static const struct option check_ignore_options[] = {
        OPT_GROUP(""),
        OPT_BOOLEAN(0, "stdin", &stdin_paths,
                    N_("read file names from stdin")),
-       OPT_BOOLEAN('z', NULL, &null_term_line,
-                   N_("input paths are terminated by a null character")),
+       OPT_BOOLEAN('z', NULL, &nul_term_line,
+                   N_("terminate input and output records by a NUL character")),
        OPT_BOOLEAN('n', "non-matching", &show_non_matching,
                    N_("show non-matching input paths")),
        OPT_END()
@@ -31,7 +31,7 @@ static void output_exclude(const char *path, struct exclude *exclude)
 {
        char *bang  = (exclude && exclude->flags & EXC_FLAG_NEGATIVE)  ? "!" : "";
        char *slash = (exclude && exclude->flags & EXC_FLAG_MUSTBEDIR) ? "/" : "";
-       if (!null_term_line) {
+       if (!nul_term_line) {
                if (!verbose) {
                        write_name_quoted(path, stdout, '\n');
                } else {
@@ -107,7 +107,7 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix)
 {
        struct strbuf buf, nbuf;
        char *pathspec[2] = { NULL, NULL };
-       int line_termination = null_term_line ? 0 : '\n';
+       int line_termination = nul_term_line ? 0 : '\n';
        int num_ignored = 0;
 
        strbuf_init(&buf, 0);
@@ -142,7 +142,7 @@ int cmd_check_ignore(int argc, const char **argv, const char *prefix)
                if (argc > 0)
                        die(_("cannot specify pathnames with --stdin"));
        } else {
-               if (null_term_line)
+               if (nul_term_line)
                        die(_("-z only makes sense with --stdin"));
                if (argc == 0)
                        die(_("no path specified"));
index 7f059c31dfbd11f77c891134ccc34cdc1f65bcb8..1d4083c2ddef07c6488d36720e6a0c48b04c6585 100644 (file)
@@ -867,24 +867,29 @@ static void sort_refs(struct ref_sort *sort, struct refinfo **refs, int num_refs
 static void print_value(struct refinfo *ref, int atom, int quote_style)
 {
        struct atom_value *v;
+       struct strbuf sb = STRBUF_INIT;
        get_value(ref, atom, &v);
        switch (quote_style) {
        case QUOTE_NONE:
                fputs(v->s, stdout);
                break;
        case QUOTE_SHELL:
-               sq_quote_print(stdout, v->s);
+               sq_quote_buf(&sb, v->s);
                break;
        case QUOTE_PERL:
-               perl_quote_print(stdout, v->s);
+               perl_quote_buf(&sb, v->s);
                break;
        case QUOTE_PYTHON:
-               python_quote_print(stdout, v->s);
+               python_quote_buf(&sb, v->s);
                break;
        case QUOTE_TCL:
-               tcl_quote_print(stdout, v->s);
+               tcl_quote_buf(&sb, v->s);
                break;
        }
+       if (quote_style != QUOTE_NONE) {
+               fputs(sb.buf, stdout);
+               strbuf_release(&sb);
+       }
 }
 
 static int hex1(char ch)
index 6be6c8d65b26c9149aac2b6c1de6e3217c6ceea7..6e0d81ab32aa691d24dc86ba30f3bc282bdc2890 100644 (file)
@@ -167,11 +167,69 @@ static int need_to_gc(void)
        return 1;
 }
 
+/* return NULL on success, else hostname running the gc */
+static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
+{
+       static struct lock_file lock;
+       static char locking_host[128];
+       char my_host[128];
+       struct strbuf sb = STRBUF_INIT;
+       struct stat st;
+       uintmax_t pid;
+       FILE *fp;
+       int fd, should_exit;
+
+       if (gethostname(my_host, sizeof(my_host)))
+               strcpy(my_host, "unknown");
+
+       fd = hold_lock_file_for_update(&lock, git_path("gc.pid"),
+                                      LOCK_DIE_ON_ERROR);
+       if (!force) {
+               fp = fopen(git_path("gc.pid"), "r");
+               memset(locking_host, 0, sizeof(locking_host));
+               should_exit =
+                       fp != NULL &&
+                       !fstat(fileno(fp), &st) &&
+                       /*
+                        * 12 hour limit is very generous as gc should
+                        * never take that long. On the other hand we
+                        * don't really need a strict limit here,
+                        * running gc --auto one day late is not a big
+                        * problem. --force can be used in manual gc
+                        * after the user verifies that no gc is
+                        * running.
+                        */
+                       time(NULL) - st.st_mtime <= 12 * 3600 &&
+                       fscanf(fp, "%"PRIuMAX" %127c", &pid, locking_host) == 2 &&
+                       /* be gentle to concurrent "gc" on remote hosts */
+                       (strcmp(locking_host, my_host) || !kill(pid, 0));
+               if (fp != NULL)
+                       fclose(fp);
+               if (should_exit) {
+                       if (fd >= 0)
+                               rollback_lock_file(&lock);
+                       *ret_pid = pid;
+                       return locking_host;
+               }
+       }
+
+       strbuf_addf(&sb, "%"PRIuMAX" %s",
+                   (uintmax_t) getpid(), my_host);
+       write_in_full(fd, sb.buf, sb.len);
+       strbuf_release(&sb);
+       commit_lock_file(&lock);
+
+       return NULL;
+}
+
 int cmd_gc(int argc, const char **argv, const char *prefix)
 {
        int aggressive = 0;
        int auto_gc = 0;
        int quiet = 0;
+       int force = 0;
+       const char *name;
+       pid_t pid;
 
        struct option builtin_gc_options[] = {
                OPT__QUIET(&quiet, N_("suppress progress reporting")),
@@ -180,6 +238,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                        PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire },
                OPT_BOOLEAN(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")),
                OPT_BOOLEAN(0, "auto", &auto_gc, N_("enable auto-gc mode")),
+               OPT_BOOL(0, "force", &force, N_("force running gc even if there may be another gc running")),
                OPT_END()
        };
 
@@ -225,6 +284,14 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
        } else
                add_repack_all_option();
 
+       name = lock_repo_for_gc(force, &pid);
+       if (name) {
+               if (auto_gc)
+                       return 0; /* be quiet on --auto */
+               die(_("gc is already running on machine '%s' pid %"PRIuMAX" (use --force if not)"),
+                   name, (uintmax_t)pid);
+       }
+
        if (pack_refs && run_command_v_opt(pack_refs_cmd.argv, RUN_GIT_CMD))
                return error(FAILED_RUN, pack_refs_cmd.argv[0]);
 
index f069462cb03bbae46dae8d6b97420b3726690c47..4eb0521c815870abb670e8ddb035caa9c6507e67 100644 (file)
@@ -1809,7 +1809,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
 static void try_to_free_from_threads(size_t size)
 {
        read_lock();
-       release_pack_memory(size, -1);
+       release_pack_memory(size);
        read_unlock();
 }
 
index de894c75773c78afb2c0f1ea4ea5aff8ec7de6bc..c9aa28fd75c6e4f995906c584ec185617ec76856 100644 (file)
@@ -486,21 +486,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
        if (argc > 1 && !strcmp("--sq-quote", argv[1]))
                return cmd_sq_quote(argc - 2, argv + 2);
 
-       if (argc == 2 && !strcmp("--local-env-vars", argv[1])) {
-               int i;
-               for (i = 0; local_repo_env[i]; i++)
-                       printf("%s\n", local_repo_env[i]);
-               return 0;
-       }
-
-       if (argc > 2 && !strcmp(argv[1], "--resolve-git-dir")) {
-               const char *gitdir = resolve_gitdir(argv[2]);
-               if (!gitdir)
-                       die("not a gitdir '%s'", argv[2]);
-               puts(gitdir);
-               return 0;
-       }
-
        if (argc > 1 && !strcmp("-h", argv[1]))
                usage(builtin_rev_parse_usage);
 
@@ -661,6 +646,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                for_each_remote_ref(show_reference, NULL);
                                continue;
                        }
+                       if (!strcmp(arg, "--local-env-vars")) {
+                               int i;
+                               for (i = 0; local_repo_env[i]; i++)
+                                       printf("%s\n", local_repo_env[i]);
+                               continue;
+                       }
                        if (!strcmp(arg, "--show-toplevel")) {
                                const char *work_tree = get_git_work_tree();
                                if (work_tree)
@@ -711,6 +702,13 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
                                continue;
                        }
+                       if (!strcmp(arg, "--resolve-git-dir")) {
+                               const char *gitdir = resolve_gitdir(argv[i+1]);
+                               if (!gitdir)
+                                       die("not a gitdir '%s'", argv[i+1]);
+                               puts(gitdir);
+                               continue;
+                       }
                        if (!strcmp(arg, "--is-inside-git-dir")) {
                                printf("%s\n", is_inside_git_dir() ? "true"
                                                : "false");
index 0df0b4d942c09769ff42539f6aaf83dcc31e20fb..d00eaf86d56c9efbd436458d46937b8b2c855ce4 100644 (file)
@@ -277,8 +277,8 @@ static struct option builtin_rm_options[] = {
 
 int cmd_rm(int argc, const char **argv, const char *prefix)
 {
-       int i, newfd;
-       const char **pathspec;
+       int i, newfd, seen_any;
+       const char **pathspec, *match;
        char *seen;
 
        git_config(git_default_config, NULL);
@@ -314,7 +314,6 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
        pathspec = get_pathspec(prefix, argv);
        refresh_index(&the_index, REFRESH_QUIET, pathspec, NULL, NULL);
 
-       seen = NULL;
        for (i = 0; pathspec[i] ; i++)
                /* nothing */;
        seen = xcalloc(i, 1);
@@ -328,27 +327,24 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
                list.entry[list.nr++].is_submodule = S_ISGITLINK(ce->ce_mode);
        }
 
-       if (pathspec) {
-               const char *match;
-               int seen_any = 0;
-               for (i = 0; (match = pathspec[i]) != NULL ; i++) {
-                       if (!seen[i]) {
-                               if (!ignore_unmatch) {
-                                       die(_("pathspec '%s' did not match any files"),
-                                           match);
-                               }
-                       }
-                       else {
-                               seen_any = 1;
+
+       seen_any = 0;
+       for (i = 0; (match = pathspec[i]) != NULL ; i++) {
+               if (!seen[i]) {
+                       if (!ignore_unmatch) {
+                               die(_("pathspec '%s' did not match any files"),
+                                   match);
                        }
-                       if (!recursive && seen[i] == MATCHED_RECURSIVELY)
-                               die(_("not removing '%s' recursively without -r"),
-                                   *match ? match : ".");
                }
-
-               if (! seen_any)
-                       exit(0);
+               else {
+                       seen_any = 1;
+               }
+               if (!recursive && seen[i] == MATCHED_RECURSIVELY)
+                       die(_("not removing '%s' recursively without -r"),
+                           *match ? match : ".");
        }
+       if (!seen_any)
+               exit(0);
 
        /*
         * If not forced, the file, the index and the HEAD (if exists)
index 3f1e7012db1af7d3695e6517956721a313229d65..ba3ffe69a95088d8f5e9978a754cb1f0ee364ba7 100644 (file)
@@ -26,8 +26,8 @@ int cmd_tar_tree(int argc, const char **argv, const char *prefix)
         * $0 tree-ish basedir ==>
         *      git archive --format-tar --prefix=basedir tree-ish
         */
-       int i;
        const char **nargv = xcalloc(sizeof(*nargv), argc + 3);
+       struct strbuf sb = STRBUF_INIT;
        char *basedir_arg;
        int nargc = 0;
 
@@ -65,11 +65,10 @@ int cmd_tar_tree(int argc, const char **argv, const char *prefix)
        fprintf(stderr,
                "*** \"git tar-tree\" is now deprecated.\n"
                "*** Running \"git archive\" instead.\n***");
-       for (i = 0; i < nargc; i++) {
-               fputc(' ', stderr);
-               sq_quote_print(stderr, nargv[i]);
-       }
-       fputc('\n', stderr);
+       sq_quote_argv(&sb, nargv, 0);
+       strbuf_addch(&sb, '\n');
+       fputs(sb.buf, stderr);
+       strbuf_release(&sb);
        return cmd_archive(nargc, nargv, prefix);
 }
 
diff --git a/compat/apple-common-crypto.h b/compat/apple-common-crypto.h
new file mode 100644 (file)
index 0000000..c8b9b0e
--- /dev/null
@@ -0,0 +1,86 @@
+/* suppress inclusion of conflicting openssl functions */
+#define OPENSSL_NO_MD5
+#define HEADER_HMAC_H
+#define HEADER_SHA_H
+#include <CommonCrypto/CommonHMAC.h>
+#define HMAC_CTX CCHmacContext
+#define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len)
+#define HMAC_Update CCHmacUpdate
+#define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash)
+#define HMAC_CTX_cleanup(ignore)
+#define EVP_md5(...) kCCHmacAlgMD5
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+#define APPLE_LION_OR_NEWER
+#include <Security/Security.h>
+/* Apple's TYPE_BOOL conflicts with config.c */
+#undef TYPE_BOOL
+#endif
+
+#ifdef APPLE_LION_OR_NEWER
+#define git_CC_error_check(pattern, err) \
+       do { \
+               if (err) { \
+                       die(pattern, (long)CFErrorGetCode(err)); \
+               } \
+       } while(0)
+
+#define EVP_EncodeBlock git_CC_EVP_EncodeBlock
+static inline int git_CC_EVP_EncodeBlock(unsigned char *out,
+               const unsigned char *in, int inlen)
+{
+       CFErrorRef err;
+       SecTransformRef encoder;
+       CFDataRef input, output;
+       CFIndex length;
+
+       encoder = SecEncodeTransformCreate(kSecBase64Encoding, &err);
+       git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
+
+       input = CFDataCreate(kCFAllocatorDefault, in, inlen);
+       SecTransformSetAttribute(encoder, kSecTransformInputAttributeName,
+                       input, &err);
+       git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
+
+       output = SecTransformExecute(encoder, &err);
+       git_CC_error_check("SecTransformExecute failed: %ld", err);
+
+       length = CFDataGetLength(output);
+       CFDataGetBytes(output, CFRangeMake(0, length), out);
+
+       CFRelease(output);
+       CFRelease(input);
+       CFRelease(encoder);
+
+       return (int)strlen((const char *)out);
+}
+
+#define EVP_DecodeBlock git_CC_EVP_DecodeBlock
+static int inline git_CC_EVP_DecodeBlock(unsigned char *out,
+               const unsigned char *in, int inlen)
+{
+       CFErrorRef err;
+       SecTransformRef decoder;
+       CFDataRef input, output;
+       CFIndex length;
+
+       decoder = SecDecodeTransformCreate(kSecBase64Encoding, &err);
+       git_CC_error_check("SecEncodeTransformCreate failed: %ld", err);
+
+       input = CFDataCreate(kCFAllocatorDefault, in, inlen);
+       SecTransformSetAttribute(decoder, kSecTransformInputAttributeName,
+                       input, &err);
+       git_CC_error_check("SecTransformSetAttribute failed: %ld", err);
+
+       output = SecTransformExecute(decoder, &err);
+       git_CC_error_check("SecTransformExecute failed: %ld", err);
+
+       length = CFDataGetLength(output);
+       CFDataGetBytes(output, CFRangeMake(0, length), out);
+
+       CFRelease(output);
+       CFRelease(input);
+       CFRelease(decoder);
+
+       return (int)strlen((const char *)out);
+}
+#endif /* APPLE_LION_OR_NEWER */
index bb92c436f70790ba907991f3307aa0fe4afdf0f5..22ee9ef1cfb388fdcb7a2686653a6b10359bca59 100644 (file)
@@ -1086,6 +1086,12 @@ int mingw_kill(pid_t pid, int sig)
                errno = err_win_to_posix(GetLastError());
                CloseHandle(h);
                return -1;
+       } else if (pid > 0 && sig == 0) {
+               HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+               if (h) {
+                       CloseHandle(h);
+                       return 0;
+               }
        }
 
        errno = EINVAL;
index e13a7b65e7615da7d788fddd001716a17baef5db..9f9bf0cc9a1405e938fddbedc44468782ad61021 100644 (file)
--- a/config.c
+++ b/config.c
@@ -27,9 +27,9 @@ struct config_source {
        struct strbuf value;
        struct strbuf var;
 
-       int (*fgetc)(struct config_source *c);
-       int (*ungetc)(int c, struct config_source *conf);
-       long (*ftell)(struct config_source *c);
+       int (*do_fgetc)(struct config_source *c);
+       int (*do_ungetc)(int c, struct config_source *conf);
+       long (*do_ftell)(struct config_source *c);
 };
 
 static struct config_source *cf;
@@ -217,13 +217,13 @@ int git_config_from_parameters(config_fn_t fn, void *data)
 
 static int get_next_char(void)
 {
-       int c = cf->fgetc(cf);
+       int c = cf->do_fgetc(cf);
 
        if (c == '\r') {
                /* DOS like systems */
-               c = cf->fgetc(cf);
+               c = cf->do_fgetc(cf);
                if (c != '\n') {
-                       cf->ungetc(c, cf);
+                       cf->do_ungetc(c, cf);
                        c = '\r';
                }
        }
@@ -992,9 +992,9 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
                top.u.file = f;
                top.name = filename;
                top.die_on_error = 1;
-               top.fgetc = config_file_fgetc;
-               top.ungetc = config_file_ungetc;
-               top.ftell = config_file_ftell;
+               top.do_fgetc = config_file_fgetc;
+               top.do_ungetc = config_file_ungetc;
+               top.do_ftell = config_file_ftell;
 
                ret = do_config_from(&top, fn, data);
 
@@ -1013,9 +1013,9 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
        top.u.buf.pos = 0;
        top.name = name;
        top.die_on_error = 0;
-       top.fgetc = config_buf_fgetc;
-       top.ungetc = config_buf_ungetc;
-       top.ftell = config_buf_ftell;
+       top.do_fgetc = config_buf_fgetc;
+       top.do_ungetc = config_buf_ungetc;
+       top.do_ftell = config_buf_ftell;
 
        return do_config_from(&top, fn, data);
 }
@@ -1196,7 +1196,7 @@ static int store_aux(const char *key, const char *value, void *cb)
                                return 1;
                        }
 
-                       store.offset[store.seen] = cf->ftell(cf);
+                       store.offset[store.seen] = cf->do_ftell(cf);
                        store.seen++;
                }
                break;
@@ -1223,19 +1223,19 @@ static int store_aux(const char *key, const char *value, void *cb)
                 * Do not increment matches: this is no match, but we
                 * just made sure we are in the desired section.
                 */
-               store.offset[store.seen] = cf->ftell(cf);
+               store.offset[store.seen] = cf->do_ftell(cf);
                /* fallthru */
        case SECTION_END_SEEN:
        case START:
                if (matches(key, value)) {
-                       store.offset[store.seen] = cf->ftell(cf);
+                       store.offset[store.seen] = cf->do_ftell(cf);
                        store.state = KEY_SEEN;
                        store.seen++;
                } else {
                        if (strrchr(key, '.') - key == store.baselen &&
                              !strncmp(key, store.key, store.baselen)) {
                                        store.state = SECTION_SEEN;
-                                       store.offset[store.seen] = cf->ftell(cf);
+                                       store.offset[store.seen] = cf->do_ftell(cf);
                        }
                }
        }
index 5da920ecd9ec1b64760db863d266fdc9c47502de..e1b73130723a57e7f641236331699e67bb0d4d82 100644 (file)
@@ -2580,7 +2580,7 @@ if [[ -n ${ZSH_VERSION-} ]]; then
                                --*=*|*.) ;;
                                *) c="$c " ;;
                                esac
-                               array[$#array+1]="$c"
+                               array[${#array[@]}+1]="$c"
                        done
                        compset -P '*[=:]'
                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
index a81ef5a482d48b114a81e242109e2f0dec0839ed..d6c61b2bdecc5ca89e21ece5df7c2e4bbec9373c 100644 (file)
 # the colored output of "git status -sb" and are available only when
 # using __git_ps1 for PROMPT_COMMAND or precmd.
 
+# check whether printf supports -v
+__git_printf_supports_v=
+printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
+
 # stores the divergence from upstream in $p
 # used by GIT_PS1_SHOWUPSTREAM
 __git_ps1_show_upstream ()
@@ -433,7 +437,7 @@ __git_ps1 ()
        local gitstring="$c${b##refs/heads/}${f:+$z$f}$r$p"
 
        if [ $pcmode = yes ]; then
-               if [[ -n ${ZSH_VERSION-} ]]; then
+               if [ "${__git_printf_supports_v-}" != yes ]; then
                        gitstring=$(printf -- "$printf_format" "$gitstring")
                else
                        printf -v gitstring -- "$printf_format" "$gitstring"
diff --git a/contrib/examples/git-log.sh b/contrib/examples/git-log.sh
new file mode 100755 (executable)
index 0000000..c2ea71c
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# Copyright (c) 2005 Linus Torvalds
+#
+
+USAGE='[--max-count=<n>] [<since>..<limit>] [--pretty=<format>] [git-rev-list options]'
+SUBDIRECTORY_OK='Yes'
+. git-sh-setup
+
+revs=$(git-rev-parse --revs-only --no-flags --default HEAD "$@") || exit
+[ "$revs" ] || {
+       die "No HEAD ref"
+}
+git-rev-list --pretty $(git-rev-parse --default HEAD "$@") |
+LESS=-S ${PAGER:-less}
diff --git a/contrib/examples/git-whatchanged.sh b/contrib/examples/git-whatchanged.sh
new file mode 100755 (executable)
index 0000000..1fb9feb
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+USAGE='[-p] [--max-count=<n>] [<since>..<limit>] [--pretty=<format>] [-m] [git-diff-tree options] [git-rev-list options]'
+SUBDIRECTORY_OK='Yes'
+. git-sh-setup
+
+diff_tree_flags=$(git-rev-parse --sq --no-revs --flags "$@") || exit
+case "$0" in
+*whatchanged)
+       count=
+       test -z "$diff_tree_flags" &&
+               diff_tree_flags=$(git-repo-config --get whatchanged.difftree)
+       diff_tree_default_flags='-c -M --abbrev' ;;
+*show)
+       count=-n1
+       test -z "$diff_tree_flags" &&
+               diff_tree_flags=$(git-repo-config --get show.difftree)
+       diff_tree_default_flags='--cc --always' ;;
+esac
+test -z "$diff_tree_flags" &&
+       diff_tree_flags="$diff_tree_default_flags"
+
+rev_list_args=$(git-rev-parse --sq --default HEAD --revs-only "$@") &&
+diff_tree_args=$(git-rev-parse --sq --no-revs --no-flags "$@") &&
+
+eval "git-rev-list $count $rev_list_args" |
+eval "git-diff-tree --stdin --pretty -r $diff_tree_flags $diff_tree_args" |
+LESS="$LESS -S" ${PAGER:-less}
index 0194c67fb1db1dc6fdd4bd90b67d04cfb7a34e1d..c27603965ab6970dd71003603d6a77e637a22ab5 100755 (executable)
@@ -391,11 +391,24 @@ def get_repo(url, alias):
             os.makedirs(dirname)
     else:
         shared_path = os.path.join(gitdir, 'hg')
-        if not os.path.exists(shared_path):
-            try:
-                hg.clone(myui, {}, url, shared_path, update=False, pull=True)
-            except:
-                die('Repository error')
+
+        # check and upgrade old organization
+        hg_path = os.path.join(shared_path, '.hg')
+        if os.path.exists(shared_path) and not os.path.exists(hg_path):
+            repos = os.listdir(shared_path)
+            for x in repos:
+                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
+                if not os.path.exists(local_hg):
+                    continue
+                if not os.path.exists(hg_path):
+                    shutil.move(local_hg, hg_path)
+                shutil.rmtree(os.path.join(shared_path, x, 'clone'))
+
+        # setup shared repo (if not there)
+        try:
+            hg.peer(myui, {}, shared_path, create=True)
+        except error.RepoError:
+            pass
 
         if not os.path.exists(dirname):
             os.makedirs(dirname)
@@ -1124,7 +1137,7 @@ def do_option(parser):
 
 def fix_path(alias, repo, orig_url):
     url = urlparse.urlparse(orig_url, 'file')
-    if url.scheme != 'file' or os.path.isabs(url.path):
+    if url.scheme != 'file' or os.path.isabs(os.path.expanduser(url.path)):
         return
     abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
     cmd = ['git', 'config', 'remote.%s.url' % alias, "hg::%s" % abs_url]
diff --git a/diff.c b/diff.c
index 266112ca6104450497fb9be504c2404cced595f0..061694b5ea9f860a03d569b7a6bc438b9bcbf8a7 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -669,7 +669,7 @@ static void emit_rewrite_diff(const char *name_a,
        memset(&ecbdata, 0, sizeof(ecbdata));
        ecbdata.color_diff = want_color(o->use_color);
        ecbdata.found_changesp = &o->found_changes;
-       ecbdata.ws_rule = whitespace_rule(name_b ? name_b : name_a);
+       ecbdata.ws_rule = whitespace_rule(name_b);
        ecbdata.opt = o;
        if (ecbdata.ws_rule & WS_BLANK_AT_EOF) {
                mmfile_t mf1, mf2;
@@ -2252,7 +2252,7 @@ static void builtin_diff(const char *name_a,
                        (!two->mode || S_ISGITLINK(two->mode))) {
                const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
                const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
-               show_submodule_summary(o->file, one ? one->path : two->path,
+               show_submodule_summary(o->file, one->path ? one->path : two->path,
                                line_prefix,
                                one->sha1, two->sha1, two->dirty_submodule,
                                meta, del, add, reset);
@@ -2372,7 +2372,7 @@ static void builtin_diff(const char *name_a,
                ecbdata.label_path = lbl;
                ecbdata.color_diff = want_color(o->use_color);
                ecbdata.found_changesp = &o->found_changes;
-               ecbdata.ws_rule = whitespace_rule(name_b ? name_b : name_a);
+               ecbdata.ws_rule = whitespace_rule(name_b);
                if (ecbdata.ws_rule & WS_BLANK_AT_EOF)
                        check_blank_at_eof(&mf1, &mf2, &ecbdata);
                ecbdata.opt = o;
index 27bdecdaf3d99d3179737e07be971d2458408660..0abbd8dc3a0ec91acd0c143b6d9b5ad41ac90417 100644 (file)
--- a/editor.c
+++ b/editor.c
@@ -37,7 +37,7 @@ int launch_editor(const char *path, struct strbuf *buffer, const char *const *en
                return error("Terminal is dumb, but EDITOR unset");
 
        if (strcmp(editor, ":")) {
-               const char *args[] = { editor, path, NULL };
+               const char *args[] = { editor, real_path(path), NULL };
                struct child_process p;
                int ret, sig;
 
index 23f625f561dfd664a460827d507e7c0b720e9849..21db3fc46d58231fd1345d65ae6cf1104901e55e 100644 (file)
@@ -1568,7 +1568,8 @@ static int tree_content_set(
 static int tree_content_remove(
        struct tree_entry *root,
        const char *p,
-       struct tree_entry *backup_leaf)
+       struct tree_entry *backup_leaf,
+       int allow_root)
 {
        struct tree_content *t;
        const char *slash1;
@@ -1583,6 +1584,12 @@ static int tree_content_remove(
 
        if (!root->tree)
                load_tree(root);
+
+       if (!*p && allow_root) {
+               e = root;
+               goto del_entry;
+       }
+
        t = root->tree;
        for (i = 0; i < t->entry_count; i++) {
                e = t->entries[i];
@@ -1599,7 +1606,7 @@ static int tree_content_remove(
                                goto del_entry;
                        if (!e->tree)
                                load_tree(e);
-                       if (tree_content_remove(e, slash1 + 1, backup_leaf)) {
+                       if (tree_content_remove(e, slash1 + 1, backup_leaf, 0)) {
                                for (n = 0; n < e->tree->entry_count; n++) {
                                        if (e->tree->entries[n]->versions[1].mode) {
                                                hashclr(root->versions[1].sha1);
@@ -1629,7 +1636,8 @@ static int tree_content_remove(
 static int tree_content_get(
        struct tree_entry *root,
        const char *p,
-       struct tree_entry *leaf)
+       struct tree_entry *leaf,
+       int allow_root)
 {
        struct tree_content *t;
        const char *slash1;
@@ -1641,31 +1649,39 @@ static int tree_content_get(
                n = slash1 - p;
        else
                n = strlen(p);
-       if (!n)
+       if (!n && !allow_root)
                die("Empty path component found in input");
 
        if (!root->tree)
                load_tree(root);
+
+       if (!n) {
+               e = root;
+               goto found_entry;
+       }
+
        t = root->tree;
        for (i = 0; i < t->entry_count; i++) {
                e = t->entries[i];
                if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
-                       if (!slash1) {
-                               memcpy(leaf, e, sizeof(*leaf));
-                               if (e->tree && is_null_sha1(e->versions[1].sha1))
-                                       leaf->tree = dup_tree_content(e->tree);
-                               else
-                                       leaf->tree = NULL;
-                               return 1;
-                       }
+                       if (!slash1)
+                               goto found_entry;
                        if (!S_ISDIR(e->versions[1].mode))
                                return 0;
                        if (!e->tree)
                                load_tree(e);
-                       return tree_content_get(e, slash1 + 1, leaf);
+                       return tree_content_get(e, slash1 + 1, leaf, 0);
                }
        }
        return 0;
+
+found_entry:
+       memcpy(leaf, e, sizeof(*leaf));
+       if (e->tree && is_null_sha1(e->versions[1].sha1))
+               leaf->tree = dup_tree_content(e->tree);
+       else
+               leaf->tree = NULL;
+       return 1;
 }
 
 static int update_branch(struct branch *b)
@@ -2179,7 +2195,7 @@ static uintmax_t do_change_note_fanout(
                        }
 
                        /* Rename fullpath to realpath */
-                       if (!tree_content_remove(orig_root, fullpath, &leaf))
+                       if (!tree_content_remove(orig_root, fullpath, &leaf, 0))
                                die("Failed to remove path %s", fullpath);
                        tree_content_set(orig_root, realpath,
                                leaf.versions[1].sha1,
@@ -2314,7 +2330,7 @@ static void file_change_m(struct branch *b)
 
        /* Git does not track empty, non-toplevel directories. */
        if (S_ISDIR(mode) && !memcmp(sha1, EMPTY_TREE_SHA1_BIN, 20) && *p) {
-               tree_content_remove(&b->branch_tree, p, NULL);
+               tree_content_remove(&b->branch_tree, p, NULL, 0);
                return;
        }
 
@@ -2375,7 +2391,7 @@ static void file_change_d(struct branch *b)
                        die("Garbage after path in: %s", command_buf.buf);
                p = uq.buf;
        }
-       tree_content_remove(&b->branch_tree, p, NULL);
+       tree_content_remove(&b->branch_tree, p, NULL, 1);
 }
 
 static void file_change_cr(struct branch *b, int rename)
@@ -2413,9 +2429,9 @@ static void file_change_cr(struct branch *b, int rename)
 
        memset(&leaf, 0, sizeof(leaf));
        if (rename)
-               tree_content_remove(&b->branch_tree, s, &leaf);
+               tree_content_remove(&b->branch_tree, s, &leaf, 1);
        else
-               tree_content_get(&b->branch_tree, s, &leaf);
+               tree_content_get(&b->branch_tree, s, &leaf, 1);
        if (!leaf.versions[1].mode)
                die("Path %s not in branch", s);
        if (!*d) {      /* C "path/to/subdir" "" */
@@ -2521,7 +2537,7 @@ static void note_change_n(struct branch *b, unsigned char *old_fanout)
        }
 
        construct_path_with_fanout(sha1_to_hex(commit_sha1), *old_fanout, path);
-       if (tree_content_remove(&b->branch_tree, path, NULL))
+       if (tree_content_remove(&b->branch_tree, path, NULL, 0))
                b->num_notes--;
 
        if (is_null_sha1(sha1))
@@ -3051,6 +3067,8 @@ static void parse_ls(struct branch *b)
                struct object_entry *e = parse_treeish_dataref(&p);
                root = new_tree_entry();
                hashcpy(root->versions[1].sha1, e->idx.sha1);
+               if (!is_null_sha1(root->versions[1].sha1))
+                       root->versions[1].mode = S_IFDIR;
                load_tree(root);
                if (*p++ != ' ')
                        die("Missing space after tree-ish: %s", command_buf.buf);
@@ -3065,7 +3083,7 @@ static void parse_ls(struct branch *b)
                        die("Garbage after path in: %s", command_buf.buf);
                p = uq.buf;
        }
-       tree_content_get(root, p, &leaf);
+       tree_content_get(root, p, &leaf, 1);
        /*
         * A directory in preparation would have a sha1 of zero
         * until it is saved.  Save, for simplicity.
index 6684348c0ec9ea742eb98666b56a0bfcef316560..f5d99c11813b1ae2eee0bb7dfd94eab60c721b64 100644 (file)
@@ -897,6 +897,8 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                packet_flush(fd[1]);
        if (args->depth > 0)
                setup_alternate_shallow();
+       else
+               alternate_shallow_file = NULL;
        if (get_pack(args, fd, pack_lockfile))
                die("git fetch-pack: fetch failed.");
 
@@ -987,7 +989,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
        }
        ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, pack_lockfile);
 
-       if (alternate_shallow_file) {
+       if (args->depth > 0 && alternate_shallow_file) {
                if (*alternate_shallow_file == '\0') { /* --unshallow */
                        unlink_or_warn(git_path("shallow"));
                        rollback_lock_file(&shallow_lock);
index 115cb1da42cc314f75a5b032d90798e5a2ce68c5..8752317fe9a52e0e3ba941c63484b00968b2b695 100644 (file)
@@ -330,6 +330,16 @@ extern NORETURN void die_errno(const char *err, ...) __attribute__((format (prin
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
+#ifndef NO_OPENSSL
+#ifdef APPLE_COMMON_CRYPTO
+#include "compat/apple-common-crypto.h"
+#else
+#include <openssl/evp.h>
+#include <openssl/hmac.h>
+#endif /* APPLE_COMMON_CRYPTO */
+#include <openssl/x509v3.h>
+#endif /* NO_OPENSSL */
+
 /*
  * Let callers be aware of the constant return value; this can help
  * gcc with -Wuninitialized analysis. We restrict this trick to gcc, though,
@@ -514,7 +524,7 @@ int inet_pton(int af, const char *src, void *dst);
 const char *inet_ntop(int af, const void *src, char *dst, size_t size);
 #endif
 
-extern void release_pack_memory(size_t, int);
+extern void release_pack_memory(size_t);
 
 typedef void (*try_to_free_t)(size_t);
 extern try_to_free_t set_try_to_free_routine(try_to_free_t);
index 31e71ff8b248339749bbcd045acdf602a1a21463..a53a6dc406c26daaf263944d38b53b27db271072 100755 (executable)
--- a/git-p4.py
+++ b/git-p4.py
@@ -2180,9 +2180,13 @@ def streamOneP4File(self, file, contents):
             git_mode = "100755"
         if type_base == "symlink":
             git_mode = "120000"
-            # p4 print on a symlink contains "target\n"; remove the newline
+            # p4 print on a symlink sometimes contains "target\n";
+            # if it does, remove the newline
             data = ''.join(contents)
-            contents = [data[:-1]]
+            if data[-1] == '\n':
+                contents = [data[:-1]]
+            else:
+                contents = [data]
 
         if type_base == "utf16":
             # p4 delivers different text in the python output to -G
index 7a964ad2ff70a8746c52ab30d945ebff95246edd..e15be516369e5e5a9096bb957966938e134e616c 100644 (file)
@@ -53,7 +53,7 @@ die () {
 die_with_status () {
        status=$1
        shift
-       echo >&2 "$*"
+       printf >&2 '%s\n' "$*"
        exit "$status"
 }
 
index 85c9e2c0817c171d67f7458a0764df8d31fb10ad..1e541a21257c70fa67c0fee552ccb05fc5b6a280 100755 (executable)
@@ -195,7 +195,6 @@ save_stash () {
        keep_index=
        patch_mode=
        untracked=
-       force=
        while test $# != 0
        do
                case "$1" in
@@ -216,9 +215,6 @@ save_stash () {
                -u|--include-untracked)
                        untracked=untracked
                        ;;
-               -f|--force)
-                       force=t
-                       ;;
                -a|--all)
                        untracked=all
                        ;;
@@ -262,14 +258,6 @@ save_stash () {
                say "$(gettext "No local changes to save")"
                exit 0
        fi
-       if test -z "$untracked$force" &&
-          test -n "$(git ls-files --killed | head -n 1)"
-       then
-               say "$(gettext "The following untracked files would NOT be saved but need to be removed by stash save:")"
-               test -n "$GIT_QUIET" || git ls-files --killed | sed 's/^/\t/'
-               say "$(gettext "Aborting. Consider using either the --force or --include-untracked option.")" >&2
-               exit 1
-       fi
        test -f "$GIT_DIR/logs/$ref_stash" ||
                clear_stash || die "$(gettext "Cannot initialize stash")"
 
index d6b65e204c6009e5c30f358810198319b70eda25..6f5cc4f782ea82fc14ee596c7bac96e2b6f907e7 100644 (file)
 #include "prompt.h"
 #ifdef NO_OPENSSL
 typedef void *SSL;
-#else
-#ifdef APPLE_COMMON_CRYPTO
-#include <CommonCrypto/CommonHMAC.h>
-#define HMAC_CTX CCHmacContext
-#define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len)
-#define HMAC_Update CCHmacUpdate
-#define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash)
-#define HMAC_CTX_cleanup(ignore)
-#define EVP_md5() kCCHmacAlgMD5
-#else
-#include <openssl/evp.h>
-#include <openssl/hmac.h>
-#endif
-#include <openssl/x509v3.h>
 #endif
 
 static const char imap_send_usage[] = "git imap-send < <mbox>";
index 7a252ef872c92213c8dcd2144a84cdcf787e586a..204fdc673754c82637c59992198a2c8d31e05fa8 100644 (file)
@@ -61,7 +61,7 @@ =head1 SYNOPSIS
                 remote_refs prompt
                 get_tz_offset
                 credential credential_read credential_write
-                temp_acquire temp_release temp_reset temp_path);
+                temp_acquire temp_is_locked temp_release temp_reset temp_path);
 
 
 =head1 DESCRIPTION
@@ -1206,6 +1206,35 @@ sub temp_acquire {
        $temp_fd;
 }
 
+=item temp_is_locked ( NAME )
+
+Returns true if the internal lock created by a previous C<temp_acquire()>
+call with C<NAME> is still in effect.
+
+When temp_acquire is called on a C<NAME>, it internally locks the temporary
+file mapped to C<NAME>.  That lock will not be released until C<temp_release()>
+is called with either the original C<NAME> or the L<File::Handle> that was
+returned from the original call to temp_acquire.
+
+Subsequent attempts to call C<temp_acquire()> with the same C<NAME> will fail
+unless there has been an intervening C<temp_release()> call for that C<NAME>
+(or its corresponding L<File::Handle> that was returned by the original
+C<temp_acquire()> call).
+
+If true is returned by C<temp_is_locked()> for a C<NAME>, an attempt to
+C<temp_acquire()> the same C<NAME> will cause an error unless
+C<temp_release> is first called on that C<NAME> (or its corresponding
+L<File::Handle> that was returned by the original C<temp_acquire()> call).
+
+=cut
+
+sub temp_is_locked {
+       my ($self, $name) = _maybe_self(@_);
+       my $temp_fd = \$TEMP_FILEMAP{$name};
+
+       defined $$temp_fd && $$temp_fd->opened && $TEMP_FILES{$$temp_fd}{locked};
+}
+
 =item temp_release ( NAME )
 
 =item temp_release ( FILEHANDLE )
index bd174189b98fda05f781697be26db94c9cd53364..10edb27732f439e5290a7b354efefeb10d219669 100644 (file)
@@ -315,11 +315,13 @@ sub change_file_prop {
 sub apply_textdelta {
        my ($self, $fb, $exp) = @_;
        return undef if $self->is_path_ignored($fb->{path});
-       my $fh = $::_repository->temp_acquire('svn_delta');
+       my $suffix = 0;
+       ++$suffix while $::_repository->temp_is_locked("svn_delta_${$}_$suffix");
+       my $fh = $::_repository->temp_acquire("svn_delta_${$}_$suffix");
        # $fh gets auto-closed() by SVN::TxDelta::apply(),
        # (but $base does not,) so dup() it for reading in close_file
        open my $dup, '<&', $fh or croak $!;
-       my $base = $::_repository->temp_acquire('git_blob');
+       my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix");
 
        if ($fb->{blob}) {
                my ($base_is_link, $size);
index 297fc8a529217bc5bb097d967f7c7ce1eb5d2caf..107aa5917cac70b715d8bdac1d0e83a2f5da2d3d 100644 (file)
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -15,6 +15,7 @@ Members:      Thomas Rast <trast@student.ethz.ch>
 Language:      fr (French)
 Repository:    https://github.com/jnavila/git
 Leader:                Jean-Noël Avila <jn.avila@free.fr>
+Members:       Sébastien Helleu <flashcode@flashtux.org>
 
 Language:      is (Icelandic)
 Leader:                Ã†var Arnfjörð Bjarmason <avarab@gmail.com>
index fa98cfe4cff6f31fdd4618222471c6b049cc0cea..2cdb6f93a3b683ff4d25bdc711b330844e24d7d0 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,15 +1,63 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# French translations for Git.
+# Copyright (C) 2013 Jean-Noël Avila <jn.avila@free.fr>
+# This file is distributed under the same license as the Git package.
+# Jean-Noël Avila <jn.avila@free.fr>, 2013.
+# Sébastien Helleu <flashcode@flashtux.org>, 2013.
+#
+# French translations of common Git words used in this file:
+#
+#   English          |  French
+#   -----------------+---------------------------------
+#   #NN              |  n°NN
+#   a commit         |  un commit
+#   backward         |
+#     compatibility  |  rétrocompatibilité
+#   bare repository  |  dépôt nu
+#   bisect           |  bissection
+#   blob             |  blob
+#   bug              |  bogue
+#   bundle           |  colis
+#   cherry-pick      |  picorer
+#   dangling         |  en suspens
+#   debugging        |  débogage
+#   fast-forward     |  avance rapide
+#   fast-forwarded   |  mis Ã  jour en avance rapide
+#   glob             |  glob
+#   hash             |  hachage
+#   HEAD             |  HEAD (genre féminin)
+#   hook             |  hook
+#   hunk             |  section
+#   merge            |  fusion
+#   pattern          |  motif
+#   repository       |  dépôt
+#   remote           |  distante (ou serveur distant)
+#   revision         |  révision
+#   stash            |  remisage
+#   tag              |  Ã©tiquette
+#   template         |  modèle
+#   to checkout      |  extraire
+#   to commit        |  valider
+#   to fetch         |  rapatrier
+#   to prune         |  Ã©laguer
+#   to push          |  pousser
+#   to rebase        |  rebaser
+#   to stash         |  remiser
+#   to track         |  suivre
+#   to unstage       |  désindexer
+#   tree-ish         |  arbre
+#   upstream         |  amont
+#   worktree /       |
+#   work(ing) tree   |  copie de travail
 #
 msgid ""
-msgstr "Project-Id-Version: git\n"
+msgstr ""
+"Project-Id-Version: git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
 "POT-Creation-Date: 2013-04-30 08:25+0800\n"
-"PO-Revision-Date: 2013-07-02 22:28+0100\n"
-"Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
+"PO-Revision-Date: 2013-08-27 19:43+0200\n"
+"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
 "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -19,7 +67,7 @@ msgstr "Project-Id-Version: git\n"
 #: advice.c:53
 #, c-format
 msgid "hint: %.*s\n"
-msgstr "astuce: %*s\n"
+msgstr "astuce: %.*s\n"
 
 #.
 #. * Message used both when 'git commit' fails and when
@@ -31,8 +79,9 @@ msgid ""
 "and then use 'git add/rm <file>' as\n"
 "appropriate to mark resolution and make a commit,\n"
 "or use 'git commit -a'."
-msgstr "Corrigez-les dans l'espace de travail,\n"
-"et utilisez 'git add/rm <fichier>' comme\n"
+msgstr ""
+"Corrigez-les dans la copie de travail,\n"
+"et utilisez 'git add/rm <fichier>' si\n"
 "nécessaire pour marquer la résolution et valider,\n"
 "ou utilisez 'git commit -a'."
 
@@ -47,7 +96,7 @@ msgstr "git archive --list"
 #: archive.c:12
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
-msgstr "git archive --remote <dépot> [--exec <commande>] [options] <arbre> [<chemin>...]"
+msgstr "git archive --remote <dépôt> [--exec <commande>] [options] <arbre> [<chemin>...]"
 
 #: archive.c:13
 msgid "git archive --remote <repo> [--exec <cmd>] --list"
@@ -67,7 +116,7 @@ msgstr "préfixe"
 
 #: archive.c:325
 msgid "prepend prefix to each pathname in the archive"
-msgstr "Préfixer chaque chemin de fichier dans l'archive"
+msgstr "préfixer chaque chemin de fichier dans l'archive"
 
 #: archive.c:326 builtin/archive.c:88 builtin/blame.c:2371
 #: builtin/blame.c:2372 builtin/config.c:55 builtin/fast-export.c:665
@@ -79,7 +128,7 @@ msgstr "fichier"
 
 #: archive.c:327 builtin/archive.c:89
 msgid "write the archive to this file"
-msgstr "Ã\89crire l'archive dans ce fichier"
+msgstr "écrire l'archive dans ce fichier"
 
 #: archive.c:329
 msgid "read .gitattributes in working directory"
@@ -125,8 +174,9 @@ msgstr "chemin vers la commande distante git-upload-archive"
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
-msgstr "Les patrons négatifs sont ignorés dans les attributs git\n"
-"Utilisez '\\!' pour un point d'exclamation littéral"
+msgstr ""
+"Les motifs de négation sont ignorés dans les attributs git\n"
+"Utilisez '\\!' pour un point d'exclamation littéral."
 
 #: branch.c:60
 #, c-format
@@ -217,30 +267,30 @@ msgid ""
 "If you are planning to push out a new local branch that\n"
 "will track its remote counterpart, you may want to use\n"
 "\"git push -u\" to set the upstream config as you push."
-msgstr "\n"
+msgstr ""
+"\n"
 "Si vous comptez baser votre travail sur une branche\n"
 "amont qui existe déjà sur le serveur distant, vous pourriez\n"
 "devoir lancer \"git fetch\" pour la récupérer.\n"
 "\n"
-"Si vous comptez pousser une nouvelle branche locale\n"
-"qui suivra sa jumelle distante, vous souhaiterez utiliser\n"
-"\"git push -u\" pour paramétrer le suivi distant en même\n"
-"temps que vous poussez."
+"Si vous comptez pousser une nouvelle branche locale qui suivra\n"
+"sa jumelle distante, vous souhaiterez utiliser \"git push -u\"\n"
+"pour paramétrer le suivi distant en même temps que vous poussez."
 
 #: branch.c:250
 #, c-format
 msgid "Not a valid object name: '%s'."
-msgstr "Nom d'objet invalide : '%s'"
+msgstr "Nom d'objet invalide : '%s'."
 
 #: branch.c:270
 #, c-format
 msgid "Ambiguous object name: '%s'."
-msgstr "Nom d'objet ambigu : '%s'"
+msgstr "Nom d'objet ambigu : '%s'."
 
 #: branch.c:275
 #, c-format
 msgid "Not a valid branch point: '%s'."
-msgstr "Point d'embranchement invalide : '%s'"
+msgstr "Point d'embranchement invalide : '%s'."
 
 #: branch.c:281
 msgid "Failed to lock ref for update"
@@ -258,7 +308,7 @@ msgstr "'%s' ne semble pas Ãªtre un fichier bundle v2"
 #: bundle.c:63
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
-msgstr "entête non reconnu : %s %s (%d)"
+msgstr "en-tête non reconnu : %s%s (%d)"
 
 #: bundle.c:89 builtin/commit.c:676
 #, c-format
@@ -284,13 +334,13 @@ msgstr[1] "Le colis contient ces %d références :"
 
 #: bundle.c:193
 msgid "The bundle records a complete history."
-msgstr "Le bundle enregistre l'historique complet."
+msgstr "Le colis enregistre l'historique complet."
 
 #: bundle.c:195
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
-msgstr[0] "Le colis exige cette référence"
+msgstr[0] "Le colis exige cette référence :"
 msgstr[1] "Le colis exige ces %d références :"
 
 #: bundle.c:294
@@ -305,11 +355,11 @@ msgstr "argument non reconnu : %s"
 #: bundle.c:335
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
-msgstr "ref '%s' est exclus par les options de rev-list"
+msgstr "la référence '%s' est exclue par les options de rev-list"
 
 #: bundle.c:380
 msgid "Refusing to create empty bundle."
-msgstr "Refus de créer un bundle vide"
+msgstr "Refus de créer un colis vide."
 
 #: bundle.c:398
 msgid "Could not spawn pack-objects"
@@ -340,16 +390,16 @@ msgstr "%s %s n'est pas un commit !"
 
 #: compat/obstack.c:406 compat/obstack.c:408
 msgid "memory exhausted"
-msgstr "Plus de mémoire"
+msgstr "plus de mémoire"
 
 #: connected.c:39
 msgid "Could not run 'git rev-list'"
-msgstr "impossible de lancer 'git rev-list'"
+msgstr "Impossible de lancer 'git rev-list'"
 
 #: connected.c:48
 #, c-format
 msgid "failed write to rev-list: %s"
-msgstr "impossible d'écrire la rev-list : %s"
+msgstr "impossible d'écrire dans la rev-list : %s"
 
 #: connected.c:56
 #, c-format
@@ -507,14 +557,16 @@ msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
 
 #: help.c:235
 msgid "The most commonly used git commands are:"
-msgstr "Les commandes git les plus usitées sont :"
+msgstr "Les commandes git les plus utilisées sont :"
 
 #: help.c:292
 #, c-format
 msgid ""
 "'%s' appears to be a git command, but we were not\n"
 "able to execute it. Maybe git-%s is broken?"
-msgstr "'%s' semble Ãªtre une commande git, mais elle n'a pas pu Ãªtre Ã©xecutée. Peut-être git-%s est-il cassé ?"
+msgstr ""
+"'%s' semble Ãªtre une commande git, mais elle n'a pas pu\n"
+"être exécutée. Peut-être git-%s est-elle cassée ?"
 
 #: help.c:349
 msgid "Uh oh. Your system reports no Git commands at all."
@@ -526,17 +578,17 @@ msgid ""
 "WARNING: You called a Git command named '%s', which does not exist.\n"
 "Continuing under the assumption that you meant '%s'"
 msgstr "ATTENTION : vous avez invoqué une commande Git nommée '%s' qui n'existe pas.\n"
-"Poursuite avec l'hypothèse que vous avez voulu dire '%s'"
+"Poursuite en supposant que vous avez voulu dire '%s'"
 
 #: help.c:376
 #, c-format
 msgid "in %0.1f seconds automatically..."
-msgstr "dans %01f secondes automatiquement..."
+msgstr "dans %0.1f secondes automatiquement..."
 
 #: help.c:383
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git : '%s' n'est pas une commande git. Référez-vous Ã  'git --help'"
+msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
 
 #: help.c:387
 msgid ""
@@ -547,8 +599,7 @@ msgid_plural ""
 "Did you mean one of these?"
 msgstr[0] "\n"
 "Vouliez-vous dire cela ?"
-msgstr[1] "\n"
-"Vouliez-vous dire un de cela ?"
+msgstr[1] "\nVouliez-vous dire un de ceux-là ?"
 
 #: merge.c:56
 msgid "failed to read the cache"
@@ -567,11 +618,11 @@ msgstr "(mauvais commit)\n"
 #: merge-recursive.c:206
 #, c-format
 msgid "addinfo_cache failed for path '%s'"
-msgstr "Ã\89chec de addinfo_cache pour le chemin '%s'"
+msgstr "échec de addinfo_cache pour le chemin '%s'"
 
 #: merge-recursive.c:268
 msgid "error building trees"
-msgstr "Erreur Ã  la construction des arbres"
+msgstr "erreur de construction des arbres"
 
 #: merge-recursive.c:672
 #, c-format
@@ -607,12 +658,12 @@ msgstr "blob attendu pour %s '%s'"
 #: merge-recursive.c:773 builtin/clone.c:313
 #, c-format
 msgid "failed to open '%s'"
-msgstr "Ã\89chec Ã  l'ouverture de '%s'"
+msgstr "échec Ã  l'ouverture de '%s'"
 
 #: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
-msgstr "Ã\89chec Ã  la création du lien symbolique '%s'"
+msgstr "échec Ã  la création du lien symbolique '%s'"
 
 #: merge-recursive.c:784
 #, c-format
@@ -644,7 +695,7 @@ msgstr "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree at %s."
-msgstr "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans%s. Version %s de %s laissée dans l'arbre dans le fichier %s."
+msgstr "CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de %s laissée dans l'arbre dans le fichier %s."
 
 #: merge-recursive.c:1081
 msgid "rename"
@@ -664,7 +715,7 @@ msgstr "%s est un répertoire dans %s ajouté plutôt comme %s"
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
-msgstr "CONFLIT (renommage/renommage) : Renommage de '%s'->'%s' dans la branche '%s' et renommage '%s'->'%s' dans '%s'%s"
+msgstr "CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche \"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
 
 #: merge-recursive.c:1164
 msgid " (left unresolved)"
@@ -678,12 +729,12 @@ msgstr "CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage
 #: merge-recursive.c:1248
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Renommage préféré de %s en %s et de %s en %s"
+msgstr "Renommage de %s en %s et de %s en %s Ã  la place"
 
 #: merge-recursive.c:1447
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "CONFLIT (renommage/ajout) : renommage de '%s'->'%s' dans ' %s. %s ajouté dans %s"
+msgstr "CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
 
 #: merge-recursive.c:1457
 #, c-format
@@ -729,7 +780,7 @@ msgstr "%s ignoré (fusion identique Ã  l'existant)"
 #: merge-recursive.c:1629
 #, c-format
 msgid "Auto-merging %s"
-msgstr "fusion automatique de %s"
+msgstr "Fusion automatique de %s"
 
 #: merge-recursive.c:1633 git-submodule.sh:1029
 msgid "submodule"
@@ -738,7 +789,7 @@ msgstr "sous-module"
 #: merge-recursive.c:1634
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr "CONFLIT (%s) : conflit de fusion dans %s"
+msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
 
 #: merge-recursive.c:1724
 #, c-format
@@ -774,7 +825,7 @@ msgstr "Déjà Ã  jour !"
 #: merge-recursive.c:1815
 #, c-format
 msgid "merging of trees %s and %s failed"
-msgstr "Ã\89chec de fusion des arbres %s et %s"
+msgstr "échec de fusion des arbres %s et %s"
 
 #: merge-recursive.c:1845
 #, c-format
@@ -808,7 +859,7 @@ msgstr "Impossible d'écrire l'index."
 #: object.c:195
 #, c-format
 msgid "unable to parse object: %s"
-msgstr "Impossible d'analyser l'objet '%s'"
+msgstr "impossible d'analyser l'objet : %s"
 
 #: parse-options.c:489
 msgid "..."
@@ -849,24 +900,24 @@ msgstr "'%s' est au delà d'un lien symbolique"
 #, c-format
 msgid "Your branch is ahead of '%s' by %d commit.\n"
 msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] "Votre branche est en avance sur '%s' par %d commit.\n"
-msgstr[1] "Votre branche est en avance sur '%s' par %d commits.\n"
+msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n"
+msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
 
 #: remote.c:1787
 msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (utilisez 'git push' pour publier vos commits locaux)\n"
+msgstr "  (utilisez \"git push\" pour publier vos commits locaux)\n"
 
 #: remote.c:1790
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
 msgid_plural ""
 "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] "Votre branche est en retard sur '%s' par %d commit, et peut Ãªtre mise Ã  jour en avance rapide.\n"
-msgstr[1] "Votre branche est en retard sur '%s' par %d commits, et peut Ãªtre mise Ã  jour en avance rapide.\n"
+msgstr[0] "Votre branche est en retard sur '%s' de %d commit, et peut Ãªtre mise Ã  jour en avance rapide.\n"
+msgstr[1] "Votre branche est en retard sur '%s' de %d commits, et peut Ãªtre mise Ã  jour en avance rapide.\n"
 
 #: remote.c:1798
 msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr "  (  utilisez 'git pull' pour mettre Ã  jour votre branche locale)\n"
+msgstr "  (utilisez \"git pull\" pour mettre Ã  jour votre branche locale)\n"
 
 #: remote.c:1801
 #, c-format
@@ -909,7 +960,8 @@ msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'\n"
 "and commit the result with 'git commit'"
-msgstr "après résolution des conflits, marquez les chemins corrigés\n"
+msgstr ""
+"après résolution des conflits, marquez les chemins corrigés\n"
 "avec 'git add <chemins>' ou 'git rm <chemins>'\n"
 "puis validez le résultat avec 'git commit'"
 
@@ -925,7 +977,7 @@ msgstr "Erreur Ã  l'emballage de %s"
 
 #: sequencer.c:263
 msgid "Your local changes would be overwritten by cherry-pick."
-msgstr "Vos modifications locales serait Ã©crasées par cherry-pick."
+msgstr "Vos modifications locales seraient Ã©crasées par cherry-pick."
 
 #: sequencer.c:265
 msgid "Your local changes would be overwritten by revert."
@@ -939,7 +991,7 @@ msgstr "Validez vos modifications ou remisez-les pour continuer."
 #: sequencer.c:319
 #, c-format
 msgid "%s: Unable to write new index file"
-msgstr "%s: impossiblde d'écrire le nouveau fichier index"
+msgstr "%s: Impossible d'écrire le nouveau fichier index"
 
 #: sequencer.c:350
 msgid "Could not resolve HEAD commit\n"
@@ -971,7 +1023,7 @@ msgstr "Le commit %s est une fusion mais l'option -m n'a pas Ã©té spécifiée."
 #: sequencer.c:514
 #, c-format
 msgid "Commit %s does not have parent %d"
-msgstr "Le commit %s n'a pas %d pour parent"
+msgstr "Le commit %s n'a pas le parent %d"
 
 #: sequencer.c:518
 #, c-format
@@ -1060,7 +1112,7 @@ msgstr "Feuille d'options malformée : %s"
 
 #: sequencer.c:840
 msgid "a cherry-pick or revert is already in progress"
-msgstr "Un picorage ou un retour est déjà en cours"
+msgstr "un picorage ou un retour est déjà en cours"
 
 #: sequencer.c:841
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
@@ -1105,7 +1157,7 @@ msgstr "fin de fichier inattendue"
 #: sequencer.c:916
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr "Le fichier HEAD de préparation de picorage '%s' est corrompu"
+msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
 
 #: sequencer.c:939
 #, c-format
@@ -1120,7 +1172,7 @@ msgstr "%s : impossible de picorer un %s"
 #: sequencer.c:1085
 #, c-format
 msgid "%s: bad revision"
-msgstr "%s: mauvaise révision"
+msgstr "%s : mauvaise révision"
 
 #: sequencer.c:1119
 msgid "Can't revert as initial commit"
@@ -1128,7 +1180,7 @@ msgstr "Impossible d'annuler en tant que commit initial"
 
 #: sequencer.c:1120
 msgid "Can't cherry-pick into empty head"
-msgstr "Impossible de picorer vers un HEAD vide"
+msgstr "Impossible de picorer vers une HEAD vide"
 
 #: sha1_name.c:1036
 msgid "HEAD does not point to a branch"
@@ -1183,15 +1235,15 @@ msgstr "  (utilisez \"git rm --cached <fichier>...\" pour désindexer)"
 
 #: wt-status.c:173
 msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git add <fichier>...\" pour marquer résolu)"
+msgstr "  (utilisez \"git add <fichier>...\" pour marquer comme résolu)"
 
 #: wt-status.c:175 wt-status.c:179
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (utilisez \"git add/rm <fichier>...\" selon le cas pour marquer résolu)"
+msgstr "  (utilisez \"git add/rm <fichier>...\" si nécessaire pour marquer comme résolu)"
 
 #: wt-status.c:177
 msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (utilisez \"git rm <fichier>...\" pour marquer résolu)"
+msgstr "  (utilisez \"git rm <fichier>...\" pour marquer comme résolu)"
 
 #: wt-status.c:188
 msgid "Changes to be committed:"
@@ -1216,7 +1268,7 @@ msgstr "  (utilisez \"git checkout -- <fichier>...\" pour annuler les modificati
 
 #: wt-status.c:215
 msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (valider out annuler le contenu non suivi our modifié dans les sous-modules)"
+msgstr "  (valider ou annuler le contenu non suivi ou modifié dans les sous-modules)"
 
 #: wt-status.c:227
 #, c-format
@@ -1229,7 +1281,7 @@ msgstr "bogue"
 
 #: wt-status.c:249
 msgid "both deleted:"
-msgstr "effacé des deux côtés :"
+msgstr "supprimé des deux côtés :"
 
 #: wt-status.c:250
 msgid "added by us:"
@@ -1237,7 +1289,7 @@ msgstr "ajouté par nous :"
 
 #: wt-status.c:251
 msgid "deleted by them:"
-msgstr "effacé par eux :"
+msgstr "supprimé par eux :"
 
 #: wt-status.c:252
 msgid "added by them:"
@@ -1245,11 +1297,11 @@ msgstr "ajouté par eux :"
 
 #: wt-status.c:253
 msgid "deleted by us:"
-msgstr "effacé par nous :"
+msgstr "supprimé par nous :"
 
 #: wt-status.c:254
 msgid "both added:"
-msgstr "Ajouté de deux côtés :"
+msgstr "ajouté de deux côtés :"
 
 #: wt-status.c:255
 msgid "both modified:"
@@ -1270,42 +1322,42 @@ msgstr "contenu non suivi, "
 #: wt-status.c:306
 #, c-format
 msgid "new file:   %s"
-msgstr "nouveau : %s"
+msgstr "nouveau :   %s"
 
 #: wt-status.c:309
 #, c-format
 msgid "copied:     %s -> %s"
-msgstr "copié :   %s->%s"
+msgstr "copié :     %s -> %s"
 
 #: wt-status.c:312
 #, c-format
 msgid "deleted:    %s"
-msgstr "effacé :  %s"
+msgstr "supprimé :  %s"
 
 #: wt-status.c:315
 #, c-format
 msgid "modified:   %s"
-msgstr "modifié : %s"
+msgstr "modifié :   %s"
 
 #: wt-status.c:318
 #, c-format
 msgid "renamed:    %s -> %s"
-msgstr "renommé : %s -> %s"
+msgstr "renommé :   %s -> %s"
 
 #: wt-status.c:321
 #, c-format
 msgid "typechange: %s"
-msgstr "nv type :  %s"
+msgstr "nv type :   %s"
 
 #: wt-status.c:324
 #, c-format
 msgid "unknown:    %s"
-msgstr "inconnu : %s"
+msgstr "inconnu :   %s"
 
 #: wt-status.c:327
 #, c-format
 msgid "unmerged:   %s"
-msgstr "non fus : %s"
+msgstr "non fus. :  %s"
 
 #: wt-status.c:330
 #, c-format
@@ -1346,7 +1398,7 @@ msgstr "  (utilisez \"git am --skip\" pour sauter ce patch)"
 
 #: wt-status.c:833
 msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (utilisez \"git am --abort\" pour restaurer la branche originelle)"
+msgstr "  (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
 
 #: wt-status.c:893 wt-status.c:910
 #, c-format
@@ -1416,7 +1468,7 @@ msgstr "  (tous les conflits sont résolus : lancez \"git commit\")"
 #: wt-status.c:970
 #, c-format
 msgid "You are currently reverting commit %s."
-msgstr "Vous Ãªtes actuellement en train de rétablir un commit %s."
+msgstr "Vous Ãªtes actuellement en train de rétablir le commit %s."
 
 #: wt-status.c:975
 msgid "  (fix conflicts and run \"git revert --continue\")"
@@ -1441,7 +1493,7 @@ msgstr "Vous Ãªtes en cours de bissection."
 
 #: wt-status.c:998
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (utilisez \"git bisect reset\" pour revenir Ã  la branche de départ)"
+msgstr "  (utilisez \"git bisect reset\" pour revenir Ã  la branche d'origine)"
 
 #: wt-status.c:1173
 msgid "On branch "
@@ -1449,11 +1501,11 @@ msgstr "Sur la branche "
 
 #: wt-status.c:1184
 msgid "HEAD detached at "
-msgstr "HEAD détaché sur "
+msgstr "HEAD détachée sur "
 
 #: wt-status.c:1186
 msgid "HEAD detached from "
-msgstr "HEAD détaché depuis "
+msgstr "HEAD détachée depuis "
 
 #: wt-status.c:1189
 msgid "Not currently on any branch."
@@ -1461,7 +1513,7 @@ msgstr "Actuellement sur aucun branche."
 
 #: wt-status.c:1206
 msgid "Initial commit"
-msgstr "Validation initiale."
+msgstr "Validation initiale"
 
 #: wt-status.c:1220
 msgid "Untracked files"
@@ -1484,7 +1536,7 @@ msgstr "L'énumération des fichiers non suivis a duré %.2f secondes. 'status -
 #: wt-status.c:1232
 #, c-format
 msgid "Untracked files not listed%s"
-msgstr "Les fichiers non suivis ne sont pas listés %s"
+msgstr "Fichiers non suivis non listés%s"
 
 #: wt-status.c:1234
 msgid " (use -u option to show untracked files)"
@@ -1497,29 +1549,29 @@ msgstr "Aucune modification"
 #: wt-status.c:1245
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr "aucune modification n'a Ã©té ajoutée au commit (utilisez \"git add\" ou \"git commit -a\")\n"
+msgstr "aucune modification n'a Ã©té ajoutée Ã  la validation (utilisez \"git add\" ou \"git commit -a\")\n"
 
 #: wt-status.c:1248
 #, c-format
 msgid "no changes added to commit\n"
-msgstr "aucune modification indexée\n"
+msgstr "aucune modification ajoutée Ã  la validation\n"
 
 #: wt-status.c:1251
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
 "track)\n"
-msgstr "Aucune modification indexée mais des fichiers non suivis sont présents (utilisez \"git add\" pour les suivre)\n"
+msgstr "aucune modification ajoutée Ã  la validation mais des fichiers non suivis sont présents (utilisez \"git add\" pour les suivre)\n"
 
 #: wt-status.c:1254
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
-msgstr "Aucune modification indexée mais des fichiers non-suivis sont présents\n"
+msgstr "aucune modification ajoutée Ã  la validation mais des fichiers non suivis sont présents\n"
 
 #: wt-status.c:1257
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
-msgstr "rien Ã  valider (créez/copiez des fichiers et utilisez \"git add\" pour le suivre)\n"
+msgstr "rien Ã  valider (créez/copiez des fichiers et utilisez \"git add\" pour les suivre)\n"
 
 #: wt-status.c:1260 wt-status.c:1265
 #, c-format
@@ -1593,10 +1645,10 @@ msgid ""
 "\n"
 "With the current Git version, the command is restricted to the current "
 "directory.\n"
-msgstr "Le comportement de 'git add %s (ou %s)' sans argument de chemin\n"
-"depuis un sous-répertoire du projet va changer dans Git 2.0. Cet usage\n"
-"est déconseillé.\n"
-"Pour ajouter du contenu pour tout le projet, lancez :\n"
+msgstr ""
+"Le comportement de 'git add %s (ou %s)' sans argument de chemin depuis un\n"
+"sous-répertoire du projet va changer dans Git 2.0 et ne doit plus Ãªtre utilisé.\n"
+"Pour ajouter le contenu de toute l'arborescence, lancez :\n"
 "\n"
 "  git add %s :/\n"
 "  (ou git add %s :/)\n"
@@ -1622,15 +1674,18 @@ msgid ""
 "* 'git add --all <pathspec>' will let you also record the removals.\n"
 "\n"
 "Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr "Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
-"Le comportement vis Ã  vis des fichiers supprimés va changer dans Git 2.0.\n"
-"Les chemins tels que '%s' qui ont Ã©té retirés de votre copie de travail sont\n"
-"actuellement ignorés.\n"
+msgstr ""
+"Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
+"dont le comportement va changer dans Git 2.0 avec le respect des chemins que vous supprimez.\n"
+"Les chemins tels que '%s' qui ont Ã©té\n"
+"retirés de votre copie de travail sont ignorés avec cette version de Git.\n"
 "\n"
-" 'git add --ignore-removal <chemin>', est l'option par défaut actuelle qui\n"
-"  ignore les chemins que vous avez supprimé de votre copie de travail.\n"
+"* 'git add --ignore-removal <chemin>', qui est l'option par défaut actuelle,\n"
+"  ignore les chemins que vous avez supprimés de votre copie de travail.\n"
 "\n"
 "* 'git add --all <chemin>' permet d'enregistrer aussi les suppressions.\n"
+"\n"
+"Lancez 'git status' pour vérifier les chemins que vous avez supprimés de votre copie de travail.\n"
 
 #: builtin/add.c:144
 #, c-format
@@ -1639,16 +1694,16 @@ msgstr "status de diff inattendu %c"
 
 #: builtin/add.c:149 builtin/commit.c:233
 msgid "updating files failed"
-msgstr "echec de la mise Ã  jour des fichiers"
+msgstr "échec de la mise Ã  jour des fichiers"
 
 #: builtin/add.c:163
 #, c-format
 msgid "remove '%s'\n"
-msgstr "retrait de '%s'\n"
+msgstr "suppression de '%s'\n"
 
 #: builtin/add.c:253
 msgid "Unstaged changes after refreshing the index:"
-msgstr "Modifications non indexées après rafraîchissement de l'index"
+msgstr "Modifications non indexées après rafraîchissement de l'index :"
 
 #: builtin/add.c:256 builtin/add.c:572 builtin/rm.c:275
 #, c-format
@@ -1716,7 +1771,7 @@ msgstr "permettre l'ajout de fichiers ignorés"
 
 #: builtin/add.c:400
 msgid "update tracked files"
-msgstr "mise Ã  jour des fichiers suivis"
+msgstr "mettre Ã  jour les fichiers suivis"
 
 #: builtin/add.c:401
 msgid "record only the fact that the path will be added later"
@@ -1724,7 +1779,7 @@ msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
 
 #: builtin/add.c:402
 msgid "add changes from all tracked and untracked files"
-msgstr "ajouter les modifications de tous les fichiers suivis et non-suivis"
+msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
 
 #. takes no arguments
 #: builtin/add.c:405
@@ -1741,7 +1796,7 @@ msgstr "sauter seulement les fichiers qui ne peuvent pas Ãªtre ajoutés du fait
 
 #: builtin/add.c:409
 msgid "check if - even missing - files are ignored in dry run"
-msgstr "vérifier Ã  vide si des fichiers, même manquants,  sont ignorés"
+msgstr "vérifier si des fichiers - même manquants - sont ignorés, Ã  vide"
 
 #: builtin/add.c:431
 #, c-format
@@ -1754,7 +1809,7 @@ msgstr "aucun fichier ajouté"
 
 #: builtin/add.c:438
 msgid "adding files failed"
-msgstr "echec de l'ajout de fichiers"
+msgstr "échec de l'ajout de fichiers"
 
 #: builtin/add.c:477
 msgid "-A and -u are mutually incompatible"
@@ -1762,17 +1817,17 @@ msgstr "-A et -u sont mutuellement incompatibles"
 
 #: builtin/add.c:495
 msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "L'option --ignore-missing ne peut Ãªtre utilisée qu'en complément de  --dry-run"
+msgstr "L'option --ignore-missing ne peut Ãªtre utilisée qu'en complément de --dry-run"
 
 #: builtin/add.c:525
 #, c-format
 msgid "Nothing specified, nothing added.\n"
-msgstr "Spécification vide, riien Ã  ajouter.\n"
+msgstr "Rien de spécifié, rien n'a Ã©té ajouté.\n"
 
 #: builtin/add.c:526
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr "Vous voulez sûrement dire 'git add .' ?\n"
+msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
 
 #: builtin/add.c:532 builtin/check-ignore.c:66 builtin/clean.c:204
 #: builtin/commit.c:293 builtin/mv.c:82 builtin/rm.c:235
@@ -1785,17 +1840,17 @@ msgstr "Impossible d'écrire le nouveau fichier d'index"
 
 #: builtin/apply.c:57
 msgid "git apply [options] [<patch>...]"
-msgstr "git apply [option] [<patch>...]"
+msgstr "git apply [options] [<patch>...]"
 
 #: builtin/apply.c:110
 #, c-format
 msgid "unrecognized whitespace option '%s'"
-msgstr "option d'espaces non reconnue '%s'"
+msgstr "option d'espace non reconnue '%s'"
 
 #: builtin/apply.c:125
 #, c-format
 msgid "unrecognized whitespace ignore option '%s'"
-msgstr "option d'espaces ignorés non reconnue '%s'"
+msgstr "option d'ignorance d'espce non reconnue '%s'"
 
 #: builtin/apply.c:823
 #, c-format
@@ -1805,32 +1860,32 @@ msgstr "Impossible de préparer la regexp d'horodatage %s"
 #: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
-msgstr "regexec a retourné %d pour l'entrée %s"
+msgstr "regexec a retourné %d pour l'entrée %s"
 
 #: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
-msgstr "nom de fichier du patch introuvable ligne %d"
+msgstr "nom de fichier du patch introuvable Ã  la ligne %d"
 
 #: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply : mauvais format de git-diff - /dev/null attendu, %s trouvé ligne %d"
+msgstr "git apply : mauvais format de git-diff - /dev/null attendu, %s trouvé Ã  la ligne %d"
 
 #: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr "git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant ligne %d"
+msgstr "git apply : mauvais format de git-diff - nouveau nom de fichier inconsistant Ã  la ligne %d"
 
 #: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr "git apply : mauvais format de git-diff - ancien nom de fichier inconsistant ligne %d"
+msgstr "git apply : mauvais format de git-diff - ancien nom de fichier inconsistant Ã  la ligne %d"
 
 #: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply : mauvais format de git-diff - /dev/null attendu ligne %d"
+msgstr "git apply : mauvais format de git-diff - /dev/null attendu Ã  la ligne %d"
 
 #: builtin/apply.c:1422
 #, c-format
@@ -1840,7 +1895,7 @@ msgstr "recount : ligne inattendue : %.*s"
 #: builtin/apply.c:1479
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
-msgstr "fragment de patch sans entête ligne %d : %.*s"
+msgstr "fragment de patch sans en-tête Ã  la ligne %d : %.*s"
 
 #: builtin/apply.c:1496
 #, c-format
@@ -1850,8 +1905,8 @@ msgid ""
 msgid_plural ""
 "git diff header lacks filename information when removing %d leading pathname "
 "components (line %d)"
-msgstr[0] "information de nom de fichier manquante dans l'entête de git diff lors de la suppression de %d composant de préfix de chemin (ligne %d)"
-msgstr[1] "information de nom de fichier manquante dans l'entête de git diff lors de la suppression de %d composants de préfix de chemin (ligne %d)"
+msgstr[0] "information de nom de fichier manquante dans l'en-tête de git diff lors de la suppression de %d composant de préfixe de chemin (ligne %d)"
+msgstr[1] "information de nom de fichier manquante dans l'en-tête de git diff lors de la suppression de %d composants de préfixe de chemin (ligne %d)"
 
 #: builtin/apply.c:1656
 msgid "new file depends on old contents"
@@ -1879,28 +1934,28 @@ msgstr "le fichier supprimé %s a encore du contenu"
 #: builtin/apply.c:1725
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
-msgstr "** attention : le fichier %s devient vide mais n'est pas effacé"
+msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
 
 #: builtin/apply.c:1871
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
-msgstr "patch binaire corrompu ligne %d : %.*s"
+msgstr "patch binaire corrompu Ã  la ligne %d : %.*s"
 
 #. there has to be one hunk (forward hunk)
 #: builtin/apply.c:1900
 #, c-format
 msgid "unrecognized binary patch at line %d"
-msgstr "patch binaire non reconnu ligne %d"
+msgstr "patch binaire non reconnu Ã  la ligne %d"
 
 #: builtin/apply.c:1986
 #, c-format
 msgid "patch with only garbage at line %d"
-msgstr "patch totalement incompréhensible ligne %d"
+msgstr "patch totalement incompréhensible Ã  la ligne %d"
 
 #: builtin/apply.c:2076
 #, c-format
 msgid "unable to read symlink %s"
-msgstr "lecture du symlink %s impossible"
+msgstr "lecture du lien symbolique %s impossible"
 
 #: builtin/apply.c:2080
 #, c-format
@@ -1916,8 +1971,8 @@ msgstr "début de ligne invalide : '%c'"
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] "La section #%d a réussi Ã  la ligne %d (offset %d ligne)"
-msgstr[1] "La section #%d a réussi Ã  la ligne %d (offset %d lignes)"
+msgstr[0] "La section n°%d a réussi Ã  la ligne %d (offset %d ligne)."
+msgstr[1] "La section n°%d a réussi Ã  la ligne %d (offset %d lignes)."
 
 #: builtin/apply.c:2818
 #, c-format
@@ -1950,7 +2005,7 @@ msgstr "le patch binaire sur '%s' crée un résultat incorrect (%s attendu, mais
 #: builtin/apply.c:2973
 #, c-format
 msgid "patch failed: %s:%ld"
-msgstr "le patch a Ã©choué : %s : %ld"
+msgstr "le patch a Ã©choué : %s:%ld"
 
 #: builtin/apply.c:3095
 #, c-format
@@ -1965,7 +2020,7 @@ msgstr "echec de la lecture de %s"
 #: builtin/apply.c:3173 builtin/apply.c:3395
 #, c-format
 msgid "path %s has been renamed/deleted"
-msgstr "le fichier %s a Ã©té renommé/supprimé"
+msgstr "le chemin %s a Ã©té renommé/supprimé"
 
 #: builtin/apply.c:3254 builtin/apply.c:3409
 #, c-format
@@ -2049,7 +2104,7 @@ msgstr "stat du fichier nouvellement créé '%s' impossible"
 #: builtin/apply.c:3859
 #, c-format
 msgid "unable to create backing store for newly created file %s"
-msgstr "création du magasin de sauvegard pour le fichier nouvellement créé %s impossible"
+msgstr "création du magasin de stockage pour le fichier nouvellement créé %s impossible"
 
 #: builtin/apply.c:3862 builtin/apply.c:3970
 #, c-format
@@ -2059,7 +2114,7 @@ msgstr "ajout de l'entrée de cache %s impossible"
 #: builtin/apply.c:3895
 #, c-format
 msgid "closing file '%s'"
-msgstr "fermeture du ficheir '%s'"
+msgstr "fermeture du fichier '%s'"
 
 #: builtin/apply.c:3944
 #, c-format
@@ -2091,12 +2146,12 @@ msgstr "troncature du nom de fichier .rej en %.*s.rej"
 #: builtin/apply.c:4073
 #, c-format
 msgid "Hunk #%d applied cleanly."
-msgstr "Section no %d appliqué proprement."
+msgstr "Section n°%d appliquée proprement."
 
 #: builtin/apply.c:4076
 #, c-format
 msgid "Rejected hunk #%d."
-msgstr "Section n%d rejetée."
+msgstr "Section n°%d rejetée."
 
 #: builtin/apply.c:4226
 msgid "unrecognized input"
@@ -2165,7 +2220,7 @@ msgstr "tenter une fusion Ã  3 points si le patch ne s'applique pas proprement"
 
 #: builtin/apply.c:4386
 msgid "build a temporary index based on embedded index information"
-msgstr "construire une index temporaire fondé sur l'information de l'index embarqué"
+msgstr "construire un index temporaire fondé sur l'information de l'index embarqué"
 
 #: builtin/apply.c:4388 builtin/checkout-index.c:197 builtin/ls-files.c:456
 msgid "paths are separated with NUL character"
@@ -2185,15 +2240,15 @@ msgstr "détecter des lignes nouvelles ou modifiées qui contiennent des erreurs
 
 #: builtin/apply.c:4396 builtin/apply.c:4399
 msgid "ignore changes in whitespace when finding context"
-msgstr "ignorer des modifications d'espaces lors de la recherche de contexte"
+msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
 
 #: builtin/apply.c:4402
 msgid "apply the patch in reverse"
-msgstr "appliquer le patch en inverse"
+msgstr "appliquer le patch en sens inverse"
 
 #: builtin/apply.c:4404
 msgid "don't expect at least one line of context"
-msgstr "accepter moins d'une ligne de contexte"
+msgstr "ne pas s'attendre Ã  au moins une ligne de contexte"
 
 #: builtin/apply.c:4406
 msgid "leave the rejected hunks in corresponding *.rej files"
@@ -2205,11 +2260,11 @@ msgstr "accepter les recouvrements de sections"
 
 #: builtin/apply.c:4411
 msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "tolérer faux positifs de retours chariot manquant en fin de fichier"
+msgstr "tolérer des erreurs de détection de retours chariot manquants en fin de fichier"
 
 #: builtin/apply.c:4414
 msgid "do not trust the line counts in the hunk headers"
-msgstr "ne pas se fier au comptes de lignes dans les entêtes de section"
+msgstr "ne pas se fier au compte de lignes dans les en-têtes de section"
 
 #: builtin/apply.c:4416
 msgid "root"
@@ -2225,7 +2280,7 @@ msgstr "--3way hors d'un dépôt"
 
 #: builtin/apply.c:4447
 msgid "--index outside a repository"
-msgstr "--index hors d'une dépôt"
+msgstr "--index hors d'un dépôt"
 
 #: builtin/apply.c:4450
 msgid "--cached outside a repository"
@@ -2247,7 +2302,7 @@ msgstr[1] "%d erreurs d'espace ignorées"
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
-msgstr[0] "%d ligne ont ajouté des erreurs d'espace."
+msgstr[0] "%d ligne a ajouté des erreurs d'espace."
 msgstr[1] "%d lignes ont ajouté des erreurs d'espace."
 
 #: builtin/archive.c:17
@@ -2299,23 +2354,23 @@ msgstr "mettre Ã  jour BISECT_HEAD au lieu d'extraire le commit actuel"
 
 #: builtin/blame.c:25
 msgid "git blame [options] [rev-opts] [rev] [--] file"
-msgstr "git blame [options] [option de révision] [rev] [--] file"
+msgstr "git blame [options] [options-de-révision] [rev] [--] fichier"
 
 #: builtin/blame.c:30
 msgid "[rev-opts] are documented in git-rev-list(1)"
-msgstr "[rev-opts] sont documentés dans git-rev-list(1)"
+msgstr "[options-de-révision] sont documentés dans git-rev-list(1)"
 
 #: builtin/blame.c:2355
 msgid "Show blame entries as we find them, incrementally"
-msgstr "Montrer les entrée de blame au fur et Ã  mesure de leur découverte, incrémentalement"
+msgstr "Montrer les entrée de blâme au fur et Ã  mesure de leur découverte, de manière incrémentale"
 
 #: builtin/blame.c:2356
 msgid "Show blank SHA-1 for boundary commits (Default: off)"
-msgstr "Montrer un SHA-1 blanc pour les commits de limite (défaut : désactivé)"
+msgstr "Montrer un SHA-1 blanc pour les commits de limite (Défaut : désactivé)"
 
 #: builtin/blame.c:2357
 msgid "Do not treat root commits as boundaries (Default: off)"
-msgstr "Ne pas traiter les commits racine comme des limites (défaut : désactivé)"
+msgstr "Ne pas traiter les commits racine comme des limites (Défaut : désactivé)"
 
 #: builtin/blame.c:2358
 msgid "Show work cost statistics"
@@ -2327,11 +2382,11 @@ msgstr "Montrer le score de sortie pour les entrées de blâme"
 
 #: builtin/blame.c:2360
 msgid "Show original filename (Default: auto)"
-msgstr "Montrer les noms de fichier originaux (défaut : auto)"
+msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
 
 #: builtin/blame.c:2361
 msgid "Show original linenumber (Default: off)"
-msgstr "Montrer les numéros de lignes originaux (défaut : désactivé)"
+msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
 
 #: builtin/blame.c:2362
 msgid "Show in a format designed for machine consumption"
@@ -2343,23 +2398,23 @@ msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
 
 #: builtin/blame.c:2364
 msgid "Use the same output mode as git-annotate (Default: off)"
-msgstr "Utiliser le même mode de sortie que git-annotate (défaut : désactivé)"
+msgstr "Utiliser le même mode de sortie que git-annotate (Défaut : désactivé)"
 
 #: builtin/blame.c:2365
 msgid "Show raw timestamp (Default: off)"
-msgstr "Afficher les horodatages bruts (défaut: désactivé)"
+msgstr "Afficher les horodatages bruts (Défaut: désactivé)"
 
 #: builtin/blame.c:2366
 msgid "Show long commit SHA1 (Default: off)"
-msgstr "Afficher les SHA1 longs (defaut : désactivé)"
+msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
 
 #: builtin/blame.c:2367
 msgid "Suppress author name and timestamp (Default: off)"
-msgstr "Supprimer le nom de l'auteur et l'horodatage (défaut : désactivé)"
+msgstr "Supprimer le nom de l'auteur et l'horodatage (Défaut : désactivé)"
 
 #: builtin/blame.c:2368
 msgid "Show author email instead of name (Default: off)"
-msgstr "Afficher l'e-mail de l'auteur au lieu du nom (défaut : désactivé)"
+msgstr "Afficher l'e-mail de l'auteur au lieu du nom (Défaut : désactivé)"
 
 #: builtin/blame.c:2369
 msgid "Ignore whitespace differences"
@@ -2387,7 +2442,7 @@ msgstr "Trouver les copies de ligne dans et entre les fichiers"
 
 #: builtin/blame.c:2374
 msgid "Find line movements within and across files"
-msgstr "Trouver les mouvements dans et entre les fichiers"
+msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
 
 #: builtin/blame.c:2375
 msgid "n,m"
@@ -2411,23 +2466,25 @@ msgstr "git branch [options] [-r] (-d | -D) <nomdebranche>..."
 
 #: builtin/branch.c:27
 msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
-msgstr "git branch [options] (-m | -M) [<anciennebranch>] <nouvellebranch>"
+msgstr "git branch [options] (-m | -M) [<anciennebranche>] <nouvellebranche>"
 
 #: builtin/branch.c:150
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
-msgstr "suppression de la branche '%s' qui a Ã©té fusionnée dans\n"
-"         '%s', mais pas dans  HEAD."
+msgstr ""
+"suppression de la branche '%s' qui a Ã©té fusionnée dans\n"
+"         '%s', mais pas dans HEAD."
 
 #: builtin/branch.c:154
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
 "         '%s', even though it is merged to HEAD."
-msgstr "branche '%s' non supprimée car elle n'a pas Ã©té fusionnée dans\n"
-"         '%s', mais dans HEAD."
+msgstr ""
+"branche '%s' non supprimée car elle n'a pas Ã©té fusionnée dans\n"
+"         '%s', même si elle est fusionnée dans HEAD."
 
 #: builtin/branch.c:168
 #, c-format
@@ -2439,12 +2496,13 @@ msgstr "Impossible de rechercher l'objet commit pour '%s'"
 msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
-msgstr "La branche '%s' n'est pas totalement fusionnée.\n"
-"Si vous Ãªtes sur que vous voulez la supprimer, lancez 'git branch -D %s'"
+msgstr ""
+"La branche '%s' n'est pas totalement fusionnée.\n"
+"Si vous Ãªtes sur que vous voulez la supprimer, lancez 'git branch -D %s'."
 
 #: builtin/branch.c:185
 msgid "Update of config-file failed"
-msgstr "Echec de la mise Ã  jour du fichier config"
+msgstr "Échec de la mise Ã  jour du fichier de config"
 
 #: builtin/branch.c:213
 msgid "cannot use -a with -d"
@@ -2457,7 +2515,7 @@ msgstr "Impossible de rechercher l'objet commit pour HEAD"
 #: builtin/branch.c:227
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr "Impossible d'effacer la branche '%s' qui est actuellement extraite"
+msgstr "Impossible de supprimer la branche '%s' sur laquelle vous Ãªtes."
 
 #: builtin/branch.c:240
 #, c-format
@@ -2482,12 +2540,12 @@ msgstr "Erreur lors de la suppression de la branche '%s'"
 #: builtin/branch.c:263
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
-msgstr "Branche distante %s supprimée (précédemment %s)\n"
+msgstr "Branche distante %s supprimée (précédemment %s).\n"
 
 #: builtin/branch.c:264
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
-msgstr "Branche %s supprimée (précédemment %s)\n"
+msgstr "Branche %s supprimée (précédemment %s).\n"
 
 #: builtin/branch.c:366
 #, c-format
@@ -2577,11 +2635,11 @@ msgstr "Renommage d'un branche mal nommée '%s'"
 #: builtin/branch.c:715
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr "La branche a Ã©té renommée '%s', mais HEAD n'est pas mis Ã  jour !"
+msgstr "La branche a Ã©té renommée en %s, mais HEAD n'est pas mise Ã  jour !"
 
 #: builtin/branch.c:722
 msgid "Branch is renamed, but update of config-file failed"
-msgstr "La branche est renommée, mais echec de la mise Ã  jour du fichier de config"
+msgstr "La branche est renommée, mais la mise Ã  jour du fichier de config a Ã©choué"
 
 #: builtin/branch.c:737
 #, c-format
@@ -2599,7 +2657,7 @@ msgstr "Options génériques"
 
 #: builtin/branch.c:793
 msgid "show hash and subject, give twice for upstream branch"
-msgstr "afficher le condensé et le sujet, doublé pour la branche amont"
+msgstr "afficher le hachage et le sujet, doublé pour la branche amont"
 
 #: builtin/branch.c:794
 msgid "suppress informational messages"
@@ -2619,7 +2677,7 @@ msgstr "utiliser la coloration dans la sortie"
 
 #: builtin/branch.c:802
 msgid "act on remote-tracking branches"
-msgstr "agir sur les branches de suivi distant"
+msgstr "agir sur les branches de suivi distantes"
 
 #: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832
 #: builtin/branch.c:838 builtin/commit.c:1368 builtin/commit.c:1369
@@ -2685,11 +2743,11 @@ msgstr "afficher les branches en colonnes"
 
 #: builtin/branch.c:855
 msgid "Failed to resolve HEAD as a valid ref."
-msgstr "Echec de résolution de HEAD comme référence valide."
+msgstr "Échec de résolution de HEAD comme référence valide."
 
 #: builtin/branch.c:860 builtin/clone.c:619
 msgid "HEAD not found below refs/heads!"
-msgstr "HEAD non trouvé sous refs/heads !"
+msgstr "HEAD non trouvée sous refs/heads !"
 
 #: builtin/branch.c:883
 msgid "--column and --verbose are incompatible"
@@ -2697,11 +2755,11 @@ msgstr "--column et --verbose sont incompatibles"
 
 #: builtin/branch.c:889 builtin/branch.c:928
 msgid "branch name required"
-msgstr "nom de branche exigé"
+msgstr "le nom de branche est requis"
 
 #: builtin/branch.c:904
 msgid "Cannot give description to detached HEAD"
-msgstr "Impossible de décrire  HEAD détaché"
+msgstr "Impossible de décrire une HEAD détachée"
 
 #: builtin/branch.c:909
 msgid "cannot edit description of more than one branch"
@@ -2710,7 +2768,7 @@ msgstr "impossible d'éditer la description de plus d'une branche"
 #: builtin/branch.c:916
 #, c-format
 msgid "No commit on branch '%s' yet."
-msgstr "Aucun commit sur la branche '%s'"
+msgstr "Aucun commit sur la branche '%s'."
 
 #: builtin/branch.c:919
 #, c-format
@@ -2734,12 +2792,12 @@ msgstr "impossible de spécifier une branche amont de HEAD par %s qui ne pointe
 #: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990
 #, c-format
 msgid "no such branch '%s'"
-msgstr "branche inexistante '%s'"
+msgstr "pas de branche '%s'"
 
 #: builtin/branch.c:950
 #, c-format
 msgid "branch '%s' does not exist"
-msgstr "branche inexistante '%s'"
+msgstr "la branche '%s' n'existe pas"
 
 #: builtin/branch.c:962
 msgid "too many branches to unset upstream"
@@ -2747,7 +2805,7 @@ msgstr "trop de branches pour désactiver un amont"
 
 #: builtin/branch.c:966
 msgid "could not unset upstream of HEAD when it does not point to any branch."
-msgstr "impossible de désactiver une branche amont de HEAD qu'elle ne pointe sur aucune branche."
+msgstr "impossible de désactiver une branche amont de HEAD quand elle ne pointe sur aucune branche."
 
 #: builtin/branch.c:972
 #, c-format
@@ -2792,15 +2850,15 @@ msgstr "    git branch -set-upstream-to %s\n"
 #: builtin/bundle.c:47
 #, c-format
 msgid "%s is okay\n"
-msgstr "%s convient\n"
+msgstr "%s est correct\n"
 
 #: builtin/bundle.c:56
 msgid "Need a repository to create a bundle."
-msgstr "La création d'un bundle requiert un dépôt."
+msgstr "La création d'un colis requiert un dépôt."
 
 #: builtin/bundle.c:60
 msgid "Need a repository to unbundle."
-msgstr "Le dépaquetage d'un bundle requiert un dépôt."
+msgstr "Le dépaquetage d'un colis requiert un dépôt."
 
 #: builtin/cat-file.c:176
 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
@@ -2820,7 +2878,7 @@ msgstr "afficher le type de l'objet"
 
 #: builtin/cat-file.c:197
 msgid "show object size"
-msgstr "affichier la taille de l'objet"
+msgstr "afficher la taille de l'objet"
 
 #: builtin/cat-file.c:199
 msgid "exit with zero when there's no error"
@@ -2836,7 +2894,7 @@ msgstr "pour les objets blob, lancer textconv sur le contenu de l'objet"
 
 #: builtin/cat-file.c:204
 msgid "show info and content of objects fed from the standard input"
-msgstr "afficher l'information et le contenu des objets passé en entrée standard"
+msgstr "afficher l'information et le contenu des objets passés en entrée standard"
 
 #: builtin/cat-file.c:207
 msgid "show info about objects fed from the standard input"
@@ -2868,11 +2926,11 @@ msgstr "les chemins en entrée sont terminés par le caractère nul"
 
 #: builtin/check-ignore.c:18 builtin/checkout.c:1044 builtin/gc.c:177
 msgid "suppress progress reporting"
-msgstr "supprimer le rapport de progrès"
+msgstr "supprimer l'état d'avancement"
 
 #: builtin/check-ignore.c:146
 msgid "cannot specify pathnames with --stdin"
-msgstr "l'option --stdin et la spécification de chemin sont incompatibles"
+msgstr "impossible de spécifier les chemins avec --stdin"
 
 #: builtin/check-ignore.c:149
 msgid "-z only makes sense with --stdin"
@@ -2888,7 +2946,7 @@ msgstr "--quiet n'est valide qu'avec un seul chemin"
 
 #: builtin/check-ignore.c:157
 msgid "cannot have both --quiet and --verbose"
-msgstr "les options --quiet et --verbose sont incompatibles"
+msgstr "impossible d'avoir --quiet et --verbose"
 
 #: builtin/checkout-index.c:126
 msgid "git checkout-index [options] [--] [<file>...]"
@@ -2900,11 +2958,11 @@ msgstr "extraire tous les fichiers présents dans l'index"
 
 #: builtin/checkout-index.c:188
 msgid "force overwrite of existing files"
-msgstr "forcer l'écrasement des fichiers existant"
+msgstr "forcer l'écrasement des fichiers existants"
 
 #: builtin/checkout-index.c:190
 msgid "no warning for existing files and files not in index"
-msgstr "éliminer les alertes pour les fichiers existant et les fichiers absents de l'index"
+msgstr "pas d'avertissement pour les fichiers existants et les fichiers absents de l'index"
 
 #: builtin/checkout-index.c:192
 msgid "don't checkout new files"
@@ -2928,7 +2986,7 @@ msgstr "chaîne"
 
 #: builtin/checkout-index.c:204
 msgid "when creating files, prepend <string>"
-msgstr "lors de la création de fichiers, préfixer <chaîne>"
+msgstr "lors de la création de fichiers, préfixer par <chaîne>"
 
 #: builtin/checkout-index.c:207
 msgid "copy out the files from named stage"
@@ -2965,7 +3023,7 @@ msgstr "le chemin '%s' n'a pas les versions nécessaires"
 #: builtin/checkout.c:196
 #, c-format
 msgid "path '%s': cannot merge"
-msgstr "impossible de fusionner le chemin '%s'"
+msgstr "chemin '%s' : impossible de fusionner"
 
 #: builtin/checkout.c:213
 #, c-format
@@ -3008,7 +3066,7 @@ msgstr "Impossible de faire un reflog pour '%s'\n"
 
 #: builtin/checkout.c:634
 msgid "HEAD is now at"
-msgstr "HEAD est maintenant sur "
+msgstr "HEAD est maintenant sur"
 
 #: builtin/checkout.c:641
 #, c-format
@@ -3053,12 +3111,14 @@ msgid_plural ""
 "any of your branches:\n"
 "\n"
 "%s\n"
-msgstr[0] "Attention : vous laissez %d commit en retard, connectés Ã  aucune de vos\n"
-"branches :\n"
+msgstr[0] ""
+"Attention : vous laissez %d commit en retard, non connectés Ã \n"
+"une branche :\n"
 "\n"
 "%s\n"
-msgstr[1] "Attention : vous laissez %d commits en retard, connectés Ã  aucune de vos\n"
-"branches :\n"
+msgstr[1] ""
+"Attention : vous laissez %d commits en retard, non connectés Ã \n"
+"une branche :\n"
 "\n"
 "%s\n"
 
@@ -3070,7 +3130,9 @@ msgid ""
 "\n"
 " git branch new_branch_name %s\n"
 "\n"
-msgstr "Si vous souhaitez les garder en créant une nouvelle branches, c'est le bon moment avec :\n"
+msgstr ""
+"Si vous souhaitez les garder en créant une nouvelle branche, c'est le bon moment\n"
+"de le faire avec :\n"
 "\n"
 "git branche nouvelle_branche %s\n"
 "\n"
@@ -3081,7 +3143,7 @@ msgstr "erreur interne lors du parcours des révisions"
 
 #: builtin/checkout.c:766
 msgid "Previous HEAD position was"
-msgstr "Lo position précédente de HEAD Ã©tait "
+msgstr "La position précédente de HEAD Ã©tait"
 
 #: builtin/checkout.c:793 builtin/checkout.c:982
 msgid "You are on a branch yet to be born"
@@ -3106,13 +3168,13 @@ msgstr "impossible d'utiliser des chemins avec un basculement de branches"
 #: builtin/checkout.c:999 builtin/checkout.c:1003
 #, c-format
 msgid "'%s' cannot be used with switching branches"
-msgstr "impossible d'utiliser '%s' avec un basculement de branches "
+msgstr "'%s' ne peut pas Ãªtre utilisé avec un basculement de branches"
 
 #: builtin/checkout.c:1007 builtin/checkout.c:1010 builtin/checkout.c:1015
 #: builtin/checkout.c:1018
 #, c-format
 msgid "'%s' cannot be used with '%s'"
-msgstr "impossible d'utiliser '%s' avec '%s'"
+msgstr "'%s' ne peut pas Ãªtre utilisé avec '%s'"
 
 #: builtin/checkout.c:1023
 #, c-format
@@ -3126,11 +3188,11 @@ msgstr "branche"
 
 #: builtin/checkout.c:1046
 msgid "create and checkout a new branch"
-msgstr "créer et extrait une nouvelle branche"
+msgstr "créer et extraire une nouvelle branche"
 
 #: builtin/checkout.c:1048
 msgid "create/reset and checkout a branch"
-msgstr "créer/reinitialise et extrait une branche"
+msgstr "créer/réinitialiser et extraire une branche"
 
 #: builtin/checkout.c:1049
 msgid "create reflog for new branch"
@@ -3138,11 +3200,11 @@ msgstr "créer un refog pour une nouvelle branche"
 
 #: builtin/checkout.c:1050
 msgid "detach the HEAD at named commit"
-msgstr "détacher le HEAD au commit nommé"
+msgstr "détacher la HEAD Ã  la validation nommée"
 
 #: builtin/checkout.c:1051
 msgid "set upstream info for new branch"
-msgstr "paramètrer l'information de branche amont pour une nouvelle branche"
+msgstr "paramétrer l'information de branche amont pour une nouvelle branche"
 
 #: builtin/checkout.c:1053
 msgid "new branch"
@@ -3162,7 +3224,7 @@ msgstr "extraire leur version pour les fichiers non fusionnés"
 
 #: builtin/checkout.c:1058
 msgid "force checkout (throw away local modifications)"
-msgstr "forcer l'extraction (écraser les modifications locales)"
+msgstr "forcer l'extraction (laisser tomber les modifications locales)"
 
 #: builtin/checkout.c:1059
 msgid "perform a 3-way merge with the new branch"
@@ -3194,11 +3256,11 @@ msgstr "-b, -B et --orphan sont mutuellement exclusifs"
 
 #: builtin/checkout.c:1108
 msgid "--track needs a branch name"
-msgstr "un nom de branche est nécessaire pour --track"
+msgstr "--track requiert un nom de branche"
 
 #: builtin/checkout.c:1115
 msgid "Missing branch name; try -b"
-msgstr "Nom de branche manquant ; essayez avec -b"
+msgstr "Nom de branche manquant ; essayez -b"
 
 #: builtin/checkout.c:1150
 msgid "invalid path specification"
@@ -3209,24 +3271,26 @@ msgstr "spécification de chemin invalide"
 msgid ""
 "Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
-msgstr "Impossible e mettre Ã  jour les chemins et de basculer sur la branche '%s' en même temps.\n"
+msgstr ""
+"Impossible de mettre Ã  jour les chemins et de basculer sur la branche '%s' en même temps.\n"
 "Souhaitiez-vous extraire '%s' qui ne peut Ãªtre résolu comme commit ?"
 
 #: builtin/checkout.c:1162
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr "git checkout: --detach d'accepte pas un argument de chemin '%s'"
+msgstr "git checkout: --detach n'accepte pas un argument de chemin '%s'"
 
 #: builtin/checkout.c:1166
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
-msgstr "git checkout: --ours/--theirs, --force et --merge sont incompatible lors\n"
+msgstr ""
+"git checkout: --ours/--theirs, --force et --merge sont incompatibles lors\n"
 "de l'extraction de l'index."
 
 #: builtin/clean.c:20
 msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
-msgstr "git clean [-d] [-f] [-n] [-q] [-e <expression>] [-x | -X] [--] <chemins>..."
+msgstr "git clean [-d] [-f] [-n] [-q] [-e <motif>] [-x | -X] [--] <chemins>..."
 
 #: builtin/clean.c:24
 #, c-format
@@ -3241,7 +3305,7 @@ msgstr "Supprimerait %s\n"
 #: builtin/clean.c:26
 #, c-format
 msgid "Skipping repository %s\n"
-msgstr "Dépôt %s ignoré\n"
+msgstr "Ignore le dépôt %s\n"
 
 #: builtin/clean.c:27
 #, c-format
@@ -3251,7 +3315,7 @@ msgstr "Ignorerait le dépôt %s\n"
 #: builtin/clean.c:28
 #, c-format
 msgid "failed to remove %s"
-msgstr "echec de la suppression de %s"
+msgstr "échec de la suppression de %s"
 
 #: builtin/clean.c:160
 msgid "do not print names of files removed"
@@ -3263,16 +3327,16 @@ msgstr "forcer"
 
 #: builtin/clean.c:164
 msgid "remove whole directories"
-msgstr "supprimer des répertoires entiers"
+msgstr "supprimer les répertoires entiers"
 
 #: builtin/clean.c:165 builtin/describe.c:412 builtin/grep.c:717
 #: builtin/ls-files.c:487 builtin/name-rev.c:231 builtin/show-ref.c:182
 msgid "pattern"
-msgstr "expression"
+msgstr "motif"
 
 #: builtin/clean.c:166
 msgid "add <pattern> to ignore rules"
-msgstr "ajouter <expression> aux règles ignore"
+msgstr "ajouter <motif> aux règles ignore"
 
 #: builtin/clean.c:167
 msgid "remove ignored files, too"
@@ -3284,7 +3348,7 @@ msgstr "supprimer seulement les fichiers ignorés"
 
 #: builtin/clean.c:187
 msgid "-x and -X cannot be used together"
-msgstr "-x et -X sont mutuellement exclusifs"
+msgstr "-x et -X ne peuvent pas Ãªtre utilisés ensemble"
 
 #: builtin/clean.c:191
 msgid ""
@@ -3304,7 +3368,7 @@ msgstr "git clone [options] [--] <dépôt> [<répertoire>]"
 #: builtin/clone.c:65 builtin/fetch.c:82 builtin/merge.c:214
 #: builtin/push.c:436
 msgid "force progress reporting"
-msgstr "forcer l'affichage du progrès"
+msgstr "forcer l'état d'avancement"
 
 #: builtin/clone.c:67
 msgid "don't create a checkout"
@@ -3324,11 +3388,11 @@ msgstr "pour cloner depuis un dépôt local"
 
 #: builtin/clone.c:77
 msgid "don't use local hardlinks, always copy"
-msgstr "ne pas utiliser de liens durs locaux, mais toujours copier"
+msgstr "ne pas utiliser de liens durs locaux, toujours copier"
 
 #: builtin/clone.c:79
 msgid "setup as shared repository"
-msgstr "régler comme dépôt partager"
+msgstr "régler comme dépôt partagé"
 
 #: builtin/clone.c:81 builtin/clone.c:83
 msgid "initialize submodules in the clone"
@@ -3352,11 +3416,11 @@ msgstr "nom"
 
 #: builtin/clone.c:89
 msgid "use <name> instead of 'origin' to track upstream"
-msgstr "utiliser <nom> au lieu de 'origin' pour traquer la branche amont"
+msgstr "utiliser <nom> au lieu de 'origin' pour suivre la branche amont"
 
 #: builtin/clone.c:91
 msgid "checkout <branch> instead of the remote's HEAD"
-msgstr "extraire <branche> au lieu du HEAD du répertoire distant"
+msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
 
 #: builtin/clone.c:93
 msgid "path to git-upload-pack on the remote"
@@ -3372,7 +3436,7 @@ msgstr "créer un clone superficiel de cette profondeur"
 
 #: builtin/clone.c:97
 msgid "clone only one branch, HEAD or --branch"
-msgstr "clonez seulement une branche, HEAD ou --branch"
+msgstr "cloner seulement une branche, HEAD ou --branch"
 
 #: builtin/clone.c:98 builtin/init-db.c:494
 msgid "gitdir"
@@ -3393,37 +3457,37 @@ msgstr "régler la configuration dans le nouveau dépôt"
 #: builtin/clone.c:254
 #, c-format
 msgid "reference repository '%s' is not a local repository."
-msgstr "le dépôt de référence '%s' n'est pas un dépôt local"
+msgstr "le dépôt de référence '%s' n'est pas un dépôt local."
 
 #: builtin/clone.c:317
 #, c-format
 msgid "failed to create directory '%s'"
-msgstr "echec de la création du répertoire '%s'"
+msgstr "échec de la création du répertoire '%s'"
 
 #: builtin/clone.c:319 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
-msgstr "echec du stat de '%s'"
+msgstr "échec du stat de '%s'"
 
 #: builtin/clone.c:321
 #, c-format
 msgid "%s exists and is not a directory"
-msgstr "%s existe  et n'est pas un répertoire"
+msgstr "%s existe et n'est pas un répertoire"
 
 #: builtin/clone.c:335
 #, c-format
 msgid "failed to stat %s\n"
-msgstr "echec du stat de %s\n"
+msgstr "échec du stat de %s\n"
 
 #: builtin/clone.c:357
 #, c-format
 msgid "failed to create link '%s'"
-msgstr "echec de la création du lien '%s'"
+msgstr "échec de la création du lien '%s'"
 
 #: builtin/clone.c:361
 #, c-format
 msgid "failed to copy file to '%s'"
-msgstr "echec de la copie vers '%s'"
+msgstr "échec de la copie vers '%s'"
 
 #: builtin/clone.c:384
 #, c-format
@@ -3450,15 +3514,15 @@ msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires"
 
 #: builtin/clone.c:610
 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr "le HEAD distant réfère Ã  une référence non existante, impossible de l'extraire.\n"
+msgstr "la HEAD distante réfère Ã  une référence non existante, impossible de l'extraire.\n"
 
 #: builtin/clone.c:641
 msgid "unable to checkout working tree"
-msgstr "incapable d'extraire la copie de travail"
+msgstr "inpossible d'extraire la copie de travail"
 
 #: builtin/clone.c:749
 msgid "Too many arguments."
-msgstr "Trop d'arguments"
+msgstr "Trop d'arguments."
 
 #: builtin/clone.c:753
 msgid "You must specify a repository to clone."
@@ -3467,11 +3531,11 @@ msgstr "Vous devez spécifier un dépôt Ã  cloner."
 #: builtin/clone.c:764
 #, c-format
 msgid "--bare and --origin %s options are incompatible."
-msgstr "les options --bare et --origin %s sont incompatibles"
+msgstr "les options --bare et --origin %s sont incompatibles."
 
 #: builtin/clone.c:767
 msgid "--bare and --separate-git-dir are incompatible."
-msgstr "les option --bare --separate-git-dir sont incompatibles."
+msgstr "--bare et --separate-git-dir sont incompatibles."
 
 #: builtin/clone.c:780
 #, c-format
@@ -3480,12 +3544,12 @@ msgstr "le dépôt '%s' n'existe pas"
 
 #: builtin/clone.c:785
 msgid "--depth is ignored in local clones; use file:// instead."
-msgstr "--depth est ignoré dans les clones locaux : utilisez plutôt file://"
+msgstr "--depth est ignoré dans les clones locaux : utilisez plutôt \"file://\"."
 
 #: builtin/clone.c:795
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
-msgstr "le chemin de destination '%s' existe déjà et n'est  pas un répertoire vide."
+msgstr "le chemin de destination '%s' existe déjà et n'est pas un répertoire vide."
 
 #: builtin/clone.c:805
 #, c-format
@@ -3500,7 +3564,7 @@ msgstr "impossible de créer les répertoires de premier niveau dans '%s'"
 #: builtin/clone.c:821
 #, c-format
 msgid "could not create work tree dir '%s'."
-msgstr "impossible de créer le répertoire de la copie de travail '%s'"
+msgstr "impossible de créer le répertoire de la copie de travail '%s'."
 
 #: builtin/clone.c:840
 #, c-format
@@ -3510,12 +3574,12 @@ msgstr "Clonage dans le dépôt nu '%s'\n"
 #: builtin/clone.c:842
 #, c-format
 msgid "Cloning into '%s'...\n"
-msgstr "Clonage dans '%s'\n"
+msgstr "Clonage dans '%s'...\n"
 
 #: builtin/clone.c:877
 #, c-format
 msgid "Don't know how to clone %s"
-msgstr "Je ne sais pas cloner '%s'"
+msgstr "Je ne sais pas cloner %s"
 
 #: builtin/clone.c:926
 #, c-format
@@ -3544,15 +3608,15 @@ msgstr "Largeur maximale"
 
 #: builtin/column.c:30
 msgid "Padding space on left border"
-msgstr "Tabulation sur le côté gauche"
+msgstr "Remplissage d'espace sur la bordure gauche"
 
 #: builtin/column.c:31
 msgid "Padding space on right border"
-msgstr "Tabulation sur le côté droit"
+msgstr "Remplissage d'espace sur le côté droit"
 
 #: builtin/column.c:32
 msgid "Padding space between columns"
-msgstr "Tabulation entre colonnes"
+msgstr "Remplissage d'espace entre les colonnes"
 
 #: builtin/column.c:51
 msgid "--command must be the first argument"
@@ -3560,11 +3624,11 @@ msgstr "--command doit Ãªtre le premier argument"
 
 #: builtin/commit.c:34
 msgid "git commit [options] [--] <pathspec>..."
-msgstr "git commit [options] [--] <spécification de chemin>..."
+msgstr "git commit [options] [--] <spécification-de-chemin>..."
 
 #: builtin/commit.c:39
 msgid "git status [options] [--] <pathspec>..."
-msgstr "git status [options] [--] <spécification de chemin>..."
+msgstr "git status [options] [--] <spécification-de-chemin>..."
 
 #: builtin/commit.c:44
 msgid ""
@@ -3578,12 +3642,13 @@ msgid ""
 "After doing this, you may fix the identity used for this commit with:\n"
 "\n"
 "    git commit --amend --reset-author\n"
-msgstr "Votre nom et votre adresse e-mail ont Ã©té configurés automatiquement en se fondant\n"
+msgstr ""
+"Votre nom et votre adresse e-mail ont Ã©té configurés automatiquement en se fondant\n"
 "sur votre nom d'utilisateur et votre nom d'ordinateur. Veuillez vérifier qu'ils sont corrects.\n"
 "Vous pouvez supprimer ce message en les paramétrant explicitement :\n"
 "\n"
 "    git config --global user.name \"Votre Nom\"\n"
-"    git config --global user.email \"vous@exemple.com\n"
+"    git config --global user.email vous@exemple.com\n"
 "\n"
 "Après ceci, vous pouvez corriger l'identité utilisée pour ce commit avec :\n"
 "\n"
@@ -3606,7 +3671,8 @@ msgid ""
 "    git commit --allow-empty\n"
 "\n"
 "Otherwise, please use 'git reset'\n"
-msgstr "Le picorage précédent est Ã  présent vide, vraisemblablement du Ã  une résolution de conflit.\n"
+msgstr ""
+"Le picorage précédent est Ã  présent vide, vraisemblablement dû Ã  une résolution de conflit.\n"
 "Si vous souhaitez tout de même le valider, utilisez :\n"
 "\n"
 "    git commit --allow-empty\n"
@@ -3615,7 +3681,7 @@ msgstr "Le picorage précédent est Ã  présent vide, vraisemblablement du Ã  un
 
 #: builtin/commit.c:260
 msgid "failed to unpack HEAD tree object"
-msgstr "echec du dépaquetage de l'objet arbre HEAD"
+msgstr "échec du dépaquetage de l'objet arbre HEAD"
 
 #: builtin/commit.c:302
 msgid "unable to create temporary index"
@@ -3623,7 +3689,7 @@ msgstr "impossible de créer l'index temporaire"
 
 #: builtin/commit.c:308
 msgid "interactive add failed"
-msgstr "echec de l'ajout interactif"
+msgstr "échec de l'ajout interactif"
 
 #: builtin/commit.c:341 builtin/commit.c:362 builtin/commit.c:412
 msgid "unable to write new_index file"
@@ -3657,7 +3723,7 @@ msgstr "paramètre --author mal formé"
 #: builtin/commit.c:562
 #, c-format
 msgid "Malformed ident string: '%s'"
-msgstr "chaîne ident mal formée : '%s'"
+msgstr "Chaîne ident mal formée : '%s'"
 
 #: builtin/commit.c:600 builtin/commit.c:633 builtin/commit.c:956
 #, c-format
@@ -3707,7 +3773,8 @@ msgid ""
 "If this is not correct, please remove the file\n"
 "\t%s\n"
 "and try again.\n"
-msgstr "\n"
+msgstr ""
+"\n"
 "Il semble que vous validiez une fusion.\n"
 "Si ce n'est pas le cas, veuillez supprimer le fichier\n"
 "\t%s\n"
@@ -3721,7 +3788,8 @@ msgid ""
 "If this is not correct, please remove the file\n"
 "\t%s\n"
 "and try again.\n"
-msgstr "\n"
+msgstr ""
+"\n"
 "Il semble que vous validiez un picorage.\n"
 "Si ce n'est pas le cas, veuillez supprimer le fichier\n"
 "\t%s\n"
@@ -3732,9 +3800,9 @@ msgstr "\n"
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '%c' will be ignored, and an empty message aborts the commit.\n"
-msgstr "Veuillez saisir le message de validation pour vos modifications. Les lignes\n"
-"commençant par '%c' seront ignorées, et un message vide abandonne la\n"
-"validation.\n"
+msgstr ""
+"Veuillez saisir le message de validation pour vos modifications. Les lignes\n"
+"commençant par '%c' seront ignorées, et un message vide abandonne la validation.\n"
 
 #: builtin/commit.c:742
 #, c-format
@@ -3742,19 +3810,20 @@ msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '%c' will be kept; you may remove them yourself if you want to.\n"
 "An empty message aborts the commit.\n"
-msgstr "Veuillez saisir le message de validation pour vos modifications. Les lignes\n"
-"commençant par '%c' seront conservées ; vous pouvez les supprimer vous-\n"
-"même si vous le souhaitez. Un message vide abandonne la validation.\n"
+msgstr ""
+"Veuillez saisir le message de validation pour vos modifications. Les lignes\n"
+"commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n"
+"si vous le souhaitez. Un message vide abandonne la validation.\n"
 
 #: builtin/commit.c:755
 #, c-format
 msgid "%sAuthor:    %s"
-msgstr "%sAuteur : %s"
+msgstr "%sAuteur :     %s"
 
 #: builtin/commit.c:762
 #, c-format
 msgid "%sCommitter: %s"
-msgstr "%s Validateur: %s"
+msgstr "%sValidateur : %s"
 
 #: builtin/commit.c:782
 msgid "Cannot read index"
@@ -3781,7 +3850,7 @@ msgstr "Mode de fichier non suivi invalide '%s'"
 
 #: builtin/commit.c:976
 msgid "Using both --reset-author and --author does not make sense"
-msgstr "L'utilisation concurrente de --reset-author et --author n'a pas de sens"
+msgstr "L'utilisation simultanée de --reset-author et --author n'a pas de sens"
 
 #: builtin/commit.c:987
 msgid "You have nothing to amend."
@@ -3797,7 +3866,7 @@ msgstr "Vous Ãªtes en plein picorage -- impossible de corriger (amend)."
 
 #: builtin/commit.c:995
 msgid "Options --squash and --fixup cannot be used together"
-msgstr "Les options --squash et --fixup sont incompatibles"
+msgstr "Les options --squash et --fixup ne peuvent pas Ãªtre utilisées ensemble"
 
 #: builtin/commit.c:1005
 msgid "Only one of -c/-C/-F/--fixup can be used."
@@ -3821,7 +3890,7 @@ msgstr "Aucun chemin avec les options --include/--only n'a pas de sens."
 
 #: builtin/commit.c:1036
 msgid "Clever... amending the last one with dirty index."
-msgstr "Malin... correction du dernier commit avec un index sale."
+msgstr "Malin... correction du dernier avec un index sale."
 
 #: builtin/commit.c:1038
 msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
@@ -7376,150 +7445,152 @@ msgstr ""
 
 #: builtin/remote.c:11
 msgid "git remote [-v | --verbose]"
-msgstr ""
+msgstr "git remote [-v | --verbose]"
 
 #: builtin/remote.c:12
 msgid ""
 "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
 "mirror=<fetch|push>] <name> <url>"
-msgstr ""
+msgstr "git remote add [-t <branche>] [-m <maîtresse>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <nom> <URL>"
 
 #: builtin/remote.c:13 builtin/remote.c:32
 msgid "git remote rename <old> <new>"
-msgstr ""
+msgstr "git remote rename <ancienne> <nouvelle>"
 
 #: builtin/remote.c:14 builtin/remote.c:37
 msgid "git remote remove <name>"
-msgstr ""
+msgstr "git remote remove <nom>"
 
 #: builtin/remote.c:15 builtin/remote.c:42
 msgid "git remote set-head <name> (-a | -d | <branch>)"
-msgstr ""
+msgstr "git remote set-head <nom> (-a | -d | <branche>)"
 
 #: builtin/remote.c:16
 msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr ""
+msgstr "git remote [-v | --verbose] show [-n] <nom>"
 
 #: builtin/remote.c:17
 msgid "git remote prune [-n | --dry-run] <name>"
-msgstr ""
+msgstr "git remote prune [-n | --dry-run] <nom>"
 
 #: builtin/remote.c:18
 msgid ""
 "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
-msgstr ""
+msgstr "git remote [-v | --verbose] update [-p | --prune] [(<groupe> | <distante>)...]"
 
 #: builtin/remote.c:19
 msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr ""
+msgstr "git remote set-branches [--add] <nom> <branche>..."
 
 #: builtin/remote.c:20 builtin/remote.c:68
 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr ""
+msgstr "git remote set-url [--push] <nom> <nouvelle-URL> [<ancienne-URL>]"
 
 #: builtin/remote.c:21 builtin/remote.c:69
 msgid "git remote set-url --add <name> <newurl>"
-msgstr ""
+msgstr "git remote set-url --add <nom> <nouvelle-URL>"
 
 #: builtin/remote.c:22 builtin/remote.c:70
 msgid "git remote set-url --delete <name> <url>"
-msgstr ""
+msgstr "git remote set-url --delete <nom> <URL>"
 
 #: builtin/remote.c:27
 msgid "git remote add [<options>] <name> <url>"
-msgstr ""
+msgstr "git remote add [<options>] <nom> <URL>"
 
 #: builtin/remote.c:47
 msgid "git remote set-branches <name> <branch>..."
-msgstr ""
+msgstr "git remote set-branches <nom> <branche>..."
 
 #: builtin/remote.c:48
 msgid "git remote set-branches --add <name> <branch>..."
-msgstr ""
+msgstr "git remote set-branches --add <nom> <branche>..."
 
 #: builtin/remote.c:53
 msgid "git remote show [<options>] <name>"
-msgstr ""
+msgstr "git remote show [<options>] <nom>"
 
 #: builtin/remote.c:58
 msgid "git remote prune [<options>] <name>"
-msgstr ""
+msgstr "git remote prune [<options>] <nom>"
 
 #: builtin/remote.c:63
 msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr ""
+msgstr "git remote update [<options>] [<groupe> | <distante>]..."
 
 #: builtin/remote.c:98
 #, c-format
 msgid "Updating %s"
-msgstr ""
+msgstr "Mise Ã  jour de %s"
 
 #: builtin/remote.c:130
 msgid ""
 "--mirror is dangerous and deprecated; please\n"
 "\t use --mirror=fetch or --mirror=push instead"
 msgstr ""
+"--mirror est dangereux et obsolète ; merci\n"
+"\t d'utiliser --mirror=fetch ou --mirror=push Ã  la place"
 
 #: builtin/remote.c:147
 #, c-format
 msgid "unknown mirror argument: %s"
-msgstr ""
+msgstr "argument miroir inconnu : %s"
 
 #: builtin/remote.c:163
 msgid "fetch the remote branches"
-msgstr ""
+msgstr "rapatrier les branches distantes"
 
 #: builtin/remote.c:165
 msgid "import all tags and associated objects when fetching"
-msgstr ""
+msgstr "importer toutes les Ã©tiquettes et les objets associés lors du rapatriement"
 
 #: builtin/remote.c:168
 msgid "or do not fetch any tag at all (--no-tags)"
-msgstr ""
+msgstr "ou ne rapatrier aucune Ã©tiquette (--no-tags)"
 
 #: builtin/remote.c:170
 msgid "branch(es) to track"
-msgstr ""
+msgstr "branche(s) Ã  suivre"
 
 #: builtin/remote.c:171
 msgid "master branch"
-msgstr ""
+msgstr "branche maîtresse"
 
 #: builtin/remote.c:172
 msgid "push|fetch"
-msgstr ""
+msgstr "push|fetch"
 
 #: builtin/remote.c:173
 msgid "set up remote as a mirror to push to or fetch from"
-msgstr ""
+msgstr "paramétrer la distante comme miroir pour pousser ou pour rapatrier depuis"
 
 #: builtin/remote.c:185
 msgid "specifying a master branch makes no sense with --mirror"
-msgstr ""
+msgstr "spécifier une branche maîtresse n'a pas de sens avec --mirror"
 
 #: builtin/remote.c:187
 msgid "specifying branches to track makes sense only with fetch mirrors"
-msgstr ""
+msgstr "spécifier les branches Ã  suivre n'a de sens qu'avec des miroirs de rapatriement"
 
 #: builtin/remote.c:195 builtin/remote.c:646
 #, c-format
 msgid "remote %s already exists."
-msgstr ""
+msgstr "la distante %s existe déjà."
 
 #: builtin/remote.c:199 builtin/remote.c:650
 #, c-format
 msgid "'%s' is not a valid remote name"
-msgstr ""
+msgstr "'%s' n'est pas un nom valide de distante"
 
 #: builtin/remote.c:243
 #, c-format
 msgid "Could not setup master '%s'"
-msgstr ""
+msgstr "Impossible de paramétrer la maîtresse '%s'"
 
 #: builtin/remote.c:299
 #, c-format
 msgid "more than one %s"
-msgstr ""
+msgstr "plus d'un %s"
 
 #: builtin/remote.c:339
 #, c-format
@@ -7528,31 +7599,31 @@ msgstr ""
 
 #: builtin/remote.c:440 builtin/remote.c:448
 msgid "(matching)"
-msgstr ""
+msgstr "(correspond)"
 
 #: builtin/remote.c:452
 msgid "(delete)"
-msgstr ""
+msgstr "(supprimer)"
 
 #: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607
 #, c-format
 msgid "Could not append '%s' to '%s'"
-msgstr ""
+msgstr "Impossible d'ajouter '%s' Ã  '%s'"
 
 #: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890
 #, c-format
 msgid "No such remote: %s"
-msgstr ""
+msgstr "Distante inconnue : %s"
 
 #: builtin/remote.c:656
 #, c-format
 msgid "Could not rename config section '%s' to '%s'"
-msgstr ""
+msgstr "Impossible de renommer la section de configuration '%s' en '%s'"
 
 #: builtin/remote.c:662 builtin/remote.c:799
 #, c-format
 msgid "Could not remove config section '%s'"
-msgstr ""
+msgstr "Impossible de supprimer la section de configuration '%s'"
 
 #: builtin/remote.c:677
 #, c-format
@@ -7561,31 +7632,34 @@ msgid ""
 "\t%s\n"
 "\tPlease update the configuration manually if necessary."
 msgstr ""
+"Pas de mise Ã  jour du refspec de rapatriement qui n'est pas par défaut\n"
+"\t%s\n"
+"\tMerci de mettre Ã  jour la configuration si nécessaire."
 
 #: builtin/remote.c:683
 #, c-format
 msgid "Could not append '%s'"
-msgstr ""
+msgstr "Impossible d'ajouter '%s'"
 
 #: builtin/remote.c:694
 #, c-format
 msgid "Could not set '%s'"
-msgstr ""
+msgstr "Impossible de définir '%s'"
 
 #: builtin/remote.c:716
 #, c-format
 msgid "deleting '%s' failed"
-msgstr ""
+msgstr "échec de suppression de '%s'"
 
 #: builtin/remote.c:750
 #, c-format
 msgid "creating '%s' failed"
-msgstr ""
+msgstr "échec de création de '%s'"
 
 #: builtin/remote.c:764
 #, c-format
 msgid "Could not remove branch %s"
-msgstr ""
+msgstr "Impossible de supprimer la branche %s"
 
 #: builtin/remote.c:834
 msgid ""
@@ -7595,258 +7669,262 @@ msgid_plural ""
 "Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
 "to delete them, use:"
 msgstr[0] ""
+"Note : Une branche en dehors de refs/remotes/ n'a pas Ã©té supprimée ;\n"
+"pour la supprimer, utilisez :"
 msgstr[1] ""
+"Note : Plusieurs branches en dehors de refs/remotes/ n'ont pas Ã©té supprimées ;\n"
+"pour les supprimer, utilisez :"
 
 #: builtin/remote.c:943
 #, c-format
 msgid " new (next fetch will store in remotes/%s)"
-msgstr ""
+msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)"
 
 #: builtin/remote.c:946
 msgid " tracked"
-msgstr ""
+msgstr " suivi"
 
 #: builtin/remote.c:948
 msgid " stale (use 'git remote prune' to remove)"
-msgstr ""
+msgstr " dépassé (utilisez 'git remote prune' pour supprimer)"
 
 #: builtin/remote.c:950
 msgid " ???"
-msgstr ""
+msgstr " ???"
 
 #: builtin/remote.c:991
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr ""
+msgstr "branch.%s.merge invalide ; ne peut pas rebaser sur plus d'une branche"
 
 #: builtin/remote.c:998
 #, c-format
 msgid "rebases onto remote %s"
-msgstr ""
+msgstr "rebase sur la distante %s"
 
 #: builtin/remote.c:1001
 #, c-format
 msgid " merges with remote %s"
-msgstr ""
+msgstr " fusionne avec la distante %s"
 
 #: builtin/remote.c:1002
 msgid "    and with remote"
-msgstr ""
+msgstr "    et avec la distante"
 
 #: builtin/remote.c:1004
 #, c-format
 msgid "merges with remote %s"
-msgstr ""
+msgstr "fusionne avec la distante %s"
 
 #: builtin/remote.c:1005
 msgid "   and with remote"
-msgstr ""
+msgstr "   et avec la distante"
 
 #: builtin/remote.c:1051
 msgid "create"
-msgstr ""
+msgstr "créer"
 
 #: builtin/remote.c:1054
 msgid "delete"
-msgstr ""
+msgstr "supprimer"
 
 #: builtin/remote.c:1058
 msgid "up to date"
-msgstr ""
+msgstr "à jour"
 
 #: builtin/remote.c:1061
 msgid "fast-forwardable"
-msgstr ""
+msgstr "peut Ãªtre mis Ã  jour en avance rapide"
 
 #: builtin/remote.c:1064
 msgid "local out of date"
-msgstr ""
+msgstr "le local n'est pas Ã  jour"
 
 #: builtin/remote.c:1071
 #, c-format
 msgid "    %-*s forces to %-*s (%s)"
-msgstr ""
+msgstr "    %-*s force vers %-*s (%s)"
 
 #: builtin/remote.c:1074
 #, c-format
 msgid "    %-*s pushes to %-*s (%s)"
-msgstr ""
+msgstr "    %-*s pousse vers %-*s (%s)"
 
 #: builtin/remote.c:1078
 #, c-format
 msgid "    %-*s forces to %s"
-msgstr ""
+msgstr "    %-*s force vers %s"
 
 #: builtin/remote.c:1081
 #, c-format
 msgid "    %-*s pushes to %s"
-msgstr ""
+msgstr "    %-*s pousse vers %s"
 
 #: builtin/remote.c:1091
 msgid "do not query remotes"
-msgstr ""
+msgstr "ne pas interroger les distantes"
 
 #: builtin/remote.c:1118
 #, c-format
 msgid "* remote %s"
-msgstr ""
+msgstr "* distante %s"
 
 #: builtin/remote.c:1119
 #, c-format
 msgid "  Fetch URL: %s"
-msgstr ""
+msgstr "  URL de rapatriement : %s"
 
 #: builtin/remote.c:1120 builtin/remote.c:1285
 msgid "(no URL)"
-msgstr ""
+msgstr "(pas d'URL)"
 
 #: builtin/remote.c:1129 builtin/remote.c:1131
 #, c-format
 msgid "  Push  URL: %s"
-msgstr ""
+msgstr "  URL push : %s"
 
 #: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137
 #, c-format
 msgid "  HEAD branch: %s"
-msgstr ""
+msgstr "  Branche HEAD : %s"
 
 #: builtin/remote.c:1139
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr ""
+msgstr "  Branche HEAD (la HEAD distante est ambiguë, peut Ãªtre l'une des suivantes) :\n"
 
 #: builtin/remote.c:1151
 #, c-format
 msgid "  Remote branch:%s"
 msgid_plural "  Remote branches:%s"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "  Branche distante :%s"
+msgstr[1] "  Branches distantes :%s"
 
 #: builtin/remote.c:1154 builtin/remote.c:1181
 msgid " (status not queried)"
-msgstr ""
+msgstr " (statut non demandé)"
 
 #: builtin/remote.c:1163
 msgid "  Local branch configured for 'git pull':"
 msgid_plural "  Local branches configured for 'git pull':"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "  Branche locale configurée pour 'git pull' :"
+msgstr[1] "  Branches locales configurées pour 'git pull' :"
 
 #: builtin/remote.c:1171
 msgid "  Local refs will be mirrored by 'git push'"
-msgstr ""
+msgstr "  Les références locales seront reflétées par 'git push'"
 
 #: builtin/remote.c:1178
 #, c-format
 msgid "  Local ref configured for 'git push'%s:"
 msgid_plural "  Local refs configured for 'git push'%s:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "  Référence locale configurée pour 'git push'%s :"
+msgstr[1] "  Références locales configurées pour 'git push'%s :"
 
 #: builtin/remote.c:1199
 msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr ""
+msgstr "définir refs/remotes/<nom>/HEAD selon la distante"
 
 #: builtin/remote.c:1201
 msgid "delete refs/remotes/<name>/HEAD"
-msgstr ""
+msgstr "supprimer refs/remotes/<nom>/HEAD"
 
 #: builtin/remote.c:1216
 msgid "Cannot determine remote HEAD"
-msgstr ""
+msgstr "Impossible de déterminer la HEAD distante"
 
 #: builtin/remote.c:1218
 msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
-msgstr ""
+msgstr "Il y a de multiples branches HEAD distantes. Merci d'en choisir une explicitement avec :"
 
 #: builtin/remote.c:1228
 #, c-format
 msgid "Could not delete %s"
-msgstr ""
+msgstr "Impossible de supprimer %s"
 
 #: builtin/remote.c:1236
 #, c-format
 msgid "Not a valid ref: %s"
-msgstr ""
+msgstr "Référence non valide : %s"
 
 #: builtin/remote.c:1238
 #, c-format
 msgid "Could not setup %s"
-msgstr ""
+msgstr "Impossible de paramétrer %s"
 
 #: builtin/remote.c:1274
 #, c-format
 msgid " %s will become dangling!"
-msgstr ""
+msgstr " %s deviendra en suspens !"
 
 #: builtin/remote.c:1275
 #, c-format
 msgid " %s has become dangling!"
-msgstr ""
+msgstr " %s est devenu en suspens !"
 
 #: builtin/remote.c:1281
 #, c-format
 msgid "Pruning %s"
-msgstr ""
+msgstr "Élagage de %s"
 
 #: builtin/remote.c:1282
 #, c-format
 msgid "URL: %s"
-msgstr ""
+msgstr "URL : %s"
 
 #: builtin/remote.c:1295
 #, c-format
 msgid " * [would prune] %s"
-msgstr ""
+msgstr " * [serait Ã©lagué] %s"
 
 #: builtin/remote.c:1298
 #, c-format
 msgid " * [pruned] %s"
-msgstr ""
+msgstr " * [élagué] %s"
 
 #: builtin/remote.c:1321
 msgid "prune remotes after fetching"
-msgstr ""
+msgstr "élaguer les distants après le rapatriement"
 
 #: builtin/remote.c:1387 builtin/remote.c:1461
 #, c-format
 msgid "No such remote '%s'"
-msgstr ""
+msgstr "Pas de serveur remote '%s'"
 
 #: builtin/remote.c:1407
 msgid "add branch"
-msgstr ""
+msgstr "ajouter une branche"
 
 #: builtin/remote.c:1414
 msgid "no remote specified"
-msgstr ""
+msgstr "pas de serveur distant spécifié"
 
 #: builtin/remote.c:1436
 msgid "manipulate push URLs"
-msgstr ""
+msgstr "manipuler les URLs push"
 
 #: builtin/remote.c:1438
 msgid "add URL"
-msgstr ""
+msgstr "ajouter une URL"
 
 #: builtin/remote.c:1440
 msgid "delete URLs"
-msgstr ""
+msgstr "supprimer des URLs"
 
 #: builtin/remote.c:1447
 msgid "--add --delete doesn't make sense"
-msgstr ""
+msgstr "--add --delete n'a aucun sens"
 
 #: builtin/remote.c:1487
 #, c-format
 msgid "Invalid old URL pattern: %s"
-msgstr ""
+msgstr "Motif d'URL ancien invalide : %s"
 
 #: builtin/remote.c:1495
 #, c-format
 msgid "No such URL found: %s"
-msgstr ""
+msgstr "Pas d'URL trouvée : %s"
 
 #: builtin/remote.c:1497
 msgid "Will not delete all non-push URLs"
@@ -7854,173 +7932,173 @@ msgstr ""
 
 #: builtin/remote.c:1569
 msgid "be verbose; must be placed before a subcommand"
-msgstr ""
+msgstr "être verbeux : doit Ãªtre placé avant une sous-commande"
 
 #: builtin/replace.c:17
 msgid "git replace [-f] <object> <replacement>"
-msgstr ""
+msgstr "git replace [-f] <objet> <remplacement>"
 
 #: builtin/replace.c:18
 msgid "git replace -d <object>..."
-msgstr ""
+msgstr "git replace -d <objet>..."
 
 #: builtin/replace.c:19
 msgid "git replace -l [<pattern>]"
-msgstr ""
+msgstr "git replace -l [<motif>]"
 
 #: builtin/replace.c:121
 msgid "list replace refs"
-msgstr ""
+msgstr "afficher les références de remplacement"
 
 #: builtin/replace.c:122
 msgid "delete replace refs"
-msgstr ""
+msgstr "supprimer les références de remplacement"
 
 #: builtin/replace.c:123
 msgid "replace the ref if it exists"
-msgstr ""
+msgstr "remplacer la référence si elle existe"
 
 #: builtin/rerere.c:11
 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
-msgstr ""
+msgstr "git rerere [clear | forget chemin... | status | remaining | diff | gc]"
 
 #: builtin/rerere.c:56
 msgid "register clean resolutions in index"
-msgstr ""
+msgstr "enregistrer des résolutions propres dans l'index"
 
 #: builtin/reset.c:25
 msgid ""
 "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
-msgstr ""
+msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
 
 #: builtin/reset.c:26
 msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr ""
+msgstr "git reset [-q] <arbre> [--] <chemins>..."
 
 #: builtin/reset.c:27
 msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr ""
+msgstr "git reset --patch [<arbre>] [--] [<chemins>...]"
 
 #: builtin/reset.c:33
 msgid "mixed"
-msgstr ""
+msgstr "mixed"
 
 #: builtin/reset.c:33
 msgid "soft"
-msgstr ""
+msgstr "soft"
 
 #: builtin/reset.c:33
 msgid "hard"
-msgstr ""
+msgstr "hard"
 
 #: builtin/reset.c:33
 msgid "merge"
-msgstr ""
+msgstr "merge"
 
 #: builtin/reset.c:33
 msgid "keep"
-msgstr ""
+msgstr "keep"
 
 #: builtin/reset.c:73
 msgid "You do not have a valid HEAD."
-msgstr ""
+msgstr "Vous n'avez pas une HEAD valide."
 
 #: builtin/reset.c:75
 msgid "Failed to find tree of HEAD."
-msgstr ""
+msgstr "Impossible de trouver l'arbre pour HEAD."
 
 #: builtin/reset.c:81
 #, c-format
 msgid "Failed to find tree of %s."
-msgstr ""
+msgstr "Impossible de trouver l'arbre pour %s."
 
 #: builtin/reset.c:98
 #, c-format
 msgid "HEAD is now at %s"
-msgstr ""
+msgstr "HEAD est maintenant Ã  %s"
 
 #: builtin/reset.c:169
 #, c-format
 msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
+msgstr "Impossible de faire un \"reset %s\" au milieu d'une fusion."
 
 #: builtin/reset.c:248
 msgid "be quiet, only report errors"
-msgstr ""
+msgstr "être silencieux, afficher seulement les erreurs"
 
 #: builtin/reset.c:250
 msgid "reset HEAD and index"
-msgstr ""
+msgstr "réinitialiser HEAD et l'index"
 
 #: builtin/reset.c:251
 msgid "reset only HEAD"
-msgstr ""
+msgstr "réinitialiser seulement HEAD"
 
 #: builtin/reset.c:253 builtin/reset.c:255
 msgid "reset HEAD, index and working tree"
-msgstr ""
+msgstr "réinitialiser HEAD, l'index et la copie de travail"
 
 #: builtin/reset.c:257
 msgid "reset HEAD but keep local changes"
-msgstr ""
+msgstr "réinitialiser HEAD mais garder les changements locaux"
 
 #: builtin/reset.c:275
 #, c-format
 msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
+msgstr "Échec de résolution de '%s' comme une révision valide."
 
 #: builtin/reset.c:278 builtin/reset.c:286
 #, c-format
 msgid "Could not parse object '%s'."
-msgstr ""
+msgstr "Impossible d'analyser l'objet '%s'."
 
 #: builtin/reset.c:283
 #, c-format
 msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
+msgstr "Échec de résolution de '%s' comme un arbre valide."
 
 #: builtin/reset.c:292
 msgid "--patch is incompatible with --{hard,mixed,soft}"
-msgstr ""
+msgstr "--patch est incompatible avec --{hard,mixed,soft}"
 
 #: builtin/reset.c:301
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr ""
+msgstr "--mixed avec des chemins est obsolète ; utilisez 'git reset -- <paths>' Ã  la place."
 
 #: builtin/reset.c:303
 #, c-format
 msgid "Cannot do %s reset with paths."
-msgstr ""
+msgstr "Impossible de faire un \"%s reset\" avec des chemins."
 
 #: builtin/reset.c:313
 #, c-format
 msgid "%s reset is not allowed in a bare repository"
-msgstr "RAZ de %s n'est pas permis dans un dépôt nu"
+msgstr "Le \"%s reset\" n'est pas permis dans un dépôt nu"
 
 #: builtin/reset.c:333
 #, c-format
 msgid "Could not reset index file to revision '%s'."
-msgstr ""
+msgstr "Impossible de réinitialiser le fichier d'index Ã  la révision '%s'."
 
 #: builtin/reset.c:339
 msgid "Unstaged changes after reset:"
-msgstr ""
+msgstr "Modifications non indexées après reset :"
 
 #: builtin/reset.c:344
 msgid "Could not write new index file."
-msgstr ""
+msgstr "Impossible d'écrire le nouveau fichier d'index."
 
 #: builtin/rev-parse.c:339
 msgid "git rev-parse --parseopt [options] -- [<args>...]"
-msgstr ""
+msgstr "git rev-parse --parseopt [options] -- [<arguments>...]"
 
 #: builtin/rev-parse.c:344
 msgid "keep the `--` passed as an arg"
-msgstr ""
+msgstr "garder le `--` passé en argument"
 
 #: builtin/rev-parse.c:346
 msgid "stop parsing after the first non-option argument"
-msgstr ""
+msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option"
 
 #: builtin/rev-parse.c:464
 msgid ""
@@ -8030,22 +8108,27 @@ msgid ""
 "\n"
 "Run \"git rev-parse --parseopt -h\" for more information on the first usage."
 msgstr ""
+"git rev-parse --parseopt [options] -- [<arguments>...]\n"
+"   ou : git rev-parse --sq-quote [<argument>...]\n"
+"   ou : git rev-parse [options] [<argument>...]\n"
+"\n"
+"Lancez \"git rev-parse --parseopt -h\" pour plus d'information sur l'utilisation principale."
 
 #: builtin/revert.c:22
 msgid "git revert [options] <commit-ish>..."
-msgstr ""
+msgstr "git revert [options] <commit>..."
 
 #: builtin/revert.c:23
 msgid "git revert <subcommand>"
-msgstr ""
+msgstr "git revert <sous-commande>"
 
 #: builtin/revert.c:28
 msgid "git cherry-pick [options] <commit-ish>..."
-msgstr ""
+msgstr "git cherry-pick [options] <commit>..."
 
 #: builtin/revert.c:29
 msgid "git cherry-pick <subcommand>"
-msgstr ""
+msgstr "git cherry-pick <sous-commande>"
 
 #: builtin/revert.c:70 builtin/revert.c:92
 #, c-format
@@ -8054,75 +8137,75 @@ msgstr "%s : %s ne peut pas Ãªtre utilisé avec %s"
 
 #: builtin/revert.c:103
 msgid "end revert or cherry-pick sequence"
-msgstr ""
+msgstr "mettre fin au retour ou picorage"
 
 #: builtin/revert.c:104
 msgid "resume revert or cherry-pick sequence"
-msgstr ""
+msgstr "reprendre le retour ou picorage"
 
 #: builtin/revert.c:105
 msgid "cancel revert or cherry-pick sequence"
-msgstr ""
+msgstr "annuler le retour ou picorage"
 
 #: builtin/revert.c:106
 msgid "don't automatically commit"
-msgstr ""
+msgstr "ne pas valider automatiquement"
 
 #: builtin/revert.c:107
 msgid "edit the commit message"
-msgstr ""
+msgstr "éditer le message de validation"
 
 #: builtin/revert.c:110
 msgid "parent number"
-msgstr ""
+msgstr "numéro de parent"
 
 #: builtin/revert.c:112
 msgid "merge strategy"
-msgstr ""
+msgstr "stratégie de fusion"
 
 #: builtin/revert.c:113
 msgid "option"
-msgstr ""
+msgstr "option"
 
 #: builtin/revert.c:114
 msgid "option for merge strategy"
-msgstr ""
+msgstr "option pour la stratégie de fusion"
 
 #: builtin/revert.c:125
 msgid "append commit name"
-msgstr ""
+msgstr "ajouter le nom de validation"
 
 #: builtin/revert.c:126
 msgid "allow fast-forward"
-msgstr ""
+msgstr "autoriser l'avance rapide"
 
 #: builtin/revert.c:127
 msgid "preserve initially empty commits"
-msgstr ""
+msgstr "préserver les validations vides initialement"
 
 #: builtin/revert.c:128
 msgid "allow commits with empty messages"
-msgstr ""
+msgstr "autoriser les validations avec des messages vides"
 
 #: builtin/revert.c:129
 msgid "keep redundant, empty commits"
-msgstr ""
+msgstr "garder les validations redondantes, vides"
 
 #: builtin/revert.c:133
 msgid "program error"
-msgstr ""
+msgstr "erreur du programme"
 
 #: builtin/revert.c:223
 msgid "revert failed"
-msgstr ""
+msgstr "revert a Ã©choué"
 
 #: builtin/revert.c:238
 msgid "cherry-pick failed"
-msgstr ""
+msgstr "le picorage a Ã©choué"
 
 #: builtin/rm.c:15
 msgid "git rm [options] [--] <file>..."
-msgstr ""
+msgstr "git rm [options] [--] <fichier>..."
 
 #: builtin/rm.c:64 builtin/rm.c:186
 #, c-format
@@ -8130,6 +8213,8 @@ msgid ""
 "submodule '%s' (or one of its nested submodules) uses a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
+"le sous-module '%s' (ou un des sous-modules imbriqués) utilise un répertoire .git\n"
+"(utilisez 'rm -rf' si vous souhaitez vraiment le supprimer avec tout son historique)"
 
 #: builtin/rm.c:174
 #, c-format
@@ -8137,6 +8222,8 @@ msgid ""
 "'%s' has staged content different from both the file and the HEAD\n"
 "(use -f to force removal)"
 msgstr ""
+"'%s' a du contenu indexé différent du fichier et de HEAD\n"
+"(utilisez -f pour forcer la suppression)"
 
 #: builtin/rm.c:180
 #, c-format
@@ -8144,6 +8231,8 @@ msgid ""
 "'%s' has changes staged in the index\n"
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
+"'%s' a des changements dans l'index\n"
+"(utilisez --cached pour garder le fichier, ou -f pour forcer la suppression)"
 
 #: builtin/rm.c:191
 #, c-format
@@ -8151,65 +8240,67 @@ msgid ""
 "'%s' has local modifications\n"
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
+"'%s' a des modifications locales\n"
+"(utilisez --cached pour garder le fichier, ou -f pour forcer la suppression)"
 
 #: builtin/rm.c:207
 msgid "do not list removed files"
-msgstr ""
+msgstr "ne pas afficher les fichiers supprimés"
 
 #: builtin/rm.c:208
 msgid "only remove from the index"
-msgstr ""
+msgstr "supprimer seulement de l'index"
 
 #: builtin/rm.c:209
 msgid "override the up-to-date check"
-msgstr ""
+msgstr "outrepasser la vérification des fichiers Ã  jour"
 
 #: builtin/rm.c:210
 msgid "allow recursive removal"
-msgstr ""
+msgstr "autoriser la suppression récursive"
 
 #: builtin/rm.c:212
 msgid "exit with a zero status even if nothing matched"
-msgstr ""
+msgstr "sortir avec un statut zéro même si rien ne correspondait"
 
 #: builtin/rm.c:283
 #, c-format
 msgid "not removing '%s' recursively without -r"
-msgstr ""
+msgstr "pas de suppression récursive de '%s' sans -r"
 
 #: builtin/rm.c:322
 #, c-format
 msgid "git rm: unable to remove %s"
-msgstr ""
+msgstr "git rm : impossible de supprimer %s"
 
 #: builtin/shortlog.c:13
 msgid "git shortlog [<options>] [<revision range>] [[--] [<path>...]]"
-msgstr ""
+msgstr "git shortlog [<options>] [<intervalle révisions>] [[--] [<chemin>...]]"
 
 #: builtin/shortlog.c:131
 #, c-format
 msgid "Missing author: %s"
-msgstr ""
+msgstr "Auteur manquant : %s"
 
 #: builtin/shortlog.c:227
 msgid "sort output according to the number of commits per author"
-msgstr ""
+msgstr "trier la sortie sur le nombre de validations par auteur"
 
 #: builtin/shortlog.c:229
 msgid "Suppress commit descriptions, only provides commit count"
-msgstr ""
+msgstr "Supprimer les descriptions de validation, fournit seulement le nombre de validations"
 
 #: builtin/shortlog.c:231
 msgid "Show the email address of each author"
-msgstr ""
+msgstr "Afficher l'adresse e-mail de chaque auteur"
 
 #: builtin/shortlog.c:232
 msgid "w[,i1[,i2]]"
-msgstr ""
+msgstr "w[,i1[,i2]]"
 
 #: builtin/shortlog.c:233
 msgid "Linewrap output"
-msgstr ""
+msgstr "Couper les lignes"
 
 #: builtin/show-branch.c:9
 msgid ""
@@ -8217,31 +8308,31 @@ msgid ""
 "current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
 "independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
 "<glob>)...]"
-msgstr ""
+msgstr "git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<quand>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<révision> | <glob>)...]"
 
 #: builtin/show-branch.c:10
 msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr ""
+msgstr "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<référence>]"
 
 #: builtin/show-branch.c:650
 msgid "show remote-tracking and local branches"
-msgstr ""
+msgstr "afficher les branches de suivi distantes et les branches locales"
 
 #: builtin/show-branch.c:652
 msgid "show remote-tracking branches"
-msgstr ""
+msgstr "afficher les branches de suivi distantes"
 
 #: builtin/show-branch.c:654
 msgid "color '*!+-' corresponding to the branch"
-msgstr ""
+msgstr "couleur '*!+-' correspondant Ã  la branche"
 
 #: builtin/show-branch.c:656
 msgid "show <n> more commits after the common ancestor"
-msgstr ""
+msgstr "afficher <n> validations de plus après l'ancêtre commun"
 
 #: builtin/show-branch.c:658
 msgid "synonym to more=-1"
-msgstr ""
+msgstr "synonyme de more=-1"
 
 #: builtin/show-branch.c:659
 msgid "suppress naming strings"
@@ -8249,157 +8340,159 @@ msgstr ""
 
 #: builtin/show-branch.c:661
 msgid "include the current branch"
-msgstr ""
+msgstr "inclure la branche courante"
 
 #: builtin/show-branch.c:663
 msgid "name commits with their object names"
-msgstr ""
+msgstr "nommer les validations avec leurs noms d'objet"
 
 #: builtin/show-branch.c:665
 msgid "show possible merge bases"
-msgstr ""
+msgstr "afficher les bases possibles de fusion"
 
 #: builtin/show-branch.c:667
 msgid "show refs unreachable from any other ref"
-msgstr ""
+msgstr "afficher les références non accessibles depuis toute autre référence"
 
 #: builtin/show-branch.c:669
 msgid "show commits in topological order"
-msgstr ""
+msgstr "afficher les validations dans l'ordre topologique"
 
 #: builtin/show-branch.c:671
 msgid "show only commits not on the first branch"
-msgstr ""
+msgstr "afficher seulement les validations qui ne sont pas sur la première branche"
 
 #: builtin/show-branch.c:673
 msgid "show merges reachable from only one tip"
-msgstr ""
+msgstr "afficher les fusions accessibles depuis une seule pointe"
 
 #: builtin/show-branch.c:675
 msgid "show commits where no parent comes before its children"
-msgstr ""
+msgstr "afficher les validations où aucun parent ne vient avant ses enfants"
 
 #: builtin/show-branch.c:677
 msgid "<n>[,<base>]"
-msgstr ""
+msgstr "<n>[,<base>]"
 
 #: builtin/show-branch.c:678
 msgid "show <n> most recent ref-log entries starting at base"
-msgstr ""
+msgstr "afficher les <n> plus récentes entrées de ref-log en commençant Ã  la base"
 
 #: builtin/show-ref.c:10
 msgid ""
 "git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
 "hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
-msgstr ""
+msgstr "git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [motif*] "
 
 #: builtin/show-ref.c:11
 msgid "git show-ref --exclude-existing[=pattern] < ref-list"
-msgstr ""
+msgstr "git show-ref --exclude-existing[=motif] < liste-références"
 
 #: builtin/show-ref.c:165
 msgid "only show tags (can be combined with heads)"
-msgstr ""
+msgstr "afficher seulement les Ã©tiquettes (peut Ãªtre combiné avec des têtes)"
 
 #: builtin/show-ref.c:166
 msgid "only show heads (can be combined with tags)"
-msgstr ""
+msgstr "afficher seulement les têtes (peut Ãªtre combiné avec des Ã©tiquettes)"
 
 #: builtin/show-ref.c:167
 msgid "stricter reference checking, requires exact ref path"
-msgstr ""
+msgstr "vérification de référence plus stricte, requiert un chemin de référence exact"
 
 #: builtin/show-ref.c:170 builtin/show-ref.c:172
 msgid "show the HEAD reference"
-msgstr ""
+msgstr "afficher la référence HEAD"
 
 #: builtin/show-ref.c:174
 msgid "dereference tags into object IDs"
-msgstr ""
+msgstr "déréférencer les Ã©tiquettes en IDs d'objet"
 
 #: builtin/show-ref.c:176
 msgid "only show SHA1 hash using <n> digits"
-msgstr ""
+msgstr "afficher seulement le hachage SHA1 en utilisant <n> chiffres"
 
 #: builtin/show-ref.c:180
 msgid "do not print results to stdout (useful with --verify)"
-msgstr ""
+msgstr "ne pas afficher les résultats sur la sortie standard (pratique avec --verify)"
 
 #: builtin/show-ref.c:182
 msgid "show refs from stdin that aren't in local repository"
-msgstr ""
+msgstr "afficher les références de l'entrée standard qui ne sont pas dans le dépôt local"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [options] name [ref]"
-msgstr ""
+msgstr "git symbolic-ref [options] nom [référence]"
 
 #: builtin/symbolic-ref.c:8
 msgid "git symbolic-ref -d [-q] name"
-msgstr ""
+msgstr "git symbolic-ref -d [-q] nom"
 
 #: builtin/symbolic-ref.c:40
 msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
+msgstr "supprimer le message d'erreur pour une référence non symbolique (détachée)"
 
 #: builtin/symbolic-ref.c:41
 msgid "delete symbolic ref"
-msgstr ""
+msgstr "supprimer la référence symbolique"
 
 #: builtin/symbolic-ref.c:42
 msgid "shorten ref output"
-msgstr ""
+msgstr "raccourcir l'affichage de la référence"
 
 #: builtin/symbolic-ref.c:43 builtin/update-ref.c:18
 msgid "reason"
-msgstr ""
+msgstr "raison"
 
 #: builtin/symbolic-ref.c:43 builtin/update-ref.c:18
 msgid "reason of the update"
-msgstr ""
+msgstr "raison de la mise Ã  jour"
 
 #: builtin/tag.c:22
 msgid ""
 "git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"
-msgstr ""
+msgstr "git tag [-a|-s|-u <id-clé>] [-f] [-m <msg>|-F <file>] <nométiquette> [<head>]"
 
 #: builtin/tag.c:23
 msgid "git tag -d <tagname>..."
-msgstr ""
+msgstr "git tag -d <nométiquette>..."
 
 #: builtin/tag.c:24
 msgid ""
 "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
 "\t\t[<pattern>...]"
 msgstr ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <objet>] \n"
+"\t\t[<motif>...]"
 
 #: builtin/tag.c:26
 msgid "git tag -v <tagname>..."
-msgstr ""
+msgstr "git tag -v <nométiquette>..."
 
 #: builtin/tag.c:60
 #, c-format
 msgid "malformed object at '%s'"
-msgstr ""
+msgstr "objet malformé Ã  '%s'"
 
 #: builtin/tag.c:207
 #, c-format
 msgid "tag name too long: %.*s..."
-msgstr ""
+msgstr "nom d'étiquette trop long : %.*s..."
 
 #: builtin/tag.c:212
 #, c-format
 msgid "tag '%s' not found."
-msgstr ""
+msgstr "étiquette '%s' non trouvée."
 
 #: builtin/tag.c:227
 #, c-format
 msgid "Deleted tag '%s' (was %s)\n"
-msgstr ""
+msgstr "Étiquette '%s' supprimée (elle Ã©tait %s)\n"
 
 #: builtin/tag.c:239
 #, c-format
 msgid "could not verify the tag '%s'"
-msgstr ""
+msgstr "impossible de vérifier l'étiquette '%s'"
 
 #: builtin/tag.c:249
 #, c-format
@@ -8408,6 +8501,9 @@ msgid ""
 "Write a tag message\n"
 "Lines starting with '%c' will be ignored.\n"
 msgstr ""
+"\n"
+"Écrire un message pour l'étiquette\n"
+"Les lignes commençant par '%c' seront ignorées.\n"
 
 #: builtin/tag.c:253
 #, c-format
@@ -8417,130 +8513,133 @@ msgid ""
 "Lines starting with '%c' will be kept; you may remove them yourself if you "
 "want to.\n"
 msgstr ""
+"\n"
+"Écrire un message pour l'étiquette\n"
+"Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-même si vous le souhaitez.\n"
 
 #: builtin/tag.c:292
 msgid "unable to sign the tag"
-msgstr ""
+msgstr "impossible de signer l'étiquette"
 
 #: builtin/tag.c:294
 msgid "unable to write tag file"
-msgstr ""
+msgstr "impossible d'écrire le fichier d'étiquettes"
 
 #: builtin/tag.c:319
 msgid "bad object type."
-msgstr ""
+msgstr "mauvais type d'objet."
 
 #: builtin/tag.c:332
 msgid "tag header too big."
-msgstr ""
+msgstr "en-tête d'étiquette trop gros."
 
 #: builtin/tag.c:368
 msgid "no tag message?"
-msgstr ""
+msgstr "pas de message pour l'étiquette ?"
 
 #: builtin/tag.c:374
 #, c-format
 msgid "The tag message has been left in %s\n"
-msgstr ""
+msgstr "Le message pour l'étiquette a Ã©té laissé dans %s\n"
 
 #: builtin/tag.c:423
 msgid "switch 'points-at' requires an object"
-msgstr ""
+msgstr "le commutateur 'points-at' requiert un objet"
 
 #: builtin/tag.c:425
 #, c-format
 msgid "malformed object name '%s'"
-msgstr ""
+msgstr "nom d'objet malformé '%s'"
 
 #: builtin/tag.c:445
 msgid "list tag names"
-msgstr ""
+msgstr "afficher les noms des Ã©tiquettes"
 
 #: builtin/tag.c:447
 msgid "print <n> lines of each tag message"
-msgstr ""
+msgstr "affiche <n> lignes de chaque message d'étiquette"
 
 #: builtin/tag.c:449
 msgid "delete tags"
-msgstr ""
+msgstr "supprimer des Ã©tiquettes"
 
 #: builtin/tag.c:450
 msgid "verify tags"
-msgstr ""
+msgstr "vérifier des Ã©tiquettes"
 
 #: builtin/tag.c:452
 msgid "Tag creation options"
-msgstr ""
+msgstr "Options de création de l'étiquette"
 
 #: builtin/tag.c:454
 msgid "annotated tag, needs a message"
-msgstr ""
+msgstr "étiquette annotée, nécessite un message"
 
 #: builtin/tag.c:456
 msgid "tag message"
-msgstr ""
+msgstr "message pour l'étiquette"
 
 #: builtin/tag.c:458
 msgid "annotated and GPG-signed tag"
-msgstr ""
+msgstr "étiquette annotée et signée avec GPG"
 
 #: builtin/tag.c:462
 msgid "use another key to sign the tag"
-msgstr ""
+msgstr "utiliser une autre clé pour signer l'étiquette"
 
 #: builtin/tag.c:463
 msgid "replace the tag if exists"
-msgstr ""
+msgstr "remplacer l'étiquette si elle existe"
 
 #: builtin/tag.c:464
 msgid "show tag list in columns"
-msgstr ""
+msgstr "afficher la liste des Ã©tiquettes sous forme de colonnes"
 
 #: builtin/tag.c:466
 msgid "Tag listing options"
-msgstr ""
+msgstr "Options d'affichage des Ã©tiquettes"
 
 #: builtin/tag.c:469
 msgid "print only tags that contain the commit"
-msgstr ""
+msgstr "afficher seulement les Ã©tiquettes qui contiennent la validation"
 
 #: builtin/tag.c:475
 msgid "print only tags of the object"
-msgstr ""
+msgstr "afficher seulement les Ã©tiquettes de l'objet"
 
 #: builtin/tag.c:504
 msgid "--column and -n are incompatible"
-msgstr ""
+msgstr "--column et -n sont incompatibles"
 
 #: builtin/tag.c:521
 msgid "-n option is only allowed with -l."
-msgstr ""
+msgstr "l'option -n est autorisée seulement avec -l."
 
 #: builtin/tag.c:523
 msgid "--contains option is only allowed with -l."
-msgstr ""
+msgstr "l'option --contains est autorisée seulement avec -l."
 
 #: builtin/tag.c:525
 msgid "--points-at option is only allowed with -l."
-msgstr ""
+msgstr "l'option --points-at est autorisée seulement avec -l."
 
 #: builtin/tag.c:533
 msgid "only one -F or -m option is allowed."
-msgstr ""
+msgstr "une seule option -F ou -m est autorisée."
 
 #: builtin/tag.c:553
 msgid "too many params"
-msgstr ""
+msgstr "trop de paramètres"
 
 #: builtin/tag.c:559
 #, c-format
 msgid "'%s' is not a valid tag name."
-msgstr ""
+msgstr "'%s' n'est pas un nom d'étiquette valide."
 
 #: builtin/tag.c:564
 #, c-format
 msgid "tag '%s' already exists"
-msgstr ""
+msgstr "l'étiquette '%s' existe déjà"
 
 #: builtin/tag.c:582
 #, c-format
@@ -8555,63 +8654,63 @@ msgstr "%s : impossible de mettre Ã  jour la référence"
 #: builtin/tag.c:586
 #, c-format
 msgid "Updated tag '%s' (was %s)\n"
-msgstr ""
+msgstr "Étiquette '%s' mise Ã  jour (elle Ã©tait %s)\n"
 
 #: builtin/update-index.c:401
 msgid "git update-index [options] [--] [<file>...]"
-msgstr ""
+msgstr "git update-index [options] [--] [<fichier>...]"
 
 #: builtin/update-index.c:718
 msgid "continue refresh even when index needs update"
-msgstr ""
+msgstr "continuer de rafraîchir même si l'index a besoin d'une mise Ã  jour"
 
 #: builtin/update-index.c:721
 msgid "refresh: ignore submodules"
-msgstr ""
+msgstr "rafraîchir : ignorer les sous-modules"
 
 #: builtin/update-index.c:724
 msgid "do not ignore new files"
-msgstr ""
+msgstr "ne pas ignorer les nouveaux fichiers"
 
 #: builtin/update-index.c:726
 msgid "let files replace directories and vice-versa"
-msgstr ""
+msgstr "laisser les fichiers remplacer des répertoires et vice-versa"
 
 #: builtin/update-index.c:728
 msgid "notice files missing from worktree"
-msgstr ""
+msgstr "aviser des fichiers manquants dans la copie de travail"
 
 #: builtin/update-index.c:730
 msgid "refresh even if index contains unmerged entries"
-msgstr ""
+msgstr "rafraîchir même si l'index contient des entrées non fusionnées"
 
 #: builtin/update-index.c:733
 msgid "refresh stat information"
-msgstr ""
+msgstr "rafraîchir l'information de stat"
 
 #: builtin/update-index.c:737
 msgid "like --refresh, but ignore assume-unchanged setting"
-msgstr ""
+msgstr "comme --refresh, mais en ignorant l'option assume-unchanged"
 
 #: builtin/update-index.c:741
 msgid "<mode> <object> <path>"
-msgstr ""
+msgstr "<mode> <objet> <chemin>"
 
 #: builtin/update-index.c:742
 msgid "add the specified entry to the index"
-msgstr ""
+msgstr "ajouter l'entrée spécifiée dans l'index"
 
 #: builtin/update-index.c:746
 msgid "(+/-)x"
-msgstr ""
+msgstr "(+/-)x"
 
 #: builtin/update-index.c:747
 msgid "override the executable bit of the listed files"
-msgstr ""
+msgstr "outrepasser le bit exécutable pour les fichiers listés"
 
 #: builtin/update-index.c:751
 msgid "mark files as \"not changing\""
-msgstr ""
+msgstr "marquer les fichiers comme \"non changeants\""
 
 #: builtin/update-index.c:754
 msgid "clear assumed-unchanged bit"
@@ -8619,7 +8718,7 @@ msgstr ""
 
 #: builtin/update-index.c:757
 msgid "mark files as \"index-only\""
-msgstr ""
+msgstr "marquer les fichiers comme \"index seulement\""
 
 #: builtin/update-index.c:760
 msgid "clear skip-worktree bit"
@@ -8627,59 +8726,59 @@ msgstr ""
 
 #: builtin/update-index.c:763
 msgid "add to index only; do not add content to object database"
-msgstr ""
+msgstr "ajouter seulement Ã  l'index ; ne pas ajouter le contenu dans la base de données des objets"
 
 #: builtin/update-index.c:765
 msgid "remove named paths even if present in worktree"
-msgstr ""
+msgstr "supprimer les chemins nommés même s'ils sont présents dans la copie de travail"
 
 #: builtin/update-index.c:767
 msgid "with --stdin: input lines are terminated by null bytes"
-msgstr ""
+msgstr "avec --stdin : les lignes en entrée sont terminées par des octets nuls"
 
 #: builtin/update-index.c:769
 msgid "read list of paths to be updated from standard input"
-msgstr ""
+msgstr "lire la liste des chemins Ã  mettre Ã  jour depuis l'entrée standard"
 
 #: builtin/update-index.c:773
 msgid "add entries from standard input to the index"
-msgstr ""
+msgstr "ajouter les entrées depuis l'entrée standard Ã  l'index"
 
 #: builtin/update-index.c:777
 msgid "repopulate stages #2 and #3 for the listed paths"
-msgstr ""
+msgstr "repeupler les Ã©tapes n°2 et n°3 pour les chemins listés"
 
 #: builtin/update-index.c:781
 msgid "only update entries that differ from HEAD"
-msgstr ""
+msgstr "mettre Ã  jour seulement les entrées qui diffèrent de HEAD"
 
 #: builtin/update-index.c:785
 msgid "ignore files missing from worktree"
-msgstr ""
+msgstr "ignorer les fichiers manquants dans la copie de travail"
 
 #: builtin/update-index.c:788
 msgid "report actions to standard output"
-msgstr ""
+msgstr "afficher les actions sur la sortie standard"
 
 #: builtin/update-index.c:790
 msgid "(for porcelains) forget saved unresolved conflicts"
-msgstr ""
+msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus"
 
 #: builtin/update-index.c:794
 msgid "write index in this format"
-msgstr ""
+msgstr "écrire l'index dans ce format"
 
 #: builtin/update-ref.c:7
 msgid "git update-ref [options] -d <refname> [<oldval>]"
-msgstr ""
+msgstr "git update-ref [options] -d <nomréférence> [<anciennevaleur>]"
 
 #: builtin/update-ref.c:8
 msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
-msgstr ""
+msgstr "git update-ref [options]    <nomréférence> <nouvellevaleur> [<anciennevaleur>]"
 
 #: builtin/update-ref.c:19
 msgid "delete the reference"
-msgstr ""
+msgstr "supprimer la référence"
 
 #: builtin/update-ref.c:21
 msgid "update <refname> not the one it points to"
@@ -8687,47 +8786,47 @@ msgstr ""
 
 #: builtin/update-server-info.c:6
 msgid "git update-server-info [--force]"
-msgstr ""
+msgstr "git update-server-info [--force]"
 
 #: builtin/update-server-info.c:14
 msgid "update the info files from scratch"
-msgstr ""
+msgstr "mettre Ã  jour les fichiers d'information Ã  partir de zéro"
 
 #: builtin/verify-pack.c:56
 msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
-msgstr ""
+msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
 
 #: builtin/verify-pack.c:66
 msgid "verbose"
-msgstr ""
+msgstr "verbeux"
 
 #: builtin/verify-pack.c:68
 msgid "show statistics only"
-msgstr ""
+msgstr "afficher seulement les statistiques"
 
 #: builtin/verify-tag.c:17
 msgid "git verify-tag [-v|--verbose] <tag>..."
-msgstr ""
+msgstr "git verify-tag [-v|--verbose] <étiquette>..."
 
 #: builtin/verify-tag.c:73
 msgid "print tag contents"
-msgstr ""
+msgstr "afficher le contenu de l'étiquette"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
+msgstr "git write-tree [--missing-ok] [--prefix=<préfixe>/]"
 
 #: builtin/write-tree.c:26
 msgid "<prefix>/"
-msgstr ""
+msgstr "<préfixe>/"
 
 #: builtin/write-tree.c:27
 msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
+msgstr "écrire l'objet arbre pour un sous-répertoire <préfixe>"
 
 #: builtin/write-tree.c:30
 msgid "only useful for debugging"
-msgstr ""
+msgstr "seulement utile pour le débogage"
 
 #: git.c:16
 msgid ""
@@ -8735,116 +8834,121 @@ msgid ""
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
+"'git help -a' et 'git help -g' listent les sous-commandes disponibles et\n"
+"quelques concepts. Voir 'git help <command>' ou 'git help <concept>'\n"
+"pour en lire plus Ã  propos d'une commande spécifique ou d'un concept."
 
 #: parse-options.h:156
 msgid "no-op (backward compatibility)"
-msgstr ""
+msgstr "sans action (rétrocompatibilité)"
 
 #: parse-options.h:232
 msgid "be more verbose"
-msgstr ""
+msgstr "être plus verbeux"
 
 #: parse-options.h:234
 msgid "be more quiet"
-msgstr ""
+msgstr "être plus silencieux"
 
 #: parse-options.h:240
 msgid "use <n> digits to display SHA-1s"
-msgstr ""
+msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
 
 #: common-cmds.h:8
 msgid "Add file contents to the index"
-msgstr ""
+msgstr "Ajouter le contenu du fichier dans l'index"
 
 #: common-cmds.h:9
 msgid "Find by binary search the change that introduced a bug"
-msgstr ""
+msgstr "Rechercher de manière binaire le changement qui a introduit un bogue"
 
 #: common-cmds.h:10
 msgid "List, create, or delete branches"
-msgstr ""
+msgstr "Lister, créer ou supprimer des branches"
 
 #: common-cmds.h:11
 msgid "Checkout a branch or paths to the working tree"
-msgstr ""
+msgstr "Extraire une branche ou des chemins dans la copie de travail"
 
 #: common-cmds.h:12
 msgid "Clone a repository into a new directory"
-msgstr ""
+msgstr "Cloner un dépôt dans un nouveau répertoire"
 
 #: common-cmds.h:13
 msgid "Record changes to the repository"
-msgstr ""
+msgstr "Enregistrer les changements dans le dépôt"
 
 #: common-cmds.h:14
 msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
+msgstr "Afficher les changements entre les validations, entre validation et copie de travail, etc"
 
 #: common-cmds.h:15
 msgid "Download objects and refs from another repository"
-msgstr ""
+msgstr "Télécharger les objets et références depuis un autre dépôt"
 
 #: common-cmds.h:16
 msgid "Print lines matching a pattern"
-msgstr ""
+msgstr "Afficher les lignes correspondant Ã  un motif"
 
 #: common-cmds.h:17
 msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
+msgstr "Créer un dépôt Git vide ou réinitialiser un existant"
 
 #: common-cmds.h:18
 msgid "Show commit logs"
-msgstr ""
+msgstr "Afficher l'historique des validations"
 
 #: common-cmds.h:19
 msgid "Join two or more development histories together"
-msgstr ""
+msgstr "Joindre deux ou plusieurs historiques de développement ensemble"
 
 #: common-cmds.h:20
 msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
+msgstr "Déplacer ou renommer un fichier, un répertoire, ou un lien symbolique"
 
 #: common-cmds.h:21
 msgid "Fetch from and merge with another repository or a local branch"
-msgstr ""
+msgstr "Rapatrier et fusionner avec un autre dépôt ou une branche locale"
 
 #: common-cmds.h:22
 msgid "Update remote refs along with associated objects"
-msgstr ""
+msgstr "Mettre Ã  jour les références distantes ainsi que les objets associés"
 
 #: common-cmds.h:23
 msgid "Forward-port local commits to the updated upstream head"
-msgstr ""
+msgstr "Reporter en avant les validations locales dans la tête en amont mise Ã  jour"
 
 #: common-cmds.h:24
 msgid "Reset current HEAD to the specified state"
-msgstr ""
+msgstr "Réinitialiser la HEAD courante Ã  l'état spécifié"
 
 #: common-cmds.h:25
 msgid "Remove files from the working tree and from the index"
-msgstr ""
+msgstr "Supprimer les fichiers de la copie de travail et de l'index"
 
 #: common-cmds.h:26
 msgid "Show various types of objects"
-msgstr ""
+msgstr "Afficher différents types d'objects"
 
 #: common-cmds.h:27
 msgid "Show the working tree status"
-msgstr ""
+msgstr "Afficher le statut de la copie de travail"
 
 #: common-cmds.h:28
 msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
+msgstr "Créer, lister, supprimer ou vérifier un objet d'étiquette signé avec GPG"
 
 #: git-am.sh:50
 msgid "You need to set your committer info first"
-msgstr ""
+msgstr "Vous devez d'abord définir vos informations de validateur"
 
 #: git-am.sh:95
 msgid ""
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr ""
+"Vous semblez avoir déplacé la HEAD depuis le dernier Ã©chec de 'am'.\n"
+"Pas de retour Ã  ORIG_HEAD"
 
 #: git-am.sh:105
 #, sh-format
@@ -8853,69 +8957,76 @@ msgid ""
 "If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n"
 "To restore the original branch and stop patching, run \"$cmdline --abort\"."
 msgstr ""
+"Lorsque vous aurez résolu ce problème, lancez \"$cmdline --resolved\".\n"
+"Si vous préférez sauter ce patch, lancez \"$cmdline --skip\" Ã  la place.\n"
+"Pour restaurer la branche d'origine et stopper le patchage, lancez \"$cmdline --abort\"."
 
 #: git-am.sh:121
 msgid "Cannot fall back to three-way merge."
-msgstr ""
+msgstr "Impossible de retourner Ã  une fusion 3-way."
 
 #: git-am.sh:137
 msgid "Repository lacks necessary blobs to fall back on 3-way merge."
-msgstr ""
+msgstr "Le dépôt n'a pas les blobs nécessaires pour un retour Ã  une fusion 3-way."
 
 #: git-am.sh:139
 msgid "Using index info to reconstruct a base tree..."
-msgstr ""
+msgstr "Utilisation de l'information de l'index pour reconstruire un arbre de base..."
 
 #: git-am.sh:154
 msgid ""
 "Did you hand edit your patch?\n"
 "It does not apply to blobs recorded in its index."
 msgstr ""
+"Avez-vous Ã©dité le patch Ã  la main ?\n"
+"Il ne s'applique pas aux blobs enregistrés dans son index."
 
 #: git-am.sh:163
 msgid "Falling back to patching base and 3-way merge..."
-msgstr ""
+msgstr "Retour Ã  un patch de la base et fusion 3-way..."
 
 #: git-am.sh:179
 msgid "Failed to merge in the changes."
-msgstr ""
+msgstr "Échec de fusion dans les changements."
 
 #: git-am.sh:274
 msgid "Only one StGIT patch series can be applied at once"
-msgstr ""
+msgstr "Seulement une série de patches StGIT peut Ãªtre appliquée Ã  la fois"
 
 #: git-am.sh:361
 #, sh-format
 msgid "Patch format $patch_format is not supported."
-msgstr ""
+msgstr "Le format de patch $patch_format n'est pas supporté."
 
 #: git-am.sh:363
 msgid "Patch format detection failed."
-msgstr ""
+msgstr "Échec de détection du format du patch."
 
 #: git-am.sh:389
 msgid ""
 "The -b/--binary option has been a no-op for long time, and\n"
 "it will be removed. Please do not use it anymore."
 msgstr ""
+"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
+"et elle sera supprimée. Merci de ne plus l'utiliser."
 
 #: git-am.sh:477
 #, sh-format
 msgid "previous rebase directory $dotest still exists but mbox given."
-msgstr ""
+msgstr "le répertoire précédent de rebasage $dotest existe toujours mais mbox donnée."
 
 #: git-am.sh:482
 msgid "Please make up your mind. --skip or --abort?"
-msgstr ""
+msgstr "Décidez-vous. --skip ou --abort ?"
 
 #: git-am.sh:509
 msgid "Resolve operation not in progress, we are not resuming."
-msgstr ""
+msgstr "Pas de résolution de l'opération en cours, nous ne sommes pas dans une reprise."
 
 #: git-am.sh:575
 #, sh-format
 msgid "Dirty index: cannot apply patches (dirty: $files)"
-msgstr ""
+msgstr "Index sale : impossible d'appliquer des patches (sales : $files)"
 
 #: git-am.sh:679
 #, sh-format
@@ -8924,30 +9035,33 @@ msgid ""
 "If you would prefer to skip this patch, instead run \"$cmdline --skip\".\n"
 "To restore the original branch and stop patching run \"$cmdline --abort\"."
 msgstr ""
+"Le patch est vide.  Ã‰tait-il mal découpé ?\n"
+"Si vous préférez sauter ce patch, lancez plutôt \"$cmdline --skip\".\n"
+"Pour restaurer la branche d'origine et stopper le patchage, lancez \"$cmdline --abort\"."
 
 #: git-am.sh:706
 msgid "Patch does not have a valid e-mail address."
-msgstr ""
+msgstr "Le patch n'a pas d'adresse e-mail valide."
 
 #: git-am.sh:753
 msgid "cannot be interactive without stdin connected to a terminal."
-msgstr ""
+msgstr "impossible d'être interactif sans entrée standard connectée Ã  un terminal."
 
 #: git-am.sh:757
 msgid "Commit Body is:"
-msgstr ""
+msgstr "Le corps de la validation est :"
 
 #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
 #. in your translation. The program will only accept English
 #. input at this point.
 #: git-am.sh:764
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-msgstr ""
+msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
 
 #: git-am.sh:800
 #, sh-format
 msgid "Applying: $FIRSTLINE"
-msgstr ""
+msgstr "Application : $FIRSTLINE"
 
 #: git-am.sh:821
 msgid ""
@@ -8961,15 +9075,17 @@ msgid ""
 "You still have unmerged paths in your index\n"
 "did you forget to use 'git add'?"
 msgstr ""
+"Vous avez toujours des chemins non fusionnés dans votre index\n"
+"auriez-vous oublié de faire 'git add' ?"
 
 #: git-am.sh:845
 msgid "No changes -- Patch already applied."
-msgstr ""
+msgstr "Pas de changement -- Patch déjà appliqué."
 
 #: git-am.sh:855
 #, sh-format
 msgid "Patch failed at $msgnum $FIRSTLINE"
-msgstr ""
+msgstr "Le patch a Ã©choué Ã  $msgnum $FIRSTLINE"
 
 #: git-am.sh:858
 #, sh-format
@@ -8977,26 +9093,28 @@ msgid ""
 "The copy of the patch that failed is found in:\n"
 "   $dotest/patch"
 msgstr ""
+"La copie du patch qui a Ã©choué se trouve dans :\n"
+"   $dotest/patch"
 
 #: git-am.sh:876
 msgid "applying to an empty history"
-msgstr ""
+msgstr "application Ã  un historique vide"
 
 #: git-bisect.sh:48
 msgid "You need to start by \"git bisect start\""
-msgstr ""
+msgstr "Vous devez démarrer avec \"git bisect start\""
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
 #: git-bisect.sh:54
 msgid "Do you want me to do it for you [Y/n]? "
-msgstr ""
+msgstr "Souhaitez-vous que je le fasse pour vous [Y/n] ? "
 
 #: git-bisect.sh:95
 #, sh-format
 msgid "unrecognised option: '$arg'"
-msgstr ""
+msgstr "option inconnue : '$arg'"
 
 #: git-bisect.sh:99
 #, sh-format
@@ -9005,13 +9123,13 @@ msgstr "'$arg' ne semble Ãªtre une révision valide"
 
 #: git-bisect.sh:117
 msgid "Bad HEAD - I need a HEAD"
-msgstr ""
+msgstr "Mauvaise HEAD - j'ai besoin d'une HEAD"
 
 #: git-bisect.sh:130
 #, sh-format
 msgid ""
 "Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'."
-msgstr ""
+msgstr "L'extraction de '$start_head' a Ã©choué. Essayez 'git bisect reset <branchevalide>'."
 
 #: git-bisect.sh:140
 msgid "won't bisect on seeked tree"
@@ -9019,49 +9137,51 @@ msgstr ""
 
 #: git-bisect.sh:144
 msgid "Bad HEAD - strange symbolic ref"
-msgstr ""
+msgstr "Mauvaise HEAD - référence symbolique douteuse"
 
 #: git-bisect.sh:189
 #, sh-format
 msgid "Bad bisect_write argument: $state"
-msgstr ""
+msgstr "Mauvais argument pour bisect_write : $state"
 
 #: git-bisect.sh:218
 #, sh-format
 msgid "Bad rev input: $arg"
-msgstr ""
+msgstr "Mauvaise révision en entrée : $arg"
 
 #: git-bisect.sh:232
 msgid "Please call 'bisect_state' with at least one argument."
-msgstr ""
+msgstr "Merci d'appeler 'bisect_state' avec au moins un argument."
 
 #: git-bisect.sh:244
 #, sh-format
 msgid "Bad rev input: $rev"
-msgstr ""
+msgstr "Mauvaise révision en entrée : $rev"
 
 #: git-bisect.sh:250
 msgid "'git bisect bad' can take only one argument."
-msgstr ""
+msgstr "'git bisect bad' n'accepte qu'un seul argument."
 
 #. have bad but not good.  we could bisect although
 #. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
-msgstr ""
+msgstr "Attention : bissection avec seulement une mauvaise validation."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
 #: git-bisect.sh:279
 msgid "Are you sure [Y/n]? "
-msgstr ""
+msgstr "Êtes-vous sûr [Y/n] ? "
 
 #: git-bisect.sh:289
 msgid ""
 "You need to give me at least one good and one bad revisions.\n"
 "(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
 msgstr ""
+"Vous devez me donner au moins une bonne et une mauvaise révision.\n"
+"(Vous pouvez utiliser \"git bisect bad\" et \"git bisect good\" pour cela.)"
 
 #: git-bisect.sh:292
 msgid ""
@@ -9069,15 +9189,18 @@ msgid ""
 "You then need to give me at least one good and one bad revisions.\n"
 "(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
 msgstr ""
+"Vous devez démarrer avec \"git bisect start\".\n"
+"Puis vous devez me donner au moins une bonne et une mauvaise révision.\n"
+"(Vous pouvez utiliser \"git bisect bad\" et \"git bisect good\" pour cela.)"
 
 #: git-bisect.sh:363 git-bisect.sh:490
 msgid "We are not bisecting."
-msgstr ""
+msgstr "Pas de bissection en cours."
 
 #: git-bisect.sh:370
 #, sh-format
 msgid "'$invalid' is not a valid commit"
-msgstr "'$invalid' n'est pas un commit valide"
+msgstr "'$invalid' n'est pas une validation valide"
 
 #: git-bisect.sh:379
 #, sh-format
@@ -9085,24 +9208,26 @@ msgid ""
 "Could not check out original HEAD '$branch'.\n"
 "Try 'git bisect reset <commit>'."
 msgstr ""
+"Échec d'extraction de la HEAD d'origine '$branch'.\n"
+"Essayez 'git bisect reset <commit>'."
 
 #: git-bisect.sh:406
 msgid "No logfile given"
-msgstr ""
+msgstr "Pas de fichier de log donné"
 
 #: git-bisect.sh:407
 #, sh-format
 msgid "cannot read $file for replaying"
-msgstr ""
+msgstr "impossible de lire $file pour rejouer"
 
 #: git-bisect.sh:424
 msgid "?? what are you talking about?"
-msgstr ""
+msgstr "?? de quoi parlez-vous ?"
 
 #: git-bisect.sh:436
 #, sh-format
 msgid "running $command"
-msgstr ""
+msgstr "lancement de $command"
 
 #: git-bisect.sh:443
 #, sh-format
@@ -9110,10 +9235,12 @@ msgid ""
 "bisect run failed:\n"
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
+"la bissection a Ã©choué :\n"
+"le code retour $res de '$command' est < 0 ou >= 128"
 
 #: git-bisect.sh:469
 msgid "bisect run cannot continue any more"
-msgstr ""
+msgstr "la bissection ne peut plus continuer"
 
 #: git-bisect.sh:475
 #, sh-format
@@ -9121,10 +9248,12 @@ msgid ""
 "bisect run failed:\n"
 "'bisect_state $state' exited with error code $res"
 msgstr ""
+"la bissection a Ã©choué :\n"
+"'bisect_state $state' a retourné le code erreur $res"
 
 #: git-bisect.sh:482
 msgid "bisect run success"
-msgstr ""
+msgstr "succès de la bissection"
 
 #: git-pull.sh:21
 msgid ""
@@ -9132,14 +9261,17 @@ msgid ""
 "Please, fix them up in the work tree, and then use 'git add/rm <file>'\n"
 "as appropriate to mark resolution, or use 'git commit -a'."
 msgstr ""
+"Le pull n'est pas possible car vous avez des fichiers non fusionnés.\n"
+"Merci de corriger dans votre copie de travail, et utilisez alors 'git add/rm <file>'\n"
+"si nécessaire pour marquer comme résolu, ou utilisez 'git commit -a'."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
-msgstr ""
+msgstr "Le pull n'est pas possible car vous avez des fichiers non fusionnés."
 
 #: git-pull.sh:203
 msgid "updating an unborn branch with changes added to the index"
-msgstr ""
+msgstr "mise Ã  jour d'une branche non encore créée avec les changements ajoutés dans l'index"
 
 #. The fetch involved updating the current branch.
 #. The working tree and the index file is still based on the
@@ -9152,14 +9284,17 @@ msgid ""
 "Warning: fast-forwarding your working tree from\n"
 "Warning: commit $orig_head."
 msgstr ""
+"Attention : fetch a mis Ã  jour la tête de la branche courante.\n"
+"Attention : mise Ã  jour en avance rapide de votre copie de travail\n"
+"Attention : depuis la validation $orig_head."
 
 #: git-pull.sh:260
 msgid "Cannot merge multiple branches into empty head"
-msgstr ""
+msgstr "Impossible de fusionner de multiples branches sur une tête vide"
 
 #: git-pull.sh:264
 msgid "Cannot rebase onto multiple branches"
-msgstr ""
+msgstr "Impossible de rebaser sur de multiples branches"
 
 #: git-rebase.sh:53
 msgid ""
@@ -9168,41 +9303,46 @@ msgid ""
 "To check out the original branch and stop rebasing, run \"git rebase --abort"
 "\"."
 msgstr ""
+"Lorsque vous aurez résolu ce problème, lancez \"git rebase --continue\".\n"
+"Si vous préférez sauter ce patch, lancez \"git rebase --skip\" Ã  la place.\n"
+"Pour extraire la branche d'origine et stopper le rebasage, lancez \"git rebase --abort\"."
 
 #: git-rebase.sh:160
 msgid "The pre-rebase hook refused to rebase."
-msgstr ""
+msgstr "Le hook pre-rebase a refusé de rebaser."
 
 #: git-rebase.sh:165
 msgid "It looks like git-am is in progress. Cannot rebase."
-msgstr ""
+msgstr "Il semble que git-am soit en cours. Impossible de rebaser."
 
 #: git-rebase.sh:296
 msgid "The --exec option must be used with the --interactive option"
-msgstr ""
+msgstr "L'option --exec doit Ãªtre utilisée avec l'option --interactive"
 
 #: git-rebase.sh:301
 msgid "No rebase in progress?"
-msgstr ""
+msgstr "Pas de rebasage en cours ?"
 
 #: git-rebase.sh:312
 msgid "The --edit-todo action can only be used during interactive rebase."
-msgstr ""
+msgstr "L'action --edit-todo peut seulement Ãªtre utilisée lors d'un rebasage interactif."
 
 #: git-rebase.sh:319
 msgid "Cannot read HEAD"
-msgstr ""
+msgstr "Impossible de lire HEAD"
 
 #: git-rebase.sh:322
 msgid ""
 "You must edit all merge conflicts and then\n"
 "mark them as resolved using git add"
 msgstr ""
+"Vous devez Ã©diter tous les conflits de fusion et\n"
+"les marquer comme résolus avec git add"
 
 #: git-rebase.sh:340
 #, sh-format
 msgid "Could not move back to $head_name"
-msgstr ""
+msgstr "Impossible de revenir Ã  $head_name"
 
 #: git-rebase.sh:359
 #, sh-format
@@ -9216,88 +9356,96 @@ msgid ""
 "and run me again.  I am stopping in case you still have something\n"
 "valuable there."
 msgstr ""
+"Il semble qu'il y ait déjà un répertoire $state_dir_base, et je me demande\n"
+"si vous n'êtes pas au milieu d'un autre rebasage.  Si c'est le cas,\n"
+"merci d'essayer\n"
+"\t$cmd_live_rebase\n"
+"Si Ã§a n'est pas le cas, merci de\n"
+"\t$cmd_clear_stale_rebase\n"
+"et relancer Ã  nouveau.  Je m'arrête au cas où vous auriez quelque chose\n"
+"d'important ici."
 
 #: git-rebase.sh:404
 #, sh-format
 msgid "invalid upstream $upstream_name"
-msgstr ""
+msgstr "invalide $upstream_name en amont"
 
 #: git-rebase.sh:428
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
-msgstr ""
+msgstr "$onto_name : il y a plus d'une base de fusion"
 
 #: git-rebase.sh:431 git-rebase.sh:435
 #, sh-format
 msgid "$onto_name: there is no merge base"
-msgstr ""
+msgstr "$onto_name : il n'y a pas de base de fusion"
 
 #: git-rebase.sh:440
 #, sh-format
 msgid "Does not point to a valid commit: $onto_name"
-msgstr ""
+msgstr "Ne pointe pas sur une validation valide : $onto_name"
 
 #: git-rebase.sh:463
 #, sh-format
 msgid "fatal: no such branch: $branch_name"
-msgstr ""
+msgstr "fatal : pas de branche : $branch_name"
 
 #: git-rebase.sh:483
 msgid "Please commit or stash them."
-msgstr ""
+msgstr "Merci de les valider ou de les remiser."
 
 #: git-rebase.sh:501
 #, sh-format
 msgid "Current branch $branch_name is up to date."
-msgstr ""
+msgstr "La branche courante $branch_name est Ã  jour."
 
 #: git-rebase.sh:504
 #, sh-format
 msgid "Current branch $branch_name is up to date, rebase forced."
-msgstr ""
+msgstr "La branche courante $branch_name est Ã  jour, rebasage forcé."
 
 #: git-rebase.sh:515
 #, sh-format
 msgid "Changes from $mb to $onto:"
-msgstr ""
+msgstr "Changements de $mb sur $onto :"
 
 #. Detach HEAD and reset the tree
 #: git-rebase.sh:524
 msgid "First, rewinding head to replay your work on top of it..."
-msgstr ""
+msgstr "Premièrement, retour de head pour rejouer votre travail par-dessus..."
 
 #: git-rebase.sh:532
 #, sh-format
 msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr ""
+msgstr "$branch_name mise Ã  jour en avance rapide sur $onto_name."
 
 #: git-stash.sh:51
 msgid "git stash clear with parameters is unimplemented"
-msgstr ""
+msgstr "git stash clear avec des paramètres n'est pas implémenté"
 
 #: git-stash.sh:74
 msgid "You do not have the initial commit yet"
-msgstr ""
+msgstr "Vous n'avez pas encore la validation initiale"
 
 #: git-stash.sh:89
 msgid "Cannot save the current index state"
-msgstr ""
+msgstr "Impossible de sauver l'état courant de l'index"
 
 #: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
-msgstr ""
+msgstr "Impossible de sauver l'état courant de la copie de travail"
 
 #: git-stash.sh:140
 msgid "No changes selected"
-msgstr ""
+msgstr "Aucun changement sélectionné"
 
 #: git-stash.sh:143
 msgid "Cannot remove temporary index (can't happen)"
-msgstr ""
+msgstr "Impossible de supprimer l'index temporaire (ne peut pas se produire)"
 
 #: git-stash.sh:156
 msgid "Cannot record working tree state"
-msgstr ""
+msgstr "Impossible d'enregistrer l'état de la copie de travail"
 
 #. TRANSLATORS: $option is an invalid option, like
 #. `--blah-blah'. The 7 spaces at the beginning of the
@@ -9315,41 +9463,43 @@ msgid ""
 "error: unknown option for 'stash save': $option\n"
 "       To provide a message, use git stash save -- '$option'"
 msgstr ""
+"erreur: option inconnue pour 'stash save': $option\n"
+"        Pour fournir un message, utilisez git stash save -- '$option'"
 
 #: git-stash.sh:223
 msgid "No local changes to save"
-msgstr ""
+msgstr "Pas de changements en local Ã  sauver"
 
 #: git-stash.sh:227
 msgid "Cannot initialize stash"
-msgstr ""
+msgstr "Impossible d'initialiser le remisage"
 
 #: git-stash.sh:235
 msgid "Cannot save the current status"
-msgstr ""
+msgstr "Impossible de sauver le statut courant"
 
 #: git-stash.sh:253
 msgid "Cannot remove worktree changes"
-msgstr ""
+msgstr "Impossible de supprimer les changements de la copie de travail"
 
 #: git-stash.sh:352
 msgid "No stash found."
-msgstr ""
+msgstr "Pas de remisage trouvé."
 
 #: git-stash.sh:359
 #, sh-format
 msgid "Too many revisions specified: $REV"
-msgstr ""
+msgstr "Trop de révisions spécifiées : $REV"
 
 #: git-stash.sh:365
 #, sh-format
 msgid "$reference is not valid reference"
-msgstr ""
+msgstr "$reference n'est pas une référence valide"
 
 #: git-stash.sh:393
 #, sh-format
 msgid "'$args' is not a stash-like commit"
-msgstr "'$args' n'est pas un commit de type remisage"
+msgstr "'$args' n'est pas une validation de type remisage"
 
 #: git-stash.sh:404
 #, sh-format
@@ -9358,23 +9508,23 @@ msgstr "'$args' n'est pas une référence de remisage"
 
 #: git-stash.sh:412
 msgid "unable to refresh index"
-msgstr ""
+msgstr "impossible de rafraîchir l'index"
 
 #: git-stash.sh:416
 msgid "Cannot apply a stash in the middle of a merge"
-msgstr ""
+msgstr "Impossible d'appliquer un remisage au milieu d'une fusion"
 
 #: git-stash.sh:424
 msgid "Conflicts in index. Try without --index."
-msgstr ""
+msgstr "Conflits dans l'index. Essayez sans --index."
 
 #: git-stash.sh:426
 msgid "Could not save index tree"
-msgstr ""
+msgstr "Impossible de sauver l'arbre d'index"
 
 #: git-stash.sh:460
 msgid "Cannot unstage modified files"
-msgstr ""
+msgstr "Impossible de désindexer les fichiers modifiés"
 
 #: git-stash.sh:475
 msgid "Index was not unstashed."
@@ -9383,50 +9533,50 @@ msgstr ""
 #: git-stash.sh:492
 #, sh-format
 msgid "Dropped ${REV} ($s)"
-msgstr ""
+msgstr "${REV} supprimé ($s)"
 
 #: git-stash.sh:493
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
-msgstr ""
+msgstr "${REV}: Impossible de supprimer l'entrée de stash"
 
 #: git-stash.sh:500
 msgid "No branch name specified"
-msgstr ""
+msgstr "Aucune branche spécifiée"
 
 #: git-stash.sh:571
 msgid "(To restore them type \"git stash apply\")"
-msgstr ""
+msgstr "(Pour les restaurer tapez \"git stash apply\")"
 
 #: git-submodule.sh:91
 #, sh-format
 msgid "cannot strip one component off url '$remoteurl'"
-msgstr ""
+msgstr "impossible de supprimer un composant de l'URL '$remoteurl'"
 
 #: git-submodule.sh:196
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr ""
+msgstr "Pas de mappage du sous-module trouvé dans .gitmodules pour le chemin '$sm_path'"
 
 #: git-submodule.sh:239
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
-msgstr ""
+msgstr "Le clonage de '$url' dans le chemin de sous-module '$sm_path' a Ã©choué"
 
 #: git-submodule.sh:251
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr ""
+msgstr "Le répertoire Git '$a' fait partie du chemin de sous-module '$b' ou vice-versa"
 
 #: git-submodule.sh:349
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
-msgstr ""
+msgstr "L'URL de dépôt '$repo' doit Ãªtre absolu ou commencer par ./|../"
 
 #: git-submodule.sh:366
 #, sh-format
 msgid "'$sm_path' already exists in the index"
-msgstr ""
+msgstr "'$sm_path' existe déjà dans l'index"
 
 #: git-submodule.sh:370
 #, sh-format
@@ -9435,11 +9585,14 @@ msgid ""
 "$sm_path\n"
 "Use -f if you really want to add it."
 msgstr ""
+"Le chemin suivant est ignoré par un de vos fichiers .gitignore :\n"
+"$sm_path\n"
+"Utilisez -f si vous voulez vraiment l'ajouter."
 
 #: git-submodule.sh:388
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
-msgstr ""
+msgstr "Ajout du dépôt existant Ã  '$sm_path' dans l'index"
 
 #: git-submodule.sh:390
 #, sh-format
@@ -9449,119 +9602,119 @@ msgstr "'$sm_path' existe déjà et n'est pas un dépôt git valide"
 #: git-submodule.sh:398
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
-msgstr ""
+msgstr "Un répertoire git pour '$sm_name' est trouvé en local avec le(s) serveur(s) distant(s) :"
 
 #: git-submodule.sh:400
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from"
-msgstr ""
+msgstr "Si vous voulez réutiliser ce répertoire git local au lieu de cloner Ã  nouveau depuis"
 
 #: git-submodule.sh:402
 #, sh-format
 msgid ""
 "use the '--force' option. If the local git directory is not the correct repo"
-msgstr ""
+msgstr "utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt correct"
 
 #: git-submodule.sh:403
 #, sh-format
 msgid ""
 "or you are unsure what this means choose another name with the '--name' "
 "option."
-msgstr ""
+msgstr "ou vous ne savez pas ce que cela signifie de choisir un autre nom avec l'option '--name'."
 
 #: git-submodule.sh:405
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
-msgstr ""
+msgstr "Réactivation du répertoire git local pour le sous-module '$sm_name'."
 
 #: git-submodule.sh:417
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
-msgstr ""
+msgstr "Impossible d'extraire le sous-module '$sm_path'"
 
 #: git-submodule.sh:422
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
-msgstr ""
+msgstr "Échec d'ajout du sous-module '$sm_path'"
 
 #: git-submodule.sh:431
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
-msgstr ""
+msgstr "Échec d'enregistrement du sous-module '$sm_path'"
 
 #: git-submodule.sh:474
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
-msgstr ""
+msgstr "Entrée dans '$prefix$sm_path'"
 
 #: git-submodule.sh:488
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
-msgstr ""
+msgstr "Arrêt sur '$sm_path' ; le script a retourné un statut non nul."
 
 #: git-submodule.sh:532
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
-msgstr ""
+msgstr "URL non trouvé pour le chemin de sous-module '$sm_path' dans .gitmodules"
 
 #: git-submodule.sh:541
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
-msgstr ""
+msgstr "Échec d'enregistrement de l'URL pour le chemin de sous-module '$sm_path'"
 
 #: git-submodule.sh:543
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
-msgstr ""
+msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$sm_path'"
 
 #: git-submodule.sh:551
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
-msgstr ""
+msgstr "Échec d'enregistrement du mode de mise Ã  jour pour le chemin de sous-module '$sm_path'"
 
 #: git-submodule.sh:588
 #, sh-format
 msgid "Use '.' if you really want to deinitialize all submodules"
-msgstr ""
+msgstr "Utilisez '.' si vous voulez vraiment réinitialiser tous les sous-modules"
 
 #: git-submodule.sh:603
 #, sh-format
 msgid "Submodule work tree '$sm_path' contains a .git directory"
-msgstr ""
+msgstr "La copie de travail du sous-module '$sm_path' contient un répertoire .git"
 
 #: git-submodule.sh:604
 #, sh-format
 msgid ""
 "(use 'rm -rf' if you really want to remove it including all of its history)"
-msgstr ""
+msgstr "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son historique)"
 
 #: git-submodule.sh:610
 #, sh-format
 msgid ""
 "Submodule work tree '$sm_path' contains local modifications; use '-f' to "
 "discard them"
-msgstr ""
+msgstr "La copie de travail du sous-module '$sm_path' contient des modifications locales; utilisez '-f' pour les annuler"
 
 #: git-submodule.sh:613
 #, sh-format
 msgid "Cleared directory '$sm_path'"
-msgstr ""
+msgstr "Répertoire '$sm_path' nettoyé"
 
 #: git-submodule.sh:614
 #, sh-format
 msgid "Could not remove submodule work tree '$sm_path'"
-msgstr ""
+msgstr "Impossible de supprimer la copie de travail du sous-module '$sm_path'"
 
 #: git-submodule.sh:617
 #, sh-format
 msgid "Could not create empty submodule directory '$sm_path'"
-msgstr ""
+msgstr "Impossible de créer le répertoire vide du sous-module '$sm_path'"
 
 #: git-submodule.sh:626
 #, sh-format
 msgid "Submodule '$name' ($url) unregistered for path '$sm_path'"
-msgstr ""
+msgstr "Le sous-module '$name' ($url) n'est pas enregistré pour le chemin '$sm_path'"
 
 #: git-submodule.sh:731
 #, sh-format
@@ -9569,100 +9722,102 @@ msgid ""
 "Submodule path '$prefix$sm_path' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
+"Chemin de sous-module '$prefix$sm_path' non initialisé\n"
+"Peut-être souhaitez-vous utiliser 'update --init' ?"
 
 #: git-submodule.sh:744
 #, sh-format
 msgid "Unable to find current revision in submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Impossible de trouver la révision courante dans le chemin de sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:753
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
-msgstr ""
+msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'"
 
 #: git-submodule.sh:777
 #, sh-format
 msgid "Unable to fetch in submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Impossible de rapatrier dans le chemin de sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:791
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Impossible de rebaser '$sha1' dans le chemin de sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:792
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': rebased into '$sha1'"
-msgstr ""
+msgstr "Chemin de sous-module '$prefix$sm_path' : rebasé dans '$sha1'"
 
 #: git-submodule.sh:797
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Impossible de fusionner '$sha1' dans le chemin de sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:798
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': merged in '$sha1'"
-msgstr ""
+msgstr "Chemin de sous-module '$prefix$sm_path' : fusionné dans '$sha1'"
 
 #: git-submodule.sh:803
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Impossible d'extraire '$sha1' dans le chemin de sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:804
 #, sh-format
 msgid "Submodule path '$prefix$sm_path': checked out '$sha1'"
-msgstr ""
+msgstr "Chemin de sous-module '$prefix$sm_path' : '$sha1' extrait"
 
 #: git-submodule.sh:831
 #, sh-format
 msgid "Failed to recurse into submodule path '$prefix$sm_path'"
-msgstr ""
+msgstr "Échec de parcours dans le chemin du sous-module '$prefix$sm_path'"
 
 #: git-submodule.sh:939
 msgid "The --cached option cannot be used with the --files option"
-msgstr ""
+msgstr "L'option --cached ne peut pas Ãªtre utilisée avec l'option --files"
 
 #. unexpected type
 #: git-submodule.sh:979
 #, sh-format
 msgid "unexpected mode $mod_dst"
-msgstr ""
+msgstr "mode $mod_dst inattendu"
 
 #: git-submodule.sh:997
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
-msgstr ""
+msgstr "  Attention : $name ne contient pas la validation $sha1_src"
 
 #: git-submodule.sh:1000
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
-msgstr ""
+msgstr "  Attention : $name ne contient pas la validation $sha1_dst"
 
 #: git-submodule.sh:1003
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
-msgstr ""
+msgstr "  Attention : $name ne contient pas les validations $sha1_src et $sha1_dst"
 
 #: git-submodule.sh:1028
 msgid "blob"
-msgstr ""
+msgstr "blob"
 
 #: git-submodule.sh:1066
 msgid "Submodules changed but not updated:"
-msgstr ""
+msgstr "Sous-modules modifiés mais non mis Ã  jour :"
 
 #: git-submodule.sh:1068
 msgid "Submodule changes to be committed:"
-msgstr ""
+msgstr "Changements du sous-module Ã  valider :"
 
 #: git-submodule.sh:1153
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
-msgstr ""
+msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
 
 #: git-submodule.sh:1216
 #, sh-format
 msgid "Synchronizing submodule url for '$prefix$sm_path'"
-msgstr ""
+msgstr "Synchronisation de l'URL sous-module pour '$prefix$sm_path'"
diff --git a/quote.c b/quote.c
index 5c8808160e700af0c055a84f8527eb3ac76962d9..45e3db12d514dd7393539ca0aff09f5aa8467b8d 100644 (file)
--- a/quote.c
+++ b/quote.c
@@ -42,23 +42,6 @@ void sq_quote_buf(struct strbuf *dst, const char *src)
        free(to_free);
 }
 
-void sq_quote_print(FILE *stream, const char *src)
-{
-       char c;
-
-       fputc('\'', stream);
-       while ((c = *src++)) {
-               if (need_bs_quote(c)) {
-                       fputs("'\\", stream);
-                       fputc(c, stream);
-                       fputc('\'', stream);
-               } else {
-                       fputc(c, stream);
-               }
-       }
-       fputc('\'', stream);
-}
-
 void sq_quote_argv(struct strbuf *dst, const char** argv, size_t maxlen)
 {
        int i;
@@ -408,72 +391,72 @@ int unquote_c_style(struct strbuf *sb, const char *quoted, const char **endp)
 
 /* quoting as a string literal for other languages */
 
-void perl_quote_print(FILE *stream, const char *src)
+void perl_quote_buf(struct strbuf *sb, const char *src)
 {
        const char sq = '\'';
        const char bq = '\\';
        char c;
 
-       fputc(sq, stream);
+       strbuf_addch(sb, sq);
        while ((c = *src++)) {
                if (c == sq || c == bq)
-                       fputc(bq, stream);
-               fputc(c, stream);
+                       strbuf_addch(sb, bq);
+               strbuf_addch(sb, c);
        }
-       fputc(sq, stream);
+       strbuf_addch(sb, sq);
 }
 
-void python_quote_print(FILE *stream, const char *src)
+void python_quote_buf(struct strbuf *sb, const char *src)
 {
        const char sq = '\'';
        const char bq = '\\';
        const char nl = '\n';
        char c;
 
-       fputc(sq, stream);
+       strbuf_addch(sb, sq);
        while ((c = *src++)) {
                if (c == nl) {
-                       fputc(bq, stream);
-                       fputc('n', stream);
+                       strbuf_addch(sb, bq);
+                       strbuf_addch(sb, 'n');
                        continue;
                }
                if (c == sq || c == bq)
-                       fputc(bq, stream);
-               fputc(c, stream);
+                       strbuf_addch(sb, bq);
+               strbuf_addch(sb, c);
        }
-       fputc(sq, stream);
+       strbuf_addch(sb, sq);
 }
 
-void tcl_quote_print(FILE *stream, const char *src)
+void tcl_quote_buf(struct strbuf *sb, const char *src)
 {
        char c;
 
-       fputc('"', stream);
+       strbuf_addch(sb, '"');
        while ((c = *src++)) {
                switch (c) {
                case '[': case ']':
                case '{': case '}':
                case '$': case '\\': case '"':
-                       fputc('\\', stream);
+                       strbuf_addch(sb, '\\');
                default:
-                       fputc(c, stream);
+                       strbuf_addch(sb, c);
                        break;
                case '\f':
-                       fputs("\\f", stream);
+                       strbuf_addstr(sb, "\\f");
                        break;
                case '\r':
-                       fputs("\\r", stream);
+                       strbuf_addstr(sb, "\\r");
                        break;
                case '\n':
-                       fputs("\\n", stream);
+                       strbuf_addstr(sb, "\\n");
                        break;
                case '\t':
-                       fputs("\\t", stream);
+                       strbuf_addstr(sb, "\\t");
                        break;
                case '\v':
-                       fputs("\\v", stream);
+                       strbuf_addstr(sb, "\\v");
                        break;
                }
        }
-       fputc('"', stream);
+       strbuf_addch(sb, '"');
 }
diff --git a/quote.h b/quote.h
index ed110a5d8d9e98a680c67379c7c39e4eda5b25f5..71dcc3aa0279af6611f7471d1a4c9949b1dc49fb 100644 (file)
--- a/quote.h
+++ b/quote.h
@@ -27,8 +27,6 @@ struct strbuf;
  * excluding the final null regardless of the buffer size.
  */
 
-extern void sq_quote_print(FILE *stream, const char *src);
-
 extern void sq_quote_buf(struct strbuf *, const char *src);
 extern void sq_quote_argv(struct strbuf *, const char **argv, size_t maxlen);
 
@@ -68,8 +66,8 @@ extern char *quote_path_relative(const char *in, const char *prefix,
                          struct strbuf *out);
 
 /* quoting as a string literal for other languages */
-extern void perl_quote_print(FILE *stream, const char *src);
-extern void python_quote_print(FILE *stream, const char *src);
-extern void tcl_quote_print(FILE *stream, const char *src);
+extern void perl_quote_buf(struct strbuf *sb, const char *src);
+extern void python_quote_buf(struct strbuf *sb, const char *src);
+extern void tcl_quote_buf(struct strbuf *sb, const char *src);
 
 #endif
diff --git a/refs.c b/refs.c
index 7b08a37153457d335ecf676a73252aa5bdbee4fb..7922261580515859bc89005c4c69e8623c50c728 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -72,10 +72,6 @@ int check_refname_format(const char *refname, int flags)
 {
        int component_len, component_count = 0;
 
-       if (!strcmp(refname, "@"))
-               /* Refname is a single character '@'. */
-               return -1;
-
        while (1) {
                /* We are at the start of a path component. */
                component_len = check_refname_component(refname, flags);
index 8e27db1bd2b49f28b235fcd7e18a0dda43a1f045..8c2d1ed52d6663507ff5b03bc7e5b4f4070403d1 100644 (file)
@@ -614,7 +614,7 @@ static void scan_windows(struct packed_git *p,
        }
 }
 
-static int unuse_one_window(struct packed_git *current, int keep_fd)
+static int unuse_one_window(struct packed_git *current)
 {
        struct packed_git *p, *lru_p = NULL;
        struct pack_window *lru_w = NULL, *lru_l = NULL;
@@ -628,15 +628,8 @@ static int unuse_one_window(struct packed_git *current, int keep_fd)
                pack_mapped -= lru_w->len;
                if (lru_l)
                        lru_l->next = lru_w->next;
-               else {
+               else
                        lru_p->windows = lru_w->next;
-                       if (!lru_p->windows && lru_p->pack_fd != -1
-                               && lru_p->pack_fd != keep_fd) {
-                               close(lru_p->pack_fd);
-                               pack_open_fds--;
-                               lru_p->pack_fd = -1;
-                       }
-               }
                free(lru_w);
                pack_open_windows--;
                return 1;
@@ -644,10 +637,10 @@ static int unuse_one_window(struct packed_git *current, int keep_fd)
        return 0;
 }
 
-void release_pack_memory(size_t need, int fd)
+void release_pack_memory(size_t need)
 {
        size_t cur = pack_mapped;
-       while (need >= (cur - pack_mapped) && unuse_one_window(NULL, fd))
+       while (need >= (cur - pack_mapped) && unuse_one_window(NULL))
                ; /* nothing */
 }
 
@@ -658,7 +651,7 @@ void *xmmap(void *start, size_t length,
        if (ret == MAP_FAILED) {
                if (!length)
                        return NULL;
-               release_pack_memory(length, fd);
+               release_pack_memory(length);
                ret = mmap(start, length, prot, flags, fd, offset);
                if (ret == MAP_FAILED)
                        die_errno("Out of memory? mmap failed");
@@ -682,6 +675,83 @@ void close_pack_windows(struct packed_git *p)
        }
 }
 
+/*
+ * The LRU pack is the one with the oldest MRU window, preferring packs
+ * with no used windows, or the oldest mtime if it has no windows allocated.
+ */
+static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struct pack_window **mru_w, int *accept_windows_inuse)
+{
+       struct pack_window *w, *this_mru_w;
+       int has_windows_inuse = 0;
+
+       /*
+        * Reject this pack if it has windows and the previously selected
+        * one does not.  If this pack does not have windows, reject
+        * it if the pack file is newer than the previously selected one.
+        */
+       if (*lru_p && !*mru_w && (p->windows || p->mtime > (*lru_p)->mtime))
+               return;
+
+       for (w = this_mru_w = p->windows; w; w = w->next) {
+               /*
+                * Reject this pack if any of its windows are in use,
+                * but the previously selected pack did not have any
+                * inuse windows.  Otherwise, record that this pack
+                * has windows in use.
+                */
+               if (w->inuse_cnt) {
+                       if (*accept_windows_inuse)
+                               has_windows_inuse = 1;
+                       else
+                               return;
+               }
+
+               if (w->last_used > this_mru_w->last_used)
+                       this_mru_w = w;
+
+               /*
+                * Reject this pack if it has windows that have been
+                * used more recently than the previously selected pack.
+                * If the previously selected pack had windows inuse and
+                * we have not encountered a window in this pack that is
+                * inuse, skip this check since we prefer a pack with no
+                * inuse windows to one that has inuse windows.
+                */
+               if (*mru_w && *accept_windows_inuse == has_windows_inuse &&
+                   this_mru_w->last_used > (*mru_w)->last_used)
+                       return;
+       }
+
+       /*
+        * Select this pack.
+        */
+       *mru_w = this_mru_w;
+       *lru_p = p;
+       *accept_windows_inuse = has_windows_inuse;
+}
+
+static int close_one_pack(void)
+{
+       struct packed_git *p, *lru_p = NULL;
+       struct pack_window *mru_w = NULL;
+       int accept_windows_inuse = 1;
+
+       for (p = packed_git; p; p = p->next) {
+               if (p->pack_fd == -1)
+                       continue;
+               find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
+       }
+
+       if (lru_p) {
+               close(lru_p->pack_fd);
+               pack_open_fds--;
+               lru_p->pack_fd = -1;
+               return 1;
+       }
+
+       return 0;
+}
+
 void unuse_pack(struct pack_window **w_cursor)
 {
        struct pack_window *w = *w_cursor;
@@ -777,7 +847,7 @@ static int open_packed_git_1(struct packed_git *p)
                        pack_max_fds = 1;
        }
 
-       while (pack_max_fds <= pack_open_fds && unuse_one_window(NULL, -1))
+       while (pack_max_fds <= pack_open_fds && close_one_pack())
                ; /* nothing */
 
        p->pack_fd = git_open_noatime(p->pack_name);
@@ -893,7 +963,7 @@ unsigned char *use_pack(struct packed_git *p,
                        win->len = (size_t)len;
                        pack_mapped += win->len;
                        while (packed_git_limit < pack_mapped
-                               && unuse_one_window(p, p->pack_fd))
+                               && unuse_one_window(p))
                                ; /* nothing */
                        win->base = xmmap(NULL, win->len,
                                PROT_READ, MAP_PRIVATE,
@@ -939,7 +1009,7 @@ static struct packed_git *alloc_packed_git(int extra)
 
 static void try_to_free_pack_memory(size_t size)
 {
-       release_pack_memory(size, -1);
+       release_pack_memory(size);
 }
 
 struct packed_git *add_packed_git(const char *path, int path_len, int local)
index 852dd951dc2d93660727de23ea9467503288e25b..65ad066d9bb4efd9b61142b40d790bac9543de1d 100644 (file)
@@ -1004,17 +1004,6 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
        return st;
 }
 
-/* parse @something syntax, when 'something' is not {.*} */
-static int interpret_empty_at(const char *name, int namelen, int len, struct strbuf *buf)
-{
-       if (len || name[1] == '{')
-               return -1;
-
-       strbuf_reset(buf);
-       strbuf_add(buf, "HEAD", 4);
-       return 1;
-}
-
 static int reinterpret(const char *name, int namelen, int len, struct strbuf *buf)
 {
        /* we have extra data, which might need further processing */
@@ -1077,15 +1066,9 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
        cp = strchr(name, '@');
        if (!cp)
                return -1;
-
-       len = interpret_empty_at(name, namelen, cp - name, buf);
-       if (len > 0)
-               return reinterpret(name, namelen, len, buf);
-
        tmp_len = upstream_mark(cp, namelen - (cp - name));
        if (!tmp_len)
                return -1;
-
        len = cp + tmp_len - name;
        cp = xstrndup(name, cp - name);
        upstream = branch_get(*cp ? cp : NULL);
index 986b2a8f2664b1734964049a5b24fc50cf938cfe..5ed69a6f566bf3a7944b41bace4cfbe26d015040 100755 (executable)
@@ -25,6 +25,10 @@ test_expect_success POSIXPERM,SANITY 'mktemp to unwritable directory prints file
        grep "cannotwrite/test" err
 '
 
+test_expect_success 'git_mkstemps_mode does not fail if fd 0 is not open' '
+       git commit --allow-empty -m message <&-
+'
+
 test_expect_success 'check for a bug in the regex routines' '
        # if this test fails, re-build git with NO_REGEX=1
        test-regex
index 4db1613f8a313b3d292132592c8e408dd95f05c9..e5aea3b89602fdaf5ed3a9a230a604dd3f48cda0 100755 (executable)
@@ -55,8 +55,6 @@ check "HEAD@{u}" ref refs/heads/upstream-branch
 check "@{u}@{1}" commit upstream-one
 check "@{-1}@{u}" ref refs/heads/master
 check "@{-1}@{u}@{1}" commit master-one
-check "@" commit new-two
-check "@@{u}" ref refs/heads/upstream-branch
 nonsense "@{u}@{-1}"
 nonsense "@{0}@{0}"
 nonsense "@{1}@{u}"
index 49ccb38f8856e6e5fa00961c6e9117f94c6ae233..4dbeddb0de17eb9fa87fbed98daabcb180235555 100755 (executable)
@@ -976,4 +976,17 @@ test_expect_success 'rebase -i with --strategy and -X' '
        test $(cat file1) = Z
 '
 
+test_expect_success 'rebase -i error on commits with \ in message' '
+       current_head=$(git rev-parse HEAD)
+       test_when_finished "git rebase --abort; git reset --hard $current_head; rm -f error" &&
+       test_commit TO-REMOVE will-conflict old-content &&
+       test_commit "\temp" will-conflict new-content dummy &&
+       (
+       EDITOR=true &&
+       export EDITOR &&
+       test_must_fail git rebase -i HEAD^ --onto HEAD^^ 2>error
+       ) &&
+       test_expect_code 1 grep  "      emp" error
+'
+
 test_done
index 5d22f17ca2d3469c7542805e365246a70a5fba64..debda7a678277e1198ba6620210b66984caf03a2 100755 (executable)
@@ -673,22 +673,4 @@ test_expect_success 'store updates stash ref and reflog' '
        grep quux bazzy
 '
 
-test_expect_success 'stash a change to turn a non-directory to a directory' '
-       git reset --hard &&
-       >testfile &&
-       git add testfile &&
-       git commit -m "add testfile as a regular file" &&
-       rm testfile &&
-       mkdir testfile &&
-       >testfile/file &&
-       test_must_fail git stash save "recover regular file" &&
-       test -f testfile/file
-'
-
-test_expect_success 'stash a change to turn a non-directory to a directory (forced)' '
-       git stash save --force "recover regular file (forced)" &&
-       ! test -f testfile/file &&
-       test -f testfile
-'
-
 test_done
index fd2598e60190fe04381652c7dfe997e01b4ea0c5..a80584ea0eaba854ff21318e3c9646f72325bee7 100755 (executable)
@@ -505,4 +505,20 @@ test_expect_success 'test --all, --depth, and explicit tag' '
        ) >out-adt 2>error-adt
 '
 
+test_expect_success 'shallow fetch with tags does not break the repository' '
+       mkdir repo1 &&
+       (
+               cd repo1 &&
+               git init &&
+               test_commit 1 &&
+               test_commit 2 &&
+               test_commit 3 &&
+               mkdir repo2 &&
+               cd repo2 &&
+               git init &&
+               git fetch --depth=2 ../.git master:branch &&
+               git fsck
+       )
+'
+
 test_done
index ac6f3b6af25c67ae3a2c0748c34f99b4cd0d4b32..31a770d9bc58d7c01d69f7817fcbc06622859662 100755 (executable)
@@ -1031,6 +1031,32 @@ test_expect_success \
         git diff-tree -M -r M3^ M3 >actual &&
         compare_diff_raw expect actual'
 
+cat >input <<INPUT_END
+commit refs/heads/M4
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+rename root
+COMMIT
+
+from refs/heads/M2^0
+R "" sub
+
+INPUT_END
+
+cat >expect <<EOF
+:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100  file2/oldf      sub/file2/oldf
+:100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 R100  file4   sub/file4
+:100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc R100  i/am/new/to/you sub/i/am/new/to/you
+:100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 R100  newdir/exec.sh  sub/newdir/exec.sh
+:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100  newdir/interesting      sub/newdir/interesting
+EOF
+test_expect_success \
+       'M: rename root to subdirectory' \
+       'git fast-import <input &&
+        git diff-tree -M -r M4^ M4 >actual &&
+        cat actual &&
+        compare_diff_raw expect actual'
+
 ###
 ### series N
 ###
@@ -1227,6 +1253,29 @@ test_expect_success \
         git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
         compare_diff_raw expect actual'
 
+test_expect_success \
+       'N: copy root by path' \
+       'cat >expect <<-\EOF &&
+       :100755 100755 f1fb5da718392694d0076d677d6d0e364c79b0bc f1fb5da718392694d0076d677d6d0e364c79b0bc C100   file2/newf      oldroot/file2/newf
+       :100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 C100   file2/oldf      oldroot/file2/oldf
+       :100755 100755 85df50785d62d3b05ab03d9cbf7e4a0b49449730 85df50785d62d3b05ab03d9cbf7e4a0b49449730 C100   file4   oldroot/file4
+       :100755 100755 e74b7d465e52746be2b4bae983670711e6e66657 e74b7d465e52746be2b4bae983670711e6e66657 C100   newdir/exec.sh  oldroot/newdir/exec.sh
+       :100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100   newdir/interesting      oldroot/newdir/interesting
+       EOF
+        cat >input <<-INPUT_END &&
+       commit refs/heads/N-copy-root-path
+       committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+       data <<COMMIT
+       copy root directory by (empty) path
+       COMMIT
+
+       from refs/heads/branch^0
+       C "" oldroot
+       INPUT_END
+        git fast-import <input &&
+        git diff-tree -C --find-copies-harder -r branch N-copy-root-path >actual &&
+        compare_diff_raw expect actual'
+
 test_expect_success \
        'N: delete directory by copying' \
        'cat >expect <<-\EOF &&
@@ -2934,4 +2983,20 @@ test_expect_success 'S: ls with garbage after sha1 must fail' '
        test_i18ngrep "space after tree-ish" err
 '
 
+###
+### series T (ls)
+###
+# Setup is carried over from series S.
+
+test_expect_success 'T: ls root tree' '
+       sed -e "s/Z\$//" >expect <<-EOF &&
+       040000 tree $(git rev-parse S^{tree})   Z
+       EOF
+       sha1=$(git rev-parse --verify S) &&
+       git fast-import --import-marks=marks <<-EOF >actual &&
+       ls $sha1 ""
+       EOF
+       test_cmp expect actual
+'
+
 test_done
index 272a071e85b0b7c6b34da06fd7492a257b09fa52..2d4beb5e50c257fed2f4b6475cb5834425b5a64f 100755 (executable)
@@ -69,7 +69,7 @@ run_completion ()
        local -a COMPREPLY _words
        local _cword
        _words=( $1 )
-       test "${1: -1}" = ' ' && _words+=('')
+       test "${1: -1}" = ' ' && _words[${#_words[@]}+1]=''
        (( _cword = ${#_words[@]} - 1 ))
        __git_wrap__git_main && print_comp
 }
index 15ab6d8e7ea05ca54f0b755828e166fafe9bc28c..1f3bcebfd76ae1b37e1542631a87e5a5e3e6b1eb 100755 (executable)
@@ -30,6 +30,7 @@ do
        if [ "$local_sha" = $z40 ]
        then
                # Handle delete
+               :
        else
                if [ "$remote_sha" = $z40 ]
                then