summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clang-format2
-rw-r--r--.travis.yml10
-rw-r--r--Documentation/RelNotes/2.22.0.txt101
-rw-r--r--Documentation/config/user.txt23
-rw-r--r--Documentation/diff-format.txt20
-rw-r--r--Documentation/diff-generate-patch.txt13
-rw-r--r--Documentation/diff-options.txt22
-rw-r--r--Documentation/git-branch.txt6
-rw-r--r--Documentation/git-checkout.txt10
-rw-r--r--Documentation/git-diff-tree.txt11
-rw-r--r--Documentation/git-gc.txt2
-rw-r--r--Documentation/git-rebase.txt2
-rw-r--r--Documentation/git-submodule.txt4
-rw-r--r--Documentation/gitattributes.txt2
-rw-r--r--Documentation/githooks.txt4
-rw-r--r--Documentation/merge-options.txt11
-rw-r--r--Documentation/pretty-formats.txt264
-rw-r--r--Documentation/rev-list-options.txt7
-rw-r--r--Documentation/technical/api-trace2.txt1349
-rw-r--r--Documentation/technical/protocol-capabilities.txt18
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile88
l---------RelNotes2
-rw-r--r--apply.c4
-rw-r--r--attr.c8
-rw-r--r--bisect.c19
-rw-r--r--blame.c3
-rw-r--r--builtin/am.c6
-rw-r--r--builtin/blame.c2
-rw-r--r--builtin/branch.c25
-rw-r--r--builtin/checkout.c134
-rw-r--r--builtin/commit.c11
-rw-r--r--builtin/diff-tree.c6
-rw-r--r--builtin/diff.c20
-rw-r--r--builtin/help.c4
-rw-r--r--builtin/log.c8
-rw-r--r--builtin/merge.c9
-rw-r--r--builtin/pack-objects.c16
-rw-r--r--builtin/pack-redundant.c232
-rw-r--r--builtin/prune-packed.c5
-rw-r--r--builtin/prune.c44
-rw-r--r--builtin/pull.c4
-rw-r--r--builtin/rebase.c55
-rw-r--r--builtin/receive-pack.c27
-rw-r--r--builtin/replace.c4
-rw-r--r--builtin/reset.c6
-rw-r--r--builtin/submodule--helper.c9
-rw-r--r--builtin/update-index.c41
-rw-r--r--builtin/worktree.c1
-rw-r--r--cache.h21
-rw-r--r--check-racy.c28
-rwxr-xr-xci/run-windows-build.sh103
-rw-r--r--combine-diff.c76
-rw-r--r--common-main.c13
-rw-r--r--compat/bswap.h5
-rw-r--r--compat/mingw.c11
-rw-r--r--compat/mingw.h3
-rw-r--r--compat/win32/trace2_win32_process_info.c147
-rw-r--r--config.c6
-rw-r--r--config.mak.dev44
-rw-r--r--config.mak.uname5
-rw-r--r--connect.c3
-rw-r--r--contrib/completion/git-completion.bash45
-rw-r--r--date.c4
-rw-r--r--diff-lib.c2
-rw-r--r--diff-no-index.c8
-rw-r--r--diff.c616
-rw-r--r--diff.h85
-rw-r--r--editor.c1
-rw-r--r--entry.c26
-rw-r--r--exec-cmd.c2
-rw-r--r--git-compat-util.h7
-rwxr-xr-xgit-send-email.perl6
-rwxr-xr-xgit-submodule.sh3
-rw-r--r--git.c65
-rw-r--r--gitk-git/po/bg.po660
-rw-r--r--ident.c92
-rw-r--r--list-objects-filter-options.c4
-rw-r--r--log-tree.c3
-rw-r--r--merge-recursive.c23
-rw-r--r--pack-objects.c3
-rw-r--r--pack-objects.h6
-rw-r--r--pager.c1
-rw-r--r--parse-options-cb.c7
-rw-r--r--parse-options.c152
-rw-r--r--parse-options.h108
-rw-r--r--pkt-line.c2
-rw-r--r--pkt-line.h1
-rw-r--r--po/ca.po6
-rw-r--r--po/fr.po1500
-rw-r--r--po/vi.po6954
-rw-r--r--pretty.c117
-rw-r--r--reachable.c42
-rw-r--r--read-cache.c64
-rw-r--r--ref-filter.c40
-rw-r--r--refs/files-backend.c5
-rw-r--r--remote-curl.c391
-rw-r--r--repository.c2
-rw-r--r--repository.h3
-rw-r--r--revision.c6
-rw-r--r--revision.h1
-rw-r--r--run-command.c59
-rw-r--r--run-command.h13
-rw-r--r--sequencer.c7
-rw-r--r--sh-i18n--envsubst.c3
-rw-r--r--split-index.c36
-rw-r--r--strbuf.c21
-rw-r--r--strbuf.h8
-rw-r--r--sub-process.c1
-rw-r--r--submodule-config.c9
-rw-r--r--submodule.c15
-rw-r--r--t/README9
-rw-r--r--t/helper/test-parse-options.c3
-rw-r--r--t/helper/test-tool.c4
-rw-r--r--t/helper/test-tool.h1
-rw-r--r--t/helper/test-trace2.c273
-rwxr-xr-xt/perf/p5304-prune.sh35
-rwxr-xr-xt/t0001-init.sh1
-rwxr-xr-xt/t0210-trace2-normal.sh135
-rw-r--r--t/t0210/scrub_normal.perl48
-rwxr-xr-xt/t0211-trace2-perf.sh153
-rw-r--r--t/t0211/scrub_perf.perl76
-rwxr-xr-xt/t0212-trace2-event.sh236
-rw-r--r--t/t0212/parse_events.perl251
-rwxr-xr-xt/t1700-split-index.sh18
-rwxr-xr-xt/t2025-checkout-no-overlay.sh47
-rwxr-xr-xt/t2400-worktree-add.sh (renamed from t/t2025-worktree-add.sh)0
-rwxr-xr-xt/t2401-worktree-prune.sh (renamed from t/t2026-worktree-prune.sh)0
-rwxr-xr-xt/t2402-worktree-list.sh (renamed from t/t2027-worktree-list.sh)0
-rwxr-xr-xt/t2403-worktree-move.sh (renamed from t/t2028-worktree-move.sh)0
-rwxr-xr-xt/t2404-worktree-config.sh (renamed from t/t2029-worktree-config.sh)0
-rwxr-xr-xt/t3203-branch-output.sh44
-rwxr-xr-xt/t3400-rebase.sh8
-rwxr-xr-xt/t4038-diff-combined.sh88
-rwxr-xr-xt/t4053-diff-no-index.sh8
-rwxr-xr-xt/t4205-log-pretty-formats.sh117
-rwxr-xr-xt/t5304-prune.sh28
-rwxr-xr-xt/t5323-pack-redundant.sh467
-rwxr-xr-xt/t5702-protocol-v2.sh33
-rwxr-xr-xt/t6030-bisect-porcelain.sh6
-rwxr-xr-xt/t7517-per-repo-email.sh74
-rwxr-xr-xt/t7800-difftool.sh4
-rwxr-xr-xt/t9902-completion.sh1
-rw-r--r--t/test-lib.sh6
-rw-r--r--trace2.c761
-rw-r--r--trace2.h385
-rw-r--r--trace2/tr2_cfg.c90
-rw-r--r--trace2/tr2_cfg.h19
-rw-r--r--trace2/tr2_cmd_name.c30
-rw-r--r--trace2/tr2_cmd_name.h24
-rw-r--r--trace2/tr2_dst.c252
-rw-r--r--trace2/tr2_dst.h36
-rw-r--r--trace2/tr2_sid.c67
-rw-r--r--trace2/tr2_sid.h18
-rw-r--r--trace2/tr2_tbuf.c32
-rw-r--r--trace2/tr2_tbuf.h23
-rw-r--r--trace2/tr2_tgt.h133
-rw-r--r--trace2/tr2_tgt_event.c588
-rw-r--r--trace2/tr2_tgt_normal.c323
-rw-r--r--trace2/tr2_tgt_perf.c534
-rw-r--r--trace2/tr2_tls.c164
-rw-r--r--trace2/tr2_tls.h97
-rw-r--r--trailer.c25
-rw-r--r--trailer.h4
-rw-r--r--transport-helper.c2
-rw-r--r--transport.c1
-rw-r--r--unpack-trees.c21
-rw-r--r--usage.c31
-rw-r--r--wt-status.c24
-rw-r--r--xdiff-interface.c4
170 files changed, 14094 insertions, 6144 deletions
diff --git a/.clang-format b/.clang-format
index de1c8b5..41d4cd2 100644
--- a/.clang-format
+++ b/.clang-format
@@ -149,7 +149,7 @@ Cpp11BracedListStyle: false
# A list of macros that should be interpreted as foreach loops instead of as
# function calls.
-ForEachMacros: ['for_each_string_list_item']
+ForEachMacros: ['for_each_string_list_item', 'for_each_wanted_builtin', 'for_each_builtin', 'for_each_ut']
# The maximum number of consecutive empty lines to keep.
MaxEmptyLinesToKeep: 1
diff --git a/.travis.yml b/.travis.yml
index 36cbdea..ffb1bc4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,16 +21,6 @@ matrix:
compiler:
addons:
before_install:
- - env: jobname=Windows
- os: linux
- compiler:
- addons:
- before_install:
- script:
- - >
- test "$TRAVIS_REPO_SLUG" != "git/git" ||
- ci/run-windows-build.sh $TRAVIS_BRANCH $(git rev-parse HEAD)
- after_failure:
- env: jobname=Linux32
os: linux
compiler:
diff --git a/Documentation/RelNotes/2.22.0.txt b/Documentation/RelNotes/2.22.0.txt
new file mode 100644
index 0000000..16d3110
--- /dev/null
+++ b/Documentation/RelNotes/2.22.0.txt
@@ -0,0 +1,101 @@
+Git 2.22 Release Notes
+======================
+
+Updates since v2.21
+-------------------
+
+UI, Workflows & Features
+
+ * "git checkout --no-overlay" can be used to trigger a new mode of
+ checking out paths out of the tree-ish, that allows paths that
+ match the pathspec that are in the current index and working tree
+ and are not in the tree-ish.
+
+ * The %(trailers) formatter in "git log --format=..." now allows to
+ optionally pick trailers selectively by keyword, show only values,
+ etc.
+
+ * Four new configuration variables {author,committer}.{name,email}
+ have been introduced to override user.{name,email} in more specific
+ cases.
+
+ * Command-line completion (in contrib/) learned to tab-complete the
+ "git submodule absorbgitdirs" subcommand.
+
+ * "git branch" learned a new subcommand "--show-current".
+
+ * Output from "diff --cc" did not show the original paths when the
+ merge involved renames. A new option adds the paths in the
+ original trees to the output.
+
+ * The command line completion (in contrib/) has been taught to
+ complete more subcommand parameters.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The diff machinery, one of the oldest parts of the system, which
+ long predates the parse-options API, uses fairly long and complex
+ handcrafted option parser. This is being rewritten to use the
+ parse-options API.
+
+ * The implementation of pack-redundant has been updated for
+ performance in a repository with many packfiles.
+
+ * A more structured way to obtain execution trace has been added.
+
+ * "git prune" has been taught to take advantage of reachability
+ bitmap when able.
+
+
+Fixes since v2.21
+-----------------
+
+ * "git prune-packed" did not notice and complain against excess
+ arguments given from the command line, which now it does.
+ (merge 9b0bd87ed2 rj/prune-packed-excess-args later to maint).
+
+ * Split-index fix.
+ (merge 6e37c8ed3c nd/split-index-null-base-fix later to maint).
+
+ * "git diff --no-index" may still want to access Git goodies like
+ --ext-diff and --textconv, but so far these have been ignored,
+ which has been corrected.
+ (merge 287ab28bfa jk/diff-no-index-initialize later to maint).
+
+ * Unify RPC code for smart http in protocol v0/v1 and v2, which fixes
+ a bug in the latter (lack of authentication retry) and generally
+ improves the code base.
+ (merge a97d00799a jt/http-auth-proto-v2-fix later to maint).
+
+ * The include file compat/bswap.h has been updated so that it is safe
+ to (accidentally) include it more than once.
+ (merge 33aa579a55 jk/guard-bswap-header later to maint).
+
+ * The set of header files used by "make hdr-check" unconditionally
+ included sha256/gcrypt.h, even when it is not used, causing the
+ make target to fail. We now skip it when GCRYPT_SHA256 is not in
+ use.
+ (merge f23aa18e7f rj/hdr-check-gcrypt-fix later to maint).
+
+ * The Makefile uses 'find' utility to enumerate all the *.h header
+ files, which is expensive on platforms with slow filesystems; it
+ now optionally uses "ls-files" if working within a repository,
+ which is a trick similar to how all sources are enumerated to run
+ ETAGS on.
+ (merge 92b88eba9f js/find-lib-h-with-ls-files-when-possible later to maint).
+
+ * Code cleanup, docfix, build fix, etc.
+ (merge 11f470aee7 jc/test-yes-doc later to maint).
+ (merge 90503a240b js/doc-symref-in-proto-v1 later to maint).
+ (merge 5c326d1252 jk/unused-params later to maint).
+ (merge 68cabbfda3 dl/doc-submodule-wo-subcommand later to maint).
+ (merge 9903623761 ab/receive-pack-use-after-free-fix later to maint).
+ (merge 1ede45e44b en/merge-options-doc later to maint).
+ (merge 3e14dd2c8e rd/doc-hook-used-in-sample later to maint).
+ (merge c271dc28fd nd/no-more-check-racy later to maint).
+ (merge e6e15194a8 yb/utf-16le-bom-spellfix later to maint).
+ (merge bb101aaf0c rd/attr.c-comment-typofix later to maint).
+ (merge 716a5af812 rd/gc-prune-doc-fix later to maint).
+ (merge 50b206371d js/untravis-windows later to maint).
+ (merge dbf47215e3 js/rebase-recreate-merge later to maint).
diff --git a/Documentation/config/user.txt b/Documentation/config/user.txt
index b5b2ba1..0557cbb 100644
--- a/Documentation/config/user.txt
+++ b/Documentation/config/user.txt
@@ -1,12 +1,19 @@
-user.email::
- Your email address to be recorded in any newly created commits.
- Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and
- `EMAIL` environment variables. See linkgit:git-commit-tree[1].
-
user.name::
- Your full name to be recorded in any newly created commits.
- Can be overridden by the `GIT_AUTHOR_NAME` and `GIT_COMMITTER_NAME`
- environment variables. See linkgit:git-commit-tree[1].
+user.email::
+author.name::
+author.email::
+committer.name::
+committer.email::
+ The `user.name` and `user.email` variables determine what ends
+ up in the `author` and `committer` field of commit
+ objects.
+ If you need the `author` or `committer` to be different, the
+ `author.name`, `author.email`, `committer.name` or
+ `committer.email` variables can be set.
+ Also, all of these can be overridden by the `GIT_AUTHOR_NAME`,
+ `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME`,
+ `GIT_COMMITTER_EMAIL` and `EMAIL` environment variables.
+ See linkgit:git-commit-tree[1] for more information.
user.useConfigOnly::
Instruct Git to avoid trying to guess defaults for `user.email`
diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.txt
index cdcc17f..4d846d7 100644
--- a/Documentation/diff-format.txt
+++ b/Documentation/diff-format.txt
@@ -95,12 +95,26 @@ from the format described above in the following way:
. there are more "src" modes and "src" sha1
. status is concatenated status characters for each parent
. no optional "score" number
-. single path, only for "dst"
+. tab-separated pathname(s) of the file
-Example:
+For `-c` and `--cc`, only the destination or final path is shown even
+if the file was renamed on any side of history. With
+`--combined-all-paths`, the name of the path in each parent is shown
+followed by the name of the path in the merge commit.
+
+Examples for `-c` and `--cc` without `--combined-all-paths`:
+------------------------------------------------
+::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c
+::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
+::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
+------------------------------------------------
+
+Examples when `--combined-all-paths` added to either `-c` or `--cc`:
------------------------------------------------
-::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
+::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
+::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
+::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
------------------------------------------------
Note that 'combined diff' lists only files which were modified from
diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt
index 231105c..f10ca41 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/Documentation/diff-generate-patch.txt
@@ -143,6 +143,19 @@ copying detection) are designed to work with diff of two
Similar to two-line header for traditional 'unified' diff
format, `/dev/null` is used to signal created or deleted
files.
++
+However, if the --combined-all-paths option is provided, instead of a
+two-line from-file/to-file you get a N+1 line from-file/to-file header,
+where N is the number of parents in the merge commit
+
+ --- a/file
+ --- a/file
+ --- a/file
+ +++ b/file
++
+This extended format can be useful if rename or copy detection is
+active, to allow you to see the original name of the file in different
+parents.
4. Chunk header format is modified to prevent people from
accidentally feeding it to `patch -p1`. Combined diff format
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 554a340..5ebc568 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -36,11 +36,21 @@ endif::git-format-patch[]
-U<n>::
--unified=<n>::
Generate diffs with <n> lines of context instead of
- the usual three.
+ the usual three. Implies `--patch`.
ifndef::git-format-patch[]
Implies `-p`.
endif::git-format-patch[]
+--output=<file>::
+ Output to a specific file instead of stdout.
+
+--output-indicator-new=<char>::
+--output-indicator-old=<char>::
+--output-indicator-context=<char>::
+ Specify the character used to indicate new, old or context
+ lines in the generated patch. Normally they are '+', '-' and
+ ' ' respectively.
+
ifndef::git-format-patch[]
--raw::
ifndef::git-log[]
@@ -148,6 +158,7 @@ These parameters can also be set individually with `--stat-width=<width>`,
number of modified files, as well as number of added and deleted
lines.
+-X[<param1,param2,...>]::
--dirstat[=<param1,param2,...>]::
Output the distribution of relative amount of changes for each
sub-directory. The behavior of `--dirstat` can be customized by
@@ -192,6 +203,12 @@ directories with less than 10% of the total amount of changed files,
and accumulating child directory counts in the parent directories:
`--dirstat=files,10,cumulative`.
+--cumulative::
+ Synonym for --dirstat=cumulative
+
+--dirstat-by-file[=<param1,param2>...]::
+ Synonym for --dirstat=files,param1,param2...
+
--summary::
Output a condensed summary of extended header information
such as creations, renames and mode changes.
@@ -386,6 +403,9 @@ endif::git-format-patch[]
Turn off rename detection, even when the configuration
file gives the default to do so.
+--[no-]rename-empty::
+ Whether to use empty blobs as rename source.
+
ifndef::git-format-patch[]
--check::
Warn if changes introduce conflict markers or whitespace errors.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 3bd83a7..0cd87dd 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -9,7 +9,7 @@ SYNOPSIS
--------
[verse]
'git branch' [--color[=<when>] | --no-color] [-r | -a]
- [--list] [-v [--abbrev=<length> | --no-abbrev]]
+ [--list] [--show-current] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
@@ -160,6 +160,10 @@ This option is only applicable in non-verbose mode.
branch --list 'maint-*'`, list only the branches that match
the pattern(s).
+--show-current::
+ Print the name of the current branch. In detached HEAD state,
+ nothing is printed.
+
-v::
-vv::
--verbose::
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 8c3d412..f179b43 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -260,6 +260,9 @@ the conflicted merge in the specified paths.
This means that you can use `git checkout -p` to selectively discard
edits from your current working tree. See the ``Interactive Mode''
section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
++
+Note that this option uses the no overlay mode by default (see also
+`--[no-]overlay`), and currently doesn't support overlay mode.
--ignore-other-worktrees::
`git checkout` refuses when the wanted ref is already checked
@@ -280,6 +283,13 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
Do not attempt to create a branch if a remote tracking branch
of the same name exists.
+--[no-]overlay::
+ In the default overlay mode, `git checkout` never
+ removes files from the index or the working tree. When
+ specifying `--no-overlay`, files that appear in the index and
+ working tree, but not in <tree-ish> are removed, to make them
+ match <tree-ish> exactly.
+
<branch>::
Branch to checkout; if it refers to a branch (i.e., a name that,
when prepended with "refs/heads/", is a valid ref), then that
diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt
index 43daa7c..24f32e8 100644
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.txt
@@ -10,8 +10,8 @@ SYNOPSIS
--------
[verse]
'git diff-tree' [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty]
- [-t] [-r] [-c | --cc] [--root] [<common diff options>]
- <tree-ish> [<tree-ish>] [<path>...]
+ [-t] [-r] [-c | --cc] [--combined-all-paths] [--root]
+ [<common diff options>] <tree-ish> [<tree-ish>] [<path>...]
DESCRIPTION
-----------
@@ -105,6 +105,13 @@ include::pretty-options.txt[]
itself and the commit log message is not shown, just like in any other
"empty diff" case.
+--combined-all-paths::
+ This flag causes combined diffs (used for merge commits) to
+ list the name of the file from all parents. It thus only has
+ effect when -c or --cc are specified, and is likely only
+ useful if filename changes are detected (i.e. when either
+ rename or copy detection have been requested).
+
--always::
Show the commit itself and the commit log message even
if the diff itself is empty.
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index a744249..a7c1b0f 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -76,7 +76,7 @@ be performed as well.
--prune=<date>::
Prune loose objects older than date (default is 2 weeks ago,
overridable by the config variable `gc.pruneExpire`).
- --prune=all prunes loose objects regardless of their age and
+ --prune=now prunes loose objects regardless of their age and
increases the risk of corruption if another process is writing to
the repository concurrently; see "NOTES" below. --prune is on by
default.
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 5629ba4..6363d67 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -410,7 +410,7 @@ See also INCOMPATIBLE OPTIONS below.
+
By default, or when `no-rebase-cousins` was specified, commits which do not
have `<upstream>` as direct ancestor will keep their original branch point,
-i.e. commits that would be excluded by gitlink:git-log[1]'s
+i.e. commits that would be excluded by linkgit:git-log[1]'s
`--ancestry-path` option will keep their original ancestry by default. If
the `rebase-cousins` mode is turned on, such commits are instead rebased
onto `<upstream>` (or `<onto>`, if specified).
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index ba3c4df..2794e29 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -9,6 +9,7 @@ git-submodule - Initialize, update or inspect submodules
SYNOPSIS
--------
[verse]
+'git submodule' [--quiet] [--cached]
'git submodule' [--quiet] add [<options>] [--] <repository> [<path>]
'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
'git submodule' [--quiet] init [--] [<path>...]
@@ -28,6 +29,9 @@ For more information about submodules, see linkgit:gitsubmodules[7].
COMMANDS
--------
+With no arguments, shows the status of existing submodules. Several
+subcommands are available to perform operations on the submodules.
+
add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--depth <depth>] [--] <repository> [<path>]::
Add the given repository as a submodule at the given path
to the changeset to be committed next to the current
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 9b41f81..bdd11a2 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -346,7 +346,7 @@ automatic line ending conversion based on your platform.
Use the following attributes if your '*.ps1' files are UTF-16 little
endian encoded without BOM and you want Git to use Windows line endings
-in the working directory (use `UTF-16-LE-BOM` instead of `UTF-16LE` if
+in the working directory (use `UTF-16LE-BOM` instead of `UTF-16LE` if
you want UTF-16 little endian with BOM).
Please note, it is highly recommended to
explicitly define the line endings with `eol` if the `working-tree-encoding`
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 9590443..5bf653c 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -99,6 +99,10 @@ All the `git commit` hooks are invoked with the environment
variable `GIT_EDITOR=:` if the command will not bring up an editor
to modify the commit message.
+The default 'pre-commit' hook, when enabled--and with the
+`hooks.allownonascii` config option unset or set to false--prevents
+the use of non-ASCII filenames.
+
prepare-commit-msg
~~~~~~~~~~~~~~~~~~
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 63a3fc0..92a7d93 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -3,9 +3,14 @@
Perform the merge and commit the result. This option can
be used to override --no-commit.
+
-With --no-commit perform the merge but pretend the merge
-failed and do not autocommit, to give the user a chance to
-inspect and further tweak the merge result before committing.
+With --no-commit perform the merge and stop just before creating
+a merge commit, to give the user a chance to inspect and further
+tweak the merge result before committing.
++
+Note that fast-forward updates do not create a merge commit and
+therefore there is no way to stop those merges with --no-commit.
+Thus, if you want to ensure your branch is not changed or updated
+by the merge command, use --no-ff with --no-commit.
--edit::
-e::
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 7bfffae..0795983 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -102,120 +102,160 @@ The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
+
The placeholders are:
-- '%H': commit hash
-- '%h': abbreviated commit hash
-- '%T': tree hash
-- '%t': abbreviated tree hash
-- '%P': parent hashes
-- '%p': abbreviated parent hashes
-- '%an': author name
-- '%aN': author name (respecting .mailmap, see linkgit:git-shortlog[1]
- or linkgit:git-blame[1])
-- '%ae': author email
-- '%aE': author email (respecting .mailmap, see
- linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%ad': author date (format respects --date= option)
-- '%aD': author date, RFC2822 style
-- '%ar': author date, relative
-- '%at': author date, UNIX timestamp
-- '%ai': author date, ISO 8601-like format
-- '%aI': author date, strict ISO 8601 format
-- '%cn': committer name
-- '%cN': committer name (respecting .mailmap, see
- linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%ce': committer email
-- '%cE': committer email (respecting .mailmap, see
- linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%cd': committer date (format respects --date= option)
-- '%cD': committer date, RFC2822 style
-- '%cr': committer date, relative
-- '%ct': committer date, UNIX timestamp
-- '%ci': committer date, ISO 8601-like format
-- '%cI': committer date, strict ISO 8601 format
-- '%d': ref names, like the --decorate option of linkgit:git-log[1]
-- '%D': ref names without the " (", ")" wrapping.
-- '%S': ref name given on the command line by which the commit was reached
- (like `git log --source`), only works with `git log`
-- '%e': encoding
-- '%s': subject
-- '%f': sanitized subject line, suitable for a filename
-- '%b': body
-- '%B': raw body (unwrapped subject and body)
+- Placeholders that expand to a single literal character:
+'%n':: newline
+'%%':: a raw '%'
+'%x00':: print a byte from a hex code
+
+- Placeholders that affect formatting of later placeholders:
+'%Cred':: switch color to red
+'%Cgreen':: switch color to green
+'%Cblue':: switch color to blue
+'%Creset':: reset color
+'%C(...)':: color specification, as described under Values in the
+ "CONFIGURATION FILE" section of linkgit:git-config[1]. By
+ default, colors are shown only when enabled for log output
+ (by `color.diff`, `color.ui`, or `--color`, and respecting
+ the `auto` settings of the former if we are going to a
+ terminal). `%C(auto,...)` is accepted as a historical
+ synonym for the default (e.g., `%C(auto,red)`). Specifying
+ `%C(always,...)` will show the colors even when color is
+ not otherwise enabled (though consider just using
+ `--color=always` to enable color for the whole output,
+ including this format and anything else git might color).
+ `auto` alone (i.e. `%C(auto)`) will turn on auto coloring
+ on the next placeholders until the color is switched
+ again.
+'%m':: left (`<`), right (`>`) or boundary (`-`) mark
+'%w([<w>[,<i1>[,<i2>]]])':: switch line wrapping, like the -w option of
+ linkgit:git-shortlog[1].
+'%<(<N>[,trunc|ltrunc|mtrunc])':: make the next placeholder take at
+ least N columns, padding spaces on
+ the right if necessary. Optionally
+ truncate at the beginning (ltrunc),
+ the middle (mtrunc) or the end
+ (trunc) if the output is longer than
+ N columns. Note that truncating
+ only works correctly with N >= 2.
+'%<|(<N>)':: make the next placeholder take at least until Nth
+ columns, padding spaces on the right if necessary
+'%>(<N>)', '%>|(<N>)':: similar to '%<(<N>)', '%<|(<N>)' respectively,
+ but padding spaces on the left
+'%>>(<N>)', '%>>|(<N>)':: similar to '%>(<N>)', '%>|(<N>)'
+ respectively, except that if the next
+ placeholder takes more spaces than given and
+ there are spaces on its left, use those
+ spaces
+'%><(<N>)', '%><|(<N>)':: similar to '%<(<N>)', '%<|(<N>)'
+ respectively, but padding both sides
+ (i.e. the text is centered)
+
+- Placeholders that expand to information extracted from the commit:
+'%H':: commit hash
+'%h':: abbreviated commit hash
+'%T':: tree hash
+'%t':: abbreviated tree hash
+'%P':: parent hashes
+'%p':: abbreviated parent hashes
+'%an':: author name
+'%aN':: author name (respecting .mailmap, see linkgit:git-shortlog[1]
+ or linkgit:git-blame[1])
+'%ae':: author email
+'%aE':: author email (respecting .mailmap, see linkgit:git-shortlog[1]
+ or linkgit:git-blame[1])
+'%ad':: author date (format respects --date= option)
+'%aD':: author date, RFC2822 style
+'%ar':: author date, relative
+'%at':: author date, UNIX timestamp
+'%ai':: author date, ISO 8601-like format
+'%aI':: author date, strict ISO 8601 format
+'%cn':: committer name
+'%cN':: committer name (respecting .mailmap, see
+ linkgit:git-shortlog[1] or linkgit:git-blame[1])
+'%ce':: committer email
+'%cE':: committer email (respecting .mailmap, see
+ linkgit:git-shortlog[1] or linkgit:git-blame[1])
+'%cd':: committer date (format respects --date= option)
+'%cD':: committer date, RFC2822 style
+'%cr':: committer date, relative
+'%ct':: committer date, UNIX timestamp
+'%ci':: committer date, ISO 8601-like format
+'%cI':: committer date, strict ISO 8601 format
+'%d':: ref names, like the --decorate option of linkgit:git-log[1]
+'%D':: ref names without the " (", ")" wrapping.
+'%S':: ref name given on the command line by which the commit was reached
+ (like `git log --source`), only works with `git log`
+'%e':: encoding
+'%s':: subject
+'%f':: sanitized subject line, suitable for a filename
+'%b':: body
+'%B':: raw body (unwrapped subject and body)
ifndef::git-rev-list[]
-- '%N': commit notes
+'%N':: commit notes
endif::git-rev-list[]
-- '%GG': raw verification message from GPG for a signed commit
-- '%G?': show "G" for a good (valid) signature,
- "B" for a bad signature,
- "U" for a good signature with unknown validity,
- "X" for a good signature that has expired,
- "Y" for a good signature made by an expired key,
- "R" for a good signature made by a revoked key,
- "E" if the signature cannot be checked (e.g. missing key)
- and "N" for no signature
-- '%GS': show the name of the signer for a signed commit
-- '%GK': show the key used to sign a signed commit
-- '%GF': show the fingerprint of the key used to sign a signed commit
-- '%GP': show the fingerprint of the primary key whose subkey was used
- to sign a signed commit
-- '%gD': reflog selector, e.g., `refs/stash@{1}` or
- `refs/stash@{2 minutes ago`}; the format follows the rules described
- for the `-g` option. The portion before the `@` is the refname as
- given on the command line (so `git log -g refs/heads/master` would
- yield `refs/heads/master@{0}`).
-- '%gd': shortened reflog selector; same as `%gD`, but the refname
- portion is shortened for human readability (so `refs/heads/master`
- becomes just `master`).
-- '%gn': reflog identity name
-- '%gN': reflog identity name (respecting .mailmap, see
- linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%ge': reflog identity email
-- '%gE': reflog identity email (respecting .mailmap, see
- linkgit:git-shortlog[1] or linkgit:git-blame[1])
-- '%gs': reflog subject
-- '%Cred': switch color to red
-- '%Cgreen': switch color to green
-- '%Cblue': switch color to blue
-- '%Creset': reset color
-- '%C(...)': color specification, as described under Values in the
- "CONFIGURATION FILE" section of linkgit:git-config[1].
- By default, colors are shown only when enabled for log output (by
- `color.diff`, `color.ui`, or `--color`, and respecting the `auto`
- settings of the former if we are going to a terminal). `%C(auto,...)`
- is accepted as a historical synonym for the default (e.g.,
- `%C(auto,red)`). Specifying `%C(always,...)` will show the colors
- even when color is not otherwise enabled (though consider
- just using `--color=always` to enable color for the whole output,
- including this format and anything else git might color). `auto`
- alone (i.e. `%C(auto)`) will turn on auto coloring on the next
- placeholders until the color is switched again.
-- '%m': left (`<`), right (`>`) or boundary (`-`) mark
-- '%n': newline
-- '%%': a raw '%'
-- '%x00': print a byte from a hex code
-- '%w([<w>[,<i1>[,<i2>]]])': switch line wrapping, like the -w option of
- linkgit:git-shortlog[1].
-- '%<(<N>[,trunc|ltrunc|mtrunc])': make the next placeholder take at
- least N columns, padding spaces on the right if necessary.
- Optionally truncate at the beginning (ltrunc), the middle (mtrunc)
- or the end (trunc) if the output is longer than N columns.
- Note that truncating only works correctly with N >= 2.
-- '%<|(<N>)': make the next placeholder take at least until Nth
- columns, padding spaces on the right if necessary
-- '%>(<N>)', '%>|(<N>)': similar to '%<(<N>)', '%<|(<N>)'
- respectively, but padding spaces on the left
-- '%>>(<N>)', '%>>|(<N>)': similar to '%>(<N>)', '%>|(<N>)'
- respectively, except that if the next placeholder takes more spaces
- than given and there are spaces on its left, use those spaces
-- '%><(<N>)', '%><|(<N>)': similar to '%<(<N>)', '%<|(<N>)'
- respectively, but padding both sides (i.e. the text is centered)
-- %(trailers[:options]): display the trailers of the body as interpreted
- by linkgit:git-interpret-trailers[1]. The `trailers` string may be
- followed by a colon and zero or more comma-separated options. If the
- `only` option is given, omit non-trailer lines from the trailer block.
- If the `unfold` option is given, behave as if interpret-trailer's
- `--unfold` option was given. E.g., `%(trailers:only,unfold)` to do
- both.
+'%GG':: raw verification message from GPG for a signed commit
+'%G?':: show "G" for a good (valid) signature,
+ "B" for a bad signature,
+ "U" for a good signature with unknown validity,
+ "X" for a good signature that has expired,
+ "Y" for a good signature made by an expired key,
+ "R" for a good signature made by a revoked key,
+ "E" if the signature cannot be checked (e.g. missing key)
+ and "N" for no signature
+'%GS':: show the name of the signer for a signed commit
+'%GK':: show the key used to sign a signed commit
+'%GF':: show the fingerprint of the key used to sign a signed commit
+'%GP':: show the fingerprint of the primary key whose subkey was used
+ to sign a signed commit
+'%gD':: reflog selector, e.g., `refs/stash@{1}` or `refs/stash@{2
+ minutes ago`}; the format follows the rules described for the
+ `-g` option. The portion before the `@` is the refname as
+ given on the command line (so `git log -g refs/heads/master`
+ would yield `refs/heads/master@{0}`).
+'%gd':: shortened reflog selector; same as `%gD`, but the refname
+ portion is shortened for human readability (so
+ `refs/heads/master` becomes just `master`).
+'%gn':: reflog identity name
+'%gN':: reflog identity name (respecting .mailmap, see
+ linkgit:git-shortlog[1] or linkgit:git-blame[1])
+'%ge':: reflog identity email
+'%gE':: reflog identity email (respecting .mailmap, see
+ linkgit:git-shortlog[1] or linkgit:git-blame[1])
+'%gs':: reflog subject
+'%(trailers[:options])':: display the trailers of the body as
+ interpreted by
+ linkgit:git-interpret-trailers[1]. The
+ `trailers` string may be followed by a colon
+ and zero or more comma-separated options:
+** 'key=<K>': only show trailers with specified key. Matching is done
+ case-insensitively and trailing colon is optional. If option is
+ given multiple times trailer lines matching any of the keys are
+ shown. This option automatically enables the `only` option so that
+ non-trailer lines in the trailer block are hidden. If that is not
+ desired it can be disabled with `only=false`. E.g.,
+ `%(trailers:key=Reviewed-by)` shows trailer lines with key
+ `Reviewed-by`.
+** 'only[=val]': select whether non-trailer lines from the trailer
+ block should be included. The `only` keyword may optionally be
+ followed by an equal sign and one of `true`, `on`, `yes` to omit or
+ `false`, `off`, `no` to show the non-trailer lines. If option is
+ given without value it is enabled. If given multiple times the last
+ value is used.
+** 'separator=<SEP>': specify a separator inserted between trailer
+ lines. When this option is not given each trailer line is
+ terminated with a line feed character. The string SEP may contain
+ the literal formatting codes described above. To use comma as
+ separator one must use `%x2C` as it would otherwise be parsed as
+ next option. If separator option is given multiple times only the
+ last one is used. E.g., `%(trailers:key=Ticket,separator=%x2C )`
+ shows all trailer lines whose key is "Ticket" separated by a comma
+ and a space.
+** 'unfold[=val]': make it behave as if interpret-trailer's `--unfold`
+ option was given. In same way as to for `only` it can be followed
+ by an equal sign and explicit value. E.g.,
+ `%(trailers:only,unfold=true)` unfolds and shows all trailer lines.
+** 'valueonly[=val]': skip over the key part of the trailer line and only
+ show the value part. Also this optionally allows explicit value.
NOTE: Some placeholders may depend on other options given to the
revision traversal engine. For example, the `%g*` reflog options will
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index cad711c..ca959a7 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -960,6 +960,13 @@ options may be given. See linkgit:git-diff-files[1] for more options.
the parents have only two variants and the merge result picks
one of them without modification.
+--combined-all-paths::
+ This flag causes combined diffs (used for merge commits) to
+ list the name of the file from all parents. It thus only has
+ effect when -c or --cc are specified, and is likely only
+ useful if filename changes are detected (i.e. when either
+ rename or copy detection have been requested).
+
-m::
This flag makes the merge commits show the full diff like
regular commits; for each merge parent, a separate log entry
diff --git a/Documentation/technical/api-trace2.txt b/Documentation/technical/api-trace2.txt
new file mode 100644
index 0000000..2de565f
--- /dev/null
+++ b/Documentation/technical/api-trace2.txt
@@ -0,0 +1,1349 @@
+= Trace2 API
+
+The Trace2 API can be used to print debug, performance, and telemetry
+information to stderr or a file. The Trace2 feature is inactive unless
+explicitly enabled by enabling one or more Trace2 Targets.
+
+The Trace2 API is intended to replace the existing (Trace1)
+printf-style tracing provided by the existing `GIT_TRACE` and
+`GIT_TRACE_PERFORMANCE` facilities. During initial implementation,
+Trace2 and Trace1 may operate in parallel.
+
+The Trace2 API defines a set of high-level messages with known fields,
+such as (`start`: `argv`) and (`exit`: {`exit-code`, `elapsed-time`}).
+
+Trace2 instrumentation throughout the Git code base sends Trace2
+messages to the enabled Trace2 Targets. Targets transform these
+messages content into purpose-specific formats and write events to
+their data streams. In this manner, the Trace2 API can drive
+many different types of analysis.
+
+Targets are defined using a VTable allowing easy extension to other
+formats in the future. This might be used to define a binary format,
+for example.
+
+== Trace2 Targets
+
+Trace2 defines the following set of Trace2 Targets.
+Format details are given in a later section.
+
+`GIT_TR2` (NORMAL)::
+
+ a simple printf format like GIT_TRACE.
++
+------------
+$ export GIT_TR2=~/log.normal
+$ git version
+git version 2.20.1.155.g426c96fcdb
+------------
++
+------------
+$ cat ~/log.normal
+12:28:42.620009 common-main.c:38 version 2.20.1.155.g426c96fcdb
+12:28:42.620989 common-main.c:39 start git version
+12:28:42.621101 git.c:432 cmd_name version (version)
+12:28:42.621215 git.c:662 exit elapsed:0.001227 code:0
+12:28:42.621250 trace2/tr2_tgt_normal.c:124 atexit elapsed:0.001265 code:0
+------------
+
+`GIT_TR2_PERF` (PERF)::
+
+ a column-based format to replace GIT_TRACE_PERFORMANCE suitable for
+ development and testing, possibly to complement tools like gprof.
++
+------------
+$ export GIT_TR2_PERF=~/log.perf
+$ git version
+git version 2.20.1.155.g426c96fcdb
+------------
++
+------------
+$ cat ~/log.perf
+12:28:42.620675 common-main.c:38 | d0 | main | version | | | | | 2.20.1.155.g426c96fcdb
+12:28:42.621001 common-main.c:39 | d0 | main | start | | | | | git version
+12:28:42.621111 git.c:432 | d0 | main | cmd_name | | | | | version (version)
+12:28:42.621225 git.c:662 | d0 | main | exit | | 0.001227 | | | code:0
+12:28:42.621259 trace2/tr2_tgt_perf.c:211 | d0 | main | atexit | | 0.001265 | | | code:0
+------------
+
+`GIT_TR2_EVENT` (EVENT)::
+
+ a JSON-based format of event data suitable for telemetry analysis.
++
+------------
+$ export GIT_TR2_EVENT=~/log.event
+$ git version
+git version 2.20.1.155.g426c96fcdb
+------------
++
+------------
+$ cat ~/log.event
+{"event":"version","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16 17:28:42.620713","file":"common-main.c","line":38,"evt":"1","exe":"2.20.1.155.g426c96fcdb"}
+{"event":"start","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16 17:28:42.621027","file":"common-main.c","line":39,"argv":["git","version"]}
+{"event":"cmd_name","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16 17:28:42.621122","file":"git.c","line":432,"name":"version","hierarchy":"version"}
+{"event":"exit","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16 17:28:42.621236","file":"git.c","line":662,"t_abs":0.001227,"code":0}
+{"event":"atexit","sid":"1547659722619736-11614","thread":"main","time":"2019-01-16 17:28:42.621268","file":"trace2/tr2_tgt_event.c","line":163,"t_abs":0.001265,"code":0}
+------------
+
+== Enabling a Target
+
+A Trace2 Target is enabled when the corresponding environment variable
+(`GIT_TR2`, `GIT_TR2_PERF`, or `GIT_TR2_EVENT`) is set. The following
+values are recognized.
+
+`0`::
+`false`::
+
+ Disables the target.
+
+`1`::
+`true`::
+
+ Enables the target and writes stream to `STDERR`.
+
+`[2-9]`::
+
+ Enables the target and writes to the already opened file descriptor.
+
+`<absolute-pathname>`::
+
+ Enables the target, opens and writes to the file in append mode.
+
+`af_unix:[<socket_type>:]<absolute-pathname>`::
+
+ Enables the target, opens and writes to a Unix Domain Socket
+ (on platforms that support them).
++
+Socket type can be either `stream` or `dgram`. If the socket type is
+omitted, Git will try both.
+
+== Trace2 API
+
+All public Trace2 functions and macros are defined in `trace2.h` and
+`trace2.c`. All public symbols are prefixed with `trace2_`.
+
+There are no public Trace2 data structures.
+
+The Trace2 code also defines a set of private functions and data types
+in the `trace2/` directory. These symbols are prefixed with `tr2_`
+and should only be used by functions in `trace2.c`.
+
+== Conventions for Public Functions and Macros
+
+The functions defined by the Trace2 API are declared and documented
+in `trace2.h`. It defines the API functions and wrapper macros for
+Trace2.
+
+Some functions have a `_fl()` suffix to indicate that they take `file`
+and `line-number` arguments.
+
+Some functions have a `_va_fl()` suffix to indicate that they also
+take a `va_list` argument.
+
+Some functions have a `_printf_fl()` suffix to indicate that they also
+take a varargs argument.
+
+There are CPP wrapper macros and ifdefs to hide most of these details.
+See `trace2.h` for more details. The following discussion will only
+describe the simplified forms.
+
+== Public API
+
+All Trace2 API functions send a messsage to all of the active
+Trace2 Targets. This section describes the set of available
+messages.
+
+It helps to divide these functions into groups for discussion
+purposes.
+
+=== Basic Command Messages
+
+These are concerned with the lifetime of the overall git process.
+
+`void trace2_initialize()`::
+
+ Determines if any Trace2 Targets should be enabled and
+ initializes the Trace2 facility. This includes starting the
+ elapsed time clocks and thread local storage (TLS).
++
+This function emits a "version" message containing the version of git
+and the Trace2 protocol.
++
+This function should be called from `main()` as early as possible in
+the life of the process.
+
+`int trace2_is_enabled()`::
+
+ Returns 1 if Trace2 is enabled (at least one target is
+ active).
+
+`void trace2_cmd_start(int argc, const char **argv)`::
+
+ Emits a "start" message containing the process command line
+ arguments.
+
+`int trace2_cmd_exit(int exit_code)`::
+
+ Emits an "exit" message containing the process exit-code and
+ elapsed time.
++
+Returns the exit-code.
+
+`void trace2_cmd_error(const char *fmt, va_list ap)`::
+
+ Emits an "error" message containing a formatted error message.
+
+`void trace2_cmd_path(const char *pathname)`::
+
+ Emits a "cmd_path" message with the full pathname of the
+ current process.
+
+=== Command Detail Messages
+
+These are concerned with describing the specific Git command
+after the command line, config, and environment are inspected.
+
+`void trace2_cmd_name(const char *name)`::
+
+ Emits a "cmd_name" message with the canonical name of the
+ command, for example "status" or "checkout".
+
+`void trace2_cmd_mode(const char *mode)`::
+
+ Emits a "cmd_mode" message with a qualifier name to further
+ describe the current git command.
++
+This message is intended to be used with git commands having multiple
+major modes. For example, a "checkout" command can checkout a new
+branch or it can checkout a single file, so the checkout code could
+emit a cmd_mode message of "branch" or "file".
+
+`void trace2_cmd_alias(const char *alias, const char **argv_expansion)`::
+
+ Emits an "alias" message containing the alias used and the
+ argument expansion.
+
+`void trace2_def_param(const char *parameter, const char *value)`::
+
+ Emits a "def_param" message containing a key/value pair.
++
+This message is intended to report some global aspect of the current
+command, such as a configuration setting or command line switch that
+significantly affects program performance or behavior, such as
+`core.abbrev`, `status.showUntrackedFiles`, or `--no-ahead-behind`.
+
+`void trace2_cmd_list_config()`::
+
+ Emits a "def_param" messages for "important" configuration
+ settings.
++
+The environment variable `GIT_TR2_CONFIG_PARAMS` can be set to a
+list of patterns of important configuration settings, for example:
+`core.*,remote.*.url`. This function will iterate over all config
+settings and emit a "def_param" message for each match.
+
+`void trace2_cmd_set_config(const char *key, const char *value)`::
+
+ Emits a "def_param" message for a specific configuration
+ setting IFF it matches the `GIT_TR2_CONFIG_PARAMS` pattern.
++
+This is used to hook into `git_config_set()` and catch any
+configuration changes and update a value previously reported by
+`trace2_cmd_list_config()`.
+
+`void trace2_def_repo(struct repository *repo)`::
+
+ Registers a repository with the Trace2 layer. Assigns a
+ unique "repo-id" to `repo->trace2_repo_id`.
++
+Emits a "worktree" messages containing the repo-id and the worktree
+pathname.
++
+Region and data messages (described later) may refer to this repo-id.
++
+The main/top-level repository will have repo-id value 1 (aka "r1").
++
+The repo-id field is in anticipation of future in-proc submodule
+repositories.
+
+=== Child Process Messages
+
+These are concerned with the various spawned child processes,
+including shell scripts, git commands, editors, pagers, and hooks.
+
+`void trace2_child_start(struct child_process *cmd)`::
+
+ Emits a "child_start" message containing the "child-id",
+ "child-argv", and "child-classification".
++
+Before calling this, set `cmd->trace2_child_class` to a name
+describing the type of child process, for example "editor".
++
+This function assigns a unique "child-id" to `cmd->trace2_child_id`.
+This field is used later during the "child_exit" message to associate
+it with the "child_start" message.
++
+This function should be called before spawning the child process.
+
+`void trace2_child_exit(struct child_proess *cmd, int child_exit_code)`::
+
+ Emits a "child_exit" message containing the "child-id",
+ the child's elapsed time and exit-code.
++
+The reported elapsed time includes the process creation overhead and
+time spend waiting for it to exit, so it may be slightly longer than
+the time reported by the child itself.
++
+This function should be called after reaping the child process.
+
+`int trace2_exec(const char *exe, const char **argv)`::
+
+ Emits a "exec" message containing the "exec-id" and the
+ argv of the new process.
++
+This function should be called before calling one of the `exec()`
+variants, such as `execvp()`.
++
+This function returns a unique "exec-id". This value is used later
+if the exec() fails and a "exec-result" message is necessary.
+
+`void trace2_exec_result(int exec_id, int error_code)`::
+
+ Emits a "exec_result" message containing the "exec-id"
+ and the error code.
++
+On Unix-based systems, `exec()` does not return if successful.
+This message is used to indicate that the `exec()` failed and
+that the current program is continuing.
+
+=== Git Thread Messages
+
+These messages are concerned with Git thread usage.
+
+`void trace2_thread_start(const char *thread_name)`::
+
+ Emits a "thread_start" message.
++
+The `thread_name` field should be a descriptive name, such as the
+unique name of the thread-proc. A unique "thread-id" will be added
+to the name to uniquely identify thread instances.
++
+Region and data messages (described later) may refer to this thread
+name.
++
+This function must be called by the thread-proc of the new thread
+(so that TLS data is properly initialized) and not by the caller
+of `pthread_create()`.
+
+`void trace2_thread_exit()`::
+
+ Emits a "thread_exit" message containing the thread name
+ and the thread elapsed time.
++
+This function must be called by the thread-proc before it returns
+(so that the coorect TLS data is used and cleaned up. It should
+not be called by the caller of `pthread_join()`.
+
+=== Region and Data Messages
+
+These are concerned with recording performance data
+over regions or spans of code.
+
+`void trace2_region_enter(const char *category, const char *label, const struct repository *repo)`::
+
+`void trace2_region_enter_printf(const char *category, const char *label, const struct repository *repo, const char *fmt, ...)`::
+
+`void trace2_region_enter_printf_va(const char *category, const char *label, const struct repository *repo, const char *fmt, va_list ap)`::
+
+ Emits a thread-relative "region_enter" message with optional
+ printf string.
++
+This function pushes a new region nesting stack level on the current
+thread and starts a clock for the new stack frame.
++
+The `category` field is an arbitrary category name used to classify
+regions by feature area, such as "status" or "index". At this time
+it is only just printed along with the rest of the message. It may
+be used in the future to filter messages.
++
+The `label` field is an arbitrary label used to describe the activity
+being started, such as "read_recursive" or "do_read_index".
++
+The `repo` field, if set, will be used to get the "repo-id", so that
+recursive oerations can be attributed to the correct repository.
+
+`void trace2_region_leave(const char *category, const char *label, const struct repository *repo)`::
+
+`void trace2_region_leave_printf(const char *category, const char *label, const struct repository *repo, const char *fmt, ...)`::
+
+`void trace2_region_leave_printf_va(const char *category, const char *label, const struct repository *repo, const char *fmt, va_list ap)`::
+
+ Emits a thread-relative "region_leave" message with optional
+ printf string.
++
+This function pops the region nesting stack on the current thread
+and reports the elapsed time of the stack frame.
++
+The `category`, `label`, and `repo` fields are the same as above.
+The `category` and `label` do not need to match the correpsonding
+"region_enter" message, but it makes the data stream easier to
+understand.
+
+`void trace2_data_string(const char *category, const struct repository *repo, const char *key, const char * value)`::
+
+`void trace2_data_intmax(const char *category, const struct repository *repo, const char *key, intmax value)`::
+
+`void trace2_data_json(const char *category, const struct repository *repo, const char *key, const struct json_writer *jw)`::
+
+ Emits a region- and thread-relative "data" or "data_json" message.
++
+This is a key/value pair message containing information about the
+current thread, region stack, and repository. This could be used
+to print the number of files in a directory during a multi-threaded
+recursive tree walk.
+
+`void trace2_printf(const char *fmt, ...)`::
+
+`void trace2_printf_va(const char *fmt, va_list ap)`::
+
+ Emits a region- and thread-relative "printf" message.
+
+== Trace2 Target Formats
+
+=== NORMAL Format
+
+NORMAL format is enabled when the `GIT_TR2` environment variable is
+set.
+
+Events are written as lines of the form:
+
+------------
+[<time> SP <filename>:<line> SP+] <event-name> [[SP] <event-message>] LF
+------------
+
+`<event-name>`::
+
+ is the event name.
+
+`<event-message>`::
+ is a free-form printf message intended for human consumption.
++
+Note that this may contain embedded LF or CRLF characters that are
+not escaped, so the event may spill across multiple lines.
+
+If `GIT_TR2_BRIEF` is true, the `time`, `filename`, and `line` fields
+are omitted.
+
+This target is intended to be more of a summary (like GIT_TRACE) and
+less detailed than the other targets. It ignores thread, region, and
+data messages, for example.
+
+=== PERF Format
+
+PERF format is enabled when the `GIT_TR2_PERF` environment variable
+is set.
+
+Events are written as lines of the form:
+
+------------
+[<time> SP <filename>:<line> SP+
+ BAR SP] d<depth> SP
+ BAR SP <thread-name> SP+
+ BAR SP <event-name> SP+
+ BAR SP [r<repo-id>] SP+
+ BAR SP [<t_abs>] SP+
+ BAR SP [<t_rel>] SP+
+ BAR SP [<category>] SP+
+ BAR SP DOTS* <perf-event-message>
+ LF
+------------
+
+`<depth>`::
+ is the git process depth. This is the number of parent
+ git processes. A top-level git command has depth value "d0".
+ A child of it has depth value "d1". A second level child
+ has depth value "d2" and so on.
+
+`<thread-name>`::
+ is a unique name for the thread. The primary thread
+ is called "main". Other thread names are of the form "th%d:%s"
+ and include a unique number and the name of the thread-proc.
+
+`<event-name>`::
+ is the event name.
+
+`<repo-id>`::
+ when present, is a number indicating the repository
+ in use. A `def_repo` event is emitted when a repository is
+ opened. This defines the repo-id and associated worktree.
+ Subsequent repo-specific events will reference this repo-id.
++
+Currently, this is always "r1" for the main repository.
+This field is in anticipation of in-proc submodules in the future.
+
+`<t_abs>`::
+ when present, is the absolute time in seconds since the
+ program started.
+
+`<t_rel>`::
+ when present, is time in seconds relative to the start of
+ the current region. For a thread-exit event, it is the elapsed
+ time of the thread.
+
+`<category>`::
+ is present on region and data events and is used to
+ indicate a broad category, such as "index" or "status".
+
+`<perf-event-message>`::
+ is a free-form printf message intended for human consumption.
+
+------------
+15:33:33.532712 wt-status.c:2310 | d0 | main | region_enter | r1 | 0.126064 | | status | label:print
+15:33:33.532712 wt-status.c:2331 | d0 | main | region_leave | r1 | 0.127568 | 0.001504 | status | label:print
+------------
+
+If `GIT_TR2_PERF_BRIEF` is true, the `time`, `file`, and `line`
+fields are omitted.
+
+------------
+d0 | main | region_leave | r1 | 0.011717 | 0.009122 | index | label:preload
+------------
+
+The PERF target is intended for interactive performance analysis
+during development and is quite noisy.
+
+=== EVENT Format
+
+EVENT format is enabled when the `GIT_TR2_EVENT` environment
+variable is set.
+
+Each event is a JSON-object containing multiple key/value pairs
+written as a single line and followed by a LF.
+
+------------
+'{' <key> ':' <value> [',' <key> ':' <value>]* '}' LF
+------------
+
+Some key/value pairs are common to all events and some are
+event-specific.
+
+==== Common Key/Value Pairs
+
+The following key/value pairs are common to all events:
+
+------------
+{
+ "event":"version",
+ "sid":"1547659722619736-11614",
+ "thread":"main",
+ "time":"2019-01-16 17:28:42.620713",
+ "file":"common-main.c",
+ "line":38,
+ ...
+}
+------------
+
+`"event":<event>`::
+ is the event name.
+
+`"sid":<sid>`::
+ is the session-id. This is a unique string to identify the
+ process instance to allow all events emitted by a process to
+ be identified. A session-id is used instead of a PID because
+ PIDs are recycled by the OS. For child git processes, the
+ session-id is prepended with the session-id of the parent git
+ process to allow parent-child relationships to be identified
+ during post-processing.
+
+`"thread":<thread>`::
+ is the thread name.
+
+`"time":<time>`::
+ is the UTC time of the event.
+
+`"file":<filename>`::
+ is source file generating the event.
+
+`"line":<line-number>`::
+ is the integer source line number generating the event.
+
+`"repo":<repo-id>`::
+ when present, is the integer repo-id as described previously.
+
+If `GIT_TR2_EVENT_BRIEF` is true, the `file` and `line` fields are omitted
+from all events and the `time` field is only present on the "start" and
+"atexit" events.
+
+==== Event-Specific Key/Value Pairs
+
+`"version"`::
+ This event gives the version of the executable and the EVENT format.
++
+------------
+{
+ "event":"version",
+ ...
+ "evt":"1", # EVENT format version
+ "exe":"2.20.1.155.g426c96fcdb" # git version
+}
+------------
+
+`"start"`::
+ This event contains the complete argv received by main().
++
+------------
+{
+ "event":"start",
+ ...
+ "argv":["git","version"]
+}
+------------
+
+`"exit"`::
+ This event is emitted when git calls `exit()`.
++
+------------
+{
+ "event":"exit",
+ ...
+ "t_abs":0.001227, # elapsed time in seconds
+ "code":0 # exit code
+}
+------------
+
+`"atexit"`::
+ This event is emitted by the Trace2 `atexit` routine during
+ final shutdown. It should be the last event emitted by the
+ process.
++
+(The elapsed time reported here is greater than the time reported in
+the "exit" event because it runs after all other atexit tasks have
+completed.)
++
+------------
+{
+ "event":"atexit",
+ ...
+ "t_abs":0.001227, # elapsed time in seconds
+ "code":0 # exit code
+}
+------------
+
+`"signal"`::
+ This event is emitted when the program is terminated by a user
+ signal. Depending on the platform, the signal event may
+ prevent the "atexit" event from being generated.
++
+------------
+{
+ "event":"signal",
+ ...
+ "t_abs":0.001227, # elapsed time in seconds
+ "signal":13 # SIGTERM, SIGINT, etc.
+}
+------------
+
+`"error"`::
+ This event is emitted when one of the `error()`, `die()`,
+ or `usage()` functions are called.
++
+------------
+{
+ "event":"error",
+ ...
+ "msg":"invalid option: --cahced", # formatted error message
+ "fmt":"invalid option: %s" # error format string
+}
+------------
++
+The error event may be emitted more than once. The format string
+allows post-processors to group errors by type without worrying
+about specific error arguments.
+
+`"cmd_path"`::
+ This event contains the discovered full path of the git
+ executable (on platforms that are configured to resolve it).
++
+------------
+{
+ "event":"cmd_path",
+ ...
+ "path":"C:/work/gfw/git.exe"
+}
+------------
+
+`"cmd_name"`::
+ This event contains the command name for this git process
+ and the hierarchy of commands from parent git processes.
++
+------------
+{
+ "event":"cmd_name",
+ ...
+ "name":"pack-objects",
+ "hierarchy":"push/pack-objects"
+}
+------------
++
+Normally, the "name" field contains the canonical name of the
+command. When a canonical name is not available, one of
+these special values are used:
++
+------------
+"_query_" # "git --html-path"
+"_run_dashed_" # when "git foo" tries to run "git-foo"
+"_run_shell_alias_" # alias expansion to a shell command
+"_run_git_alias_" # alias expansion to a git command
+"_usage_" # usage error
+------------
+
+`"cmd_mode"`::
+ This event, when present, describes the command variant This
+ event may be emitted more than once.
++
+------------
+{
+ "event":"cmd_mode",
+ ...
+ "name":"branch"
+}
+------------
++
+The "name" field is an arbitrary string to describe the command mode.
+For example, checkout can checkout a branch or an individual file.
+And these variations typically have different performance
+characteristics that are not comparable.
+
+`"alias"`::
+ This event is present when an alias is expanded.
++
+------------
+{
+ "event":"alias",
+ ...
+ "alias":"l", # registered alias
+ "argv":["log","--graph"] # alias expansion
+}
+------------
+
+`"child_start"`::
+ This event describes a child process that is about to be
+ spawned.
++
+------------
+{
+ "event":"child_start",
+ ...
+ "child_id":2,
+ "child_class":"?",
+ "use_shell":false,
+ "argv":["git","rev-list","--objects","--stdin","--not","--all","--quiet"]
+
+ "hook_name":"<hook_name>" # present when child_class is "hook"
+ "cd":"<path>" # present when cd is required
+}
+------------
++
+The "child_id" field can be used to match this child_start with the
+corresponding child_exit event.
++
+The "child_class" field is a rough classification, such as "editor",
+"pager", "transport/*", and "hook". Unclassified children are classified
+with "?".
+
+`"child_exit"`::
+ This event is generated after the current process has returned
+ from the waitpid() and collected the exit information from the
+ child.
++
+------------
+{
+ "event":"child_exit",
+ ...
+ "child_id":2,
+ "pid":14708, # child PID
+ "code":0, # child exit-code
+ "t_rel":0.110605 # observed run-time of child process
+}
+------------
++
+Note that the session-id of the child process is not available to
+the current/spawning process, so the child's PID is reported here as
+a hint for post-processing. (But it is only a hint because the child
+proces may be a shell script which doesn't have a session-id.)
++
+Note that the `t_rel` field contains the observed run time in seconds
+for the child process (starting before the fork/exec/spawn and
+stopping after the waitpid() and includes OS process creation overhead).
+So this time will be slightly larger than the atexit time reported by
+the child process itself.
+
+`"exec"`::
+ This event is generated before git attempts to `exec()`
+ another command rather than starting a child process.
++
+------------
+{
+ "event":"exec",
+ ...
+ "exec_id":0,
+ "exe":"git",
+ "argv":["foo", "bar"]
+}
+------------
++
+The "exec_id" field is a command-unique id and is only useful if the
+`exec()` fails and a corresponding exec_result event is generated.
+
+`"exec_result"`::
+ This event is generated if the `exec()` fails and control
+ returns to the current git command.
++
+------------
+{
+ "event":"exec_result",
+ ...
+ "exec_id":0,
+ "code":1 # error code (errno) from exec()
+}
+------------
+
+`"thread_start"`::
+ This event is generated when a thread is started. It is
+ generated from *within* the new thread's thread-proc (for TLS
+ reasons).
++
+------------
+{
+ "event":"thread_start",
+ ...
+ "thread":"th02:preload_thread" # thread name
+}
+------------
+
+`"thread_exit"`::
+ This event is generated when a thread exits. It is generated
+ from *within* the thread's thread-proc (for TLS reasons).
++
+------------
+{
+ "event":"thread_exit",
+ ...
+ "thread":"th02:preload_thread", # thread name
+ "t_rel":0.007328 # thread elapsed time
+}
+------------
+
+`"def_param"`::
+ This event is generated to log a global parameter.
++
+------------
+{
+ "event":"def_param",
+ ...
+ "param":"core.abbrev",
+ "value":"7"
+}
+------------
+
+`"def_repo"`::
+ This event defines a repo-id and associates it with the root
+ of the worktree.
++
+------------
+{
+ "event":"def_repo",
+ ...
+ "repo":1,
+ "worktree":"/Users/jeffhost/work/gfw"
+}
+------------
++
+As stated earlier, the repo-id is currently always 1, so there will
+only be one def_repo event. Later, if in-proc submodules are
+supported, a def_repo event should be emitted for each submodule
+visited.
+
+`"region_enter"`::
+ This event is generated when entering a region.
++
+------------
+{
+ "event":"region_enter",
+ ...
+ "repo":1, # optional
+ "nesting":1, # current region stack depth
+ "category":"index", # optional
+ "label":"do_read_index", # optional
+ "msg":".git/index" # optional
+}
+------------
++
+The `category` field may be used in a future enhancement to
+do category-based filtering.
++
+The `GIT_TR2_EVENT_NESTING` environment variable can be used to
+filter deeply nested regions and data events. It defaults to "2".
+
+`"region_leave"`::
+ This event is generated when leaving a region.
++
+------------
+{
+ "event":"region_leave",
+ ...
+ "repo":1, # optional
+ "t_rel":0.002876, # time spent in region in seconds
+ "nesting":1, # region stack depth
+ "category":"index", # optional
+ "label":"do_read_index", # optional
+ "msg":".git/index" # optional
+}
+------------
+
+`"data"`::
+ This event is generated to log a thread- and region-local
+ key/value pair.
++
+------------
+{
+ "event":"data",
+ ...
+ "repo":1, # optional
+ "t_abs":0.024107, # absolute elapsed time
+ "t_rel":0.001031, # elapsed time in region/thread
+ "nesting":2, # region stack depth
+ "category":"index",
+ "key":"read/cache_nr",
+ "value":"3552"
+}
+------------
++
+The "value" field may be an integer or a string.
+
+`"data-json"`::
+ This event is generated to log a pre-formatted JSON string
+ containing structured data.
++
+------------
+{
+ "event":"data_json",
+ ...
+ "repo":1, # optional
+ "t_abs":0.015905,
+ "t_rel":0.015905,
+ "nesting":1,
+ "category":"process",
+ "key":"windows/ancestry",
+ "value":["bash.exe","bash.exe"]
+}
+------------
+
+== Example Trace2 API Usage
+
+Here is a hypothetical usage of the Trace2 API showing the intended
+usage (without worrying about the actual Git details).
+
+Initialization::
+
+ Initialization happens in `main()`. Behind the scenes, an
+ `atexit` and `signal` handler are registered.
++
+----------------
+int main(int argc, const char **argv)
+{
+ int exit_code;
+
+ trace2_initialize();
+ trace2_cmd_start(argv);
+
+ exit_code = cmd_main(argc, argv);
+
+ trace2_cmd_exit(exit_code);
+
+ return exit_code;
+}
+----------------
+
+Command Details::
+
+ After the basics are established, additional command
+ information can be sent to Trace2 as it is discovered.
++
+----------------
+int cmd_checkout(int argc, const char **argv)
+{
+ trace2_cmd_name("checkout");
+ trace2_cmd_mode("branch");
+ trace2_def_repo(the_repository);
+
+ // emit "def_param" messages for "interesting" config settings.
+ trace2_cmd_list_config();
+
+ if (do_something())
+ trace2_cmd_error("Path '%s': cannot do something", path);
+
+ return 0;
+}
+----------------
+
+Child Processes::
+
+ Wrap code spawning child processes.
++
+----------------
+void run_child(...)
+{
+ int child_exit_code;
+ struct child_process cmd = CHILD_PROCESS_INIT;
+ ...
+ cmd.trace2_child_class = "editor";
+
+ trace2_child_start(&cmd);
+ child_exit_code = spawn_child_and_wait_for_it();
+ trace2_child_exit(&cmd, child_exit_code);
+}
+----------------
++
+For example, the following fetch command spawned ssh, index-pack,
+rev-list, and gc. This example also shows that fetch took
+5.199 seconds and of that 4.932 was in ssh.
++
+----------------
+$ export GIT_TR2_BRIEF=1
+$ export GIT_TR2=~/log.normal
+$ git fetch origin
+...
+----------------
++
+----------------
+$ cat ~/log.normal
+version 2.20.1.vfs.1.1.47.g534dbe1ad1
+start git fetch origin
+worktree /Users/jeffhost/work/gfw
+cmd_name fetch (fetch)
+child_start[0] ssh git@github.com ...
+child_start[1] git index-pack ...
+... (Trace2 events from child processes omitted)
+child_exit[1] pid:14707 code:0 elapsed:0.076353
+child_exit[0] pid:14706 code:0 elapsed:4.931869
+child_start[2] git rev-list ...
+... (Trace2 events from child process omitted)
+child_exit[2] pid:14708 code:0 elapsed:0.110605
+child_start[3] git gc --auto
+... (Trace2 events from child process omitted)
+child_exit[3] pid:14709 code:0 elapsed:0.006240
+exit elapsed:5.198503 code:0
+atexit elapsed:5.198541 code:0
+----------------
++
+When a git process is a (direct or indirect) child of another
+git process, it inherits Trace2 context information. This
+allows the child to print the command hierarchy. This example
+shows gc as child[3] of fetch. When the gc process reports
+its name as "gc", it also reports the hierarchy as "fetch/gc".
+(In this example, trace2 messages from the child process is
+indented for clarity.)
++
+----------------
+$ export GIT_TR2_BRIEF=1
+$ export GIT_TR2=~/log.normal
+$ git fetch origin
+...
+----------------
++
+----------------
+$ cat ~/log.normal
+version 2.20.1.160.g5676107ecd.dirty
+start git fetch official
+worktree /Users/jeffhost/work/gfw
+cmd_name fetch (fetch)
+...
+child_start[3] git gc --auto
+ version 2.20.1.160.g5676107ecd.dirty
+ start /Users/jeffhost/work/gfw/git gc --auto
+ worktree /Users/jeffhost/work/gfw
+ cmd_name gc (fetch/gc)
+ exit elapsed:0.001959 code:0
+ atexit elapsed:0.001997 code:0
+child_exit[3] pid:20303 code:0 elapsed:0.007564
+exit elapsed:3.868938 code:0
+atexit elapsed:3.868970 code:0
+----------------
+
+Regions::
+
+ Regions can be use to time an interesting section of code.
++
+----------------
+void wt_status_collect(struct wt_status *s)
+{
+ trace2_region_enter("status", "worktrees", s->repo);
+ wt_status_collect_changes_worktree(s);
+ trace2_region_leave("status", "worktrees", s->repo);
+
+ trace2_region_enter("status", "index", s->repo);
+ wt_status_collect_changes_index(s);
+ trace2_region_leave("status", "index", s->repo);
+
+ trace2_region_enter("status", "untracked", s->repo);
+ wt_status_collect_untracked(s);
+ trace2_region_leave("status", "untracked", s->repo);
+}
+
+void wt_status_print(struct wt_status *s)
+{
+ trace2_region_enter("status", "print", s->repo);
+ switch (s->status_format) {
+ ...
+ }
+ trace2_region_leave("status", "print", s->repo);
+}
+----------------
++
+In this example, scanning for untracked files ran from +0.012568 to
++0.027149 (since the process started) and took 0.014581 seconds.
++
+----------------
+$ export GIT_TR2_PERF_BRIEF=1
+$ export GIT_TR2_PERF=~/log.perf
+$ git status
+...
+
+$ cat ~/log.perf
+d0 | main | version | | | | | 2.20.1.160.g5676107ecd.dirty
+d0 | main | start | | | | | git status
+d0 | main | def_repo | r1 | | | | worktree:/Users/jeffhost/work/gfw
+d0 | main | cmd_name | | | | | status (status)
+...
+d0 | main | region_enter | r1 | 0.010988 | | status | label:worktrees
+d0 | main | region_leave | r1 | 0.011236 | 0.000248 | status | label:worktrees
+d0 | main | region_enter | r1 | 0.011260 | | status | label:index
+d0 | main | region_leave | r1 | 0.012542 | 0.001282 | status | label:index
+d0 | main | region_enter | r1 | 0.012568 | | status | label:untracked
+d0 | main | region_leave | r1 | 0.027149 | 0.014581 | status | label:untracked
+d0 | main | region_enter | r1 | 0.027411 | | status | label:print
+d0 | main | region_leave | r1 | 0.028741 | 0.001330 | status | label:print
+d0 | main | exit | | 0.028778 | | | code:0
+d0 | main | atexit | | 0.028809 | | | code:0
+----------------
++
+Regions may be nested. This causes messages to be indented in the
+PERF target, for example.
+Elapsed times are relative to the start of the correpsonding nesting
+level as expected. For example, if we add region message to:
++
+----------------
+static enum path_treatment read_directory_recursive(struct dir_struct *dir,
+ struct index_state *istate, const char *base, int baselen,
+ struct untracked_cache_dir *untracked, int check_only,
+ int stop_at_first_file, const struct pathspec *pathspec)
+{
+ enum path_treatment state, subdir_state, dir_state = path_none;
+
+ trace2_region_enter_printf("dir", "read_recursive", NULL, "%.*s", baselen, base);
+ ...
+ trace2_region_leave_printf("dir", "read_recursive", NULL, "%.*s", baselen, base);
+ return dir_state;
+}
+----------------
++
+We can further investigate the time spent scanning for untracked files.
++
+----------------
+$ export GIT_TR2_PERF_BRIEF=1
+$ export GIT_TR2_PERF=~/log.perf
+$ git status
+...
+$ cat ~/log.perf
+d0 | main | version | | | | | 2.20.1.162.gb4ccea44db.dirty
+d0 | main | start | | | | | git status
+d0 | main | def_repo | r1 | | | | worktree:/Users/jeffhost/work/gfw
+d0 | main | cmd_name | | | | | status (status)
+...
+d0 | main | region_enter | r1 | 0.015047 | | status | label:untracked
+d0 | main | region_enter | | 0.015132 | | dir | ..label:read_recursive
+d0 | main | region_enter | | 0.016341 | | dir | ....label:read_recursive vcs-svn/
+d0 | main | region_leave | | 0.016422 | 0.000081 | dir | ....label:read_recursive vcs-svn/
+d0 | main | region_enter | | 0.016446 | | dir | ....label:read_recursive xdiff/
+d0 | main | region_leave | | 0.016522 | 0.000076 | dir | ....label:read_recursive xdiff/
+d0 | main | region_enter | | 0.016612 | | dir | ....label:read_recursive git-gui/
+d0 | main | region_enter | | 0.016698 | | dir | ......label:read_recursive git-gui/po/
+d0 | main | region_enter | | 0.016810 | | dir | ........label:read_recursive git-gui/po/glossary/
+d0 | main | region_leave | | 0.016863 | 0.000053 | dir | ........label:read_recursive git-gui/po/glossary/
+...
+d0 | main | region_enter | | 0.031876 | | dir | ....label:read_recursive builtin/
+d0 | main | region_leave | | 0.032270 | 0.000394 | dir | ....label:read_recursive builtin/
+d0 | main | region_leave | | 0.032414 | 0.017282 | dir | ..label:read_recursive
+d0 | main | region_leave | r1 | 0.032454 | 0.017407 | status | label:untracked
+...
+d0 | main | exit | | 0.034279 | | | code:0
+d0 | main | atexit | | 0.034322 | | | code:0
+----------------
++
+Trace2 regions are similar to the existing trace_performance_enter()
+and trace_performance_leave() routines, but are thread safe and
+maintain per-thread stacks of timers.
+
+Data Messages::
+
+ Data messages added to a region.
++
+----------------
+int read_index_from(struct index_state *istate, const char *path,
+ const char *gitdir)
+{
+ trace2_region_enter_printf("index", "do_read_index", the_repository, "%s", path);
+
+ ...
+
+ trace2_data_intmax("index", the_repository, "read/version", istate->version);
+ trace2_data_intmax("index", the_repository, "read/cache_nr", istate->cache_nr);
+
+ trace2_region_leave_printf("index", "do_read_index", the_repository, "%s", path);
+}
+----------------
++
+This example shows that the index contained 3552 entries.
++
+----------------
+$ export GIT_TR2_PERF_BRIEF=1
+$ export GIT_TR2_PERF=~/log.perf
+$ git status
+...
+$ cat ~/log.perf
+d0 | main | version | | | | | 2.20.1.156.gf9916ae094.dirty
+d0 | main | start | | | | | git status
+d0 | main | def_repo | r1 | | | | worktree:/Users/jeffhost/work/gfw
+d0 | main | cmd_name | | | | | status (status)
+d0 | main | region_enter | r1 | 0.001791 | | index | label:do_read_index .git/index
+d0 | main | data | r1 | 0.002494 | 0.000703 | index | ..read/version:2
+d0 | main | data | r1 | 0.002520 | 0.000729 | index | ..read/cache_nr:3552
+d0 | main | region_leave | r1 | 0.002539 | 0.000748 | index | label:do_read_index .git/index
+...
+----------------
+
+Thread Events::
+
+ Thread messages added to a thread-proc.
++
+For example, the multithreaded preload-index code can be
+instrumented with a region around the thread pool and then
+per-thread start and exit events within the threadproc.
++
+----------------
+static void *preload_thread(void *_data)
+{
+ // start the per-thread clock and emit a message.
+ trace2_thread_start("preload_thread");
+
+ // report which chunk of the array this thread was assigned.
+ trace2_data_intmax("index", the_repository, "offset", p->offset);
+ trace2_data_intmax("index", the_repository, "count", nr);
+
+ do {
+ ...
+ } while (--nr > 0);
+ ...
+
+ // report elapsed time taken by this thread.
+ trace2_thread_exit();
+ return NULL;
+}
+
+void preload_index(struct index_state *index,
+ const struct pathspec *pathspec,
+ unsigned int refresh_flags)
+{
+ trace2_region_enter("index", "preload", the_repository);
+
+ for (i = 0; i < threads; i++) {
+ ... /* create thread */
+ }
+
+ for (i = 0; i < threads; i++) {
+ ... /* join thread */
+ }
+
+ trace2_region_leave("index", "preload", the_repository);
+}
+----------------
++
+In this example preload_index() was executed by the `main` thread
+and started the `preload` region. Seven threads, named
+`th01:preload_thread` through `th07:preload_thread`, were started.
+Events from each thread are atomically appended to the shared target
+stream as they occur so they may appear in random order with respect
+other threads. Finally, the main thread waits for the threads to
+finish and leaves the region.
++
+Data events are tagged with the active thread name. They are used
+to report the per-thread parameters.
++
+----------------
+$ export GIT_TR2_PERF_BRIEF=1
+$ export GIT_TR2_PERF=~/log.perf
+$ git status
+...
+$ cat ~/log.perf
+...
+d0 | main | region_enter | r1 | 0.002595 | | index | label:preload
+d0 | th01:preload_thread | thread_start | | 0.002699 | | |
+d0 | th02:preload_thread | thread_start | | 0.002721 | | |
+d0 | th01:preload_thread | data | r1 | 0.002736 | 0.000037 | index | offset:0
+d0 | th02:preload_thread | data | r1 | 0.002751 | 0.000030 | index | offset:2032
+d0 | th03:preload_thread | thread_start | | 0.002711 | | |
+d0 | th06:preload_thread | thread_start | | 0.002739 | | |
+d0 | th01:preload_thread | data | r1 | 0.002766 | 0.000067 | index | count:508
+d0 | th06:preload_thread | data | r1 | 0.002856 | 0.000117 | index | offset:2540
+d0 | th03:preload_thread | data | r1 | 0.002824 | 0.000113 | index | offset:1016
+d0 | th04:preload_thread | thread_start | | 0.002710 | | |
+d0 | th02:preload_thread | data | r1 | 0.002779 | 0.000058 | index | count:508
+d0 | th06:preload_thread | data | r1 | 0.002966 | 0.000227 | index | count:508
+d0 | th07:preload_thread | thread_start | | 0.002741 | | |
+d0 | th07:preload_thread | data | r1 | 0.003017 | 0.000276 | index | offset:3048
+d0 | th05:preload_thread | thread_start | | 0.002712 | | |
+d0 | th05:preload_thread | data | r1 | 0.003067 | 0.000355 | index | offset:1524
+d0 | th05:preload_thread | data | r1 | 0.003090 | 0.000378 | index | count:508
+d0 | th07:preload_thread | data | r1 | 0.003037 | 0.000296 | index | count:504
+d0 | th03:preload_thread | data | r1 | 0.002971 | 0.000260 | index | count:508
+d0 | th04:preload_thread | data | r1 | 0.002983 | 0.000273 | index | offset:508
+d0 | th04:preload_thread | data | r1 | 0.007311 | 0.004601 | index | count:508
+d0 | th05:preload_thread | thread_exit | | 0.008781 | 0.006069 | |
+d0 | th01:preload_thread | thread_exit | | 0.009561 | 0.006862 | |
+d0 | th03:preload_thread | thread_exit | | 0.009742 | 0.007031 | |
+d0 | th06:preload_thread | thread_exit | | 0.009820 | 0.007081 | |
+d0 | th02:preload_thread | thread_exit | | 0.010274 | 0.007553 | |
+d0 | th07:preload_thread | thread_exit | | 0.010477 | 0.007736 | |
+d0 | th04:preload_thread | thread_exit | | 0.011657 | 0.008947 | |
+d0 | main | region_leave | r1 | 0.011717 | 0.009122 | index | label:preload
+...
+d0 | main | exit | | 0.029996 | | | code:0
+d0 | main | atexit | | 0.030027 | | | code:0
+----------------
++
+In this example, the preload region took 0.009122 seconds. The 7 threads
+took between 0.006069 and 0.008947 seconds to work on their portion of
+the index. Thread "th01" worked on 508 items at offset 0. Thread "th02"
+worked on 508 items at offset 2032. Thread "th04" worked on 508 itemts
+at offset 508.
++
+This example also shows that thread names are assigned in a racy manner
+as each thread starts and allocates TLS storage.
+
+== Future Work
+
+=== Relationship to the Existing Trace Api (api-trace.txt)
+
+There are a few issues to resolve before we can completely
+switch to Trace2.
+
+* Updating existing tests that assume GIT_TRACE format messages.
+
+* How to best handle custom GIT_TRACE_<key> messages?
+
+** The GIT_TRACE_<key> mechanism allows each <key> to write to a
+different file (in addition to just stderr).
+
+** Do we want to maintain that ability or simply write to the existing
+Trace2 targets (and convert <key> to a "category").
diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt
index 332d209..2b267c0 100644
--- a/Documentation/technical/protocol-capabilities.txt
+++ b/Documentation/technical/protocol-capabilities.txt
@@ -1,6 +1,10 @@
Git Protocol Capabilities
=========================
+NOTE: this document describes capabilities for versions 0 and 1 of the pack
+protocol. For version 2, please refer to the link:protocol-v2.html[protocol-v2]
+doc.
+
Servers SHOULD support all capabilities defined in this document.
On the very first line of the initial server response of either
@@ -172,6 +176,20 @@ agent strings are purely informative for statistics and debugging
purposes, and MUST NOT be used to programmatically assume the presence
or absence of particular features.
+symref
+------
+
+This parameterized capability is used to inform the receiver which symbolic ref
+points to which ref; for example, "symref=HEAD:refs/heads/master" tells the
+receiver that HEAD points to master. This capability can be repeated to
+represent multiple symrefs.
+
+Servers SHOULD include this capability for the HEAD symref if it is one of the
+refs being sent.
+
+Clients MAY use the parameters from this capability to select the proper initial
+branch when cloning a repository.
+
shallow
-------
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 13f835f..3fc4065 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.21.0
+DEF_VER=v2.21.GIT
LF='
'
diff --git a/Makefile b/Makefile
index c524094..3e03290 100644
--- a/Makefile
+++ b/Makefile
@@ -479,7 +479,11 @@ all::
#
# Define DEVELOPER to enable more compiler warnings. Compiler version
# and family are auto detected, but could be overridden by defining
-# COMPILER_FEATURES (see config.mak.dev)
+# COMPILER_FEATURES (see config.mak.dev). You can still set
+# CFLAGS="..." in combination with DEVELOPER enables, whether that's
+# for tweaking something unrelated (e.g. optimization level), or for
+# selectively overriding something DEVELOPER or one of the DEVOPTS
+# (see just below) brings in.
#
# When DEVELOPER is set, DEVOPTS can be used to control compiler
# options. This variable contains keywords separated by
@@ -506,17 +510,8 @@ GIT-VERSION-FILE: FORCE
@$(SHELL_PATH) ./GIT-VERSION-GEN
-include GIT-VERSION-FILE
-# CFLAGS and LDFLAGS are for the users to override from the command line.
-
-CFLAGS = -g -O2 -Wall
-LDFLAGS =
-ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
-ALL_LDFLAGS = $(LDFLAGS)
-STRIP ?= strip
-
-# Create as necessary, replace existing, make ranlib unneeded.
-ARFLAGS = rcs
-
+# Set our default configuration.
+#
# Among the variables below, these:
# gitexecdir
# template_dir
@@ -561,6 +556,7 @@ perllibdir_relative = $(patsubst $(prefix)/%,%,$(perllibdir))
export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir
+# Set our default programs
CC = cc
AR = ar
RM = rm -f
@@ -573,29 +569,14 @@ TCLTK_PATH = wish
XGETTEXT = xgettext
MSGFMT = msgfmt
CURL_CONFIG = curl-config
-PTHREAD_LIBS = -lpthread
-PTHREAD_CFLAGS =
GCOV = gcov
+STRIP = strip
SPATCH = spatch
export TCL_PATH TCLTK_PATH
-# user customisation variable for 'sparse' target
-SPARSE_FLAGS ?=
-# internal/platform customisation variable for 'sparse'
-SP_EXTRA_FLAGS =
-
-SPATCH_FLAGS = --all-includes --patch .
-
-
-
-### --- END CONFIGURATION SECTION ---
-
-# Those must not be GNU-specific; they are shared with perl/ which may
-# be built by a different compiler. (Note that this is an artifact now
-# but it still might be nice to keep that distinction.)
-BASIC_CFLAGS = -I.
-BASIC_LDFLAGS =
+# Set our default LIBS variables
+PTHREAD_LIBS = -lpthread
# Guard against environment variables
BUILTIN_OBJS =
@@ -773,6 +754,7 @@ TEST_BUILTINS_OBJS += test-string-list.o
TEST_BUILTINS_OBJS += test-submodule-config.o
TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
TEST_BUILTINS_OBJS += test-subprocess.o
+TEST_BUILTINS_OBJS += test-trace2.o
TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
TEST_BUILTINS_OBJS += test-xml-encode.o
TEST_BUILTINS_OBJS += test-wildmatch.o
@@ -841,7 +823,8 @@ VCSSVN_LIB = vcs-svn/lib.a
GENERATED_H += command-list.h
-LIB_H = $(shell $(FIND) . \
+LIB_H := $(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
+ $(FIND) . \
-name .git -prune -o \
-name t -prune -o \
-name Documentation -prune -o \
@@ -1017,6 +1000,16 @@ LIB_OBJS += tempfile.o
LIB_OBJS += thread-utils.o
LIB_OBJS += tmp-objdir.o
LIB_OBJS += trace.o
+LIB_OBJS += trace2.o
+LIB_OBJS += trace2/tr2_cfg.o
+LIB_OBJS += trace2/tr2_cmd_name.o
+LIB_OBJS += trace2/tr2_dst.o
+LIB_OBJS += trace2/tr2_sid.o
+LIB_OBJS += trace2/tr2_tbuf.o
+LIB_OBJS += trace2/tr2_tgt_event.o
+LIB_OBJS += trace2/tr2_tgt_normal.o
+LIB_OBJS += trace2/tr2_tgt_perf.o
+LIB_OBJS += trace2/tr2_tls.o
LIB_OBJS += trailer.o
LIB_OBJS += transport.o
LIB_OBJS += transport-helper.o
@@ -1165,6 +1158,25 @@ ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/s
DC_SHA1_SUBMODULE = auto
endif
+# Set CFLAGS, LDFLAGS and other *FLAGS variables. These might be
+# tweaked by config.* below as well as the command-line, both of
+# which'll override these defaults.
+CFLAGS = -g -O2 -Wall
+LDFLAGS =
+BASIC_CFLAGS = -I.
+BASIC_LDFLAGS =
+
+# library flags
+ARFLAGS = rcs
+PTHREAD_CFLAGS =
+
+# For the 'sparse' target
+SPARSE_FLAGS ?=
+SP_EXTRA_FLAGS =
+
+# For the 'coccicheck' target
+SPATCH_FLAGS = --all-includes --patch .
+
include config.mak.uname
-include config.mak.autogen
-include config.mak
@@ -1173,6 +1185,9 @@ ifdef DEVELOPER
include config.mak.dev
endif
+ALL_CFLAGS = $(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS)
+ALL_LDFLAGS = $(LDFLAGS)
+
comma := ,
empty :=
space := $(empty) $(empty)
@@ -1596,7 +1611,9 @@ ifdef NO_INET_PTON
LIB_OBJS += compat/inet_pton.o
BASIC_CFLAGS += -DNO_INET_PTON
endif
-ifndef NO_UNIX_SOCKETS
+ifdef NO_UNIX_SOCKETS
+ BASIC_CFLAGS += -DNO_UNIX_SOCKETS
+else
LIB_OBJS += unix-socket.o
PROGRAM_OBJS += credential-cache.o
PROGRAM_OBJS += credential-cache--daemon.o
@@ -2363,7 +2380,7 @@ else
# should _not_ be included here, since they are necessary even when
# building an object for the first time.
-$(OBJECTS): $(LIB_H)
+$(OBJECTS): $(LIB_H) $(GENERATED_H)
endif
exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX
@@ -2736,7 +2753,10 @@ $(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
sparse: $(SP_OBJ)
GEN_HDRS := command-list.h unicode-width.h
-EXCEPT_HDRS := $(GEN_HDRS) compat% xdiff%
+EXCEPT_HDRS := $(GEN_HDRS) compat/% xdiff/%
+ifndef GCRYPT_SHA256
+ EXCEPT_HDRS += sha256/gcrypt.h
+endif
CHK_HDRS = $(filter-out $(EXCEPT_HDRS),$(patsubst ./%,%,$(LIB_H)))
HCO = $(patsubst %.h,%.hco,$(CHK_HDRS))
diff --git a/RelNotes b/RelNotes
index 31e2135..0b6d9fd 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.21.0.txt \ No newline at end of file
+Documentation/RelNotes/2.22.0.txt \ No newline at end of file
diff --git a/apply.c b/apply.c
index 892ede5..f15afa9 100644
--- a/apply.c
+++ b/apply.c
@@ -56,6 +56,10 @@ static int parse_whitespace_option(struct apply_state *state, const char *option
state->ws_error_action = correct_ws_error;
return 0;
}
+ /*
+ * Please update $__git_whitespacelist in git-completion.bash
+ * when you add new options.
+ */
return error(_("unrecognized whitespace option '%s'"), option);
}
diff --git a/attr.c b/attr.c
index fdd110b..93dc16b 100644
--- a/attr.c
+++ b/attr.c
@@ -431,14 +431,14 @@ fail_return:
* Like info/exclude and .gitignore, the attribute information can
* come from many places.
*
- * (1) .gitattribute file of the same directory;
- * (2) .gitattribute file of the parent directory if (1) does not have
+ * (1) .gitattributes file of the same directory;
+ * (2) .gitattributes file of the parent directory if (1) does not have
* any match; this goes recursively upwards, just like .gitignore.
* (3) $GIT_DIR/info/attributes, which overrides both of the above.
*
* In the same file, later entries override the earlier match, so in the
* global list, we would have entries from info/attributes the earliest
- * (reading the file from top to bottom), .gitattribute of the root
+ * (reading the file from top to bottom), .gitattributes of the root
* directory (again, reading the file from top to bottom) down to the
* current directory, and then scan the list backwards to find the first match.
* This is exactly the same as what is_excluded() does in dir.c to deal with
@@ -899,7 +899,7 @@ static void prepare_attr_stack(const struct index_state *istate,
* set of attribute definitions, followed by the contents
* of $(prefix)/etc/gitattributes and a file specified by
* core.attributesfile. Then, contents from
- * .gitattribute files from directories closer to the
+ * .gitattributes files from directories closer to the
* root to the ones in deeper directories are pushed
* to the stack. Finally, at the very top of the stack
* we always keep the contents of $GIT_DIR/info/attributes.
diff --git a/bisect.c b/bisect.c
index 3af955c..e87ac29 100644
--- a/bisect.c
+++ b/bisect.c
@@ -896,24 +896,15 @@ static void show_diff_tree(struct repository *r,
const char *prefix,
struct commit *commit)
{
+ const char *argv[] = {
+ "diff-tree", "--pretty", "--stat", "--summary", "--cc", NULL
+ };
struct rev_info opt;
- /* diff-tree init */
+ git_config(git_diff_ui_config, NULL);
repo_init_revisions(r, &opt, prefix);
- git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
- opt.abbrev = 0;
- opt.diff = 1;
- /* This is what "--pretty" does */
- opt.verbose_header = 1;
- opt.use_terminator = 0;
- opt.commit_format = CMIT_FMT_DEFAULT;
-
- /* diff-tree init */
- if (!opt.diffopt.output_format)
- opt.diffopt.output_format = DIFF_FORMAT_RAW;
-
- setup_revisions(0, NULL, &opt, NULL);
+ setup_revisions(ARRAY_SIZE(argv) - 1, argv, &opt, NULL);
log_tree_commit(&opt, commit);
}
diff --git a/blame.c b/blame.c
index da57233..5c07dec 100644
--- a/blame.c
+++ b/blame.c
@@ -204,7 +204,8 @@ static struct commit *fake_working_tree_commit(struct repository *r,
origin = make_origin(commit, path);
- ident = fmt_ident("Not Committed Yet", "not.committed.yet", NULL, 0);
+ ident = fmt_ident("Not Committed Yet", "not.committed.yet",
+ WANT_BLANK_IDENT, NULL, 0);
strbuf_addstr(&msg, "tree 0000000000000000000000000000000000000000\n");
for (parent = commit->parents; parent; parent = parent->next)
strbuf_addf(&msg, "parent %s\n",
diff --git a/builtin/am.c b/builtin/am.c
index 58a2aef..4fb107a 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -453,6 +453,7 @@ static int run_post_rewrite_hook(const struct am_state *state)
cp.in = xopen(am_path(state, "rewritten"), O_RDONLY);
cp.stdout_to_stderr = 1;
+ cp.trace2_hook_name = "post-rewrite";
ret = run_command(&cp);
@@ -1579,6 +1580,7 @@ static void do_commit(const struct am_state *state)
}
author = fmt_ident(state->author_name, state->author_email,
+ WANT_AUTHOR_IDENT,
state->ignore_date ? NULL : state->author_date,
IDENT_STRICT);
@@ -2119,6 +2121,10 @@ static int parse_opt_patchformat(const struct option *opt, const char *arg, int
*opt_value = PATCH_FORMAT_HG;
else if (!strcmp(arg, "mboxrd"))
*opt_value = PATCH_FORMAT_MBOXRD;
+ /*
+ * Please update $__git_patchformat in git-completion.bash
+ * when you add new options
+ */
else
return error(_("Invalid value for --patch-format: %s"), arg);
return 0;
diff --git a/builtin/blame.c b/builtin/blame.c
index 581de0d..177c102 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -814,7 +814,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
* and are only included here to get included in the "-h"
* output:
*/
- { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, parse_opt_unknown_cb },
+ { OPTION_LOWLEVEL_CALLBACK, 0, "indent-heuristic", NULL, NULL, N_("Use an experimental heuristic to improve diffs"), PARSE_OPT_NOARG, NULL, 0, parse_opt_unknown_cb },
OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
diff --git a/builtin/branch.c b/builtin/branch.c
index 1be7272..4c83055 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -443,6 +443,21 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
free(to_free);
}
+static void print_current_branch_name(void)
+{
+ int flags;
+ const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, &flags);
+ const char *shortname;
+ if (!refname)
+ die(_("could not resolve HEAD"));
+ else if (!(flags & REF_ISSYMREF))
+ return;
+ else if (skip_prefix(refname, "refs/heads/", &shortname))
+ puts(shortname);
+ else
+ die(_("HEAD (%s) points outside of refs/heads/"), refname);
+}
+
static void reject_rebase_or_bisect_branch(const char *target)
{
struct worktree **worktrees = get_worktrees(0);
@@ -581,6 +596,7 @@ static int edit_branch_description(const char *branch_name)
int cmd_branch(int argc, const char **argv, const char *prefix)
{
int delete = 0, rename = 0, copy = 0, force = 0, list = 0;
+ int show_current = 0;
int reflog = 0, edit_description = 0;
int quiet = 0, unset_upstream = 0;
const char *new_upstream = NULL;
@@ -620,6 +636,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
OPT_BIT('c', "copy", &copy, N_("copy a branch and its reflog"), 1),
OPT_BIT('C', NULL, &copy, N_("copy a branch, even if target exists"), 2),
OPT_BOOL('l', "list", &list, N_("list branch names")),
+ OPT_BOOL(0, "show-current", &show_current, N_("show current branch name")),
OPT_BOOL(0, "create-reflog", &reflog, N_("create the branch's reflog")),
OPT_BOOL(0, "edit-description", &edit_description,
N_("edit the description for the branch")),
@@ -662,14 +679,15 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, builtin_branch_usage,
0);
- if (!delete && !rename && !copy && !edit_description && !new_upstream && !unset_upstream && argc == 0)
+ if (!delete && !rename && !copy && !edit_description && !new_upstream &&
+ !show_current && !unset_upstream && argc == 0)
list = 1;
if (filter.with_commit || filter.merge != REF_FILTER_MERGED_NONE || filter.points_at.nr ||
filter.no_commit)
list = 1;
- if (!!delete + !!rename + !!copy + !!new_upstream +
+ if (!!delete + !!rename + !!copy + !!new_upstream + !!show_current +
list + unset_upstream > 1)
usage_with_options(builtin_branch_usage, options);
@@ -697,6 +715,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (!argc)
die(_("branch name required"));
return delete_branches(argc, argv, delete > 1, filter.kind, quiet);
+ } else if (show_current) {
+ print_current_branch_name();
+ return 0;
} else if (list) {
/* git branch --local also shows HEAD when it is detached */
if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 24b8593..0e6037b 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -46,6 +46,7 @@ struct checkout_opts {
int ignore_other_worktrees;
int show_progress;
int count_checkout_paths;
+ int overlay_mode;
/*
* If new checkout options are added, skip_merge_working_tree
* should be updated accordingly.
@@ -135,7 +136,8 @@ static int skip_same_name(const struct cache_entry *ce, int pos)
return pos;
}
-static int check_stage(int stage, const struct cache_entry *ce, int pos)
+static int check_stage(int stage, const struct cache_entry *ce, int pos,
+ int overlay_mode)
{
while (pos < active_nr &&
!strcmp(active_cache[pos]->name, ce->name)) {
@@ -143,6 +145,8 @@ static int check_stage(int stage, const struct cache_entry *ce, int pos)
return 0;
pos++;
}
+ if (!overlay_mode)
+ return 0;
if (stage == 2)
return error(_("path '%s' does not have our version"), ce->name);
else
@@ -168,7 +172,8 @@ static int check_stages(unsigned stages, const struct cache_entry *ce, int pos)
}
static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
- const struct checkout *state, int *nr_checkouts)
+ const struct checkout *state, int *nr_checkouts,
+ int overlay_mode)
{
while (pos < active_nr &&
!strcmp(active_cache[pos]->name, ce->name)) {
@@ -177,6 +182,10 @@ static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
NULL, nr_checkouts);
pos++;
}
+ if (!overlay_mode) {
+ unlink_entry(ce);
+ return 0;
+ }
if (stage == 2)
return error(_("path '%s' does not have our version"), ce->name);
else
@@ -251,6 +260,59 @@ static int checkout_merged(int pos, const struct checkout *state, int *nr_checko
return status;
}
+static void mark_ce_for_checkout_overlay(struct cache_entry *ce,
+ char *ps_matched,
+ const struct checkout_opts *opts)
+{
+ ce->ce_flags &= ~CE_MATCHED;
+ if (!opts->ignore_skipworktree && ce_skip_worktree(ce))
+ return;
+ if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
+ /*
+ * "git checkout tree-ish -- path", but this entry
+ * is in the original index but is not in tree-ish
+ * or does not match the pathspec; it will not be
+ * checked out to the working tree. We will not do
+ * anything to this entry at all.
+ */
+ return;
+ /*
+ * Either this entry came from the tree-ish we are
+ * checking the paths out of, or we are checking out
+ * of the index.
+ *
+ * If it comes from the tree-ish, we already know it
+ * matches the pathspec and could just stamp
+ * CE_MATCHED to it from update_some(). But we still
+ * need ps_matched and read_tree_recursive (and
+ * eventually tree_entry_interesting) cannot fill
+ * ps_matched yet. Once it can, we can avoid calling
+ * match_pathspec() for _all_ entries when
+ * opts->source_tree != NULL.
+ */
+ if (ce_path_match(&the_index, ce, &opts->pathspec, ps_matched))
+ ce->ce_flags |= CE_MATCHED;
+}
+
+static void mark_ce_for_checkout_no_overlay(struct cache_entry *ce,
+ char *ps_matched,
+ const struct checkout_opts *opts)
+{
+ ce->ce_flags &= ~CE_MATCHED;
+ if (!opts->ignore_skipworktree && ce_skip_worktree(ce))
+ return;
+ if (ce_path_match(&the_index, ce, &opts->pathspec, ps_matched)) {
+ ce->ce_flags |= CE_MATCHED;
+ if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
+ /*
+ * In overlay mode, but the path is not in
+ * tree-ish, which means we should remove it
+ * from the index and the working tree.
+ */
+ ce->ce_flags |= CE_REMOVE | CE_WT_REMOVE;
+ }
+}
+
static int checkout_paths(const struct checkout_opts *opts,
const char *revision)
{
@@ -263,6 +325,8 @@ static int checkout_paths(const struct checkout_opts *opts,
struct lock_file lock_file = LOCK_INIT;
int nr_checkouts = 0, nr_unmerged = 0;
+ trace2_cmd_mode(opts->patch_mode ? "patch" : "path");
+
if (opts->track != BRANCH_TRACK_UNSPECIFIED)
die(_("'%s' cannot be used with updating paths"), "--track");
@@ -302,37 +366,15 @@ static int checkout_paths(const struct checkout_opts *opts,
* Make sure all pathspecs participated in locating the paths
* to be checked out.
*/
- for (pos = 0; pos < active_nr; pos++) {
- struct cache_entry *ce = active_cache[pos];
- ce->ce_flags &= ~CE_MATCHED;
- if (!opts->ignore_skipworktree && ce_skip_worktree(ce))
- continue;
- if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
- /*
- * "git checkout tree-ish -- path", but this entry
- * is in the original index; it will not be checked
- * out to the working tree and it does not matter
- * if pathspec matched this entry. We will not do
- * anything to this entry at all.
- */
- continue;
- /*
- * Either this entry came from the tree-ish we are
- * checking the paths out of, or we are checking out
- * of the index.
- *
- * If it comes from the tree-ish, we already know it
- * matches the pathspec and could just stamp
- * CE_MATCHED to it from update_some(). But we still
- * need ps_matched and read_tree_recursive (and
- * eventually tree_entry_interesting) cannot fill
- * ps_matched yet. Once it can, we can avoid calling
- * match_pathspec() for _all_ entries when
- * opts->source_tree != NULL.
- */
- if (ce_path_match(&the_index, ce, &opts->pathspec, ps_matched))
- ce->ce_flags |= CE_MATCHED;
- }
+ for (pos = 0; pos < active_nr; pos++)
+ if (opts->overlay_mode)
+ mark_ce_for_checkout_overlay(active_cache[pos],
+ ps_matched,
+ opts);
+ else
+ mark_ce_for_checkout_no_overlay(active_cache[pos],
+ ps_matched,
+ opts);
if (report_path_error(ps_matched, &opts->pathspec, opts->prefix)) {
free(ps_matched);
@@ -353,7 +395,7 @@ static int checkout_paths(const struct checkout_opts *opts,
if (opts->force) {
warning(_("path '%s' is unmerged"), ce->name);
} else if (opts->writeout_stage) {
- errs |= check_stage(opts->writeout_stage, ce, pos);
+ errs |= check_stage(opts->writeout_stage, ce, pos, opts->overlay_mode);
} else if (opts->merge) {
errs |= check_stages((1<<2) | (1<<3), ce, pos);
} else {
@@ -383,13 +425,16 @@ static int checkout_paths(const struct checkout_opts *opts,
if (opts->writeout_stage)
errs |= checkout_stage(opts->writeout_stage,
ce, pos,
- &state, &nr_checkouts);
+ &state,
+ &nr_checkouts, opts->overlay_mode);
else if (opts->merge)
errs |= checkout_merged(pos, &state,
&nr_unmerged);
pos = skip_same_name(ce, pos) - 1;
}
}
+ remove_marked_cache_entries(&the_index, 1);
+ remove_scheduled_dirs();
errs |= finish_delayed_checkout(&state, &nr_checkouts);
if (opts->count_checkout_paths) {
@@ -572,6 +617,11 @@ static int skip_merge_working_tree(const struct checkout_opts *opts,
*/
/*
+ * opts->overlay_mode cannot be used with switching branches so is
+ * not tested here
+ */
+
+ /*
* If we aren't creating a new branch any changes or updates will
* happen in the existing branch. Since that could only be updating
* the index and working directory, we don't want to skip those steps
@@ -966,6 +1016,9 @@ static int switch_branches(const struct checkout_opts *opts,
void *path_to_free;
struct object_id rev;
int flag, writeout_error = 0;
+
+ trace2_cmd_mode("branch");
+
memset(&old_branch_info, 0, sizeof(old_branch_info));
old_branch_info.path = path_to_free = resolve_refdup("HEAD", 0, &rev, &flag);
if (old_branch_info.path)
@@ -1203,6 +1256,8 @@ static int switch_unborn_to_new_branch(const struct checkout_opts *opts)
int status;
struct strbuf branch_ref = STRBUF_INIT;
+ trace2_cmd_mode("unborn");
+
if (!opts->new_branch)
die(_("You are on a branch yet to be born"));
strbuf_addf(&branch_ref, "refs/heads/%s", opts->new_branch);
@@ -1224,6 +1279,10 @@ static int checkout_branch(struct checkout_opts *opts,
die(_("'%s' cannot be used with switching branches"),
"--patch");
+ if (!opts->overlay_mode)
+ die(_("'%s' cannot be used with switching branches"),
+ "--no-overlay");
+
if (opts->writeout_stage)
die(_("'%s' cannot be used with switching branches"),
"--ours/--theirs");
@@ -1312,6 +1371,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
"checkout", "control recursive updating of submodules",
PARSE_OPT_OPTARG, option_parse_recurse_submodules_worktree_updater },
OPT_BOOL(0, "progress", &opts.show_progress, N_("force progress reporting")),
+ OPT_BOOL(0, "overlay", &opts.overlay_mode, N_("use overlay mode (default)")),
OPT_END(),
};
@@ -1320,6 +1380,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
opts.overwrite_ignore = 1;
opts.prefix = prefix;
opts.show_progress = -1;
+ opts.overlay_mode = -1;
git_config(git_checkout_config, &opts);
@@ -1344,6 +1405,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
if ((!!opts.new_branch + !!opts.new_branch_force + !!opts.new_orphan_branch) > 1)
die(_("-b, -B and --orphan are mutually exclusive"));
+ if (opts.overlay_mode == 1 && opts.patch_mode)
+ die(_("-p and --overlay are mutually exclusive"));
+
/*
* From here on, new_branch will contain the branch to be checked out,
* and new_branch_force and new_orphan_branch will tell us which one of
diff --git a/builtin/commit.c b/builtin/commit.c
index 2986553..f175374 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -609,7 +609,8 @@ static void determine_author_info(struct strbuf *author_ident)
set_ident_var(&date, strbuf_detach(&date_buf, NULL));
}
- strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
+ strbuf_addstr(author_ident, fmt_ident(name, email, WANT_AUTHOR_IDENT, date,
+ IDENT_STRICT));
assert_split_ident(&author, author_ident);
export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
@@ -1038,6 +1039,10 @@ static void handle_untracked_files_arg(struct wt_status *s)
s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
else if (!strcmp(untracked_files_arg, "all"))
s->show_untracked_files = SHOW_ALL_UNTRACKED_FILES;
+ /*
+ * Please update $__git_untracked_file_modes in
+ * git-completion.bash when you add new options
+ */
else
die(_("Invalid untracked files mode '%s'"), untracked_files_arg);
}
@@ -1179,6 +1184,10 @@ static int parse_and_validate_options(int argc, const char *argv[],
else if (!strcmp(cleanup_arg, "scissors"))
cleanup_mode = use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
COMMIT_MSG_CLEANUP_SPACE;
+ /*
+ * Please update _git_commit() in git-completion.bash when you
+ * add new options.
+ */
else
die(_("Invalid cleanup mode %s"), cleanup_arg);
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index a90681b..cb9ea79 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -83,9 +83,13 @@ static int diff_tree_stdin(char *line)
}
static const char diff_tree_usage[] =
-"git diff-tree [--stdin] [-m] [-c] [--cc] [-s] [-v] [--pretty] [-t] [-r] [--root] "
+"git diff-tree [--stdin] [-m] [-c | --cc] [-s] [-v] [--pretty] [-t] [-r] [--root] "
"[<common-diff-options>] <tree-ish> [<tree-ish>] [<path>...]\n"
" -r diff recursively\n"
+" -c show combined diff for merge commits\n"
+" --cc show combined diff for merge commits removing uninteresting hunks\n"
+" --combined-all-paths\n"
+" show name of file in all parents for combined diffs\n"
" --root include the initial commit as diff against /dev/null\n"
COMMON_DIFF_OPTIONS_HELP;
diff --git a/builtin/diff.c b/builtin/diff.c
index 9f61092..53d4234 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -338,21 +338,23 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
"--no-index" : "[--no-index]");
}
- if (no_index)
- /* If this is a no-index diff, just run it and exit there. */
- diff_no_index(the_repository, &rev, argc, argv);
-
- /* Otherwise, we are doing the usual "git" diff */
- rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
- /* Scale to real terminal size and respect statGraphWidth config */
+ /* Set up defaults that will apply to both no-index and regular diffs. */
rev.diffopt.stat_width = -1;
rev.diffopt.stat_graph_width = -1;
-
- /* Default to let external and textconv be used */
rev.diffopt.flags.allow_external = 1;
rev.diffopt.flags.allow_textconv = 1;
+ /* If this is a no-index diff, just run it and exit there. */
+ if (no_index)
+ diff_no_index(&rev, argc, argv);
+
+ /*
+ * Otherwise, we are doing the usual "git" diff; set up any
+ * further defaults that apply to regular diffs.
+ */
+ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
+
/*
* Default to intent-to-add entries invisible in the
* index. This makes them show up as new files in diff-files
diff --git a/builtin/help.c b/builtin/help.c
index 7739a5c..e5590d7 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -70,6 +70,10 @@ static enum help_format parse_help_format(const char *format)
return HELP_FORMAT_INFO;
if (!strcmp(format, "web") || !strcmp(format, "html"))
return HELP_FORMAT_WEB;
+ /*
+ * Please update _git_config() in git-completion.bash when you
+ * add new help formats.
+ */
die(_("unrecognized help format '%s'"), format);
}
diff --git a/builtin/log.c b/builtin/log.c
index 5786926..ab859f5 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -84,6 +84,10 @@ static int parse_decoration_style(const char *value)
return DECORATE_SHORT_REFS;
else if (!strcmp(value, "auto"))
return auto_decoration_style();
+ /*
+ * Please update _git_log() in git-completion.bash when you
+ * add new decoration styles.
+ */
return -1;
}
@@ -1228,6 +1232,10 @@ static int thread_callback(const struct option *opt, const char *arg, int unset)
*thread = THREAD_SHALLOW;
else if (!strcmp(arg, "deep"))
*thread = THREAD_DEEP;
+ /*
+ * Please update _git_formatpatch() in git-completion.bash
+ * when you add new options.
+ */
else
return 1;
return 0;
diff --git a/builtin/merge.c b/builtin/merge.c
index e47d77b..5ce8946 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -113,12 +113,15 @@ static int option_parse_message(const struct option *opt,
return 0;
}
-static int option_read_message(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result option_read_message(struct parse_opt_ctx_t *ctx,
+ const struct option *opt,
+ const char *arg_not_used,
+ int unset)
{
struct strbuf *buf = opt->value;
const char *arg;
+ BUG_ON_OPT_ARG(arg_not_used);
if (unset)
BUG("-F cannot be negated");
@@ -262,7 +265,7 @@ static struct option builtin_merge_options[] = {
option_parse_message),
{ OPTION_LOWLEVEL_CALLBACK, 'F', "file", &merge_msg, N_("path"),
N_("read message from file"), PARSE_OPT_NONEG,
- (parse_opt_cb *) option_read_message },
+ NULL, 0, option_read_message },
OPT__VERBOSITY(&verbosity),
OPT_BOOL(0, "abort", &abort_current_merge,
N_("abort the current in-progress merge")),
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index a9fac7c..a154fc2 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -33,6 +33,7 @@
#include "object-store.h"
#include "dir.h"
#include "midx.h"
+#include "trace2.h"
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
#define SIZE(obj) oe_size(&to_pack, obj)
@@ -3473,6 +3474,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
}
}
+ trace2_region_enter("pack-objects", "enumerate-objects",
+ the_repository);
prepare_packing_data(the_repository, &to_pack);
if (progress)
@@ -3487,12 +3490,23 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (include_tag && nr_result)
for_each_ref(add_ref_tag, NULL);
stop_progress(&progress_state);
+ trace2_region_leave("pack-objects", "enumerate-objects",
+ the_repository);
if (non_empty && !nr_result)
return 0;
- if (nr_result)
+ if (nr_result) {
+ trace2_region_enter("pack-objects", "prepare-pack",
+ the_repository);
prepare_pack(window, depth);
+ trace2_region_leave("pack-objects", "prepare-pack",
+ the_repository);
+ }
+
+ trace2_region_enter("pack-objects", "write-pack-file", the_repository);
write_pack_file();
+ trace2_region_leave("pack-objects", "write-pack-file", the_repository);
+
if (progress)
fprintf_ln(stderr,
_("Total %"PRIu32" (delta %"PRIu32"),"
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index 11bc514..68c1e54 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -32,14 +32,10 @@ static struct pack_list {
struct pack_list *next;
struct packed_git *pack;
struct llist *unique_objects;
- struct llist *all_objects;
+ struct llist *remaining_objects;
+ size_t all_objects_size;
} *local_packs = NULL, *altodb_packs = NULL;
-struct pll {
- struct pll *next;
- struct pack_list *pl;
-};
-
static struct llist_item *free_nodes;
static inline void llist_item_put(struct llist_item *item)
@@ -63,15 +59,6 @@ static inline struct llist_item *llist_item_get(void)
return new_item;
}
-static void llist_free(struct llist *list)
-{
- while ((list->back = list->front)) {
- list->front = list->front->next;
- llist_item_put(list->back);
- }
- free(list);
-}
-
static inline void llist_init(struct llist **list)
{
*list = xmalloc(sizeof(struct llist));
@@ -254,6 +241,11 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
struct llist_item *p1_hint = NULL, *p2_hint = NULL;
const unsigned int hashsz = the_hash_algo->rawsz;
+ if (!p1->unique_objects)
+ p1->unique_objects = llist_copy(p1->remaining_objects);
+ if (!p2->unique_objects)
+ p2->unique_objects = llist_copy(p2->remaining_objects);
+
p1_base = p1->pack->index_data;
p2_base = p2->pack->index_data;
p1_base += 256 * 4 + ((p1->pack->index_version < 2) ? 4 : 8);
@@ -285,78 +277,6 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
}
}
-static void pll_free(struct pll *l)
-{
- struct pll *old;
- struct pack_list *opl;
-
- while (l) {
- old = l;
- while (l->pl) {
- opl = l->pl;
- l->pl = opl->next;
- free(opl);
- }
- l = l->next;
- free(old);
- }
-}
-
-/* all the permutations have to be free()d at the same time,
- * since they refer to each other
- */
-static struct pll * get_permutations(struct pack_list *list, int n)
-{
- struct pll *subset, *ret = NULL, *new_pll = NULL;
-
- if (list == NULL || pack_list_size(list) < n || n == 0)
- return NULL;
-
- if (n == 1) {
- while (list) {
- new_pll = xmalloc(sizeof(*new_pll));
- new_pll->pl = NULL;
- pack_list_insert(&new_pll->pl, list);
- new_pll->next = ret;
- ret = new_pll;
- list = list->next;
- }
- return ret;
- }
-
- while (list->next) {
- subset = get_permutations(list->next, n - 1);
- while (subset) {
- new_pll = xmalloc(sizeof(*new_pll));
- new_pll->pl = subset->pl;
- pack_list_insert(&new_pll->pl, list);
- new_pll->next = ret;
- ret = new_pll;
- subset = subset->next;
- }
- list = list->next;
- }
- return ret;
-}
-
-static int is_superset(struct pack_list *pl, struct llist *list)
-{
- struct llist *diff;
-
- diff = llist_copy(list);
-
- while (pl) {
- llist_sorted_difference_inplace(diff, pl->all_objects);
- if (diff->size == 0) { /* we're done */
- llist_free(diff);
- return 1;
- }
- pl = pl->next;
- }
- llist_free(diff);
- return 0;
-}
-
static size_t sizeof_union(struct packed_git *p1, struct packed_git *p2)
{
size_t ret = 0;
@@ -421,14 +341,58 @@ static inline off_t pack_set_bytecount(struct pack_list *pl)
return ret;
}
+static int cmp_remaining_objects(const void *a, const void *b)
+{
+ struct pack_list *pl_a = *((struct pack_list **)a);
+ struct pack_list *pl_b = *((struct pack_list **)b);
+
+ if (pl_a->remaining_objects->size == pl_b->remaining_objects->size) {
+ /* have the same remaining_objects, big pack first */
+ if (pl_a->all_objects_size == pl_b->all_objects_size)
+ return 0;
+ else if (pl_a->all_objects_size < pl_b->all_objects_size)
+ return 1;
+ else
+ return -1;
+ } else if (pl_a->remaining_objects->size < pl_b->remaining_objects->size) {
+ /* sort by remaining objects, more objects first */
+ return 1;
+ } else {
+ return -1;
+ }
+}
+
+/* Sort pack_list, greater size of remaining_objects first */
+static void sort_pack_list(struct pack_list **pl)
+{
+ struct pack_list **ary, *p;
+ int i;
+ size_t n = pack_list_size(*pl);
+
+ if (n < 2)
+ return;
+
+ /* prepare an array of packed_list for easier sorting */
+ ary = xcalloc(n, sizeof(struct pack_list *));
+ for (n = 0, p = *pl; p; p = p->next)
+ ary[n++] = p;
+
+ QSORT(ary, n, cmp_remaining_objects);
+
+ /* link them back again */
+ for (i = 0; i < n - 1; i++)
+ ary[i]->next = ary[i + 1];
+ ary[n - 1]->next = NULL;
+ *pl = ary[0];
+
+ free(ary);
+}
+
+
static void minimize(struct pack_list **min)
{
- struct pack_list *pl, *unique = NULL,
- *non_unique = NULL, *min_perm = NULL;
- struct pll *perm, *perm_all, *perm_ok = NULL, *new_perm;
- struct llist *missing;
- off_t min_perm_size = 0, perm_size;
- int n;
+ struct pack_list *pl, *unique = NULL, *non_unique = NULL;
+ struct llist *missing, *unique_pack_objects;
pl = local_packs;
while (pl) {
@@ -442,53 +406,41 @@ static void minimize(struct pack_list **min)
missing = llist_copy(all_objects);
pl = unique;
while (pl) {
- llist_sorted_difference_inplace(missing, pl->all_objects);
+ llist_sorted_difference_inplace(missing, pl->remaining_objects);
pl = pl->next;
}
+ *min = unique;
+
/* return if there are no objects missing from the unique set */
if (missing->size == 0) {
- *min = unique;
free(missing);
return;
}
- /* find the permutations which contain all missing objects */
- for (n = 1; n <= pack_list_size(non_unique) && !perm_ok; n++) {
- perm_all = perm = get_permutations(non_unique, n);
- while (perm) {
- if (is_superset(perm->pl, missing)) {
- new_perm = xmalloc(sizeof(struct pll));
- memcpy(new_perm, perm, sizeof(struct pll));
- new_perm->next = perm_ok;
- perm_ok = new_perm;
- }
- perm = perm->next;
- }
- if (perm_ok)
- break;
- pll_free(perm_all);
- }
- if (perm_ok == NULL)
- die("Internal error: No complete sets found!");
-
- /* find the permutation with the smallest size */
- perm = perm_ok;
- while (perm) {
- perm_size = pack_set_bytecount(perm->pl);
- if (!min_perm_size || min_perm_size > perm_size) {
- min_perm_size = perm_size;
- min_perm = perm->pl;
- }
- perm = perm->next;
- }
- *min = min_perm;
- /* add the unique packs to the list */
- pl = unique;
+ unique_pack_objects = llist_copy(all_objects);
+ llist_sorted_difference_inplace(unique_pack_objects, missing);
+
+ /* remove unique pack objects from the non_unique packs */
+ pl = non_unique;
while (pl) {
- pack_list_insert(min, pl);
+ llist_sorted_difference_inplace(pl->remaining_objects, unique_pack_objects);
pl = pl->next;
}
+
+ while (non_unique) {
+ /* sort the non_unique packs, greater size of remaining_objects first */
+ sort_pack_list(&non_unique);
+ if (non_unique->remaining_objects->size == 0)
+ break;
+
+ pack_list_insert(min, non_unique);
+
+ for (pl = non_unique->next; pl && pl->remaining_objects->size > 0; pl = pl->next)
+ llist_sorted_difference_inplace(pl->remaining_objects, non_unique->remaining_objects);
+
+ non_unique = non_unique->next;
+ }
}
static void load_all_objects(void)
@@ -500,7 +452,7 @@ static void load_all_objects(void)
while (pl) {
hint = NULL;
- l = pl->all_objects->front;
+ l = pl->remaining_objects->front;
while (l) {
hint = llist_insert_sorted_unique(all_objects,
l->oid, hint);
@@ -511,7 +463,7 @@ static void load_all_objects(void)
/* remove objects present in remote packs */
pl = altodb_packs;
while (pl) {
- llist_sorted_difference_inplace(all_objects, pl->all_objects);
+ llist_sorted_difference_inplace(all_objects, pl->remaining_objects);
pl = pl->next;
}
}
@@ -536,11 +488,10 @@ static void scan_alt_odb_packs(void)
while (alt) {
local = local_packs;
while (local) {
- llist_sorted_difference_inplace(local->unique_objects,
- alt->all_objects);
+ llist_sorted_difference_inplace(local->remaining_objects,
+ alt->remaining_objects);
local = local->next;
}
- llist_sorted_difference_inplace(all_objects, alt->all_objects);
alt = alt->next;
}
}
@@ -555,7 +506,7 @@ static struct pack_list * add_pack(struct packed_git *p)
return NULL;
l.pack = p;
- llist_init(&l.all_objects);
+ llist_init(&l.remaining_objects);
if (open_pack_index(p))
return NULL;
@@ -564,11 +515,11 @@ static struct pack_list * add_pack(struct packed_git *p)
base += 256 * 4 + ((p->index_version < 2) ? 4 : 8);
step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0);
while (off < p->num_objects * step) {
- llist_insert_back(l.all_objects, (const struct object_id *)(base + off));
+ llist_insert_back(l.remaining_objects, (const struct object_id *)(base + off));
off += step;
}
- /* this list will be pruned in cmp_two_packs later */
- l.unique_objects = llist_copy(l.all_objects);
+ l.all_objects_size = l.remaining_objects->size;
+ l.unique_objects = NULL;
if (p->pack_local)
return pack_list_insert(&local_packs, &l);
else
@@ -603,7 +554,7 @@ static void load_all(void)
int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
{
int i;
- struct pack_list *min, *red, *pl;
+ struct pack_list *min = NULL, *red, *pl;
struct llist *ignore;
struct object_id *oid;
char buf[GIT_MAX_HEXSZ + 2]; /* hex hash + \n + \0 */
@@ -646,7 +597,6 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
load_all_objects();
- cmp_local_packs();
if (alt_odb)
scan_alt_odb_packs();
@@ -663,10 +613,12 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
llist_sorted_difference_inplace(all_objects, ignore);
pl = local_packs;
while (pl) {
- llist_sorted_difference_inplace(pl->unique_objects, ignore);
+ llist_sorted_difference_inplace(pl->remaining_objects, ignore);
pl = pl->next;
}
+ cmp_local_packs();
+
minimize(&min);
if (verbose) {
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index a9e7b55..48c5e78 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -63,6 +63,11 @@ int cmd_prune_packed(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, prune_packed_options,
prune_packed_usage, 0);
+ if (argc > 0)
+ usage_msg_opt(_("too many arguments"),
+ prune_packed_usage,
+ prune_packed_options);
+
prune_packed_objects(opts);
return 0;
}
diff --git a/builtin/prune.c b/builtin/prune.c
index 1ec9ddd..97613ec 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -31,16 +31,39 @@ static int prune_tmp_file(const char *fullpath)
return 0;
}
+static void perform_reachability_traversal(struct rev_info *revs)
+{
+ static int initialized;
+ struct progress *progress = NULL;
+
+ if (initialized)
+ return;
+
+ if (show_progress)
+ progress = start_delayed_progress(_("Checking connectivity"), 0);
+ mark_reachable_objects(revs, 1, expire, progress);
+ stop_progress(&progress);
+ initialized = 1;
+}
+
+static int is_object_reachable(const struct object_id *oid,
+ struct rev_info *revs)
+{
+ struct object *obj;
+
+ perform_reachability_traversal(revs);
+
+ obj = lookup_object(the_repository, oid->hash);
+ return obj && (obj->flags & SEEN);
+}
+
static int prune_object(const struct object_id *oid, const char *fullpath,
void *data)
{
+ struct rev_info *revs = data;
struct stat st;
- /*
- * Do we know about this object?
- * It must have been reachable
- */
- if (lookup_object(the_repository, oid->hash))
+ if (is_object_reachable(oid, revs))
return 0;
if (lstat(fullpath, &st)) {
@@ -102,7 +125,6 @@ static void remove_temporary_files(const char *path)
int cmd_prune(int argc, const char **argv, const char *prefix)
{
struct rev_info revs;
- struct progress *progress = NULL;
int exclude_promisor_objects = 0;
const struct option options[] = {
OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
@@ -142,17 +164,13 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
if (show_progress == -1)
show_progress = isatty(2);
- if (show_progress)
- progress = start_delayed_progress(_("Checking connectivity"), 0);
if (exclude_promisor_objects) {
fetch_if_missing = 0;
revs.exclude_promisor_objects = 1;
}
- mark_reachable_objects(&revs, 1, expire, progress);
- stop_progress(&progress);
for_each_loose_file_in_objdir(get_object_directory(), prune_object,
- prune_cruft, prune_subdir, NULL);
+ prune_cruft, prune_subdir, &revs);
prune_packed_objects(show_only ? PRUNE_PACKED_DRY_RUN : 0);
remove_temporary_files(get_object_directory());
@@ -160,8 +178,10 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
remove_temporary_files(s);
free(s);
- if (is_repository_shallow(the_repository))
+ if (is_repository_shallow(the_repository)) {
+ perform_reachability_traversal(&revs);
prune_shallow(show_only ? PRUNE_SHOW_ONLY : 0);
+ }
return 0;
}
diff --git a/builtin/pull.c b/builtin/pull.c
index 701d147..33db889 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -56,6 +56,10 @@ static enum rebase_type parse_config_rebase(const char *key, const char *value,
return REBASE_MERGES;
else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
return REBASE_INTERACTIVE;
+ /*
+ * Please update _git_config() in git-completion.bash when you
+ * add new rebase modes.
+ */
if (fatal)
die(_("Invalid value for %s: %s"), key, value);
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 7c7bc13..77deebc 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -369,6 +369,7 @@ static void add_var(struct strbuf *buf, const char *name, const char *value)
#define RESET_HEAD_HARD (1<<1)
#define RESET_HEAD_RUN_POST_CHECKOUT_HOOK (1<<2)
#define RESET_HEAD_REFS_ONLY (1<<3)
+#define RESET_ORIG_HEAD (1<<4)
static int reset_head(struct object_id *oid, const char *action,
const char *switch_to_branch, unsigned flags,
@@ -378,6 +379,7 @@ static int reset_head(struct object_id *oid, const char *action,
unsigned reset_hard = flags & RESET_HEAD_HARD;
unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK;
unsigned refs_only = flags & RESET_HEAD_REFS_ONLY;
+ unsigned update_orig_head = flags & RESET_ORIG_HEAD;
struct object_id head_oid;
struct tree_desc desc[2] = { { NULL }, { NULL } };
struct lock_file lock = LOCK_INIT;
@@ -454,18 +456,21 @@ reset_head_refs:
strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : "rebase");
prefix_len = msg.len;
- if (!get_oid("ORIG_HEAD", &oid_old_orig))
- old_orig = &oid_old_orig;
- if (!get_oid("HEAD", &oid_orig)) {
- orig = &oid_orig;
- if (!reflog_orig_head) {
- strbuf_addstr(&msg, "updating ORIG_HEAD");
- reflog_orig_head = msg.buf;
- }
- update_ref(reflog_orig_head, "ORIG_HEAD", orig, old_orig, 0,
- UPDATE_REFS_MSG_ON_ERR);
- } else if (old_orig)
- delete_ref(NULL, "ORIG_HEAD", old_orig, 0);
+ if (update_orig_head) {
+ if (!get_oid("ORIG_HEAD", &oid_old_orig))
+ old_orig = &oid_old_orig;
+ if (!get_oid("HEAD", &oid_orig)) {
+ orig = &oid_orig;
+ if (!reflog_orig_head) {
+ strbuf_addstr(&msg, "updating ORIG_HEAD");
+ reflog_orig_head = msg.buf;
+ }
+ update_ref(reflog_orig_head, "ORIG_HEAD", orig,
+ old_orig, 0, UPDATE_REFS_MSG_ON_ERR);
+ } else if (old_orig)
+ delete_ref(NULL, "ORIG_HEAD", old_orig, 0);
+ }
+
if (!reflog_head) {
strbuf_setlen(&msg, prefix_len);
strbuf_addstr(&msg, "updating HEAD");
@@ -476,7 +481,7 @@ reset_head_refs:
detach_head ? REF_NO_DEREF : 0,
UPDATE_REFS_MSG_ON_ERR);
else {
- ret = update_ref(reflog_orig_head, switch_to_branch, oid,
+ ret = update_ref(reflog_head, switch_to_branch, oid,
NULL, 0, UPDATE_REFS_MSG_ON_ERR);
if (!ret)
ret = create_symref("HEAD", switch_to_branch,
@@ -1027,6 +1032,14 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
ACTION_EDIT_TODO,
ACTION_SHOW_CURRENT_PATCH,
} action = NO_ACTION;
+ static const char *action_names[] = { N_("undefined"),
+ N_("continue"),
+ N_("skip"),
+ N_("abort"),
+ N_("quit"),
+ N_("edit_todo"),
+ N_("show_current_patch"),
+ NULL };
const char *gpg_sign = NULL;
struct string_list exec = STRING_LIST_INIT_NODUP;
const char *rebase_merges = NULL;
@@ -1212,6 +1225,15 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
die(_("The --edit-todo action can only be used during "
"interactive rebase."));
+ if (trace2_is_enabled()) {
+ if (is_interactive(&options))
+ trace2_cmd_mode("interactive");
+ else if (exec.nr)
+ trace2_cmd_mode("interactive-exec");
+ else
+ trace2_cmd_mode(action_names[action]);
+ }
+
switch (action) {
case ACTION_CONTINUE: {
struct object_id head;
@@ -1760,7 +1782,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
strbuf_addf(&msg, "%s: checkout %s",
getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
if (reset_head(&options.onto->object.oid, "checkout", NULL,
- RESET_HEAD_DETACH | RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
+ RESET_HEAD_DETACH | RESET_ORIG_HEAD |
+ RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
NULL, msg.buf))
die(_("Could not detach HEAD"));
strbuf_release(&msg);
@@ -1776,8 +1799,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
strbuf_addf(&msg, "rebase finished: %s onto %s",
options.head_name ? options.head_name : "detached HEAD",
oid_to_hex(&options.onto->object.oid));
- reset_head(NULL, "Fast-forwarded", options.head_name, 0,
- "HEAD", msg.buf);
+ reset_head(NULL, "Fast-forwarded", options.head_name,
+ RESET_HEAD_REFS_ONLY, "HEAD", msg.buf);
strbuf_release(&msg);
ret = !!finish_rebase(&options);
goto cleanup;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index d58b775..29f165d 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -694,6 +694,8 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
proc.argv = argv;
proc.in = -1;
proc.stdout_to_stderr = 1;
+ proc.trace2_hook_name = hook_name;
+
if (feed_state->push_options) {
int i;
for (i = 0; i < feed_state->push_options->nr; i++)
@@ -807,6 +809,7 @@ static int run_update_hook(struct command *cmd)
proc.stdout_to_stderr = 1;
proc.err = use_sideband ? -1 : 0;
proc.argv = argv;
+ proc.trace2_hook_name = "update";
code = start_command(&proc);
if (code)
@@ -1190,6 +1193,7 @@ static void run_update_post_hook(struct command *commands)
proc.no_stdin = 1;
proc.stdout_to_stderr = 1;
proc.err = use_sideband ? -1 : 0;
+ proc.trace2_hook_name = "post-update";
if (!start_command(&proc)) {
if (use_sideband)
@@ -1198,17 +1202,12 @@ static void run_update_post_hook(struct command *commands)
}
}
-static void check_aliased_update(struct command *cmd, struct string_list *list)
+static void check_aliased_update_internal(struct command *cmd,
+ struct string_list *list,
+ const char *dst_name, int flag)
{
- struct strbuf buf = STRBUF_INIT;
- const char *dst_name;
struct string_list_item *item;
struct command *dst_cmd;
- int flag;
-
- strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
- dst_name = resolve_ref_unsafe(buf.buf, 0, NULL, &flag);
- strbuf_release(&buf);
if (!(flag & REF_ISSYMREF))
return;
@@ -1247,6 +1246,18 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
"inconsistent aliased update";
}
+static void check_aliased_update(struct command *cmd, struct string_list *list)
+{
+ struct strbuf buf = STRBUF_INIT;
+ const char *dst_name;
+ int flag;
+
+ strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
+ dst_name = resolve_ref_unsafe(buf.buf, 0, NULL, &flag);
+ check_aliased_update_internal(cmd, list, dst_name, flag);
+ strbuf_release(&buf);
+}
+
static void check_aliased_updates(struct command *commands)
{
struct command *cmd;
diff --git a/builtin/replace.c b/builtin/replace.c
index 5b80b7f..f570162 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -82,6 +82,10 @@ static int list_replace_refs(const char *pattern, const char *format)
data.format = REPLACE_FORMAT_MEDIUM;
else if (!strcmp(format, "long"))
data.format = REPLACE_FORMAT_LONG;
+ /*
+ * Please update _git_replace() in git-completion.bash when
+ * you add new format
+ */
else
return error(_("invalid replace format '%s'\n"
"valid formats are 'short', 'medium' and 'long'"),
diff --git a/builtin/reset.c b/builtin/reset.c
index 4d18a46..7882829 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -341,6 +341,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
if (patch_mode) {
if (reset_type != NONE)
die(_("--patch is incompatible with --{hard,mixed,soft}"));
+ trace2_cmd_mode("patch-interactive");
return run_add_interactive(rev, "--patch=reset", &pathspec);
}
@@ -357,6 +358,11 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
if (reset_type == NONE)
reset_type = MIXED; /* by default */
+ if (pathspec.nr)
+ trace2_cmd_mode("path");
+ else
+ trace2_cmd_mode(reset_type_names[reset_type]);
+
if (reset_type != SOFT && (reset_type != MIXED || get_git_work_tree()))
setup_work_tree();
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index b80fc4b..6bcc4f1 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1816,11 +1816,10 @@ static int update_submodules(struct submodule_update_clone *suc)
{
int i;
- run_processes_parallel(suc->max_jobs,
- update_clone_get_next_task,
- update_clone_start_failure,
- update_clone_task_finished,
- suc);
+ run_processes_parallel_tr2(suc->max_jobs, update_clone_get_next_task,
+ update_clone_start_failure,
+ update_clone_task_finished, suc, "submodule",
+ "parallel/update");
/*
* We saved the output and put it out all at once now.
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 02ace60..1b6c42f 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -848,14 +848,16 @@ static int parse_new_style_cacheinfo(const char *arg,
return 0;
}
-static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result cacheinfo_callback(
+ struct parse_opt_ctx_t *ctx, const struct option *opt,
+ const char *arg, int unset)
{
struct object_id oid;
unsigned int mode;
const char *path;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, &oid, &path)) {
if (add_cacheinfo(mode, &oid, path, 0))
@@ -874,12 +876,14 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
return 0;
}
-static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result stdin_cacheinfo_callback(
+ struct parse_opt_ctx_t *ctx, const struct option *opt,
+ const char *arg, int unset)
{
int *nul_term_line = opt->value;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
if (ctx->argc != 1)
return error("option '%s' must be the last argument", opt->long_name);
@@ -888,12 +892,14 @@ static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx,
return 0;
}
-static int stdin_callback(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result stdin_callback(
+ struct parse_opt_ctx_t *ctx, const struct option *opt,
+ const char *arg, int unset)
{
int *read_from_stdin = opt->value;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
if (ctx->argc != 1)
return error("option '%s' must be the last argument", opt->long_name);
@@ -901,13 +907,15 @@ static int stdin_callback(struct parse_opt_ctx_t *ctx,
return 0;
}
-static int unresolve_callback(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result unresolve_callback(
+ struct parse_opt_ctx_t *ctx, const struct option *opt,
+ const char *arg, int unset)
{
int *has_errors = opt->value;
const char *prefix = startup_info->prefix;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
/* consume remaining arguments. */
*has_errors = do_unresolve(ctx->argc, ctx->argv,
@@ -920,13 +928,15 @@ static int unresolve_callback(struct parse_opt_ctx_t *ctx,
return 0;
}
-static int reupdate_callback(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset)
+static enum parse_opt_result reupdate_callback(
+ struct parse_opt_ctx_t *ctx, const struct option *opt,
+ const char *arg, int unset)
{
int *has_errors = opt->value;
const char *prefix = startup_info->prefix;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
/* consume remaining arguments. */
setup_work_tree();
@@ -986,7 +996,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
N_("add the specified entry to the index"),
PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
- (parse_opt_cb *) cacheinfo_callback},
+ NULL, 0,
+ cacheinfo_callback},
{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, "(+|-)x",
N_("override the executable bit of the listed files"),
PARSE_OPT_NONEG,
@@ -1012,19 +1023,19 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
{OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL,
N_("read list of paths to be updated from standard input"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
- (parse_opt_cb *) stdin_callback},
+ NULL, 0, stdin_callback},
{OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &nul_term_line, NULL,
N_("add entries from standard input to the index"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
- (parse_opt_cb *) stdin_cacheinfo_callback},
+ NULL, 0, stdin_cacheinfo_callback},
{OPTION_LOWLEVEL_CALLBACK, 0, "unresolve", &has_errors, NULL,
N_("repopulate stages #2 and #3 for the listed paths"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
- (parse_opt_cb *) unresolve_callback},
+ NULL, 0, unresolve_callback},
{OPTION_LOWLEVEL_CALLBACK, 'g', "again", &has_errors, NULL,
N_("only update entries that differ from HEAD"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
- (parse_opt_cb *) reupdate_callback},
+ NULL, 0, reupdate_callback},
OPT_BIT(0, "ignore-missing", &refresh_args.flags,
N_("ignore files missing from worktree"),
REFRESH_IGNORE_MISSING),
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 3f9907f..6cc094a 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -402,6 +402,7 @@ done:
cp.dir = path;
cp.env = env;
cp.argv = NULL;
+ cp.trace2_hook_name = "post-checkout";
argv_array_pushl(&cp.args, absolute_path(hook),
oid_to_hex(&null_oid),
oid_to_hex(&commit->object.oid),
diff --git a/cache.h b/cache.h
index 27fe635..abd518a 100644
--- a/cache.h
+++ b/cache.h
@@ -9,6 +9,7 @@
#include "gettext.h"
#include "convert.h"
#include "trace.h"
+#include "trace2.h"
#include "string-list.h"
#include "pack-revindex.h"
#include "hash.h"
@@ -758,7 +759,7 @@ extern void rename_index_entry_at(struct index_state *, int pos, const char *new
/* Remove entry, return true if there are more entries to go. */
extern int remove_index_entry_at(struct index_state *, int pos);
-extern void remove_marked_cache_entries(struct index_state *istate);
+extern void remove_marked_cache_entries(struct index_state *istate, int invalidate);
extern int remove_file_from_index(struct index_state *, const char *path);
#define ADD_CACHE_VERBOSE 1
#define ADD_CACHE_PRETEND 2
@@ -1506,10 +1507,19 @@ int date_overflows(timestamp_t date);
#define IDENT_STRICT 1
#define IDENT_NO_DATE 2
#define IDENT_NO_NAME 4
+
+enum want_ident {
+ WANT_BLANK_IDENT,
+ WANT_AUTHOR_IDENT,
+ WANT_COMMITTER_IDENT
+};
+
extern const char *git_author_info(int);
extern const char *git_committer_info(int);
-extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int);
-extern const char *fmt_name(const char *name, const char *email);
+extern const char *fmt_ident(const char *name, const char *email,
+ enum want_ident whose_ident,
+ const char *date_str, int);
+extern const char *fmt_name(enum want_ident);
extern const char *ident_default_name(void);
extern const char *ident_default_email(void);
extern const char *git_editor(void);
@@ -1569,6 +1579,11 @@ struct checkout {
extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath, int *nr_checkouts);
extern void enable_delayed_checkout(struct checkout *state);
extern int finish_delayed_checkout(struct checkout *state, int *nr_checkouts);
+/*
+ * Unlink the last component and schedule the leading directories for
+ * removal, such that empty directories get removed.
+ */
+extern void unlink_entry(const struct cache_entry *ce);
struct cache_def {
struct strbuf path;
diff --git a/check-racy.c b/check-racy.c
deleted file mode 100644
index 24b6542..0000000
--- a/check-racy.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "cache.h"
-
-int main(int ac, char **av)
-{
- int i;
- int dirty, clean, racy;
-
- dirty = clean = racy = 0;
- read_cache();
- for (i = 0; i < active_nr; i++) {
- struct cache_entry *ce = active_cache[i];
- struct stat st;
-
- if (lstat(ce->name, &st)) {
- error_errno("lstat(%s)", ce->name);
- continue;
- }
-
- if (ce_match_stat(ce, &st, 0))
- dirty++;
- else if (ce_match_stat(ce, &st, CE_MATCH_RACY_IS_DIRTY))
- racy++;
- else
- clean++;
- }
- printf("dirty %d, clean %d, racy %d\n", dirty, clean, racy);
- return 0;
-}
diff --git a/ci/run-windows-build.sh b/ci/run-windows-build.sh
deleted file mode 100755
index a73a4ec..0000000
--- a/ci/run-windows-build.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-#
-# Script to trigger the Git for Windows build and test run.
-# Set the $GFW_CI_TOKEN as environment variable.
-# Pass the branch (only branches on https://github.com/git/git are
-# supported) and a commit hash.
-#
-
-. ${0%/*}/lib.sh
-
-test $# -ne 2 && echo "Unexpected number of parameters" && exit 1
-test -z "$GFW_CI_TOKEN" && echo "GFW_CI_TOKEN not defined" && exit
-
-BRANCH=$1
-COMMIT=$2
-
-gfwci () {
- local CURL_ERROR_CODE HTTP_CODE
- CONTENT_FILE=$(mktemp -t "git-windows-ci-XXXXXX")
- while test -z $HTTP_CODE
- do
- HTTP_CODE=$(curl \
- -H "Authentication: Bearer $GFW_CI_TOKEN" \
- --silent --retry 5 --write-out '%{HTTP_CODE}' \
- --output >(sed "$(printf '1s/^\xef\xbb\xbf//')" >$CONTENT_FILE) \
- "https://git-for-windows-ci.azurewebsites.net/api/TestNow?$1" \
- )
- CURL_ERROR_CODE=$?
- # The GfW CI web app sometimes returns HTTP errors of
- # "502 bad gateway" or "503 service unavailable".
- # We also need to check the HTTP content because the GfW web
- # app seems to pass through (error) results from other Azure
- # calls with HTTP code 200.
- # Wait a little and retry if we detect this error. More info:
- # https://docs.microsoft.com/en-in/azure/app-service-web/app-service-web-troubleshoot-http-502-http-503
- if test $HTTP_CODE -eq 502 ||
- test $HTTP_CODE -eq 503 ||
- grep "502 - Web server received an invalid response" $CONTENT_FILE >/dev/null
- then
- sleep 10
- HTTP_CODE=
- fi
- done
- cat $CONTENT_FILE
- rm $CONTENT_FILE
- if test $CURL_ERROR_CODE -ne 0
- then
- return $CURL_ERROR_CODE
- fi
- if test "$HTTP_CODE" -ge 400 && test "$HTTP_CODE" -lt 600
- then
- return 127
- fi
-}
-
-# Trigger build job
-BUILD_ID=$(gfwci "action=trigger&branch=$BRANCH&commit=$COMMIT&skipTests=false")
-if test $? -ne 0
-then
- echo "Unable to trigger Visual Studio Team Services Build"
- echo "$BUILD_ID"
- exit 1
-fi
-
-# Check if the $BUILD_ID contains a number
-case $BUILD_ID in
-''|*[!0-9]*) echo "Unexpected build number: $BUILD_ID" && exit 1
-esac
-
-echo "Visual Studio Team Services Build #${BUILD_ID}"
-
-# Tracing execued commands would produce too much noise in the waiting
-# loop below.
-set +x
-
-# Wait until build job finished
-STATUS=
-RESULT=
-while true
-do
- LAST_STATUS=$STATUS
- STATUS=$(gfwci "action=status&buildId=$BUILD_ID")
- test "$STATUS" = "$LAST_STATUS" || printf "\nStatus: %s " "$STATUS"
- printf "."
-
- case "$STATUS" in
- inProgress|postponed|notStarted) sleep 10 ;; # continue
- "completed: succeeded") RESULT="success"; break;; # success
- "completed: failed") break;; # failure
- *) echo "Unhandled status: $STATUS"; break;; # unknown
- esac
-done
-
-# Print log
-echo ""
-echo ""
-set -x
-gfwci "action=log&buildId=$BUILD_ID" | cut -c 30-
-
-# Set exit code for TravisCI
-test "$RESULT" = "success"
-
-save_good_tree
diff --git a/combine-diff.c b/combine-diff.c
index 23d8fab..3e49f3b 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -23,11 +23,20 @@ static int compare_paths(const struct combine_diff_path *one,
two->path, strlen(two->path), two->mode);
}
-static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)
+static int filename_changed(char status)
+{
+ return status == 'R' || status == 'C';
+}
+
+static struct combine_diff_path *intersect_paths(
+ struct combine_diff_path *curr,
+ int n,
+ int num_parent,
+ int combined_all_paths)
{
struct diff_queue_struct *q = &diff_queued_diff;
struct combine_diff_path *p, **tail = &curr;
- int i, cmp;
+ int i, j, cmp;
if (!n) {
for (i = 0; i < q->nr; i++) {
@@ -50,6 +59,13 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
oidcpy(&p->parent[n].oid, &q->queue[i]->one->oid);
p->parent[n].mode = q->queue[i]->one->mode;
p->parent[n].status = q->queue[i]->status;
+
+ if (combined_all_paths &&
+ filename_changed(p->parent[n].status)) {
+ strbuf_init(&p->parent[n].path, 0);
+ strbuf_addstr(&p->parent[n].path,
+ q->queue[i]->one->path);
+ }
*tail = p;
tail = &p->next;
}
@@ -68,6 +84,10 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
if (cmp < 0) {
/* p->path not in q->queue[]; drop it */
*tail = p->next;
+ for (j = 0; j < num_parent; j++)
+ if (combined_all_paths &&
+ filename_changed(p->parent[j].status))
+ strbuf_release(&p->parent[j].path);
free(p);
continue;
}
@@ -81,6 +101,10 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
oidcpy(&p->parent[n].oid, &q->queue[i]->one->oid);
p->parent[n].mode = q->queue[i]->one->mode;
p->parent[n].status = q->queue[i]->status;
+ if (combined_all_paths &&
+ filename_changed(p->parent[n].status))
+ strbuf_addstr(&p->parent[n].path,
+ q->queue[i]->one->path);
tail = &p->next;
i++;
@@ -960,12 +984,25 @@ static void show_combined_header(struct combine_diff_path *elem,
if (!show_file_header)
return;
- if (added)
- dump_quoted_path("--- ", "", "/dev/null",
- line_prefix, c_meta, c_reset);
- else
- dump_quoted_path("--- ", a_prefix, elem->path,
- line_prefix, c_meta, c_reset);
+ if (rev->combined_all_paths) {
+ for (i = 0; i < num_parent; i++) {
+ char *path = filename_changed(elem->parent[i].status)
+ ? elem->parent[i].path.buf : elem->path;
+ if (elem->parent[i].status == DIFF_STATUS_ADDED)
+ dump_quoted_path("--- ", "", "/dev/null",
+ line_prefix, c_meta, c_reset);
+ else
+ dump_quoted_path("--- ", a_prefix, path,
+ line_prefix, c_meta, c_reset);
+ }
+ } else {
+ if (added)
+ dump_quoted_path("--- ", "", "/dev/null",
+ line_prefix, c_meta, c_reset);
+ else
+ dump_quoted_path("--- ", a_prefix, elem->path,
+ line_prefix, c_meta, c_reset);
+ }
if (deleted)
dump_quoted_path("+++ ", "", "/dev/null",
line_prefix, c_meta, c_reset);
@@ -1227,6 +1264,15 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re
putchar(inter_name_termination);
}
+ for (i = 0; i < num_parent; i++)
+ if (rev->combined_all_paths) {
+ if (filename_changed(p->parent[i].status))
+ write_name_quoted(p->parent[i].path.buf, stdout,
+ inter_name_termination);
+ else
+ write_name_quoted(p->path, stdout,
+ inter_name_termination);
+ }
write_name_quoted(p->path, stdout, line_termination);
}
@@ -1332,7 +1378,9 @@ static const char *path_path(void *obj)
/* find set of paths that every parent touches */
static struct combine_diff_path *find_paths_generic(const struct object_id *oid,
- const struct oid_array *parents, struct diff_options *opt)
+ const struct oid_array *parents,
+ struct diff_options *opt,
+ int combined_all_paths)
{
struct combine_diff_path *paths = NULL;
int i, num_parent = parents->nr;
@@ -1357,7 +1405,8 @@ static struct combine_diff_path *find_paths_generic(const struct object_id *oid,
opt->output_format = DIFF_FORMAT_NO_OUTPUT;
diff_tree_oid(&parents->oid[i], oid, "", opt);
diffcore_std(opt);
- paths = intersect_paths(paths, i, num_parent);
+ paths = intersect_paths(paths, i, num_parent,
+ combined_all_paths);
/* if showing diff, show it in requested order */
if (opt->output_format != DIFF_FORMAT_NO_OUTPUT &&
@@ -1467,7 +1516,8 @@ void diff_tree_combined(const struct object_id *oid,
* diff(sha1,parent_i) for all i to do the job, specifically
* for parent0.
*/
- paths = find_paths_generic(oid, parents, &diffopts);
+ paths = find_paths_generic(oid, parents, &diffopts,
+ rev->combined_all_paths);
}
else {
int stat_opt;
@@ -1540,6 +1590,10 @@ void diff_tree_combined(const struct object_id *oid,
while (paths) {
struct combine_diff_path *tmp = paths;
paths = paths->next;
+ for (i = 0; i < num_parent; i++)
+ if (rev->combined_all_paths &&
+ filename_changed(tmp->parent[i].status))
+ strbuf_release(&tmp->parent[i].path);
free(tmp);
}
diff --git a/common-main.c b/common-main.c
index 3728f66..d484aec 100644
--- a/common-main.c
+++ b/common-main.c
@@ -25,12 +25,19 @@ static void restore_sigpipe_to_default(void)
int main(int argc, const char **argv)
{
+ int result;
+
/*
* Always open file descriptors 0/1/2 to avoid clobbering files
* in die(). It also avoids messing up when the pipes are dup'ed
* onto stdin/stdout/stderr in the child processes we spawn.
*/
sanitize_stdfds();
+ restore_sigpipe_to_default();
+
+ trace2_initialize();
+ trace2_cmd_start(argv);
+ trace2_collect_process_info();
git_resolve_executable_dir(argv[0]);
@@ -40,7 +47,9 @@ int main(int argc, const char **argv)
attr_start();
- restore_sigpipe_to_default();
+ result = cmd_main(argc, argv);
+
+ trace2_cmd_exit(result);
- return cmd_main(argc, argv);
+ return result;
}
diff --git a/compat/bswap.h b/compat/bswap.h
index 5078ce5..e4e2573 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -1,3 +1,6 @@
+#ifndef COMPAT_BSWAP_H
+#define COMPAT_BSWAP_H
+
/*
* Let's make sure we always have a sane definition for ntohl()/htonl().
* Some libraries define those as a function call, just to perform byte
@@ -210,3 +213,5 @@ static inline void put_be64(void *ptr, uint64_t value)
}
#endif
+
+#endif /* COMPAT_BSWAP_H */
diff --git a/compat/mingw.c b/compat/mingw.c
index 8141f77..6b04514 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1551,19 +1551,23 @@ static int try_shell_exec(const char *cmd, char *const *argv)
return 0;
prog = path_lookup(interpr, 1);
if (prog) {
+ int exec_id;
int argc = 0;
const char **argv2;
while (argv[argc]) argc++;
ALLOC_ARRAY(argv2, argc + 1);
argv2[0] = (char *)cmd; /* full path to the script file */
memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
+ exec_id = trace2_exec(prog, argv2);
pid = mingw_spawnv(prog, argv2, 1);
if (pid >= 0) {
int status;
if (waitpid(pid, &status, 0) < 0)
status = 255;
+ trace2_exec_result(exec_id, status);
exit(status);
}
+ trace2_exec_result(exec_id, -1);
pid = 1; /* indicate that we tried but failed */
free(prog);
free(argv2);
@@ -1576,12 +1580,17 @@ int mingw_execv(const char *cmd, char *const *argv)
/* check if git_command is a shell script */
if (!try_shell_exec(cmd, argv)) {
int pid, status;
+ int exec_id;
+ exec_id = trace2_exec(cmd, (const char **)argv);
pid = mingw_spawnv(cmd, (const char **)argv, 0);
- if (pid < 0)
+ if (pid < 0) {
+ trace2_exec_result(exec_id, -1);
return -1;
+ }
if (waitpid(pid, &status, 0) < 0)
status = 255;
+ trace2_exec_result(exec_id, status);
exit(status);
}
return -1;
diff --git a/compat/mingw.h b/compat/mingw.h
index 30d9fb3..4d73f8a 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -147,8 +147,7 @@ static inline int fcntl(int fd, int cmd, ...)
errno = EINVAL;
return -1;
}
-/* bash cannot reliably detect negative return codes as failure */
-#define exit(code) exit((code) & 0xff)
+
#define sigemptyset(x) (void)0
static inline int sigaddset(sigset_t *set, int signum)
{ return 0; }
diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c
new file mode 100644
index 0000000..52bd620
--- /dev/null
+++ b/compat/win32/trace2_win32_process_info.c
@@ -0,0 +1,147 @@
+#include "../../cache.h"
+#include "../../json-writer.h"
+#include <Psapi.h>
+#include <tlHelp32.h>
+
+/*
+ * An arbitrarily chosen value to limit the size of the ancestor
+ * array built in git_processes().
+ */
+#define NR_PIDS_LIMIT 10
+
+/*
+ * Find the process data for the given PID in the given snapshot
+ * and update the PROCESSENTRY32 data.
+ */
+static int find_pid(DWORD pid, HANDLE hSnapshot, PROCESSENTRY32 *pe32)
+{
+ pe32->dwSize = sizeof(PROCESSENTRY32);
+
+ if (Process32First(hSnapshot, pe32)) {
+ do {
+ if (pe32->th32ProcessID == pid)
+ return 1;
+ } while (Process32Next(hSnapshot, pe32));
+ }
+ return 0;
+}
+
+/*
+ * Accumulate JSON array of our parent processes:
+ * [
+ * exe-name-parent,
+ * exe-name-grand-parent,
+ * ...
+ * ]
+ *
+ * Note: we only report the filename of the process executable; the
+ * only way to get its full pathname is to use OpenProcess()
+ * and GetModuleFileNameEx() or QueryfullProcessImageName()
+ * and that seems rather expensive (on top of the cost of
+ * getting the snapshot).
+ *
+ * Note: we compute the set of parent processes by walking the PPID
+ * link in each visited PROCESSENTRY32 record. This search
+ * stops when an ancestor process is not found in the snapshot
+ * (because it exited before the current or intermediate parent
+ * process exited).
+ *
+ * This search may compute an incorrect result if the PPID link
+ * refers to the PID of an exited parent and that PID has been
+ * recycled and given to a new unrelated process.
+ *
+ * Worse, it is possible for a child or descendant of the
+ * current process to be given the recycled PID and cause a
+ * PPID-cycle. This would cause an infinite loop building our
+ * parent process array.
+ *
+ * Note: for completeness, the "System Idle" process has PID=0 and
+ * PPID=0 and could cause another PPID-cycle. We don't expect
+ * Git to be a descendant of the idle process, but because of
+ * PID recycling, it might be possible to get a PPID link value
+ * of 0. This too would cause an infinite loop.
+ *
+ * Therefore, we keep an array of the visited PPIDs to guard against
+ * cycles.
+ *
+ * We use a fixed-size array rather than ALLOC_GROW to keep things
+ * simple and avoid the alloc/realloc overhead. It is OK if we
+ * truncate the search and return a partial answer.
+ */
+static void get_processes(struct json_writer *jw, HANDLE hSnapshot)
+{
+ PROCESSENTRY32 pe32;
+ DWORD pid;
+ DWORD pid_list[NR_PIDS_LIMIT];
+ int k, nr_pids = 0;
+
+ pid = GetCurrentProcessId();
+ while (find_pid(pid, hSnapshot, &pe32)) {
+ /* Only report parents. Omit self from the JSON output. */
+ if (nr_pids)
+ jw_array_string(jw, pe32.szExeFile);
+
+ /* Check for cycle in snapshot. (Yes, it happened.) */
+ for (k = 0; k < nr_pids; k++)
+ if (pid == pid_list[k]) {
+ jw_array_string(jw, "(cycle)");
+ return;
+ }
+
+ if (nr_pids == NR_PIDS_LIMIT) {
+ jw_array_string(jw, "(truncated)");
+ return;
+ }
+
+ pid_list[nr_pids++] = pid;
+
+ pid = pe32.th32ParentProcessID;
+ }
+}
+
+/*
+ * Emit JSON data for the current and parent processes. Individual
+ * trace2 targets can decide how to actually print it.
+ */
+static void get_ancestry(void)
+{
+ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+
+ if (hSnapshot != INVALID_HANDLE_VALUE) {
+ struct json_writer jw = JSON_WRITER_INIT;
+
+ jw_array_begin(&jw, 0);
+ get_processes(&jw, hSnapshot);
+ jw_end(&jw);
+
+ trace2_data_json("process", the_repository, "windows/ancestry",
+ &jw);
+
+ jw_release(&jw);
+ CloseHandle(hSnapshot);
+ }
+}
+
+/*
+ * Is a debugger attached to the current process?
+ *
+ * This will catch debug runs (where the debugger started the process).
+ * This is the normal case. Since this code is called during our startup,
+ * it will not report instances where a debugger is attached dynamically
+ * to a running git process, but that is relatively rare.
+ */
+static void get_is_being_debugged(void)
+{
+ if (IsDebuggerPresent())
+ trace2_data_intmax("process", the_repository,
+ "windows/debugger_present", 1);
+}
+
+void trace2_collect_process_info(void)
+{
+ if (!trace2_is_enabled())
+ return;
+
+ get_is_being_debugged();
+ get_ancestry();
+}
diff --git a/config.c b/config.c
index 24ad1a9..0f0cdd8 100644
--- a/config.c
+++ b/config.c
@@ -1445,7 +1445,9 @@ int git_default_config(const char *var, const char *value, void *cb)
if (starts_with(var, "core."))
return git_default_core_config(var, value, cb);
- if (starts_with(var, "user."))
+ if (starts_with(var, "user.") ||
+ starts_with(var, "author.") ||
+ starts_with(var, "committer."))
return git_ident_config(var, value, cb);
if (starts_with(var, "i18n."))
@@ -2655,6 +2657,8 @@ int git_config_set_gently(const char *key, const char *value)
void git_config_set(const char *key, const char *value)
{
git_config_set_multivar(key, value, NULL, 0);
+
+ trace2_cmd_set_config(key, value);
}
/*
diff --git a/config.mak.dev b/config.mak.dev
index 7354fe1..bf1f3fc 100644
--- a/config.mak.dev
+++ b/config.mak.dev
@@ -1,41 +1,41 @@
ifeq ($(filter no-error,$(DEVOPTS)),)
-CFLAGS += -Werror
+DEVELOPER_CFLAGS += -Werror
endif
ifneq ($(filter pedantic,$(DEVOPTS)),)
-CFLAGS += -pedantic
+DEVELOPER_CFLAGS += -pedantic
# don't warn for each N_ use
-CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
-endif
-CFLAGS += -Wall
-CFLAGS += -Wdeclaration-after-statement
-CFLAGS += -Wformat-security
-CFLAGS += -Wno-format-zero-length
-CFLAGS += -Wold-style-definition
-CFLAGS += -Woverflow
-CFLAGS += -Wpointer-arith
-CFLAGS += -Wstrict-prototypes
-CFLAGS += -Wunused
-CFLAGS += -Wvla
+DEVELOPER_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
+endif
+DEVELOPER_CFLAGS += -Wall
+DEVELOPER_CFLAGS += -Wdeclaration-after-statement
+DEVELOPER_CFLAGS += -Wformat-security
+DEVELOPER_CFLAGS += -Wno-format-zero-length
+DEVELOPER_CFLAGS += -Wold-style-definition
+DEVELOPER_CFLAGS += -Woverflow
+DEVELOPER_CFLAGS += -Wpointer-arith
+DEVELOPER_CFLAGS += -Wstrict-prototypes
+DEVELOPER_CFLAGS += -Wunused
+DEVELOPER_CFLAGS += -Wvla
ifndef COMPILER_FEATURES
COMPILER_FEATURES := $(shell ./detect-compiler $(CC))
endif
ifneq ($(filter clang4,$(COMPILER_FEATURES)),)
-CFLAGS += -Wtautological-constant-out-of-range-compare
+DEVELOPER_CFLAGS += -Wtautological-constant-out-of-range-compare
endif
ifneq ($(or $(filter gcc6,$(COMPILER_FEATURES)),$(filter clang4,$(COMPILER_FEATURES))),)
-CFLAGS += -Wextra
+DEVELOPER_CFLAGS += -Wextra
# if a function is public, there should be a prototype and the right
# header file should be included. If not, it should be static.
-CFLAGS += -Wmissing-prototypes
+DEVELOPER_CFLAGS += -Wmissing-prototypes
ifeq ($(filter extra-all,$(DEVOPTS)),)
# These are disabled because we have these all over the place.
-CFLAGS += -Wno-empty-body
-CFLAGS += -Wno-missing-field-initializers
-CFLAGS += -Wno-sign-compare
-CFLAGS += -Wno-unused-parameter
+DEVELOPER_CFLAGS += -Wno-empty-body
+DEVELOPER_CFLAGS += -Wno-missing-field-initializers
+DEVELOPER_CFLAGS += -Wno-sign-compare
+DEVELOPER_CFLAGS += -Wno-unused-parameter
endif
endif
@@ -43,6 +43,6 @@ endif
# not worth fixing since newer compilers correctly stop complaining
ifneq ($(filter gcc4,$(COMPILER_FEATURES)),)
ifeq ($(filter gcc5,$(COMPILER_FEATURES)),)
-CFLAGS += -Wno-uninitialized
+DEVELOPER_CFLAGS += -Wno-uninitialized
endif
endif
diff --git a/config.mak.uname b/config.mak.uname
index b37fa84..41e85fa 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -393,6 +393,7 @@ ifeq ($(uname_S),Windows)
BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
+ compat/win32/trace2_win32_process_info.o \
compat/win32/dirent.o
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE
@@ -529,7 +530,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_STRTOUMAX = YesPlease
NO_MKDTEMP = YesPlease
NO_SVN_TESTS = YesPlease
- NO_PERL_MAKEMAKER = YesPlease
RUNTIME_PREFIX = YesPlease
HAVE_WPGMPTR = YesWeDo
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
@@ -546,6 +546,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
COMPAT_OBJS += compat/mingw.o compat/winansi.o \
+ compat/win32/trace2_win32_process_info.o \
compat/win32/path-utils.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/dirent.o
@@ -567,7 +568,7 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
NO_GETTEXT = YesPlease
COMPAT_CLFAGS += -D__USE_MINGW_ACCESS
else
- ifeq ($(shell expr "$(uname_R)" : '2\.'),2)
+ ifneq ($(shell expr "$(uname_R)" : '1\.'),2)
# MSys2
prefix = /usr/
ifeq (MINGW32,$(MSYSTEM))
diff --git a/connect.c b/connect.c
index 4813f00..2778481 100644
--- a/connect.c
+++ b/connect.c
@@ -1248,6 +1248,7 @@ struct child_process *git_connect(int fd[2], const char *url,
conn = NULL;
} else if (protocol == PROTO_GIT) {
conn = git_connect_git(fd, hostandport, path, prog, version, flags);
+ conn->trace2_child_class = "transport/git";
} else {
struct strbuf cmd = STRBUF_INIT;
const char *const *var;
@@ -1290,9 +1291,11 @@ struct child_process *git_connect(int fd[2], const char *url,
strbuf_release(&cmd);
return NULL;
}
+ conn->trace2_child_class = "transport/ssh";
fill_ssh_args(conn, ssh_host, port, version, flags);
} else {
transport_check_allowed("file");
+ conn->trace2_child_class = "transport/file";
if (version > 0) {
argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
version);
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 499e56f..976e4a6 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -853,6 +853,11 @@ __git_compute_merge_strategies ()
__git_merge_strategies=$(__git_list_merge_strategies)
}
+__git_merge_strategy_options="ours theirs subtree subtree= patience
+ histogram diff-algorithm= ignore-space-change ignore-all-space
+ ignore-space-at-eol renormalize no-renormalize no-renames
+ find-renames find-renames= rename-threshold="
+
__git_complete_revlist_file ()
{
local dequoted_word pfx ls ref cur_="$cur"
@@ -996,12 +1001,21 @@ __git_complete_strategy ()
-s|--strategy)
__gitcomp "$__git_merge_strategies"
return 0
+ ;;
+ -X)
+ __gitcomp "$__git_merge_strategy_options"
+ return 0
+ ;;
esac
case "$cur" in
--strategy=*)
__gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
return 0
;;
+ --strategy-option=*)
+ __gitcomp "$__git_merge_strategy_options" "" "${cur##--strategy-option=}"
+ return 0
+ ;;
esac
return 1
}
@@ -1163,6 +1177,7 @@ __git_count_arguments ()
}
__git_whitespacelist="nowarn warn error error-all fix"
+__git_patchformat="mbox stgit stgit-series hg mboxrd"
__git_am_inprogress_options="--skip --continue --resolved --abort --quit --show-current-patch"
_git_am ()
@@ -1177,6 +1192,10 @@ _git_am ()
__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
return
;;
+ --patch-format=*)
+ __gitcomp "$__git_patchformat" "" "${cur##--patch-format=}"
+ return
+ ;;
--*)
__gitcomp_builtin am "" \
"$__git_am_inprogress_options"
@@ -1200,6 +1219,10 @@ _git_apply ()
_git_add ()
{
case "$cur" in
+ --chmod=*)
+ __gitcomp "+x -x" "" "${cur##--chmod=}"
+ return
+ ;;
--*)
__gitcomp_builtin add
return
@@ -1260,6 +1283,8 @@ _git_bisect ()
esac
}
+__git_ref_fieldlist="refname objecttype objectsize objectname upstream push HEAD symref"
+
_git_branch ()
{
local i c=1 only_local_ref="n" has_r="n"
@@ -1343,6 +1368,9 @@ _git_cherry_pick ()
__gitcomp "$__git_cherry_pick_inprogress_options"
return
fi
+
+ __git_complete_strategy && return
+
case "$cur" in
--*)
__gitcomp_builtin cherry-pick "" \
@@ -1506,6 +1534,10 @@ _git_fetch ()
__gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
return
;;
+ --filter=*)
+ __gitcomp "blob:none blob:limit= sparse:oid= sparse:path=" "" "${cur##--filter=}"
+ return
+ ;;
--*)
__gitcomp_builtin fetch
return
@@ -1702,8 +1734,8 @@ __git_log_shortlog_options="
--all-match --invert-grep
"
-__git_log_pretty_formats="oneline short medium full fuller email raw format:"
-__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
+__git_log_pretty_formats="oneline short medium full fuller email raw format: mboxrd"
+__git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default raw unix format:"
_git_log ()
{
@@ -2221,7 +2253,7 @@ _git_config ()
return
;;
diff.submodule)
- __gitcomp "log short"
+ __gitcomp "$__git_diff_submodule_formats"
return
;;
help.format)
@@ -2388,6 +2420,10 @@ _git_remote ()
_git_replace ()
{
case "$cur" in
+ --format=*)
+ __gitcomp "short medium long" "" "${cur##--format=}"
+ return
+ ;;
--*)
__gitcomp_builtin replace
return
@@ -2429,6 +2465,7 @@ _git_revert ()
__gitcomp "$__git_revert_inprogress_options"
return
fi
+ __git_complete_strategy && return
case "$cur" in
--*)
__gitcomp_builtin revert "" \
@@ -2573,7 +2610,7 @@ _git_submodule ()
{
__git_has_doubledash && return
- local subcommands="add status init deinit update summary foreach sync"
+ local subcommands="add status init deinit update summary foreach sync absorbgitdirs"
local subcommand="$(__git_find_on_cmdline "$subcommands")"
if [ -z "$subcommand" ]; then
case "$cur" in
diff --git a/date.c b/date.c
index 9c5870e..8126146 100644
--- a/date.c
+++ b/date.c
@@ -921,6 +921,10 @@ static enum date_mode_type parse_date_type(const char *format, const char **end)
return DATE_UNIX;
if (skip_prefix(format, "format", end))
return DATE_STRFTIME;
+ /*
+ * Please update $__git_log_date_formats in
+ * git-completion.bash when you add new formats.
+ */
die("unknown date format %s", format);
}
diff --git a/diff-lib.c b/diff-lib.c
index 23c8d35..a838c21 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -531,7 +531,7 @@ int run_diff_index(struct rev_info *revs, int cached)
exit(128);
diff_set_mnemonic_prefix(&revs->diffopt, "c/", cached ? "i/" : "w/");
- diffcore_fix_diff_index(&revs->diffopt);
+ diffcore_fix_diff_index();
diffcore_std(&revs->diffopt);
diff_flush(&revs->diffopt);
trace_performance_leave("diff-index");
diff --git a/diff-no-index.c b/diff-no-index.c
index 9414e92..6001bae 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -233,8 +233,7 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
}
}
-void diff_no_index(struct repository *r,
- struct rev_info *revs,
+void diff_no_index(struct rev_info *revs,
int argc, const char **argv)
{
int i;
@@ -242,11 +241,6 @@ void diff_no_index(struct repository *r,
struct strbuf replacement = STRBUF_INIT;
const char *prefix = revs->prefix;
- /*
- * FIXME: --no-index should not look at index and we should be
- * able to pass NULL repo. Maybe later.
- */
- repo_diff_setup(r, &revs->diffopt);
for (i = 1; i < argc - 2; ) {
int j;
if (!strcmp(argv[i], "--no-index"))
diff --git a/diff.c b/diff.c
index 5306c48..ec5c095 100644
--- a/diff.c
+++ b/diff.c
@@ -23,6 +23,7 @@
#include "argv-array.h"
#include "graph.h"
#include "packfile.h"
+#include "parse-options.h"
#include "help.h"
#ifdef NO_FAST_WORKING_DIRECTORY
@@ -103,11 +104,6 @@ static const char *color_diff_slots[] = {
[DIFF_FILE_NEW_BOLD] = "newBold",
};
-static NORETURN void die_want_option(const char *option_name)
-{
- die(_("option '%s' requires a value"), option_name);
-}
-
define_list_config_array_extra(color_diff_slots, {"plain"});
static int parse_diff_color_slot(const char *var)
@@ -178,6 +174,10 @@ static int parse_submodule_params(struct diff_options *options, const char *valu
options->submodule_format = DIFF_SUBMODULE_SHORT;
else if (!strcmp(value, "diff"))
options->submodule_format = DIFF_SUBMODULE_INLINE_DIFF;
+ /*
+ * Please update $__git_diff_submodule_formats in
+ * git-completion.bash when you add new formats.
+ */
else
return -1;
return 0;
@@ -204,6 +204,10 @@ long parse_algorithm_value(const char *value)
return XDF_PATIENCE_DIFF;
else if (!strcasecmp(value, "histogram"))
return XDF_HISTOGRAM_DIFF;
+ /*
+ * Please update $__git_diff_algorithms in git-completion.bash
+ * when you add new algorithms.
+ */
return -1;
}
@@ -1613,8 +1617,7 @@ static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line
return ws_blank_line(line, len, ecbdata->ws_rule);
}
-static void emit_add_line(const char *reset,
- struct emit_callback *ecbdata,
+static void emit_add_line(struct emit_callback *ecbdata,
const char *line, int len)
{
unsigned flags = WSEH_NEW | ecbdata->ws_rule;
@@ -1624,16 +1627,14 @@ static void emit_add_line(const char *reset,
emit_diff_symbol(ecbdata->opt, DIFF_SYMBOL_PLUS, line, len, flags);
}
-static void emit_del_line(const char *reset,
- struct emit_callback *ecbdata,
+static void emit_del_line(struct emit_callback *ecbdata,
const char *line, int len)
{
unsigned flags = WSEH_OLD | ecbdata->ws_rule;
emit_diff_symbol(ecbdata->opt, DIFF_SYMBOL_MINUS, line, len, flags);
}
-static void emit_context_line(const char *reset,
- struct emit_callback *ecbdata,
+static void emit_context_line(struct emit_callback *ecbdata,
const char *line, int len)
{
unsigned flags = WSEH_CONTEXT | ecbdata->ws_rule;
@@ -1742,7 +1743,6 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
int prefix, const char *data, int size)
{
const char *endp = NULL;
- const char *reset = diff_get_color(ecb->color_diff, DIFF_RESET);
while (0 < size) {
int len;
@@ -1751,10 +1751,10 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
len = endp ? (endp - data + 1) : size;
if (prefix != '+') {
ecb->lno_in_preimage++;
- emit_del_line(reset, ecb, data, len);
+ emit_del_line(ecb, data, len);
} else {
ecb->lno_in_postimage++;
- emit_add_line(reset, ecb, data, len);
+ emit_add_line(ecb, data, len);
}
size -= len;
data += len;
@@ -2291,7 +2291,7 @@ const char *diff_line_prefix(struct diff_options *opt)
return msgbuf->buf;
}
-static unsigned long sane_truncate_line(struct emit_callback *ecb, char *line, unsigned long len)
+static unsigned long sane_truncate_line(char *line, unsigned long len)
{
const char *cp;
unsigned long allot;
@@ -2325,7 +2325,6 @@ static void find_lno(const char *line, struct emit_callback *ecbdata)
static void fn_out_consume(void *priv, char *line, unsigned long len)
{
struct emit_callback *ecbdata = priv;
- const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
struct diff_options *o = ecbdata->opt;
o->found_changes = 1;
@@ -2356,7 +2355,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
if (line[0] == '@') {
if (ecbdata->diff_words)
diff_words_flush(ecbdata);
- len = sane_truncate_line(ecbdata, line, len);
+ len = sane_truncate_line(line, len);
find_lno(line, ecbdata);
emit_hunk_header(ecbdata, line, len);
return;
@@ -2392,16 +2391,16 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
switch (line[0]) {
case '+':
ecbdata->lno_in_postimage++;
- emit_add_line(reset, ecbdata, line + 1, len - 1);
+ emit_add_line(ecbdata, line + 1, len - 1);
break;
case '-':
ecbdata->lno_in_preimage++;
- emit_del_line(reset, ecbdata, line + 1, len - 1);
+ emit_del_line(ecbdata, line + 1, len - 1);
break;
case ' ':
ecbdata->lno_in_postimage++;
ecbdata->lno_in_preimage++;
- emit_context_line(reset, ecbdata, line + 1, len - 1);
+ emit_context_line(ecbdata, line + 1, len - 1);
break;
default:
/* incomplete line at the end */
@@ -4183,7 +4182,6 @@ static void run_external_diff(const char *pgm,
struct diff_filespec *one,
struct diff_filespec *two,
const char *xfrm_msg,
- int complete_rewrite,
struct diff_options *o)
{
struct argv_array argv = ARGV_ARRAY_INIT;
@@ -4341,8 +4339,7 @@ static void run_diff_cmd(const char *pgm,
}
if (pgm) {
- run_external_diff(pgm, name, other, one, two, xfrm_msg,
- complete_rewrite, o);
+ run_external_diff(pgm, name, other, one, two, xfrm_msg, o);
return;
}
if (one && two)
@@ -4491,6 +4488,8 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)
builtin_checkdiff(name, other, attr_path, p->one, p->two, o);
}
+static void prep_parse_options(struct diff_options *options);
+
void repo_diff_setup(struct repository *r, struct diff_options *options)
{
memcpy(options, &default_diff_options, sizeof(*options));
@@ -4532,6 +4531,8 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
options->color_moved = diff_color_moved_default;
options->color_moved_ws_handling = diff_color_moved_ws_default;
+
+ prep_parse_options(options);
}
void diff_setup_done(struct diff_options *options)
@@ -4635,6 +4636,8 @@ void diff_setup_done(struct diff_options *options)
if (!options->use_color || external_diff())
options->color_moved = 0;
+
+ FREE_AND_NULL(options->parseopts);
}
static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
@@ -4681,8 +4684,6 @@ static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *va
return 1;
}
-static int diff_scoreopt_parse(const char *opt);
-
static inline int short_opt(char opt, const char **argv,
const char **optarg)
{
@@ -4720,77 +4721,56 @@ int parse_long_opt(const char *opt, const char **argv,
return 2;
}
-static int stat_opt(struct diff_options *options, const char **av)
+static int diff_opt_stat(const struct option *opt, const char *value, int unset)
{
- const char *arg = av[0];
- char *end;
+ struct diff_options *options = opt->value;
int width = options->stat_width;
int name_width = options->stat_name_width;
int graph_width = options->stat_graph_width;
int count = options->stat_count;
- int argcount = 1;
+ char *end;
- if (!skip_prefix(arg, "--stat", &arg))
- BUG("stat option does not begin with --stat: %s", arg);
- end = (char *)arg;
+ BUG_ON_OPT_NEG(unset);
- switch (*arg) {
- case '-':
- if (skip_prefix(arg, "-width", &arg)) {
- if (*arg == '=')
- width = strtoul(arg + 1, &end, 10);
- else if (!*arg && !av[1])
- die_want_option("--stat-width");
- else if (!*arg) {
- width = strtoul(av[1], &end, 10);
- argcount = 2;
- }
- } else if (skip_prefix(arg, "-name-width", &arg)) {
- if (*arg == '=')
- name_width = strtoul(arg + 1, &end, 10);
- else if (!*arg && !av[1])
- die_want_option("--stat-name-width");
- else if (!*arg) {
- name_width = strtoul(av[1], &end, 10);
- argcount = 2;
- }
- } else if (skip_prefix(arg, "-graph-width", &arg)) {
- if (*arg == '=')
- graph_width = strtoul(arg + 1, &end, 10);
- else if (!*arg && !av[1])
- die_want_option("--stat-graph-width");
- else if (!*arg) {
- graph_width = strtoul(av[1], &end, 10);
- argcount = 2;
- }
- } else if (skip_prefix(arg, "-count", &arg)) {
- if (*arg == '=')
- count = strtoul(arg + 1, &end, 10);
- else if (!*arg && !av[1])
- die_want_option("--stat-count");
- else if (!*arg) {
- count = strtoul(av[1], &end, 10);
- argcount = 2;
- }
+ if (!strcmp(opt->long_name, "stat")) {
+ if (value) {
+ width = strtoul(value, &end, 10);
+ if (*end == ',')
+ name_width = strtoul(end+1, &end, 10);
+ if (*end == ',')
+ count = strtoul(end+1, &end, 10);
+ if (*end)
+ return error(_("invalid --stat value: %s"), value);
}
- break;
- case '=':
- width = strtoul(arg+1, &end, 10);
- if (*end == ',')
- name_width = strtoul(end+1, &end, 10);
- if (*end == ',')
- count = strtoul(end+1, &end, 10);
- }
+ } else if (!strcmp(opt->long_name, "stat-width")) {
+ width = strtoul(value, &end, 10);
+ if (*end)
+ return error(_("%s expects a numerical value"),
+ opt->long_name);
+ } else if (!strcmp(opt->long_name, "stat-name-width")) {
+ name_width = strtoul(value, &end, 10);
+ if (*end)
+ return error(_("%s expects a numerical value"),
+ opt->long_name);
+ } else if (!strcmp(opt->long_name, "stat-graph-width")) {
+ graph_width = strtoul(value, &end, 10);
+ if (*end)
+ return error(_("%s expects a numerical value"),
+ opt->long_name);
+ } else if (!strcmp(opt->long_name, "stat-count")) {
+ count = strtoul(value, &end, 10);
+ if (*end)
+ return error(_("%s expects a numerical value"),
+ opt->long_name);
+ } else
+ BUG("%s should not get here", opt->long_name);
- /* Important! This checks all the error cases! */
- if (*end)
- return 0;
options->output_format |= DIFF_FORMAT_DIFFSTAT;
options->stat_name_width = name_width;
options->stat_graph_width = graph_width;
options->stat_width = width;
options->stat_count = count;
- return argcount;
+ return 0;
}
static int parse_dirstat_opt(struct diff_options *options, const char *params)
@@ -4926,6 +4906,308 @@ static int parse_objfind_opt(struct diff_options *opt, const char *arg)
return 1;
}
+static int diff_opt_break_rewrites(const struct option *opt,
+ const char *arg, int unset)
+{
+ int *break_opt = opt->value;
+ int opt1, opt2;
+
+ BUG_ON_OPT_NEG(unset);
+ if (!arg)
+ arg = "";
+ opt1 = parse_rename_score(&arg);
+ if (*arg == 0)
+ opt2 = 0;
+ else if (*arg != '/')
+ return error(_("%s expects <n>/<m> form"), opt->long_name);
+ else {
+ arg++;
+ opt2 = parse_rename_score(&arg);
+ }
+ if (*arg != 0)
+ return error(_("%s expects <n>/<m> form"), opt->long_name);
+ *break_opt = opt1 | (opt2 << 16);
+ return 0;
+}
+
+static int diff_opt_char(const struct option *opt,
+ const char *arg, int unset)
+{
+ char *value = opt->value;
+
+ BUG_ON_OPT_NEG(unset);
+ if (arg[1])
+ return error(_("%s expects a character, got '%s'"),
+ opt->long_name, arg);
+ *value = arg[0];
+ return 0;
+}
+
+static int diff_opt_compact_summary(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+
+ BUG_ON_OPT_ARG(arg);
+ if (unset) {
+ options->flags.stat_with_summary = 0;
+ } else {
+ options->flags.stat_with_summary = 1;
+ options->output_format |= DIFF_FORMAT_DIFFSTAT;
+ }
+ return 0;
+}
+
+static int diff_opt_dirstat(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+
+ BUG_ON_OPT_NEG(unset);
+ if (!strcmp(opt->long_name, "cumulative")) {
+ if (arg)
+ BUG("how come --cumulative take a value?");
+ arg = "cumulative";
+ } else if (!strcmp(opt->long_name, "dirstat-by-file"))
+ parse_dirstat_opt(options, "files");
+ parse_dirstat_opt(options, arg ? arg : "");
+ return 0;
+}
+
+static int diff_opt_find_copies(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+
+ BUG_ON_OPT_NEG(unset);
+ if (!arg)
+ arg = "";
+ options->rename_score = parse_rename_score(&arg);
+ if (*arg != 0)
+ return error(_("invalid argument to %s"), opt->long_name);
+
+ if (options->detect_rename == DIFF_DETECT_COPY)
+ options->flags.find_copies_harder = 1;
+ else
+ options->detect_rename = DIFF_DETECT_COPY;
+
+ return 0;
+}
+
+static int diff_opt_find_renames(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+
+ BUG_ON_OPT_NEG(unset);
+ if (!arg)
+ arg = "";
+ options->rename_score = parse_rename_score(&arg);
+ if (*arg != 0)
+ return error(_("invalid argument to %s"), opt->long_name);
+
+ options->detect_rename = DIFF_DETECT_RENAME;
+ return 0;
+}
+
+static enum parse_opt_result diff_opt_output(struct parse_opt_ctx_t *ctx,
+ const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+ char *path;
+
+ BUG_ON_OPT_NEG(unset);
+ path = prefix_filename(ctx->prefix, arg);
+ options->file = xfopen(path, "w");
+ options->close_file = 1;
+ if (options->use_color != GIT_COLOR_ALWAYS)
+ options->use_color = GIT_COLOR_NEVER;
+ free(path);
+ return 0;
+}
+
+static int diff_opt_relative(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+
+ BUG_ON_OPT_NEG(unset);
+ options->flags.relative_name = 1;
+ if (arg)
+ options->prefix = arg;
+ return 0;
+}
+
+static int diff_opt_unified(const struct option *opt,
+ const char *arg, int unset)
+{
+ struct diff_options *options = opt->value;
+ char *s;
+
+ BUG_ON_OPT_NEG(unset);
+
+ options->context = strtol(arg, &s, 10);
+ if (*s)
+ return error(_("%s expects a numerical value"), "--unified");
+ enable_patch_output(&options->output_format);
+
+ return 0;
+}
+
+static void prep_parse_options(struct diff_options *options)
+{
+ struct option parseopts[] = {
+ OPT_GROUP(N_("Diff output format options")),
+ OPT_BITOP('p', "patch", &options->output_format,
+ N_("generate patch"),
+ DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
+ OPT_BIT_F('s', "no-patch", &options->output_format,
+ N_("suppress diff output"),
+ DIFF_FORMAT_NO_OUTPUT, PARSE_OPT_NONEG),
+ OPT_BITOP('u', NULL, &options->output_format,
+ N_("generate patch"),
+ DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
+ OPT_CALLBACK_F('U', "unified", options, N_("<n>"),
+ N_("generate diffs with <n> lines context"),
+ PARSE_OPT_NONEG, diff_opt_unified),
+ OPT_BOOL('W', "function-context", &options->flags.funccontext,
+ N_("generate diffs with <n> lines context")),
+ OPT_BIT_F(0, "raw", &options->output_format,
+ N_("generate the diff in raw format"),
+ DIFF_FORMAT_RAW, PARSE_OPT_NONEG),
+ OPT_BITOP(0, "patch-with-raw", &options->output_format,
+ N_("synonym for '-p --raw'"),
+ DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW,
+ DIFF_FORMAT_NO_OUTPUT),
+ OPT_BITOP(0, "patch-with-stat", &options->output_format,
+ N_("synonym for '-p --stat'"),
+ DIFF_FORMAT_PATCH | DIFF_FORMAT_DIFFSTAT,
+ DIFF_FORMAT_NO_OUTPUT),
+ OPT_BIT_F(0, "numstat", &options->output_format,
+ N_("machine friendly --stat"),
+ DIFF_FORMAT_NUMSTAT, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "shortstat", &options->output_format,
+ N_("output only the last line of --stat"),
+ DIFF_FORMAT_SHORTSTAT, PARSE_OPT_NONEG),
+ OPT_CALLBACK_F('X', "dirstat", options, N_("<param1,param2>..."),
+ N_("output the distribution of relative amount of changes for each sub-directory"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_dirstat),
+ OPT_CALLBACK_F(0, "cumulative", options, NULL,
+ N_("synonym for --dirstat=cumulative"),
+ PARSE_OPT_NONEG | PARSE_OPT_NOARG,
+ diff_opt_dirstat),
+ OPT_CALLBACK_F(0, "dirstat-by-file", options, N_("<param1,param2>..."),
+ N_("synonym for --dirstat=files,param1,param2..."),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_dirstat),
+ OPT_BIT_F(0, "check", &options->output_format,
+ N_("warn if changes introduce conflict markers or whitespace errors"),
+ DIFF_FORMAT_CHECKDIFF, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "summary", &options->output_format,
+ N_("condensed summary such as creations, renames and mode changes"),
+ DIFF_FORMAT_SUMMARY, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "name-only", &options->output_format,
+ N_("show only names of changed files"),
+ DIFF_FORMAT_NAME, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "name-status", &options->output_format,
+ N_("show only names and status of changed files"),
+ DIFF_FORMAT_NAME_STATUS, PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "stat", options, N_("<width>[,<name-width>[,<count>]]"),
+ N_("generate diffstat"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_stat),
+ OPT_CALLBACK_F(0, "stat-width", options, N_("<width>"),
+ N_("generate diffstat with a given width"),
+ PARSE_OPT_NONEG, diff_opt_stat),
+ OPT_CALLBACK_F(0, "stat-name-width", options, N_("<width>"),
+ N_("generate diffstat with a given name width"),
+ PARSE_OPT_NONEG, diff_opt_stat),
+ OPT_CALLBACK_F(0, "stat-graph-width", options, N_("<width>"),
+ N_("generate diffstat with a given graph width"),
+ PARSE_OPT_NONEG, diff_opt_stat),
+ OPT_CALLBACK_F(0, "stat-count", options, N_("<count>"),
+ N_("generate diffstat with limited lines"),
+ PARSE_OPT_NONEG, diff_opt_stat),
+ OPT_CALLBACK_F(0, "compact-summary", options, NULL,
+ N_("generate compact summary in diffstat"),
+ PARSE_OPT_NOARG, diff_opt_compact_summary),
+ OPT_CALLBACK_F(0, "output-indicator-new",
+ &options->output_indicators[OUTPUT_INDICATOR_NEW],
+ N_("<char>"),
+ N_("specify the character to indicate a new line instead of '+'"),
+ PARSE_OPT_NONEG, diff_opt_char),
+ OPT_CALLBACK_F(0, "output-indicator-old",
+ &options->output_indicators[OUTPUT_INDICATOR_OLD],
+ N_("<char>"),
+ N_("specify the character to indicate an old line instead of '-'"),
+ PARSE_OPT_NONEG, diff_opt_char),
+ OPT_CALLBACK_F(0, "output-indicator-context",
+ &options->output_indicators[OUTPUT_INDICATOR_CONTEXT],
+ N_("<char>"),
+ N_("specify the character to indicate a context instead of ' '"),
+ PARSE_OPT_NONEG, diff_opt_char),
+
+ OPT_GROUP(N_("Diff rename options")),
+ OPT_CALLBACK_F('B', "break-rewrites", &options->break_opt, N_("<n>[/<m>]"),
+ N_("break complete rewrite changes into pairs of delete and create"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_break_rewrites),
+ OPT_CALLBACK_F('M', "find-renames", options, N_("<n>"),
+ N_("detect renames"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_find_renames),
+ OPT_SET_INT_F('D', "irreversible-delete", &options->irreversible_delete,
+ N_("omit the preimage for deletes"),
+ 1, PARSE_OPT_NONEG),
+ OPT_CALLBACK_F('C', "find-copies", options, N_("<n>"),
+ N_("detect copies"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_find_copies),
+ OPT_BOOL(0, "find-copies-harder", &options->flags.find_copies_harder,
+ N_("use unmodified files as source to find copies")),
+ OPT_SET_INT_F(0, "no-renames", &options->detect_rename,
+ N_("disable rename detection"),
+ 0, PARSE_OPT_NONEG),
+ OPT_BOOL(0, "rename-empty", &options->flags.rename_empty,
+ N_("use empty blobs as rename source")),
+
+ OPT_GROUP(N_("Diff algorithm options")),
+ OPT_BIT(0, "minimal", &options->xdl_opts,
+ N_("produce the smallest possible diff"),
+ XDF_NEED_MINIMAL),
+ OPT_BIT_F('w', "ignore-all-space", &options->xdl_opts,
+ N_("ignore whitespace when comparing lines"),
+ XDF_IGNORE_WHITESPACE, PARSE_OPT_NONEG),
+ OPT_BIT_F('b', "ignore-space-change", &options->xdl_opts,
+ N_("ignore changes in amount of whitespace"),
+ XDF_IGNORE_WHITESPACE_CHANGE, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "ignore-space-at-eol", &options->xdl_opts,
+ N_("ignore changes in whitespace at EOL"),
+ XDF_IGNORE_WHITESPACE_AT_EOL, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "ignore-cr-at-eol", &options->xdl_opts,
+ N_("ignore carrier-return at the end of line"),
+ XDF_IGNORE_CR_AT_EOL, PARSE_OPT_NONEG),
+ OPT_BIT_F(0, "ignore-blank-lines", &options->xdl_opts,
+ N_("ignore changes whose lines are all blank"),
+ XDF_IGNORE_BLANK_LINES, PARSE_OPT_NONEG),
+
+ OPT_GROUP(N_("Diff other options")),
+ OPT_CALLBACK_F(0, "relative", options, N_("<prefix>"),
+ N_("when run from subdir, exclude changes outside and show relative paths"),
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
+ diff_opt_relative),
+ { OPTION_CALLBACK, 0, "output", options, N_("<file>"),
+ N_("Output to a specific file"),
+ PARSE_OPT_NONEG, NULL, 0, diff_opt_output },
+
+ OPT_END()
+ };
+
+ ALLOC_ARRAY(options->parseopts, ARRAY_SIZE(parseopts));
+ memcpy(options->parseopts, parseopts, sizeof(parseopts));
+}
+
int diff_opt_parse(struct diff_options *options,
const char **av, int ac, const char *prefix)
{
@@ -4936,107 +5218,18 @@ int diff_opt_parse(struct diff_options *options,
if (!prefix)
prefix = "";
- /* Output format options */
- if (!strcmp(arg, "-p") || !strcmp(arg, "-u") || !strcmp(arg, "--patch")
- || opt_arg(arg, 'U', "unified", &options->context))
- enable_patch_output(&options->output_format);
- else if (!strcmp(arg, "--raw"))
- options->output_format |= DIFF_FORMAT_RAW;
- else if (!strcmp(arg, "--patch-with-raw")) {
- enable_patch_output(&options->output_format);
- options->output_format |= DIFF_FORMAT_RAW;
- } else if (!strcmp(arg, "--numstat"))
- options->output_format |= DIFF_FORMAT_NUMSTAT;
- else if (!strcmp(arg, "--shortstat"))
- options->output_format |= DIFF_FORMAT_SHORTSTAT;
- else if (skip_prefix(arg, "-X", &arg) ||
- skip_to_optional_arg(arg, "--dirstat", &arg))
- return parse_dirstat_opt(options, arg);
- else if (!strcmp(arg, "--cumulative"))
- return parse_dirstat_opt(options, "cumulative");
- else if (skip_to_optional_arg(arg, "--dirstat-by-file", &arg)) {
- parse_dirstat_opt(options, "files");
- return parse_dirstat_opt(options, arg);
- }
- else if (!strcmp(arg, "--check"))
- options->output_format |= DIFF_FORMAT_CHECKDIFF;
- else if (!strcmp(arg, "--summary"))
- options->output_format |= DIFF_FORMAT_SUMMARY;
- else if (!strcmp(arg, "--patch-with-stat")) {
- enable_patch_output(&options->output_format);
- options->output_format |= DIFF_FORMAT_DIFFSTAT;
- } else if (!strcmp(arg, "--name-only"))
- options->output_format |= DIFF_FORMAT_NAME;
- else if (!strcmp(arg, "--name-status"))
- options->output_format |= DIFF_FORMAT_NAME_STATUS;
- else if (!strcmp(arg, "-s") || !strcmp(arg, "--no-patch"))
- options->output_format |= DIFF_FORMAT_NO_OUTPUT;
- else if (starts_with(arg, "--stat"))
- /* --stat, --stat-width, --stat-name-width, or --stat-count */
- return stat_opt(options, av);
- else if (!strcmp(arg, "--compact-summary")) {
- options->flags.stat_with_summary = 1;
- options->output_format |= DIFF_FORMAT_DIFFSTAT;
- } else if (!strcmp(arg, "--no-compact-summary"))
- options->flags.stat_with_summary = 0;
- else if (skip_prefix(arg, "--output-indicator-new=", &arg))
- options->output_indicators[OUTPUT_INDICATOR_NEW] = arg[0];
- else if (skip_prefix(arg, "--output-indicator-old=", &arg))
- options->output_indicators[OUTPUT_INDICATOR_OLD] = arg[0];
- else if (skip_prefix(arg, "--output-indicator-context=", &arg))
- options->output_indicators[OUTPUT_INDICATOR_CONTEXT] = arg[0];
-
- /* renames options */
- else if (starts_with(arg, "-B") ||
- skip_to_optional_arg(arg, "--break-rewrites", NULL)) {
- if ((options->break_opt = diff_scoreopt_parse(arg)) == -1)
- return error("invalid argument to -B: %s", arg+2);
- }
- else if (starts_with(arg, "-M") ||
- skip_to_optional_arg(arg, "--find-renames", NULL)) {
- if ((options->rename_score = diff_scoreopt_parse(arg)) == -1)
- return error("invalid argument to -M: %s", arg+2);
- options->detect_rename = DIFF_DETECT_RENAME;
- }
- else if (!strcmp(arg, "-D") || !strcmp(arg, "--irreversible-delete")) {
- options->irreversible_delete = 1;
- }
- else if (starts_with(arg, "-C") ||
- skip_to_optional_arg(arg, "--find-copies", NULL)) {
- if (options->detect_rename == DIFF_DETECT_COPY)
- options->flags.find_copies_harder = 1;
- if ((options->rename_score = diff_scoreopt_parse(arg)) == -1)
- return error("invalid argument to -C: %s", arg+2);
- options->detect_rename = DIFF_DETECT_COPY;
- }
- else if (!strcmp(arg, "--no-renames"))
- options->detect_rename = 0;
- else if (!strcmp(arg, "--rename-empty"))
- options->flags.rename_empty = 1;
- else if (!strcmp(arg, "--no-rename-empty"))
- options->flags.rename_empty = 0;
- else if (skip_to_optional_arg_default(arg, "--relative", &arg, NULL)) {
- options->flags.relative_name = 1;
- if (arg)
- options->prefix = arg;
- }
+ ac = parse_options(ac, av, prefix, options->parseopts, NULL,
+ PARSE_OPT_KEEP_DASHDASH |
+ PARSE_OPT_KEEP_UNKNOWN |
+ PARSE_OPT_NO_INTERNAL_HELP |
+ PARSE_OPT_ONE_SHOT |
+ PARSE_OPT_STOP_AT_NON_OPTION);
+
+ if (ac)
+ return ac;
/* xdiff options */
- else if (!strcmp(arg, "--minimal"))
- DIFF_XDL_SET(options, NEED_MINIMAL);
- else if (!strcmp(arg, "--no-minimal"))
- DIFF_XDL_CLR(options, NEED_MINIMAL);
- else if (!strcmp(arg, "-w") || !strcmp(arg, "--ignore-all-space"))
- DIFF_XDL_SET(options, IGNORE_WHITESPACE);
- else if (!strcmp(arg, "-b") || !strcmp(arg, "--ignore-space-change"))
- DIFF_XDL_SET(options, IGNORE_WHITESPACE_CHANGE);
- else if (!strcmp(arg, "--ignore-space-at-eol"))
- DIFF_XDL_SET(options, IGNORE_WHITESPACE_AT_EOL);
- else if (!strcmp(arg, "--ignore-cr-at-eol"))
- DIFF_XDL_SET(options, IGNORE_CR_AT_EOL);
- else if (!strcmp(arg, "--ignore-blank-lines"))
- DIFF_XDL_SET(options, IGNORE_BLANK_LINES);
- else if (!strcmp(arg, "--indent-heuristic"))
+ if (!strcmp(arg, "--indent-heuristic"))
DIFF_XDL_SET(options, INDENT_HEURISTIC);
else if (!strcmp(arg, "--no-indent-heuristic"))
DIFF_XDL_CLR(options, INDENT_HEURISTIC);
@@ -5081,8 +5274,6 @@ int diff_opt_parse(struct diff_options *options,
options->flags.text = 1;
else if (!strcmp(arg, "-R"))
options->flags.reverse_diff = 1;
- else if (!strcmp(arg, "--find-copies-harder"))
- options->flags.find_copies_harder = 1;
else if (!strcmp(arg, "--follow"))
options->flags.follow_renames = 1;
else if (!strcmp(arg, "--no-follow")) {
@@ -5230,21 +5421,7 @@ int diff_opt_parse(struct diff_options *options,
else if (opt_arg(arg, '\0', "inter-hunk-context",
&options->interhunkcontext))
;
- else if (!strcmp(arg, "-W"))
- options->flags.funccontext = 1;
- else if (!strcmp(arg, "--function-context"))
- options->flags.funccontext = 1;
- else if (!strcmp(arg, "--no-function-context"))
- options->flags.funccontext = 0;
- else if ((argcount = parse_long_opt("output", av, &optarg))) {
- char *path = prefix_filename(prefix, optarg);
- options->file = xfopen(path, "w");
- options->close_file = 1;
- if (options->use_color != GIT_COLOR_ALWAYS)
- options->use_color = GIT_COLOR_NEVER;
- free(path);
- return argcount;
- } else
+ else
return 0;
return 1;
}
@@ -5285,47 +5462,6 @@ int parse_rename_score(const char **cp_p)
return (int)((num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale));
}
-static int diff_scoreopt_parse(const char *opt)
-{
- int opt1, opt2, cmd;
-
- if (*opt++ != '-')
- return -1;
- cmd = *opt++;
- if (cmd == '-') {
- /* convert the long-form arguments into short-form versions */
- if (skip_prefix(opt, "break-rewrites", &opt)) {
- if (*opt == 0 || *opt++ == '=')
- cmd = 'B';
- } else if (skip_prefix(opt, "find-copies", &opt)) {
- if (*opt == 0 || *opt++ == '=')
- cmd = 'C';
- } else if (skip_prefix(opt, "find-renames", &opt)) {
- if (*opt == 0 || *opt++ == '=')
- cmd = 'M';
- }
- }
- if (cmd != 'M' && cmd != 'C' && cmd != 'B')
- return -1; /* that is not a -M, -C, or -B option */
-
- opt1 = parse_rename_score(&opt);
- if (cmd != 'B')
- opt2 = 0;
- else {
- if (*opt == 0)
- opt2 = 0;
- else if (*opt != '/')
- return -1; /* we expect -B80/99 or -B80 */
- else {
- opt++;
- opt2 = parse_rename_score(&opt);
- }
- }
- if (*opt != 0)
- return -1;
- return opt1 | (opt2 << 16);
-}
-
struct diff_queue_struct diff_queued_diff;
void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)
@@ -6224,7 +6360,7 @@ static int diffnamecmp(const void *a_, const void *b_)
return strcmp(name_a, name_b);
}
-void diffcore_fix_diff_index(struct diff_options *options)
+void diffcore_fix_diff_index(void)
{
struct diff_queue_struct *q = &diff_queued_diff;
QSORT(q->queue, q->nr, diffnamecmp);
diff --git a/diff.h b/diff.h
index b512d04..c9db982 100644
--- a/diff.h
+++ b/diff.h
@@ -9,16 +9,17 @@
#include "object.h"
#include "oidset.h"
-struct rev_info;
+struct combine_diff_path;
+struct commit;
+struct diff_filespec;
struct diff_options;
struct diff_queue_struct;
-struct strbuf;
-struct diff_filespec;
-struct userdiff_driver;
struct oid_array;
-struct commit;
-struct combine_diff_path;
+struct option;
struct repository;
+struct rev_info;
+struct strbuf;
+struct userdiff_driver;
typedef int (*pathchange_fn_t)(struct diff_options *options,
struct combine_diff_path *path);
@@ -64,39 +65,39 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)
#define DIFF_FLAGS_INIT { 0 }
struct diff_flags {
- unsigned recursive:1;
- unsigned tree_in_recursive:1;
- unsigned binary:1;
- unsigned text:1;
- unsigned full_index:1;
- unsigned silent_on_remove:1;
- unsigned find_copies_harder:1;
- unsigned follow_renames:1;
- unsigned rename_empty:1;
- unsigned has_changes:1;
- unsigned quick:1;
- unsigned no_index:1;
- unsigned allow_external:1;
- unsigned exit_with_status:1;
- unsigned reverse_diff:1;
- unsigned check_failed:1;
- unsigned relative_name:1;
- unsigned ignore_submodules:1;
- unsigned dirstat_cumulative:1;
- unsigned dirstat_by_file:1;
- unsigned allow_textconv:1;
- unsigned textconv_set_via_cmdline:1;
- unsigned diff_from_contents:1;
- unsigned dirty_submodules:1;
- unsigned ignore_untracked_in_submodules:1;
- unsigned ignore_dirty_submodules:1;
- unsigned override_submodule_config:1;
- unsigned dirstat_by_line:1;
- unsigned funccontext:1;
- unsigned default_follow_renames:1;
- unsigned stat_with_summary:1;
- unsigned suppress_diff_headers:1;
- unsigned dual_color_diffed_diffs:1;
+ unsigned recursive;
+ unsigned tree_in_recursive;
+ unsigned binary;
+ unsigned text;
+ unsigned full_index;
+ unsigned silent_on_remove;
+ unsigned find_copies_harder;
+ unsigned follow_renames;
+ unsigned rename_empty;
+ unsigned has_changes;
+ unsigned quick;
+ unsigned no_index;
+ unsigned allow_external;
+ unsigned exit_with_status;
+ unsigned reverse_diff;
+ unsigned check_failed;
+ unsigned relative_name;
+ unsigned ignore_submodules;
+ unsigned dirstat_cumulative;
+ unsigned dirstat_by_file;
+ unsigned allow_textconv;
+ unsigned textconv_set_via_cmdline;
+ unsigned diff_from_contents;
+ unsigned dirty_submodules;
+ unsigned ignore_untracked_in_submodules;
+ unsigned ignore_dirty_submodules;
+ unsigned override_submodule_config;
+ unsigned dirstat_by_line;
+ unsigned funccontext;
+ unsigned default_follow_renames;
+ unsigned stat_with_summary;
+ unsigned suppress_diff_headers;
+ unsigned dual_color_diffed_diffs;
};
static inline void diff_flags_or(struct diff_flags *a,
@@ -229,6 +230,7 @@ struct diff_options {
unsigned color_moved_ws_handling;
struct repository *repo;
+ struct option *parseopts;
};
void diff_emit_submodule_del(struct diff_options *o, const char *line);
@@ -294,6 +296,7 @@ struct combine_diff_path {
char status;
unsigned int mode;
struct object_id oid;
+ struct strbuf path;
} parent[FLEX_ARRAY];
};
#define combine_diff_path_size(n, l) \
@@ -367,7 +370,7 @@ int git_config_rename(const char *var, const char *value);
#define DIFF_PICKAXE_IGNORE_CASE 32
void diffcore_std(struct diff_options *);
-void diffcore_fix_diff_index(struct diff_options *);
+void diffcore_fix_diff_index(void);
#define COMMON_DIFF_OPTIONS_HELP \
"\ncommon diff options:\n" \
@@ -435,7 +438,7 @@ int diff_flush_patch_id(struct diff_options *, struct object_id *, int);
int diff_result_code(struct diff_options *, int);
-void diff_no_index(struct repository *, struct rev_info *, int, const char **);
+void diff_no_index(struct rev_info *, int, const char **);
int index_differs_from(struct repository *r, const char *def,
const struct diff_flags *flags,
diff --git a/editor.c b/editor.c
index c985eee..7154767 100644
--- a/editor.c
+++ b/editor.c
@@ -78,6 +78,7 @@ static int launch_specified_editor(const char *editor, const char *path,
p.argv = args;
p.env = env;
p.use_shell = 1;
+ p.trace2_child_class = "editor";
if (start_command(&p) < 0)
return error("unable to start editor '%s'", editor);
diff --git a/entry.c b/entry.c
index 6fd72b3..0e4f2f2 100644
--- a/entry.c
+++ b/entry.c
@@ -441,6 +441,17 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state,
static struct strbuf path = STRBUF_INIT;
struct stat st;
+ if (ce->ce_flags & CE_WT_REMOVE) {
+ if (topath)
+ /*
+ * No content and thus no path to create, so we have
+ * no pathname to return.
+ */
+ BUG("Can't remove entry to a path");
+ unlink_entry(ce);
+ return 0;
+ }
+
if (topath)
return write_entry(ce, topath, state, 1);
@@ -510,3 +521,18 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state,
(*nr_checkouts)++;
return write_entry(ce, path.buf, state, 0);
}
+
+void unlink_entry(const struct cache_entry *ce)
+{
+ const struct submodule *sub = submodule_from_ce(ce);
+ if (sub) {
+ /* state.force is set at the caller. */
+ submodule_move_head(ce->name, "HEAD", NULL,
+ SUBMODULE_MOVE_HEAD_FORCE);
+ }
+ if (!check_leading_path(ce->name, ce_namelen(ce)))
+ return;
+ if (remove_or_warn(ce->ce_mode, ce->name))
+ return;
+ schedule_dir_for_removal(ce->name, ce_namelen(ce));
+}
diff --git a/exec-cmd.c b/exec-cmd.c
index 4f81f44..7deeab3 100644
--- a/exec-cmd.c
+++ b/exec-cmd.c
@@ -209,6 +209,8 @@ static int git_get_exec_path(struct strbuf *buf, const char *argv0)
return -1;
}
+ trace2_cmd_path(buf->buf);
+
return 0;
}
diff --git a/git-compat-util.h b/git-compat-util.h
index 6573808..31b4793 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -1260,6 +1260,13 @@ static inline int is_missing_file_error(int errno_)
extern int cmd_main(int, const char **);
/*
+ * Intercept all calls to exit() and route them to trace2 to
+ * optionally emit a message before calling the real exit().
+ */
+int trace2_cmd_exit_fl(const char *file, int line, int code);
+#define exit(code) exit(trace2_cmd_exit_fl(__FILE__, __LINE__, (code)))
+
+/*
* You can mark a stack variable with UNLEAK(var) to avoid it being
* reported as a leak by tools like LSAN or valgrind. The argument
* should generally be the variable itself (not its address and not what
diff --git a/git-send-email.perl b/git-send-email.perl
index 8eb63b5..8200d58 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -465,6 +465,8 @@ $smtp_encryption = '' unless (defined $smtp_encryption);
my(%suppress_cc);
if (@suppress_cc) {
foreach my $entry (@suppress_cc) {
+ # Please update $__git_send_email_suppresscc_options
+ # in git-completion.bash when you add new options.
die sprintf(__("Unknown --suppress-cc field: '%s'\n"), $entry)
unless $entry =~ /^(?:all|cccmd|cc|author|self|sob|body|bodycc|misc-by)$/;
$suppress_cc{$entry} = 1;
@@ -494,6 +496,8 @@ my $confirm_unconfigured = !defined $confirm;
if ($confirm_unconfigured) {
$confirm = scalar %suppress_cc ? 'compose' : 'auto';
};
+# Please update $__git_send_email_confirm_options in
+# git-completion.bash when you add new options.
die sprintf(__("Unknown --confirm setting: '%s'\n"), $confirm)
unless $confirm =~ /^(?:auto|cc|compose|always|never)/;
@@ -587,6 +591,8 @@ my %parse_alias = (
if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) {
$aliases{$1} = [ $2 ];
}}}
+ # Please update _git_config() in git-completion.bash when you
+ # add new MUAs.
);
if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
diff --git a/git-submodule.sh b/git-submodule.sh
index b5f2bee..514ede2 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -5,7 +5,8 @@
# Copyright (c) 2007 Lars Hjemli
dashless=$(basename "$0" | sed -e 's/-/ /')
-USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
+USAGE="[--quiet] [--cached]
+ or: $dashless [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: $dashless [--quiet] init [--] [<path>...]
or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
diff --git a/git.c b/git.c
index 2dd5886..2014aab 100644
--- a/git.c
+++ b/git.c
@@ -147,16 +147,20 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
git_set_exec_path(cmd + 1);
else {
puts(git_exec_path());
+ trace2_cmd_name("_query_");
exit(0);
}
} else if (!strcmp(cmd, "--html-path")) {
puts(system_path(GIT_HTML_PATH));
+ trace2_cmd_name("_query_");
exit(0);
} else if (!strcmp(cmd, "--man-path")) {
puts(system_path(GIT_MAN_PATH));
+ trace2_cmd_name("_query_");
exit(0);
} else if (!strcmp(cmd, "--info-path")) {
puts(system_path(GIT_INFO_PATH));
+ trace2_cmd_name("_query_");
exit(0);
} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
use_pager = 1;
@@ -285,6 +289,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
(*argv)++;
(*argc)--;
} else if (skip_prefix(cmd, "--list-cmds=", &cmd)) {
+ trace2_cmd_name("_query_");
if (!strcmp(cmd, "parseopt")) {
struct string_list list = STRING_LIST_INIT_DUP;
int i;
@@ -332,9 +337,14 @@ static int handle_alias(int *argcp, const char ***argv)
commit_pager_choice();
child.use_shell = 1;
+ child.trace2_child_class = "shell_alias";
argv_array_push(&child.args, alias_string + 1);
argv_array_pushv(&child.args, (*argv) + 1);
+ trace2_cmd_alias(alias_command, child.args.argv);
+ trace2_cmd_list_config();
+ trace2_cmd_name("_run_shell_alias_");
+
ret = run_command(&child);
if (ret >= 0) /* normal exit */
exit(ret);
@@ -369,6 +379,9 @@ static int handle_alias(int *argcp, const char ***argv)
/* insert after command name */
memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
+ trace2_cmd_alias(alias_command, new_argv);
+ trace2_cmd_list_config();
+
*argv = new_argv;
*argcp += count - 1;
@@ -417,6 +430,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
setup_work_tree();
trace_argv_printf(argv, "trace: built-in: git");
+ trace2_cmd_name(p->cmd);
+ trace2_cmd_list_config();
validate_cache_entries(the_repository->index);
status = p->fn(argc, argv, prefix);
@@ -666,7 +681,14 @@ static void execv_dashed_external(const char **argv)
cmd.clean_on_exit = 1;
cmd.wait_after_clean = 1;
cmd.silent_exec_failure = 1;
+ cmd.trace2_child_class = "dashed";
+ trace2_cmd_name("_run_dashed_");
+
+ /*
+ * The code in run_command() logs trace2 child_start/child_exit
+ * events, so we do not need to report exec/exec_result events here.
+ */
trace_argv_printf(cmd.args.argv, "trace: exec:");
/*
@@ -676,6 +698,12 @@ static void execv_dashed_external(const char **argv)
* the program.
*/
status = run_command(&cmd);
+
+ /*
+ * If the child process ran and we are now going to exit, emit a
+ * generic string as our trace2 command verb to indicate that we
+ * launched a dashed command.
+ */
if (status >= 0)
exit(status);
else if (errno != ENOENT)
@@ -701,6 +729,43 @@ static int run_argv(int *argcp, const char ***argv)
if (!done_alias)
handle_builtin(*argcp, *argv);
+#if 0 // TODO In GFW, need to amend a7924b655e940b06cb547c235d6bed9767929673 to include trace2_ and _tr2 lines.
+ else if (get_builtin(**argv)) {
+ struct argv_array args = ARGV_ARRAY_INIT;
+ int i;
+
+ /*
+ * The current process is committed to launching a
+ * child process to run the command named in (**argv)
+ * and exiting. Log a generic string as the trace2
+ * command verb to indicate this. Note that the child
+ * process will log the actual verb when it runs.
+ */
+ trace2_cmd_name("_run_git_alias_");
+
+ if (get_super_prefix())
+ die("%s doesn't support --super-prefix", **argv);
+
+ commit_pager_choice();
+
+ argv_array_push(&args, "git");
+ for (i = 0; i < *argcp; i++)
+ argv_array_push(&args, (*argv)[i]);
+
+ trace_argv_printf(args.argv, "trace: exec:");
+
+ /*
+ * if we fail because the command is not found, it is
+ * OK to return. Otherwise, we just pass along the status code.
+ */
+ i = run_command_v_opt_tr2(args.argv, RUN_SILENT_EXEC_FAILURE |
+ RUN_CLEAN_ON_EXIT, "git_alias");
+ if (i >= 0 || errno != ENOENT)
+ exit(i);
+ die("could not execute builtin %s", **argv);
+ }
+#endif // a7924b655e940b06cb547c235d6bed9767929673
+
/* .. then try the external ones */
execv_dashed_external(*argv);
diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po
index 407d555..87ab1fa 100644
--- a/gitk-git/po/bg.po
+++ b/gitk-git/po/bg.po
@@ -1,15 +1,15 @@
# Bulgarian translation of gitk po-file.
-# Copyright (C) 2014, 2015 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2014, 2015, 2019 Alexander Shopov <ash@kambanaria.org>.
# This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2014, 2015.
+# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2019.
#
#
msgid ""
msgstr ""
"Project-Id-Version: gitk master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-19 11:48+0200\n"
-"PO-Revision-Date: 2015-12-19 11:49+0200\n"
+"POT-Creation-Date: 2019-03-04 11:27+0100\n"
+"PO-Revision-Date: 2019-03-04 11:39+0100\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -22,17 +22,17 @@ msgstr ""
msgid "Couldn't get list of unmerged files:"
msgstr "Списъкът с неслети файлове не може да бъде получен:"
-#: gitk:212 gitk:2399
+#: gitk:212 gitk:2403
msgid "Color words"
msgstr "Оцветяване на думите"
-#: gitk:217 gitk:2399 gitk:8239 gitk:8272
+#: gitk:217 gitk:2403 gitk:8249 gitk:8282
msgid "Markup words"
msgstr "Отбелязване на думите"
#: gitk:324
msgid "Error parsing revisions:"
-msgstr "Грешка при разбор на версиите:"
+msgstr "Грешка при анализ на версиите:"
#: gitk:380
msgid "Error executing --argscmd command:"
@@ -59,314 +59,318 @@ msgstr "Грешка при изпълнение на „git log“:"
msgid "Reading"
msgstr "Прочитане"
-#: gitk:496 gitk:4544
+#: gitk:496 gitk:4549
msgid "Reading commits..."
msgstr "Прочитане на подаванията…"
-#: gitk:499 gitk:1637 gitk:4547
+#: gitk:499 gitk:1641 gitk:4552
msgid "No commits selected"
msgstr "Не са избрани подавания"
-#: gitk:1445 gitk:4064 gitk:12469
+#: gitk:1449 gitk:4069 gitk:12583
msgid "Command line"
msgstr "Команден ред"
-#: gitk:1511
+#: gitk:1515
msgid "Can't parse git log output:"
msgstr "Изходът от „git log“ не може да се анализира:"
-#: gitk:1740
+#: gitk:1744
msgid "No commit information available"
msgstr "Липсва информация за подавания"
-#: gitk:1903 gitk:1932 gitk:4334 gitk:9702 gitk:11274 gitk:11554
+#: gitk:1907 gitk:1936 gitk:4339 gitk:9789 gitk:11388 gitk:11668
msgid "OK"
msgstr "Добре"
-#: gitk:1934 gitk:4336 gitk:9215 gitk:9294 gitk:9424 gitk:9473 gitk:9704
-#: gitk:11275 gitk:11555
+#: gitk:1938 gitk:4341 gitk:9225 gitk:9304 gitk:9434 gitk:9520 gitk:9791
+#: gitk:11389 gitk:11669
msgid "Cancel"
msgstr "Отказ"
-#: gitk:2083
+#: gitk:2087
msgid "&Update"
msgstr "&Обновяване"
-#: gitk:2084
+#: gitk:2088
msgid "&Reload"
msgstr "&Презареждане"
-#: gitk:2085
+#: gitk:2089
msgid "Reread re&ferences"
-msgstr "&Наново прочитане на настройките"
+msgstr "&Наново прочитане"
-#: gitk:2086
+#: gitk:2090
msgid "&List references"
msgstr "&Изброяване на указателите"
-#: gitk:2088
+#: gitk:2092
msgid "Start git &gui"
msgstr "&Стартиране на „git gui“"
-#: gitk:2090
+#: gitk:2094
msgid "&Quit"
msgstr "&Спиране на програмата"
-#: gitk:2082
+#: gitk:2086
msgid "&File"
msgstr "&Файл"
-#: gitk:2094
+#: gitk:2098
msgid "&Preferences"
msgstr "&Настройки"
-#: gitk:2093
+#: gitk:2097
msgid "&Edit"
msgstr "&Редактиране"
-#: gitk:2098
+#: gitk:2102
msgid "&New view..."
msgstr "&Нов изглед…"
-#: gitk:2099
+#: gitk:2103
msgid "&Edit view..."
msgstr "&Редактиране на изгледа…"
-#: gitk:2100
+#: gitk:2104
msgid "&Delete view"
msgstr "&Изтриване на изгледа"
-#: gitk:2102
+#: gitk:2106
msgid "&All files"
msgstr "&Всички файлове"
-#: gitk:2097
+#: gitk:2101
msgid "&View"
msgstr "&Изглед"
-#: gitk:2107 gitk:2117
+#: gitk:2111 gitk:2121
msgid "&About gitk"
msgstr "&Относно gitk"
-#: gitk:2108 gitk:2122
+#: gitk:2112 gitk:2126
msgid "&Key bindings"
msgstr "&Клавишни комбинации"
-#: gitk:2106 gitk:2121
+#: gitk:2110 gitk:2125
msgid "&Help"
msgstr "Помо&щ"
-#: gitk:2199 gitk:8671
+#: gitk:2203 gitk:8681
msgid "SHA1 ID:"
msgstr "SHA1:"
-#: gitk:2243
+#: gitk:2247
msgid "Row"
msgstr "Ред"
-#: gitk:2281
+#: gitk:2285
msgid "Find"
msgstr "Търсене"
-#: gitk:2309
+#: gitk:2313
msgid "commit"
msgstr "подаване"
-#: gitk:2313 gitk:2315 gitk:4706 gitk:4729 gitk:4753 gitk:6774 gitk:6846
-#: gitk:6931
+#: gitk:2317 gitk:2319 gitk:4711 gitk:4734 gitk:4758 gitk:6779 gitk:6851
+#: gitk:6936
msgid "containing:"
msgstr "съдържащо:"
-#: gitk:2316 gitk:3545 gitk:3550 gitk:4782
+#: gitk:2320 gitk:3550 gitk:3555 gitk:4787
msgid "touching paths:"
-msgstr "засягащо пътищата:"
+msgstr "в пътищата:"
-#: gitk:2317 gitk:4796
+#: gitk:2321 gitk:4801
msgid "adding/removing string:"
msgstr "добавящо/премахващо низ"
-#: gitk:2318 gitk:4798
+#: gitk:2322 gitk:4803
msgid "changing lines matching:"
msgstr "променящо редове напасващи:"
-#: gitk:2327 gitk:2329 gitk:4785
+#: gitk:2331 gitk:2333 gitk:4790
msgid "Exact"
msgstr "Точно"
-#: gitk:2329 gitk:4873 gitk:6742
+#: gitk:2333 gitk:4878 gitk:6747
msgid "IgnCase"
msgstr "Без регистър"
-#: gitk:2329 gitk:4755 gitk:4871 gitk:6738
+#: gitk:2333 gitk:4760 gitk:4876 gitk:6743
msgid "Regexp"
msgstr "Рег. израз"
-#: gitk:2331 gitk:2332 gitk:4893 gitk:4923 gitk:4930 gitk:6867 gitk:6935
+#: gitk:2335 gitk:2336 gitk:4898 gitk:4928 gitk:4935 gitk:6872 gitk:6940
msgid "All fields"
msgstr "Всички полета"
-#: gitk:2332 gitk:4890 gitk:4923 gitk:6805
+#: gitk:2336 gitk:4895 gitk:4928 gitk:6810
msgid "Headline"
msgstr "Първи ред"
-#: gitk:2333 gitk:4890 gitk:6805 gitk:6935 gitk:7408
+#: gitk:2337 gitk:4895 gitk:6810 gitk:6940 gitk:7413
msgid "Comments"
msgstr "Коментари"
-#: gitk:2333 gitk:4890 gitk:4895 gitk:4930 gitk:6805 gitk:7343 gitk:8849
-#: gitk:8864
+#: gitk:2337 gitk:4895 gitk:4900 gitk:4935 gitk:6810 gitk:7348 gitk:8859
+#: gitk:8874
msgid "Author"
msgstr "Автор"
-#: gitk:2333 gitk:4890 gitk:6805 gitk:7345
+#: gitk:2337 gitk:4895 gitk:6810 gitk:7350
msgid "Committer"
msgstr "Подаващ"
-#: gitk:2367
+#: gitk:2371
msgid "Search"
msgstr "Търсене"
-#: gitk:2375
+#: gitk:2379
msgid "Diff"
msgstr "Разлики"
-#: gitk:2377
+#: gitk:2381
msgid "Old version"
msgstr "Стара версия"
-#: gitk:2379
+#: gitk:2383
msgid "New version"
msgstr "Нова версия"
-#: gitk:2382
+#: gitk:2386
msgid "Lines of context"
msgstr "Контекст в редове"
-#: gitk:2392
+#: gitk:2396
msgid "Ignore space change"
msgstr "Празните знаци без значение"
-#: gitk:2396 gitk:2398 gitk:7978 gitk:8225
+#: gitk:2400 gitk:2402 gitk:7983 gitk:8235
msgid "Line diff"
msgstr "Поредови разлики"
-#: gitk:2463
+#: gitk:2467
msgid "Patch"
msgstr "Кръпка"
-#: gitk:2465
+#: gitk:2469
msgid "Tree"
msgstr "Дърво"
-#: gitk:2635 gitk:2656
+#: gitk:2639 gitk:2660
msgid "Diff this -> selected"
msgstr "Разлики между това и избраното"
-#: gitk:2636 gitk:2657
+#: gitk:2640 gitk:2661
msgid "Diff selected -> this"
msgstr "Разлики между избраното и това"
-#: gitk:2637 gitk:2658
+#: gitk:2641 gitk:2662
msgid "Make patch"
msgstr "Създаване на кръпка"
-#: gitk:2638 gitk:9273
+#: gitk:2642 gitk:9283
msgid "Create tag"
msgstr "Създаване на етикет"
-#: gitk:2639
+#: gitk:2643
msgid "Copy commit summary"
msgstr "Копиране на информацията за подаване"
-#: gitk:2640 gitk:9404
+#: gitk:2644 gitk:9414
msgid "Write commit to file"
msgstr "Запазване на подаването във файл"
-#: gitk:2641 gitk:9461
+#: gitk:2645
msgid "Create new branch"
msgstr "Създаване на нов клон"
-#: gitk:2642
+#: gitk:2646
msgid "Cherry-pick this commit"
msgstr "Отбиране на това подаване"
-#: gitk:2643
+#: gitk:2647
msgid "Reset HEAD branch to here"
msgstr "Привеждане на върха на клона към текущото подаване"
-#: gitk:2644
+#: gitk:2648
msgid "Mark this commit"
msgstr "Отбелязване на това подаване"
-#: gitk:2645
+#: gitk:2649
msgid "Return to mark"
msgstr "Връщане към отбелязаното подаване"
-#: gitk:2646
+#: gitk:2650
msgid "Find descendant of this and mark"
msgstr "Откриване и отбелязване на наследниците"
-#: gitk:2647
+#: gitk:2651
msgid "Compare with marked commit"
msgstr "Сравнение с отбелязаното подаване"
-#: gitk:2648 gitk:2659
+#: gitk:2652 gitk:2663
msgid "Diff this -> marked commit"
msgstr "Разлики между това и отбелязаното"
-#: gitk:2649 gitk:2660
+#: gitk:2653 gitk:2664
msgid "Diff marked commit -> this"
msgstr "Разлики между отбелязаното и това"
-#: gitk:2650
+#: gitk:2654
msgid "Revert this commit"
msgstr "Отмяна на това подаване"
-#: gitk:2666
+#: gitk:2670
msgid "Check out this branch"
msgstr "Изтегляне на този клон"
-#: gitk:2667
+#: gitk:2671
+msgid "Rename this branch"
+msgstr "Преименуване на този клон"
+
+#: gitk:2672
msgid "Remove this branch"
msgstr "Изтриване на този клон"
-#: gitk:2668
+#: gitk:2673
msgid "Copy branch name"
msgstr "Копиране на името на клона"
-#: gitk:2675
+#: gitk:2680
msgid "Highlight this too"
msgstr "Отбелязване и на това"
-#: gitk:2676
+#: gitk:2681
msgid "Highlight this only"
msgstr "Отбелязване само на това"
-#: gitk:2677
+#: gitk:2682
msgid "External diff"
msgstr "Външна програма за разлики"
-#: gitk:2678
+#: gitk:2683
msgid "Blame parent commit"
msgstr "Анотиране на родителското подаване"
-#: gitk:2679
+#: gitk:2684
msgid "Copy path"
msgstr "Копиране на пътя"
-#: gitk:2686
+#: gitk:2691
msgid "Show origin of this line"
msgstr "Показване на произхода на този ред"
-#: gitk:2687
+#: gitk:2692
msgid "Run git gui blame on this line"
msgstr "Изпълнение на „git gui blame“ върху този ред"
-#: gitk:3031
+#: gitk:3036
msgid "About gitk"
msgstr "Относно gitk"
-#: gitk:3033
+#: gitk:3038
msgid ""
"\n"
"Gitk - a commit viewer for git\n"
@@ -382,324 +386,324 @@ msgstr ""
"\n"
"Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
-#: gitk:3041 gitk:3108 gitk:9890
+#: gitk:3046 gitk:3113 gitk:10004
msgid "Close"
msgstr "Затваряне"
-#: gitk:3062
+#: gitk:3067
msgid "Gitk key bindings"
msgstr "Клавишни комбинации"
-#: gitk:3065
+#: gitk:3070
msgid "Gitk key bindings:"
msgstr "Клавишни комбинации:"
-#: gitk:3067
+#: gitk:3072
#, tcl-format
msgid "<%s-Q>\t\tQuit"
msgstr "<%s-Q>\t\tСпиране на програмата"
-#: gitk:3068
+#: gitk:3073
#, tcl-format
msgid "<%s-W>\t\tClose window"
msgstr "<%s-W>\t\tЗатваряне на прозореца"
-#: gitk:3069
+#: gitk:3074
msgid "<Home>\t\tMove to first commit"
msgstr "<Home>\t\tКъм първото подаване"
-#: gitk:3070
+#: gitk:3075
msgid "<End>\t\tMove to last commit"
msgstr "<End>\t\tКъм последното подаване"
-#: gitk:3071
+#: gitk:3076
msgid "<Up>, p, k\tMove up one commit"
msgstr "<Up>, p, k\tЕдно подаване нагоре"
-#: gitk:3072
+#: gitk:3077
msgid "<Down>, n, j\tMove down one commit"
msgstr "<Down>, n, j\tЕдно подаване надолу"
-#: gitk:3073
+#: gitk:3078
msgid "<Left>, z, h\tGo back in history list"
msgstr "<Left>, z, h\tНазад в историята"
-#: gitk:3074
+#: gitk:3079
msgid "<Right>, x, l\tGo forward in history list"
msgstr "<Right>, x, l\tНапред в историята"
-#: gitk:3075
+#: gitk:3080
#, tcl-format
msgid "<%s-n>\tGo to n-th parent of current commit in history list"
msgstr "<%s-n>\tКъм n-тия родител на текущото подаване в историята"
-#: gitk:3076
+#: gitk:3081
msgid "<PageUp>\tMove up one page in commit list"
msgstr "<PageUp>\tСтраница нагоре в списъка с подаванията"
-#: gitk:3077
+#: gitk:3082
msgid "<PageDown>\tMove down one page in commit list"
msgstr "<PageDown>\tСтраница надолу в списъка с подаванията"
-#: gitk:3078
+#: gitk:3083
#, tcl-format
msgid "<%s-Home>\tScroll to top of commit list"
msgstr "<%s-Home>\tКъм началото на списъка с подаванията"
-#: gitk:3079
+#: gitk:3084
#, tcl-format
msgid "<%s-End>\tScroll to bottom of commit list"
msgstr "<%s-End>\tКъм края на списъка с подаванията"
-#: gitk:3080
+#: gitk:3085
#, tcl-format
msgid "<%s-Up>\tScroll commit list up one line"
msgstr "<%s-Up>\tРед нагоре в списъка с подавания"
-#: gitk:3081
+#: gitk:3086
#, tcl-format
msgid "<%s-Down>\tScroll commit list down one line"
msgstr "<%s-Down>\tРед надолу в списъка с подавания"
-#: gitk:3082
+#: gitk:3087
#, tcl-format
msgid "<%s-PageUp>\tScroll commit list up one page"
msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания"
-#: gitk:3083
+#: gitk:3088
#, tcl-format
msgid "<%s-PageDown>\tScroll commit list down one page"
msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания"
-#: gitk:3084
+#: gitk:3089
msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)"
-#: gitk:3085
+#: gitk:3090
msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
msgstr ""
"<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
-#: gitk:3086
+#: gitk:3091
msgid "<Delete>, b\tScroll diff view up one page"
msgstr "<Delete>, b\tСтраница нагоре в изгледа за разлики"
-#: gitk:3087
+#: gitk:3092
msgid "<Backspace>\tScroll diff view up one page"
msgstr "<Backspace>\tСтраница надолу в изгледа за разлики"
-#: gitk:3088
+#: gitk:3093
msgid "<Space>\t\tScroll diff view down one page"
msgstr "<Space>\t\tСтраница надолу в изгледа за разлики"
-#: gitk:3089
+#: gitk:3094
msgid "u\t\tScroll diff view up 18 lines"
msgstr "u\t\t18 реда нагоре в изгледа за разлики"
-#: gitk:3090
+#: gitk:3095
msgid "d\t\tScroll diff view down 18 lines"
msgstr "d\t\t18 реда надолу в изгледа за разлики"
-#: gitk:3091
+#: gitk:3096
#, tcl-format
msgid "<%s-F>\t\tFind"
msgstr "<%s-F>\t\tТърсене"
-#: gitk:3092
+#: gitk:3097
#, tcl-format
msgid "<%s-G>\t\tMove to next find hit"
msgstr "<%s-G>\t\tКъм следващата поява"
-#: gitk:3093
+#: gitk:3098
msgid "<Return>\tMove to next find hit"
msgstr "<Return>\tКъм следващата поява"
-#: gitk:3094
+#: gitk:3099
msgid "g\t\tGo to commit"
msgstr "g\t\tКъм последното подаване"
-#: gitk:3095
+#: gitk:3100
msgid "/\t\tFocus the search box"
msgstr "/\t\tФокус върху полето за търсене"
-#: gitk:3096
+#: gitk:3101
msgid "?\t\tMove to previous find hit"
msgstr "?\t\tКъм предишната поява"
-#: gitk:3097
+#: gitk:3102
msgid "f\t\tScroll diff view to next file"
msgstr "f\t\tСледващ файл в изгледа за разлики"
-#: gitk:3098
+#: gitk:3103
#, tcl-format
msgid "<%s-S>\t\tSearch for next hit in diff view"
msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики"
-#: gitk:3099
+#: gitk:3104
#, tcl-format
msgid "<%s-R>\t\tSearch for previous hit in diff view"
msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики"
-#: gitk:3100
+#: gitk:3105
#, tcl-format
msgid "<%s-KP+>\tIncrease font size"
msgstr "<%s-KP+>\tПо-голям размер на шрифта"
-#: gitk:3101
+#: gitk:3106
#, tcl-format
msgid "<%s-plus>\tIncrease font size"
msgstr "<%s-plus>\tПо-голям размер на шрифта"
-#: gitk:3102
+#: gitk:3107
#, tcl-format
msgid "<%s-KP->\tDecrease font size"
msgstr "<%s-KP->\tПо-малък размер на шрифта"
-#: gitk:3103
+#: gitk:3108
#, tcl-format
msgid "<%s-minus>\tDecrease font size"
msgstr "<%s-minus>\tПо-малък размер на шрифта"
-#: gitk:3104
+#: gitk:3109
msgid "<F5>\t\tUpdate"
msgstr "<F5>\t\tОбновяване"
-#: gitk:3569 gitk:3578
+#: gitk:3574 gitk:3583
#, tcl-format
msgid "Error creating temporary directory %s:"
msgstr "Грешка при създаването на временната директория „%s“:"
-#: gitk:3591
+#: gitk:3596
#, tcl-format
msgid "Error getting \"%s\" from %s:"
msgstr "Грешка при получаването на „%s“ от %s:"
-#: gitk:3654
+#: gitk:3659
msgid "command failed:"
msgstr "неуспешно изпълнение на команда:"
-#: gitk:3803
+#: gitk:3808
msgid "No such commit"
msgstr "Такова подаване няма"
-#: gitk:3817
+#: gitk:3822
msgid "git gui blame: command failed:"
msgstr "„git gui blame“: неуспешно изпълнение на команда:"
-#: gitk:3848
+#: gitk:3853
#, tcl-format
msgid "Couldn't read merge head: %s"
msgstr "Върхът за сливане не може да бъде прочетен: %s"
-#: gitk:3856
+#: gitk:3861
#, tcl-format
msgid "Error reading index: %s"
msgstr "Грешка при прочитане на индекса: %s"
-#: gitk:3881
+#: gitk:3886
#, tcl-format
msgid "Couldn't start git blame: %s"
msgstr "Командата „git blame“ не може да бъде стартирана: %s"
-#: gitk:3884 gitk:6773
+#: gitk:3889 gitk:6778
msgid "Searching"
msgstr "Търсене"
-#: gitk:3916
+#: gitk:3921
#, tcl-format
msgid "Error running git blame: %s"
msgstr "Грешка при изпълнението на „git blame“: %s"
-#: gitk:3944
+#: gitk:3949
#, tcl-format
msgid "That line comes from commit %s, which is not in this view"
msgstr "Този ред идва от подаването %s, което не е в изгледа"
-#: gitk:3958
+#: gitk:3963
msgid "External diff viewer failed:"
msgstr "Неуспешно изпълнение на външната програма за разлики:"
-#: gitk:4062
+#: gitk:4067
msgid "All files"
msgstr "Всички файлове"
-#: gitk:4086
+#: gitk:4091
msgid "View"
msgstr "Изглед"
-#: gitk:4089
+#: gitk:4094
msgid "Gitk view definition"
msgstr "Дефиниция на изглед в Gitk"
-#: gitk:4093
+#: gitk:4098
msgid "Remember this view"
msgstr "Запазване на този изглед"
-#: gitk:4094
+#: gitk:4099
msgid "References (space separated list):"
msgstr "Указатели (списък с разделител интервал):"
-#: gitk:4095
+#: gitk:4100
msgid "Branches & tags:"
msgstr "Клони и етикети:"
-#: gitk:4096
+#: gitk:4101
msgid "All refs"
msgstr "Всички указатели"
-#: gitk:4097
+#: gitk:4102
msgid "All (local) branches"
msgstr "Всички (локални) клони"
-#: gitk:4098
+#: gitk:4103
msgid "All tags"
msgstr "Всички етикети"
-#: gitk:4099
+#: gitk:4104
msgid "All remote-tracking branches"
msgstr "Всички следящи клони"
-#: gitk:4100
+#: gitk:4105
msgid "Commit Info (regular expressions):"
msgstr "Информация за подаване (рег. изр.):"
-#: gitk:4101
+#: gitk:4106
msgid "Author:"
msgstr "Автор:"
-#: gitk:4102
+#: gitk:4107
msgid "Committer:"
msgstr "Подал:"
-#: gitk:4103
+#: gitk:4108
msgid "Commit Message:"
msgstr "Съобщение при подаване:"
-#: gitk:4104
+#: gitk:4109
msgid "Matches all Commit Info criteria"
msgstr "Съвпадение по всички характеристики на подаването"
-#: gitk:4105
+#: gitk:4110
msgid "Matches no Commit Info criteria"
msgstr "Не съвпада по никоя от характеристиките на подаването"
-#: gitk:4106
+#: gitk:4111
msgid "Changes to Files:"
msgstr "Промени по файловете:"
-#: gitk:4107
+#: gitk:4112
msgid "Fixed String"
msgstr "Дословен низ"
-#: gitk:4108
+#: gitk:4113
msgid "Regular Expression"
msgstr "Регулярен израз"
-#: gitk:4109
+#: gitk:4114
msgid "Search string:"
msgstr "Низ за търсене:"
-#: gitk:4110
+#: gitk:4115
msgid ""
"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
"15:27:38\"):"
@@ -707,204 +711,204 @@ msgstr ""
"Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, "
"„March 17, 2009 15:27:38“):"
-#: gitk:4111
+#: gitk:4116
msgid "Since:"
msgstr "От:"
-#: gitk:4112
+#: gitk:4117
msgid "Until:"
msgstr "До:"
-#: gitk:4113
+#: gitk:4118
msgid "Limit and/or skip a number of revisions (positive integer):"
msgstr ""
"Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло "
"число):"
-#: gitk:4114
+#: gitk:4119
msgid "Number to show:"
msgstr "Брой показани:"
-#: gitk:4115
+#: gitk:4120
msgid "Number to skip:"
msgstr "Брой прескочени:"
-#: gitk:4116
+#: gitk:4121
msgid "Miscellaneous options:"
msgstr "Разни:"
-#: gitk:4117
+#: gitk:4122
msgid "Strictly sort by date"
msgstr "Подреждане по дата"
-#: gitk:4118
+#: gitk:4123
msgid "Mark branch sides"
msgstr "Отбелязване на страните по клона"
-#: gitk:4119
+#: gitk:4124
msgid "Limit to first parent"
msgstr "Само първия родител"
-#: gitk:4120
+#: gitk:4125
msgid "Simple history"
msgstr "Опростена история"
-#: gitk:4121
+#: gitk:4126
msgid "Additional arguments to git log:"
msgstr "Допълнителни аргументи към „git log“:"
-#: gitk:4122
+#: gitk:4127
msgid "Enter files and directories to include, one per line:"
msgstr "Въведете файловете и директориите за включване, по елемент на ред"
-#: gitk:4123
+#: gitk:4128
msgid "Command to generate more commits to include:"
msgstr ""
"Команда за генерирането на допълнителни подавания, които да бъдат включени:"
-#: gitk:4247
+#: gitk:4252
msgid "Gitk: edit view"
msgstr "Gitk: редактиране на изглед"
-#: gitk:4255
+#: gitk:4260
msgid "-- criteria for selecting revisions"
msgstr "— критерии за избор на версии"
-#: gitk:4260
+#: gitk:4265
msgid "View Name"
msgstr "Име на изглед"
-#: gitk:4335
+#: gitk:4340
msgid "Apply (F5)"
msgstr "Прилагане (F5)"
-#: gitk:4373
+#: gitk:4378
msgid "Error in commit selection arguments:"
msgstr "Грешка в аргументите за избор на подавания:"
-#: gitk:4428 gitk:4481 gitk:4943 gitk:4957 gitk:6227 gitk:12410 gitk:12411
+#: gitk:4433 gitk:4486 gitk:4948 gitk:4962 gitk:6232 gitk:12524 gitk:12525
msgid "None"
msgstr "Няма"
-#: gitk:5040 gitk:5045
+#: gitk:5045 gitk:5050
msgid "Descendant"
msgstr "Наследник"
-#: gitk:5041
+#: gitk:5046
msgid "Not descendant"
msgstr "Не е наследник"
-#: gitk:5048 gitk:5053
+#: gitk:5053 gitk:5058
msgid "Ancestor"
msgstr "Предшественик"
-#: gitk:5049
+#: gitk:5054
msgid "Not ancestor"
msgstr "Не е предшественик"
-#: gitk:5343
+#: gitk:5348
msgid "Local changes checked in to index but not committed"
msgstr "Локални промени добавени към индекса, но неподадени"
-#: gitk:5379
+#: gitk:5384
msgid "Local uncommitted changes, not checked in to index"
msgstr "Локални промени извън индекса"
-#: gitk:7153
+#: gitk:7158
msgid "and many more"
msgstr "и още много"
-#: gitk:7156
+#: gitk:7161
msgid "many"
msgstr "много"
-#: gitk:7347
+#: gitk:7352
msgid "Tags:"
msgstr "Етикети:"
-#: gitk:7364 gitk:7370 gitk:8844
+#: gitk:7369 gitk:7375 gitk:8854
msgid "Parent"
msgstr "Родител"
-#: gitk:7375
+#: gitk:7380
msgid "Child"
msgstr "Дете"
-#: gitk:7384
+#: gitk:7389
msgid "Branch"
msgstr "Клон"
-#: gitk:7387
+#: gitk:7392
msgid "Follows"
msgstr "Следва"
-#: gitk:7390
+#: gitk:7395
msgid "Precedes"
msgstr "Предшества"
-#: gitk:7985
+#: gitk:7990
#, tcl-format
msgid "Error getting diffs: %s"
msgstr "Грешка при получаването на разликите: %s"
-#: gitk:8669
+#: gitk:8679
msgid "Goto:"
msgstr "Към ред:"
-#: gitk:8690
+#: gitk:8700
#, tcl-format
msgid "Short SHA1 id %s is ambiguous"
msgstr "Съкратената сума по SHA1 %s не е еднозначна"
-#: gitk:8697
+#: gitk:8707
#, tcl-format
msgid "Revision %s is not known"
msgstr "Непозната версия %s"
-#: gitk:8707
+#: gitk:8717
#, tcl-format
msgid "SHA1 id %s is not known"
msgstr "Непозната сума по SHA1 %s"
-#: gitk:8709
+#: gitk:8719
#, tcl-format
msgid "Revision %s is not in the current view"
msgstr "Версия %s не е в текущия изглед"
-#: gitk:8851 gitk:8866
+#: gitk:8861 gitk:8876
msgid "Date"
msgstr "Дата"
-#: gitk:8854
+#: gitk:8864
msgid "Children"
msgstr "Деца"
-#: gitk:8917
+#: gitk:8927
#, tcl-format
msgid "Reset %s branch to here"
msgstr "Зануляване на клона „%s“ към текущото подаване"
-#: gitk:8919
+#: gitk:8929
msgid "Detached head: can't reset"
msgstr "Несвързан връх: невъзможно зануляване"
-#: gitk:9024 gitk:9030
+#: gitk:9034 gitk:9040
msgid "Skipping merge commit "
msgstr "Пропускане на подаването на сливането"
-#: gitk:9039 gitk:9044
+#: gitk:9049 gitk:9054
msgid "Error getting patch ID for "
msgstr "Грешка при получаването на идентификатора на "
-#: gitk:9040 gitk:9045
+#: gitk:9050 gitk:9055
msgid " - stopping\n"
msgstr " — спиране\n"
-#: gitk:9050 gitk:9053 gitk:9061 gitk:9075 gitk:9084
+#: gitk:9060 gitk:9063 gitk:9071 gitk:9085 gitk:9094
msgid "Commit "
msgstr "Подаване"
-#: gitk:9054
+#: gitk:9064
msgid ""
" is the same patch as\n"
" "
@@ -912,7 +916,7 @@ msgstr ""
" е същата кръпка като\n"
" "
-#: gitk:9062
+#: gitk:9072
msgid ""
" differs from\n"
" "
@@ -920,7 +924,7 @@ msgstr ""
" се различава от\n"
" "
-#: gitk:9064
+#: gitk:9074
msgid ""
"Diff of commits:\n"
"\n"
@@ -928,130 +932,147 @@ msgstr ""
"Разлика между подаванията:\n"
"\n"
-#: gitk:9076 gitk:9085
+#: gitk:9086 gitk:9095
#, tcl-format
msgid " has %s children - stopping\n"
msgstr " има %s деца — спиране\n"
-#: gitk:9104
+#: gitk:9114
#, tcl-format
msgid "Error writing commit to file: %s"
msgstr "Грешка при запазването на подаването във файл: %s"
-#: gitk:9110
+#: gitk:9120
#, tcl-format
msgid "Error diffing commits: %s"
msgstr "Грешка при изчисляването на разликите между подаванията: %s"
-#: gitk:9156
+#: gitk:9166
msgid "Top"
msgstr "Най-горе"
-#: gitk:9157
+#: gitk:9167
msgid "From"
msgstr "От"
-#: gitk:9162
+#: gitk:9172
msgid "To"
msgstr "До"
-#: gitk:9186
+#: gitk:9196
msgid "Generate patch"
msgstr "Генериране на кръпка"
-#: gitk:9188
+#: gitk:9198
msgid "From:"
msgstr "От:"
-#: gitk:9197
+#: gitk:9207
msgid "To:"
msgstr "До:"
-#: gitk:9206
+#: gitk:9216
msgid "Reverse"
msgstr "Обръщане"
-#: gitk:9208 gitk:9418
+#: gitk:9218 gitk:9428
msgid "Output file:"
msgstr "Запазване във файла:"
-#: gitk:9214
+#: gitk:9224
msgid "Generate"
msgstr "Генериране"
-#: gitk:9252
+#: gitk:9262
msgid "Error creating patch:"
msgstr "Грешка при създаването на кръпка:"
-#: gitk:9275 gitk:9406 gitk:9463
+#: gitk:9285 gitk:9416 gitk:9504
msgid "ID:"
msgstr "Идентификатор:"
-#: gitk:9284
+#: gitk:9294
msgid "Tag name:"
msgstr "Име на етикет:"
-#: gitk:9287
+#: gitk:9297
msgid "Tag message is optional"
msgstr "Съобщението за етикет е незадължително"
-#: gitk:9289
+#: gitk:9299
msgid "Tag message:"
msgstr "Съобщение за етикет:"
-#: gitk:9293 gitk:9472
+#: gitk:9303 gitk:9474
msgid "Create"
msgstr "Създаване"
-#: gitk:9311
+#: gitk:9321
msgid "No tag name specified"
msgstr "Липсва име на етикет"
-#: gitk:9315
+#: gitk:9325
#, tcl-format
msgid "Tag \"%s\" already exists"
msgstr "Етикетът „%s“ вече съществува"
-#: gitk:9325
+#: gitk:9335
msgid "Error creating tag:"
msgstr "Грешка при създаването на етикет:"
-#: gitk:9415
+#: gitk:9425
msgid "Command:"
msgstr "Команда:"
-#: gitk:9423
+#: gitk:9433
msgid "Write"
msgstr "Запазване"
-#: gitk:9441
+#: gitk:9451
msgid "Error writing commit:"
msgstr "Грешка при запазването на подаването:"
-#: gitk:9468
+#: gitk:9473
+msgid "Create branch"
+msgstr "Създаване на клон"
+
+#: gitk:9489
+#, tcl-format
+msgid "Rename branch %s"
+msgstr "Преименуване на клона „%s“"
+
+#: gitk:9490
+msgid "Rename"
+msgstr "Преименуване"
+
+#: gitk:9514
msgid "Name:"
msgstr "Име:"
-#: gitk:9491
+#: gitk:9538
msgid "Please specify a name for the new branch"
msgstr "Укажете име за новия клон"
-#: gitk:9496
+#: gitk:9543
#, tcl-format
msgid "Branch '%s' already exists. Overwrite?"
msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?"
-#: gitk:9563
+#: gitk:9587
+msgid "Please specify a new name for the branch"
+msgstr "Укажете ново име за клона"
+
+#: gitk:9650
#, tcl-format
msgid "Commit %s is already included in branch %s -- really re-apply it?"
msgstr ""
"Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
-#: gitk:9568
+#: gitk:9655
msgid "Cherry-picking"
msgstr "Отбиране"
-#: gitk:9577
+#: gitk:9664
#, tcl-format
msgid ""
"Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1060,7 +1081,7 @@ msgstr ""
"Неуспешно отбиране, защото във файла „%s“ има локални промени.\n"
"Подайте, занулете или ги скатайте и пробвайте отново."
-#: gitk:9583
+#: gitk:9670
msgid ""
"Cherry-pick failed because of merge conflict.\n"
"Do you wish to run git citool to resolve it?"
@@ -1068,29 +1089,29 @@ msgstr ""
"Неуспешно отбиране поради конфликти при сливане.\n"
"Искате ли да ги коригирате чрез „git citool“?"
-#: gitk:9599 gitk:9657
+#: gitk:9686 gitk:9744
msgid "No changes committed"
msgstr "Не са подадени промени"
-#: gitk:9626
+#: gitk:9713
#, tcl-format
msgid "Commit %s is not included in branch %s -- really revert it?"
msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?"
-#: gitk:9631
+#: gitk:9718
msgid "Reverting"
msgstr "Отмяна"
-#: gitk:9639
+#: gitk:9726
#, tcl-format
msgid ""
"Revert failed because of local changes to the following files:%s Please "
"commit, reset or stash your changes and try again."
msgstr ""
"Неуспешна отмяна, защото във файла „%s“ има локални промени.\n"
-"Подайте, занулете или ги скатайте и пробвайте отново.<"
+"Подайте, занулете или ги скатайте и пробвайте отново."
-#: gitk:9643
+#: gitk:9730
msgid ""
"Revert failed because of merge conflict.\n"
" Do you wish to run git citool to resolve it?"
@@ -1098,66 +1119,71 @@ msgstr ""
"Неуспешно отмяна поради конфликти при сливане.\n"
"Искате ли да ги коригирате чрез „git citool“?"
-#: gitk:9686
+#: gitk:9773
msgid "Confirm reset"
msgstr "Потвърждаване на зануляването"
-#: gitk:9688
+#: gitk:9775
#, tcl-format
msgid "Reset branch %s to %s?"
msgstr "Да се занули ли клонът „%s“ към „%s“?"
-#: gitk:9690
+#: gitk:9777
msgid "Reset type:"
msgstr "Вид зануляване:"
-#: gitk:9693
+#: gitk:9780
msgid "Soft: Leave working tree and index untouched"
msgstr "Слабо: работното дърво и индекса остават същите"
-#: gitk:9696
+#: gitk:9783
msgid "Mixed: Leave working tree untouched, reset index"
msgstr "Смесено: работното дърво остава същото, индексът се занулява"
-#: gitk:9699
+#: gitk:9786
msgid ""
"Hard: Reset working tree and index\n"
"(discard ALL local changes)"
msgstr ""
"Силно: зануляване и на работното дърво, и на индекса\n"
-"(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)"
+"(ВСИЧКИ локални промени ще бъдат безвъзвратно загубени)"
-#: gitk:9716
+#: gitk:9803
msgid "Resetting"
msgstr "Зануляване"
-#: gitk:9776
+#: gitk:9876
+#, tcl-format
+msgid "A local branch named %s exists already"
+msgstr "Вече съществува локален клон „%s“."
+
+#: gitk:9884
msgid "Checking out"
msgstr "Изтегляне"
-#: gitk:9829
+#: gitk:9943
msgid "Cannot delete the currently checked-out branch"
msgstr "Текущо изтегленият клон не може да бъде изтрит"
-#: gitk:9835
+#: gitk:9949
#, tcl-format
msgid ""
"The commits on branch %s aren't on any other branch.\n"
"Really delete branch %s?"
msgstr ""
"Подаванията на клона „%s“ не са на никой друг клон.\n"
-"Наистина ли да се изтрие клонът „%s“?"
+"Наистина ли искате да изтриете клона „%s“?"
-#: gitk:9866
+#: gitk:9980
#, tcl-format
msgid "Tags and heads: %s"
msgstr "Етикети и върхове: %s"
-#: gitk:9883
+#: gitk:9997
msgid "Filter"
msgstr "Филтриране"
-#: gitk:10179
+#: gitk:10293
msgid ""
"Error reading commit topology information; branch and preceding/following "
"tag information will be incomplete."
@@ -1165,201 +1191,201 @@ msgstr ""
"Грешка при прочитането на топологията на подаванията. Информацията за клона "
"и предшестващите/следващите етикети ще е непълна."
-#: gitk:11156
+#: gitk:11270
msgid "Tag"
msgstr "Етикет"
-#: gitk:11160
+#: gitk:11274
msgid "Id"
msgstr "Идентификатор"
-#: gitk:11243
+#: gitk:11357
msgid "Gitk font chooser"
msgstr "Избор на шрифт за Gitk"
-#: gitk:11260
+#: gitk:11374
msgid "B"
msgstr "Ч"
-#: gitk:11263
+#: gitk:11377
msgid "I"
msgstr "К"
-#: gitk:11381
+#: gitk:11495
msgid "Commit list display options"
msgstr "Настройки на списъка с подавания"
-#: gitk:11384
+#: gitk:11498
msgid "Maximum graph width (lines)"
msgstr "Максимална широчина на графа (в редове)"
-#: gitk:11388
+#: gitk:11502
#, no-tcl-format
msgid "Maximum graph width (% of pane)"
msgstr "Максимална широчина на графа (% от панела)"
-#: gitk:11391
+#: gitk:11505
msgid "Show local changes"
msgstr "Показване на локалните промени"
-#: gitk:11394
+#: gitk:11508
msgid "Auto-select SHA1 (length)"
msgstr "Автоматично избиране на SHA1 (дължина)"
-#: gitk:11398
+#: gitk:11512
msgid "Hide remote refs"
msgstr "Скриване на отдалечените указатели"
-#: gitk:11402
+#: gitk:11516
msgid "Diff display options"
msgstr "Настройки на показването на разликите"
-#: gitk:11404
+#: gitk:11518
msgid "Tab spacing"
msgstr "Широчина на табулатора"
-#: gitk:11407
+#: gitk:11521
msgid "Display nearby tags/heads"
msgstr "Извеждане на близките етикети и върхове"
-#: gitk:11410
+#: gitk:11524
msgid "Maximum # tags/heads to show"
msgstr "Максимален брой етикети/върхове за показване"
-#: gitk:11413
+#: gitk:11527
msgid "Limit diffs to listed paths"
msgstr "Разлика само в избраните пътища"
-#: gitk:11416
+#: gitk:11530
msgid "Support per-file encodings"
msgstr "Поддръжка на различни кодирания за всеки файл"
-#: gitk:11422 gitk:11569
+#: gitk:11536 gitk:11683
msgid "External diff tool"
msgstr "Външен инструмент за разлики"
-#: gitk:11423
+#: gitk:11537
msgid "Choose..."
msgstr "Избор…"
-#: gitk:11428
+#: gitk:11542
msgid "General options"
msgstr "Общи настройки"
-#: gitk:11431
+#: gitk:11545
msgid "Use themed widgets"
msgstr "Използване на тема за графичните обекти"
-#: gitk:11433
+#: gitk:11547
msgid "(change requires restart)"
msgstr "(промяната изисква рестартиране на Gitk)"
-#: gitk:11435
+#: gitk:11549
msgid "(currently unavailable)"
msgstr "(в момента недостъпно)"
-#: gitk:11446
+#: gitk:11560
msgid "Colors: press to choose"
msgstr "Цветове: избира се с натискане"
-#: gitk:11449
+#: gitk:11563
msgid "Interface"
msgstr "Интерфейс"
-#: gitk:11450
+#: gitk:11564
msgid "interface"
msgstr "интерфейс"
-#: gitk:11453
+#: gitk:11567
msgid "Background"
msgstr "Фон"
-#: gitk:11454 gitk:11484
+#: gitk:11568 gitk:11598
msgid "background"
msgstr "фон"
-#: gitk:11457
+#: gitk:11571
msgid "Foreground"
msgstr "Знаци"
-#: gitk:11458
+#: gitk:11572
msgid "foreground"
msgstr "знаци"
-#: gitk:11461
+#: gitk:11575
msgid "Diff: old lines"
msgstr "Разлика: стари редове"
-#: gitk:11462
+#: gitk:11576
msgid "diff old lines"
msgstr "разлика, стари редове"
-#: gitk:11466
+#: gitk:11580
msgid "Diff: new lines"
msgstr "Разлика: нови редове"
-#: gitk:11467
+#: gitk:11581
msgid "diff new lines"
msgstr "разлика, нови редове"
-#: gitk:11471
+#: gitk:11585
msgid "Diff: hunk header"
msgstr "Разлика: начало на парче"
-#: gitk:11473
+#: gitk:11587
msgid "diff hunk header"
msgstr "разлика, начало на парче"
-#: gitk:11477
+#: gitk:11591
msgid "Marked line bg"
msgstr "Фон на отбелязан ред"
-#: gitk:11479
+#: gitk:11593
msgid "marked line background"
msgstr "фон на отбелязан ред"
-#: gitk:11483
+#: gitk:11597
msgid "Select bg"
msgstr "Избор на фон"
-#: gitk:11492
+#: gitk:11606
msgid "Fonts: press to choose"
msgstr "Шрифтове: избира се с натискане"
-#: gitk:11494
+#: gitk:11608
msgid "Main font"
msgstr "Основен шрифт"
-#: gitk:11495
+#: gitk:11609
msgid "Diff display font"
msgstr "Шрифт за разликите"
-#: gitk:11496
+#: gitk:11610
msgid "User interface font"
msgstr "Шрифт на интерфейса"
-#: gitk:11518
+#: gitk:11632
msgid "Gitk preferences"
msgstr "Настройки на Gitk"
-#: gitk:11527
+#: gitk:11641
msgid "General"
msgstr "Общи"
-#: gitk:11528
+#: gitk:11642
msgid "Colors"
msgstr "Цветове"
-#: gitk:11529
+#: gitk:11643
msgid "Fonts"
msgstr "Шрифтове"
-#: gitk:11579
+#: gitk:11693
#, tcl-format
msgid "Gitk: choose color for %s"
msgstr "Gitk: избор на цвят на „%s“"
-#: gitk:12092
+#: gitk:12206
msgid ""
"Sorry, gitk cannot run with this version of Tcl/Tk.\n"
" Gitk requires at least Tcl/Tk 8.4."
@@ -1367,15 +1393,15 @@ msgstr ""
"Тази версия на Tcl/Tk не се поддържа от Gitk.\n"
" Необходима ви е поне Tcl/Tk 8.4."
-#: gitk:12302
+#: gitk:12416
msgid "Cannot find a git repository here."
msgstr "Тук липсва хранилище на Git."
-#: gitk:12349
+#: gitk:12463
#, tcl-format
msgid "Ambiguous argument '%s': both revision and filename"
msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл"
-#: gitk:12361
+#: gitk:12475
msgid "Bad arguments to gitk:"
msgstr "Неправилни аргументи на gitk:"
diff --git a/ident.c b/ident.c
index 33bcf40..9c2eb0a 100644
--- a/ident.c
+++ b/ident.c
@@ -11,6 +11,10 @@
static struct strbuf git_default_name = STRBUF_INIT;
static struct strbuf git_default_email = STRBUF_INIT;
static struct strbuf git_default_date = STRBUF_INIT;
+static struct strbuf git_author_name = STRBUF_INIT;
+static struct strbuf git_author_email = STRBUF_INIT;
+static struct strbuf git_committer_name = STRBUF_INIT;
+static struct strbuf git_committer_email = STRBUF_INIT;
static int default_email_is_bogus;
static int default_name_is_bogus;
@@ -355,7 +359,7 @@ N_("\n"
"\n");
const char *fmt_ident(const char *name, const char *email,
- const char *date_str, int flag)
+ enum want_ident whose_ident, const char *date_str, int flag)
{
static struct strbuf ident = STRBUF_INIT;
int strict = (flag & IDENT_STRICT);
@@ -363,6 +367,12 @@ const char *fmt_ident(const char *name, const char *email,
int want_name = !(flag & IDENT_NO_NAME);
if (!email) {
+ if (whose_ident == WANT_AUTHOR_IDENT && git_author_email.len)
+ email = git_author_email.buf;
+ else if (whose_ident == WANT_COMMITTER_IDENT && git_committer_email.len)
+ email = git_committer_email.buf;
+ }
+ if (!email) {
if (strict && ident_use_config_only
&& !(ident_config_given & IDENT_MAIL_GIVEN)) {
fputs(_(env_hint), stderr);
@@ -378,6 +388,13 @@ const char *fmt_ident(const char *name, const char *email,
if (want_name) {
int using_default = 0;
if (!name) {
+ if (whose_ident == WANT_AUTHOR_IDENT && git_author_name.len)
+ name = git_author_name.buf;
+ else if (whose_ident == WANT_COMMITTER_IDENT &&
+ git_committer_name.len)
+ name = git_committer_name.buf;
+ }
+ if (!name) {
if (strict && ident_use_config_only
&& !(ident_config_given & IDENT_NAME_GIVEN)) {
fputs(_(env_hint), stderr);
@@ -425,9 +442,25 @@ const char *fmt_ident(const char *name, const char *email,
return ident.buf;
}
-const char *fmt_name(const char *name, const char *email)
+const char *fmt_name(enum want_ident whose_ident)
{
- return fmt_ident(name, email, NULL, IDENT_STRICT | IDENT_NO_DATE);
+ char *name = NULL;
+ char *email = NULL;
+
+ switch (whose_ident) {
+ case WANT_BLANK_IDENT:
+ break;
+ case WANT_AUTHOR_IDENT:
+ name = getenv("GIT_AUTHOR_NAME");
+ email = getenv("GIT_AUTHOR_EMAIL");
+ break;
+ case WANT_COMMITTER_IDENT:
+ name = getenv("GIT_COMMITTER_NAME");
+ email = getenv("GIT_COMMITTER_EMAIL");
+ break;
+ }
+ return fmt_ident(name, email, whose_ident, NULL,
+ IDENT_STRICT | IDENT_NO_DATE);
}
const char *git_author_info(int flag)
@@ -438,6 +471,7 @@ const char *git_author_info(int flag)
author_ident_explicitly_given |= IDENT_MAIL_GIVEN;
return fmt_ident(getenv("GIT_AUTHOR_NAME"),
getenv("GIT_AUTHOR_EMAIL"),
+ WANT_AUTHOR_IDENT,
getenv("GIT_AUTHOR_DATE"),
flag);
}
@@ -450,6 +484,7 @@ const char *git_committer_info(int flag)
committer_ident_explicitly_given |= IDENT_MAIL_GIVEN;
return fmt_ident(getenv("GIT_COMMITTER_NAME"),
getenv("GIT_COMMITTER_EMAIL"),
+ WANT_COMMITTER_IDENT,
getenv("GIT_COMMITTER_DATE"),
flag);
}
@@ -473,10 +508,45 @@ int author_ident_sufficiently_given(void)
return ident_is_sufficient(author_ident_explicitly_given);
}
-int git_ident_config(const char *var, const char *value, void *data)
+static int set_ident(const char *var, const char *value)
{
- if (!strcmp(var, "user.useconfigonly")) {
- ident_use_config_only = git_config_bool(var, value);
+ if (!strcmp(var, "author.name")) {
+ if (!value)
+ return config_error_nonbool(var);
+ strbuf_reset(&git_author_name);
+ strbuf_addstr(&git_author_name, value);
+ author_ident_explicitly_given |= IDENT_NAME_GIVEN;
+ ident_config_given |= IDENT_NAME_GIVEN;
+ return 0;
+ }
+
+ if (!strcmp(var, "author.email")) {
+ if (!value)
+ return config_error_nonbool(var);
+ strbuf_reset(&git_author_email);
+ strbuf_addstr(&git_author_email, value);
+ author_ident_explicitly_given |= IDENT_MAIL_GIVEN;
+ ident_config_given |= IDENT_MAIL_GIVEN;
+ return 0;
+ }
+
+ if (!strcmp(var, "committer.name")) {
+ if (!value)
+ return config_error_nonbool(var);
+ strbuf_reset(&git_committer_name);
+ strbuf_addstr(&git_committer_name, value);
+ committer_ident_explicitly_given |= IDENT_NAME_GIVEN;
+ ident_config_given |= IDENT_NAME_GIVEN;
+ return 0;
+ }
+
+ if (!strcmp(var, "committer.email")) {
+ if (!value)
+ return config_error_nonbool(var);
+ strbuf_reset(&git_committer_email);
+ strbuf_addstr(&git_committer_email, value);
+ committer_ident_explicitly_given |= IDENT_MAIL_GIVEN;
+ ident_config_given |= IDENT_MAIL_GIVEN;
return 0;
}
@@ -505,6 +575,16 @@ int git_ident_config(const char *var, const char *value, void *data)
return 0;
}
+int git_ident_config(const char *var, const char *value, void *data)
+{
+ if (!strcmp(var, "user.useconfigonly")) {
+ ident_use_config_only = git_config_bool(var, value);
+ return 0;
+ }
+
+ return set_ident(var, value);
+}
+
static int buf_cmp(const char *a_begin, const char *a_end,
const char *b_begin, const char *b_end)
{
diff --git a/list-objects-filter-options.c b/list-objects-filter-options.c
index b71bd1f..c0036f7 100644
--- a/list-objects-filter-options.c
+++ b/list-objects-filter-options.c
@@ -82,6 +82,10 @@ static int gently_parse_list_objects_filter(
filter_options->sparse_path_value = strdup(v0);
return 0;
}
+ /*
+ * Please update _git_fetch() in git-completion.bash when you
+ * add new filters
+ */
if (errbuf)
strbuf_addf(errbuf, "invalid filter-spec '%s'", arg);
diff --git a/log-tree.c b/log-tree.c
index 3cb1425..1e56df6 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -687,8 +687,7 @@ void show_log(struct rev_info *opt)
*/
if (ctx.need_8bit_cte >= 0 && opt->add_signoff)
ctx.need_8bit_cte =
- has_non_ascii(fmt_name(getenv("GIT_COMMITTER_NAME"),
- getenv("GIT_COMMITTER_EMAIL")));
+ has_non_ascii(fmt_name(WANT_COMMITTER_IDENT));
ctx.date_mode = opt->date_mode;
ctx.date_mode_explicit = opt->date_mode_explicit;
ctx.abbrev = opt->diffopt.abbrev;
diff --git a/merge-recursive.c b/merge-recursive.c
index 4851825..6c40c61 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1402,8 +1402,7 @@ static int merge_mode_and_contents(struct merge_options *o,
static int handle_rename_via_dir(struct merge_options *o,
struct diff_filepair *pair,
- const char *rename_branch,
- const char *other_branch)
+ const char *rename_branch)
{
/*
* Handle file adds that need to be renamed due to directory rename
@@ -2213,8 +2212,7 @@ static void handle_directory_level_conflicts(struct merge_options *o,
remove_hashmap_entries(dir_re_merge, &remove_from_merge);
}
-static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs,
- struct tree *tree)
+static struct hashmap *get_directory_renames(struct diff_queue_struct *pairs)
{
struct hashmap *dir_renames;
struct hashmap_iter iter;
@@ -2460,8 +2458,7 @@ static void apply_directory_rename_modifications(struct merge_options *o,
struct tree *o_tree,
struct tree *a_tree,
struct tree *b_tree,
- struct string_list *entries,
- int *clean)
+ struct string_list *entries)
{
struct string_list_item *item;
int stage = (tree == a_tree ? 2 : 3);
@@ -2632,8 +2629,7 @@ static struct string_list *get_renames(struct merge_options *o,
apply_directory_rename_modifications(o, pair, new_path,
re, tree, o_tree,
a_tree, b_tree,
- entries,
- clean_merge);
+ entries);
}
hashmap_iter_init(&collisions, &iter);
@@ -2944,8 +2940,8 @@ static int detect_and_process_renames(struct merge_options *o,
merge_pairs = get_diffpairs(o, common, merge);
if (o->detect_directory_renames) {
- dir_re_head = get_directory_renames(head_pairs, head);
- dir_re_merge = get_directory_renames(merge_pairs, merge);
+ dir_re_head = get_directory_renames(head_pairs);
+ dir_re_merge = get_directory_renames(merge_pairs);
handle_directory_level_conflicts(o,
dir_re_head, head,
@@ -3268,8 +3264,7 @@ static int process_entry(struct merge_options *o,
clean_merge = 1;
if (handle_rename_via_dir(o,
conflict_info->pair1,
- conflict_info->branch1,
- conflict_info->branch2))
+ conflict_info->branch1))
clean_merge = -1;
break;
case RENAME_ADD:
@@ -3764,6 +3759,10 @@ int parse_merge_opt(struct merge_options *o, const char *s)
return -1;
o->merge_detect_rename = 1;
}
+ /*
+ * Please update $__git_merge_strategy_options in
+ * git-completion.bash when you add new options
+ */
else
return -1;
return 0;
diff --git a/pack-objects.c b/pack-objects.c
index e7cd337..ce33b89 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -119,8 +119,7 @@ static void prepare_in_pack_by_idx(struct packing_data *pdata)
* this fall back code, just stay simple and fall back to using
* in_pack[] array.
*/
-void oe_map_new_pack(struct packing_data *pack,
- struct packed_git *p)
+void oe_map_new_pack(struct packing_data *pack)
{
uint32_t i;
diff --git a/pack-objects.h b/pack-objects.h
index 6bfacc7..6fde7ce 100644
--- a/pack-objects.h
+++ b/pack-objects.h
@@ -247,14 +247,14 @@ static inline struct packed_git *oe_in_pack(const struct packing_data *pack,
return pack->in_pack[e - pack->objects];
}
-void oe_map_new_pack(struct packing_data *pack,
- struct packed_git *p);
+void oe_map_new_pack(struct packing_data *pack);
+
static inline void oe_set_in_pack(struct packing_data *pack,
struct object_entry *e,
struct packed_git *p)
{
if (!p->index)
- oe_map_new_pack(pack, p);
+ oe_map_new_pack(pack);
if (pack->in_pack_by_idx)
e->in_pack_idx = p->index;
else
diff --git a/pager.c b/pager.c
index a768797..4168460 100644
--- a/pager.c
+++ b/pager.c
@@ -100,6 +100,7 @@ void prepare_pager_args(struct child_process *pager_process, const char *pager)
argv_array_push(&pager_process->args, pager);
pager_process->use_shell = 1;
setup_pager_env(&pager_process->env_array);
+ pager_process->trace2_child_class = "pager";
}
void setup_pager(void)
diff --git a/parse-options-cb.c b/parse-options-cb.c
index e2f3eae..2733393 100644
--- a/parse-options-cb.c
+++ b/parse-options-cb.c
@@ -170,9 +170,12 @@ int parse_opt_noop_cb(const struct option *opt, const char *arg, int unset)
* "-h" output even if it's not being handled directly by
* parse_options().
*/
-int parse_opt_unknown_cb(const struct option *opt, const char *arg, int unset)
+enum parse_opt_result parse_opt_unknown_cb(struct parse_opt_ctx_t *ctx,
+ const struct option *opt,
+ const char *arg, int unset)
{
- return -2;
+ BUG_ON_OPT_ARG(arg);
+ return PARSE_OPT_UNKNOWN;
}
/**
diff --git a/parse-options.c b/parse-options.c
index 9f84bac..cec7452 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -20,8 +20,9 @@ int optbug(const struct option *opt, const char *reason)
return error("BUG: switch '%c' %s", opt->short_name, reason);
}
-static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt,
- int flags, const char **arg)
+static enum parse_opt_result get_arg(struct parse_opt_ctx_t *p,
+ const struct option *opt,
+ int flags, const char **arg)
{
if (p->opt) {
*arg = p->opt;
@@ -44,9 +45,10 @@ static void fix_filename(const char *prefix, const char **file)
*file = prefix_filename(prefix, *file);
}
-static int opt_command_mode_error(const struct option *opt,
- const struct option *all_opts,
- int flags)
+static enum parse_opt_result opt_command_mode_error(
+ const struct option *opt,
+ const struct option *all_opts,
+ int flags)
{
const struct option *that;
struct strbuf that_name = STRBUF_INIT;
@@ -69,16 +71,16 @@ static int opt_command_mode_error(const struct option *opt,
error(_("%s is incompatible with %s"),
optname(opt, flags), that_name.buf);
strbuf_release(&that_name);
- return -1;
+ return PARSE_OPT_ERROR;
}
return error(_("%s : incompatible with something else"),
optname(opt, flags));
}
-static int get_value(struct parse_opt_ctx_t *p,
- const struct option *opt,
- const struct option *all_opts,
- int flags)
+static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
+ const struct option *opt,
+ const struct option *all_opts,
+ int flags)
{
const char *s, *arg;
const int unset = flags & OPT_UNSET;
@@ -93,7 +95,7 @@ static int get_value(struct parse_opt_ctx_t *p,
switch (opt->type) {
case OPTION_LOWLEVEL_CALLBACK:
- return (*(parse_opt_ll_cb *)opt->callback)(p, opt, unset);
+ return opt->ll_callback(p, opt, NULL, unset);
case OPTION_BIT:
if (unset)
@@ -109,6 +111,13 @@ static int get_value(struct parse_opt_ctx_t *p,
*(int *)opt->value &= ~opt->defval;
return 0;
+ case OPTION_BITOP:
+ if (unset)
+ BUG("BITOP can't have unset form");
+ *(int *)opt->value &= ~opt->extra;
+ *(int *)opt->value |= opt->defval;
+ return 0;
+
case OPTION_COUNTUP:
if (*(int *)opt->value < 0)
*(int *)opt->value = 0;
@@ -152,16 +161,27 @@ static int get_value(struct parse_opt_ctx_t *p,
return err;
case OPTION_CALLBACK:
+ {
+ const char *p_arg = NULL;
+ int p_unset;
+
if (unset)
- return (*opt->callback)(opt, NULL, 1) ? (-1) : 0;
- if (opt->flags & PARSE_OPT_NOARG)
- return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
- if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
- return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
- if (get_arg(p, opt, flags, &arg))
+ p_unset = 1;
+ else if (opt->flags & PARSE_OPT_NOARG)
+ p_unset = 0;
+ else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
+ p_unset = 0;
+ else if (get_arg(p, opt, flags, &arg))
return -1;
- return (*opt->callback)(opt, arg, 0) ? (-1) : 0;
-
+ else {
+ p_unset = 0;
+ p_arg = arg;
+ }
+ if (opt->callback)
+ return (*opt->callback)(opt, p_arg, p_unset) ? (-1) : 0;
+ else
+ return (*opt->ll_callback)(p, opt, p_arg, p_unset);
+ }
case OPTION_INTEGER:
if (unset) {
*(int *)opt->value = 0;
@@ -201,7 +221,8 @@ static int get_value(struct parse_opt_ctx_t *p,
}
}
-static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *options)
+static enum parse_opt_result parse_short_opt(struct parse_opt_ctx_t *p,
+ const struct option *options)
{
const struct option *all_opts = options;
const struct option *numopt = NULL;
@@ -228,15 +249,19 @@ static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *optio
len++;
arg = xmemdupz(p->opt, len);
p->opt = p->opt[len] ? p->opt + len : NULL;
- rc = (*numopt->callback)(numopt, arg, 0) ? (-1) : 0;
+ if (numopt->callback)
+ rc = (*numopt->callback)(numopt, arg, 0) ? (-1) : 0;
+ else
+ rc = (*numopt->ll_callback)(p, numopt, arg, 0);
free(arg);
return rc;
}
- return -2;
+ return PARSE_OPT_UNKNOWN;
}
-static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
- const struct option *options)
+static enum parse_opt_result parse_long_opt(
+ struct parse_opt_ctx_t *p, const char *arg,
+ const struct option *options)
{
const struct option *all_opts = options;
const char *arg_end = strchrnul(arg, '=');
@@ -262,11 +287,12 @@ again:
if (*rest)
continue;
p->out[p->cpidx++] = arg - 2;
- return 0;
+ return PARSE_OPT_DONE;
}
if (!rest) {
/* abbreviated? */
- if (!strncmp(long_name, arg, arg_end - arg)) {
+ if (!(p->flags & PARSE_OPT_KEEP_UNKNOWN) &&
+ !strncmp(long_name, arg, arg_end - arg)) {
is_abbreviated:
if (abbrev_option) {
/*
@@ -326,11 +352,11 @@ is_abbreviated:
ambiguous_option->long_name,
(abbrev_flags & OPT_UNSET) ? "no-" : "",
abbrev_option->long_name);
- return -3;
+ return PARSE_OPT_HELP;
}
if (abbrev_option)
return get_value(p, abbrev_option, all_opts, abbrev_flags);
- return -2;
+ return PARSE_OPT_UNKNOWN;
}
static int parse_nodash_opt(struct parse_opt_ctx_t *p, const char *arg,
@@ -400,6 +426,19 @@ static void parse_options_check(const struct option *opts)
if ((opts->flags & PARSE_OPT_OPTARG) ||
!(opts->flags & PARSE_OPT_NOARG))
err |= optbug(opts, "should not accept an argument");
+ break;
+ case OPTION_CALLBACK:
+ if (!opts->callback && !opts->ll_callback)
+ BUG("OPTION_CALLBACK needs one callback");
+ if (opts->callback && opts->ll_callback)
+ BUG("OPTION_CALLBACK can't have two callbacks");
+ break;
+ case OPTION_LOWLEVEL_CALLBACK:
+ if (!opts->ll_callback)
+ BUG("OPTION_LOWLEVEL_CALLBACK needs a callback");
+ if (opts->callback)
+ BUG("OPTION_LOWLEVEL_CALLBACK needs no high level callback");
+ break;
default:
; /* ok. (usually accepts an argument) */
}
@@ -416,15 +455,24 @@ void parse_options_start(struct parse_opt_ctx_t *ctx,
const struct option *options, int flags)
{
memset(ctx, 0, sizeof(*ctx));
- ctx->argc = ctx->total = argc - 1;
- ctx->argv = argv + 1;
- ctx->out = argv;
+ ctx->argc = argc;
+ ctx->argv = argv;
+ if (!(flags & PARSE_OPT_ONE_SHOT)) {
+ ctx->argc--;
+ ctx->argv++;
+ }
+ ctx->total = ctx->argc;
+ ctx->out = argv;
ctx->prefix = prefix;
ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
ctx->flags = flags;
if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
- (flags & PARSE_OPT_STOP_AT_NON_OPTION))
+ (flags & PARSE_OPT_STOP_AT_NON_OPTION) &&
+ !(flags & PARSE_OPT_ONE_SHOT))
BUG("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
+ if ((flags & PARSE_OPT_ONE_SHOT) &&
+ (flags & PARSE_OPT_KEEP_ARGV0))
+ BUG("Can't keep argv0 if you don't have it");
parse_options_check(options);
}
@@ -536,6 +584,10 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
for (; ctx->argc; ctx->argc--, ctx->argv++) {
const char *arg = ctx->argv[0];
+ if (ctx->flags & PARSE_OPT_ONE_SHOT &&
+ ctx->argc != ctx->total)
+ break;
+
if (*arg != '-' || !arg[1]) {
if (parse_nodash_opt(ctx, arg, options) == 0)
continue;
@@ -556,22 +608,28 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
if (arg[1] != '-') {
ctx->opt = arg + 1;
switch (parse_short_opt(ctx, options)) {
- case -1:
+ case PARSE_OPT_ERROR:
return PARSE_OPT_ERROR;
- case -2:
+ case PARSE_OPT_UNKNOWN:
if (ctx->opt)
check_typos(arg + 1, options);
if (internal_help && *ctx->opt == 'h')
goto show_usage;
goto unknown;
+ case PARSE_OPT_NON_OPTION:
+ case PARSE_OPT_HELP:
+ case PARSE_OPT_COMPLETE:
+ BUG("parse_short_opt() cannot return these");
+ case PARSE_OPT_DONE:
+ break;
}
if (ctx->opt)
check_typos(arg + 1, options);
while (ctx->opt) {
switch (parse_short_opt(ctx, options)) {
- case -1:
+ case PARSE_OPT_ERROR:
return PARSE_OPT_ERROR;
- case -2:
+ case PARSE_OPT_UNKNOWN:
if (internal_help && *ctx->opt == 'h')
goto show_usage;
@@ -583,6 +641,12 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
ctx->argv[0] = xstrdup(ctx->opt - 1);
*(char *)ctx->argv[0] = '-';
goto unknown;
+ case PARSE_OPT_NON_OPTION:
+ case PARSE_OPT_COMPLETE:
+ case PARSE_OPT_HELP:
+ BUG("parse_short_opt() cannot return these");
+ case PARSE_OPT_DONE:
+ break;
}
}
continue;
@@ -601,15 +665,22 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
if (internal_help && !strcmp(arg + 2, "help"))
goto show_usage;
switch (parse_long_opt(ctx, arg + 2, options)) {
- case -1:
+ case PARSE_OPT_ERROR:
return PARSE_OPT_ERROR;
- case -2:
+ case PARSE_OPT_UNKNOWN:
goto unknown;
- case -3:
+ case PARSE_OPT_HELP:
goto show_usage;
+ case PARSE_OPT_NON_OPTION:
+ case PARSE_OPT_COMPLETE:
+ BUG("parse_long_opt() cannot return these");
+ case PARSE_OPT_DONE:
+ break;
}
continue;
unknown:
+ if (ctx->flags & PARSE_OPT_ONE_SHOT)
+ break;
if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN))
return PARSE_OPT_UNKNOWN;
ctx->out[ctx->cpidx++] = ctx->argv[0];
@@ -623,6 +694,9 @@ unknown:
int parse_options_end(struct parse_opt_ctx_t *ctx)
{
+ if (ctx->flags & PARSE_OPT_ONE_SHOT)
+ return ctx->total - ctx->argc;
+
MOVE_ARRAY(ctx->out + ctx->cpidx, ctx->argv, ctx->argc);
ctx->out[ctx->cpidx + ctx->argc] = NULL;
return ctx->cpidx + ctx->argc;
diff --git a/parse-options.h b/parse-options.h
index 14fe324..7d83e29 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -10,6 +10,7 @@ enum parse_opt_type {
/* options with no arguments */
OPTION_BIT,
OPTION_NEGBIT,
+ OPTION_BITOP,
OPTION_COUNTUP,
OPTION_SET_INT,
OPTION_CMDMODE,
@@ -27,7 +28,8 @@ enum parse_opt_flags {
PARSE_OPT_STOP_AT_NON_OPTION = 2,
PARSE_OPT_KEEP_ARGV0 = 4,
PARSE_OPT_KEEP_UNKNOWN = 8,
- PARSE_OPT_NO_INTERNAL_HELP = 16
+ PARSE_OPT_NO_INTERNAL_HELP = 16,
+ PARSE_OPT_ONE_SHOT = 32
};
enum parse_opt_option_flags {
@@ -47,8 +49,9 @@ struct option;
typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
struct parse_opt_ctx_t;
-typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
- const struct option *opt, int unset);
+typedef enum parse_opt_result parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
+ const struct option *opt,
+ const char *arg, int unset);
/*
* `type`::
@@ -98,13 +101,16 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
* the option takes optional argument.
*
* `callback`::
- * pointer to the callback to use for OPTION_CALLBACK or
- * OPTION_LOWLEVEL_CALLBACK.
+ * pointer to the callback to use for OPTION_CALLBACK
*
* `defval`::
* default value to fill (*->value) with for PARSE_OPT_OPTARG.
* OPTION_{BIT,SET_INT} store the {mask,integer} to put in the value when met.
* CALLBACKS can use it like they want.
+ *
+ * `ll_callback`::
+ * pointer to the callback to use for OPTION_LOWLEVEL_CALLBACK
+ *
*/
struct option {
enum parse_opt_type type;
@@ -117,6 +123,8 @@ struct option {
int flags;
parse_opt_cb *callback;
intptr_t defval;
+ parse_opt_ll_cb *ll_callback;
+ intptr_t extra;
};
#define OPT_BIT_F(s, l, v, h, b, f) { OPTION_BIT, (s), (l), (v), NULL, (h), \
@@ -126,12 +134,17 @@ struct option {
#define OPT_SET_INT_F(s, l, v, h, i, f) { OPTION_SET_INT, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG | (f), NULL, (i) }
#define OPT_BOOL_F(s, l, v, h, f) OPT_SET_INT_F(s, l, v, h, 1, f)
+#define OPT_CALLBACK_F(s, l, v, a, h, f, cb) \
+ { OPTION_CALLBACK, (s), (l), (v), (a), (h), (f), (cb) }
#define OPT_END() { OPTION_END }
#define OPT_ARGUMENT(l, h) { OPTION_ARGUMENT, 0, (l), NULL, NULL, \
(h), PARSE_OPT_NOARG}
#define OPT_GROUP(h) { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
#define OPT_BIT(s, l, v, h, b) OPT_BIT_F(s, l, v, h, b, 0)
+#define OPT_BITOP(s, l, v, h, set, clear) { OPTION_BITOP, (s), (l), (v), NULL, (h), \
+ PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, \
+ (set), NULL, (clear) }
#define OPT_NEGBIT(s, l, v, h, b) { OPTION_NEGBIT, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG, NULL, (b) }
#define OPT_COUNTUP(s, l, v, h) OPT_COUNTUP_F(s, l, v, h, 0)
@@ -153,8 +166,7 @@ struct option {
#define OPT_EXPIRY_DATE(s, l, v, h) \
{ OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0, \
parse_opt_expiry_date_cb }
-#define OPT_CALLBACK(s, l, v, a, h, f) \
- { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
+#define OPT_CALLBACK(s, l, v, a, h, f) OPT_CALLBACK_F(s, l, v, a, h, 0, f)
#define OPT_NUMBER_CALLBACK(v, h, f) \
{ OPTION_NUMBER, 0, NULL, (v), NULL, (h), \
PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) }
@@ -169,23 +181,31 @@ struct option {
N_("no-op (backward compatibility)"), \
PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb }
-/* parse_options() will filter out the processed options and leave the
- * non-option arguments in argv[]. usagestr strings should be marked
- * for translation with N_().
+/*
+ * parse_options() will filter out the processed options and leave the
+ * non-option arguments in argv[]. argv0 is assumed program name and
+ * skipped.
+ *
+ * usagestr strings should be marked for translation with N_().
+ *
* Returns the number of arguments left in argv[].
+ *
+ * In one-shot mode, argv0 is not a program name, argv[] is left
+ * untouched and parse_options() returns the number of options
+ * processed.
*/
-extern int parse_options(int argc, const char **argv, const char *prefix,
- const struct option *options,
- const char * const usagestr[], int flags);
+int parse_options(int argc, const char **argv, const char *prefix,
+ const struct option *options,
+ const char * const usagestr[], int flags);
-extern NORETURN void usage_with_options(const char * const *usagestr,
- const struct option *options);
+NORETURN void usage_with_options(const char * const *usagestr,
+ const struct option *options);
-extern NORETURN void usage_msg_opt(const char *msg,
- const char * const *usagestr,
- const struct option *options);
+NORETURN void usage_msg_opt(const char *msg,
+ const char * const *usagestr,
+ const struct option *options);
-extern int optbug(const struct option *opt, const char *reason);
+int optbug(const struct option *opt, const char *reason);
const char *optname(const struct option *opt, int flags);
/*
@@ -204,12 +224,12 @@ const char *optname(const struct option *opt, int flags);
/*----- incremental advanced APIs -----*/
-enum {
- PARSE_OPT_COMPLETE = -2,
- PARSE_OPT_HELP = -1,
- PARSE_OPT_DONE,
+enum parse_opt_result {
+ PARSE_OPT_COMPLETE = -3,
+ PARSE_OPT_HELP = -2,
+ PARSE_OPT_ERROR = -1, /* must be the same as error() */
+ PARSE_OPT_DONE = 0, /* fixed so that "return 0" works */
PARSE_OPT_NON_OPTION,
- PARSE_OPT_ERROR,
PARSE_OPT_UNKNOWN
};
@@ -227,31 +247,31 @@ struct parse_opt_ctx_t {
const char *prefix;
};
-extern void parse_options_start(struct parse_opt_ctx_t *ctx,
- int argc, const char **argv, const char *prefix,
- const struct option *options, int flags);
+void parse_options_start(struct parse_opt_ctx_t *ctx,
+ int argc, const char **argv, const char *prefix,
+ const struct option *options, int flags);
-extern int parse_options_step(struct parse_opt_ctx_t *ctx,
- const struct option *options,
- const char * const usagestr[]);
+int parse_options_step(struct parse_opt_ctx_t *ctx,
+ const struct option *options,
+ const char * const usagestr[]);
-extern int parse_options_end(struct parse_opt_ctx_t *ctx);
+int parse_options_end(struct parse_opt_ctx_t *ctx);
-extern struct option *parse_options_concat(struct option *a, struct option *b);
+struct option *parse_options_concat(struct option *a, struct option *b);
/*----- some often used options -----*/
-extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
-extern int parse_opt_expiry_date_cb(const struct option *, const char *, int);
-extern int parse_opt_color_flag_cb(const struct option *, const char *, int);
-extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
-extern int parse_opt_object_name(const struct option *, const char *, int);
-extern int parse_opt_commits(const struct option *, const char *, int);
-extern int parse_opt_tertiary(const struct option *, const char *, int);
-extern int parse_opt_string_list(const struct option *, const char *, int);
-extern int parse_opt_noop_cb(const struct option *, const char *, int);
-extern int parse_opt_unknown_cb(const struct option *, const char *, int);
-extern int parse_opt_passthru(const struct option *, const char *, int);
-extern int parse_opt_passthru_argv(const struct option *, const char *, int);
+int parse_opt_abbrev_cb(const struct option *, const char *, int);
+int parse_opt_expiry_date_cb(const struct option *, const char *, int);
+int parse_opt_color_flag_cb(const struct option *, const char *, int);
+int parse_opt_verbosity_cb(const struct option *, const char *, int);
+int parse_opt_object_name(const struct option *, const char *, int);
+int parse_opt_commits(const struct option *, const char *, int);
+int parse_opt_tertiary(const struct option *, const char *, int);
+int parse_opt_string_list(const struct option *, const char *, int);
+int parse_opt_noop_cb(const struct option *, const char *, int);
+int parse_opt_unknown_cb(struct parse_opt_ctx_t *ctx, const struct option *, const char *, int);
+int parse_opt_passthru(const struct option *, const char *, int);
+int parse_opt_passthru_argv(const struct option *, const char *, int);
#define OPT__VERBOSE(var, h) OPT_COUNTUP('v', "verbose", (var), (h))
#define OPT__QUIET(var, h) OPT_COUNTUP('q', "quiet", (var), (h))
diff --git a/pkt-line.c b/pkt-line.c
index d4b71d3..60329b3 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -117,7 +117,7 @@ void packet_buf_delim(struct strbuf *buf)
strbuf_add(buf, "0001", 4);
}
-static void set_packet_header(char *buf, const int size)
+void set_packet_header(char *buf, const int size)
{
static char hexchar[] = "0123456789abcdef";
diff --git a/pkt-line.h b/pkt-line.h
index ad9a4a2..c36cb78 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -25,6 +25,7 @@ void packet_delim(int fd);
void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
void packet_buf_flush(struct strbuf *buf);
void packet_buf_delim(struct strbuf *buf);
+void set_packet_header(char *buf, int size);
void packet_write(int fd_out, const char *buf, size_t size);
void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
void packet_buf_write_len(struct strbuf *buf, const char *data, size_t len);
diff --git a/po/ca.po b/po/ca.po
index 7f0cec1..f0b7e2c 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -1,7 +1,7 @@
# Catalan translations for Git.
# This file is distributed under the same license as the Git package.
# Alex Henrie <alexhenrie24@gmail.com>, 2014-2016.
-# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2016-2018
+# Jordi Mas i Hernàndez <jmas@softcatala.org>, 2016-2019
#
# Terminologia i criteris utilitzats
#
@@ -3284,7 +3284,7 @@ msgid "Adding %s"
msgstr "S'està afegint %s"
#: merge-recursive.c:3300
-#y, c-format
+#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
" %s"
@@ -6758,7 +6758,7 @@ msgstr ""
#, c-format
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
-" (useu \"git %s <fitxer>...\" per a incloure-ho en el qual es cometrà)"
+" (useu \"git %s <fitxer>...\" per a incloure-ho en el que es cometrà)"
#: wt-status.c:256
msgid "both deleted:"
diff --git a/po/fr.po b/po/fr.po
index 7b15b76..0e084f5 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -22474,1503 +22474,3 @@ msgstr "%s sauté avec un suffix de sauvegarde '%s'.\n"
#, perl-format
msgid "Do you really want to send %s? [y|N]: "
msgstr "Souhaitez-vous réellement envoyer %s ?[y|N] : "
-
-#~ msgid "--reschedule-failed-exec requires an interactive rebase"
-#~ msgstr "--reschedule-failed-exec requiert un rebasage interactif"
-
-#, fuzzy
-#~| msgid "git archive [<options>] <tree-ish> [<path>...]"
-#~ msgid "git diff --no-index [<options>] <path> <path>"
-#~ msgstr "git archive [<options>] <arbre ou apparenté> [<chemin>...]"
-
-#, fuzzy
-#~| msgid "invalid sparse value '%s'"
-#~ msgid "invalid --stat value: %s"
-#~ msgstr "valeur invalide de 'sparse' '%s'"
-
-#, fuzzy
-#~| msgid "unable to create '%s'"
-#~ msgid "unable to resolve '%s'"
-#~ msgstr "impossible de créer '%s'"
-
-#, fuzzy
-#~| msgid "expected wanted-ref, got '%s'"
-#~ msgid "%s expects a character, got '%s'"
-#~ msgstr "wanted-ref attendu, '%s' trouvé"
-
-#, fuzzy
-#~| msgid "invalid color '%s' in color.blame.repeatedLines"
-#~ msgid "invalid mode '%s' in --color-moved-ws"
-#~ msgstr "couleur invalide '%s' dans color.blame.repeatedlines"
-
-#, fuzzy
-#~| msgid "invalid value for %s"
-#~ msgid "invalid argument to %s"
-#~ msgstr "Valeur invalide pour %s"
-
-#, fuzzy
-#~| msgid "bad number of arguments"
-#~ msgid "bad --word-diff argument: %s"
-#~ msgstr "mauvais nombre d'arguments"
-
-#, fuzzy
-#~| msgid "Generating patches"
-#~ msgid "generate patch"
-#~ msgstr "Génération des patchs"
-
-#, fuzzy
-#~| msgid "ensure at least <n> lines of context match"
-#~ msgid "generate diffs with <n> lines context"
-#~ msgstr "s'assurer d'au moins <n> lignes de correspondance de contexte"
-
-#, fuzzy
-#~| msgid "(synonym to --stat)"
-#~ msgid "synonym for '-p --raw'"
-#~ msgstr "(synonyme de --stat)"
-
-#, fuzzy
-#~| msgid "(synonym to --stat)"
-#~ msgid "synonym for '-p --stat'"
-#~ msgstr "(synonyme de --stat)"
-
-#, fuzzy
-#~| msgid "machine-readable output"
-#~ msgid "machine friendly --stat"
-#~ msgstr "sortie pour traitement automatique"
-
-#, fuzzy
-#~| msgid "output only the trailers"
-#~ msgid "output only the last line of --stat"
-#~ msgstr "éliminer les lignes terminales vides"
-
-#, fuzzy
-#~| msgid "synonym for --files-with-matches"
-#~ msgid "synonym for --dirstat=cumulative"
-#~ msgstr "synonyme pour --files-with-matches"
-
-#, fuzzy
-#~| msgid "show only filenames instead of matching lines"
-#~ msgid "show only names of changed files"
-#~ msgstr ""
-#~ "n'afficher que les noms de fichiers au lieu des lignes correspondant"
-
-#, fuzzy
-#~| msgid "show only filenames instead of matching lines"
-#~ msgid "show only names and status of changed files"
-#~ msgstr ""
-#~ "n'afficher que les noms de fichiers au lieu des lignes correspondant"
-
-#, fuzzy
-#~| msgid "failed to generate diff"
-#~ msgid "generate diffstat"
-#~ msgstr "échec de la génération de diff"
-
-#, fuzzy
-#~| msgid "show ignored files"
-#~ msgid "show colored diff"
-#~ msgstr "afficher les fichiers ignorés"
-
-#, fuzzy
-#~| msgid "<prefix>/"
-#~ msgid "<prefix>"
-#~ msgstr "<préfixe>/"
-
-#, fuzzy
-#~| msgid "prepend parent project's basename to output"
-#~ msgid "prepend an additional prefix to every line of output"
-#~ msgstr "préfixer le nom de base du projet parent à la sortie"
-
-#, fuzzy
-#~| msgid ""
-#~| "Create a shallow clone truncated to the specified number of revisions"
-#~ msgid "show context between diff hunks up to the specified number of lines"
-#~ msgstr "Créer un clone superficiel tronqué au nombre de révisions spécifié"
-
-#, fuzzy
-#~| msgid "Generic options"
-#~ msgid "Diff rename options"
-#~ msgstr "Options génériques"
-
-#, fuzzy
-#~| msgid "<n>[,<base>]"
-#~ msgid "<n>[/<m>]"
-#~ msgstr "<n>[,<base>]"
-
-#, fuzzy
-#~| msgid "do not detect renames"
-#~ msgid "detect renames"
-#~ msgstr "ne pas détecter les renommages"
-
-#, fuzzy
-#~| msgid "Updated preimage for '%s'"
-#~ msgid "omit the preimage for deletes"
-#~ msgstr "Pré-image mise à jour pour '%s'"
-
-#, fuzzy
-#~| msgid "Performing inexact rename detection"
-#~ msgid "disable rename detection"
-#~ msgstr "Détection de renommage inexact en cours"
-
-#, fuzzy
-#~| msgid "invalid option: %s"
-#~ msgid "Diff algorithm options"
-#~ msgstr "option invalide : %s"
-
-#, fuzzy
-#~| msgid "ignore changes in whitespace when finding context"
-#~ msgid "ignore whitespace when comparing lines"
-#~ msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
-
-#, fuzzy
-#~| msgid "ignore changes in whitespace when finding context"
-#~ msgid "ignore changes in amount of whitespace"
-#~ msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
-
-#, fuzzy
-#~| msgid "ignore changes in whitespace when finding context"
-#~ msgid "ignore changes in whitespace at EOL"
-#~ msgstr "ignorer des modifications d'espace lors de la recherche de contexte"
-
-#, fuzzy
-#~| msgid "text"
-#~ msgid "<text>"
-#~ msgstr "texte"
-
-#, fuzzy
-#~| msgid "mode"
-#~ msgid "<mode>"
-#~ msgstr "mode"
-
-#, fuzzy
-#~| msgid "decorate options"
-#~ msgid "Diff other options"
-#~ msgstr "décorer les options"
-
-#, fuzzy
-#~| msgid "process binary files as text"
-#~ msgid "treat all files as text"
-#~ msgstr "traiter les fichiers binaires comme texte"
-
-#, fuzzy
-#~| msgid "when"
-#~ msgid "<when>"
-#~ msgstr "quand"
-
-#, fuzzy
-#~| msgid ""
-#~| "ignore changes to submodules, optional when: all, dirty, untracked. "
-#~| "(Default: all)"
-#~ msgid "ignore changes to submodules in the diff generation"
-#~ msgstr ""
-#~ "ignorer les modifications dans les sous-modules, \"quand\" facultatif : "
-#~ "all (tous), dirty (sale), untracked (non suivi). (Défaut : all)"
-
-#, fuzzy
-#~| msgid "format"
-#~ msgid "<format>"
-#~ msgstr "format"
-
-#, fuzzy
-#~| msgid "use .gitattributes only from the index"
-#~ msgid "hide 'git add -N' entries from the index"
-#~ msgstr "utiliser .gitattributes seulement depuis l'index"
-
-#, fuzzy
-#~| msgid "string"
-#~ msgid "<string>"
-#~ msgstr "chaîne"
-
-#, fuzzy
-#~| msgid "show matching files in the pager"
-#~ msgid "show all changes in the changeset with -S or -G"
-#~ msgstr "afficher les fichiers correspondant dans le pagineur"
-
-#, fuzzy
-#~| msgid "use extended POSIX regular expressions"
-#~ msgid "treat <string> in -S as extended POSIX regular expression"
-#~ msgstr "utiliser des expressions régulières étendues POSIX"
-
-#, fuzzy
-#~| msgid "print all configuration variable names"
-#~ msgid "override diff.orderFile configuration variable"
-#~ msgstr "afficher tous les noms de variables de configuration"
-
-#, fuzzy
-#~| msgid "object"
-#~ msgid "<object-id>"
-#~ msgstr "objet"
-
-#, fuzzy
-#~| msgid "file"
-#~ msgid "<file>"
-#~ msgstr "fichier"
-
-#, fuzzy
-#~| msgid "commit only specified files"
-#~ msgid "Output to a specific file"
-#~ msgstr "valider seulement les fichiers spécifiés"
-
-#, fuzzy
-#~| msgid "Could not spawn pack-objects"
-#~ msgid "could not start pack-objects"
-#~ msgstr "Impossible de créer des objets groupés"
-
-#, fuzzy
-#~| msgid "Could not spawn pack-objects"
-#~ msgid "could not finish pack-objects"
-#~ msgstr "Impossible de créer des objets groupés"
-
-#, fuzzy
-#~| msgid "unrecognized position:%s"
-#~ msgid "Unrecognized protocol version"
-#~ msgstr "position non reconnue : %s"
-
-#, fuzzy
-#~| msgid "unrecognized position:%s"
-#~ msgid "Unrecognized protocol_version"
-#~ msgstr "position non reconnue : %s"
-
-#, fuzzy
-#~| msgid "could not write '%s'"
-#~ msgid "could not write '%s'."
-#~ msgstr "impossible d'écrire '%s'"
-
-#~ msgid "unable to write sha1 filename %s"
-#~ msgstr "impossible d'écrire le fichier sha1 %s"
-
-#~ msgid "unable to write sha1 file"
-#~ msgstr "impossible d'écrire le fichier sha1"
-
-#~ msgid "cannot read sha1_file for %s"
-#~ msgstr "impossible de lire le fichier sha1 pour %s"
-
-#, fuzzy
-#~| msgid "bad revision '%s'"
-#~ msgid "Can't find revision '%s' to ignore"
-#~ msgstr "mauvaise révision '%s'"
-
-#, fuzzy
-#~| msgid "ignore index when checking"
-#~ msgid "Ignore <rev> when blaming"
-#~ msgstr "ignorer l'index pendant la vérification"
-
-#, fuzzy
-#~| msgid "read message from file"
-#~ msgid "Ignore revisions from <file>"
-#~ msgstr "lire le message depuis un fichier"
-
-#, fuzzy
-#~| msgid "could not resolve HEAD commit"
-#~ msgid "could not resolve HEAD"
-#~ msgstr "impossible de résoudre le commit HEAD"
-
-#, fuzzy
-#~| msgid "HEAD not found below refs/heads!"
-#~ msgid "HEAD (%s) points outside of refs/heads/"
-#~ msgstr "HEAD non trouvée sous refs/heads !"
-
-#, fuzzy
-#~| msgid "No current branch."
-#~ msgid "show current branch name"
-#~ msgstr "Pas de branche courante."
-
-#, fuzzy
-#~| msgid "prune loose refs (default)"
-#~ msgid "use overlay mode (default)"
-#~ msgstr "éliminer les références perdues (défaut)"
-
-#, fuzzy
-#~| msgid "-n and -k are mutually exclusive"
-#~ msgid "-p and --overlay are mutually exclusive"
-#~ msgstr "-n et -k sont mutuellement exclusifs"
-
-#, fuzzy
-#~| msgid "unable to read config file '%s'"
-#~ msgid "move a variable to a different config file"
-#~ msgstr "lecture du fichier de configuration '%s' impossible"
-
-#, fuzzy
-#~| msgid "Unknown commit %s"
-#~ msgid "unknown config source"
-#~ msgstr "Commit inconnu %s"
-
-#~ msgid ""
-#~ "error: cannot combine interactive options (--interactive, --exec, --"
-#~ "rebase-merges, --preserve-merges, --keep-empty, --root + --onto) with am "
-#~ "options (%s)"
-#~ msgstr ""
-#~ "erreur: impossible de combiner des options interactives (--interactive, --"
-#~ "exec, --rebase-merges, --preserve-merges, --keep-empty, --root + --onto) "
-#~ "avec les options am (%s)"
-
-#, fuzzy
-#~| msgid "git remote set-url --delete <name> <url>"
-#~ msgid "git remote set-url --save-to-push <name> <url>"
-#~ msgstr "git remote set-url --delete <nom> <URL>"
-
-#, fuzzy
-#~| msgid "The --cached option cannot be used with the --files option"
-#~ msgid "--save-to-push cannot be used with other options"
-#~ msgstr "L'option --cached ne peut pas être utilisée avec l'option --files"
-
-#, fuzzy
-#~| msgid "--format cannot be used when not listing"
-#~ msgid "--save-to-push can only be used when only one url is defined"
-#~ msgstr "--format ne peut pas être utilisé sans lister"
-
-#, fuzzy
-#~| msgid "git worktree list [<options>]"
-#~ msgid "git stash list [<options>]"
-#~ msgstr "git worktree list [<options>]"
-
-#, fuzzy
-#~| msgid "git remote show [<options>] <name>"
-#~ msgid "git stash show [<options>] [<stash>]"
-#~ msgstr "git remote show [<options>] <nom>"
-
-#, fuzzy
-#~| msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
-#~ msgid "git stash branch <branchname> [<stash>]"
-#~ msgstr ""
-#~ "git branch [<options] [-l] [-f] <nom-de-branche> [<point-de-départ>]"
-
-#, fuzzy
-#~| msgid "'$args' is not a stash-like commit"
-#~ msgid "'%s' is not a stash-like commit"
-#~ msgstr "'$args' n'est pas une validation de type remisage"
-
-#, fuzzy
-#~| msgid "Too many revisions specified: $REV"
-#~ msgid "Too many revisions specified:%s"
-#~ msgstr "Trop de révisions spécifiées : $REV"
-
-#, fuzzy
-#~| msgid "'%s' is not a valid ref name"
-#~ msgid "%s is not a valid reference"
-#~ msgstr "'%s' n'est pas un nom valide de référence"
-
-#, fuzzy
-#~| msgid "Cannot apply a stash in the middle of a merge"
-#~ msgid "cannot apply a stash in the middle of a merge"
-#~ msgstr "Impossible d'appliquer un remisage en cours de fusion"
-
-#, fuzzy
-#~| msgid "could not generate todo list"
-#~ msgid "could not generate diff %s^!."
-#~ msgstr "impossible de générer la liste à-faire"
-
-#, fuzzy
-#~| msgid "Conflicts in index. Try without --index."
-#~ msgid "conflicts in index.Try without --index."
-#~ msgstr "Conflits dans l'index. Essayez sans --index."
-
-#, fuzzy
-#~| msgid "Could not save index tree"
-#~ msgid "could not save index tree"
-#~ msgstr "Impossible de sauvegarder l'arbre d'index"
-
-#, fuzzy
-#~| msgid "Could not restore untracked files from stash entry"
-#~ msgid "could not restore untracked files from stash"
-#~ msgstr ""
-#~ "Impossible de restaurer les fichiers non-suivis depuis l'entrée de "
-#~ "remisage"
-
-#, fuzzy
-#~| msgid "Merging %s with %s\n"
-#~ msgid "Merging %s with %s"
-#~ msgstr "Fusion de %s avec %s\n"
-
-#, fuzzy
-#~| msgid "failed to read the index"
-#~ msgid "attempt to recreate the index"
-#~ msgstr "échec à la lecture de l'index"
-
-#, fuzzy
-#~| msgid "Dropped ${REV} ($s)"
-#~ msgid "Dropped %s (%s)"
-#~ msgstr "${REV} supprimé ($s)"
-
-#, fuzzy
-#~| msgid "${REV}: Could not drop stash entry"
-#~ msgid "%s: Could not drop stash entry"
-#~ msgstr "${REV}: Impossible de supprimer l'élément de stash"
-
-#, fuzzy
-#~| msgid "'$args' is not a stash reference"
-#~ msgid "'%s' is not a stash reference"
-#~ msgstr "'$args' n'est pas une référence de remisage"
-
-#, fuzzy
-#~| msgid "Cannot update $ref_stash with $w_commit"
-#~ msgid "Cannot update %s with %s"
-#~ msgstr "Impossible de mettre à jour $ref_stash avec $w_commit"
-
-#, fuzzy
-#~| msgid "tag message"
-#~ msgid "stash message"
-#~ msgstr "message pour l'étiquette"
-
-#, fuzzy
-#~| msgid "--bisect-clean-state requires no arguments"
-#~ msgid "\"git stash store\" requires one <commit> argument"
-#~ msgstr "--bisect-clean-state ne supporte aucun argument"
-
-#, fuzzy
-#~| msgid "Maybe you wanted to say 'git add .'?\n"
-#~ msgid "Did you forget to 'git add'?"
-#~ msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
-
-#, fuzzy
-#~| msgid "Saved working directory and index state $stash_msg"
-#~ msgid "Saved working directory and index state %s"
-#~ msgstr "Copie de travail et état de l'index sauvegardés dans $stash_msg"
-
-#, fuzzy
-#~| msgid "Refresh index"
-#~ msgid "keep index"
-#~ msgstr "Rafraîchir l'index"
-
-#, fuzzy
-#~| msgid "quiet"
-#~ msgid "quiet mode"
-#~ msgstr "quiet"
-
-#, fuzzy
-#~| msgid "list untracked files in columns"
-#~ msgid "include untracked files in stash"
-#~ msgstr "afficher les fichiers non suivis en colonnes"
-
-#, fuzzy
-#~| msgid "show ignored files"
-#~ msgid "include ignore files"
-#~ msgstr "afficher les fichiers ignorés"
-
-#, fuzzy
-#~| msgid "expiry-date"
-#~ msgid "expiry date"
-#~ msgstr "date-d'expiration"
-
-#, fuzzy
-#~| msgid "Use binary search to find the commit that introduced a bug"
-#~ msgid "Find by binary search the change that introduced a bug"
-#~ msgstr ""
-#~ "Trouver par recherche binaire la modification qui a introduit un bogue"
-
-#, fuzzy
-#~| msgid "path into the working tree"
-#~ msgid "Checkout a branch or paths to the working tree"
-#~ msgstr "chemin dans la copie de travail"
-
-#~ msgid "Forward-port local commits to the updated upstream head"
-#~ msgstr ""
-#~ "Reporter les validations locales sur le sommet mis à jour d'une branche "
-#~ "amont"
-
-#, fuzzy
-#~| msgid "invalid ident line: %s"
-#~ msgid "invalid hunk line '%d'\n"
-#~ msgstr "ligne d'identification invalide : %s"
-
-#, fuzzy
-#~| msgid "invalid ident line: %s"
-#~ msgid "invalid hunk line '%s'\n"
-#~ msgstr "ligne d'identification invalide : %s"
-
-#, fuzzy
-#~| msgid "select mainline parent"
-#~ msgid "select lines? "
-#~ msgstr "sélectionner le parent principal"
-
-#, fuzzy
-#~| msgid "cannot store index file"
-#~ msgid "Cannot select line by line\n"
-#~ msgstr "impossible de stocker le fichier d'index"
-
-#~ msgid "ignoring unknown color-moved-ws mode '%s'"
-#~ msgstr "mode color-moved-ws inconnu '%s' ignoré"
-
-#~ msgid "only 'tree:0' is supported"
-#~ msgstr "seul 'tree:0' est supporté"
-
-#~ msgid "Renaming %s to %s and %s to %s instead"
-#~ msgstr "Renommage de %s en %s et de %s en %s à la place"
-
-#~ msgid "Adding merged %s"
-#~ msgstr "Ajout de %s fusionné"
-
-#~ msgid "Internal error"
-#~ msgstr "Erreur interne"
-
-#~ msgid "mainline was specified but commit %s is not a merge."
-#~ msgstr ""
-#~ "une branche principale a été spécifiée mais le commit %s n'est pas une "
-#~ "fusion."
-
-#~ msgid ""
-#~ "error: cannot combine merge options (--merge, --strategy, --strategy-"
-#~ "option) with am options (%s)"
-#~ msgstr ""
-#~ "erreur : impossible de combiner les options de fusion (--merge, --"
-#~ "strategy, --strategy-option) avec les options am (%s)"
-
-#~ msgid "unrecognised option: '$arg'"
-#~ msgstr "option inconnue : '$arg'"
-
-#~ msgid "'$invalid' is not a valid commit"
-#~ msgstr "'$invalid' n'est pas une validation valide"
-
-#~ msgid "could not parse '%s' (looking for '%s')"
-#~ msgstr "impossible d'analyser '%s' (à la recherche de '%s')"
-
-#~ msgid "bad quoting on %s value in '%s'"
-#~ msgstr "Mauvaise citation sur la valeur %s dans '%s'"
-
-#~ msgid "deprecated synonym for --create-reflog"
-#~ msgstr "synonyme déconseillé de --create-reflog"
-
-#~ msgid "Can't stat %s"
-#~ msgstr "impossible de faire un stat de %s"
-
-#~ msgid "abort rebase"
-#~ msgstr "abandonner le rebasage"
-
-#~ msgid "make rebase script"
-#~ msgstr "créer les script de rebasage"
-
-#~ msgid "No such remote: %s"
-#~ msgstr "Distante inconnue : %s"
-
-#~ msgid "cannot move a locked working tree"
-#~ msgstr "impossible de déplacer un arbre de travail verrouillé"
-
-#~ msgid "cannot remove a locked working tree"
-#~ msgstr "impossible de supprimer un arbre de travail verrouillé"
-
-#~ msgid "Applied autostash."
-#~ msgstr "Autoremisage appliqué."
-
-#~ msgid "Cannot store $stash_sha1"
-#~ msgstr "Impossible de stocker $stash_sha1"
-
-#~ msgid ""
-#~ "\n"
-#~ "\tHowever, if you remove everything, the rebase will be aborted.\n"
-#~ "\n"
-#~ "\t"
-#~ msgstr ""
-#~ "\n"
-#~ "Cependant, si vous effacez tout, le rebasage sera annulé.\n"
-#~ "\n"
-#~ "\t"
-
-#~ msgid "could not parse '%s' (looking for '%s'"
-#~ msgstr "impossible d'analyser '%s' (à la recherche de '%s')"
-
-#~ msgid "color both diff and diff-between-diffs"
-#~ msgstr "colorer à la fois les diffs et le diff-between-diffs"
-
-#~ msgid "push|fetch"
-#~ msgstr "push|fetch"
-
-#~ msgid "Dirty index: cannot merge (dirty: %s)"
-#~ msgstr "Index sale : fusion impossible (sales : %s)"
-
-#~ msgid "(+/-)x"
-#~ msgstr "(+/-)x"
-
-#~ msgid "<command>"
-#~ msgstr "<commande>"
-
-#~ msgid "w[,i1[,i2]]"
-#~ msgstr "w[,i1[,i2]]"
-
-#~ msgid "Entering '$displaypath'"
-#~ msgstr "Entrée dans '$displaypath'"
-
-#~ msgid "Stopping at '$displaypath'; script returned non-zero status."
-#~ msgstr "Arrêt sur '$displaypath' ; le script a retourné un état non nul."
-
-#~ msgid "Everyday Git With 20 Commands Or So"
-#~ msgstr "Git de tous les jours avec à peu près 20 commandes"
-
-#~ msgid "Could not open '%s' for writing"
-#~ msgstr "Impossible d'ouvrir '%s' en écriture"
-
-#~ msgid ""
-#~ "unexpected 1st line of squash message:\n"
-#~ "\n"
-#~ "\t%.*s"
-#~ msgstr ""
-#~ "première ligne de message de compression inattendue :\n"
-#~ "\n"
-#~ "\t%.*s"
-
-#~ msgid ""
-#~ "invalid 1st line of squash message:\n"
-#~ "\n"
-#~ "\t%.*s"
-#~ msgstr ""
-#~ "première ligne de message de compression invalide :\n"
-#~ "\n"
-#~ "\t%.*s"
-
-#~ msgid "BUG: returned path string doesn't match cwd?"
-#~ msgstr "BUG : le chemin renvoyé ne correspond pas à cwd ?"
-
-#~ msgid "Error in object"
-#~ msgstr "Erreur dans l'objet"
-
-#~ msgid "git fetch-pack: expected ACK/NAK, got EOF"
-#~ msgstr "git fetch-pack : ACK/NACK attendu, EOF reçu"
-
-#~ msgid "invalid filter-spec expression '%s'"
-#~ msgstr "expression de filtre invalide : '%s'"
-
-#~ msgid "The copy of the patch that failed is found in: %s"
-#~ msgstr "La copie du patch qui a échoué se trouve dans : %s"
-
-#~ msgid "pathspec and --all are incompatible"
-#~ msgstr "un spécificateur de chemin et --all sont incompatibles"
-
-#~ msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
-#~ msgstr ""
-#~ "Le sous-module '$name' ($url) n'est pas enregistré pour le chemin "
-#~ "'$displaypath'"
-
-#~ msgid "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"
-#~ msgstr ""
-#~ "Les champs To/CC/Bcc ne sont pas encore interprétés, ils ont été ignorés\n"
-
-#~ msgid ""
-#~ "empty strings as pathspecs will be made invalid in upcoming releases. "
-#~ "please use . instead if you meant to match all paths"
-#~ msgstr ""
-#~ "les chaines de caractères vides comme spécificateurs de chemin seront "
-#~ "invalides dans les prochaines versions. Veuillez utiliser . à la place "
-#~ "pour correspondre à tous le chemins"
-
-#~ msgid "could not truncate '%s'"
-#~ msgstr "impossible de tronquer '%s'"
-
-#~ msgid "could not close %s"
-#~ msgstr "impossible de fermer %s"
-
-#~ msgid "Copied a misnamed branch '%s' away"
-#~ msgstr "Copie d'une branche mal nommée '%s'"
-
-#~ msgid "it does not make sense to create 'HEAD' manually"
-#~ msgstr "créer manuellement 'HEAD' n'a pas de sens"
-
-#~ msgid "Don't know how to clone %s"
-#~ msgstr "Je ne sais pas cloner %s"
-
-#~ msgid "Don't know how to fetch from %s"
-#~ msgstr "Je ne sais pas récupérer depuis %s"
-
-#~ msgid "'$term' is not a valid term"
-#~ msgstr "'$term' n'est pas un terme valide"
-
-#~ 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'"
-
-#~ msgid "Failed to recurse into submodule path '$sm_path'"
-#~ msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
-
-#~ msgid "%%(trailers) does not take arguments"
-#~ msgstr "%%(trailers) n'accepte pas d'argument"
-
-#~ msgid "submodule update strategy not supported for submodule '%s'"
-#~ msgstr ""
-#~ "stratégie de mise à jour de sous-module non supportée pour le sous-module "
-#~ "'%s'"
-
-#~ msgid "change upstream info"
-#~ msgstr "modifier l'information amont"
-
-#~ msgid ""
-#~ "\n"
-#~ "If you wanted to make '%s' track '%s', do this:\n"
-#~ "\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Si vous vouliez que '%s' suive '%s', faites ceci :\n"
-#~ "\n"
-
-#~ msgid "basename"
-#~ msgstr "nom de base"
-
-#~ msgid ""
-#~ "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
-#~ " - $line"
-#~ msgstr ""
-#~ "Attention : le SHA-1 manque ou n'est pas un commit dans la ligne "
-#~ "suivante :\n"
-#~ " - $line"
-
-#~ msgid ""
-#~ "Warning: the command isn't recognized in the following line:\n"
-#~ " - $line"
-#~ msgstr ""
-#~ "Attention : la commande n'est pas reconnue dans le ligne suivante :\n"
-#~ " - $line"
-
-#~ msgid "Or you can abort the rebase with 'git rebase --abort'."
-#~ msgstr ""
-#~ "Ou bien vous pouvez abandonner le rebasage avec 'git rebase --abort'."
-
-#~ msgid "in %0.1f seconds automatically..."
-#~ msgstr "dans %0.1f secondes automatiquement..."
-
-#~ msgid "dup2(%d,%d) failed"
-#~ msgstr "échec de dup2(%d,%d)"
-
-#~ msgid "Initial commit on "
-#~ msgstr "Validation initiale sur "
-
-#~ msgid "Patch is empty. Was it split wrong?"
-#~ msgstr "Le patch est vide. Le découpage était-il bon ?"
-
-#~ 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' ?"
-
-#~ 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 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 ?"
-
-#~ msgid "Explicit paths specified without -i or -o; assuming --only paths..."
-#~ msgstr "Chemins explicites spécifiés sans -i ni -o ; --only supposé..."
-
-#~ msgid "default mode for recursion"
-#~ msgstr "mode par défaut pour la récursion"
-
-#~ msgid "submodule--helper subcommand must be called with a subcommand"
-#~ msgstr ""
-#~ "la sous-commande submodule--helper doit être appelée avec une sous-"
-#~ "commande"
-
-#~ msgid "could not stat '%s"
-#~ msgstr "stat impossible de '%s'"
-
-#~ msgid "tag: tagging "
-#~ msgstr "étiquette: étiquetage de "
-
-#~ msgid "commit object"
-#~ msgstr "objet commit"
-
-#~ msgid "tree object"
-#~ msgstr "objet arbre"
-
-#~ msgid "blob object"
-#~ msgstr "objet blob"
-
-#~ msgid ""
-#~ "There is nothing to exclude from by :(exclude) patterns.\n"
-#~ "Perhaps you forgot to add either ':/' or '.' ?"
-#~ msgstr ""
-#~ "Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
-#~ "Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
-
-#~ msgid "unrecognized format: %%(%s)"
-#~ msgstr "format non reconnu %%(%s)"
-
-#~ msgid ":strip= requires a positive integer argument"
-#~ msgstr ":strip= requiert un argument entier positif"
-
-#~ msgid "ref '%s' does not have %ld components to :strip"
-#~ msgstr "la réf '%s' n'a pas %ld composants à :strip"
-
-# féminin pour une branche
-#~ msgid "[%s: gone]"
-#~ msgstr "[%s: disparue]"
-
-#~ msgid "[%s]"
-#~ msgstr "[%s]"
-
-#~ msgid "[%s: behind %d]"
-#~ msgstr "[%s: en retard de %d]"
-
-#~ msgid "[%s: ahead %d]"
-#~ msgstr "[%s : en avance de %d]"
-
-#~ msgid "[%s: ahead %d, behind %d]"
-#~ msgstr "[%s : en avance de %d, en retard de %d]"
-
-#~ msgid " **** invalid ref ****"
-#~ msgstr " **** référence invalide ****"
-
-#~ msgid "insanely long object directory %.*s"
-#~ msgstr "objet répertoire démentiellement long %.*s"
-
-#~ msgid "git merge [<options>] <msg> HEAD <commit>"
-#~ msgstr "git merge [<options>] <message> HEAD <commit>"
-
-#~ msgid "tag name too long: %.*s..."
-#~ msgstr "nom d'étiquette trop long : %.*s..."
-
-#~ msgid "tag header too big."
-#~ msgstr "en-tête d'étiquette trop gros."
-
-#~ msgid ""
-#~ "If the patch applies cleanly, the edited hunk will immediately be\n"
-#~ "marked for discarding"
-#~ msgstr ""
-#~ "Si le patch s'applique proprement, la section éditée sera\n"
-#~ "immediatement marquée comme éliminée"
-
-#~ msgid "Use an experimental blank-line-based heuristic to improve diffs"
-#~ msgstr ""
-#~ "Utiliser une heuristique expérimentale reposant sur les lignes vides pour "
-#~ "améliorer le diffs"
-
-#~ msgid "Clever... amending the last one with dirty index."
-#~ msgstr "Malin... correction du dernier avec un index sale."
-
-#~ msgid ""
-#~ "the following submodule (or one of its nested submodules)\n"
-#~ "uses a .git directory:"
-#~ msgid_plural ""
-#~ "the following submodules (or one of their nested submodules)\n"
-#~ "use a .git directory:"
-#~ msgstr[0] ""
-#~ "le sous-module suivant (ou un de ses sous-modules imbriqués)\n"
-#~ "utilise un répertoire .git :"
-#~ msgstr[1] ""
-#~ "les sous-modules suivants (ou un de leurs sous-modules imbriqués)\n"
-#~ "utilisent un répertoire .git :"
-
-#~ msgid ""
-#~ "\n"
-#~ "(use 'rm -rf' if you really want to remove it including all of its "
-#~ "history)"
-#~ msgstr ""
-#~ "\n"
-#~ "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout "
-#~ "son historique)"
-
-#~ msgid "Error wrapping up %s."
-#~ msgstr "Erreur lors de l'emballage de %s."
-
-#~ msgid "Your local changes would be overwritten by cherry-pick."
-#~ msgstr "Vos modifications locales seraient écrasées par cherry-pick."
-
-#~ msgid "Cannot revert during another revert."
-#~ msgstr "Impossible d'annuler un commit pendant l'annulation d'un commit."
-
-#~ msgid "Cannot cherry-pick during another cherry-pick."
-#~ msgstr "Impossible de picorer pendant un autre picorage."
-
-#~ msgid "Could not parse line %d."
-#~ msgstr "Impossible d'analyser la ligne %d."
-
-#~ msgid "Could not open %s"
-#~ msgstr "Impossible d'ouvrir %s"
-
-#~ msgid "Could not format %s."
-#~ msgstr "Impossible de formater %s."
-
-#~ msgid "%s: %s"
-#~ msgstr "%s : %s"
-
-#~ msgid "You need to set your committer info first"
-#~ msgstr "Vous devez d'abord définir vos informations de validateur"
-
-#~ msgid "This is the 2nd commit message:"
-#~ msgstr "Ceci est le deuxième message de validation :"
-
-#~ msgid "This is the 3rd commit message:"
-#~ msgstr "Ceci est le troisième message de validation :"
-
-#~ msgid "This is the 4th commit message:"
-#~ msgstr "Ceci est le quatrième message de validation :"
-
-#~ msgid "This is the 5th commit message:"
-#~ msgstr "Ceci est le cinquième message de validation :"
-
-#~ msgid "This is the 6th commit message:"
-#~ msgstr "Ceci est le sixième message de validation :"
-
-#~ msgid "This is the 7th commit message:"
-#~ msgstr "Ceci est le septième message de validation :"
-
-#~ msgid "This is the 8th commit message:"
-#~ msgstr "Ceci est le huitième message de validation :"
-
-#~ msgid "This is the 9th commit message:"
-#~ msgstr "Ceci est le neuvième message de validation :"
-
-#~ msgid "This is the 10th commit message:"
-#~ msgstr "Ceci est le dixième message de validation :"
-
-#~ msgid "This is the ${n}th commit message:"
-#~ msgstr "Ceci est le ${n}ième message de validation :"
-
-#~ msgid "This is the ${n}st commit message:"
-#~ msgstr "Ceci est le ${n}ième message de validation :"
-
-#~ msgid "This is the ${n}nd commit message:"
-#~ msgstr "Ceci est le ${n}ième message de validation :"
-
-#~ msgid "This is the ${n}rd commit message:"
-#~ msgstr "Ceci est le ${n}ième message de validation :"
-
-#~ msgid "The 1st commit message will be skipped:"
-#~ msgstr "Le premier message de validation sera ignoré :"
-
-#~ msgid "The 2nd commit message will be skipped:"
-#~ msgstr "Le deuxième message de validation sera ignoré :"
-
-#~ msgid "The 3rd commit message will be skipped:"
-#~ msgstr "Le troisième message de validation sera ignoré :"
-
-#~ msgid "The 4th commit message will be skipped:"
-#~ msgstr "Le quatrième message de validation sera ignoré :"
-
-#~ msgid "The 5th commit message will be skipped:"
-#~ msgstr "Le cinquième message de validation sera ignoré :"
-
-#~ msgid "The 6th commit message will be skipped:"
-#~ msgstr "Le sixième message de validation sera ignoré :"
-
-#~ msgid "The 7th commit message will be skipped:"
-#~ msgstr "Le septième message de validation sera ignoré :"
-
-#~ msgid "The 8th commit message will be skipped:"
-#~ msgstr "Le huitième message de validation sera ignoré :"
-
-#~ msgid "The 9th commit message will be skipped:"
-#~ msgstr "Le neuvième message de validation sera ignoré :"
-
-#~ msgid "The 10th commit message will be skipped:"
-#~ msgstr "Le dixième message de validation sera ignoré :"
-
-#~ msgid "The ${n}th commit message will be skipped:"
-#~ msgstr "le ${n}ième message de validation sera ignoré :"
-
-#~ msgid "The ${n}st commit message will be skipped:"
-#~ msgstr "Le message de validation ${n} sera ignoré :"
-
-#~ msgid "The ${n}nd commit message will be skipped:"
-#~ msgstr "Le message de validation ${n} sera ignoré :"
-
-#~ msgid "The ${n}rd commit message will be skipped:"
-#~ msgstr "Le message de validation ${n} sera ignoré :"
-
-#~ msgid "could not run gpg."
-#~ msgstr "impossible de lancer gpg."
-
-#~ msgid "gpg did not accept the data"
-#~ msgstr "gpg n'a pas accepté les données"
-
-#~ msgid "unsupported object type in the tree"
-#~ msgstr "type d'objet non supporté dans l'arbre"
-
-#~ msgid "Fatal merge failure, shouldn't happen."
-#~ msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
-
-#~ msgid "Unprocessed path??? %s"
-#~ msgstr "Chemin non traité ??? %s"
-
-#~ msgid "Cannot %s during a %s"
-#~ msgstr "Impossible de %s pendant un %s"
-
-#~ msgid "Can't cherry-pick into empty head"
-#~ msgstr "Impossible de picorer vers une HEAD vide"
-
-#~ msgid "could not open %s for writing"
-#~ msgstr "Impossible d'ouvrir '%s' en écriture"
-
-#~ msgid "bug: unhandled unmerged status %x"
-#~ msgstr "bogue : état de non-fusion non géré %x"
-
-#~ msgid "bug: unhandled diff status %c"
-#~ msgstr "bogue : état de diff non géré %c"
-
-#~ msgid "could not write branch description template"
-#~ msgstr "impossible d'écrire le modèle de description de branche"
-
-#~ msgid "corrupt index file"
-#~ msgstr "fichier d'index corrompu"
-
-#~ msgid "detach the HEAD at named commit"
-#~ msgstr "détacher la HEAD à la validation nommée"
-
-#~ msgid "Checking connectivity... "
-#~ msgstr "Vérification de la connectivité... "
-
-#~ msgid " (unable to update local ref)"
-#~ msgstr " (impossible de mettre à jour la référence locale)"
-
-#~ msgid "Reinitialized existing"
-#~ msgstr "existant réinitialisé"
-
-#~ msgid "Initialized empty"
-#~ msgstr "vide initialisé"
-
-#~ msgid " shared"
-#~ msgstr " partagé"
-
-#~ msgid "Verify that the named commit has a valid GPG signature"
-#~ msgstr "Vérifier que la validation a une signature GPG valide"
-
-#~ msgid "Writing SQUASH_MSG"
-#~ msgstr "Écriture de SQUASH_MSG"
-
-#~ msgid "Finishing SQUASH_MSG"
-#~ msgstr "Finition de SQUASH_MSG"
-
-#~ msgid " and with remote"
-#~ msgstr " et avec la distante"
-
-#~ msgid "removing '%s' failed"
-#~ msgstr "la suppression de '%s' a échoué"
-
-#~ msgid "Please call 'bisect_state' with at least one argument."
-#~ msgstr "Veuillez appeler 'bisect_state' avec au moins un argument."
-
-#~ msgid ""
-#~ "If you want to reuse this local git directory instead of cloning again "
-#~ "from"
-#~ msgstr ""
-#~ "Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
-#~ "nouveau depuis"
-
-#~ msgid ""
-#~ "use the '--force' option. If the local git directory is not the correct "
-#~ "repo"
-#~ msgstr ""
-#~ "utilisez l'option '--force'. Si le répertoire local git n'est pas le "
-#~ "dépôt correct"
-
-#~ msgid ""
-#~ "or you are unsure what this means choose another name with the '--name' "
-#~ "option."
-#~ msgstr ""
-#~ "ou si vous ne savez pas ce que cela signifie, choisissez un autre nom "
-#~ "avec l'option '--name'."
-
-#~ msgid "Submodule work tree '$displaypath' contains a .git directory"
-#~ msgstr ""
-#~ "La copie de travail du sous-module '$displaypath' contient un répertoire ."
-#~ "git"
-
-#~ msgid ""
-#~ "(use 'rm -rf' if you really want to remove it including all of its "
-#~ "history)"
-#~ msgstr ""
-#~ "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout "
-#~ "son historique)"
-
-#~ msgid "'%s': %s"
-#~ msgstr "'%s' : %s"
-
-#~ msgid "unable to access '%s': %s"
-#~ msgstr "impossible d'accéder à '%s' : %s"
-
-#~ msgid " git branch -d %s\n"
-#~ msgstr " git branch -d %s\n"
-
-#~ msgid " git branch --set-upstream-to %s\n"
-#~ msgstr " git branch --set-upstream-to %s\n"
-
-#~ msgid "cannot open %s: %s\n"
-#~ msgstr "impossible d'ouvrir %s : %s\n"
-
-#~ msgid "Please, stage your changes to .gitmodules or stash them to proceed"
-#~ msgstr ""
-#~ "Veuillez indexer vos modifications de .gitmodules ou remisez-les pour "
-#~ "continuer"
-
-#~ msgid "failed to remove: %s"
-#~ msgstr "échec de la suppression de %s"
-
-#~ msgid ""
-#~ "Submodule path '$displaypath' not initialized\n"
-#~ "Maybe you want to use 'update --init'?"
-#~ msgstr ""
-#~ "Chemin de sous-module '$displaypath' non initialisé\n"
-#~ "Peut-être souhaitez-vous utiliser 'update --init' ?"
-
-#~ msgid "improper format entered align:%s"
-#~ msgstr "format non convenable align:%s"
-
-#~ msgid ""
-#~ "push.default is unset; its implicit value has changed in\n"
-#~ "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-#~ "and maintain the traditional behavior, use:\n"
-#~ "\n"
-#~ " git config --global push.default matching\n"
-#~ "\n"
-#~ "To squelch this message and adopt the new behavior now, use:\n"
-#~ "\n"
-#~ " git config --global push.default simple\n"
-#~ "\n"
-#~ "When push.default is set to 'matching', git will push local branches\n"
-#~ "to the remote branches that already exist with the same name.\n"
-#~ "\n"
-#~ "Since Git 2.0, Git defaults to the more conservative 'simple'\n"
-#~ "behavior, which only pushes the current branch to the corresponding\n"
-#~ "remote branch that 'git pull' uses to update the current branch.\n"
-#~ "\n"
-#~ "See 'git help config' and search for 'push.default' for further "
-#~ "information.\n"
-#~ "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
-#~ "'current' instead of 'simple' if you sometimes use older versions of Git)"
-#~ msgstr ""
-#~ "push.default n'est pas défini ; sa valeur implicite a changé dans Git "
-#~ "2.0\n"
-#~ "de 'matching' vers 'simple'. Pour supprimer ce message et maintenir\n"
-#~ "le comportement actuel après la modification de la valeur de défaut, "
-#~ "utilisez :\n"
-#~ "\n"
-#~ " git config --global push.default matching\n"
-#~ "\n"
-#~ "Pour supprimer ce message et adopter le nouveau comportement maintenant, "
-#~ "utilisez :\n"
-#~ "\n"
-#~ " git config --global push.default simple\n"
-#~ "\n"
-#~ "Quand push.default vaudra 'matching', git poussera les branches locales\n"
-#~ "sur les branches distantes qui existent déjà avec le même nom.\n"
-#~ "\n"
-#~ "Depuis Git 2.0, Git utilise par défaut le comportement plus conservatif "
-#~ "'simple'\n"
-#~ "qui ne pousse la branche courante que vers la branche distante "
-#~ "correspondante\n"
-#~ "que 'git pull' utilise pour mettre à jour la branche courante.\n"
-#~ " \n"
-#~ "Voir 'git help config' et chercher 'push.default' pour plus "
-#~ "d'information.\n"
-#~ "(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode "
-#~ "similaire\n"
-#~ "'current' au lieu de 'simple' si vous utilisez de temps en temps "
-#~ "d'anciennes versions de Git)"
-
-#~ msgid "check|on-demand|no"
-#~ msgstr "check|on-demand|no"
-
-#~ msgid "Could not append '%s'"
-#~ msgstr "Impossible d'ajouter '%s'"
-
-#~ msgid "Missing author: %s"
-#~ msgstr "Auteur manquant : %s"
-
-#~ msgid "Testing "
-#~ msgstr "Test en cours "
-
-#~ msgid "unable to look up current user in the passwd file: %s"
-#~ msgstr ""
-#~ "impossible de rechercher l'utilisateur actuel dans le fichier de mots de "
-#~ "passe : %s"
-
-#~ msgid "no such user"
-#~ msgstr "utilisateur inconnu"
-
-#~ msgid "branch '%s' does not point at a commit"
-#~ msgstr "la branche '%s' ne pointe pas sur un commit"
-
-#~ msgid "print only merged branches"
-#~ msgstr "afficher seulement les branches fusionnées"
-
-#~ msgid "--dissociate given, but there is no --reference"
-#~ msgstr "--dissociate est spécifié, mais --reference est absent"
-
-#~ msgid "show usage"
-#~ msgstr "afficher l'usage"
-
-#~ msgid "insanely long template name %s"
-#~ msgstr "nom de modèle démentiellement long %s"
-
-#~ msgid "insanely long symlink %s"
-#~ msgstr "lien symbolique démentiellement long %s"
-
-#~ msgid "insanely long template path %s"
-#~ msgstr "chemin de modèle %s démentiellement long"
-
-#~ msgid "unsupported sort specification '%s'"
-#~ msgstr "spécification de tri non supportée '%s'"
-
-#~ msgid "unsupported sort specification '%s' in variable '%s'"
-#~ msgstr "spécification de tri non supportée '%s' dans le variable '%s'"
-
-#~ msgid "switch 'points-at' requires an object"
-#~ msgstr "le commutateur 'points-at' a besoin d'un objet"
-
-#~ msgid "--sort and -n are incompatible"
-#~ msgstr "--sort et -n sont incompatibles"
-
-#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-#~ msgstr ""
-#~ "Le répertoire Git '$a' fait partie du chemin de sous-module '$b' ou vice-"
-#~ "versa"
-
-#~ msgid "false|true|preserve"
-#~ msgstr "false|true|preserve"
-
-#~ msgid "BUG: reopen a lockfile that is still open"
-#~ msgstr "BUG: réouverture d'un fichier verrou déjà ouvert"
-
-#~ msgid "BUG: reopen a lockfile that has been committed"
-#~ msgstr "BUG: réouverture d'un fichier verrou validé"
-
-#~ msgid "option %s does not accept negative form"
-#~ msgstr "l'option %s n'accepte pas de valeur négative"
-
-#~ msgid "unable to parse value '%s' for option %s"
-#~ msgstr "impossible d'analyser la valeur '%s' pour l'option %s"
-
-#~ msgid "-b and -B are mutually exclusive"
-#~ msgstr "-b et -B sont mutuellement exclusifs"
-
-#~ msgid ""
-#~ "When you have resolved this problem, run \"$cmdline --continue\".\n"
-#~ "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 --continue\".\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\"."
-
-#~ msgid "Patch format $patch_format is not supported."
-#~ msgstr "Le format de patch $patch_format n'est pas supporté."
-
-#~ msgid "Please make up your mind. --skip or --abort?"
-#~ msgstr "Décidez-vous. --skip ou --abort ?"
-
-#~ msgid ""
-#~ "Patch is empty. Was it split wrong?\n"
-#~ "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\"."
-
-#~ msgid "Patch does not have a valid courriel address."
-#~ msgstr "Le patch n'a pas d'adresse courriel valide."
-
-#~ msgid "Applying: $FIRSTLINE"
-#~ msgstr "Application : $FIRSTLINE"
-
-#~ msgid "Patch failed at $msgnum $FIRSTLINE"
-#~ msgstr "Le patch a échoué à $msgnum $FIRSTLINE"
-
-#~ msgid ""
-#~ "Pull is not possible because you have unmerged files.\n"
-#~ "Please, fix them up in the work tree, and then use 'git add/rm <file>'\n"
-#~ "as appropriate to mark resolution and make a commit."
-#~ msgstr ""
-#~ "Le tirage n'est pas possible car vous avez des fichiers non fusionnés.\n"
-#~ "Veuillez les corriger dans votre copie de travail, utiliser alors 'git "
-#~ "add/rm <fichier>'\n"
-#~ "si nécessaire pour marquer comme résolu et valider."
-
-#~ msgid "no branch specified"
-#~ msgstr "aucune branche spécifiée"
-
-#~ msgid "prune .git/worktrees"
-#~ msgstr "éliminer .git/worktrees"
-
-#~ msgid "The most commonly used git commands are:"
-#~ msgstr "Les commandes git les plus utilisées sont :"
-
-#~ msgid "No such branch: '%s'"
-#~ msgstr "Branche inconnue : '%s'"
-
-#~ msgid "Could not create git link %s"
-#~ msgstr "Impossible de créer le lien git %s"
-
-#~ msgid "Invalid gc.pruneexpire: '%s'"
-#~ msgstr "gc.pruneexpire invalide : '%s'"
-
-#~ msgid "(detached from %s)"
-#~ msgstr "(détaché de %s)"
-
-#~ msgid "No existing author found with '%s'"
-#~ msgstr "Aucun auteur existant trouvé avec '%s'"
-
-#~ msgid "search also in ignored files"
-#~ msgstr "rechercher aussi dans les fichiers ignorés"
-
-#~ msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
-#~ msgstr "git remote set-head <nom> (-a | --auto | -d | --delete |<branche>)"
-
-#~ msgid "no files added"
-#~ msgstr "aucun fichier ajouté"
-
-#~ msgid "slot"
-#~ msgstr "emplacement"
-
-#~ msgid "Failed to lock ref for update"
-#~ msgstr "Échec du verrouillage de la référence pour mise à jour"
-
-#~ msgid "Failed to write ref"
-#~ msgstr "Échec de l'écriture de la référence"
-
-#~ msgid "Failed to lock HEAD during fast_forward_to"
-#~ msgstr "Échec du verrouillage de HEAD pendant l'avance rapide"
-
-#~ msgid "cannot lock HEAD ref"
-#~ msgstr "impossible de verrouiller la référence HEAD"
-
-#~ msgid "cannot update HEAD ref"
-#~ msgstr "impossible de mettre à jour la référence HEAD"
-
-#~ msgid "%s: cannot lock the ref"
-#~ msgstr "%s : impossible de verrouiller la référence"
-
-#~ msgid "commit has empty message"
-#~ msgstr "le commit a un message vide"
-
-#~ msgid "Failed to chdir: %s"
-#~ msgstr "Échec de chdir: %s"
-
-#~ msgid "Tracking not set up: name too long: %s"
-#~ msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
-
-#~ msgid "could not find .gitmodules in index"
-#~ msgstr "impossible de trouver .gitmodules dans l'index"
-
-#~ msgid "reading updated .gitmodules failed"
-#~ msgstr "échec de la lecture du .gitmodules mis à jour"
-
-#~ msgid "unable to stat updated .gitmodules"
-#~ msgstr "échec de stat du .gitmodules mis à jour"
-
-#~ msgid "unable to remove .gitmodules from index"
-#~ msgstr "suppression du .gitmodules dans l'index impossible"
-
-#~ msgid "adding updated .gitmodules failed"
-#~ msgstr "échec de l'ajout du .gitmodules mis à jour"
-
-#~ msgid "bug"
-#~ msgstr "bogue"
-
-#~ msgid ", behind "
-#~ msgstr ", derrière "
-
-#~ msgid ""
-#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
-#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
-#~ "anymore.\n"
-#~ "To add content for the whole tree, run:\n"
-#~ "\n"
-#~ " git add %s :/\n"
-#~ " (or git add %s :/)\n"
-#~ "\n"
-#~ "To restrict the command to the current directory, run:\n"
-#~ "\n"
-#~ " git add %s .\n"
-#~ " (or git add %s .)\n"
-#~ "\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 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"
-#~ "\n"
-#~ "Pour restreindre la commande au répertoire courant, lancez :\n"
-#~ "\n"
-#~ " git add %s .\n"
-#~ " (ou git add %s .)\n"
-#~ "\n"
-#~ "Avec la version actuelle de Git, la commande est restreinte au répertoire "
-#~ "courant.\n"
-
-#~ msgid ""
-#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-#~ "whose behaviour will change in Git 2.0 with respect to paths you "
-#~ "removed.\n"
-#~ "Paths like '%s' that are\n"
-#~ "removed from your working tree are ignored with this version of Git.\n"
-#~ "\n"
-#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-#~ " ignores paths you removed from your working tree.\n"
-#~ "\n"
-#~ "* '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"
-#~ "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>', 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"
-
-#~ msgid "key id"
-#~ msgstr "identifiant de clé"
-
-#~ msgid ""
-#~ "Auto packing the repository for optimum performance. You may also\n"
-#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
-#~ msgstr ""
-#~ "Compression automatique du dépôt pour une performance optimum. Vous "
-#~ "pouvez aussi\n"
-#~ "lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus "
-#~ "d'information.\n"
-
-#~ msgid ""
-#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
-#~ "counterpart. If you did not intend to push that branch, you may want to\n"
-#~ "specify branches to push or set the 'push.default' configuration "
-#~ "variable\n"
-#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
-#~ msgstr ""
-#~ "Les mises à jour ont été rejetées car la pointe de la branche poussée est "
-#~ "derrière\n"
-#~ "son homologue distant. Si vous ne vouliez pas pousser cette branche, vous "
-#~ "pourriez\n"
-#~ "vouloir spécifier les branches à pousser ou définir la variable de "
-#~ "configuration\n"
-#~ "'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement "
-#~ "la branche courante."
-
-#~ msgid "deleted: %s"
-#~ msgstr "supprimé : %s"
-
-#~ msgid "modified: %s"
-#~ msgstr "modifié : %s"
-
-#~ msgid "renamed: %s -> %s"
-#~ msgstr "renommé : %s -> %s"
-
-#~ msgid "unmerged: %s"
-#~ msgstr "non fus. : %s"
-
-#~ msgid "input paths are terminated by a null character"
-#~ msgstr "les chemins en entrée sont terminés par le caractère nul"
-
-#~ msgid ""
-#~ "Aborting. Consider using either the --force or --include-untracked option."
-#~ msgstr "Abandon. Utilisez l'option --force ou --include-untracked."
diff --git a/po/vi.po b/po/vi.po
index bbdeb5c..3068608 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -2,14 +2,14 @@
# Bản dịch tiếng Việt dành cho GIT-CORE.
# This file is distributed under the same license as the git-core package.
# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
-# Trần Ngọc Quân <vnwildman@gmail.com>, 2012, 2013, 2014, 2015, 2016, 2017, 2018.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
#
msgid ""
msgstr ""
-"Project-Id-Version: git v2.20.0 round 3\n"
+"Project-Id-Version: git v2.21 round 2\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2018-12-02 10:55+0800\n"
-"PO-Revision-Date: 2018-12-02 14:12+0700\n"
+"POT-Creation-Date: 2019-02-15 10:09+0800\n"
+"PO-Revision-Date: 2019-02-26 14:49+0700\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
"Language: vi\n"
@@ -19,48 +19,48 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Language-Team-Website: <http://translationproject.org/team/vi.html>\n"
"X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-Basepath: ../\n"
+"X-Poedit-Basepath: ..\n"
"X-Generator: Gtranslator 2.91.7\n"
-#: advice.c:99
+#: advice.c:101
#, c-format
msgid "%shint: %.*s%s\n"
msgstr "%sgợi ý: %.*s%s\n"
-#: advice.c:152
+#: advice.c:154
msgid "Cherry-picking is not possible because you have unmerged files."
msgstr ""
"Cherry-picking là không thể thực hiện bởi vì bạn có những tập tin chưa được "
"hòa trộn."
-#: advice.c:154
+#: advice.c:156
msgid "Committing is not possible because you have unmerged files."
msgstr ""
"Commit là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
-#: advice.c:156
+#: advice.c:158
msgid "Merging is not possible because you have unmerged files."
msgstr ""
"Merge là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
-#: advice.c:158
+#: advice.c:160
msgid "Pulling is not possible because you have unmerged files."
msgstr ""
"Pull là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
-#: advice.c:160
+#: advice.c:162
msgid "Reverting is not possible because you have unmerged files."
msgstr ""
"Revert là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
-#: advice.c:162
+#: advice.c:164
#, c-format
msgid "It is not possible to %s because you have unmerged files."
msgstr ""
"Nó là không thể thực hiện với %s bởi vì bạn có những tập tin chưa được hòa "
"trộn."
-#: advice.c:170
+#: advice.c:172
msgid ""
"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
"as appropriate to mark resolution and make a commit."
@@ -68,23 +68,23 @@ msgstr ""
"Sửa chúng trong cây làm việc, và sau đó dùng lệnh “git add/rm <tập-tin>”\n"
"dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao."
-#: advice.c:178
+#: advice.c:180
msgid "Exiting because of an unresolved conflict."
msgstr "Thoát ra bởi vì xung đột không thể giải quyết."
-#: advice.c:183 builtin/merge.c:1289
+#: advice.c:185 builtin/merge.c:1290
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Bạn chưa kết thúc việc hòa trộn (MERGE_HEAD vẫn tồn tại)."
-#: advice.c:185
+#: advice.c:187
msgid "Please, commit your changes before merging."
msgstr "Vui lòng chuyển giao các thay đổi trước khi hòa trộn."
-#: advice.c:186
+#: advice.c:188
msgid "Exiting because of unfinished merge."
msgstr "Thoát ra bởi vì việc hòa trộn không hoàn tất."
-#: advice.c:192
+#: advice.c:194
#, c-format
msgid ""
"Note: checking out '%s'.\n"
@@ -113,6 +113,14 @@ msgstr ""
" git checkout -b <tên-nhánh-mới>\n"
"\n"
+#: alias.c:50
+msgid "cmdline ends with \\"
+msgstr "cmdline kết thúc với \\"
+
+#: alias.c:51
+msgid "unclosed quote"
+msgstr "chưa đóng trích dẫn"
+
#: apply.c:59
#, c-format
msgid "unrecognized whitespace option '%s'"
@@ -143,65 +151,65 @@ msgstr "--index ở ngoài một kho chứa"
msgid "--cached outside a repository"
msgstr "--cached ở ngoài một kho chứa"
-#: apply.c:826
+#: apply.c:825
#, c-format
msgid "Cannot prepare timestamp regexp %s"
msgstr ""
"Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) "
"%s"
-#: apply.c:835
+#: apply.c:834
#, c-format
msgid "regexec returned %d for input: %s"
msgstr "thi hành biểu thức chính quy trả về %d cho đầu vào: %s"
-#: apply.c:909
+#: apply.c:908
#, c-format
msgid "unable to find filename in patch at line %d"
msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d"
-#: apply.c:947
+#: apply.c:946
#, c-format
msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
msgstr ""
"git apply: git-diff sai - cần /dev/null, nhưng lại nhận được %s trên dòng %d"
-#: apply.c:953
+#: apply.c:952
#, c-format
msgid "git apply: bad git-diff - inconsistent new filename on line %d"
msgstr "git apply: git-diff sai - tên tập tin mới không nhất quán trên dòng %d"
-#: apply.c:954
+#: apply.c:953
#, c-format
msgid "git apply: bad git-diff - inconsistent old filename on line %d"
msgstr "git apply: git-diff sai - tên tập tin cũ không nhất quán trên dòng %d"
-#: apply.c:959
+#: apply.c:958
#, c-format
msgid "git apply: bad git-diff - expected /dev/null on line %d"
msgstr "git apply: git-diff sai - cần “/dev/null” trên dòng %d"
-#: apply.c:988
+#: apply.c:987
#, c-format
msgid "invalid mode on line %d: %s"
msgstr "chế độ không hợp lệ trên dòng %d: %s"
-#: apply.c:1307
+#: apply.c:1306
#, c-format
msgid "inconsistent header lines %d and %d"
msgstr "phần đầu mâu thuẫn dòng %d và %d"
-#: apply.c:1479
+#: apply.c:1478
#, c-format
msgid "recount: unexpected line: %.*s"
msgstr "chi tiết: dòng không cần: %.*s"
-#: apply.c:1548
+#: apply.c:1547
#, c-format
msgid "patch fragment without header at line %d: %.*s"
msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s"
-#: apply.c:1568
+#: apply.c:1567
#, c-format
msgid ""
"git diff header lacks filename information when removing %d leading pathname "
@@ -213,81 +221,81 @@ msgstr[0] ""
"phần đầu diff cho git thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
"thành phần dẫn đầu tên của đường dẫn (dòng %d)"
-#: apply.c:1581
+#: apply.c:1580
#, c-format
msgid "git diff header lacks filename information (line %d)"
msgstr "phần đầu diff cho git thiếu thông tin tên tập tin (dòng %d)"
-#: apply.c:1769
+#: apply.c:1768
msgid "new file depends on old contents"
msgstr "tập tin mới phụ thuộc vào nội dung cũ"
-#: apply.c:1771
+#: apply.c:1770
msgid "deleted file still has contents"
msgstr "tập tin đã xóa vẫn còn nội dung"
-#: apply.c:1805
+#: apply.c:1804
#, c-format
msgid "corrupt patch at line %d"
msgstr "miếng vá hỏng tại dòng %d"
-#: apply.c:1842
+#: apply.c:1841
#, c-format
msgid "new file %s depends on old contents"
msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
-#: apply.c:1844
+#: apply.c:1843
#, c-format
msgid "deleted file %s still has contents"
msgstr "tập tin đã xóa %s vẫn còn nội dung"
-#: apply.c:1847
+#: apply.c:1846
#, c-format
msgid "** warning: file %s becomes empty but is not deleted"
msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa"
-#: apply.c:1994
+#: apply.c:1993
#, c-format
msgid "corrupt binary patch at line %d: %.*s"
msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s"
-#: apply.c:2031
+#: apply.c:2030
#, c-format
msgid "unrecognized binary patch at line %d"
msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d"
-#: apply.c:2193
+#: apply.c:2192
#, c-format
msgid "patch with only garbage at line %d"
msgstr "vá chỉ với “rác” tại dòng %d"
-#: apply.c:2279
+#: apply.c:2278
#, c-format
msgid "unable to read symlink %s"
msgstr "không thể đọc liên kết mềm %s"
-#: apply.c:2283
+#: apply.c:2282
#, c-format
msgid "unable to open or read %s"
msgstr "không thể mở hay đọc %s"
-#: apply.c:2942
+#: apply.c:2941
#, c-format
msgid "invalid start of line: '%c'"
msgstr "sai khởi đầu dòng: “%c”"
-#: apply.c:3063
+#: apply.c:3062
#, c-format
msgid "Hunk #%d succeeded at %d (offset %d line)."
msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
-#: apply.c:3075
+#: apply.c:3074
#, c-format
msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
msgstr "Nội dung bị giảm xuống còn (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
-#: apply.c:3081
+#: apply.c:3080
#, c-format
msgid ""
"while searching for:\n"
@@ -296,55 +304,55 @@ msgstr ""
"trong khi đang tìm kiếm cho:\n"
"%.*s"
-#: apply.c:3103
+#: apply.c:3102
#, c-format
msgid "missing binary patch data for '%s'"
msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho “%s”"
-#: apply.c:3111
+#: apply.c:3110
#, c-format
msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
msgstr ""
"không thể reverse-apply một miếng vá nhị phân mà không đảo ngược hunk thành "
"“%s”"
-#: apply.c:3158
+#: apply.c:3157
#, c-format
msgid "cannot apply binary patch to '%s' without full index line"
msgstr ""
"không thể áp dụng miếng vá nhị phân thành “%s” mà không có dòng chỉ mục đầy "
"đủ"
-#: apply.c:3168
+#: apply.c:3167
#, c-format
msgid ""
"the patch applies to '%s' (%s), which does not match the current contents."
msgstr ""
"miếng vá áp dụng cho “%s” (%s), cái mà không khớp với các nội dung hiện tại."
-#: apply.c:3176
+#: apply.c:3175
#, c-format
msgid "the patch applies to an empty '%s' but it is not empty"
msgstr "miếng vá áp dụng cho một “%s” trống rỗng nhưng nó lại không trống"
-#: apply.c:3194
+#: apply.c:3193
#, c-format
msgid "the necessary postimage %s for '%s' cannot be read"
msgstr "không thể đọc postimage %s cần thiết cho “%s”"
-#: apply.c:3207
+#: apply.c:3206
#, c-format
msgid "binary patch does not apply to '%s'"
msgstr "miếng vá định dạng nhị phân không được áp dụng cho “%s”"
-#: apply.c:3213
+#: apply.c:3212
#, c-format
msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
msgstr ""
"vá nhị phân cho “%s” tạo ra kết quả không chính xác (mong chờ %s, lại nhận "
"%s)"
-#: apply.c:3234
+#: apply.c:3233
#, c-format
msgid "patch failed: %s:%ld"
msgstr "gặp lỗi khi vá: %s:%ld"
@@ -381,7 +389,7 @@ msgstr "%s: không khớp trong mục lục"
#: apply.c:3575
msgid "repository lacks the necessary blob to fall back on 3-way merge."
-msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
+msgstr "kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
#: apply.c:3578
#, c-format
@@ -422,7 +430,8 @@ msgstr "%s: sai kiểu"
msgid "%s has type %o, expected %o"
msgstr "%s có kiểu %o, cần %o"
-#: apply.c:3881 apply.c:3883
+#: apply.c:3881 apply.c:3883 read-cache.c:820 read-cache.c:846
+#: read-cache.c:1299
#, c-format
msgid "invalid path '%s'"
msgstr "đường dẫn không hợp lệ “%s”"
@@ -477,7 +486,7 @@ msgstr "thay đổi chế độ cho %s, cái mà không phải là HEAD hiện t
msgid "sha1 information is lacking or useless (%s)."
msgstr "thông tin sha1 còn thiếu hay không dùng được(%s)."
-#: apply.c:4113 builtin/checkout.c:244 builtin/reset.c:142
+#: apply.c:4113 builtin/checkout.c:248 builtin/reset.c:143
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "make_cache_entry gặp lỗi đối với đường dẫn “%s”"
@@ -552,7 +561,7 @@ msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối…"
msgid "truncating .rej filename to %.*s.rej"
msgstr "đang cắt ngắn tên tập tin .rej thành %.*s.rej"
-#: apply.c:4564 builtin/fetch.c:843 builtin/fetch.c:1122
+#: apply.c:4564 builtin/fetch.c:837 builtin/fetch.c:1118
#, c-format
msgid "cannot open %s"
msgstr "không mở được “%s”"
@@ -565,184 +574,184 @@ msgstr "Khối nhớ #%d được áp dụng gọn gàng."
#: apply.c:4582
#, c-format
msgid "Rejected hunk #%d."
-msgstr "đoạn dữ liệu #%d bị từ chối."
+msgstr "Đoạn dữ liệu #%d bị từ chối."
#: apply.c:4692
#, c-format
msgid "Skipped patch '%s'."
-msgstr "bỏ qua đường dẫn “%s”."
+msgstr "Bỏ qua đường dẫn “%s”."
#: apply.c:4700
msgid "unrecognized input"
msgstr "không thừa nhận đầu vào"
-#: apply.c:4719
+#: apply.c:4720
msgid "unable to read index file"
msgstr "không thể đọc tập tin lưu bảng mục lục"
-#: apply.c:4874
+#: apply.c:4875
#, c-format
msgid "can't open patch '%s': %s"
msgstr "không thể mở miếng vá “%s”: %s"
-#: apply.c:4901
+#: apply.c:4902
#, c-format
msgid "squelched %d whitespace error"
msgid_plural "squelched %d whitespace errors"
msgstr[0] "đã chấm dứt %d lỗi khoảng trắng"
-#: apply.c:4907 apply.c:4922
+#: apply.c:4908 apply.c:4923
#, c-format
msgid "%d line adds whitespace errors."
msgid_plural "%d lines add whitespace errors."
msgstr[0] "%d dòng thêm khoảng trắng lỗi."
-#: apply.c:4915
+#: apply.c:4916
#, c-format
msgid "%d line applied after fixing whitespace errors."
msgid_plural "%d lines applied after fixing whitespace errors."
msgstr[0] "%d dòng được áp dụng sau khi sửa các lỗi khoảng trắng."
-#: apply.c:4931 builtin/add.c:538 builtin/mv.c:300 builtin/rm.c:389
+#: apply.c:4932 builtin/add.c:539 builtin/mv.c:301 builtin/rm.c:390
msgid "Unable to write new index file"
msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
-#: apply.c:4958 apply.c:4961 builtin/am.c:2209 builtin/am.c:2212
-#: builtin/clone.c:121 builtin/fetch.c:118 builtin/merge.c:262
-#: builtin/pull.c:199 builtin/submodule--helper.c:406
-#: builtin/submodule--helper.c:1362 builtin/submodule--helper.c:1365
-#: builtin/submodule--helper.c:1846 builtin/submodule--helper.c:1849
-#: builtin/submodule--helper.c:2088 git-add--interactive.perl:197
+#: apply.c:4959 apply.c:4962 builtin/am.c:2203 builtin/am.c:2206
+#: builtin/clone.c:122 builtin/fetch.c:118 builtin/merge.c:263
+#: builtin/pull.c:200 builtin/submodule--helper.c:407
+#: builtin/submodule--helper.c:1366 builtin/submodule--helper.c:1369
+#: builtin/submodule--helper.c:1850 builtin/submodule--helper.c:1853
+#: builtin/submodule--helper.c:2092 git-add--interactive.perl:197
msgid "path"
msgstr "đường-dẫn"
-#: apply.c:4959
+#: apply.c:4960
msgid "don't apply changes matching the given path"
msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho"
-#: apply.c:4962
+#: apply.c:4963
msgid "apply changes matching the given path"
msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
-#: apply.c:4964 builtin/am.c:2218
+#: apply.c:4965 builtin/am.c:2212
msgid "num"
msgstr "số"
-#: apply.c:4965
+#: apply.c:4966
msgid "remove <num> leading slashes from traditional diff paths"
msgstr "gỡ bỏ <số> dấu gạch chéo dẫn đầu từ đường dẫn diff cổ điển"
-#: apply.c:4968
+#: apply.c:4969
msgid "ignore additions made by the patch"
msgstr "lờ đi phần bổ xung được tạo ra bởi miếng vá"
-#: apply.c:4970
+#: apply.c:4971
msgid "instead of applying the patch, output diffstat for the input"
msgstr ""
"thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
-#: apply.c:4974
+#: apply.c:4975
msgid "show number of added and deleted lines in decimal notation"
msgstr ""
"hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
-#: apply.c:4976
+#: apply.c:4977
msgid "instead of applying the patch, output a summary for the input"
msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào"
-#: apply.c:4978
+#: apply.c:4979
msgid "instead of applying the patch, see if the patch is applicable"
msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không"
-#: apply.c:4980
+#: apply.c:4981
msgid "make sure the patch is applicable to the current index"
msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành"
-#: apply.c:4982
+#: apply.c:4983
msgid "mark new files with `git add --intent-to-add`"
msgstr "đánh dấu các tập tin mới với “git add --intent-to-add”"
-#: apply.c:4984
+#: apply.c:4985
msgid "apply a patch without touching the working tree"
msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc"
-#: apply.c:4986
+#: apply.c:4987
msgid "accept a patch that touches outside the working area"
msgstr "chấp nhận một miếng vá mà không động chạm đến cây làm việc"
-#: apply.c:4989
+#: apply.c:4990
msgid "also apply the patch (use with --stat/--summary/--check)"
msgstr ""
"đồng thời áp dụng miếng vá (dùng với tùy chọn --stat/--summary/--check)"
-#: apply.c:4991
+#: apply.c:4992
msgid "attempt three-way merge if a patch does not apply"
msgstr "thử hòa trộn kiểu three-way nếu việc vá không thể thực hiện được"
-#: apply.c:4993
+#: apply.c:4994
msgid "build a temporary index based on embedded index information"
msgstr ""
"xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
-#: apply.c:4996 builtin/checkout-index.c:170 builtin/ls-files.c:523
+#: apply.c:4997 builtin/checkout-index.c:173 builtin/ls-files.c:524
msgid "paths are separated with NUL character"
msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
-#: apply.c:4998
+#: apply.c:4999
msgid "ensure at least <n> lines of context match"
msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp"
-#: apply.c:4999 builtin/am.c:2197 builtin/interpret-trailers.c:97
+#: apply.c:5000 builtin/am.c:2191 builtin/interpret-trailers.c:97
#: builtin/interpret-trailers.c:99 builtin/interpret-trailers.c:101
-#: builtin/pack-objects.c:3312 builtin/rebase.c:857
+#: builtin/pack-objects.c:3314 builtin/rebase.c:1065
msgid "action"
msgstr "hành động"
-#: apply.c:5000
+#: apply.c:5001
msgid "detect new or modified lines that have whitespace errors"
msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng"
-#: apply.c:5003 apply.c:5006
+#: apply.c:5004 apply.c:5007
msgid "ignore changes in whitespace when finding context"
msgstr "lờ đi sự thay đổi do khoảng trắng gây ra khi quét nội dung"
-#: apply.c:5009
+#: apply.c:5010
msgid "apply the patch in reverse"
msgstr "áp dụng miếng vá theo chiều ngược"
-#: apply.c:5011
+#: apply.c:5012
msgid "don't expect at least one line of context"
msgstr "đừng hy vọng có ít nhất một dòng nội dung"
-#: apply.c:5013
+#: apply.c:5014
msgid "leave the rejected hunks in corresponding *.rej files"
msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng"
-#: apply.c:5015
+#: apply.c:5016
msgid "allow overlapping hunks"
msgstr "cho phép chồng khối nhớ"
-#: apply.c:5016 builtin/add.c:290 builtin/check-ignore.c:21
-#: builtin/commit.c:1309 builtin/count-objects.c:98 builtin/fsck.c:698
-#: builtin/log.c:2023 builtin/mv.c:122 builtin/read-tree.c:127
-#: builtin/rebase--interactive.c:157
+#: apply.c:5017 builtin/add.c:291 builtin/check-ignore.c:22
+#: builtin/commit.c:1312 builtin/count-objects.c:98 builtin/fsck.c:724
+#: builtin/log.c:2037 builtin/mv.c:123 builtin/read-tree.c:128
+#: builtin/rebase--interactive.c:159
msgid "be verbose"
msgstr "chi tiết"
-#: apply.c:5018
+#: apply.c:5019
msgid "tolerate incorrectly detected missing new-line at the end of file"
msgstr ""
"đã dò tìm thấy dung sai không chính xác thiếu dòng mới tại cuối tập tin"
-#: apply.c:5021
+#: apply.c:5022
msgid "do not trust the line counts in the hunk headers"
msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu"
-#: apply.c:5023 builtin/am.c:2206
+#: apply.c:5024 builtin/am.c:2200
msgid "root"
msgstr "gốc"
-#: apply.c:5024
+#: apply.c:5025
msgid "prepend <root> to all filenames"
msgstr "treo thêm <root> vào tất cả các tên tập tin"
@@ -765,99 +774,118 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
-#: archive.c:370 builtin/add.c:176 builtin/add.c:514 builtin/rm.c:298
+#: archive.c:372 builtin/add.c:177 builtin/add.c:515 builtin/rm.c:299
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào"
-#: archive.c:453
+#: archive.c:396
+#, c-format
+msgid "no such ref: %.*s"
+msgstr "không có tham chiếu nào như thế: %.*s"
+
+#: archive.c:401
+#, c-format
+msgid "not a valid object name: %s"
+msgstr "không phải là tên đối tượng hợp lệ: “%s”"
+
+#: archive.c:414
+#, c-format
+msgid "not a tree object: %s"
+msgstr "không phải là đối tượng cây: “%s”"
+
+#: archive.c:424
+msgid "current working directory is untracked"
+msgstr "thư mục làm việc hiện hành chưa được theo dõi"
+
+#: archive.c:455
msgid "fmt"
msgstr "định_dạng"
-#: archive.c:453
+#: archive.c:455
msgid "archive format"
msgstr "định dạng lưu trữ"
-#: archive.c:454 builtin/log.c:1536
+#: archive.c:456 builtin/log.c:1549
msgid "prefix"
msgstr "tiền_tố"
-#: archive.c:455
+#: archive.c:457
msgid "prepend prefix to each pathname in the archive"
msgstr "nối thêm tiền tố vào từng đường dẫn tập tin trong kho lưu"
-#: archive.c:456 builtin/blame.c:820 builtin/blame.c:821 builtin/config.c:129
-#: builtin/fast-export.c:1013 builtin/fast-export.c:1015 builtin/grep.c:884
-#: builtin/hash-object.c:104 builtin/ls-files.c:559 builtin/ls-files.c:562
-#: builtin/notes.c:412 builtin/notes.c:575 builtin/read-tree.c:122
+#: archive.c:458 builtin/blame.c:820 builtin/blame.c:821 builtin/config.c:129
+#: builtin/fast-export.c:1091 builtin/fast-export.c:1093 builtin/grep.c:895
+#: builtin/hash-object.c:105 builtin/ls-files.c:560 builtin/ls-files.c:563
+#: builtin/notes.c:412 builtin/notes.c:578 builtin/read-tree.c:123
#: parse-options.h:162
msgid "file"
msgstr "tập_tin"
-#: archive.c:457 builtin/archive.c:89
+#: archive.c:459 builtin/archive.c:90
msgid "write the archive to this file"
msgstr "ghi kho lưu vào tập tin này"
-#: archive.c:459
+#: archive.c:461
msgid "read .gitattributes in working directory"
msgstr "đọc .gitattributes trong thư mục làm việc"
-#: archive.c:460
+#: archive.c:462
msgid "report archived files on stderr"
msgstr "liệt kê các tập tin được lưu trữ vào stderr (đầu ra lỗi tiêu chuẩn)"
-#: archive.c:461
+#: archive.c:463
msgid "store only"
msgstr "chỉ lưu (không nén)"
-#: archive.c:462
+#: archive.c:464
msgid "compress faster"
msgstr "nén nhanh hơn"
-#: archive.c:470
+#: archive.c:472
msgid "compress better"
msgstr "nén nhỏ hơn"
-#: archive.c:473
+#: archive.c:475
msgid "list supported archive formats"
msgstr "liệt kê các kiểu nén được hỗ trợ"
-#: archive.c:475 builtin/archive.c:90 builtin/clone.c:111 builtin/clone.c:114
-#: builtin/submodule--helper.c:1374 builtin/submodule--helper.c:1855
+#: archive.c:477 builtin/archive.c:91 builtin/clone.c:112 builtin/clone.c:115
+#: builtin/submodule--helper.c:1378 builtin/submodule--helper.c:1859
msgid "repo"
msgstr "kho"
-#: archive.c:476 builtin/archive.c:91
+#: archive.c:478 builtin/archive.c:92
msgid "retrieve the archive from remote repository <repo>"
msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
-#: archive.c:477 builtin/archive.c:92 builtin/difftool.c:714
-#: builtin/notes.c:496
+#: archive.c:479 builtin/archive.c:93 builtin/difftool.c:715
+#: builtin/notes.c:498
msgid "command"
msgstr "lệnh"
-#: archive.c:478 builtin/archive.c:93
+#: archive.c:480 builtin/archive.c:94
msgid "path to the remote git-upload-archive command"
msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ"
-#: archive.c:485
+#: archive.c:487
msgid "Unexpected option --remote"
msgstr "Gặp tùy chọn --remote không cần"
-#: archive.c:487
+#: archive.c:489
msgid "Option --exec can only be used together with --remote"
msgstr "Tùy chọn --exec chỉ có thể được dùng cùng với --remote"
-#: archive.c:489
+#: archive.c:491
msgid "Unexpected option --output"
msgstr "Gặp tùy chọn không cần --output"
-#: archive.c:511
+#: archive.c:513
#, c-format
msgid "Unknown archive format '%s'"
msgstr "Không hiểu định dạng “%s”"
-#: archive.c:518
+#: archive.c:520
#, c-format
msgid "Argument not supported for format '%s': -%d"
msgstr "Tham số không được hỗ trợ cho định dạng “%s”: -%d"
@@ -901,7 +929,7 @@ msgstr "đường dẫn không hợp lệ UTF-8: %s"
msgid "path too long (%d chars, SHA1: %s): %s"
msgstr "đường dẫn quá dài (%d ký tự, SHA1: %s): %s"
-#: archive-zip.c:474 builtin/pack-objects.c:224 builtin/pack-objects.c:227
+#: archive-zip.c:474 builtin/pack-objects.c:225 builtin/pack-objects.c:228
#, c-format
msgid "deflate error (%d)"
msgstr "lỗi giải nén (%d)"
@@ -911,12 +939,17 @@ msgstr "lỗi giải nén (%d)"
msgid "timestamp too large for this system: %<PRIuMAX>"
msgstr "dấu vết thời gian là quá lớn cho hệ thống này: %<PRIuMAX>"
-#: attr.c:212
+#: attr.c:211
#, c-format
msgid "%.*s is not a valid attribute name"
msgstr "%.*s không phải tên thuộc tính hợp lệ"
-#: attr.c:409
+#: attr.c:368
+#, c-format
+msgid "%s not allowed: %s:%d"
+msgstr "%s không được phép: %s:%d"
+
+#: attr.c:408
msgid ""
"Negative patterns are ignored in git attributes\n"
"Use '\\!' for literal leading exclamation."
@@ -927,19 +960,19 @@ msgstr ""
#: bisect.c:468
#, c-format
msgid "Badly quoted content in file '%s': %s"
-msgstr "nội dung được trích dẫn sai tập tin “%s”: %s"
+msgstr "Nội dung được trích dẫn sai trong tập tin “%s”: %s"
-#: bisect.c:676
+#: bisect.c:678
#, c-format
msgid "We cannot bisect more!\n"
msgstr "Chúng tôi không bisect thêm nữa!\n"
-#: bisect.c:730
+#: bisect.c:733
#, c-format
msgid "Not a valid commit name %s"
msgstr "Không phải tên đối tượng commit %s hợp lệ"
-#: bisect.c:754
+#: bisect.c:758
#, c-format
msgid ""
"The merge base %s is bad.\n"
@@ -948,7 +981,7 @@ msgstr ""
"Hòa trộn trên %s là sai.\n"
"Điều đó có nghĩa là lỗi đã được sửa chữa giữa %s và [%s].\n"
-#: bisect.c:759
+#: bisect.c:763
#, c-format
msgid ""
"The merge base %s is new.\n"
@@ -957,7 +990,7 @@ msgstr ""
"Hòa trộn trên %s là mới.\n"
"Gần như chắc chắn là có thay đổi giữa %s và [%s].\n"
-#: bisect.c:764
+#: bisect.c:768
#, c-format
msgid ""
"The merge base %s is %s.\n"
@@ -966,7 +999,7 @@ msgstr ""
"Hòa trộn trên %s là %s.\n"
"Điều đó có nghĩa là lần chuyển giao “%s” đầu tiên là giữa %s và [%s].\n"
-#: bisect.c:772
+#: bisect.c:776
#, c-format
msgid ""
"Some %s revs are not ancestors of the %s rev.\n"
@@ -977,7 +1010,7 @@ msgstr ""
"git bisect không thể làm việc đúng đắn trong trường hợp này.\n"
"Liệu có phải bạn nhầm lẫn các điểm %s và %s không?\n"
-#: bisect.c:785
+#: bisect.c:789
#, c-format
msgid ""
"the merge base between %s and [%s] must be skipped.\n"
@@ -989,45 +1022,45 @@ msgstr ""
"%s.\n"
"Chúng tôi vẫn cứ tiếp tục."
-#: bisect.c:818
+#: bisect.c:822
#, c-format
msgid "Bisecting: a merge base must be tested\n"
msgstr "Bisecting: nền hòa trộn cần phải được kiểm tra\n"
-#: bisect.c:858
+#: bisect.c:865
#, c-format
msgid "a %s revision is needed"
msgstr "cần một điểm xét duyệt %s"
-#: bisect.c:877 builtin/notes.c:177 builtin/tag.c:237
+#: bisect.c:884 builtin/notes.c:177 builtin/tag.c:237
#, c-format
msgid "could not create file '%s'"
msgstr "không thể tạo tập tin “%s”"
-#: bisect.c:928 builtin/merge.c:138
+#: bisect.c:937 builtin/merge.c:139
#, c-format
msgid "could not read file '%s'"
msgstr "không thể đọc tập tin “%s”"
-#: bisect.c:958
+#: bisect.c:967
msgid "reading bisect refs failed"
msgstr "việc đọc tham chiếu bisect gặp lỗi"
-#: bisect.c:977
+#: bisect.c:986
#, c-format
msgid "%s was both %s and %s\n"
msgstr "%s là cả %s và %s\n"
-#: bisect.c:985
+#: bisect.c:994
#, c-format
msgid ""
"No testable commit found.\n"
"Maybe you started with bad path parameters?\n"
msgstr ""
-"không tìm thấy lần chuyển giao kiểm tra được nào.\n"
+"Không tìm thấy lần chuyển giao kiểm tra được nào.\n"
"Có lẽ bạn bắt đầu với các tham số đường dẫn sai?\n"
-#: bisect.c:1004
+#: bisect.c:1013
#, c-format
msgid "(roughly %d step)"
msgid_plural "(roughly %d steps)"
@@ -1036,46 +1069,46 @@ msgstr[0] "(ước chừng %d bước)"
#. TRANSLATORS: the last %s will be replaced with "(roughly %d
#. steps)" translation.
#.
-#: bisect.c:1010
+#: bisect.c:1019
#, c-format
msgid "Bisecting: %d revision left to test after this %s\n"
msgid_plural "Bisecting: %d revisions left to test after this %s\n"
msgstr[0] "Bisecting: còn %d điểm xét duyệt để kiểm sau %s này\n"
-#: blame.c:1787
+#: blame.c:1792
msgid "--contents and --reverse do not blend well."
msgstr "tùy chọn--contents và --reverse không được trộn vào nhau."
-#: blame.c:1801
+#: blame.c:1806
msgid "cannot use --contents with final commit object name"
msgstr "không thể dùng --contents với tên đối tượng chuyển giao cuối cùng"
-#: blame.c:1822
+#: blame.c:1827
msgid "--reverse and --first-parent together require specified latest commit"
msgstr ""
"--reverse và --first-parent cùng nhau cần chỉ định lần chuyển giao cuối"
-#: blame.c:1831 bundle.c:162 ref-filter.c:2046 sequencer.c:1963
-#: sequencer.c:4002 builtin/commit.c:1001 builtin/log.c:377 builtin/log.c:932
-#: builtin/log.c:1407 builtin/log.c:1783 builtin/log.c:2072 builtin/merge.c:406
+#: blame.c:1836 bundle.c:164 ref-filter.c:2071 remote.c:1948 sequencer.c:1993
+#: sequencer.c:4064 builtin/commit.c:1004 builtin/log.c:378 builtin/log.c:936
+#: builtin/log.c:1420 builtin/log.c:1796 builtin/log.c:2086 builtin/merge.c:407
#: builtin/pack-objects.c:3137 builtin/pack-objects.c:3152
#: builtin/shortlog.c:192
msgid "revision walk setup failed"
msgstr "cài đặt việc di chuyển qua các điểm xét duyệt gặp lỗi"
-#: blame.c:1849
+#: blame.c:1854
msgid ""
"--reverse --first-parent together require range along first-parent chain"
msgstr ""
"--reverse --first-parent cùng nhau yêu cầu vùng cùng với chuỗi cha-mẹ-đầu-"
"tiên"
-#: blame.c:1860
+#: blame.c:1865
#, c-format
msgid "no such path %s in %s"
msgstr "không có đường dẫn %s trong “%s”"
-#: blame.c:1871
+#: blame.c:1876
#, c-format
msgid "cannot read blob %s for path %s"
msgstr "không thể đọc blob %s cho đường dẫn “%s”"
@@ -1196,27 +1229,27 @@ msgstr ""
"sẽ theo dõi bản đối chiếu máy chủ của nó, bạn cần dùng lệnh\n"
"\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push."
-#: branch.c:279
+#: branch.c:280
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Không phải tên đối tượng hợp lệ: “%s”."
-#: branch.c:299
+#: branch.c:300
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "Tên đối tượng chưa rõ ràng: “%s”."
-#: branch.c:304
+#: branch.c:305
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Nhánh không hợp lệ: “%s”."
-#: branch.c:358
+#: branch.c:359
#, c-format
msgid "'%s' is already checked out at '%s'"
msgstr "“%s” đã được lấy ra tại “%s” rồi"
-#: branch.c:381
+#: branch.c:382
#, c-format
msgid "HEAD of working tree %s is not updated"
msgstr "HEAD của cây làm việc %s chưa được cập nhật"
@@ -1231,68 +1264,68 @@ msgstr "“%s” không giống như tập tin v2 bundle (định dạng dump c
msgid "unrecognized header: %s%s (%d)"
msgstr "phần đầu không được thừa nhận: %s%s (%d)"
-#: bundle.c:90 rerere.c:480 rerere.c:690 sequencer.c:2182 sequencer.c:2722
-#: builtin/commit.c:774
+#: bundle.c:90 rerere.c:480 rerere.c:690 sequencer.c:2215 sequencer.c:2763
+#: builtin/commit.c:776
#, c-format
msgid "could not open '%s'"
msgstr "không thể mở “%s”"
-#: bundle.c:141
+#: bundle.c:143
msgid "Repository lacks these prerequisite commits:"
msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
-#: bundle.c:192
+#: bundle.c:194
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "Bó dữ liệu chứa %d tham chiếu:"
-#: bundle.c:199
+#: bundle.c:201
msgid "The bundle records a complete history."
msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
-#: bundle.c:201
+#: bundle.c:203
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Lệnh bundle yêu cầu %d tham chiếu này:"
-#: bundle.c:267
+#: bundle.c:269
msgid "unable to dup bundle descriptor"
msgstr "không thể nhân đôi bộ mô tả bundle"
-#: bundle.c:274
+#: bundle.c:276
msgid "Could not spawn pack-objects"
msgstr "Không thể sản sinh đối tượng gói"
-#: bundle.c:285
+#: bundle.c:287
msgid "pack-objects died"
msgstr "đối tượng gói đã chết"
-#: bundle.c:327
+#: bundle.c:329
msgid "rev-list died"
msgstr "rev-list đã chết"
-#: bundle.c:376
+#: bundle.c:378
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "th.chiếu “%s” bị loại trừ bởi các tùy chọn rev-list"
-#: bundle.c:456 builtin/log.c:192 builtin/log.c:1688 builtin/shortlog.c:304
+#: bundle.c:457 builtin/log.c:193 builtin/log.c:1701 builtin/shortlog.c:306
#, c-format
msgid "unrecognized argument: %s"
msgstr "đối số không được thừa nhận: %s"
-#: bundle.c:464
+#: bundle.c:465
msgid "Refusing to create empty bundle."
msgstr "Từ chối tạo một bó dữ liệu trống rỗng."
-#: bundle.c:474
+#: bundle.c:475
#, c-format
msgid "cannot create '%s'"
msgstr "không thể tạo “%s”"
-#: bundle.c:498
+#: bundle.c:500
msgid "index-pack died"
msgstr "mục lục gói đã chết"
@@ -1301,8 +1334,8 @@ msgstr "mục lục gói đã chết"
msgid "invalid color value: %.*s"
msgstr "giá trị màu không hợp lệ: %.*s"
-#: commit.c:50 sequencer.c:2528 builtin/am.c:370 builtin/am.c:414
-#: builtin/am.c:1390 builtin/am.c:2025 builtin/replace.c:376
+#: commit.c:50 sequencer.c:2567 builtin/am.c:355 builtin/am.c:399
+#: builtin/am.c:1375 builtin/am.c:2019 builtin/replace.c:376
#: builtin/replace.c:448
#, c-format
msgid "could not parse %s"
@@ -1333,28 +1366,28 @@ msgstr ""
"Tắt lời nhắn này bằng cách chạy\n"
"\"git config advice.graftFileDeprecated false\""
-#: commit.c:1115
+#: commit.c:1122
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
"Lần chuyển giao %s có một chữ ký GPG không đáng tin, được cho là bởi %s."
-#: commit.c:1118
+#: commit.c:1125
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr "Lần chuyển giao %s có một chữ ký GPG sai, được cho là bởi %s."
-#: commit.c:1121
+#: commit.c:1128
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "Lần chuyển giao %s không có chữ ký GPG."
-#: commit.c:1124
+#: commit.c:1131
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "Lần chuyển giao %s có một chữ ký GPG tốt bởi %s\n"
-#: commit.c:1378
+#: commit.c:1385
msgid ""
"Warning: commit message did not conform to UTF-8.\n"
"You may want to amend it after fixing the message, or set the config\n"
@@ -1364,92 +1397,138 @@ msgstr ""
"Bạn có lẽ muốn tu bổ nó sau khi sửa lời chú thích, hoặc là đặt biến\n"
"cấu hình i18n.commitencoding thành bảng mã mà dự án của bạn muốn dùng.\n"
-#: commit-graph.c:108
+#: commit-graph.c:101
#, c-format
msgid "graph file %s is too small"
msgstr "tập tin đồ thị %s quá nhỏ"
-#: commit-graph.c:115
+#: commit-graph.c:136
#, c-format
msgid "graph signature %X does not match signature %X"
msgstr "chữ ký đồ họa %X không khớp chữ ký %X"
-#: commit-graph.c:122
+#: commit-graph.c:143
#, c-format
msgid "graph version %X does not match version %X"
msgstr "phiên bản đồ họa %X không khớp phiên bản %X"
-#: commit-graph.c:129
+#: commit-graph.c:150
#, c-format
msgid "hash version %X does not match version %X"
msgstr "phiên bản băm “%X” không có phiên bản khớp %X"
-#: commit-graph.c:153
+#: commit-graph.c:173
+msgid "chunk lookup table entry missing; graph file may be incomplete"
+msgstr ""
+"mục tin bảng tìm kiếm mảnh còn thiếu; tập tin đồ thị có thể sẽ không hoàn "
+"thiện"
+
+#: commit-graph.c:184
#, c-format
msgid "improper chunk offset %08x%08x"
msgstr "bù mảnh không đúng chỗ %08x%08x"
-#: commit-graph.c:189
+#: commit-graph.c:221
#, c-format
msgid "chunk id %08x appears multiple times"
msgstr "mã mảnh %08x xuất hiện nhiều lần"
-#: commit-graph.c:308
+#: commit-graph.c:334
#, c-format
msgid "could not find commit %s"
msgstr "không thể tìm thấy lần chuyển giao %s"
-#: commit-graph.c:617 builtin/pack-objects.c:2652
+#: commit-graph.c:671 builtin/pack-objects.c:2646
#, c-format
msgid "unable to get type of object %s"
msgstr "không thể lấy kiểu của đối tượng “%s”"
-#: commit-graph.c:651
-msgid "Annotating commits in commit graph"
-msgstr "Diễn giải các lần chuyển giao trong đồ thị lần chuyển giao"
+#: commit-graph.c:704
+msgid "Loading known commits in commit graph"
+msgstr "Đang tải các lần chuyển giao chưa biết trong đồ thị lần chuyển giao"
+
+#: commit-graph.c:720
+msgid "Expanding reachable commits in commit graph"
+msgstr ""
+"Mở rộng các lần chuyển giao có thể tiếp cận được trong trong đồ thị lần "
+"chuyển giao"
+
+#: commit-graph.c:732
+msgid "Clearing commit marks in commit graph"
+msgstr "Đang dọn dẹp các đánh dấu lần chuyển giao trong đồ thị lần chuyển giao"
-#: commit-graph.c:691
+#: commit-graph.c:752
msgid "Computing commit graph generation numbers"
msgstr "Đang tính toán số tạo sơ đồ các lần chuyển giao"
-#: commit-graph.c:803 commit-graph.c:826 commit-graph.c:852
-msgid "Finding commits for commit graph"
-msgstr "Đang tìm các lần chuyển giao cho đồ thị lần chuyển giao"
+#: commit-graph.c:869
+#, c-format
+msgid "Finding commits for commit graph in %d pack"
+msgid_plural "Finding commits for commit graph in %d packs"
+msgstr[0] ""
+"Đang tìm các lần chuyển giao cho đồ thị lần chuyển giao trong %d gói"
-#: commit-graph.c:812
+#: commit-graph.c:882
#, c-format
msgid "error adding pack %s"
msgstr "gặp lỗi thêm gói %s"
-#: commit-graph.c:814
+#: commit-graph.c:884
#, c-format
msgid "error opening index for %s"
msgstr "gặp lỗi khi mở mục lục cho “%s”"
-#: commit-graph.c:868
+#: commit-graph.c:898
+#, c-format
+msgid "Finding commits for commit graph from %d ref"
+msgid_plural "Finding commits for commit graph from %d refs"
+msgstr[0] ""
+"Đang tìm các lần chuyển giao cho đồ thị lần chuyển giao từ %d tham chiếu"
+
+#: commit-graph.c:930
+msgid "Finding commits for commit graph among packed objects"
+msgstr ""
+"Đang tìm các lần chuyển giao cho đồ thị lần chuyển giao trong số các đối "
+"tượng đã đóng gói"
+
+#: commit-graph.c:943
+msgid "Counting distinct commits in commit graph"
+msgstr "Đang đếm các lần chuyển giao khác nhau trong đồ thị lần chuyển giao"
+
+#: commit-graph.c:956
#, c-format
msgid "the commit graph format cannot write %d commits"
msgstr "định dạng đồ họa các lần chuyển giao không thể ghi %d lần chuyển giao"
-#: commit-graph.c:895
+#: commit-graph.c:965
+msgid "Finding extra edges in commit graph"
+msgstr "Đang tìm các cạnh mở tộng trong đồ thị lần chuyển giao"
+
+#: commit-graph.c:989
msgid "too many commits to write graph"
msgstr "có quá nhiều lần chuyển giao để ghi đồ thị"
-#: commit-graph.c:902 midx.c:769
+#: commit-graph.c:996 midx.c:769
#, c-format
msgid "unable to create leading directories of %s"
msgstr "không thể tạo các thư mục dẫn đầu của “%s”"
-#: commit-graph.c:1002
+#: commit-graph.c:1036
+#, c-format
+msgid "Writing out commit graph in %d pass"
+msgid_plural "Writing out commit graph in %d passes"
+msgstr[0] "Đang ghi ra đồ thị các lần chuyển giao trong lần %d"
+
+#: commit-graph.c:1109
msgid "the commit-graph file has incorrect checksum and is likely corrupt"
msgstr ""
"tập tin sơ đồ chuyển giao có tổng kiểm không đúng và có vẻ như là đã hỏng"
-#: commit-graph.c:1046
+#: commit-graph.c:1153
msgid "Verifying commits in commit graph"
msgstr "Đang thẩm tra các lần chuyển giao trong đồ thị lần chuyển giao"
-#: compat/obstack.c:405 compat/obstack.c:407
+#: compat/obstack.c:406 compat/obstack.c:408
msgid "memory exhausted"
msgstr "hết bộ nhớ"
@@ -1491,7 +1570,7 @@ msgstr "khóa không chứa một phần: %s"
msgid "key does not contain variable name: %s"
msgstr "khóa không chứa bất kỳ một tên biến nào: %s"
-#: config.c:378 sequencer.c:2296
+#: config.c:378 sequencer.c:2330
#, c-format
msgid "invalid key: %s"
msgstr "khóa không đúng: %s"
@@ -1629,7 +1708,7 @@ msgstr "giá trị cho %s sai dạng: %s"
msgid "must be one of nothing, matching, simple, upstream or current"
msgstr "phải là một trong số nothing, matching, simple, upstream hay current"
-#: config.c:1481 builtin/pack-objects.c:3391
+#: config.c:1481 builtin/pack-objects.c:3394
#, c-format
msgid "bad pack compression level %d"
msgstr "mức nén gói %d không hợp lệ"
@@ -1703,62 +1782,62 @@ msgstr "%s có đa giá trị"
msgid "failed to write new configuration file %s"
msgstr "gặp lỗi khi ghi tập tin cấu hình “%s”"
-#: config.c:2717 config.c:3041
+#: config.c:2716 config.c:3040
#, c-format
msgid "could not lock config file %s"
msgstr "không thể khóa tập tin cấu hình %s"
-#: config.c:2728
+#: config.c:2727
#, c-format
msgid "opening %s"
msgstr "đang mở “%s”"
-#: config.c:2763 builtin/config.c:327
+#: config.c:2762 builtin/config.c:328
#, c-format
msgid "invalid pattern: %s"
msgstr "mẫu không hợp lệ: %s"
-#: config.c:2788
+#: config.c:2787
#, c-format
msgid "invalid config file %s"
msgstr "tập tin cấu hình “%s” không hợp lệ"
-#: config.c:2801 config.c:3054
+#: config.c:2800 config.c:3053
#, c-format
msgid "fstat on %s failed"
msgstr "fstat trên %s gặp lỗi"
-#: config.c:2812
+#: config.c:2811
#, c-format
msgid "unable to mmap '%s'"
msgstr "không thể mmap “%s”"
-#: config.c:2821 config.c:3059
+#: config.c:2820 config.c:3058
#, c-format
msgid "chmod on %s failed"
msgstr "chmod trên %s gặp lỗi"
-#: config.c:2906 config.c:3156
+#: config.c:2905 config.c:3155
#, c-format
msgid "could not write config file %s"
msgstr "không thể ghi tập tin cấu hình “%s”"
-#: config.c:2940
+#: config.c:2939
#, c-format
msgid "could not set '%s' to '%s'"
msgstr "không thể đặt “%s” thành “%s”"
-#: config.c:2942 builtin/remote.c:782
+#: config.c:2941 builtin/remote.c:782
#, c-format
msgid "could not unset '%s'"
msgstr "không thể thôi đặt “%s”"
-#: config.c:3032
+#: config.c:3031
#, c-format
msgid "invalid section name: %s"
msgstr "tên của phần không hợp lệ: %s"
-#: config.c:3199
+#: config.c:3198
#, c-format
msgid "missing value for '%s'"
msgstr "thiếu giá trị cho cho “%s”"
@@ -1811,50 +1890,45 @@ msgstr "lỗi giao thức: cần sha-1 shallow, nhưng lại nhận được “
msgid "repository on the other end cannot be shallow"
msgstr "kho đã ở điểm cuối khoác nên không thể được shallow"
-#: connect.c:310 fetch-pack.c:182 builtin/archive.c:63
-#, c-format
-msgid "remote error: %s"
-msgstr "lỗi máy chủ: %s"
-
-#: connect.c:316
+#: connect.c:313
msgid "invalid packet"
msgstr "gói không hợp lệ"
-#: connect.c:336
+#: connect.c:333
#, c-format
msgid "protocol error: unexpected '%s'"
msgstr "lỗi giao thức: không cần “%s”"
-#: connect.c:444
+#: connect.c:441
#, c-format
msgid "invalid ls-refs response: %s"
msgstr "trả về của ls-refs không hợp lệ: %s"
-#: connect.c:448
+#: connect.c:445
msgid "expected flush after ref listing"
msgstr "cần đẩy dữ liệu lên đĩa sau khi liệt kê tham chiếu"
-#: connect.c:547
+#: connect.c:544
#, c-format
msgid "protocol '%s' is not supported"
msgstr "giao thức “%s” chưa được hỗ trợ"
-#: connect.c:598
+#: connect.c:595
msgid "unable to set SO_KEEPALIVE on socket"
msgstr "không thể đặt SO_KEEPALIVE trên ổ cắm"
-#: connect.c:638 connect.c:701
+#: connect.c:635 connect.c:698
#, c-format
msgid "Looking up %s ... "
-msgstr "Đang tìm kiếm %s …"
+msgstr "Đang tìm kiếm %s … "
-#: connect.c:642
+#: connect.c:639
#, c-format
msgid "unable to look up %s (port %s) (%s)"
msgstr "không tìm được %s (cổng %s) (%s)"
#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:646 connect.c:717
+#: connect.c:643 connect.c:714
#, c-format
msgid ""
"done.\n"
@@ -1863,7 +1937,7 @@ msgstr ""
"xong.\n"
"Đang kết nối đến %s (cổng %s) … "
-#: connect.c:668 connect.c:745
+#: connect.c:665 connect.c:742
#, c-format
msgid ""
"unable to connect to %s:\n"
@@ -1873,61 +1947,61 @@ msgstr ""
"%s"
#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:674 connect.c:751
+#: connect.c:671 connect.c:748
msgid "done."
msgstr "hoàn tất."
-#: connect.c:705
+#: connect.c:702
#, c-format
msgid "unable to look up %s (%s)"
msgstr "không thể tìm thấy %s (%s)"
-#: connect.c:711
+#: connect.c:708
#, c-format
msgid "unknown port %s"
msgstr "không hiểu cổng %s"
-#: connect.c:848 connect.c:1174
+#: connect.c:845 connect.c:1171
#, c-format
msgid "strange hostname '%s' blocked"
msgstr "đã khóa tên máy lạ “%s”"
-#: connect.c:850
+#: connect.c:847
#, c-format
msgid "strange port '%s' blocked"
msgstr "đã khóa cổng lạ “%s”"
-#: connect.c:860
+#: connect.c:857
#, c-format
msgid "cannot start proxy %s"
msgstr "không thể khởi chạy ủy nhiệm “%s”"
-#: connect.c:927
+#: connect.c:924
msgid "no path specified; see 'git help pull' for valid url syntax"
msgstr "chưa chỉ định đường dẫn; xem'git help pull” để biết cú pháp url hợp lệ"
-#: connect.c:1122
+#: connect.c:1119
msgid "ssh variant 'simple' does not support -4"
msgstr "ssh biến thể “simple” không hỗ trợ -4"
-#: connect.c:1134
+#: connect.c:1131
msgid "ssh variant 'simple' does not support -6"
msgstr "ssh biến thể “simple” không hỗ trợ -6"
-#: connect.c:1151
+#: connect.c:1148
msgid "ssh variant 'simple' does not support setting port"
msgstr "ssh biến thể “simple” không hỗ trợ đặt cổng"
-#: connect.c:1262
+#: connect.c:1259
#, c-format
msgid "strange pathname '%s' blocked"
msgstr "đã khóa tên đường dẫn lạ “%s”"
-#: connect.c:1307
+#: connect.c:1304
msgid "unable to fork"
msgstr "không thể rẽ nhánh tiến trình con"
-#: connected.c:68 builtin/fsck.c:202 builtin/prune.c:147
+#: connected.c:68 builtin/fsck.c:221 builtin/prune.c:146
msgid "Checking connectivity"
msgstr "Đang kiểm tra kết nối"
@@ -1943,17 +2017,17 @@ msgstr "gặp lỗi khi ghi vào rev-list"
msgid "failed to close rev-list's stdin"
msgstr "gặp lỗi khi đóng đầu vào chuẩn stdin của rev-list"
-#: convert.c:194
+#: convert.c:193
#, c-format
msgid "illegal crlf_action %d"
msgstr "crlf_action %d không hợp lệ"
-#: convert.c:207
+#: convert.c:206
#, c-format
msgid "CRLF would be replaced by LF in %s"
msgstr "CRLF nên được thay bằng LF trong %s"
-#: convert.c:209
+#: convert.c:208
#, c-format
msgid ""
"CRLF will be replaced by LF in %s.\n"
@@ -1962,12 +2036,12 @@ msgstr ""
"CRLF sẽ bị thay thế bằng LF trong %s.\n"
"Tập tin sẽ có kiểu xuống dòng như bản gốc trong thư mục làm việc của bạn"
-#: convert.c:217
+#: convert.c:216
#, c-format
msgid "LF would be replaced by CRLF in %s"
msgstr "LF nên thay bằng CRLF trong %s"
-#: convert.c:219
+#: convert.c:218
#, c-format
msgid ""
"LF will be replaced by CRLF in %s.\n"
@@ -1976,12 +2050,12 @@ msgstr ""
"LF sẽ bị thay thế bằng CRLF trong %s.\n"
"Tập tin sẽ có kiểu xuống dòng như bản gốc trong thư mục làm việc của bạn"
-#: convert.c:280
+#: convert.c:279
#, c-format
msgid "BOM is prohibited in '%s' if encoded as %s"
msgstr "BOM bị cấm trong “%s” nếu được mã hóa là %s"
-#: convert.c:287
+#: convert.c:286
#, c-format
msgid ""
"The file '%s' contains a byte order mark (BOM). Please use UTF-%s as working-"
@@ -1990,12 +2064,12 @@ msgstr ""
"Tập tin “%s” có chứa ký hiệu thứ tự byte (BOM). Vui lòng dùng UTF-%s như là "
"bảng mã cây làm việc."
-#: convert.c:305
+#: convert.c:304
#, c-format
msgid "BOM is required in '%s' if encoded as %s"
msgstr "BOM là bắt buộc trong “%s” nếu được mã hóa là %s"
-#: convert.c:307
+#: convert.c:306
#, c-format
msgid ""
"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
@@ -2004,37 +2078,37 @@ msgstr ""
"Tập tin “%s” còn thiếu ký hiệu thứ tự byte (BOM). Vui lòng dùng UTF-%sBE hay "
"UTF-%sLE (còn phục thuộc vào thứ tự byte) như là bảng mã cây làm việc."
-#: convert.c:425 convert.c:496
+#: convert.c:424 convert.c:495
#, c-format
msgid "failed to encode '%s' from %s to %s"
msgstr "gặp lỗi khi mã hóa “%s” từ “%s” sang “%s”"
-#: convert.c:468
+#: convert.c:467
#, c-format
msgid "encoding '%s' from %s to %s and back is not the same"
msgstr "mã hóa “%s” từ %s thành %s và ngược trở lại không phải là cùng"
-#: convert.c:674
+#: convert.c:673
#, c-format
msgid "cannot fork to run external filter '%s'"
msgstr "không thể rẽ nhánh tiến trình để chạy bộ lọc bên ngoài “%s”"
-#: convert.c:694
+#: convert.c:693
#, c-format
msgid "cannot feed the input to external filter '%s'"
msgstr "không thể cấp đầu vào cho bộ lọc bên ngoài “%s”"
-#: convert.c:701
+#: convert.c:700
#, c-format
msgid "external filter '%s' failed %d"
msgstr "chạy bộ lọc bên ngoài “%s” gặp lỗi %d"
-#: convert.c:736 convert.c:739
+#: convert.c:735 convert.c:738
#, c-format
msgid "read from external filter '%s' failed"
msgstr "đọc từ bộ lọc bên ngoài “%s” gặp lỗi"
-#: convert.c:742 convert.c:796
+#: convert.c:741 convert.c:796
#, c-format
msgid "external filter '%s' failed"
msgstr "gặp lỗi khi chạy bộ lọc bên ngoài “%s”"
@@ -2058,7 +2132,7 @@ msgstr ""
#: convert.c:1228
msgid "true/false are no valid working-tree-encodings"
-msgstr "true/false là không phải bảng mã cây làm việc hợp lệ "
+msgstr "true/false là không phải bảng-mã-cây-làm-việc hợp lệ"
#: convert.c:1398 convert.c:1432
#, c-format
@@ -2070,86 +2144,86 @@ msgstr "%s: gặp lỗi khi xóa bộ lọc “%s”"
msgid "%s: smudge filter %s failed"
msgstr "%s: smudge bộ lọc %s gặp lỗi"
-#: date.c:116
+#: date.c:137
msgid "in the future"
msgstr "ở thời tương lai"
-#: date.c:122
+#: date.c:143
#, c-format
msgid "%<PRIuMAX> second ago"
msgid_plural "%<PRIuMAX> seconds ago"
msgstr[0] "%<PRIuMAX> giây trước"
-#: date.c:129
+#: date.c:150
#, c-format
msgid "%<PRIuMAX> minute ago"
msgid_plural "%<PRIuMAX> minutes ago"
msgstr[0] "%<PRIuMAX> phút trước"
-#: date.c:136
+#: date.c:157
#, c-format
msgid "%<PRIuMAX> hour ago"
msgid_plural "%<PRIuMAX> hours ago"
msgstr[0] "%<PRIuMAX> giờ trước"
-#: date.c:143
+#: date.c:164
#, c-format
msgid "%<PRIuMAX> day ago"
msgid_plural "%<PRIuMAX> days ago"
msgstr[0] "%<PRIuMAX> ngày trước"
-#: date.c:149
+#: date.c:170
#, c-format
msgid "%<PRIuMAX> week ago"
msgid_plural "%<PRIuMAX> weeks ago"
msgstr[0] "%<PRIuMAX> tuần trước"
-#: date.c:156
+#: date.c:177
#, c-format
msgid "%<PRIuMAX> month ago"
msgid_plural "%<PRIuMAX> months ago"
msgstr[0] "%<PRIuMAX> tháng trước"
-#: date.c:167
+#: date.c:188
#, c-format
msgid "%<PRIuMAX> year"
msgid_plural "%<PRIuMAX> years"
msgstr[0] "%<PRIuMAX> năm"
#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:170
+#: date.c:191
#, c-format
msgid "%s, %<PRIuMAX> month ago"
msgid_plural "%s, %<PRIuMAX> months ago"
msgstr[0] "%s, %<PRIuMAX> tháng trước"
-#: date.c:175 date.c:180
+#: date.c:196 date.c:201
#, c-format
msgid "%<PRIuMAX> year ago"
msgid_plural "%<PRIuMAX> years ago"
msgstr[0] "%<PRIuMAX> năm trước"
-#: delta-islands.c:268
+#: delta-islands.c:272
msgid "Propagating island marks"
msgstr "Đang lan truyền các đánh dấu island"
-#: delta-islands.c:286
+#: delta-islands.c:290
#, c-format
msgid "bad tree object %s"
msgstr "đối tượng cây sai “%s”"
-#: delta-islands.c:330
+#: delta-islands.c:334
#, c-format
msgid "failed to load island regex for '%s': %s"
msgstr "gặp lỗi khi tải biểu thức chính quy island cho “%s”: %s"
-#: delta-islands.c:386
+#: delta-islands.c:390
#, c-format
msgid "island regex from config has too many capture groups (max=%d)"
msgstr ""
"biểu thức chính quy island từ cấu hình có quá nhiều nhóm chụp (tối đa=%d)"
-#: delta-islands.c:462
+#: delta-islands.c:466
#, c-format
msgid "Marked %d islands, done.\n"
msgstr "Đã đánh dấu %d island, xong.\n"
@@ -2186,25 +2260,30 @@ msgstr ""
"cài đặt màu đã di chuyển phải là một trong “no”, “default”, “blocks”, "
"“zebra”, “dimmed_zebra”, “plain”"
-#: diff.c:316
+#: diff.c:319
#, c-format
-msgid "ignoring unknown color-moved-ws mode '%s'"
-msgstr "bỏ qua chế độ color-moved-ws chưa biết “%s”"
+msgid ""
+"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
+"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
+msgstr ""
+"không hiểu chế độ color-moved-ws “%s”, các giá trị có thể là “ignore-space-"
+"change”, “ignore-space-at-eol”, “ignore-all-space”, “allow-indentation-"
+"change”"
-#: diff.c:323
+#: diff.c:327
msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other white "
-"space modes"
+"color-moved-ws: allow-indentation-change cannot be combined with other "
+"whitespace modes"
msgstr ""
"color-moved-ws: allow-indentation-change không thể tổ hợp cùng với các chế "
"độ khoảng trắng khác"
-#: diff.c:394
+#: diff.c:400
#, c-format
msgid "Unknown value for 'diff.submodule' config variable: '%s'"
msgstr "Không hiểu giá trị cho biến cấu hình “diff.submodule”: “%s”"
-#: diff.c:454
+#: diff.c:460
#, c-format
msgid ""
"Found errors in 'diff.dirstat' config variable:\n"
@@ -2213,24 +2292,24 @@ msgstr ""
"Tìm thấy các lỗi trong biến cấu hình “diff.dirstat”:\n"
"%s"
-#: diff.c:4140
+#: diff.c:4211
#, c-format
msgid "external diff died, stopping at %s"
msgstr "phần mềm diff ở bên ngoài đã chết, dừng tại %s"
-#: diff.c:4482
+#: diff.c:4553
msgid "--name-only, --name-status, --check and -s are mutually exclusive"
msgstr "--name-only, --name-status, --check và -s loại từ lẫn nhau"
-#: diff.c:4485
+#: diff.c:4556
msgid "-G, -S and --find-object are mutually exclusive"
msgstr "Các tùy chọn -G, -S, và --find-object loại từ lẫn nhau"
-#: diff.c:4563
+#: diff.c:4634
msgid "--follow requires exactly one pathspec"
msgstr "--follow cần chính xác một đặc tả đường dẫn"
-#: diff.c:4729
+#: diff.c:4800
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -2239,22 +2318,22 @@ msgstr ""
"Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n"
"%s"
-#: diff.c:4743
+#: diff.c:4814
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Gặp lỗi khi phân tích đối số tùy chọn --submodule: “%s”"
-#: diff.c:5823
+#: diff.c:5900
msgid "inexact rename detection was skipped due to too many files."
msgstr ""
"nhận thấy đổi tên không chính xác đã bị bỏ qua bởi có quá nhiều tập tin."
-#: diff.c:5826
+#: diff.c:5903
msgid "only found copies from modified paths due to too many files."
msgstr ""
"chỉ tìm thấy các bản sao từ đường dẫn đã sửa đổi bởi vì có quá nhiều tập tin."
-#: diff.c:5829
+#: diff.c:5906
#, c-format
msgid ""
"you may want to set your %s variable to at least %d and retry the command."
@@ -2262,40 +2341,40 @@ msgstr ""
"bạn có lẽ muốn đặt biến %s của bạn thành ít nhất là %d và thử lại lệnh lần "
"nữa."
-#: dir.c:576
+#: dir.c:538
#, c-format
msgid "pathspec '%s' did not match any file(s) known to git"
msgstr "đặc tả đường dẫn “%s” không khớp với bất kỳ tập tin nào mà git biết"
-#: dir.c:965
+#: dir.c:927
#, c-format
msgid "cannot use %s as an exclude file"
msgstr "không thể dùng %s như là một tập tin loại trừ"
-#: dir.c:1880
+#: dir.c:1842
#, c-format
msgid "could not open directory '%s'"
msgstr "không thể mở thư mục “%s”"
-#: dir.c:2122
+#: dir.c:2084
msgid "failed to get kernel name and information"
msgstr "gặp lỗi khi lấy tên và thông tin của nhân"
-#: dir.c:2246
+#: dir.c:2208
msgid "untracked cache is disabled on this system or location"
-msgstr "bộ nhớ tạm không theo vết bị tắt trên hệ thống hay vị trí này."
+msgstr "bộ nhớ tạm không theo vết bị tắt trên hệ thống hay vị trí này"
-#: dir.c:3047
+#: dir.c:3009
#, c-format
msgid "index file corrupt in repo %s"
msgstr "tập tin ghi bảng mục lục bị hỏng trong kho %s"
-#: dir.c:3092 dir.c:3097
+#: dir.c:3054 dir.c:3059
#, c-format
msgid "could not create directories for %s"
msgstr "không thể tạo thư mục cho %s"
-#: dir.c:3126
+#: dir.c:3088
#, c-format
msgid "could not migrate git directory from '%s' to '%s'"
msgstr "không thể di cư thư mục git từ “%s” sang “%s”"
@@ -2337,235 +2416,239 @@ msgstr "Máy chủ không có địa chỉ URL"
msgid "git fetch-pack: expected shallow list"
msgstr "git fetch-pack: cần danh sách shallow"
-#: fetch-pack.c:163
+#: fetch-pack.c:154
+msgid "git fetch-pack: expected a flush packet after shallow list"
+msgstr "git fetch-pack: cần một gói đẩy sau danh sách shallow"
+
+#: fetch-pack.c:165
msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
msgstr "git fetch-pack: cần ACK/NAK, nhưng lại nhận được một gói flush"
-#: fetch-pack.c:183
+#: fetch-pack.c:185
#, c-format
msgid "git fetch-pack: expected ACK/NAK, got '%s'"
msgstr "git fetch-pack: cần ACK/NAK, nhưng lại nhận được “%s”"
-#: fetch-pack.c:253
+#: fetch-pack.c:256
msgid "--stateless-rpc requires multi_ack_detailed"
msgstr "--stateless-rpc cần multi_ack_detailed"
-#: fetch-pack.c:347 fetch-pack.c:1277
+#: fetch-pack.c:358 fetch-pack.c:1264
#, c-format
msgid "invalid shallow line: %s"
msgstr "dòng shallow không hợp lệ: %s"
-#: fetch-pack.c:353 fetch-pack.c:1283
+#: fetch-pack.c:364 fetch-pack.c:1271
#, c-format
msgid "invalid unshallow line: %s"
msgstr "dòng unshallow không hợp lệ: %s"
-#: fetch-pack.c:355 fetch-pack.c:1285
+#: fetch-pack.c:366 fetch-pack.c:1273
#, c-format
msgid "object not found: %s"
-msgstr "Không tìm thấy đối tượng: %s"
+msgstr "không tìm thấy đối tượng: %s"
-#: fetch-pack.c:358 fetch-pack.c:1288
+#: fetch-pack.c:369 fetch-pack.c:1276
#, c-format
msgid "error in object: %s"
msgstr "lỗi trong đối tượng: %s"
-#: fetch-pack.c:360 fetch-pack.c:1290
+#: fetch-pack.c:371 fetch-pack.c:1278
#, c-format
msgid "no shallow found: %s"
msgstr "không tìm shallow nào: %s"
-#: fetch-pack.c:363 fetch-pack.c:1293
+#: fetch-pack.c:374 fetch-pack.c:1282
#, c-format
msgid "expected shallow/unshallow, got %s"
msgstr "cần shallow/unshallow, nhưng lại nhận được %s"
-#: fetch-pack.c:404
+#: fetch-pack.c:415
#, c-format
msgid "got %s %d %s"
msgstr "nhận %s %d - %s"
-#: fetch-pack.c:421
+#: fetch-pack.c:432
#, c-format
msgid "invalid commit %s"
msgstr "lần chuyển giao %s không hợp lệ"
-#: fetch-pack.c:452
+#: fetch-pack.c:463
msgid "giving up"
msgstr "chịu thua"
-#: fetch-pack.c:464 progress.c:229
+#: fetch-pack.c:475 progress.c:229
msgid "done"
msgstr "xong"
-#: fetch-pack.c:476
+#: fetch-pack.c:487
#, c-format
msgid "got %s (%d) %s"
msgstr "nhận %s (%d) %s"
-#: fetch-pack.c:522
+#: fetch-pack.c:533
#, c-format
msgid "Marking %s as complete"
msgstr "Đánh dấu %s là đã hoàn thành"
-#: fetch-pack.c:764
+#: fetch-pack.c:740
#, c-format
msgid "already have %s (%s)"
msgstr "đã sẵn có %s (%s)"
-#: fetch-pack.c:803
+#: fetch-pack.c:779
msgid "fetch-pack: unable to fork off sideband demultiplexer"
msgstr "fetch-pack: không thể rẽ nhánh sideband demultiplexer"
-#: fetch-pack.c:811
+#: fetch-pack.c:787
msgid "protocol error: bad pack header"
msgstr "lỗi giao thức: phần đầu gói bị sai"
-#: fetch-pack.c:879
+#: fetch-pack.c:855
#, c-format
msgid "fetch-pack: unable to fork off %s"
msgstr "fetch-pack: không thể rẽ nhánh %s"
-#: fetch-pack.c:895
+#: fetch-pack.c:871
#, c-format
msgid "%s failed"
msgstr "%s gặp lỗi"
-#: fetch-pack.c:897
+#: fetch-pack.c:873
msgid "error in sideband demultiplexer"
msgstr "có lỗi trong sideband demultiplexer"
-#: fetch-pack.c:926
+#: fetch-pack.c:902
msgid "Server does not support shallow clients"
msgstr "Máy chủ không hỗ trợ máy khách shallow"
-#: fetch-pack.c:930
+#: fetch-pack.c:906
msgid "Server supports multi_ack_detailed"
msgstr "Máy chủ hỗ trợ multi_ack_detailed"
-#: fetch-pack.c:933
+#: fetch-pack.c:909
msgid "Server supports no-done"
msgstr "Máy chủ hỗ trợ no-done"
-#: fetch-pack.c:939
+#: fetch-pack.c:915
msgid "Server supports multi_ack"
msgstr "Máy chủ hỗ trợ multi_ack"
-#: fetch-pack.c:943
+#: fetch-pack.c:919
msgid "Server supports side-band-64k"
msgstr "Máy chủ hỗ trợ side-band-64k"
-#: fetch-pack.c:947
+#: fetch-pack.c:923
msgid "Server supports side-band"
msgstr "Máy chủ hỗ trợ side-band"
-#: fetch-pack.c:951
+#: fetch-pack.c:927
msgid "Server supports allow-tip-sha1-in-want"
msgstr "Máy chủ hỗ trợ allow-tip-sha1-in-want"
-#: fetch-pack.c:955
+#: fetch-pack.c:931
msgid "Server supports allow-reachable-sha1-in-want"
msgstr "Máy chủ hỗ trợ allow-reachable-sha1-in-want"
-#: fetch-pack.c:965
+#: fetch-pack.c:941
msgid "Server supports ofs-delta"
msgstr "Máy chủ hỗ trợ ofs-delta"
-#: fetch-pack.c:971 fetch-pack.c:1158
+#: fetch-pack.c:947 fetch-pack.c:1140
msgid "Server supports filter"
msgstr "Máy chủ hỗ trợ bộ lọc"
-#: fetch-pack.c:979
+#: fetch-pack.c:955
#, c-format
msgid "Server version is %.*s"
msgstr "Phiên bản máy chủ là %.*s"
-#: fetch-pack.c:985
+#: fetch-pack.c:961
msgid "Server does not support --shallow-since"
msgstr "Máy chủ không hỗ trợ --shallow-since"
-#: fetch-pack.c:989
+#: fetch-pack.c:965
msgid "Server does not support --shallow-exclude"
msgstr "Máy chủ không hỗ trợ --shallow-exclude"
-#: fetch-pack.c:991
+#: fetch-pack.c:967
msgid "Server does not support --deepen"
msgstr "Máy chủ không hỗ trợ --deepen"
-#: fetch-pack.c:1008
+#: fetch-pack.c:984
msgid "no common commits"
msgstr "không có lần chuyển giao chung nào"
-#: fetch-pack.c:1020 fetch-pack.c:1418
+#: fetch-pack.c:996 fetch-pack.c:1419
msgid "git fetch-pack: fetch failed."
msgstr "git fetch-pack: fetch gặp lỗi."
-#: fetch-pack.c:1153
+#: fetch-pack.c:1134
msgid "Server does not support shallow requests"
msgstr "Máy chủ không hỗ trợ yêu cầu shallow"
-#: fetch-pack.c:1199
+#: fetch-pack.c:1184
#, c-format
msgid "error reading section header '%s'"
msgstr "gặp lỗi khi đọc phần đầu của đoạn %s"
-#: fetch-pack.c:1205
+#: fetch-pack.c:1190
#, c-format
msgid "expected '%s', received '%s'"
msgstr "cần “%s”, nhưng lại nhận “%s”"
-#: fetch-pack.c:1244
+#: fetch-pack.c:1229
#, c-format
msgid "unexpected acknowledgment line: '%s'"
msgstr "gặp dòng không được thừa nhận: “%s”"
-#: fetch-pack.c:1249
+#: fetch-pack.c:1234
#, c-format
msgid "error processing acks: %d"
msgstr "gặp lỗi khi xử lý tín hiệu trả lời: %d"
-#: fetch-pack.c:1259
+#: fetch-pack.c:1244
msgid "expected packfile to be sent after 'ready'"
msgstr "cần tập tin gói để gửi sau “ready”"
-#: fetch-pack.c:1261
+#: fetch-pack.c:1246
msgid "expected no other sections to be sent after no 'ready'"
msgstr "không cần thêm phần nào để gửi sau “ready”"
-#: fetch-pack.c:1298
+#: fetch-pack.c:1287
#, c-format
msgid "error processing shallow info: %d"
msgstr "lỗi xử lý thông tin shallow: %d"
-#: fetch-pack.c:1314
+#: fetch-pack.c:1308
#, c-format
msgid "expected wanted-ref, got '%s'"
msgstr "cần wanted-ref, nhưng lại nhận được “%s”"
-#: fetch-pack.c:1324
+#: fetch-pack.c:1318
#, c-format
msgid "unexpected wanted-ref: '%s'"
msgstr "không cần wanted-ref: “%s”"
-#: fetch-pack.c:1328
+#: fetch-pack.c:1322
#, c-format
msgid "error processing wanted refs: %d"
msgstr "lỗi khi xử lý wanted refs: %d"
-#: fetch-pack.c:1642
+#: fetch-pack.c:1646
msgid "no matching remote head"
msgstr "không khớp phần đầu máy chủ"
-#: fetch-pack.c:1660 builtin/clone.c:664
+#: fetch-pack.c:1664 builtin/clone.c:671
msgid "remote did not send all necessary objects"
msgstr "máy chủ đã không gửi tất cả các đối tượng cần thiết"
-#: fetch-pack.c:1686
+#: fetch-pack.c:1690
#, c-format
msgid "no such remote ref %s"
-msgstr "Không có máy chủ tham chiếu nào như %s"
+msgstr "không có máy chủ tham chiếu nào như %s"
-#: fetch-pack.c:1689
+#: fetch-pack.c:1693
#, c-format
msgid "Server does not allow request for unadvertised object %s"
msgstr ""
@@ -2594,8 +2677,8 @@ msgstr "bỏ qua màu không hợp lệ “%.*s” trong log.graphColors"
msgid "'%s': unable to read %s"
msgstr "“%s”: không thể đọc %s"
-#: grep.c:2130 setup.c:164 builtin/clone.c:410 builtin/diff.c:81
-#: builtin/rm.c:134
+#: grep.c:2130 setup.c:164 builtin/clone.c:411 builtin/diff.c:82
+#: builtin/rm.c:135
#, c-format
msgid "failed to stat '%s'"
msgstr "gặp lỗi khi lấy thống kê về “%s”"
@@ -2657,41 +2740,41 @@ msgstr "Lệnh/Đồng bộ kho ở mức thấp"
msgid "Low-level Commands / Internal Helpers"
msgstr "Lệnh/Hỗ trợ nội tại ở mức thấp"
-#: help.c:296
+#: help.c:298
#, c-format
msgid "available git commands in '%s'"
msgstr "các lệnh git sẵn có trong thư mục “%s”:"
-#: help.c:303
+#: help.c:305
msgid "git commands available from elsewhere on your $PATH"
msgstr "các lệnh git sẵn có từ một nơi khác trong $PATH của bạn"
-#: help.c:312
+#: help.c:314
msgid "These are common Git commands used in various situations:"
msgstr "Có các lệnh Git chung được sử dụng trong các tình huống khác nhau:"
-#: help.c:361 git.c:90
+#: help.c:363 git.c:90
#, c-format
msgid "unsupported command listing type '%s'"
msgstr "không hỗ trợ liệt kê lệnh kiểu “%s”"
-#: help.c:408
+#: help.c:410
msgid "The common Git guides are:"
msgstr "Các chỉ dẫn chung về Git là:"
-#: help.c:517
+#: help.c:519
msgid "See 'git help <command>' to read about a specific subcommand"
msgstr "Xem “git help <lệnh>” để đọc các đặc tả của lệnh con"
-#: help.c:522
+#: help.c:524
msgid "External commands"
msgstr "Các lệnh bên ngoài"
-#: help.c:530
+#: help.c:539
msgid "Command aliases"
msgstr "Các bí danh lệnh"
-#: help.c:594
+#: help.c:603
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -2700,31 +2783,31 @@ msgstr ""
"“%s” trông như là một lệnh git, nhưng chúng tôi không\n"
"thể thực thi nó. Có lẽ là lệnh git-%s đã bị hỏng?"
-#: help.c:653
+#: help.c:662
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Ối chà. Hệ thống của bạn báo rằng chẳng có lệnh Git nào cả."
-#: help.c:675
+#: help.c:684
#, c-format
msgid "WARNING: You called a Git command named '%s', which does not exist."
msgstr "CẢNH BÁO: Bạn đã gọi lệnh Git có tên “%s”, mà nó lại không có sẵn."
-#: help.c:680
+#: help.c:689
#, c-format
msgid "Continuing under the assumption that you meant '%s'."
msgstr "Tiếp tục và coi rằng ý bạn là “%s”."
-#: help.c:685
+#: help.c:694
#, c-format
msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
msgstr "Tiếp tục trong %0.1f giây,và coi rằng ý bạn là “%s”."
-#: help.c:693
+#: help.c:702
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: “%s” không phải là một lệnh của git. Xem “git --help”."
-#: help.c:697
+#: help.c:706
msgid ""
"\n"
"The most similar command is"
@@ -2735,16 +2818,16 @@ msgstr[0] ""
"\n"
"Những lệnh giống nhất là"
-#: help.c:712
+#: help.c:721
msgid "git version [<options>]"
msgstr "git version [<các-tùy-chọn>]"
-#: help.c:780
+#: help.c:789
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s - %s"
-#: help.c:784
+#: help.c:793
msgid ""
"\n"
"Did you mean this?"
@@ -2809,20 +2892,20 @@ msgstr "không cho phép tên định danh là rỗng (cho <%s>)"
msgid "name consists only of disallowed characters: %s"
msgstr "tên chỉ được phép bao gồm các ký tự sau: %s"
-#: ident.c:419 builtin/commit.c:606
+#: ident.c:419 builtin/commit.c:608
#, c-format
msgid "invalid date format: %s"
msgstr "ngày tháng không hợp lệ: %s"
-#: list-objects-filter-options.c:35
+#: list-objects-filter-options.c:36
msgid "multiple filter-specs cannot be combined"
msgstr "không thể tổ hợp nhiều đặc tả kiểu lọc"
#: list-objects-filter-options.c:58
-msgid "only 'tree:0' is supported"
-msgstr "chỉ “tree:0” là được hỗ trợ"
+msgid "expected 'tree:<depth>'"
+msgstr "cần “tree:<depth>”"
-#: list-objects-filter-options.c:137
+#: list-objects-filter-options.c:152
msgid "cannot change partial clone promisor remote"
msgstr "không thể thay đổi nhân bản từng phần máy chủ promisor"
@@ -2854,98 +2937,98 @@ msgstr "Không thể tạo “%s.lock”: %s"
msgid "failed to read the cache"
msgstr "gặp lỗi khi đọc bộ nhớ đệm"
-#: merge.c:107 rerere.c:720 builtin/am.c:1899 builtin/am.c:1933
-#: builtin/checkout.c:387 builtin/checkout.c:708 builtin/clone.c:764
+#: merge.c:107 rerere.c:720 builtin/am.c:1884 builtin/am.c:1918
+#: builtin/checkout.c:416 builtin/checkout.c:745 builtin/clone.c:771
msgid "unable to write new index file"
msgstr "không thể ghi tập tin lưu bảng mục lục mới"
-#: merge-recursive.c:323
+#: merge-recursive.c:332
msgid "(bad commit)\n"
msgstr "(commit sai)\n"
-#: merge-recursive.c:345
+#: merge-recursive.c:355
#, c-format
msgid "add_cacheinfo failed for path '%s'; merge aborting."
msgstr "addinfo_cache gặp lỗi đối với đường dẫn “%s”; việc hòa trộn bị bãi bỏ."
-#: merge-recursive.c:353
+#: merge-recursive.c:364
#, c-format
msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
msgstr ""
"addinfo_cache gặp lỗi khi làm mới đối với đường dẫn “%s”; việc hòa trộn bị "
"bãi bỏ."
-#: merge-recursive.c:435
+#: merge-recursive.c:447
msgid "error building trees"
msgstr "gặp lỗi khi xây dựng cây"
-#: merge-recursive.c:906
+#: merge-recursive.c:902
#, c-format
msgid "failed to create path '%s'%s"
msgstr "gặp lỗi khi tạo đường dẫn “%s”%s"
-#: merge-recursive.c:917
+#: merge-recursive.c:913
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Gỡ bỏ %s để tạo chỗ (room) cho thư mục con\n"
-#: merge-recursive.c:931 merge-recursive.c:950
+#: merge-recursive.c:927 merge-recursive.c:946
msgid ": perhaps a D/F conflict?"
msgstr ": có lẽ là một xung đột D/F?"
-#: merge-recursive.c:940
+#: merge-recursive.c:936
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "từ chối đóng tập tin không được theo dõi tại “%s”"
-#: merge-recursive.c:982 builtin/cat-file.c:39
+#: merge-recursive.c:978 builtin/cat-file.c:40
#, c-format
msgid "cannot read object %s '%s'"
msgstr "không thể đọc đối tượng %s “%s”"
-#: merge-recursive.c:984
+#: merge-recursive.c:980
#, c-format
msgid "blob expected for %s '%s'"
msgstr "mong đợi đối tượng blob cho %s “%s”"
-#: merge-recursive.c:1008
+#: merge-recursive.c:1004
#, c-format
msgid "failed to open '%s': %s"
msgstr "gặp lỗi khi mở “%s”: %s"
-#: merge-recursive.c:1019
+#: merge-recursive.c:1015
#, c-format
msgid "failed to symlink '%s': %s"
msgstr "gặp lỗi khi tạo liên kết mềm (symlink) “%s”: %s"
-#: merge-recursive.c:1024
+#: merge-recursive.c:1020
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "không hiểu phải làm gì với %06o %s “%s”"
-#: merge-recursive.c:1212
+#: merge-recursive.c:1211
#, c-format
msgid "Failed to merge submodule %s (not checked out)"
msgstr "Gặp lỗi khi hòa trộn mô-đun-con “%s” (không lấy ra được)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1218
#, c-format
msgid "Failed to merge submodule %s (commits not present)"
msgstr "Gặp lỗi khi hòa trộn mô-đun-con “%s” (lần chuyển giao không hiện diện)"
-#: merge-recursive.c:1226
+#: merge-recursive.c:1225
#, c-format
msgid "Failed to merge submodule %s (commits don't follow merge-base)"
msgstr ""
"Gặp lỗi khi hòa trộn mô-đun-con “%s” (lần chuyển giao không theo sau nền-hòa-"
"trộn)"
-#: merge-recursive.c:1234 merge-recursive.c:1246
+#: merge-recursive.c:1233 merge-recursive.c:1245
#, c-format
msgid "Fast-forwarding submodule %s to the following commit:"
msgstr "Chuyển-tiếp-nhanh mô-đun-con “%s” đến lần chuyển giao sau đây:"
-#: merge-recursive.c:1237 merge-recursive.c:1249
+#: merge-recursive.c:1236 merge-recursive.c:1248
#, c-format
msgid "Fast-forwarding submodule %s"
msgstr "Chuyển-tiếp-nhanh mô-đun-con “%s”"
@@ -2988,28 +3071,28 @@ msgstr ""
msgid "Failed to merge submodule %s (multiple merges found)"
msgstr "Gặp lỗi khi hòa trộn mô-đun-con “%s” (thấy nhiều hòa trộn đa trùng)"
-#: merge-recursive.c:1358
+#: merge-recursive.c:1361
msgid "Failed to execute internal merge"
msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
-#: merge-recursive.c:1363
+#: merge-recursive.c:1366
#, c-format
msgid "Unable to add %s to database"
msgstr "Không thể thêm %s vào cơ sở dữ liệu"
-#: merge-recursive.c:1395
+#: merge-recursive.c:1398
#, c-format
msgid "Auto-merging %s"
msgstr "Tự-động-hòa-trộn %s"
-#: merge-recursive.c:1416
+#: merge-recursive.c:1419
#, c-format
msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
msgstr ""
"Lỗi: từ chối đóng tập tin không được theo dõi tại “%s”; thay vào đó ghi vào "
"%s."
-#: merge-recursive.c:1483
+#: merge-recursive.c:1486
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -3018,7 +3101,7 @@ msgstr ""
"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
"còn lại trong cây (tree)."
-#: merge-recursive.c:1488
+#: merge-recursive.c:1491
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -3027,7 +3110,7 @@ msgstr ""
"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s đến %s trong %s. Phiên bản %s "
"của %s còn lại trong cây (tree)."
-#: merge-recursive.c:1495
+#: merge-recursive.c:1498
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -3036,7 +3119,7 @@ msgstr ""
"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
"còn lại trong cây (tree) tại %s."
-#: merge-recursive.c:1500
+#: merge-recursive.c:1503
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
@@ -3045,33 +3128,45 @@ msgstr ""
"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s đến %s trong %s. Phiên bản %s "
"của %s còn lại trong cây (tree) tại %s."
-#: merge-recursive.c:1534
+#: merge-recursive.c:1537
msgid "rename"
msgstr "đổi tên"
-#: merge-recursive.c:1534
+#: merge-recursive.c:1537
msgid "renamed"
msgstr "đã đổi tên"
-#: merge-recursive.c:1588 merge-recursive.c:1737 merge-recursive.c:2369
-#: merge-recursive.c:3124
+#: merge-recursive.c:1633 merge-recursive.c:2481 merge-recursive.c:3213
#, c-format
msgid "Refusing to lose dirty file at %s"
msgstr "Từ chối đóng tập tin không được theo dõi tại “%s”"
-#: merge-recursive.c:1602
+#: merge-recursive.c:1643
+#, c-format
+msgid "Refusing to lose untracked file at %s, even though it's in the way."
+msgstr ""
+"Từ chối đóng tập tin không được theo dõi tại “%s”, ngay cả khi nó ở trên "
+"đường."
+
+#: merge-recursive.c:1706
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. Added %s in %s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/thêm): Đổi tên %s->%s trong %s. %s được thêm trong %s"
+
+#: merge-recursive.c:1734
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
-#: merge-recursive.c:1607
+#: merge-recursive.c:1739
#, c-format
msgid "Refusing to lose untracked file at %s; adding as %s instead"
msgstr ""
"Từ chối đóng tập tin không được theo dõi tại “%s”; thay vào đó đang thêm "
"thành %s"
-#: merge-recursive.c:1633
+#: merge-recursive.c:1759
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -3080,29 +3175,17 @@ msgstr ""
"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
"tên \"%s\"->\"%s\" trong \"%s\"%s"
-#: merge-recursive.c:1638
+#: merge-recursive.c:1764
msgid " (left unresolved)"
msgstr " (cần giải quyết)"
-#: merge-recursive.c:1699
+#: merge-recursive.c:1868
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
-#: merge-recursive.c:1734
-#, c-format
-msgid "Renaming %s to %s and %s to %s instead"
-msgstr "Đang đổi tên %s thành %s thay vì %s thành %s"
-
-#: merge-recursive.c:1746
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-"Từ chối đóng tập tin không được theo dõi tại “%s”, ngay cả khi nó ở trên "
-"đường."
-
-#: merge-recursive.c:1952
+#: merge-recursive.c:2064
#, c-format
msgid ""
"CONFLICT (directory rename split): Unclear where to place %s because "
@@ -3113,7 +3196,7 @@ msgstr ""
"vì thư mục %s đã bị đổi tên thành nhiều thư mục khác, với không đích đến "
"nhận một phần nhiều của các tập tin."
-#: merge-recursive.c:1984
+#: merge-recursive.c:2096
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
@@ -3122,16 +3205,16 @@ msgstr ""
"XUNG ĐỘT: (ngầm đổi tên thư mục): Tập tin/thư mục đã sẵn có tại %s theo cách "
"của các đổi tên thư mục ngầm đặt (các) đường dẫn sau ở đây: %s."
-#: merge-recursive.c:1994
+#: merge-recursive.c:2106
#, c-format
msgid ""
"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
"implicit directory renames tried to put these paths there: %s"
msgstr ""
"XUNG ĐỘT: (ngầm đổi tên thư mục): Không thể ánh xạ một đường dẫn thành %s; "
-"các đổi tên thư mục ngầm cố đặt các đường dẫn ở đây: %s."
+"các đổi tên thư mục ngầm cố đặt các đường dẫn ở đây: %s"
-#: merge-recursive.c:2086
+#: merge-recursive.c:2198
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
@@ -3140,7 +3223,7 @@ msgstr ""
"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên thư mục %s->%s trong %s. Đổi tên thư mục "
"%s->%s trong %s"
-#: merge-recursive.c:2331
+#: merge-recursive.c:2443
#, c-format
msgid ""
"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
@@ -3149,88 +3232,82 @@ msgstr ""
"CẢNH BÁO: tránh áp dụng %s -> %s đổi thên thành %s, bởi vì bản thân %s cũng "
"bị đổi tên."
-#: merge-recursive.c:2737
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr ""
-"XUNG ĐỘT (đổi-tên/thêm): Đổi tên %s->%s trong %s. %s được thêm vào trong %s"
-
-#: merge-recursive.c:2763
-#, c-format
-msgid "Adding merged %s"
-msgstr "Thêm hòa trộn %s"
-
-#: merge-recursive.c:2770 merge-recursive.c:3127
-#, c-format
-msgid "Adding as %s instead"
-msgstr "Thay vào đó thêm vào %s"
-
-#: merge-recursive.c:2934
+#: merge-recursive.c:3022
#, c-format
msgid "cannot read object %s"
msgstr "không thể đọc đối tượng %s"
-#: merge-recursive.c:2937
+#: merge-recursive.c:3025
#, c-format
msgid "object %s is not a blob"
msgstr "đối tượng %s không phải là một blob"
-#: merge-recursive.c:3006
+#: merge-recursive.c:3094
msgid "modify"
msgstr "sửa đổi"
-#: merge-recursive.c:3006
+#: merge-recursive.c:3094
msgid "modified"
msgstr "đã sửa"
-#: merge-recursive.c:3017
+#: merge-recursive.c:3105
msgid "content"
msgstr "nội dung"
-#: merge-recursive.c:3024
+#: merge-recursive.c:3112
msgid "add/add"
msgstr "thêm/thêm"
-#: merge-recursive.c:3071
+#: merge-recursive.c:3160
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Đã bỏ qua %s (đã có sẵn lần hòa trộn này)"
-#: merge-recursive.c:3093 git-submodule.sh:858
+#: merge-recursive.c:3182 git-submodule.sh:861
msgid "submodule"
msgstr "mô-đun-con"
-#: merge-recursive.c:3094
+#: merge-recursive.c:3183
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
#: merge-recursive.c:3216
#, c-format
+msgid "Adding as %s instead"
+msgstr "Thay vào đó thêm vào %s"
+
+#: merge-recursive.c:3319
+#, c-format
msgid "Removing %s"
msgstr "Đang xóa %s"
-#: merge-recursive.c:3242
+#: merge-recursive.c:3345
msgid "file/directory"
msgstr "tập-tin/thư-mục"
-#: merge-recursive.c:3248
+#: merge-recursive.c:3351
msgid "directory/file"
msgstr "thư-mục/tập-tin"
-#: merge-recursive.c:3255
+#: merge-recursive.c:3358
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là "
"%s"
-#: merge-recursive.c:3264
+#: merge-recursive.c:3367
#, c-format
msgid "Adding %s"
msgstr "Thêm \"%s\""
-#: merge-recursive.c:3300
+#: merge-recursive.c:3376
+#, c-format
+msgid "CONFLICT (add/add): Merge conflict in %s"
+msgstr "XUNG ĐỘT (thêm/thêm): Xung đột hòa trộn trong %s"
+
+#: merge-recursive.c:3417
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -3240,37 +3317,37 @@ msgstr ""
"hòa trộn:\n"
" %s"
-#: merge-recursive.c:3311
+#: merge-recursive.c:3428
msgid "Already up to date!"
msgstr "Đã cập nhật rồi!"
-#: merge-recursive.c:3320
+#: merge-recursive.c:3437
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "hòa trộn các cây %s và %s gặp lỗi"
-#: merge-recursive.c:3419
+#: merge-recursive.c:3536
msgid "Merging:"
msgstr "Đang trộn:"
-#: merge-recursive.c:3432
+#: merge-recursive.c:3549
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "tìm thấy %u tổ tiên chung:"
-#: merge-recursive.c:3471
+#: merge-recursive.c:3588
msgid "merge returned no commit"
msgstr "hòa trộn không trả về lần chuyển giao nào"
-#: merge-recursive.c:3537
+#: merge-recursive.c:3654
#, c-format
msgid "Could not parse object '%s'"
msgstr "Không thể phân tích đối tượng “%s”"
-#: merge-recursive.c:3553 builtin/merge.c:691 builtin/merge.c:849
+#: merge-recursive.c:3670 builtin/merge.c:692 builtin/merge.c:850
msgid "Unable to write index."
-msgstr "Không thể ghi bảng mục lục"
+msgstr "Không thể ghi bảng mục lục."
#: midx.c:65
#, c-format
@@ -3385,22 +3462,22 @@ msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
msgstr ""
"khoảng bù đối tượng không đúng cho oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-#: name-hash.c:532
+#: name-hash.c:531
#, c-format
msgid "unable to create lazy_dir thread: %s"
msgstr "không thể tạo tuyến lazy_dir: %s"
-#: name-hash.c:554
+#: name-hash.c:553
#, c-format
msgid "unable to create lazy_name thread: %s"
msgstr "không thể tạo tuyến lazy_name: %s"
-#: name-hash.c:560
+#: name-hash.c:559
#, c-format
msgid "unable to join lazy_name thread: %s"
msgstr "không thể gia nhập tuyến lazy_name: %s"
-#: notes-merge.c:275
+#: notes-merge.c:277
#, c-format
msgid ""
"You have not concluded your previous notes merge (%s exists).\n"
@@ -3412,23 +3489,23 @@ msgstr ""
"chuyển giao hay bãi bỏ lần hòa trộn trước đây và bắt đầu một hòa trộn ghi "
"chú mới."
-#: notes-merge.c:282
+#: notes-merge.c:284
#, c-format
msgid "You have not concluded your notes merge (%s exists)."
msgstr "Bạn chưa kết thúc việc hòa trộn ghi chú (%s vẫn tồn tại)."
-#: notes-utils.c:45
+#: notes-utils.c:46
msgid "Cannot commit uninitialized/unreferenced notes tree"
msgstr ""
"Không thể chuyển giao cây ghi chú chưa được khởi tạo hoặc không được tham "
"chiếu"
-#: notes-utils.c:104
+#: notes-utils.c:105
#, c-format
msgid "Bad notes.rewriteMode value: '%s'"
msgstr "Giá trị notes.rewriteMode sai: “%s”"
-#: notes-utils.c:114
+#: notes-utils.c:115
#, c-format
msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
@@ -3437,7 +3514,7 @@ msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
#. the environment variable, the second %s is
#. its value.
#.
-#: notes-utils.c:144
+#: notes-utils.c:145
#, c-format
msgid "Bad %s value: '%s'"
msgstr "Giá trị %s sai: “%s”"
@@ -3447,46 +3524,106 @@ msgstr "Giá trị %s sai: “%s”"
msgid "invalid object type \"%s\""
msgstr "kiểu đối tượng \"%s\" không hợp lệ"
-#: object.c:173
+#: object.c:174
#, c-format
msgid "object %s is a %s, not a %s"
msgstr "đối tượng %s là một %s, không phải là một %s"
-#: object.c:233
+#: object.c:234
#, c-format
msgid "object %s has unknown type id %d"
msgstr "đối tượng %s có mã kiểu %d chưa biết"
-#: object.c:246
+#: object.c:247
#, c-format
msgid "unable to parse object: %s"
msgstr "không thể phân tích đối tượng: “%s”"
-#: object.c:266 object.c:277
+#: object.c:267 object.c:278
#, c-format
-msgid "sha1 mismatch %s"
-msgstr "sha1 không khớp %s"
+msgid "hash mismatch %s"
+msgstr "mã băm không khớp %s"
#: packfile.c:607
msgid "offset before end of packfile (broken .idx?)"
msgstr "vị trí tương đối trước điểm kết thúc của tập tin gói (.idx hỏng à?)"
-#: packfile.c:1864
+#: packfile.c:1870
#, c-format
msgid "offset before start of pack index for %s (corrupt index?)"
msgstr "vị trí tương đối nằm trước chỉ mục gói cho %s (mục lục bị hỏng à?)"
-#: packfile.c:1868
+#: packfile.c:1874
#, c-format
msgid "offset beyond end of pack index for %s (truncated index?)"
msgstr ""
"vị trí tương đối vượt quá cuối của chỉ mục gói cho %s (mục lục bị cắt cụt à?)"
-#: parse-options.c:672
+#: parse-options.c:35
+#, c-format
+msgid "%s requires a value"
+msgstr "“%s” yêu cầu một giá trị"
+
+#: parse-options.c:69
+#, c-format
+msgid "%s is incompatible with %s"
+msgstr "%s là xung khắc với %s"
+
+#: parse-options.c:74
+#, c-format
+msgid "%s : incompatible with something else"
+msgstr "%s : xung khắc với các cái khác"
+
+#: parse-options.c:88 parse-options.c:92 parse-options.c:260
+#, c-format
+msgid "%s takes no value"
+msgstr "%s k nhận giá trị"
+
+#: parse-options.c:90
+#, c-format
+msgid "%s isn't available"
+msgstr "%s không sẵn có"
+
+#: parse-options.c:178
+#, c-format
+msgid "%s expects a numerical value"
+msgstr "tùy chọn “%s” cần một giá trị bằng số"
+
+#: parse-options.c:194
+#, c-format
+msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
+msgstr "%s cần một giá trị dạng số không âm với một hậu tố tùy chọn k/m/g"
+
+#: parse-options.c:322
+#, c-format
+msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
+msgstr "tùy chọn chưa rõ rang: %s (nên là --%s%s hay --%s%s)"
+
+#: parse-options.c:356 parse-options.c:364
+#, c-format
+msgid "did you mean `--%s` (with two dashes ?)"
+msgstr "có phải ý bạn là “--%s“ (với hai dấu gạch ngang?)"
+
+#: parse-options.c:649
+#, c-format
+msgid "unknown option `%s'"
+msgstr "không hiểu tùy chọn “%s”"
+
+#: parse-options.c:651
+#, c-format
+msgid "unknown switch `%c'"
+msgstr "không hiểu tùy chọn “%c”"
+
+#: parse-options.c:653
+#, c-format
+msgid "unknown non-ascii option in string: `%s'"
+msgstr "không hiểu tùy chọn non-ascii trong chuỗi: “%s”"
+
+#: parse-options.c:675
msgid "..."
msgstr "…"
-#: parse-options.c:691
+#: parse-options.c:694
#, c-format
msgid "usage: %s"
msgstr "cách dùng: %s"
@@ -3494,26 +3631,36 @@ msgstr "cách dùng: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation.
#.
-#: parse-options.c:697
+#: parse-options.c:700
#, c-format
msgid " or: %s"
msgstr " hoặc: %s"
-#: parse-options.c:700
+#: parse-options.c:703
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:739
+#: parse-options.c:742
msgid "-NUM"
msgstr "-SỐ"
-#: parse-options-cb.c:37
+#: parse-options-cb.c:21
+#, c-format
+msgid "option `%s' expects a numerical value"
+msgstr "tùy chọn “%s” cần một giá trị bằng số"
+
+#: parse-options-cb.c:38
#, c-format
msgid "malformed expiration date '%s'"
msgstr "ngày tháng hết hạn dị hình “%s”"
-#: parse-options-cb.c:109
+#: parse-options-cb.c:51
+#, c-format
+msgid "option `%s' expects \"always\", \"auto\", or \"never\""
+msgstr "tùy chọn “%s” cần \"always\", \"auto\", hoặc \"never\""
+
+#: parse-options-cb.c:110
#, c-format
msgid "malformed object name '%s'"
msgstr "tên đối tượng dị hình “%s”"
@@ -3523,30 +3670,30 @@ msgstr "tên đối tượng dị hình “%s”"
msgid "Could not make %s writable by group"
msgstr "Không thể làm %s được ghi bởi nhóm"
-#: pathspec.c:129
+#: pathspec.c:128
msgid "Escape character '\\' not allowed as last character in attr value"
msgstr ""
"Ký tự thoát chuỗi “\\” không được phép là ký tự cuối trong giá trị thuộc tính"
-#: pathspec.c:147
+#: pathspec.c:146
msgid "Only one 'attr:' specification is allowed."
-msgstr "chỉ có một đặc tả “attr:” là được phép."
+msgstr "Chỉ có một đặc tả “attr:” là được phép."
-#: pathspec.c:150
+#: pathspec.c:149
msgid "attr spec must not be empty"
msgstr "đặc tả attr phải không được để trống"
-#: pathspec.c:193
+#: pathspec.c:192
#, c-format
msgid "invalid attribute name %s"
msgstr "tên thuộc tính không hợp lệ %s"
-#: pathspec.c:258
+#: pathspec.c:257
msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
msgstr ""
"các cài đặt đặc tả đường dẫn “glob” và “noglob” toàn cục là xung khắc nhau"
-#: pathspec.c:265
+#: pathspec.c:264
msgid ""
"global 'literal' pathspec setting is incompatible with all other global "
"pathspec settings"
@@ -3554,46 +3701,46 @@ msgstr ""
"cài đặt đặc tả đường dẫn “literal” toàn cục là xung khắc với các cài đặt đặc "
"tả đường dẫn toàn cục khác"
-#: pathspec.c:305
+#: pathspec.c:304
msgid "invalid parameter for pathspec magic 'prefix'"
msgstr "tham số không hợp lệ cho “tiền tố” màu nhiệm đặc tả đường đẫn"
-#: pathspec.c:326
+#: pathspec.c:325
#, c-format
msgid "Invalid pathspec magic '%.*s' in '%s'"
msgstr "Số màu nhiệm đặc tả đường dẫn không hợp lệ “%.*s” trong “%s”"
-#: pathspec.c:331
+#: pathspec.c:330
#, c-format
msgid "Missing ')' at the end of pathspec magic in '%s'"
msgstr "Thiếu “)” tại cuối của số màu nhiệm đặc tả đường dẫn trong “%s”"
-#: pathspec.c:369
+#: pathspec.c:368
#, c-format
msgid "Unimplemented pathspec magic '%c' in '%s'"
msgstr "Chưa viết mã cho số màu nhiệm đặc tả đường dẫn “%c” trong “%s”"
-#: pathspec.c:428
+#: pathspec.c:427
#, c-format
msgid "%s: 'literal' and 'glob' are incompatible"
msgstr "%s: “literal” và “glob” xung khắc nhau"
-#: pathspec.c:441
+#: pathspec.c:440
#, c-format
msgid "%s: '%s' is outside repository"
msgstr "%s: “%s” ngoài một kho chứa"
-#: pathspec.c:515
+#: pathspec.c:514
#, c-format
msgid "'%s' (mnemonic: '%c')"
msgstr "“%s” (mnemonic: “%c”)"
-#: pathspec.c:525
+#: pathspec.c:524
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
msgstr "%s: số mầu nhiệm đặc tả đường dẫn chưa được hỗ trợ bởi lệnh này: %s"
-#: pathspec.c:592
+#: pathspec.c:591
#, c-format
msgid "pathspec '%s' is beyond a symbolic link"
msgstr "đặc tả đường dẫn “%s” vượt ra ngoài liên kết mềm"
@@ -3602,50 +3749,55 @@ msgstr "đặc tả đường dẫn “%s” vượt ra ngoài liên kết mềm
msgid "flush packet write failed"
msgstr "gặp lỗi khi ghi vào tập tin gói lúc đẩy dữ liệu lên bộ nhớ"
-#: pkt-line.c:142 pkt-line.c:228
+#: pkt-line.c:144 pkt-line.c:230
msgid "protocol error: impossibly long line"
msgstr "lỗi giao thức: không thể làm được dòng dài"
-#: pkt-line.c:158 pkt-line.c:160
+#: pkt-line.c:160 pkt-line.c:162
msgid "packet write with format failed"
msgstr "gặp lỗi khi ghi gói có định dạng"
-#: pkt-line.c:192
+#: pkt-line.c:194
msgid "packet write failed - data exceeds max packet size"
msgstr "gặp lỗi khi ghi gói - dữ liệu vượt quá cỡ vói tối đa"
-#: pkt-line.c:199 pkt-line.c:206
+#: pkt-line.c:201 pkt-line.c:208
msgid "packet write failed"
msgstr "gặp lỗi khi ghi gói"
-#: pkt-line.c:291
+#: pkt-line.c:293
msgid "read error"
msgstr "lỗi đọc"
-#: pkt-line.c:299
+#: pkt-line.c:301
msgid "the remote end hung up unexpectedly"
msgstr "máy chủ bị treo bất ngờ"
-#: pkt-line.c:327
+#: pkt-line.c:329
#, c-format
msgid "protocol error: bad line length character: %.4s"
msgstr "lỗi giao thức: ký tự chiều dài dòng bị sai: %.4s"
-#: pkt-line.c:337 pkt-line.c:342
+#: pkt-line.c:339 pkt-line.c:344
#, c-format
msgid "protocol error: bad line length %d"
msgstr "lỗi giao thức: chiều dài dòng bị sai %d"
-#: preload-index.c:118
+#: pkt-line.c:353
+#, c-format
+msgid "remote error: %s"
+msgstr "lỗi máy chủ: %s"
+
+#: preload-index.c:119
msgid "Refreshing index"
msgstr "Làm mới bảng mục lục"
-#: preload-index.c:137
+#: preload-index.c:138
#, c-format
msgid "unable to create threaded lstat: %s"
msgstr "không thể tạo tuyến trình lstat: %s"
-#: pretty.c:962
+#: pretty.c:963
msgid "unable to parse --pretty format"
msgstr "không thể phân tích định dạng --pretty"
@@ -3657,7 +3809,7 @@ msgstr "không thể lấy thông tin thống kê về “log“"
msgid "could not read `log` output"
msgstr "không thể đọc kết xuất “log”"
-#: range-diff.c:74 sequencer.c:4764
+#: range-diff.c:74 sequencer.c:4828
#, c-format
msgid "could not parse commit '%s'"
msgstr "không thể phân tích lần chuyển giao “%s”"
@@ -3671,11 +3823,47 @@ msgstr "gặp lỗi khi tạo khác biệt"
msgid "could not parse log for '%s'"
msgstr "không thể phân tích nhật ký cho “%s”"
-#: read-cache.c:1490
+#: read-cache.c:673
+#, c-format
+msgid "will not add file alias '%s' ('%s' already exists in index)"
+msgstr ""
+"sẽ không thêm các bí danh “%s” (“%s” đã có từ trước trong bảng mục lục)"
+
+#: read-cache.c:689
+msgid "cannot create an empty blob in the object database"
+msgstr "không thể tạo một blob rỗng trong cơ sở dữ liệu đối tượng"
+
+#: read-cache.c:710
+#, c-format
+msgid "%s: can only add regular files, symbolic links or git-directories"
+msgstr ""
+"%s: chỉ có thể thêm tập tin thông thường, liên kết mềm hoặc git-directories"
+
+#: read-cache.c:765
+#, c-format
+msgid "unable to index file '%s'"
+msgstr "không thể đánh mục lục tập tin “%s”"
+
+#: read-cache.c:784
+#, c-format
+msgid "unable to add '%s' to index"
+msgstr "không thể thêm %s vào bảng mục lục"
+
+#: read-cache.c:795
+#, c-format
+msgid "unable to stat '%s'"
+msgstr "không thể lấy thống kê “%s”"
+
+#: read-cache.c:1304
+#, c-format
+msgid "'%s' appears as both a file and as a directory"
+msgstr "%s có vẻ không phải là tập tin và cũng chẳng phải là một thư mục"
+
+#: read-cache.c:1489
msgid "Refresh index"
msgstr "Làm tươi mới bảng mục lục"
-#: read-cache.c:1604
+#: read-cache.c:1603
#, c-format
msgid ""
"index.version set, but the value is invalid.\n"
@@ -3684,7 +3872,7 @@ msgstr ""
"index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
"Dùng phiên bản %i"
-#: read-cache.c:1614
+#: read-cache.c:1613
#, c-format
msgid ""
"GIT_INDEX_VERSION set, but the value is invalid.\n"
@@ -3693,59 +3881,143 @@ msgstr ""
"GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
"Dùng phiên bản %i"
-#: read-cache.c:1792
+#: read-cache.c:1684
+#, c-format
+msgid "bad signature 0x%08x"
+msgstr "chữ ký sai 0x%08x"
+
+#: read-cache.c:1687
+#, c-format
+msgid "bad index version %d"
+msgstr "phiên bản mục lục sai %d"
+
+#: read-cache.c:1696
+msgid "bad index file sha1 signature"
+msgstr "chữ ký dạng sha1 cho tập tin mục lục không đúng"
+
+#: read-cache.c:1726
+#, c-format
+msgid "index uses %.4s extension, which we do not understand"
+msgstr "mục lục dùng phần mở rộng %.4s, cái mà chúng tôi không hiểu được"
+
+#: read-cache.c:1728
+#, c-format
+msgid "ignoring %.4s extension"
+msgstr "đang lờ đi phần mở rộng %.4s"
+
+#: read-cache.c:1765
+#, c-format
+msgid "unknown index entry format 0x%08x"
+msgstr "không hiểu định dạng mục lục 0x%08x"
+
+#: read-cache.c:1781
#, c-format
msgid "malformed name field in the index, near path '%s'"
msgstr "trường tên sai sạng trong mục lục, gần đường dẫn “%s”"
-#: read-cache.c:1960 rerere.c:565 rerere.c:599 rerere.c:1111 builtin/add.c:458
-#: builtin/check-ignore.c:177 builtin/checkout.c:289 builtin/checkout.c:585
-#: builtin/checkout.c:953 builtin/clean.c:954 builtin/commit.c:343
-#: builtin/diff-tree.c:115 builtin/grep.c:489 builtin/mv.c:144
-#: builtin/reset.c:244 builtin/rm.c:270 builtin/submodule--helper.c:329
+#: read-cache.c:1836
+msgid "unordered stage entries in index"
+msgstr "các mục tin stage không đúng thứ tự trong mục lục"
+
+#: read-cache.c:1839
+#, c-format
+msgid "multiple stage entries for merged file '%s'"
+msgstr "nhiều mục stage cho tập tin hòa trộn “%s”"
+
+#: read-cache.c:1842
+#, c-format
+msgid "unordered stage entries for '%s'"
+msgstr "các mục tin stage không đúng thứ tự cho “%s”"
+
+#: read-cache.c:1949 read-cache.c:2227 rerere.c:565 rerere.c:599 rerere.c:1111
+#: builtin/add.c:459 builtin/check-ignore.c:178 builtin/checkout.c:294
+#: builtin/checkout.c:622 builtin/checkout.c:991 builtin/clean.c:955
+#: builtin/commit.c:344 builtin/diff-tree.c:116 builtin/grep.c:498
+#: builtin/mv.c:145 builtin/reset.c:245 builtin/rm.c:271
+#: builtin/submodule--helper.c:330
msgid "index file corrupt"
msgstr "tập tin ghi bảng mục lục bị hỏng"
-#: read-cache.c:2101
+#: read-cache.c:2090
#, c-format
msgid "unable to create load_cache_entries thread: %s"
msgstr "không thể tạo tuyến load_cache_entries: %s"
-#: read-cache.c:2114
+#: read-cache.c:2103
#, c-format
msgid "unable to join load_cache_entries thread: %s"
msgstr "không thể gia nhập tuyến load_cache_entries: %s"
-#: read-cache.c:2201
+#: read-cache.c:2136
+#, c-format
+msgid "%s: index file open failed"
+msgstr "%s: mở tập tin mục lục gặp lỗi"
+
+#: read-cache.c:2140
+#, c-format
+msgid "%s: cannot stat the open index"
+msgstr "%s: không thể lấy thống kê bảng mục lục đã mở"
+
+#: read-cache.c:2144
+#, c-format
+msgid "%s: index file smaller than expected"
+msgstr "%s: tập tin mục lục nhỏ hơn mong đợi"
+
+#: read-cache.c:2148
+#, c-format
+msgid "%s: unable to map index file"
+msgstr "%s: không thể ánh xạ tập tin mục lục"
+
+#: read-cache.c:2190
#, c-format
msgid "unable to create load_index_extensions thread: %s"
msgstr "không thể tạo tuyến load_index_extensions: %s"
-#: read-cache.c:2228
+#: read-cache.c:2217
#, c-format
msgid "unable to join load_index_extensions thread: %s"
msgstr "không thể gia nhập tuyến load_index_extensions: %s"
-#: read-cache.c:2982 sequencer.c:4727 wrapper.c:658 builtin/merge.c:1086
+#: read-cache.c:2239
+#, c-format
+msgid "could not freshen shared index '%s'"
+msgstr "không thể làm tươi mới mục lục đã chia sẻ “%s”"
+
+#: read-cache.c:2274
+#, c-format
+msgid "broken index, expect %s in %s, got %s"
+msgstr "mục lục bị hỏng, cần %s trong %s, nhưng lại nhận được %s"
+
+#: read-cache.c:2971 sequencer.c:4791 wrapper.c:658 builtin/merge.c:1087
#, c-format
msgid "could not close '%s'"
msgstr "không thể đóng “%s”"
-#: read-cache.c:3055 sequencer.c:2203 sequencer.c:3592
+#: read-cache.c:3044 sequencer.c:2237 sequencer.c:3647
#, c-format
msgid "could not stat '%s'"
msgstr "không thể lấy thông tin thống kê về “%s”"
-#: read-cache.c:3068
+#: read-cache.c:3057
#, c-format
msgid "unable to open git dir: %s"
msgstr "không thể mở thư mục git: %s"
-#: read-cache.c:3080
+#: read-cache.c:3069
#, c-format
msgid "unable to unlink: %s"
msgstr "không thể bỏ liên kết (unlink): “%s”"
+#: read-cache.c:3088
+#, c-format
+msgid "cannot fix permission bits on '%s'"
+msgstr "không thể sửa các bít phân quyền trên “%s”"
+
+#: read-cache.c:3237
+#, c-format
+msgid "%s: cannot drop to stage #0"
+msgstr "%s: không thể xóa bỏ stage #0"
+
#: rebase-interactive.c:10
msgid ""
"\n"
@@ -3837,8 +4109,8 @@ msgstr ""
msgid "Note that empty commits are commented out"
msgstr "Chú ý rằng lần chuyển giao trống rỗng là ghi chú"
-#: rebase-interactive.c:62 rebase-interactive.c:75 sequencer.c:2186
-#: sequencer.c:4505 sequencer.c:4561 sequencer.c:4836
+#: rebase-interactive.c:62 rebase-interactive.c:75 sequencer.c:2219
+#: sequencer.c:4569 sequencer.c:4625 sequencer.c:4900
#, c-format
msgid "could not read '%s'."
msgstr "không thể đọc “%s”."
@@ -3853,7 +4125,7 @@ msgstr "“%s” không chỉ đến một lần chuyển giao hợp lệ nào c
msgid "ignoring dangling symref %s"
msgstr "đang lờ đi tham chiếu mềm thừa %s"
-#: refs.c:585 ref-filter.c:1951
+#: refs.c:585 ref-filter.c:1976
#, c-format
msgid "ignoring broken ref %s"
msgstr "đang lờ đi tham chiếu hỏng %s"
@@ -3878,15 +4150,15 @@ msgstr "tham chiếu “%s” đã có từ trước rồi"
msgid "unexpected object ID when writing '%s'"
msgstr "không cần ID đối tượng khi ghi “%s”"
-#: refs.c:740 sequencer.c:394 sequencer.c:2510 sequencer.c:2636
-#: sequencer.c:2650 sequencer.c:2877 sequencer.c:4725 sequencer.c:4788
+#: refs.c:740 sequencer.c:396 sequencer.c:2549 sequencer.c:2675
+#: sequencer.c:2689 sequencer.c:2923 sequencer.c:4789 sequencer.c:4852
#: wrapper.c:656
#, c-format
msgid "could not write to '%s'"
msgstr "không thể ghi vào “%s”"
-#: refs.c:767 sequencer.c:4723 sequencer.c:4782 wrapper.c:225 wrapper.c:395
-#: builtin/am.c:728
+#: refs.c:767 sequencer.c:4787 sequencer.c:4846 wrapper.c:225 wrapper.c:395
+#: builtin/am.c:713 builtin/rebase.c:575
#, c-format
msgid "could not open '%s' for writing"
msgstr "không thể mở “%s” để ghi"
@@ -3899,7 +4171,7 @@ msgstr "gặp ID đối tượng không cần khi xóa “%s”"
#: refs.c:905
#, c-format
msgid "log for ref %s has gap after %s"
-msgstr "Nhật ký cho tham chiếu %s có khoảng trống sau %s"
+msgstr "nhật ký cho tham chiếu %s có khoảng trống sau %s"
#: refs.c:911
#, c-format
@@ -3938,7 +4210,7 @@ msgstr "“%s” sẵn có; không thể tạo “%s”"
#: refs.c:2045 refs.c:2080
#, c-format
msgid "cannot process '%s' and '%s' at the same time"
-msgstr "Không thể xử lý “%s” và “%s” cùng một lúc"
+msgstr "không thể xử lý “%s” và “%s” cùng một lúc"
#: refs/files-backend.c:1228
#, c-format
@@ -3961,7 +4233,7 @@ msgstr "không thể xóa bỏ tham chiếu: %s"
msgid "invalid refspec '%s'"
msgstr "refspec không hợp lệ “%s”"
-#: ref-filter.c:39 wt-status.c:1855
+#: ref-filter.c:39 wt-status.c:1861
msgid "gone"
msgstr "đã ra đi"
@@ -4010,87 +4282,92 @@ msgstr "đối số không được thừa nhận %%(%s): %s"
msgid "%%(objecttype) does not take arguments"
msgstr "%%(objecttype) không nhận các đối số"
-#: ref-filter.c:235
+#: ref-filter.c:245
+#, c-format
+msgid "unrecognized %%(objectsize) argument: %s"
+msgstr "tham số không được thừa nhận %%(objectname): %s"
+
+#: ref-filter.c:253
#, c-format
-msgid "%%(objectsize) does not take arguments"
-msgstr "%%(objectsize) không nhận các đối số"
+msgid "%%(deltabase) does not take arguments"
+msgstr "%%(deltabase) không nhận các đối số"
-#: ref-filter.c:247
+#: ref-filter.c:265
#, c-format
msgid "%%(body) does not take arguments"
msgstr "%%(body) không nhận các đối số"
-#: ref-filter.c:256
+#: ref-filter.c:274
#, c-format
msgid "%%(subject) does not take arguments"
msgstr "%%(subject) không nhận các đối số"
-#: ref-filter.c:278
+#: ref-filter.c:296
#, c-format
msgid "unknown %%(trailers) argument: %s"
msgstr "không hiểu tham số %%(trailers): %s"
-#: ref-filter.c:307
+#: ref-filter.c:325
#, c-format
msgid "positive value expected contents:lines=%s"
msgstr "cần nội dung mang giá trị dương:lines=%s"
-#: ref-filter.c:309
+#: ref-filter.c:327
#, c-format
msgid "unrecognized %%(contents) argument: %s"
msgstr "đối số không được thừa nhận %%(contents): %s"
-#: ref-filter.c:324
+#: ref-filter.c:342
#, c-format
msgid "positive value expected objectname:short=%s"
msgstr "cần nội dung mang giá trị dương:shot=%s"
-#: ref-filter.c:328
+#: ref-filter.c:346
#, c-format
msgid "unrecognized %%(objectname) argument: %s"
msgstr "đối số không được thừa nhận %%(objectname): %s"
-#: ref-filter.c:358
+#: ref-filter.c:376
#, c-format
msgid "expected format: %%(align:<width>,<position>)"
msgstr "cần định dạng: %%(align:<width>,<position>)"
-#: ref-filter.c:370
+#: ref-filter.c:388
#, c-format
msgid "unrecognized position:%s"
msgstr "vị trí không được thừa nhận:%s"
-#: ref-filter.c:377
+#: ref-filter.c:395
#, c-format
msgid "unrecognized width:%s"
msgstr "chiều rộng không được thừa nhận:%s"
-#: ref-filter.c:386
+#: ref-filter.c:404
#, c-format
msgid "unrecognized %%(align) argument: %s"
msgstr "đối số không được thừa nhận %%(align): %s"
-#: ref-filter.c:394
+#: ref-filter.c:412
#, c-format
msgid "positive width expected with the %%(align) atom"
msgstr "cần giá trị độ rộng dương với nguyên tử %%(align)"
-#: ref-filter.c:412
+#: ref-filter.c:430
#, c-format
msgid "unrecognized %%(if) argument: %s"
msgstr "đối số không được thừa nhận %%(if): %s"
-#: ref-filter.c:508
+#: ref-filter.c:527
#, c-format
msgid "malformed field name: %.*s"
msgstr "tên trường dị hình: %.*s"
-#: ref-filter.c:535
+#: ref-filter.c:554
#, c-format
msgid "unknown field name: %.*s"
msgstr "không hiểu tên trường: %.*s"
-#: ref-filter.c:539
+#: ref-filter.c:558
#, c-format
msgid ""
"not a git repository, but the field '%.*s' requires access to object data"
@@ -4098,62 +4375,62 @@ msgstr ""
"không phải là một kho git, nhưng trường “%.*s” yêu cầu truy cập vào dữ liệu "
"đối tượng"
-#: ref-filter.c:663
+#: ref-filter.c:682
#, c-format
msgid "format: %%(if) atom used without a %%(then) atom"
msgstr "định dạng: nguyên tử %%(if) được dùng mà không có nguyên tử %%(then)"
-#: ref-filter.c:726
+#: ref-filter.c:745
#, c-format
msgid "format: %%(then) atom used without an %%(if) atom"
msgstr "định dạng: nguyên tử %%(then) được dùng mà không có nguyên tử %%(if)"
-#: ref-filter.c:728
+#: ref-filter.c:747
#, c-format
msgid "format: %%(then) atom used more than once"
msgstr "định dạng: nguyên tử %%(then) được dùng nhiều hơn một lần"
-#: ref-filter.c:730
+#: ref-filter.c:749
#, c-format
msgid "format: %%(then) atom used after %%(else)"
msgstr "định dạng: nguyên tử %%(then) được dùng sau %%(else)"
-#: ref-filter.c:758
+#: ref-filter.c:777
#, c-format
msgid "format: %%(else) atom used without an %%(if) atom"
msgstr "định dạng: nguyên tử %%(else) được dùng mà không có nguyên tử %%(if)"
-#: ref-filter.c:760
+#: ref-filter.c:779
#, c-format
msgid "format: %%(else) atom used without a %%(then) atom"
msgstr "định dạng: nguyên tử %%(else) được dùng mà không có nguyên tử %%(then)"
-#: ref-filter.c:762
+#: ref-filter.c:781
#, c-format
msgid "format: %%(else) atom used more than once"
msgstr "định dạng: nguyên tử %%(else) được dùng nhiều hơn một lần"
-#: ref-filter.c:777
+#: ref-filter.c:796
#, c-format
msgid "format: %%(end) atom used without corresponding atom"
msgstr "định dạng: nguyên tử %%(end) được dùng mà không có nguyên tử tương ứng"
-#: ref-filter.c:834
+#: ref-filter.c:853
#, c-format
msgid "malformed format string %s"
msgstr "chuỗi định dạng dị hình %s"
-#: ref-filter.c:1424
+#: ref-filter.c:1447
#, c-format
msgid "(no branch, rebasing %s)"
msgstr "(không nhánh, đang cải tổ %s)"
-#: ref-filter.c:1427
+#: ref-filter.c:1450
#, c-format
msgid "(no branch, rebasing detached HEAD %s)"
msgstr "(không nhánh, đang cải tổ HEAD %s đã tách rời)"
-#: ref-filter.c:1430
+#: ref-filter.c:1453
#, c-format
msgid "(no branch, bisect started on %s)"
msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
@@ -4161,7 +4438,7 @@ msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s
#. TRANSLATORS: make sure this matches "HEAD
#. detached at " in wt-status.c
#.
-#: ref-filter.c:1438
+#: ref-filter.c:1461
#, c-format
msgid "(HEAD detached at %s)"
msgstr "(HEAD được tách rời tại %s)"
@@ -4169,143 +4446,290 @@ msgstr "(HEAD được tách rời tại %s)"
#. TRANSLATORS: make sure this matches "HEAD
#. detached from " in wt-status.c
#.
-#: ref-filter.c:1445
+#: ref-filter.c:1468
#, c-format
msgid "(HEAD detached from %s)"
msgstr "(HEAD được tách rời từ %s)"
-#: ref-filter.c:1449
+#: ref-filter.c:1472
msgid "(no branch)"
msgstr "(không nhánh)"
-#: ref-filter.c:1483 ref-filter.c:1638
+#: ref-filter.c:1506 ref-filter.c:1663
#, c-format
msgid "missing object %s for %s"
msgstr "thiếu đối tượng %s cho %s"
-#: ref-filter.c:1491
+#: ref-filter.c:1516
#, c-format
msgid "parse_object_buffer failed on %s for %s"
msgstr "parse_object_buffer gặp lỗi trên %s cho %s"
-#: ref-filter.c:1857
+#: ref-filter.c:1882
#, c-format
msgid "malformed object at '%s'"
msgstr "đối tượng dị hình tại “%s”"
-#: ref-filter.c:1946
+#: ref-filter.c:1971
#, c-format
msgid "ignoring ref with broken name %s"
msgstr "đang lờ đi tham chiếu với tên hỏng %s"
-#: ref-filter.c:2232
+#: ref-filter.c:2257
#, c-format
msgid "format: %%(end) atom missing"
msgstr "định dạng: thiếu nguyên tử %%(end)"
-#: ref-filter.c:2338
+#: ref-filter.c:2352
+#, c-format
+msgid "option `%s' is incompatible with --merged"
+msgstr "tùy chọn “%s” là xung khắc với tùy chọn --merged"
+
+#: ref-filter.c:2355
+#, c-format
+msgid "option `%s' is incompatible with --no-merged"
+msgstr "tùy chọn “%s” là xung khắc với tùy chọn --no-merged"
+
+#: ref-filter.c:2365
#, c-format
msgid "malformed object name %s"
msgstr "tên đối tượng dị hình %s"
-#: remote.c:607
+#: ref-filter.c:2370
+#, c-format
+msgid "option `%s' must point to a commit"
+msgstr "tùy chọn “%s” phải chỉ đến một lần chuyển giao"
+
+#: remote.c:363
+#, c-format
+msgid "config remote shorthand cannot begin with '/': %s"
+msgstr "cấu hình viết tắt máy chủ không thể bắt đầu bằng “/”: %s"
+
+#: remote.c:410
+msgid "more than one receivepack given, using the first"
+msgstr "đã đưa ra nhiều hơn một gói nhận về, đang sử dụng cái đầu tiên"
+
+#: remote.c:418
+msgid "more than one uploadpack given, using the first"
+msgstr "đã đưa ra nhiều hơn một gói tải lên, đang sử dụng cái đầu tiên"
+
+#: remote.c:608
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Không thể lấy về cả %s và %s cho %s"
-#: remote.c:611
+#: remote.c:612
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s thường theo dõi %s, không phải %s"
-#: remote.c:615
+#: remote.c:616
#, c-format
msgid "%s tracks both %s and %s"
msgstr "%s theo dõi cả %s và %s"
-#: remote.c:623
-msgid "Internal error"
-msgstr "Lỗi nội bộ"
+#: remote.c:684
+#, c-format
+msgid "key '%s' of pattern had no '*'"
+msgstr "khóa “%s” của mẫu k có “*”"
+
+#: remote.c:694
+#, c-format
+msgid "value '%s' of pattern has no '*'"
+msgstr "giá trị “%s” của mẫu k có “*”"
+
+#: remote.c:1000
+#, c-format
+msgid "src refspec %s does not match any"
+msgstr "refspec %s nguồn không khớp bất kỳ cái gì"
+
+#: remote.c:1005
+#, c-format
+msgid "src refspec %s matches more than one"
+msgstr "refspec %s nguồn khớp nhiều hơn một"
+
+#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
+#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
+#. the <src>.
+#.
+#: remote.c:1020
+#, c-format
+msgid ""
+"The destination you provided is not a full refname (i.e.,\n"
+"starting with \"refs/\"). We tried to guess what you meant by:\n"
+"\n"
+"- Looking for a ref that matches '%s' on the remote side.\n"
+"- Checking if the <src> being pushed ('%s')\n"
+" is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
+" refs/{heads,tags}/ prefix on the remote side.\n"
+"\n"
+"Neither worked, so we gave up. You must fully qualify the ref."
+msgstr ""
+"Đích bạn đã cung cấp không phải tên tham chiếu đầy đủ (tức là\n"
+"bắt đầu bằng \"refs/\"). Chúng tôi đã cố suy luận rằng ý của bạn là:\n"
+"\n"
+"- Tìm kiếm một tham chiếu mà nó khớp “%s” bên phía máy chủ.\n"
+"- Kiểm tra xem <src> được đẩy lên (“%s”)\n"
+" là một tham chiếu trong \"refs/{heads,tags}/\". Nếu thế chúng tôi thêm một "
+"tiền tố\n"
+" refs/{heads,tags}/ tương ứng bên phía máy chủ.\n"
+"\n"
+"Nếu cả hai là không thể, thì chúng tôi cũng chịu thua. Bạn phải dùng tham "
+"chiếu dạng đầy đủ."
+
+#: remote.c:1040
+#, c-format
+msgid ""
+"The <src> part of the refspec is a commit object.\n"
+"Did you mean to create a new branch by pushing to\n"
+"'%s:refs/heads/%s'?"
+msgstr ""
+"Phần <src> của đặc tả đường dẫn là một đối tượng lần chuyển giao.\n"
+"Có phải ý bạn là một tạo một nhánh mới bằng cách đẩy lên\n"
+"“%s:refs/heads/%s”?"
+
+#: remote.c:1045
+#, c-format
+msgid ""
+"The <src> part of the refspec is a tag object.\n"
+"Did you mean to create a new tag by pushing to\n"
+"'%s:refs/tags/%s'?"
+msgstr ""
+"Phần <src> của đặc tả đường dẫn là một đối tượng thẻ.\n"
+"Có phải ý bạn là một tạo một thẻ mới bằng cách đẩy lên\n"
+"“%s:refs/tags/%s”?"
+
+#: remote.c:1050
+#, c-format
+msgid ""
+"The <src> part of the refspec is a tree object.\n"
+"Did you mean to tag a new tree by pushing to\n"
+"'%s:refs/tags/%s'?"
+msgstr ""
+"Phần <src> của đặc tả đường dẫn là một đối tượng cây.\n"
+"Có phải ý bạn là một tạo một cây mới bằng cách đẩy lên\n"
+"“%s:refs/tags/%s”?"
+
+#: remote.c:1055
+#, c-format
+msgid ""
+"The <src> part of the refspec is a blob object.\n"
+"Did you mean to tag a new blob by pushing to\n"
+"'%s:refs/tags/%s'?"
+msgstr ""
+"Phần <src> của đặc tả đường dẫn là một đối tượng blob.\n"
+"Có phải ý bạn là một tạo một blob mới bằng cách đẩy lên\n"
+"“%s:refs/tags/%s”?"
+
+#: remote.c:1091
+#, c-format
+msgid "%s cannot be resolved to branch"
+msgstr "“%s” không thể được phân giải thành nhánh"
+
+#: remote.c:1102
+#, c-format
+msgid "unable to delete '%s': remote ref does not exist"
+msgstr "không thể xóa “%s”: tham chiếu trên máy chủ không tồn tại"
+
+#: remote.c:1114
+#, c-format
+msgid "dst refspec %s matches more than one"
+msgstr "dst refspec %s khớp nhiều hơn một"
+
+#: remote.c:1121
+#, c-format
+msgid "dst ref %s receives from more than one src"
+msgstr "dst ref %s nhận từ hơn một nguồn"
-#: remote.c:1569 remote.c:1670
+#: remote.c:1624 remote.c:1725
msgid "HEAD does not point to a branch"
msgstr "HEAD không chỉ đến một nhánh nào cả"
-#: remote.c:1578
+#: remote.c:1633
#, c-format
msgid "no such branch: '%s'"
msgstr "không có nhánh nào như thế: “%s”"
-#: remote.c:1581
+#: remote.c:1636
#, c-format
msgid "no upstream configured for branch '%s'"
msgstr "không có thượng nguồn được cấu hình cho nhánh “%s”"
-#: remote.c:1587
+#: remote.c:1642
#, c-format
msgid "upstream branch '%s' not stored as a remote-tracking branch"
msgstr ""
"nhánh thượng nguồn “%s” không được lưu lại như là một nhánh theo dõi máy chủ"
-#: remote.c:1602
+#: remote.c:1657
#, c-format
msgid "push destination '%s' on remote '%s' has no local tracking branch"
msgstr "đẩy lên đích “%s” trên máy chủ “%s” không có nhánh theo dõi nội bộ"
-#: remote.c:1614
+#: remote.c:1669
#, c-format
msgid "branch '%s' has no remote for pushing"
msgstr "nhánh “%s” không có máy chủ để đẩy lên"
-#: remote.c:1624
+#: remote.c:1679
#, c-format
msgid "push refspecs for '%s' do not include '%s'"
msgstr "đẩy refspecs cho “%s” không bao gồm “%s”"
-#: remote.c:1637
+#: remote.c:1692
msgid "push has no destination (push.default is 'nothing')"
msgstr "đẩy lên mà không có đích (push.default là “nothing”)"
-#: remote.c:1659
+#: remote.c:1714
msgid "cannot resolve 'simple' push to a single destination"
msgstr "không thể phân giải đẩy “đơn giản” đến một đích đơn"
-#: remote.c:1935
+#: remote.c:1840
+#, c-format
+msgid "couldn't find remote ref %s"
+msgstr "không thể tìm thấy tham chiếu máy chủ %s"
+
+#: remote.c:1853
+#, c-format
+msgid "* Ignoring funny ref '%s' locally"
+msgstr "* Đang bỏ qua tham chiếu thú vị nội bộ “%s”"
+
+#: remote.c:1990
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr ""
"Nhánh của bạn dựa trên cơ sở là “%s”, nhưng trên thượng nguồn không còn.\n"
-#: remote.c:1939
+#: remote.c:1994
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (dùng \" git branch --unset-upstream\" để sửa)\n"
-#: remote.c:1942
+#: remote.c:1997
#, c-format
msgid "Your branch is up to date with '%s'.\n"
msgstr "Nhánh của bạn đã cập nhật với “%s”.\n"
-#: remote.c:1946
+#: remote.c:2001
#, c-format
msgid "Your branch and '%s' refer to different commits.\n"
msgstr "Nhánh của bạn và “%s” tham chiếu đến các lần chuyển giao khác nhau.\n"
-#: remote.c:1949
+#: remote.c:2004
#, c-format
msgid " (use \"%s\" for details)\n"
msgstr " (dùng \"%s\" để biết thêm chi tiết)\n"
-#: remote.c:1953
+#: remote.c:2008
#, 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] "Nhánh của bạn đứng trước “%s” %d lần chuyển giao.\n"
-#: remote.c:1959
+#: remote.c:2014
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (dùng \"git push\" để xuất bản các lần chuyển giao nội bộ của bạn)\n"
-#: remote.c:1962
+#: remote.c:2017
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -4314,11 +4738,11 @@ msgstr[0] ""
"Nhánh của bạn đứng đằng sau “%s” %d lần chuyển giao, và có thể được chuyển-"
"tiếp-nhanh.\n"
-#: remote.c:1970
+#: remote.c:2025
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (dùng \"git pull\" để cập nhật nhánh nội bộ của bạn)\n"
-#: remote.c:1973
+#: remote.c:2028
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -4331,12 +4755,17 @@ msgstr[0] ""
"và có %d và %d lần chuyển giao khác nhau cho từng cái,\n"
"tương ứng với mỗi lần.\n"
-#: remote.c:1983
+#: remote.c:2038
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr ""
" (dùng \"git pull\" để hòa trộn nhánh trên máy chủ vào trong nhánh của "
"bạn)\n"
+#: remote.c:2221
+#, c-format
+msgid "cannot parse expected object name '%s'"
+msgstr "không thể phân tích tên đối tượng mong muốn “%s”"
+
#: replace-object.c:21
#, c-format
msgid "bad replace ref name: %s"
@@ -4360,7 +4789,8 @@ msgstr "MERGE_RR sai hỏng"
msgid "unable to write rerere record"
msgstr "không thể ghi bản ghi rerere"
-#: rerere.c:485 rerere.c:692 sequencer.c:3136 sequencer.c:3162
+#: rerere.c:485 rerere.c:692 sequencer.c:3186 sequencer.c:3212
+#: builtin/fsck.c:314
#, c-format
msgid "could not write '%s'"
msgstr "không thể ghi “%s”"
@@ -4393,7 +4823,7 @@ msgstr "gặp lỗi khi đang ghi “%s”"
#: rerere.c:714
#, c-format
msgid "Staged '%s' using previous resolution."
-msgstr "Đã tạm cất “%s” sử dụng cách phân giải kế trước"
+msgstr "Đã tạm cất “%s” sử dụng cách phân giải kế trước."
#: rerere.c:753
#, c-format
@@ -4413,10 +4843,10 @@ msgstr "không thể unlink stray “%s”"
#: rerere.c:807
#, c-format
msgid "Recorded preimage for '%s'"
-msgstr "preimage đã được ghi lại cho “%s”"
+msgstr "Preimage đã được ghi lại cho “%s”"
-#: rerere.c:881 submodule.c:1763 builtin/submodule--helper.c:1413
-#: builtin/submodule--helper.c:1423
+#: rerere.c:881 submodule.c:2012 builtin/submodule--helper.c:1417
+#: builtin/submodule--helper.c:1427
#, c-format
msgid "could not create directory '%s'"
msgstr "không thể tạo thư mục “%s”"
@@ -4450,29 +4880,29 @@ msgstr "Quên phân giải cho “%s”\n"
msgid "unable to open rr-cache directory"
msgstr "không thể mở thư mục rr-cache"
-#: revision.c:2324
+#: revision.c:2484
msgid "your current branch appears to be broken"
msgstr "nhánh hiện tại của bạn có vẻ như bị hỏng"
-#: revision.c:2327
+#: revision.c:2487
#, c-format
msgid "your current branch '%s' does not have any commits yet"
msgstr "nhánh hiện tại của bạn “%s” không có một lần chuyển giao nào cả"
-#: revision.c:2523
+#: revision.c:2684
msgid "--first-parent is incompatible with --bisect"
msgstr "--first-parent xung khắc với --bisect"
-#: run-command.c:740
+#: run-command.c:742
msgid "open /dev/null failed"
msgstr "gặp lỗi khi mở “/dev/null”"
-#: run-command.c:1229
+#: run-command.c:1231
#, c-format
msgid "cannot create async thread: %s"
msgstr "không thể tạo tuyến async: %s"
-#: run-command.c:1293
+#: run-command.c:1295
#, c-format
msgid ""
"The '%s' hook was ignored because it's not set as executable.\n"
@@ -4481,30 +4911,30 @@ msgstr ""
"Móc “%s” bị bỏ qua bởi vì nó không thể đặt là thực thi được.\n"
"Bạn có thể tắt cảnh báo này bằng “git config advice.ignoredHook false“."
-#: send-pack.c:142
+#: send-pack.c:141
msgid "unexpected flush packet while reading remote unpack status"
msgstr ""
"gặp gói flush không cần trong khi đọc tình trạng giải nén gói trên máy chủ"
-#: send-pack.c:144
+#: send-pack.c:143
#, c-format
msgid "unable to parse remote unpack status: %s"
msgstr "không thể phân tích tình trạng unpack máy chủ: %s"
-#: send-pack.c:146
+#: send-pack.c:145
#, c-format
msgid "remote unpack failed: %s"
msgstr "máy chủ gặp lỗi unpack: %s"
-#: send-pack.c:308
+#: send-pack.c:306
msgid "failed to sign the push certificate"
msgstr "gặp lỗi khi ký chứng thực đẩy"
-#: send-pack.c:421
+#: send-pack.c:420
msgid "the receiving end does not support --signed push"
msgstr "kết thúc nhận không hỗ trợ đẩy --signed"
-#: send-pack.c:423
+#: send-pack.c:422
msgid ""
"not sending a push certificate since the receiving end does not support --"
"signed push"
@@ -4512,42 +4942,42 @@ msgstr ""
"đừng gửi giấy chứng nhận đẩy trước khi kết thúc nhận không hỗ trợ đẩy --"
"signed"
-#: send-pack.c:435
+#: send-pack.c:434
msgid "the receiving end does not support --atomic push"
msgstr "kết thúc nhận không hỗ trợ đẩy --atomic"
-#: send-pack.c:440
+#: send-pack.c:439
msgid "the receiving end does not support push options"
msgstr "kết thúc nhận không hỗ trợ các tùy chọn của lệnh push"
-#: sequencer.c:183
+#: sequencer.c:184
#, c-format
msgid "invalid commit message cleanup mode '%s'"
msgstr "chế độ dọn dẹp ghi chú các lần chuyển giao không hợp lệ “%s”"
-#: sequencer.c:287
+#: sequencer.c:288
#, c-format
msgid "could not delete '%s'"
msgstr "không thể xóa bỏ “%s”"
-#: sequencer.c:313
+#: sequencer.c:314
msgid "revert"
msgstr "hoàn nguyên"
-#: sequencer.c:315
+#: sequencer.c:316
msgid "cherry-pick"
msgstr "cherry-pick"
-#: sequencer.c:317
+#: sequencer.c:318
msgid "rebase -i"
msgstr "rebase -i"
-#: sequencer.c:319
+#: sequencer.c:320
#, c-format
msgid "unknown action: %d"
msgstr "không nhận ra thao tác: %d"
-#: sequencer.c:376
+#: sequencer.c:378
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'"
@@ -4555,7 +4985,7 @@ msgstr ""
"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n"
"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”"
-#: sequencer.c:379
+#: sequencer.c:381
msgid ""
"after resolving the conflicts, mark the corrected paths\n"
"with 'git add <paths>' or 'git rm <paths>'\n"
@@ -4565,39 +4995,39 @@ msgstr ""
"với lệnh “git add <đường_dẫn>” hoặc “git rm <đường_dẫn>”\n"
"và chuyển giao kết quả bằng lệnh “git commit”"
-#: sequencer.c:392 sequencer.c:2632
+#: sequencer.c:394 sequencer.c:2671
#, c-format
msgid "could not lock '%s'"
msgstr "không thể khóa “%s”"
-#: sequencer.c:399
+#: sequencer.c:401
#, c-format
msgid "could not write eol to '%s'"
msgstr "không thể ghi eol vào “%s”"
-#: sequencer.c:404 sequencer.c:2515 sequencer.c:2638 sequencer.c:2652
-#: sequencer.c:2885
+#: sequencer.c:406 sequencer.c:2554 sequencer.c:2677 sequencer.c:2691
+#: sequencer.c:2931
#, c-format
msgid "failed to finalize '%s'"
msgstr "gặp lỗi khi hoàn thành “%s”"
-#: sequencer.c:427 sequencer.c:921 sequencer.c:1594 sequencer.c:2535
-#: sequencer.c:2867 sequencer.c:2974 builtin/am.c:260 builtin/commit.c:746
-#: builtin/merge.c:1084 builtin/rebase.c:152
+#: sequencer.c:429 sequencer.c:931 sequencer.c:1615 sequencer.c:2574
+#: sequencer.c:2913 sequencer.c:3022 builtin/am.c:245 builtin/commit.c:748
+#: builtin/merge.c:1085 builtin/rebase.c:154
#, c-format
msgid "could not read '%s'"
-msgstr "Không thể đọc “%s”."
+msgstr "không thể đọc “%s”"
-#: sequencer.c:453
+#: sequencer.c:455
#, c-format
msgid "your local changes would be overwritten by %s."
msgstr "các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh %s."
-#: sequencer.c:457
+#: sequencer.c:459
msgid "commit your changes or stash them to proceed."
msgstr "chuyển giao các thay đổi của bạn hay tạm cất (stash) chúng để xử lý."
-#: sequencer.c:486
+#: sequencer.c:491
#, c-format
msgid "%s: fast-forward"
msgstr "%s: chuyển-tiếp-nhanh"
@@ -4605,70 +5035,70 @@ msgstr "%s: chuyển-tiếp-nhanh"
#. TRANSLATORS: %s will be "revert", "cherry-pick" or
#. "rebase -i".
#.
-#: sequencer.c:575
+#: sequencer.c:582
#, c-format
msgid "%s: Unable to write new index file"
msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới"
-#: sequencer.c:591
+#: sequencer.c:598
msgid "unable to update cache tree"
msgstr "không thể cập nhật cây bộ nhớ đệm"
-#: sequencer.c:604
+#: sequencer.c:612
msgid "could not resolve HEAD commit"
msgstr "không thể phân giải lần chuyển giao HEAD"
-#: sequencer.c:684
+#: sequencer.c:692
#, c-format
msgid "no key present in '%.*s'"
msgstr "không có khóa hiện diện trong “%.*s”"
-#: sequencer.c:695
+#: sequencer.c:703
#, c-format
msgid "unable to dequote value of '%s'"
msgstr "không thể giải trích dẫn giá trị của “%s”"
-#: sequencer.c:732 wrapper.c:227 wrapper.c:397 builtin/am.c:719
-#: builtin/am.c:811 builtin/merge.c:1081
+#: sequencer.c:740 wrapper.c:227 wrapper.c:397 builtin/am.c:704
+#: builtin/am.c:796 builtin/merge.c:1082 builtin/rebase.c:617
#, c-format
msgid "could not open '%s' for reading"
msgstr "không thể mở “%s” để đọc"
-#: sequencer.c:742
+#: sequencer.c:750
msgid "'GIT_AUTHOR_NAME' already given"
msgstr "“GIT_AUTHOR_NAME” đã sẵn đưa ra rồi"
-#: sequencer.c:747
+#: sequencer.c:755
msgid "'GIT_AUTHOR_EMAIL' already given"
msgstr "“GIT_AUTHOR_EMAIL” đã sẵn đưa ra rồi"
-#: sequencer.c:752
+#: sequencer.c:760
msgid "'GIT_AUTHOR_DATE' already given"
msgstr "“GIT_AUTHOR_DATE” đã sẵn đưa ra rồi"
-#: sequencer.c:756
+#: sequencer.c:764
#, c-format
msgid "unknown variable '%s'"
msgstr "không hiểu biến “%s”"
-#: sequencer.c:761
+#: sequencer.c:769
msgid "missing 'GIT_AUTHOR_NAME'"
msgstr "thiếu “GIT_AUTHOR_NAME”"
-#: sequencer.c:763
+#: sequencer.c:771
msgid "missing 'GIT_AUTHOR_EMAIL'"
msgstr "thiếu “GIT_AUTHOR_EMAIL”"
-#: sequencer.c:765
+#: sequencer.c:773
msgid "missing 'GIT_AUTHOR_DATE'"
msgstr "thiếu “GIT_AUTHOR_DATE”"
-#: sequencer.c:825
+#: sequencer.c:833
#, c-format
msgid "invalid date format '%s' in '%s'"
msgstr "định dạng ngày tháng không hợp lệ “%s” trong “%s”"
-#: sequencer.c:842
+#: sequencer.c:850
#, c-format
msgid ""
"you have staged changes in your working tree\n"
@@ -4697,15 +5127,15 @@ msgstr ""
"\n"
" git rebase --continue\n"
-#: sequencer.c:935
+#: sequencer.c:945
msgid "writing root commit"
msgstr "ghi chuyển giao gốc"
-#: sequencer.c:1142
+#: sequencer.c:1155
msgid "'prepare-commit-msg' hook failed"
msgstr "móc “prepare-commit-msg” bị lỗi"
-#: sequencer.c:1149
+#: sequencer.c:1162
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -4736,7 +5166,7 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1162
+#: sequencer.c:1175
msgid ""
"Your name and email address were configured automatically based\n"
"on your username and hostname. Please check that they are accurate.\n"
@@ -4764,304 +5194,297 @@ msgstr ""
"\n"
" git commit --amend --reset-author\n"
-#: sequencer.c:1202
+#: sequencer.c:1217
msgid "couldn't look up newly created commit"
msgstr "không thể tìm thấy lần chuyển giao mới hơn đã được tạo"
-#: sequencer.c:1204
+#: sequencer.c:1219
msgid "could not parse newly created commit"
msgstr ""
"không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
-#: sequencer.c:1250
+#: sequencer.c:1265
msgid "unable to resolve HEAD after creating commit"
msgstr "không thể phân giải HEAD sau khi tạo lần chuyển giao"
-#: sequencer.c:1252
+#: sequencer.c:1267
msgid "detached HEAD"
msgstr "đã rời khỏi HEAD"
-#: sequencer.c:1256
+#: sequencer.c:1271
msgid " (root-commit)"
msgstr " (root-commit)"
-#: sequencer.c:1277
+#: sequencer.c:1292
msgid "could not parse HEAD"
msgstr "không thể phân tích HEAD"
-#: sequencer.c:1279
+#: sequencer.c:1294
#, c-format
msgid "HEAD %s is not a commit!"
msgstr "HEAD %s không phải là một lần chuyển giao!"
-#: sequencer.c:1283 builtin/commit.c:1543
+#: sequencer.c:1298 builtin/commit.c:1546
msgid "could not parse HEAD commit"
msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
-#: sequencer.c:1334 sequencer.c:1934
+#: sequencer.c:1350 sequencer.c:1964
msgid "unable to parse commit author"
msgstr "không thể phân tích tác giả của lần chuyển giao"
-#: sequencer.c:1344 builtin/am.c:1585 builtin/merge.c:677
+#: sequencer.c:1360 builtin/am.c:1570 builtin/merge.c:678
msgid "git write-tree failed to write a tree"
msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
-#: sequencer.c:1361 sequencer.c:1416
+#: sequencer.c:1377 sequencer.c:1433
#, c-format
msgid "unable to read commit message from '%s'"
msgstr "không thể đọc phần chú thích (message) từ “%s”"
-#: sequencer.c:1383 builtin/am.c:1606 builtin/commit.c:1646 builtin/merge.c:858
-#: builtin/merge.c:883
+#: sequencer.c:1399 builtin/am.c:1591 builtin/commit.c:1649 builtin/merge.c:859
+#: builtin/merge.c:884
msgid "failed to write commit object"
msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
-#: sequencer.c:1443
+#: sequencer.c:1460
#, c-format
msgid "could not parse commit %s"
msgstr "không thể phân tích lần chuyển giao %s"
-#: sequencer.c:1448
+#: sequencer.c:1465
#, c-format
msgid "could not parse parent commit %s"
msgstr "không thể phân tích lần chuyển giao cha mẹ “%s”"
-#: sequencer.c:1546 sequencer.c:1654
+#: sequencer.c:1565 sequencer.c:1675
#, c-format
msgid "unknown command: %d"
msgstr "không hiểu câu lệnh %d"
-#: sequencer.c:1601 sequencer.c:1626
+#: sequencer.c:1622 sequencer.c:1647
#, c-format
msgid "This is a combination of %d commits."
msgstr "Đây là tổ hợp của %d lần chuyển giao."
-#: sequencer.c:1611 sequencer.c:4744
+#: sequencer.c:1632 sequencer.c:4808
msgid "need a HEAD to fixup"
msgstr "cần một HEAD để sửa"
-#: sequencer.c:1613 sequencer.c:2912
+#: sequencer.c:1634 sequencer.c:2958
msgid "could not read HEAD"
msgstr "không thể đọc HEAD"
-#: sequencer.c:1615
+#: sequencer.c:1636
msgid "could not read HEAD's commit message"
msgstr "không thể đọc phần chú thích (message) của HEAD"
-#: sequencer.c:1621
+#: sequencer.c:1642
#, c-format
msgid "cannot write '%s'"
msgstr "không thể ghi “%s”"
-#: sequencer.c:1628 git-rebase--preserve-merges.sh:441
+#: sequencer.c:1649 git-rebase--preserve-merges.sh:441
msgid "This is the 1st commit message:"
msgstr "Đây là chú thích cho lần chuyển giao thứ nhất:"
-#: sequencer.c:1636
+#: sequencer.c:1657
#, c-format
msgid "could not read commit message of %s"
msgstr "không thể đọc phần chú thích (message) của %s"
-#: sequencer.c:1643
+#: sequencer.c:1664
#, c-format
msgid "This is the commit message #%d:"
msgstr "Đây là chú thích cho lần chuyển giao thứ #%d:"
-#: sequencer.c:1649
+#: sequencer.c:1670
#, c-format
msgid "The commit message #%d will be skipped:"
msgstr "Chú thích cho lần chuyển giao thứ #%d sẽ bị bỏ qua:"
-#: sequencer.c:1732
+#: sequencer.c:1758
msgid "your index file is unmerged."
msgstr "tập tin lưu mục lục của bạn không được hòa trộn."
-#: sequencer.c:1739
+#: sequencer.c:1765
msgid "cannot fixup root commit"
msgstr "không thể sửa chữa lần chuyển giao gốc"
-#: sequencer.c:1758
+#: sequencer.c:1784
#, c-format
msgid "commit %s is a merge but no -m option was given."
msgstr "lần chuyển giao %s là một lần hòa trộn nhưng không đưa ra tùy chọn -m."
-#: sequencer.c:1766
+#: sequencer.c:1792 sequencer.c:1800
#, c-format
msgid "commit %s does not have parent %d"
msgstr "lần chuyển giao %s không có cha mẹ %d"
-#: sequencer.c:1770
-#, c-format
-msgid "mainline was specified but commit %s is not a merge."
-msgstr ""
-"luồng chính đã được chỉ ra nhưng lần chuyển giao %s không phải là một lần "
-"hòa trộn."
-
-#: sequencer.c:1776
+#: sequencer.c:1806
#, c-format
msgid "cannot get commit message for %s"
msgstr "không thể lấy ghi chú lần chuyển giao cho %s"
#. TRANSLATORS: The first %s will be a "todo" command like
#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:1795
+#: sequencer.c:1825
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s"
-#: sequencer.c:1860
+#: sequencer.c:1890
#, c-format
msgid "could not rename '%s' to '%s'"
msgstr "không thể đổi tên “%s” thành “%s”"
-#: sequencer.c:1915
+#: sequencer.c:1945
#, c-format
msgid "could not revert %s... %s"
msgstr "không thể hoàn nguyên %s… %s"
-#: sequencer.c:1916
+#: sequencer.c:1946
#, c-format
msgid "could not apply %s... %s"
msgstr "không thể áp dụng miếng vá %s… %s"
-#: sequencer.c:1974
+#: sequencer.c:2005
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: gặp lỗi đọc bảng mục lục"
-#: sequencer.c:1981
+#: sequencer.c:2012
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục"
-#: sequencer.c:2062
+#: sequencer.c:2094
#, c-format
msgid "%s does not accept arguments: '%s'"
msgstr "%s không nhận các đối số: “%s”"
-#: sequencer.c:2071
+#: sequencer.c:2103
#, c-format
msgid "missing arguments for %s"
msgstr "thiếu đối số cho %s"
-#: sequencer.c:2130
+#: sequencer.c:2163
#, c-format
msgid "invalid line %d: %.*s"
msgstr "dòng không hợp lệ %d: %.*s"
-#: sequencer.c:2138
+#: sequencer.c:2171
#, c-format
msgid "cannot '%s' without a previous commit"
msgstr "không thể “%s” thể mà không có lần chuyển giao kế trước"
-#: sequencer.c:2209
+#: sequencer.c:2243
msgid "please fix this using 'git rebase --edit-todo'."
msgstr "vui lòng sửa lỗi này bằng cách dùng “git rebase --edit-todo”."
-#: sequencer.c:2211
+#: sequencer.c:2245
#, c-format
msgid "unusable instruction sheet: '%s'"
msgstr "bảng chỉ thị không thể dùng được: %s"
-#: sequencer.c:2216
+#: sequencer.c:2250
msgid "no commits parsed."
msgstr "không có lần chuyển giao nào được phân tích."
-#: sequencer.c:2227
+#: sequencer.c:2261
msgid "cannot cherry-pick during a revert."
msgstr "không thể cherry-pick trong khi hoàn nguyên."
-#: sequencer.c:2229
+#: sequencer.c:2263
msgid "cannot revert during a cherry-pick."
msgstr "không thể thực hiện việc hoàn nguyên trong khi đang cherry-pick."
-#: sequencer.c:2299
+#: sequencer.c:2333
#, c-format
msgid "invalid value for %s: %s"
msgstr "giá trị cho %s không hợp lệ: %s"
-#: sequencer.c:2380
+#: sequencer.c:2420
msgid "unusable squash-onto"
msgstr "squash-onto không dùng được"
-#: sequencer.c:2396
+#: sequencer.c:2436
#, c-format
msgid "malformed options sheet: '%s'"
msgstr "bảng tùy chọn dị hình: “%s”"
-#: sequencer.c:2479 sequencer.c:4005
+#: sequencer.c:2518 sequencer.c:4067
msgid "empty commit set passed"
msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
-#: sequencer.c:2487
+#: sequencer.c:2526
msgid "a cherry-pick or revert is already in progress"
msgstr "có một thao tác “cherry-pick” hoặc “revert” đang được thực hiện"
-#: sequencer.c:2488
+#: sequencer.c:2527
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
-#: sequencer.c:2491
+#: sequencer.c:2530
#, c-format
msgid "could not create sequencer directory '%s'"
msgstr "không thể tạo thư mục xếp dãy “%s”"
-#: sequencer.c:2505
+#: sequencer.c:2544
msgid "could not lock HEAD"
msgstr "không thể khóa HEAD"
-#: sequencer.c:2560 sequencer.c:3761
+#: sequencer.c:2599 sequencer.c:3819
msgid "no cherry-pick or revert in progress"
msgstr "không cherry-pick hay hoàn nguyên trong tiến trình"
-#: sequencer.c:2562
+#: sequencer.c:2601
msgid "cannot resolve HEAD"
msgstr "không thể phân giải HEAD"
-#: sequencer.c:2564 sequencer.c:2599
+#: sequencer.c:2603 sequencer.c:2638
msgid "cannot abort from a branch yet to be born"
msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra"
-#: sequencer.c:2585 builtin/grep.c:721
+#: sequencer.c:2624 builtin/grep.c:732
#, c-format
msgid "cannot open '%s'"
msgstr "không mở được “%s”"
-#: sequencer.c:2587
+#: sequencer.c:2626
#, c-format
msgid "cannot read '%s': %s"
msgstr "không thể đọc “%s”: %s"
-#: sequencer.c:2588
+#: sequencer.c:2627
msgid "unexpected end of file"
msgstr "gặp kết thúc tập tin đột xuất"
-#: sequencer.c:2594
+#: sequencer.c:2633
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "tập tin HEAD “pre-cherry-pick” đã lưu “%s” bị hỏng"
-#: sequencer.c:2605
+#: sequencer.c:2644
msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
msgstr ""
"Bạn có lẽ đã có HEAD đã bị di chuyển đi, Không thể tua, kiểm tra HEAD của "
"bạn!"
-#: sequencer.c:2709 sequencer.c:3679
+#: sequencer.c:2750 sequencer.c:3735
#, c-format
msgid "could not update %s"
msgstr "không thể cập nhật %s"
-#: sequencer.c:2747 sequencer.c:3659
+#: sequencer.c:2788 sequencer.c:3715
msgid "cannot read HEAD"
msgstr "không thể đọc HEAD"
-#: sequencer.c:2762
+#: sequencer.c:2805
#, c-format
msgid "unable to copy '%s' to '%s'"
msgstr "không thể chép “%s” sang “%s”"
-#: sequencer.c:2770
+#: sequencer.c:2813
#, c-format
msgid ""
"You can amend the commit now, with\n"
@@ -5080,27 +5503,27 @@ msgstr ""
"\n"
" git rebase --continue\n"
-#: sequencer.c:2780
+#: sequencer.c:2823
#, c-format
msgid "Could not apply %s... %.*s"
msgstr "Không thể áp dụng %s… %.*s"
-#: sequencer.c:2787
+#: sequencer.c:2830
#, c-format
msgid "Could not merge %.*s"
msgstr "Không hòa trộn %.*s"
-#: sequencer.c:2798 sequencer.c:2802 builtin/difftool.c:640
+#: sequencer.c:2844 sequencer.c:2848 builtin/difftool.c:641
#, c-format
msgid "could not copy '%s' to '%s'"
msgstr "không thể chép “%s” sang “%s”"
-#: sequencer.c:2824 sequencer.c:3242 builtin/rebase.c:580 builtin/rebase.c:1019
-#: builtin/rebase.c:1372 builtin/rebase.c:1426
+#: sequencer.c:2870 sequencer.c:3293 builtin/rebase.c:424 builtin/rebase.c:1230
+#: builtin/rebase.c:1591 builtin/rebase.c:1646
msgid "could not read index"
msgstr "không thể đọc bảng mục lục"
-#: sequencer.c:2829
+#: sequencer.c:2875
#, c-format
msgid ""
"execution failed: %s\n"
@@ -5115,11 +5538,11 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:2835
+#: sequencer.c:2881
msgid "and made changes to the index and/or the working tree\n"
msgstr "và tạo các thay đổi bảng mục lục và/hay cây làm việc\n"
-#: sequencer.c:2841
+#: sequencer.c:2887
#, c-format
msgid ""
"execution succeeded: %s\n"
@@ -5136,76 +5559,76 @@ msgstr ""
" git rebase --continue\n"
"\n"
-#: sequencer.c:2902
+#: sequencer.c:2948
#, c-format
msgid "illegal label name: '%.*s'"
msgstr "tên nhãn dị hình: “%.*s”"
-#: sequencer.c:2954
+#: sequencer.c:3002
msgid "writing fake root commit"
msgstr "ghi lần chuyển giao gốc giả"
-#: sequencer.c:2959
+#: sequencer.c:3007
msgid "writing squash-onto"
msgstr "đang ghi squash-onto"
-#: sequencer.c:2997 builtin/rebase.c:585 builtin/rebase.c:591
+#: sequencer.c:3045 builtin/rebase.c:429 builtin/rebase.c:435
#, c-format
msgid "failed to find tree of %s"
msgstr "gặp lỗi khi tìm cây của %s"
-#: sequencer.c:3015 builtin/rebase.c:604
+#: sequencer.c:3063 builtin/rebase.c:448
msgid "could not write index"
msgstr "không thể ghi bảng mục lục"
-#: sequencer.c:3042
+#: sequencer.c:3090
#, c-format
msgid "could not resolve '%s'"
msgstr "không thể phân giải “%s”"
-#: sequencer.c:3068
+#: sequencer.c:3118
msgid "cannot merge without a current revision"
msgstr "không thể hòa trộn mà không có một điểm xét duyệt hiện tại"
-#: sequencer.c:3090
+#: sequencer.c:3140
#, c-format
msgid "unable to parse '%.*s'"
msgstr "không thể phân tích “%.*s”"
-#: sequencer.c:3099
+#: sequencer.c:3149
#, c-format
msgid "nothing to merge: '%.*s'"
msgstr "chẳng có gì để hòa trộn: “%.*s”"
-#: sequencer.c:3111
+#: sequencer.c:3161
msgid "octopus merge cannot be executed on top of a [new root]"
msgstr "hòa trộn octopus không thể được thực thi trên đỉnh của một [new root]"
-#: sequencer.c:3126
+#: sequencer.c:3176
#, c-format
msgid "could not get commit message of '%s'"
msgstr "không thể lấy chú thích của lần chuyển giao của “%s”"
-#: sequencer.c:3274
+#: sequencer.c:3325
#, c-format
msgid "could not even attempt to merge '%.*s'"
msgstr "không thể ngay cả khi thử hòa trộn “%.*s”"
-#: sequencer.c:3290
+#: sequencer.c:3341
msgid "merge: Unable to write new index file"
msgstr "merge: Không thể ghi tập tin lưu bảng mục lục mới"
-#: sequencer.c:3358 builtin/rebase.c:268
+#: sequencer.c:3409 builtin/rebase.c:298
#, c-format
msgid "Applied autostash.\n"
msgstr "Đã áp dụng autostash.\n"
-#: sequencer.c:3370
+#: sequencer.c:3421
#, c-format
msgid "cannot store %s"
msgstr "không thử lưu “%s”"
-#: sequencer.c:3373 builtin/rebase.c:284
+#: sequencer.c:3424 builtin/rebase.c:314
#, c-format
msgid ""
"Applying autostash resulted in conflicts.\n"
@@ -5217,31 +5640,31 @@ msgstr ""
"Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc "
"nào.\n"
-#: sequencer.c:3427
+#: sequencer.c:3478
#, c-format
msgid "could not checkout %s"
msgstr "không thể lấy ra %s"
-#: sequencer.c:3441
+#: sequencer.c:3492
#, c-format
msgid "%s: not a valid OID"
msgstr "%s không phải là một OID hợp lệ"
-#: sequencer.c:3446 git-rebase--preserve-merges.sh:724
+#: sequencer.c:3497 git-rebase--preserve-merges.sh:724
msgid "could not detach HEAD"
msgstr "không thể tách rời HEAD"
-#: sequencer.c:3461
+#: sequencer.c:3512
#, c-format
msgid "Stopped at HEAD\n"
msgstr "Dừng lại ở HEAD\n"
-#: sequencer.c:3463
+#: sequencer.c:3514
#, c-format
msgid "Stopped at %s\n"
msgstr "Dừng lại ở %s\n"
-#: sequencer.c:3471
+#: sequencer.c:3522
#, c-format
msgid ""
"Could not execute the todo command\n"
@@ -5262,48 +5685,48 @@ msgstr ""
" git rebase --edit-todo\n"
" git rebase --continue\n"
-#: sequencer.c:3543
+#: sequencer.c:3597
#, c-format
msgid "Stopped at %s... %.*s\n"
msgstr "Dừng lại ở %s… %.*s\n"
-#: sequencer.c:3622
+#: sequencer.c:3677
#, c-format
msgid "unknown command %d"
msgstr "không hiểu câu lệnh %d"
-#: sequencer.c:3667
+#: sequencer.c:3723
msgid "could not read orig-head"
msgstr "không thể đọc orig-head"
-#: sequencer.c:3672 sequencer.c:4741
+#: sequencer.c:3728 sequencer.c:4805
msgid "could not read 'onto'"
msgstr "không thể đọc “onto”."
-#: sequencer.c:3686
+#: sequencer.c:3742
#, c-format
msgid "could not update HEAD to %s"
msgstr "không thể cập nhật HEAD thành %s"
-#: sequencer.c:3772
+#: sequencer.c:3831
msgid "cannot rebase: You have unstaged changes."
msgstr "không thể cải tổ: Bạn có các thay đổi chưa được đưa lên bệ phóng."
-#: sequencer.c:3781
+#: sequencer.c:3840
msgid "cannot amend non-existing commit"
msgstr "không thể tu bỏ một lần chuyển giao không tồn tại"
-#: sequencer.c:3783
+#: sequencer.c:3842
#, c-format
msgid "invalid file: '%s'"
msgstr "tập tin không hợp lệ: “%s”"
-#: sequencer.c:3785
+#: sequencer.c:3844
#, c-format
msgid "invalid contents: '%s'"
msgstr "nội dung không hợp lệ: “%s”"
-#: sequencer.c:3788
+#: sequencer.c:3847
msgid ""
"\n"
"You have uncommitted changes in your working tree. Please, commit them\n"
@@ -5313,54 +5736,54 @@ msgstr ""
"Bạn có các thay đổi chưa chuyển giao trong thư mục làm việc. Vui lòng\n"
"chuyển giao chúng trước và sau đó chạy lệnh “git rebase --continue” lần nữa."
-#: sequencer.c:3824 sequencer.c:3862
+#: sequencer.c:3883 sequencer.c:3921
#, c-format
msgid "could not write file: '%s'"
msgstr "không thể ghi tập tin: “%s”"
-#: sequencer.c:3877
+#: sequencer.c:3936
msgid "could not remove CHERRY_PICK_HEAD"
msgstr "không thể xóa bỏ CHERRY_PICK_HEAD"
-#: sequencer.c:3884
+#: sequencer.c:3943
msgid "could not commit staged changes."
msgstr "không thể chuyển giao các thay đổi đã đưa lên bệ phóng."
-#: sequencer.c:3982
+#: sequencer.c:4044
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: không thể cherry-pick một %s"
-#: sequencer.c:3986
+#: sequencer.c:4048
#, c-format
msgid "%s: bad revision"
msgstr "%s: điểm xét duyệt sai"
-#: sequencer.c:4021
+#: sequencer.c:4083
msgid "can't revert as initial commit"
msgstr "không thể hoàn nguyên một lần chuyển giao khởi tạo"
-#: sequencer.c:4466
+#: sequencer.c:4529
msgid "make_script: unhandled options"
msgstr "make_script: các tùy chọn được không xử lý"
-#: sequencer.c:4469
+#: sequencer.c:4532
msgid "make_script: error preparing revisions"
msgstr "make_script: lỗi chuẩn bị điểm hiệu chỉnh"
-#: sequencer.c:4509 sequencer.c:4565 sequencer.c:4840
+#: sequencer.c:4573 sequencer.c:4629 sequencer.c:4904
#, c-format
msgid "unusable todo list: '%s'"
msgstr "danh sách cần làm không dùng được: “%s”"
-#: sequencer.c:4620
+#: sequencer.c:4684
#, c-format
msgid ""
"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
msgstr ""
"không nhận ra cài đặt %s cho tùy chọn rebase.missingCommitsCheck. Nên bỏ qua."
-#: sequencer.c:4690
+#: sequencer.c:4754
#, c-format
msgid ""
"Warning: some commits may have been dropped accidentally.\n"
@@ -5369,7 +5792,7 @@ msgstr ""
"Cảnh báo: một số lần chuyển giao có lẽ đã bị xóa một cách tình cờ.\n"
"Các lần chuyển giao bị xóa (từ mới đến cũ):\n"
-#: sequencer.c:4697
+#: sequencer.c:4761
#, c-format
msgid ""
"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
@@ -5387,7 +5810,7 @@ msgstr ""
"Cánh ứng xử có thể là: ignore, warn, error.\n"
"\n"
-#: sequencer.c:4710
+#: sequencer.c:4774
#, c-format
msgid ""
"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
@@ -5398,30 +5821,30 @@ msgstr ""
"continue”.\n"
"Hoặc là bạn có thể bãi bỏ việc cải tổ bằng “git rebase --abort”.\n"
-#: sequencer.c:4848 sequencer.c:4886
+#: sequencer.c:4912 sequencer.c:4950
msgid "nothing to do"
msgstr "không có gì để làm"
-#: sequencer.c:4852
+#: sequencer.c:4916
#, c-format
msgid "Rebase %s onto %s (%d command)"
msgid_plural "Rebase %s onto %s (%d commands)"
msgstr[0] "Cải tổ %s vào %s (%d lệnh )"
-#: sequencer.c:4864
+#: sequencer.c:4928
#, c-format
msgid "could not copy '%s' to '%s'."
msgstr "không thể chép “%s” sang “%s”."
-#: sequencer.c:4868 sequencer.c:4897
+#: sequencer.c:4932 sequencer.c:4961
msgid "could not transform the todo list"
msgstr "không thể chuyển dạng danh sách cần làm"
-#: sequencer.c:4900
+#: sequencer.c:4964
msgid "could not skip unnecessary pick commands"
msgstr "không thể bỏ qua các lệnh cậy (pick) không cần thiết"
-#: sequencer.c:4983
+#: sequencer.c:5047
msgid "the script was already rearranged."
msgstr "văn lệnh đã sẵn được sắp đặt rồi."
@@ -5470,7 +5893,7 @@ msgstr ""
#: setup.c:389
msgid "unable to set up work tree using invalid config"
-msgstr "Không thể đặt thư mục làm việc hiện hành sử dụng cấu hình không hợp lệ"
+msgstr "không thể cài đặt thư mục làm việc sử dụng cấu hình không hợp lệ"
#: setup.c:393
msgid "this operation must be run in a work tree"
@@ -5513,7 +5936,7 @@ msgstr "không có đường dẫn trong tập tin git: %s"
#: setup.c:564
#, c-format
msgid "not a git repository: %s"
-msgstr "Không phải là kho git: %s"
+msgstr "không phải là kho git: %s"
#: setup.c:663
#, c-format
@@ -5530,30 +5953,30 @@ msgstr "không phải là kho git: “%s”"
msgid "cannot chdir to '%s'"
msgstr "không thể chdir (chuyển đổi thư mục) sang “%s”"
-#: setup.c:711 setup.c:767 setup.c:777 setup.c:816 setup.c:824 setup.c:839
+#: setup.c:711 setup.c:767 setup.c:777 setup.c:816 setup.c:824
msgid "cannot come back to cwd"
msgstr "không thể quay lại cwd"
-#: setup.c:837
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr "không phải là kho git (hoặc bất kỳ thư mục cha mẹ nào): %s"
-
-#: setup.c:848
+#: setup.c:838
#, c-format
msgid "failed to stat '%*s%s%s'"
msgstr "gặp lỗi khi lấy thống kê về “%*s%s%s”"
-#: setup.c:1078
+#: setup.c:1068
msgid "Unable to read current working directory"
msgstr "Không thể đọc thư mục làm việc hiện hành"
-#: setup.c:1090 setup.c:1096
+#: setup.c:1077 setup.c:1083
#, c-format
msgid "cannot change to '%s'"
msgstr "không thể chuyển sang “%s”"
-#: setup.c:1109
+#: setup.c:1088
+#, c-format
+msgid "not a git repository (or any of the parent directories): %s"
+msgstr "không phải là kho git (hoặc bất kỳ thư mục cha mẹ nào): %s"
+
+#: setup.c:1094
#, c-format
msgid ""
"not a git repository (or any parent up to mount point %s)\n"
@@ -5563,7 +5986,7 @@ msgstr ""
"Dừng tại biên của hệ thống tập tin (GIT_DISCOVERY_ACROSS_FILESYSTEM chưa "
"đặt)."
-#: setup.c:1192
+#: setup.c:1204
#, c-format
msgid ""
"problem with core.sharedRepository filemode value (0%.3o).\n"
@@ -5572,279 +5995,279 @@ msgstr ""
"gặp vấn đề với giá trị chế độ tập tin core.sharedRepository (0%.3o).\n"
"người sở hữu tập tin phải luôn có quyền đọc và ghi."
-#: setup.c:1235
+#: setup.c:1247
msgid "open /dev/null or dup failed"
msgstr "gặp lỗi khi mở “/dev/null” hay dup"
-#: setup.c:1250
+#: setup.c:1262
msgid "fork failed"
msgstr "gặp lỗi khi rẽ nhánh tiến trình"
-#: setup.c:1255
+#: setup.c:1267
msgid "setsid failed"
msgstr "setsid gặp lỗi"
-#: sha1-file.c:381
+#: sha1-file.c:445
#, c-format
msgid "object directory %s does not exist; check .git/objects/info/alternates"
msgstr ""
"thư mục đối tượng %s không tồn tại; kiểm tra .git/objects/info/alternates"
-#: sha1-file.c:432
+#: sha1-file.c:496
#, c-format
msgid "unable to normalize alternate object path: %s"
msgstr "không thể thường hóa đường dẫn đối tượng thay thế: “%s”"
-#: sha1-file.c:503
+#: sha1-file.c:568
#, c-format
msgid "%s: ignoring alternate object stores, nesting too deep"
msgstr "%s: đang bỏ qua kho đối tượng thay thế, lồng nhau quá sâu"
-#: sha1-file.c:510
+#: sha1-file.c:575
#, c-format
msgid "unable to normalize object directory: %s"
msgstr "không thể chuẩn hóa thư mục đối tượng: “%s”"
-#: sha1-file.c:565
+#: sha1-file.c:618
msgid "unable to fdopen alternates lockfile"
msgstr "không thể fdopen tập tin khóa thay thế"
-#: sha1-file.c:583
+#: sha1-file.c:636
msgid "unable to read alternates file"
msgstr "không thể đọc tập tin thay thế"
-#: sha1-file.c:590
+#: sha1-file.c:643
msgid "unable to move new alternates file into place"
msgstr "không thể di chuyển tập tin thay thế vào chỗ"
-#: sha1-file.c:625
+#: sha1-file.c:678
#, c-format
msgid "path '%s' does not exist"
msgstr "đường dẫn “%s” không tồn tại"
-#: sha1-file.c:651
+#: sha1-file.c:704
#, c-format
msgid "reference repository '%s' as a linked checkout is not supported yet."
msgstr "kho tham chiếu “%s” như là lấy ra liên kết vẫn chưa được hỗ trợ."
-#: sha1-file.c:657
+#: sha1-file.c:710
#, c-format
msgid "reference repository '%s' is not a local repository."
msgstr "kho tham chiếu “%s” không phải là một kho nội bộ."
-#: sha1-file.c:663
+#: sha1-file.c:716
#, c-format
msgid "reference repository '%s' is shallow"
msgstr "kho tham chiếu “%s” là nông"
-#: sha1-file.c:671
+#: sha1-file.c:724
#, c-format
msgid "reference repository '%s' is grafted"
msgstr "kho tham chiếu “%s” bị cấy ghép"
-#: sha1-file.c:781
+#: sha1-file.c:838
#, c-format
msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
msgstr "đang cố để mmap %<PRIuMAX> vượt quá giới hạn %<PRIuMAX>"
-#: sha1-file.c:806
+#: sha1-file.c:863
msgid "mmap failed"
msgstr "mmap gặp lỗi"
-#: sha1-file.c:973
+#: sha1-file.c:1027
#, c-format
msgid "object file %s is empty"
msgstr "tập tin đối tượng %s trống rỗng"
-#: sha1-file.c:1093 sha1-file.c:2215
+#: sha1-file.c:1151 sha1-file.c:2288
#, c-format
msgid "corrupt loose object '%s'"
msgstr "đối tượng mất hỏng “%s”"
-#: sha1-file.c:1095 sha1-file.c:2219
+#: sha1-file.c:1153 sha1-file.c:2292
#, c-format
msgid "garbage at end of loose object '%s'"
msgstr "gặp rác tại cuối của đối tượng bị mất “%s”"
-#: sha1-file.c:1137
+#: sha1-file.c:1195
msgid "invalid object type"
msgstr "kiểu đối tượng không hợp lệ"
-#: sha1-file.c:1219
+#: sha1-file.c:1279
#, c-format
msgid "unable to unpack %s header with --allow-unknown-type"
msgstr "không thể giải nén phần đầu gói %s với --allow-unknown-type"
-#: sha1-file.c:1222
+#: sha1-file.c:1282
#, c-format
msgid "unable to unpack %s header"
msgstr "không thể giải gói phần đầu %s"
-#: sha1-file.c:1228
+#: sha1-file.c:1288
#, c-format
msgid "unable to parse %s header with --allow-unknown-type"
msgstr "không thể phân tích phần đầu gói %s với --allow-unknown-type"
-#: sha1-file.c:1231
+#: sha1-file.c:1291
#, c-format
msgid "unable to parse %s header"
msgstr "không thể phân tích phần đầu của “%s”"
-#: sha1-file.c:1422
+#: sha1-file.c:1481
#, c-format
msgid "failed to read object %s"
msgstr "gặp lỗi khi đọc đối tượng “%s”"
-#: sha1-file.c:1426
+#: sha1-file.c:1485
#, c-format
msgid "replacement %s not found for %s"
msgstr "c%s thay thế không được tìm thấy cho %s"
-#: sha1-file.c:1430
+#: sha1-file.c:1489
#, c-format
msgid "loose object %s (stored in %s) is corrupt"
msgstr "đối tượng mất %s (được lưu trong %s) bị hỏng"
-#: sha1-file.c:1434
+#: sha1-file.c:1493
#, c-format
msgid "packed object %s (stored in %s) is corrupt"
msgstr "đối tượng đã đóng gói %s (được lưu trong %s) bị hỏng"
-#: sha1-file.c:1536
+#: sha1-file.c:1595
#, c-format
-msgid "unable to write sha1 filename %s"
-msgstr "không thể ghi vào tên tập tin sha1 %s"
+msgid "unable to write file %s"
+msgstr "không thể ghi tập tin %s"
-#: sha1-file.c:1543
+#: sha1-file.c:1602
#, c-format
msgid "unable to set permission to '%s'"
msgstr "không thể đặt quyền thành “%s”"
-#: sha1-file.c:1550
+#: sha1-file.c:1609
msgid "file write error"
msgstr "lỗi ghi tập tin"
-#: sha1-file.c:1569
-msgid "error when closing sha1 file"
-msgstr "gặp lỗi trong khi đóng tập tin sha1"
+#: sha1-file.c:1628
+msgid "error when closing loose object file"
+msgstr "gặp lỗi trong khi đóng tập tin đối tượng"
-#: sha1-file.c:1635
+#: sha1-file.c:1693
#, c-format
msgid "insufficient permission for adding an object to repository database %s"
msgstr ""
"không đủ thẩm quyền để thêm một đối tượng vào cơ sở dữ liệu kho chứa %s"
-#: sha1-file.c:1637
+#: sha1-file.c:1695
msgid "unable to create temporary file"
msgstr "không thể tạo tập tin tạm thời"
-#: sha1-file.c:1661
-msgid "unable to write sha1 file"
-msgstr "không thể ghi vào tập tin sha1"
+#: sha1-file.c:1719
+msgid "unable to write loose object file"
+msgstr "không thể ghi tập tin đối tượng đã mất"
-#: sha1-file.c:1667
+#: sha1-file.c:1725
#, c-format
msgid "unable to deflate new object %s (%d)"
msgstr "không thể xả nén đối tượng mới %s (%d)"
-#: sha1-file.c:1671
+#: sha1-file.c:1729
#, c-format
msgid "deflateEnd on object %s failed (%d)"
msgstr "deflateEnd trên đối tượng %s gặp lỗi (%d)"
-#: sha1-file.c:1675
+#: sha1-file.c:1733
#, c-format
msgid "confused by unstable object source data for %s"
msgstr "chưa rõ ràng baowir dữ liệu nguồn đối tượng không ổn định cho %s"
-#: sha1-file.c:1685 builtin/pack-objects.c:918
+#: sha1-file.c:1743 builtin/pack-objects.c:919
#, c-format
msgid "failed utime() on %s"
msgstr "gặp lỗi utime() trên “%s”"
-#: sha1-file.c:1760
+#: sha1-file.c:1818
#, c-format
-msgid "cannot read sha1_file for %s"
-msgstr "không thể đọc sha1_file cho %s"
+msgid "cannot read object for %s"
+msgstr "không thể đọc đối tượng cho %s"
-#: sha1-file.c:1805
+#: sha1-file.c:1858
msgid "corrupt commit"
msgstr "lần chuyển giao sai hỏng"
-#: sha1-file.c:1813
+#: sha1-file.c:1866
msgid "corrupt tag"
msgstr "thẻ sai hỏng"
-#: sha1-file.c:1912
+#: sha1-file.c:1965
#, c-format
msgid "read error while indexing %s"
msgstr "gặp lỗi đọc khi đánh mục lục %s"
-#: sha1-file.c:1915
+#: sha1-file.c:1968
#, c-format
msgid "short read while indexing %s"
msgstr "không đọc ngắn khi đánh mục lục %s"
-#: sha1-file.c:1988 sha1-file.c:1997
+#: sha1-file.c:2041 sha1-file.c:2050
#, c-format
msgid "%s: failed to insert into database"
msgstr "%s: gặp lỗi khi thêm vào cơ sở dữ liệu"
-#: sha1-file.c:2003
+#: sha1-file.c:2056
#, c-format
msgid "%s: unsupported file type"
msgstr "%s: kiểu tập tin không được hỗ trợ"
-#: sha1-file.c:2027
+#: sha1-file.c:2080
#, c-format
msgid "%s is not a valid object"
msgstr "%s không phải là một đối tượng hợp lệ"
-#: sha1-file.c:2029
+#: sha1-file.c:2082
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s không phải là một đối tượng “%s” hợp lệ"
-#: sha1-file.c:2056 builtin/index-pack.c:154
+#: sha1-file.c:2109 builtin/index-pack.c:154
#, c-format
msgid "unable to open %s"
msgstr "không thể mở %s"
-#: sha1-file.c:2226 sha1-file.c:2278
+#: sha1-file.c:2299 sha1-file.c:2351
#, c-format
-msgid "sha1 mismatch for %s (expected %s)"
-msgstr "sha1 không khớp cho %s (cần %s)"
+msgid "hash mismatch for %s (expected %s)"
+msgstr "mã băm không khớp cho %s (cần %s)"
-#: sha1-file.c:2250
+#: sha1-file.c:2323
#, c-format
msgid "unable to mmap %s"
msgstr "không thể mmap %s"
-#: sha1-file.c:2255
+#: sha1-file.c:2328
#, c-format
msgid "unable to unpack header of %s"
msgstr "không thể giải gói phần đầu của “%s”"
-#: sha1-file.c:2261
+#: sha1-file.c:2334
#, c-format
msgid "unable to parse header of %s"
msgstr "không thể phân tích phần đầu của “%s”"
-#: sha1-file.c:2272
+#: sha1-file.c:2345
#, c-format
msgid "unable to unpack contents of %s"
msgstr "không thể giải gói nội dung của “%s”"
-#: sha1-name.c:476
+#: sha1-name.c:448
#, c-format
msgid "short SHA1 %s is ambiguous"
msgstr "tóm lược SHA1 %s chưa rõ ràng"
-#: sha1-name.c:487
+#: sha1-name.c:459
msgid "The candidates are:"
msgstr "Các ứng cử là:"
-#: sha1-name.c:770
+#: sha1-name.c:742
msgid ""
"Git normally never creates a ref that ends with 40 hex characters\n"
"because it will be ignored when you just specify 40-hex. These refs\n"
@@ -5868,72 +6291,82 @@ msgstr ""
"này\n"
"bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
-#: submodule.c:116 submodule.c:145
+#: submodule.c:114 submodule.c:143
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
msgstr ""
"Không thể thay đổi .gitmodules chưa hòa trộn, hãy giải quyết xung đột trộn "
"trước"
-#: submodule.c:120 submodule.c:149
+#: submodule.c:118 submodule.c:147
#, c-format
msgid "Could not find section in .gitmodules where path=%s"
msgstr "Không thể tìm thấy phần trong .gitmodules nơi mà đường_dẫn=%s"
-#: submodule.c:156
+#: submodule.c:154
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "Không thể gỡ bỏ mục .gitmodules dành cho %s"
-#: submodule.c:167
+#: submodule.c:165
msgid "staging updated .gitmodules failed"
msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
-#: submodule.c:329
+#: submodule.c:327
#, c-format
msgid "in unpopulated submodule '%s'"
-msgstr "Trong mô-đun-con không có gì “%s”"
+msgstr "trong mô-đun-con không có gì “%s”"
-#: submodule.c:360
+#: submodule.c:358
#, c-format
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Đặc tả đường dẫn “%s” thì ở trong mô-đun-con “%.*s”"
-#: submodule.c:857
+#: submodule.c:906
#, c-format
msgid "submodule entry '%s' (%s) is a %s, not a commit"
msgstr ""
"mục tin mô-đun-con “%s” (%s) là một %s, không phải là một lần chuyển giao"
-#: submodule.c:1097 builtin/branch.c:656 builtin/submodule--helper.c:1985
+#: submodule.c:1143 builtin/branch.c:656 builtin/submodule--helper.c:1989
msgid "Failed to resolve HEAD as a valid ref."
msgstr "Gặp lỗi khi phân giải HEAD như là một tham chiếu hợp lệ."
-#: submodule.c:1404
+#: submodule.c:1477
+#, c-format
+msgid "Could not access submodule '%s'"
+msgstr "Không thể truy cập mô-đun-con “%s”"
+
+#: submodule.c:1639
#, c-format
msgid "'%s' not recognized as a git repository"
msgstr "không nhận ra “%s” là một kho git"
-#: submodule.c:1542
+#: submodule.c:1777
#, c-format
msgid "could not start 'git status' in submodule '%s'"
msgstr "không thể lấy thống kê “git status” trong mô-đun-con “%s”"
-#: submodule.c:1555
+#: submodule.c:1790
#, c-format
msgid "could not run 'git status' in submodule '%s'"
msgstr "không thể chạy “git status” trong mô-đun-con “%s”"
-#: submodule.c:1648
+#: submodule.c:1805
+#, c-format
+msgid "Could not unset core.worktree setting in submodule '%s'"
+msgstr "Không thể đặt core.worktree trong mô-đun-con “%s”"
+
+#: submodule.c:1895
#, c-format
msgid "submodule '%s' has dirty index"
msgstr "mô-đun-con “%s” có mục lục còn bẩn"
-#: submodule.c:1700
+#: submodule.c:1947
#, c-format
msgid "Submodule '%s' could not be updated."
msgstr "Mô-đun-con “%s” không thể được cập nhật."
-#: submodule.c:1747
+#: submodule.c:1996
#, c-format
msgid ""
"relocate_gitdir for submodule '%s' with more than one worktree not supported"
@@ -5941,12 +6374,12 @@ msgstr ""
"relocate_gitdir cho mô-đun-con “%s” với nhiều hơn một cây làm việc là chưa "
"được hỗ trợ"
-#: submodule.c:1759 submodule.c:1815
+#: submodule.c:2008 submodule.c:2064
#, c-format
msgid "could not lookup name for submodule '%s'"
msgstr "không thể tìm kiếm tên cho mô-đun-con “%s”"
-#: submodule.c:1766
+#: submodule.c:2015
#, c-format
msgid ""
"Migrating git directory of '%s%s' from\n"
@@ -5957,16 +6390,16 @@ msgstr ""
"“%s” sang\n"
"“%s”\n"
-#: submodule.c:1850
+#: submodule.c:2099
#, c-format
msgid "could not recurse into submodule '%s'"
msgstr "không thể đệ quy vào trong mô-đun-con “%s”"
-#: submodule.c:1894
+#: submodule.c:2143
msgid "could not start ls-files in .."
msgstr "không thể lấy thông tin thống kê về ls-files trong .."
-#: submodule.c:1933
+#: submodule.c:2182
#, c-format
msgid "ls-tree returned unexpected return code %d"
msgstr "ls-tree trả về mã không như mong đợi %d"
@@ -6027,7 +6460,7 @@ msgstr "không đọc được tập tin đầu vào “%s”"
msgid "could not read from stdin"
msgstr "không thể đọc từ đầu vào tiêu chuẩn"
-#: trailer.c:1011 builtin/am.c:47
+#: trailer.c:1011 wrapper.c:701
#, c-format
msgid "could not stat %s"
msgstr "không thể lấy thông tin thống kê về %s"
@@ -6066,29 +6499,29 @@ msgstr "không thể đọc bó “%s”"
msgid "transport: invalid depth option '%s'"
msgstr "vận chuyển: tùy chọn độ sâu “%s” không hợp lệ"
-#: transport.c:616
+#: transport.c:617
msgid "could not parse transport.color.* config"
msgstr "không thể phân tích cú pháp cấu hình transport.color.*"
-#: transport.c:689
+#: transport.c:690
msgid "support for protocol v2 not implemented yet"
msgstr "việc hỗ trợ giao thức v2 chưa được thực hiện"
-#: transport.c:816
+#: transport.c:817
#, c-format
msgid "unknown value for config '%s': %s"
msgstr "không hiểu giá trị cho cho cấu hình “%s”: %s"
-#: transport.c:882
+#: transport.c:883
#, c-format
msgid "transport '%s' not allowed"
msgstr "không cho phép phương thức vận chuyển “%s”"
-#: transport.c:936
+#: transport.c:937
msgid "git-over-rsync is no longer supported"
msgstr "git-over-rsync không còn được hỗ trợ nữa"
-#: transport.c:1031
+#: transport.c:1032
#, c-format
msgid ""
"The following submodule paths contain changes that can\n"
@@ -6097,7 +6530,7 @@ msgstr ""
"Các đường dẫn mô-đun-con sau đây có chứa các thay đổi cái mà\n"
"có thể được tìm thấy trên mọi máy phục vụ:\n"
-#: transport.c:1035
+#: transport.c:1036
#, c-format
msgid ""
"\n"
@@ -6124,19 +6557,19 @@ msgstr ""
"để đẩy chúng lên máy phục vụ.\n"
"\n"
-#: transport.c:1043
+#: transport.c:1044
msgid "Aborting."
msgstr "Bãi bỏ."
-#: transport.c:1182
+#: transport.c:1184
msgid "failed to push all needed submodules"
msgstr "gặp lỗi khi đẩy dữ liệu của tất cả các mô-đun-con cần thiết"
-#: transport.c:1315 transport-helper.c:643
+#: transport.c:1317 transport-helper.c:643
msgid "operation not supported by protocol"
msgstr "thao tác không được gia thức hỗ trợ"
-#: transport.c:1419
+#: transport.c:1421
#, c-format
msgid "invalid line while parsing alternate refs: %s"
msgstr "dòng không hợp lệ trong khi phân tích các tham chiếu thay thế: %s"
@@ -6185,7 +6618,7 @@ msgstr "không thể chạy fast-import"
msgid "error while running fast-import"
msgstr "gặp lỗi trong khi chạy fast-import"
-#: transport-helper.c:531 transport-helper.c:1091
+#: transport-helper.c:531 transport-helper.c:1097
#, c-format
msgid "could not read ref %s"
msgstr "không thể đọc tham chiếu %s"
@@ -6208,54 +6641,54 @@ msgstr "đường dẫn dịch vụ máy chủ không hợp lệ"
msgid "can't connect to subservice %s"
msgstr "không thể kết nối đến dịch vụ phụ %s"
-#: transport-helper.c:713
+#: transport-helper.c:718
#, c-format
msgid "expected ok/error, helper said '%s'"
msgstr "cần ok/error, nhưng bộ hỗ trợ lại nói “%s”"
-#: transport-helper.c:766
+#: transport-helper.c:771
#, c-format
msgid "helper reported unexpected status of %s"
msgstr "bộ hỗ trợ báo cáo rằng không cần tình trạng của %s"
-#: transport-helper.c:827
+#: transport-helper.c:832
#, c-format
msgid "helper %s does not support dry-run"
msgstr "helper %s không hỗ trợ dry-run"
-#: transport-helper.c:830
+#: transport-helper.c:835
#, c-format
msgid "helper %s does not support --signed"
msgstr "helper %s không hỗ trợ --signed"
-#: transport-helper.c:833
+#: transport-helper.c:838
#, c-format
msgid "helper %s does not support --signed=if-asked"
msgstr "helper %s không hỗ trợ --signed=if-asked"
-#: transport-helper.c:840
+#: transport-helper.c:845
#, c-format
msgid "helper %s does not support 'push-option'"
msgstr "helper %s không hỗ trợ “push-option”"
-#: transport-helper.c:932
+#: transport-helper.c:937
msgid "remote-helper doesn't support push; refspec needed"
msgstr "remote-helper không hỗ trợ push; cần đặc tả tham chiếu"
-#: transport-helper.c:937
+#: transport-helper.c:942
#, c-format
msgid "helper %s does not support 'force'"
msgstr "helper %s không hỗ trợ “force”"
-#: transport-helper.c:984
+#: transport-helper.c:989
msgid "couldn't run fast-export"
msgstr "không thể chạy fast-export"
-#: transport-helper.c:989
+#: transport-helper.c:994
msgid "error while running fast-export"
msgstr "gặp lỗi trong khi chạy fast-export"
-#: transport-helper.c:1014
+#: transport-helper.c:1019
#, c-format
msgid ""
"No refs in common and none specified; doing nothing.\n"
@@ -6265,47 +6698,47 @@ msgstr ""
"cả.\n"
"Tuy nhiên bạn nên chỉ định một nhánh như “master” chẳng hạn.\n"
-#: transport-helper.c:1077
+#: transport-helper.c:1083
#, c-format
msgid "malformed response in ref list: %s"
msgstr "đáp ứng sai dạng trong danh sách tham chiếu: %s"
-#: transport-helper.c:1231
+#: transport-helper.c:1236
#, c-format
msgid "read(%s) failed"
msgstr "read(%s) gặp lỗi"
-#: transport-helper.c:1258
+#: transport-helper.c:1263
#, c-format
msgid "write(%s) failed"
msgstr "write(%s) gặp lỗi"
-#: transport-helper.c:1307
+#: transport-helper.c:1312
#, c-format
msgid "%s thread failed"
msgstr "tuyến trình %s gặp lỗi"
-#: transport-helper.c:1311
+#: transport-helper.c:1316
#, c-format
msgid "%s thread failed to join: %s"
msgstr "tuyến trình %s gặp lỗi khi gia nhập: %s"
-#: transport-helper.c:1330 transport-helper.c:1334
+#: transport-helper.c:1335 transport-helper.c:1339
#, c-format
msgid "can't start thread for copying data: %s"
msgstr "không thể khởi chạy tuyến trình để sao chép dữ liệu: %s"
-#: transport-helper.c:1371
+#: transport-helper.c:1376
#, c-format
msgid "%s process failed to wait"
msgstr "xử lý %s gặp lỗi khi đợi"
-#: transport-helper.c:1375
+#: transport-helper.c:1380
#, c-format
msgid "%s process failed"
msgstr "xử lý %s gặp lỗi"
-#: transport-helper.c:1393 transport-helper.c:1402
+#: transport-helper.c:1398 transport-helper.c:1407
msgid "can't start thread for copying data"
msgstr "không thể khởi chạy tuyến trình cho việc chép dữ liệu"
@@ -6321,11 +6754,11 @@ msgstr "chế độ dị hình trong đề mục cây"
msgid "empty filename in tree entry"
msgstr "tên tập tin trống rỗng trong mục tin cây"
-#: tree-walk.c:115
+#: tree-walk.c:116
msgid "too-short tree file"
msgstr "tập tin cây quá ngắn"
-#: unpack-trees.c:112
+#: unpack-trees.c:111
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -6336,7 +6769,7 @@ msgstr ""
"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn "
"chuyển nhánh."
-#: unpack-trees.c:114
+#: unpack-trees.c:113
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by checkout:\n"
@@ -6346,7 +6779,7 @@ msgstr ""
"checkout:\n"
"%%s"
-#: unpack-trees.c:117
+#: unpack-trees.c:116
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -6357,7 +6790,7 @@ msgstr ""
"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn hòa "
"trộn."
-#: unpack-trees.c:119
+#: unpack-trees.c:118
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by merge:\n"
@@ -6367,7 +6800,7 @@ msgstr ""
"hòa trộn:\n"
"%%s"
-#: unpack-trees.c:122
+#: unpack-trees.c:121
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -6377,7 +6810,7 @@ msgstr ""
"%s:\n"
"%%sVui lòng chuyển giao các thay đổi hay tạm cất chúng đi trước khi bạn %s."
-#: unpack-trees.c:124
+#: unpack-trees.c:123
#, c-format
msgid ""
"Your local changes to the following files would be overwritten by %s:\n"
@@ -6387,7 +6820,7 @@ msgstr ""
"%s:\n"
"%%s"
-#: unpack-trees.c:129
+#: unpack-trees.c:128
#, c-format
msgid ""
"Updating the following directories would lose untracked files in them:\n"
@@ -6397,7 +6830,7 @@ msgstr ""
"trong nó:\n"
"%s"
-#: unpack-trees.c:133
+#: unpack-trees.c:132
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -6407,7 +6840,7 @@ msgstr ""
"checkout:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
-#: unpack-trees.c:135
+#: unpack-trees.c:134
#, c-format
msgid ""
"The following untracked working tree files would be removed by checkout:\n"
@@ -6417,7 +6850,7 @@ msgstr ""
"checkout:\n"
"%%s"
-#: unpack-trees.c:138
+#: unpack-trees.c:137
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -6427,7 +6860,7 @@ msgstr ""
"trộn:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
-#: unpack-trees.c:140
+#: unpack-trees.c:139
#, c-format
msgid ""
"The following untracked working tree files would be removed by merge:\n"
@@ -6437,7 +6870,7 @@ msgstr ""
"trộn:\n"
"%%s"
-#: unpack-trees.c:143
+#: unpack-trees.c:142
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -6446,7 +6879,7 @@ msgstr ""
"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
-#: unpack-trees.c:145
+#: unpack-trees.c:144
#, c-format
msgid ""
"The following untracked working tree files would be removed by %s:\n"
@@ -6455,7 +6888,7 @@ msgstr ""
"Các tập tin cây làm việc chưa được theo dõi sau đây sẽ bị gỡ bỏ bởi %s:\n"
"%%s"
-#: unpack-trees.c:151
+#: unpack-trees.c:150
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -6466,7 +6899,7 @@ msgstr ""
"checkout:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn chuyển nhánh."
-#: unpack-trees.c:153
+#: unpack-trees.c:152
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by "
@@ -6477,7 +6910,7 @@ msgstr ""
"checkout:\n"
"%%s"
-#: unpack-trees.c:156
+#: unpack-trees.c:155
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -6487,7 +6920,7 @@ msgstr ""
"hòa trộn:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn hòa trộn."
-#: unpack-trees.c:158
+#: unpack-trees.c:157
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by merge:\n"
@@ -6497,7 +6930,7 @@ msgstr ""
"hòa trộn:\n"
"%%s"
-#: unpack-trees.c:161
+#: unpack-trees.c:160
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -6507,7 +6940,7 @@ msgstr ""
"%s:\n"
"%%sVui lòng di chuyển hay gỡ bỏ chúng trước khi bạn %s."
-#: unpack-trees.c:163
+#: unpack-trees.c:162
#, c-format
msgid ""
"The following untracked working tree files would be overwritten by %s:\n"
@@ -6517,12 +6950,12 @@ msgstr ""
"%s:\n"
"%%s"
-#: unpack-trees.c:171
+#: unpack-trees.c:170
#, c-format
msgid "Entry '%s' overlaps with '%s'. Cannot bind."
msgstr "Mục “%s” đè lên “%s”. Không thể buộc."
-#: unpack-trees.c:174
+#: unpack-trees.c:173
#, c-format
msgid ""
"Cannot update sparse checkout: the following entries are not up to date:\n"
@@ -6531,7 +6964,7 @@ msgstr ""
"Không thể cập nhật checkout rải rác: các mục tin sau đây chưa cập nhật:\n"
"%s"
-#: unpack-trees.c:176
+#: unpack-trees.c:175
#, c-format
msgid ""
"The following working tree files would be overwritten by sparse checkout "
@@ -6542,7 +6975,7 @@ msgstr ""
"nhật checkout rải rác:\n"
"%s"
-#: unpack-trees.c:178
+#: unpack-trees.c:177
#, c-format
msgid ""
"The following working tree files would be removed by sparse checkout "
@@ -6553,7 +6986,7 @@ msgstr ""
"nhật checkout rải rác:\n"
"%s"
-#: unpack-trees.c:180
+#: unpack-trees.c:179
#, c-format
msgid ""
"Cannot update submodule:\n"
@@ -6562,16 +6995,16 @@ msgstr ""
"Không thể cập nhật mô-đun-con:\n"
"%s"
-#: unpack-trees.c:254
+#: unpack-trees.c:253
#, c-format
msgid "Aborting\n"
msgstr "Bãi bỏ\n"
-#: unpack-trees.c:336
+#: unpack-trees.c:335
msgid "Checking out files"
msgstr "Đang lấy ra các tập tin"
-#: unpack-trees.c:368
+#: unpack-trees.c:367
msgid ""
"the following paths have collided (e.g. case-sensitive paths\n"
"on a case-insensitive filesystem) and only one from the same\n"
@@ -6596,7 +7029,7 @@ msgstr "thiếu máy chủ và lược đồ thì không phải là giao thức
#: urlmatch.c:232
msgid "a 'file:' URL may not have a port number"
-msgstr "URL kiểu “file:” không được chứa cổng"
+msgstr "một URL kiểu “file:” không được chứa cổng"
#: urlmatch.c:247
msgid "invalid characters in host name"
@@ -6610,7 +7043,7 @@ msgstr "tên cổng không hợp lệ"
msgid "invalid '..' path segment"
msgstr "đoạn đường dẫn “..” không hợp lệ"
-#: worktree.c:249 builtin/am.c:2100
+#: worktree.c:249 builtin/am.c:2094
#, c-format
msgid "failed to read '%s'"
msgstr "gặp lỗi khi đọc “%s”"
@@ -6653,158 +7086,158 @@ msgstr "không thể truy cập “%s”"
#: wrapper.c:632
msgid "unable to get current working directory"
-msgstr "Không thể lấy thư mục làm việc hiện hành"
+msgstr "không thể lấy thư mục làm việc hiện hành"
-#: wt-status.c:154
+#: wt-status.c:155
msgid "Unmerged paths:"
msgstr "Những đường dẫn chưa được hòa trộn:"
-#: wt-status.c:181 wt-status.c:208
+#: wt-status.c:182 wt-status.c:209
#, c-format
msgid " (use \"git reset %s <file>...\" to unstage)"
msgstr " (dùng \"git reset %s <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
-#: wt-status.c:183 wt-status.c:210
+#: wt-status.c:184 wt-status.c:211
msgid " (use \"git rm --cached <file>...\" to unstage)"
msgstr " (dùng \"git rm --cached <tập-tin>…\" để bỏ ra khỏi bệ phóng)"
-#: wt-status.c:187
+#: wt-status.c:188
msgid " (use \"git add <file>...\" to mark resolution)"
msgstr " (dùng \"git add <tập-tin>…\" để đánh dấu là cần giải quyết)"
-#: wt-status.c:189 wt-status.c:193
+#: wt-status.c:190 wt-status.c:194
msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)"
msgstr ""
" (dùng \"git add/rm <tập-tin>…\" như là một cách thích hợp để đánh dấu là "
"cần được giải quyết)"
-#: wt-status.c:191
+#: wt-status.c:192
msgid " (use \"git rm <file>...\" to mark resolution)"
msgstr " (dùng \"git rm <tập-tin>…\" để đánh dấu là cần giải quyết)"
-#: wt-status.c:202 wt-status.c:1042
+#: wt-status.c:203 wt-status.c:1046
msgid "Changes to be committed:"
msgstr "Những thay đổi sẽ được chuyển giao:"
-#: wt-status.c:220 wt-status.c:1051
+#: wt-status.c:221 wt-status.c:1055
msgid "Changes not staged for commit:"
msgstr "Các thay đổi chưa được đặt lên bệ phóng để chuyển giao:"
-#: wt-status.c:224
+#: wt-status.c:225
msgid " (use \"git add <file>...\" to update what will be committed)"
msgstr " (dùng \"git add <tập-tin>…\" để cập nhật những gì sẽ chuyển giao)"
-#: wt-status.c:226
+#: wt-status.c:227
msgid " (use \"git add/rm <file>...\" to update what will be committed)"
msgstr ""
" (dùng \"git add/rm <tập-tin>…\" để cập nhật những gì sẽ được chuyển giao)"
-#: wt-status.c:227
+#: wt-status.c:228
msgid ""
" (use \"git checkout -- <file>...\" to discard changes in working directory)"
msgstr ""
" (dùng \"git checkout -- <tập-tin>…\" để loại bỏ các thay đổi trong thư mục "
"làm việc)"
-#: wt-status.c:229
+#: wt-status.c:230
msgid " (commit or discard the untracked or modified content in submodules)"
msgstr ""
" (chuyển giao hoặc là loại bỏ các nội dung chưa được theo dõi hay đã sửa "
"chữa trong mô-đun-con)"
-#: wt-status.c:241
+#: wt-status.c:242
#, c-format
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
" (dùng \"git %s <tập-tin>…\" để thêm vào những gì cần được chuyển giao)"
-#: wt-status.c:256
+#: wt-status.c:257
msgid "both deleted:"
msgstr "bị xóa bởi cả hai:"
-#: wt-status.c:258
+#: wt-status.c:259
msgid "added by us:"
msgstr "được thêm vào bởi chúng ta:"
-#: wt-status.c:260
+#: wt-status.c:261
msgid "deleted by them:"
msgstr "bị xóa đi bởi họ:"
-#: wt-status.c:262
+#: wt-status.c:263
msgid "added by them:"
msgstr "được thêm vào bởi họ:"
-#: wt-status.c:264
+#: wt-status.c:265
msgid "deleted by us:"
msgstr "bị xóa bởi chúng ta:"
-#: wt-status.c:266
+#: wt-status.c:267
msgid "both added:"
msgstr "được thêm vào bởi cả hai:"
-#: wt-status.c:268
+#: wt-status.c:269
msgid "both modified:"
msgstr "bị sửa bởi cả hai:"
-#: wt-status.c:278
+#: wt-status.c:279
msgid "new file:"
msgstr "tập tin mới:"
-#: wt-status.c:280
+#: wt-status.c:281
msgid "copied:"
msgstr "đã chép:"
-#: wt-status.c:282
+#: wt-status.c:283
msgid "deleted:"
msgstr "đã xóa:"
-#: wt-status.c:284
+#: wt-status.c:285
msgid "modified:"
msgstr "đã sửa:"
-#: wt-status.c:286
+#: wt-status.c:287
msgid "renamed:"
msgstr "đã đổi tên:"
-#: wt-status.c:288
+#: wt-status.c:289
msgid "typechange:"
msgstr "đổi-kiểu:"
-#: wt-status.c:290
+#: wt-status.c:291
msgid "unknown:"
msgstr "không hiểu:"
-#: wt-status.c:292
+#: wt-status.c:293
msgid "unmerged:"
msgstr "chưa hòa trộn:"
-#: wt-status.c:372
+#: wt-status.c:373
msgid "new commits, "
msgstr "lần chuyển giao mới, "
-#: wt-status.c:374
+#: wt-status.c:375
msgid "modified content, "
msgstr "nội dung bị sửa đổi, "
-#: wt-status.c:376
+#: wt-status.c:377
msgid "untracked content, "
msgstr "nội dung chưa được theo dõi, "
-#: wt-status.c:880
+#: wt-status.c:884
#, c-format
msgid "Your stash currently has %d entry"
msgid_plural "Your stash currently has %d entries"
msgstr[0] "Bạn hiện nay ở trong phần cất đi đang có %d mục"
-#: wt-status.c:912
+#: wt-status.c:916
msgid "Submodules changed but not updated:"
msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
-#: wt-status.c:914
+#: wt-status.c:918
msgid "Submodule changes to be committed:"
msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
-#: wt-status.c:996
+#: wt-status.c:1000
msgid ""
"Do not modify or remove the line above.\n"
"Everything below it will be ignored."
@@ -6812,109 +7245,109 @@ msgstr ""
"Không sửa hay xóa bỏ đường ở trên.\n"
"Mọi thứ phía dưới sẽ được xóa bỏ."
-#: wt-status.c:1097
+#: wt-status.c:1101
msgid "You have unmerged paths."
msgstr "Bạn có những đường dẫn chưa được hòa trộn."
-#: wt-status.c:1100
+#: wt-status.c:1104
msgid " (fix conflicts and run \"git commit\")"
msgstr " (sửa các xung đột rồi chạy \"git commit\")"
-#: wt-status.c:1102
+#: wt-status.c:1106
msgid " (use \"git merge --abort\" to abort the merge)"
msgstr " (dùng \"git merge --abort\" để bãi bỏ việc hòa trộn)"
-#: wt-status.c:1106
+#: wt-status.c:1110
msgid "All conflicts fixed but you are still merging."
msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn đang hòa trộn."
-#: wt-status.c:1109
+#: wt-status.c:1113
msgid " (use \"git commit\" to conclude merge)"
msgstr " (dùng \"git commit\" để hoàn tất việc hòa trộn)"
-#: wt-status.c:1118
+#: wt-status.c:1122
msgid "You are in the middle of an am session."
msgstr "Bạn đang ở giữa của một phiên “am”."
-#: wt-status.c:1121
+#: wt-status.c:1125
msgid "The current patch is empty."
msgstr "Miếng vá hiện tại bị trống rỗng."
-#: wt-status.c:1125
+#: wt-status.c:1129
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (sửa các xung đột và sau đó chạy lệnh \"git am --continue\")"
-#: wt-status.c:1127
+#: wt-status.c:1131
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (dùng \"git am --skip\" để bỏ qua miếng vá này)"
-#: wt-status.c:1129
+#: wt-status.c:1133
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr " (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
-#: wt-status.c:1260
+#: wt-status.c:1264
msgid "git-rebase-todo is missing."
-msgstr "thiếu git-rebase-todo"
+msgstr "thiếu git-rebase-todo."
-#: wt-status.c:1262
+#: wt-status.c:1266
msgid "No commands done."
msgstr "Không thực hiện lệnh nào."
-#: wt-status.c:1265
+#: wt-status.c:1269
#, c-format
msgid "Last command done (%d command done):"
msgid_plural "Last commands done (%d commands done):"
msgstr[0] "Lệnh thực hiện cuối (%d lệnh được thực thi):"
-#: wt-status.c:1276
+#: wt-status.c:1280
#, c-format
msgid " (see more in file %s)"
msgstr " (xem thêm trong %s)"
-#: wt-status.c:1281
+#: wt-status.c:1285
msgid "No commands remaining."
msgstr "Không có lệnh nào còn lại."
-#: wt-status.c:1284
+#: wt-status.c:1288
#, c-format
msgid "Next command to do (%d remaining command):"
msgid_plural "Next commands to do (%d remaining commands):"
msgstr[0] "Lệnh cần làm kế tiếp (%d lệnh còn lại):"
-#: wt-status.c:1292
+#: wt-status.c:1296
msgid " (use \"git rebase --edit-todo\" to view and edit)"
msgstr " (dùng lệnh \"git rebase --edit-todo\" để xem và sửa)"
-#: wt-status.c:1304
+#: wt-status.c:1308
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "Bạn hiện nay đang thực hiện việc “rebase” nhánh “%s” trên “%s”."
-#: wt-status.c:1309
+#: wt-status.c:1313
msgid "You are currently rebasing."
msgstr "Bạn hiện nay đang thực hiện việc “rebase” (“cải tổ”)."
-#: wt-status.c:1322
+#: wt-status.c:1326
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr ""
" (sửa các xung đột và sau đó chạy lệnh “cải tổ” \"git rebase --continue\")"
-#: wt-status.c:1324
+#: wt-status.c:1328
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (dùng lệnh “cải tổ” \"git rebase --skip\" để bỏ qua lần vá này)"
-#: wt-status.c:1326
+#: wt-status.c:1330
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
" (dùng lệnh “cải tổ” \"git rebase --abort\" để check-out nhánh nguyên thủy)"
-#: wt-status.c:1333
+#: wt-status.c:1337
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh “cải tổ” \"git rebase --"
"continue\")"
-#: wt-status.c:1337
+#: wt-status.c:1341
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -6922,134 +7355,134 @@ msgstr ""
"Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
"đang “rebase” nhánh “%s” trên “%s”."
-#: wt-status.c:1342
+#: wt-status.c:1346
msgid "You are currently splitting a commit during a rebase."
msgstr ""
"Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
"rebase."
-#: wt-status.c:1345
+#: wt-status.c:1349
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (Một khi thư mục làm việc của bạn đã gọn gàng, chạy lệnh “cải tổ” \"git "
"rebase --continue\")"
-#: wt-status.c:1349
+#: wt-status.c:1353
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"Bạn hiện nay đang thực hiện việc sửa chữa một lần chuyển giao trong khi đang "
"rebase nhánh “%s” trên “%s”."
-#: wt-status.c:1354
+#: wt-status.c:1358
msgid "You are currently editing a commit during a rebase."
msgstr "Bạn hiện đang sửa một lần chuyển giao trong khi bạn thực hiện rebase."
-#: wt-status.c:1357
+#: wt-status.c:1361
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr " (dùng \"git commit --amend\" để “tu bổ” lần chuyển giao hiện tại)"
-#: wt-status.c:1359
+#: wt-status.c:1363
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (chạy lệnh “cải tổ” \"git rebase --continue\" một khi bạn cảm thấy hài "
"lòng về những thay đổi của mình)"
-#: wt-status.c:1368
+#: wt-status.c:1372
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "Bạn hiện nay đang thực hiện việc cherry-pick lần chuyển giao %s."
-#: wt-status.c:1373
+#: wt-status.c:1377
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr ""
" (sửa các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")"
-#: wt-status.c:1376
+#: wt-status.c:1380
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git cherry-pick --"
"continue\")"
-#: wt-status.c:1378
+#: wt-status.c:1382
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr " (dùng \"git cherry-pick --abort\" để hủy bỏ thao tác cherry-pick)"
-#: wt-status.c:1386
+#: wt-status.c:1390
#, c-format
msgid "You are currently reverting commit %s."
msgstr "Bạn hiện nay đang thực hiện thao tác hoàn nguyên lần chuyển giao “%s”."
-#: wt-status.c:1391
+#: wt-status.c:1395
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
-#: wt-status.c:1394
+#: wt-status.c:1398
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git revert --continue\")"
-#: wt-status.c:1396
+#: wt-status.c:1400
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (dùng \"git revert --abort\" để hủy bỏ thao tác hoàn nguyên)"
-#: wt-status.c:1406
+#: wt-status.c:1410
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr ""
"Bạn hiện nay đang thực hiện thao tác di chuyển nửa bước (bisect), bắt đầu từ "
"nhánh “%s”."
-#: wt-status.c:1410
+#: wt-status.c:1414
msgid "You are currently bisecting."
msgstr "Bạn hiện tại đang thực hiện việc bisect (di chuyển nửa bước)."
-#: wt-status.c:1413
+#: wt-status.c:1417
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr " (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
-#: wt-status.c:1611
+#: wt-status.c:1617
msgid "On branch "
msgstr "Trên nhánh "
-#: wt-status.c:1618
+#: wt-status.c:1624
msgid "interactive rebase in progress; onto "
msgstr "rebase ở chế độ tương tác đang được thực hiện; lên trên "
-#: wt-status.c:1620
+#: wt-status.c:1626
msgid "rebase in progress; onto "
msgstr "rebase đang được thực hiện: lên trên "
-#: wt-status.c:1625
+#: wt-status.c:1631
msgid "HEAD detached at "
msgstr "HEAD được tách rời tại "
-#: wt-status.c:1627
+#: wt-status.c:1633
msgid "HEAD detached from "
msgstr "HEAD được tách rời từ "
-#: wt-status.c:1630
+#: wt-status.c:1636
msgid "Not currently on any branch."
msgstr "Hiện tại chẳng ở nhánh nào cả."
-#: wt-status.c:1647
+#: wt-status.c:1653
msgid "Initial commit"
msgstr "Lần chuyển giao khởi tạo"
-#: wt-status.c:1648
+#: wt-status.c:1654
msgid "No commits yet"
msgstr "Vẫn chưa chuyển giao"
-#: wt-status.c:1662
+#: wt-status.c:1668
msgid "Untracked files"
msgstr "Những tập tin chưa được theo dõi"
-#: wt-status.c:1664
+#: wt-status.c:1670
msgid "Ignored files"
msgstr "Những tập tin bị lờ đi"
-#: wt-status.c:1668
+#: wt-status.c:1674
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -7061,32 +7494,32 @@ msgstr ""
"có lẽ làm nó nhanh hơn, nhưng bạn phải cẩn thận đừng quên mình phải\n"
"tự thêm các tập tin mới (xem “git help status”.."
-#: wt-status.c:1674
+#: wt-status.c:1680
#, c-format
msgid "Untracked files not listed%s"
msgstr "Những tập tin chưa được theo dõi không được liệt kê ra %s"
-#: wt-status.c:1676
+#: wt-status.c:1682
msgid " (use -u option to show untracked files)"
msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
-#: wt-status.c:1682
+#: wt-status.c:1688
msgid "No changes"
msgstr "Không có thay đổi nào"
-#: wt-status.c:1687
+#: wt-status.c:1693
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"không có thay đổi nào được thêm vào để chuyển giao (dùng \"git add\" và/hoặc "
"\"git commit -a\")\n"
-#: wt-status.c:1690
+#: wt-status.c:1696
#, c-format
msgid "no changes added to commit\n"
msgstr "không có thay đổi nào được thêm vào để chuyển giao\n"
-#: wt-status.c:1693
+#: wt-status.c:1699
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -7095,200 +7528,200 @@ msgstr ""
"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
"theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
-#: wt-status.c:1696
+#: wt-status.c:1702
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr ""
"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
"theo dõi hiện diện\n"
-#: wt-status.c:1699
+#: wt-status.c:1705
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"không có gì để chuyển giao (tạo/sao-chép các tập tin và dùng \"git add\" để "
"đưa vào theo dõi)\n"
-#: wt-status.c:1702 wt-status.c:1707
+#: wt-status.c:1708 wt-status.c:1713
#, c-format
msgid "nothing to commit\n"
msgstr "không có gì để chuyển giao\n"
-#: wt-status.c:1705
+#: wt-status.c:1711
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
-#: wt-status.c:1709
+#: wt-status.c:1715
#, c-format
msgid "nothing to commit, working tree clean\n"
msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
-#: wt-status.c:1822
+#: wt-status.c:1828
msgid "No commits yet on "
-msgstr "Vẫn không thực hiện lệnh chuyển giao nào"
+msgstr "Vẫn không thực hiện lệnh chuyển giao nào "
-#: wt-status.c:1826
+#: wt-status.c:1832
msgid "HEAD (no branch)"
msgstr "HEAD (không nhánh)"
-#: wt-status.c:1857
+#: wt-status.c:1863
msgid "different"
msgstr "khác"
-#: wt-status.c:1859 wt-status.c:1867
+#: wt-status.c:1865 wt-status.c:1873
msgid "behind "
msgstr "đằng sau "
-#: wt-status.c:1862 wt-status.c:1865
+#: wt-status.c:1868 wt-status.c:1871
msgid "ahead "
msgstr "phía trước "
#. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2374
+#: wt-status.c:2386
#, c-format
msgid "cannot %s: You have unstaged changes."
msgstr "không thể %s: Bạn có các thay đổi chưa được đưa lên bệ phóng."
-#: wt-status.c:2380
+#: wt-status.c:2392
msgid "additionally, your index contains uncommitted changes."
msgstr ""
"thêm vào đó, bảng mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
-#: wt-status.c:2382
+#: wt-status.c:2394
#, c-format
msgid "cannot %s: Your index contains uncommitted changes."
msgstr ""
"không thể %s: Mục lục của bạn có chứa các thay đổi chưa được chuyển giao."
-#: builtin/add.c:24
+#: builtin/add.c:25
msgid "git add [<options>] [--] <pathspec>..."
msgstr "git add [<các-tùy-chọn>] [--] <pathspec>…"
-#: builtin/add.c:83
+#: builtin/add.c:84
#, c-format
msgid "unexpected diff status %c"
msgstr "trạng thái lệnh diff không như mong đợi %c"
-#: builtin/add.c:88 builtin/commit.c:284
+#: builtin/add.c:89 builtin/commit.c:285
msgid "updating files failed"
-msgstr "Cập nhật tập tin gặp lỗi"
+msgstr "cập nhật tập tin gặp lỗi"
-#: builtin/add.c:98
+#: builtin/add.c:99
#, c-format
msgid "remove '%s'\n"
msgstr "gỡ bỏ “%s”\n"
-#: builtin/add.c:173
+#: builtin/add.c:174
msgid "Unstaged changes after refreshing the index:"
msgstr ""
"Đưa ra khỏi bệ phóng các thay đổi sau khi làm tươi mới lại bảng mục lục:"
-#: builtin/add.c:233 builtin/rev-parse.c:895
+#: builtin/add.c:234 builtin/rev-parse.c:896
msgid "Could not read the index"
msgstr "Không thể đọc bảng mục lục"
-#: builtin/add.c:244
+#: builtin/add.c:245
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Không thể mở “%s” để ghi."
-#: builtin/add.c:248
+#: builtin/add.c:249
msgid "Could not write patch"
msgstr "Không thể ghi ra miếng vá"
-#: builtin/add.c:251
+#: builtin/add.c:252
msgid "editing patch failed"
msgstr "gặp lỗi khi sửa miếng vá"
-#: builtin/add.c:254
+#: builtin/add.c:255
#, c-format
msgid "Could not stat '%s'"
msgstr "Không thể lấy thông tin thống kê về “%s”"
-#: builtin/add.c:256
+#: builtin/add.c:257
msgid "Empty patch. Aborted."
msgstr "Miếng vá trống rỗng. Nên bỏ qua."
-#: builtin/add.c:261
+#: builtin/add.c:262
#, c-format
msgid "Could not apply '%s'"
msgstr "Không thể áp dụng miếng vá “%s”"
-#: builtin/add.c:269
+#: builtin/add.c:270
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
"của bạn:\n"
-#: builtin/add.c:289 builtin/clean.c:907 builtin/fetch.c:137 builtin/mv.c:123
-#: builtin/prune-packed.c:56 builtin/pull.c:213 builtin/push.c:557
-#: builtin/remote.c:1345 builtin/rm.c:240 builtin/send-pack.c:165
+#: builtin/add.c:290 builtin/clean.c:908 builtin/fetch.c:137 builtin/mv.c:124
+#: builtin/prune-packed.c:56 builtin/pull.c:214 builtin/push.c:560
+#: builtin/remote.c:1345 builtin/rm.c:241 builtin/send-pack.c:165
msgid "dry run"
msgstr "chạy thử"
-#: builtin/add.c:292
+#: builtin/add.c:293
msgid "interactive picking"
msgstr "sửa bằng cách tương tác"
-#: builtin/add.c:293 builtin/checkout.c:1258 builtin/reset.c:305
+#: builtin/add.c:294 builtin/checkout.c:1304 builtin/reset.c:306
msgid "select hunks interactively"
msgstr "chọn “hunks” theo kiểu tương tác"
-#: builtin/add.c:294
+#: builtin/add.c:295
msgid "edit current diff and apply"
msgstr "sửa diff hiện nay và áp dụng nó"
-#: builtin/add.c:295
+#: builtin/add.c:296
msgid "allow adding otherwise ignored files"
msgstr "cho phép thêm các tập tin bị bỏ qua khác"
-#: builtin/add.c:296
+#: builtin/add.c:297
msgid "update tracked files"
msgstr "cập nhật các tập tin được theo dõi"
-#: builtin/add.c:297
+#: builtin/add.c:298
msgid "renormalize EOL of tracked files (implies -u)"
msgstr "thường hóa lại EOL của các tập tin được theo dõi (ý là -u)"
-#: builtin/add.c:298
+#: builtin/add.c:299
msgid "record only the fact that the path will be added later"
msgstr "chỉ ghi lại sự việc mà đường dẫn sẽ được thêm vào sau"
-#: builtin/add.c:299
+#: builtin/add.c:300
msgid "add changes from all tracked and untracked files"
msgstr ""
"thêm các thay đổi từ tất cả các tập tin có cũng như không được theo dõi dấu "
"vết"
-#: builtin/add.c:302
+#: builtin/add.c:303
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
"lờ đi các đường dẫn bị gỡ bỏ trong cây thư mục làm việc (giống với --no-all)"
-#: builtin/add.c:304
+#: builtin/add.c:305
msgid "don't add, only refresh the index"
msgstr "không thêm, chỉ làm tươi mới bảng mục lục"
-#: builtin/add.c:305
+#: builtin/add.c:306
msgid "just skip files which cannot be added because of errors"
msgstr "chie bỏ qua những tập tin mà nó không thể được thêm vào bởi vì gặp lỗi"
-#: builtin/add.c:306
+#: builtin/add.c:307
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
"kiểm tra xem - thậm chí thiếu - tập tin bị bỏ qua trong quá trình chạy thử"
-#: builtin/add.c:308 builtin/update-index.c:990
+#: builtin/add.c:309 builtin/update-index.c:991
msgid "override the executable bit of the listed files"
msgstr "ghi đè lên bít thi hành của các tập tin được liệt kê"
-#: builtin/add.c:310
+#: builtin/add.c:311
msgid "warn when adding an embedded repository"
msgstr "cảnh báo khi thêm một kho nhúng"
-#: builtin/add.c:325
+#: builtin/add.c:326
#, c-format
msgid ""
"You've added another git repository inside your current repository.\n"
@@ -7319,150 +7752,150 @@ msgstr ""
"\n"
"Xem \"git help submodule\" để biết thêm chi tiết."
-#: builtin/add.c:353
+#: builtin/add.c:354
#, c-format
msgid "adding embedded git repository: %s"
msgstr "thêm cần một kho git nhúng: %s"
-#: builtin/add.c:371
+#: builtin/add.c:372
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Sử dụng tùy chọn -f nếu bạn thực sự muốn thêm chúng vào.\n"
-#: builtin/add.c:379
+#: builtin/add.c:380
msgid "adding files failed"
msgstr "thêm tập tin gặp lỗi"
-#: builtin/add.c:417
+#: builtin/add.c:418
msgid "-A and -u are mutually incompatible"
msgstr "-A và -u xung khắc nhau"
-#: builtin/add.c:424
+#: builtin/add.c:425
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
-#: builtin/add.c:428
+#: builtin/add.c:429
#, c-format
msgid "--chmod param '%s' must be either -x or +x"
msgstr "--chmod tham số “%s” phải hoặc là -x hay +x"
-#: builtin/add.c:443
+#: builtin/add.c:444
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n"
-#: builtin/add.c:444
+#: builtin/add.c:445
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Có lẽ ý bạn là “git add .” phải không?\n"
-#: builtin/am.c:363
+#: builtin/am.c:348
msgid "could not parse author script"
msgstr "không thể phân tích cú pháp văn lệnh tác giả"
-#: builtin/am.c:447
+#: builtin/am.c:432
#, c-format
msgid "'%s' was deleted by the applypatch-msg hook"
msgstr "“%s” bị xóa bởi móc applypatch-msg"
-#: builtin/am.c:488
+#: builtin/am.c:473
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Dòng đầu vào dị hình: “%s”."
-#: builtin/am.c:525
+#: builtin/am.c:510
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Gặp lỗi khi sao chép ghi chú (note) từ “%s” tới “%s”"
-#: builtin/am.c:551
+#: builtin/am.c:536
msgid "fseek failed"
msgstr "fseek gặp lỗi"
-#: builtin/am.c:739
+#: builtin/am.c:724
#, c-format
msgid "could not parse patch '%s'"
msgstr "không thể phân tích cú pháp “%s”"
-#: builtin/am.c:804
+#: builtin/am.c:789
msgid "Only one StGIT patch series can be applied at once"
msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
-#: builtin/am.c:852
+#: builtin/am.c:837
msgid "invalid timestamp"
msgstr "dấu thời gian không hợp lệ"
-#: builtin/am.c:857 builtin/am.c:869
+#: builtin/am.c:842 builtin/am.c:854
msgid "invalid Date line"
msgstr "dòng Ngày tháng không hợp lệ"
-#: builtin/am.c:864
+#: builtin/am.c:849
msgid "invalid timezone offset"
msgstr "độ lệch múi giờ không hợp lệ"
-#: builtin/am.c:957
+#: builtin/am.c:942
msgid "Patch format detection failed."
msgstr "Dò tìm định dạng miếng vá gặp lỗi."
-#: builtin/am.c:962 builtin/clone.c:408
+#: builtin/am.c:947 builtin/clone.c:409
#, c-format
msgid "failed to create directory '%s'"
msgstr "tạo thư mục \"%s\" gặp lỗi"
-#: builtin/am.c:967
+#: builtin/am.c:952
msgid "Failed to split patches."
msgstr "Gặp lỗi khi chia nhỏ các miếng vá."
-#: builtin/am.c:1097 builtin/commit.c:369
+#: builtin/am.c:1082 builtin/commit.c:371
msgid "unable to write index file"
msgstr "không thể ghi tập tin lưu mục lục"
-#: builtin/am.c:1111
+#: builtin/am.c:1096
#, c-format
msgid "When you have resolved this problem, run \"%s --continue\"."
msgstr "Khi bạn đã phân giải xong trục trặc này, hãy chạy \"%s --continue\"."
-#: builtin/am.c:1112
+#: builtin/am.c:1097
#, c-format
msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
msgstr ""
"Nếu bạn muốn bỏ qua miếng vá này, hãy chạy lệnh \"%s --skip\" để thay thế."
-#: builtin/am.c:1113
+#: builtin/am.c:1098
#, c-format
msgid "To restore the original branch and stop patching, run \"%s --abort\"."
msgstr "Để phục hồi lại nhánh gốc và dừng vá, hãy chạy \"%s --abort\"."
-#: builtin/am.c:1196
+#: builtin/am.c:1181
msgid "Patch sent with format=flowed; space at the end of lines might be lost."
msgstr ""
"Miếng vá được gửi với format=flowed; khoảng trống ở cuối của các dòng có thể "
"bị mất."
-#: builtin/am.c:1224
+#: builtin/am.c:1209
msgid "Patch is empty."
msgstr "Miếng vá trống rỗng."
-#: builtin/am.c:1290
+#: builtin/am.c:1275
#, c-format
msgid "invalid ident line: %.*s"
msgstr "dòng thụt lề không hợp lệ: %.*s"
-#: builtin/am.c:1312
+#: builtin/am.c:1297
#, c-format
msgid "unable to parse commit %s"
msgstr "không thể phân tích lần chuyển giao “%s”"
-#: builtin/am.c:1508
+#: builtin/am.c:1493
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên “3-way merge”."
-#: builtin/am.c:1510
+#: builtin/am.c:1495
msgid "Using index info to reconstruct a base tree..."
msgstr ""
"Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở…"
-#: builtin/am.c:1529
+#: builtin/am.c:1514
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -7470,29 +7903,29 @@ msgstr ""
"Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
"Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
-#: builtin/am.c:1535
+#: builtin/am.c:1520
msgid "Falling back to patching base and 3-way merge..."
msgstr "Đang trở lại để vá cơ sở và “hòa trộn 3-đường”…"
-#: builtin/am.c:1561
+#: builtin/am.c:1546
msgid "Failed to merge in the changes."
msgstr "Gặp lỗi khi trộn vào các thay đổi."
-#: builtin/am.c:1593
+#: builtin/am.c:1578
msgid "applying to an empty history"
msgstr "áp dụng vào một lịch sử trống rỗng"
-#: builtin/am.c:1639 builtin/am.c:1643
+#: builtin/am.c:1624 builtin/am.c:1628
#, c-format
msgid "cannot resume: %s does not exist."
msgstr "không thể phục hồi: %s không tồn tại."
-#: builtin/am.c:1659
+#: builtin/am.c:1644
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
-"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
+"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối."
-#: builtin/am.c:1664
+#: builtin/am.c:1649
msgid "Commit Body is:"
msgstr "Thân của lần chuyển giao là:"
@@ -7500,36 +7933,36 @@ msgstr "Thân của lần chuyển giao là:"
#. in your translation. The program will only accept English
#. input at this point.
#.
-#: builtin/am.c:1674
+#: builtin/am.c:1659
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
msgstr ""
"Áp dụng? đồng ý [y]/khô[n]g/chỉnh sửa [e]/hiển thị miếng [v]á/chấp nhận tất "
"cả [a]: "
-#: builtin/am.c:1724
+#: builtin/am.c:1709
#, c-format
msgid "Dirty index: cannot apply patches (dirty: %s)"
msgstr "Bảng mục lục bẩn: không thể áp dụng các miếng vá (bẩn: %s)"
-#: builtin/am.c:1764 builtin/am.c:1832
+#: builtin/am.c:1749 builtin/am.c:1817
#, c-format
msgid "Applying: %.*s"
msgstr "Áp dụng: %.*s"
-#: builtin/am.c:1781
+#: builtin/am.c:1766
msgid "No changes -- Patch already applied."
msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
-#: builtin/am.c:1787
+#: builtin/am.c:1772
#, c-format
msgid "Patch failed at %s %.*s"
msgstr "Gặp lỗi khi vá tại %s %.*s"
-#: builtin/am.c:1791
+#: builtin/am.c:1776
msgid "Use 'git am --show-current-patch' to see the failed patch"
msgstr "Dùng “git am --show-current-patch” để xem miếng vá bị lỗi"
-#: builtin/am.c:1835
+#: builtin/am.c:1820
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -7540,7 +7973,7 @@ msgstr ""
"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
"vá này."
-#: builtin/am.c:1842
+#: builtin/am.c:1827
msgid ""
"You still have unmerged paths in your index.\n"
"You should 'git add' each file with resolved conflicts to mark them as "
@@ -7553,17 +7986,17 @@ msgstr ""
"Bạn có lẽ muốn chạy “git rm“ trên một tập tin để chấp nhận \"được xóa bởi họ"
"\" cho nó."
-#: builtin/am.c:1949 builtin/am.c:1953 builtin/am.c:1965 builtin/reset.c:328
-#: builtin/reset.c:336
+#: builtin/am.c:1934 builtin/am.c:1938 builtin/am.c:1950 builtin/reset.c:329
+#: builtin/reset.c:337
#, c-format
msgid "Could not parse object '%s'."
-msgstr "không thể phân tích đối tượng “%s”."
+msgstr "Không thể phân tích đối tượng “%s”."
-#: builtin/am.c:2001
+#: builtin/am.c:1986
msgid "failed to clean index"
msgstr "gặp lỗi khi dọn bảng mục lục"
-#: builtin/am.c:2036
+#: builtin/am.c:2030
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -7571,144 +8004,144 @@ msgstr ""
"Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am” thất bại cuối cùng.\n"
"Không thể chuyển tới ORIG_HEAD"
-#: builtin/am.c:2129
+#: builtin/am.c:2123
#, c-format
msgid "Invalid value for --patch-format: %s"
msgstr "Giá trị không hợp lệ cho --patch-format: %s"
-#: builtin/am.c:2165
+#: builtin/am.c:2159
msgid "git am [<options>] [(<mbox> | <Maildir>)...]"
msgstr "git am [<các-tùy-chọn>] [(<mbox>|<Maildir>)…]"
-#: builtin/am.c:2166
+#: builtin/am.c:2160
msgid "git am [<options>] (--continue | --skip | --abort)"
msgstr "git am [<các-tùy-chọn>] (--continue | --skip | --abort)"
-#: builtin/am.c:2172
+#: builtin/am.c:2166
msgid "run interactively"
msgstr "chạy kiểu tương tác"
-#: builtin/am.c:2174
+#: builtin/am.c:2168
msgid "historical option -- no-op"
msgstr "tùy chọn lịch sử -- không-toán-tử"
-#: builtin/am.c:2176
+#: builtin/am.c:2170
msgid "allow fall back on 3way merging if needed"
msgstr "cho phép quay trở lại để hòa trộn kiểu “3way” nếu cần"
-#: builtin/am.c:2177 builtin/init-db.c:486 builtin/prune-packed.c:58
+#: builtin/am.c:2171 builtin/init-db.c:486 builtin/prune-packed.c:58
#: builtin/repack.c:306
msgid "be quiet"
msgstr "im lặng"
-#: builtin/am.c:2179
+#: builtin/am.c:2173
msgid "add a Signed-off-by line to the commit message"
-msgstr "Thêm dòng Signed-off-by cho ghi chú của lần chuyển giao"
+msgstr "thêm dòng Signed-off-by cho ghi chú của lần chuyển giao"
-#: builtin/am.c:2182
+#: builtin/am.c:2176
msgid "recode into utf8 (default)"
msgstr "chuyển mã thành utf8 (mặc định)"
-#: builtin/am.c:2184
+#: builtin/am.c:2178
msgid "pass -k flag to git-mailinfo"
msgstr "chuyển cờ -k cho git-mailinfo"
-#: builtin/am.c:2186
+#: builtin/am.c:2180
msgid "pass -b flag to git-mailinfo"
msgstr "chuyển cờ -b cho git-mailinfo"
-#: builtin/am.c:2188
+#: builtin/am.c:2182
msgid "pass -m flag to git-mailinfo"
msgstr "chuyển cờ -m cho git-mailinfo"
-#: builtin/am.c:2190
+#: builtin/am.c:2184
msgid "pass --keep-cr flag to git-mailsplit for mbox format"
msgstr "chuyển cờ --keep-cr cho git-mailsplit với định dạng mbox"
-#: builtin/am.c:2193
+#: builtin/am.c:2187
msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
msgstr ""
"đừng chuyển cờ --keep-cr cho git-mailsplit không phụ thuộc vào am.keepcr"
-#: builtin/am.c:2196
+#: builtin/am.c:2190
msgid "strip everything before a scissors line"
msgstr "cắt mọi thứ trước dòng scissors"
-#: builtin/am.c:2198 builtin/am.c:2201 builtin/am.c:2204 builtin/am.c:2207
-#: builtin/am.c:2210 builtin/am.c:2213 builtin/am.c:2216 builtin/am.c:2219
-#: builtin/am.c:2225
+#: builtin/am.c:2192 builtin/am.c:2195 builtin/am.c:2198 builtin/am.c:2201
+#: builtin/am.c:2204 builtin/am.c:2207 builtin/am.c:2210 builtin/am.c:2213
+#: builtin/am.c:2219
msgid "pass it through git-apply"
msgstr "chuyển nó qua git-apply"
-#: builtin/am.c:2215 builtin/commit.c:1340 builtin/fmt-merge-msg.c:671
-#: builtin/fmt-merge-msg.c:674 builtin/grep.c:868 builtin/merge.c:239
-#: builtin/pull.c:151 builtin/pull.c:209 builtin/rebase.c:854
+#: builtin/am.c:2209 builtin/commit.c:1343 builtin/fmt-merge-msg.c:671
+#: builtin/fmt-merge-msg.c:674 builtin/grep.c:879 builtin/merge.c:240
+#: builtin/pull.c:152 builtin/pull.c:210 builtin/rebase.c:1062
#: builtin/repack.c:317 builtin/repack.c:321 builtin/repack.c:323
#: builtin/show-branch.c:651 builtin/show-ref.c:171 builtin/tag.c:386
-#: parse-options.h:144 parse-options.h:146 parse-options.h:268
+#: parse-options.h:144 parse-options.h:146 parse-options.h:266
msgid "n"
msgstr "n"
-#: builtin/am.c:2221 builtin/branch.c:637 builtin/for-each-ref.c:38
+#: builtin/am.c:2215 builtin/branch.c:637 builtin/for-each-ref.c:38
#: builtin/replace.c:544 builtin/tag.c:422 builtin/verify-tag.c:39
msgid "format"
msgstr "định dạng"
-#: builtin/am.c:2222
+#: builtin/am.c:2216
msgid "format the patch(es) are in"
msgstr "định dạng (các) miếng vá theo"
-#: builtin/am.c:2228
+#: builtin/am.c:2222
msgid "override error message when patch failure occurs"
msgstr "đè lên các lời nhắn lỗi khi xảy ra lỗi vá nghiêm trọng"
-#: builtin/am.c:2230
+#: builtin/am.c:2224
msgid "continue applying patches after resolving a conflict"
msgstr "tiếp tục áp dụng các miếng vá sau khi giải quyết xung đột"
-#: builtin/am.c:2233
+#: builtin/am.c:2227
msgid "synonyms for --continue"
msgstr "đồng nghĩa với --continue"
-#: builtin/am.c:2236
+#: builtin/am.c:2230
msgid "skip the current patch"
msgstr "bỏ qua miếng vá hiện hành"
-#: builtin/am.c:2239
+#: builtin/am.c:2233
msgid "restore the original branch and abort the patching operation."
msgstr "phục hồi lại nhánh gốc và loại bỏ thao tác vá."
-#: builtin/am.c:2242
+#: builtin/am.c:2236
msgid "abort the patching operation but keep HEAD where it is."
msgstr "bỏ qua thao tác vá nhưng vẫn giữ HEAD chỉ đến nó."
-#: builtin/am.c:2245
+#: builtin/am.c:2239
msgid "show the patch being applied."
msgstr "hiển thị miếng vá đã được áp dụng rồi."
-#: builtin/am.c:2249
+#: builtin/am.c:2243
msgid "lie about committer date"
msgstr "nói dối về ngày chuyển giao"
-#: builtin/am.c:2251
+#: builtin/am.c:2245
msgid "use current timestamp for author date"
msgstr "dùng dấu thời gian hiện tại cho ngày tác giả"
-#: builtin/am.c:2253 builtin/commit.c:1483 builtin/merge.c:273
-#: builtin/pull.c:184 builtin/rebase.c:898 builtin/rebase--interactive.c:183
-#: builtin/revert.c:113 builtin/tag.c:402
+#: builtin/am.c:2247 builtin/commit.c:1486 builtin/merge.c:274
+#: builtin/pull.c:185 builtin/rebase.c:1106 builtin/rebase--interactive.c:185
+#: builtin/revert.c:114 builtin/tag.c:402
msgid "key-id"
msgstr "mã-số-khóa"
-#: builtin/am.c:2254 builtin/rebase.c:899 builtin/rebase--interactive.c:184
+#: builtin/am.c:2248 builtin/rebase.c:1107 builtin/rebase--interactive.c:186
msgid "GPG-sign commits"