diff options
126 files changed, 7810 insertions, 2497 deletions
diff --git a/.gitignore b/.gitignore index a188a82bb1..f702415c12 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,7 @@ /git-remote-fd /git-remote-ext /git-remote-testgit +/git-remote-testsvn /git-repack /git-replace /git-repo-config diff --git a/Documentation/RelNotes/1.5.2.1.txt b/Documentation/RelNotes/1.5.2.1.txt index ebf20e22a7..d41984df0b 100644 --- a/Documentation/RelNotes/1.5.2.1.txt +++ b/Documentation/RelNotes/1.5.2.1.txt @@ -45,9 +45,3 @@ Fixes since v1.5.2 - git-fastimport --import-marks was broken; fixed. - A lot of documentation updates, clarifications and fixes. - --- -exec >/var/tmp/1 -O=v1.5.2-65-g996e2d6 -echo O=`git describe refs/heads/maint` -git shortlog --no-merges $O..refs/heads/maint diff --git a/Documentation/RelNotes/1.6.0.2.txt b/Documentation/RelNotes/1.6.0.2.txt index e1e24b3295..7d8fb85e1b 100644 --- a/Documentation/RelNotes/1.6.0.2.txt +++ b/Documentation/RelNotes/1.6.0.2.txt @@ -79,9 +79,3 @@ Fixes since v1.6.0.1 packfile. Also contains many documentation updates. - --- -exec >/var/tmp/1 -O=v1.6.0.1-78-g3632cfc -echo O=$(git describe maint) -git shortlog --no-merges $O..maint diff --git a/Documentation/RelNotes/1.6.1.3.txt b/Documentation/RelNotes/1.6.1.3.txt index 6f0bde156a..cd08d8174e 100644 --- a/Documentation/RelNotes/1.6.1.3.txt +++ b/Documentation/RelNotes/1.6.1.3.txt @@ -26,7 +26,3 @@ Fixes since v1.6.1.2 * RPM binary package installed the html manpages in a wrong place. Also includes minor documentation fixes and updates. - - --- -git shortlog --no-merges v1.6.1.2-33-gc789350.. diff --git a/Documentation/RelNotes/1.6.1.4.txt b/Documentation/RelNotes/1.6.1.4.txt index 0ce6316d75..ccbad794c0 100644 --- a/Documentation/RelNotes/1.6.1.4.txt +++ b/Documentation/RelNotes/1.6.1.4.txt @@ -39,6 +39,3 @@ Fixes since v1.6.1.3 This fix was first merged to 1.6.2.3. Also includes minor documentation fixes and updates. - --- -git shortlog --no-merges v1.6.1.3.. diff --git a/Documentation/RelNotes/1.6.1.txt b/Documentation/RelNotes/1.6.1.txt index adb7ccab0a..7b152a6fdc 100644 --- a/Documentation/RelNotes/1.6.1.txt +++ b/Documentation/RelNotes/1.6.1.txt @@ -278,9 +278,3 @@ release, unless otherwise noted. * "gitweb" did not mark non-ASCII characters imported from external HTML fragments correctly. - --- -exec >/var/tmp/1 -O=v1.6.1-rc3-74-gf66bc5f -echo O=$(git describe master) -git shortlog --no-merges $O..master ^maint diff --git a/Documentation/RelNotes/1.7.12.3.txt b/Documentation/RelNotes/1.7.12.3.txt index 8d4f879458..ecda427a35 100644 --- a/Documentation/RelNotes/1.7.12.3.txt +++ b/Documentation/RelNotes/1.7.12.3.txt @@ -4,6 +4,18 @@ Git 1.7.12.3 Release Notes Fixes since v1.7.12.2 --------------------- + * "git am" mishandled a patch attached as application/octet-stream + (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not + honored correctly. + + * It was unclear in the documentation for "git blame" that it is + unnecessary for users to use the "--follow" option. + + * A repository created with "git clone --single" had its fetch + refspecs set up just like a clone without "--single", leading the + subsequent "git fetch" to slurp all the other branches, defeating + the whole point of specifying "only this branch". + * "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted. @@ -12,6 +24,10 @@ Fixes since v1.7.12.2 is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header. + * "git receive-pack" (the counterpart to "git push") did not give + progress output while processing objects it received to the puser + when run over the smart-http protocol. + * "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn't. diff --git a/Documentation/RelNotes/1.7.12.4.txt b/Documentation/RelNotes/1.7.12.4.txt new file mode 100644 index 0000000000..c6da3cc939 --- /dev/null +++ b/Documentation/RelNotes/1.7.12.4.txt @@ -0,0 +1,23 @@ +Git 1.7.12.4 Release Notes +========================== + +Fixes since v1.7.12.3 +--------------------- + + * "git fetch" over the dumb-http revision walker could segfault when + curl's multi interface was used. + + * It was possible to give specific paths for "asciidoc" and other + tools in the documentation toolchain, but not for "xmlto". + + * "gitweb" did not give the correct committer timezone in its feed + output due to a typo. + + * The "-Xours" (and similarly -Xtheirs) backend option to "git + merge -s recursive" was ignored for binary files. Now it is + honored. + + * The "binary" synthetic attribute made "diff" to treat the path as + binary, but not "merge". + +Also contains many documentation updates. diff --git a/Documentation/RelNotes/1.8.0.txt b/Documentation/RelNotes/1.8.0.txt index 2528bc379a..43883c14f0 100644 --- a/Documentation/RelNotes/1.8.0.txt +++ b/Documentation/RelNotes/1.8.0.txt @@ -4,16 +4,18 @@ Git v1.8.0 Release Notes Backward compatibility notes ---------------------------- -In the next major release, we will change the behavior of the "git -push" command. When "git push [$there]" does not say what to push, we -have used the traditional "matching" semantics so far (all your branches were -sent to the remote as long as there already are branches of the same -name over there). We will now use the "simple" semantics, that pushes the -current branch to the branch with the same name only when the current +In the next major release (not *this* one), we will change the +behavior of the "git push" command. + +When "git push [$there]" does not say what to push, we have used the +traditional "matching" semantics so far (all your branches were sent +to the remote as long as there already are branches of the same name +over there). We will use the "simple" semantics that pushes the +current branch to the branch with the same name, only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this, and "git push" will warn about the upcoming change until you set this -variable. +variable in this release. "git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has @@ -35,7 +37,7 @@ UI, Workflows & Features * When "git am" sanitizes the "Subject:" line, we strip the prefix from "Re: subject" and also from a less common "re: subject", but left - the even less common "RE: subject" intact. We strip that now, too. + the even less common "RE: subject" intact. Now we strip that too. * It was tempting to say "git branch --set-upstream origin/master", but that tells Git to arrange the local branch "origin/master" to @@ -62,6 +64,8 @@ UI, Workflows & Features * "git grep" learned to use a non-standard pattern type by default if a configuration variable tells it to. + * Accumulated updates to "git gui" has been merged. + * "git log -g" learned the "--grep-reflog=<pattern>" option to limit its output to commits with a reflog message that matches the given pattern. @@ -73,9 +77,6 @@ UI, Workflows & Features with the mergetool.$name.cmd configuration variable even for built-in mergetool backends. - * The "-Xours" backend option to "git merge -s recursive" now takes - effect even on binary files. - * "git rebase -i" learned the "--edit-todo" option to open an editor to edit the instruction sheet. @@ -88,7 +89,7 @@ Foreign Interface encountering a conflict during "p4 submit". -Performance, Internal Implementation, etc. (please report possible regressions) +Performance, Internal Implementation, etc. * Git ships with a fall-back regexp implementation for platforms with buggy regexp library, but it was easy for people to keep using their @@ -153,10 +154,9 @@ to them for details). * When "git am" is fed an input that has multiple "Content-type: ..." header, it did not grok charset= attribute correctly. - * A patch attached as application/octet-stream (e.g. not text/*) were - mishandled, not correctly honoring Content-Transfer-Encoding - (e.g. base64). - (merge 9d55b2e lt/mailinfo-handle-attachment-more-sanely later to maint). + * "git am" mishandled a patch attached as application/octet-stream + (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not + honored correctly. * "git blame MAKEFILE" run in a history that has "Makefile" but not "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got @@ -169,7 +169,6 @@ to them for details). * It was unclear in the documentation for "git blame" that it is unnecessary for users to use the "--follow" option. - (merge e5dce96 jc/blame-follows-renames later to maint). * Output from "git branch -v" contains "(no branch)" that could be localized, but the code to align it along with the names of @@ -184,7 +183,6 @@ to them for details). refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch". - (merge 31b808a rt/maint-clone-single later to maint). * Documentation talked about "first line of commit log" when it meant the title of the commit. The description was clarified by defining @@ -208,12 +206,13 @@ to them for details). * "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted. - (merge 6ac964a sp/maint-http-info-refs-no-retry later to maint). * "git fetch" over http advertised that it supports "deflate", which is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header. - (merge aa90b96 sp/maint-http-enable-gzip later to maint). + + * "git fetch" over the dumb-http revision walker could segfault when + curl's multi interface was used. * "git gc --auto" notified the user that auto-packing has triggered even under the "--quiet" option. @@ -227,13 +226,15 @@ to them for details). --author or --committer, it showed commits that mention either A or B (or both) instead. + * The "-Xours" backend option to "git merge -s recursive" was ignored + for binary files. + * "git p4", when "--use-client-spec" and "--detect-branches" are used together, misdetected branches. * "git receive-pack" (the counterpart to "git push") did not give progress output while processing objects it received to the puser when run over the smart-http protocol. - (merge 74eb32d jk/receive-pack-unpack-error-to-pusher later to maint). * When you misspell the command name you give to the "exec" action in the "git rebase -i" instruction sheet you were told that 'rebase' is not a @@ -258,8 +259,9 @@ to them for details). * "git submodule frotz" was not diagnosed as "frotz" being an unknown subcommand to "git submodule"; the user instead got a complaint that "git submodule status" was run with an unknown path "frotz". - (merge af9c9f9 rr/maint-submodule-unknown-cmd later to maint). * "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn't. - (merge 8f6811e os/commit-submodule-ignore later to maint). + + * "gitweb" did not give the correct committer timezone in its feed + output due to a typo. diff --git a/Documentation/config.txt b/Documentation/config.txt index 11f320b962..9a0544cf1f 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -538,14 +538,14 @@ core.pager:: `LESS` variable to some other value. Alternately, these settings can be overridden on a project or global basis by setting the `core.pager` option. - Setting `core.pager` has no affect on the `LESS` + Setting `core.pager` has no effect on the `LESS` environment variable behaviour above, so if you want to override git's default settings this way, you need to be explicit. For example, to disable the S option in a backward compatible manner, set `core.pager` - to `less -+$LESS -FRX`. This will be passed to the - shell by git, which will translate the final command to - `LESS=FRSX less -+FRSX -FRX`. + to `less -+S`. This will be passed to the shell by + git, which will translate the final command to + `LESS=FRSX less -+S`. core.whitespace:: A comma separated list of common whitespace problems to diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt index 67a90a828c..75ab8a51ca 100644 --- a/Documentation/diff-config.txt +++ b/Documentation/diff-config.txt @@ -56,6 +56,10 @@ diff.statGraphWidth:: Limit the width of the graph part in --stat output. If set, applies to all commands generating --stat output except format-patch. +diff.context:: + Generate diffs with <n> lines of context instead of the default of + 3. This value is overridden by the -U option. + diff.external:: If this config variable is set, diff generation is not performed using the internal diff machinery, but using the diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 6d98ef3d2a..7fefdb0384 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -196,9 +196,9 @@ objects from the source repository into a pack in the cloned repository. `--no-single-branch` is given to fetch the histories near the tips of all branches. Further fetches into the resulting repository will only update the - remote tracking branch for the branch this option was used for the + remote-tracking branch for the branch this option was used for the initial cloning. If the HEAD at the remote did not point at any - branch when `--single-branch` clone was made, no remote tracking + branch when `--single-branch` clone was made, no remote-tracking branch is created. --recursive:: diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 9594ac8e9d..0295890621 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -13,7 +13,7 @@ SYNOPSIS [-F <file> | -m <msg>] [--reset-author] [--allow-empty] [--allow-empty-message] [--no-verify] [-e] [--author=<author>] [--date=<date>] [--cleanup=<mode>] [--status | --no-status] - [-i | -o] [--] [<file>...] + [-i | -o] [-S[<keyid>]] [--] [<file>...] DESCRIPTION ----------- @@ -109,6 +109,10 @@ OPTIONS format. See linkgit:git-status[1] for details. Implies `--dry-run`. +--long:: + When doing a dry-run, give the output in a the long-format. + Implies `--dry-run`. + -z:: --null:: When showing `short` or `porcelain` status output, terminate @@ -276,6 +280,10 @@ configuration variable documented in linkgit:git-config[1]. commit message template when using an editor to prepare the default commit message. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: + GPG-sign commit. + \--:: Do not interpret any more arguments as options. diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index 20f9228511..d34ea3c50b 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -99,7 +99,7 @@ commit or stash your changes before running 'git merge'. more than two parents (affectionately called an Octopus merge). + If no commit is given from the command line, and if `merge.defaultToUpstream` -configuration variable is set, merge the remote tracking branches +configuration variable is set, merge the remote-tracking branches that the current branch is configured to use as its upstream. See also the configuration section of this manual page. diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 22d2580129..fe46c4258a 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -175,7 +175,7 @@ useful if you write an alias or script around 'git push'. --recurse-submodules=check|on-demand:: Make sure all submodule commits used by the revisions to be - pushed are available on a remote tracking branch. If 'check' is + pushed are available on a remote-tracking branch. If 'check' is used git will verify that all submodule commits that changed in the revisions to be pushed are available on at least one remote of the submodule. If any commits are missing the push will be diff --git a/Documentation/git-remote-helpers.txt b/Documentation/git-remote-helpers.txt index f5836e46d0..5ce4cda8e7 100644 --- a/Documentation/git-remote-helpers.txt +++ b/Documentation/git-remote-helpers.txt @@ -98,6 +98,20 @@ advertised with this capability must cover all refs reported by the list command. If no 'refspec' capability is advertised, there is an implied `refspec *:*`. +'bidi-import':: + The fast-import commands 'cat-blob' and 'ls' can be used by remote-helpers + to retrieve information about blobs and trees that already exist in + fast-import's memory. This requires a channel from fast-import to the + remote-helper. + If it is advertised in addition to "import", git establishes a pipe from + fast-import to the remote-helper's stdin. + It follows that git and fast-import are both connected to the + remote-helper's stdin. Because git can send multiple commands to + the remote-helper it is required that helpers that use 'bidi-import' + buffer all 'import' commands of a batch before sending data to fast-import. + This is to prevent mixing commands and fast-import responses on the + helper's stdin. + Capabilities for Pushing ~~~~~~~~~~~~~~~~~~~~~~~~ 'connect':: @@ -286,7 +300,12 @@ terminated with a blank line. For each batch of 'import', the remote helper should produce a fast-import stream terminated by a 'done' command. + -Supported if the helper has the "import" capability. +Note that if the 'bidi-import' capability is used the complete batch +sequence has to be buffered before starting to send data to fast-import +to prevent mixing of commands and fast-import responses on the helper's +stdin. ++ +Supported if the helper has the 'import' capability. 'connect' <service>:: Connects to given service. Standard input and standard output diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 117e3743a6..978d8da50c 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git reset' [-q] [<commit>] [--] <paths>... 'git reset' (--patch | -p) [<commit>] [--] [<paths>...] -'git reset' (--soft | --mixed | --hard | --merge | --keep) [-q] [<commit>] +'git reset' [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>] DESCRIPTION ----------- @@ -43,11 +43,11 @@ This means that `git reset -p` is the opposite of `git add -p`, i.e. you can use it to selectively reset hunks. See the ``Interactive Mode'' section of linkgit:git-add[1] to learn how to operate the `--patch` mode. -'git reset' --<mode> [<commit>]:: +'git reset' [<mode>] [<commit>]:: This form resets the current branch head to <commit> and possibly updates the index (resetting it to the tree of <commit>) and - the working tree depending on <mode>, which - must be one of the following: + the working tree depending on <mode>. If <mode> is omitted, + defaults to "--mixed". The <mode> must be one of the following: + -- --soft:: diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt index 5d31860eb1..882cb1171b 100644 --- a/Documentation/git-rm.txt +++ b/Documentation/git-rm.txt @@ -107,6 +107,21 @@ as well as modifications of existing paths. Typically you would first remove all tracked files from the working tree using this command: +Submodules +~~~~~~~~~~ +Only submodules using a gitfile (which means they were cloned +with a git version 1.7.8 or newer) will be removed from the work +tree, as their repository lives inside the .git directory of the +superproject. If a submodule (or one of those nested inside it) +still uses a .git directory, `git rm` will fail - no matter if forced +or not - to protect the submodule's history. + +A submodule is considered up-to-date when the HEAD is the same as +recorded in the index, no tracked files are modified and no untracked +files that aren't ignored are present in the submodules work tree. +Ignored files are deemed expendable and won't stop a submodule's work +tree from being removed. + ---------------- git ls-files -z | xargs -0 rm -f ---------------- diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 67e5f53a9e..9f1ef9a463 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -38,6 +38,9 @@ OPTIONS across git versions and regardless of user configuration. See below for details. +--long:: + Give the output in the long-format. This is the default. + -u[<mode>]:: --untracked-files[=<mode>]:: Show untracked files. diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index b4683bba1b..1d6527ab9f 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -9,7 +9,7 @@ git-submodule - Initialize, update or inspect submodules SYNOPSIS -------- [verse] -'git submodule' [--quiet] add [-b branch] [-f|--force] +'git submodule' [--quiet] add [-b branch] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>] 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...] 'git submodule' [--quiet] init [--] [<path>...] @@ -265,6 +265,11 @@ OPTIONS Initialize all submodules for which "git submodule init" has not been called so far before updating. +--name:: + This option is only valid for the add command. It sets the submodule's + name to the given string instead of defaulting to its path. The name + must be valid as a directory name and may not end with a '/'. + --reference <repository>:: This option is only valid for add and update commands. These commands sometimes need to clone a remote repository. In this case, diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index cfe8d2b5df..8b0d3adfed 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -146,6 +146,13 @@ Skip "branches" and "tags" of first level directories;; ------------------------------------------------------------------------ -- +--log-window-size=<n>;; + Fetch <n> log entries per request when scanning Subversion history. + The default is 100. For very large Subversion repositories, larger + values may be needed for 'clone'/'fetch' to complete in reasonable + time. But overly large values may lead to higher memory usage and + request timeouts. + 'clone':: Runs 'init' and 'fetch'. It will automatically create a directory based on the basename of the URL passed to it; diff --git a/Documentation/git.txt b/Documentation/git.txt index 48bd04e22d..4a89a12513 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,16 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.7.12.2/git.html[documentation for release 1.7.12.2] +* link:v1.8.0/git.html[documentation for release 1.8.0] * release notes for + link:RelNotes/1.8.0.txt[1.8.0], + +* link:v1.7.12.4/git.html[documentation for release 1.7.12.4] + +* release notes for + link:RelNotes/1.7.12.4.txt[1.7.12.4], + link:RelNotes/1.7.12.3.txt[1.7.12.3], link:RelNotes/1.7.12.2.txt[1.7.12.2], link:RelNotes/1.7.12.1.txt[1.7.12.1], link:RelNotes/1.7.12.txt[1.7.12]. diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index 99ed04d7ab..2698f63cf9 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -56,6 +56,7 @@ When more than one pattern matches the path, a later line overrides an earlier line. This overriding is done per attribute. The rules how the pattern matches paths are the same as in `.gitignore` files; see linkgit:gitignore[5]. +Unlike `.gitignore`, negative patterns are forbidden. When deciding what attributes are assigned to a path, git consults `$GIT_DIR/info/attributes` file (which has the highest @@ -66,6 +67,11 @@ is from the path in question, the lower its precedence). Finally global and system-wide files are considered (they have the lowest precedence). +When the `.gitattributes` file is missing from the work tree, the +path in the index is used as a fall-back. During checkout process, +`.gitattributes` in the index is used and then the file in the +working tree is used as a fall-back. + If you wish to affect only a single repository (i.e., to assign attributes to files that are particular to one user's workflow for that repository), then diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt index f6ba90c2da..3bc1500eda 100644 --- a/Documentation/gitcli.txt +++ b/Documentation/gitcli.txt @@ -93,7 +93,7 @@ ENHANCED OPTION PARSER From the git 1.5.4 series and further, many git commands (not all of them at the time of the writing though) come with an enhanced option parser. -Here is an exhaustive list of the facilities provided by this option parser. +Here is a list of the facilities provided by this option parser. Magic Options @@ -137,6 +137,16 @@ options. This means that you can for example use `git rm -rf` or `git clean -fdx`. +Abbreviating long options +~~~~~~~~~~~~~~~~~~~~~~~~~ +Commands that support the enhanced option parser accepts unique +prefix of a long option as if it is fully spelled out, but use this +with a caution. For example, `git commit --amen` behaves as if you +typed `git commit --amend`, but that is true only until a later version +of Git introduces another option that shares the same prefix, +e.g `git commit --amenity" option. + + Separating argument from the option ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can write the mandatory option parameter to an option as a separate diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 96639e02bd..1b82fe1969 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -74,11 +74,15 @@ PATTERN FORMAT for readability. - A line starting with # serves as a comment. + Put a backslash ("`\`") in front of the first hash for patterns + that begin with a hash. - - An optional prefix '!' which negates the pattern; any + - An optional prefix "`!`" which negates the pattern; any matching file excluded by a previous pattern will become included again. If a negated pattern matches, this will override lower precedence patterns sources. + Put a backslash ("`\`") in front of the first "`!`" for patterns + that begin with a literal "`!`", for example, "`\!important!.txt`". - If the pattern ends with a slash, it is removed for the purpose of the following description, but it would only find diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index 4effd78902..ab3e91c054 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -18,7 +18,9 @@ working tree, is a text file with a syntax matching the requirements of linkgit:git-config[1]. The file contains one subsection per submodule, and the subsection value -is the name of the submodule. Each submodule section also contains the +is the name of the submodule. The name is set to the path where the +submodule has been added unless it was customized with the '--name' +option of 'git submodule add'. Each submodule section also contains the following required keys: submodule.<name>.path:: diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index 5c891f1169..9f628862b4 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -93,6 +93,12 @@ refs/remotes/`name`:: records tip-of-the-tree commit objects of branches copied from a remote repository. +refs/replace/`<obj-sha1>`:: + records the SHA1 of the object that replaces `<obj-sha1>`. + This is similar to info/grafts and is internally used and + maintained by linkgit:git-replace[1]. Such refs can be exchanged + between repositories while grafts are not. + packed-refs:: records the same information as refs/heads/, refs/tags/, and friends record in a more efficient way. See diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt index 861bd6f553..9bb4956ccd 100644 --- a/Documentation/merge-config.txt +++ b/Documentation/merge-config.txt @@ -9,11 +9,11 @@ merge.conflictstyle:: merge.defaultToUpstream:: If merge is called without any commit argument, merge the upstream branches configured for the current branch by using their last - observed values stored in their remote tracking branches. + observed values stored in their remote-tracking branches. The values of the `branch.<current branch>.merge` that name the branches at the remote named by `branch.<current branch>.remote` are consulted, and then they are mapped via `remote.<remote>.fetch` - to their corresponding remote tracking branches, and the tips of + to their corresponding remote-tracking branches, and the tips of these tracking branches are merged. merge.ff:: diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index ee497430cb..1ec14a068e 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -79,6 +79,11 @@ if it is part of the log message. Match the regexp limiting patterns without regard to letters case. +--basic-regexp:: + + Consider the limiting patterns to be basic regular expressions; + this is the default. + -E:: --extended-regexp:: @@ -91,6 +96,11 @@ if it is part of the log message. Consider the limiting patterns to be fixed strings (don't interpret pattern as a regular expression). +--perl-regexp:: + + Consider the limiting patterns to be Perl-compatible regexp. + Requires libpcre to be compiled in. + --remove-empty:: Stop when a given path disappears from the tree. diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt index 1a797812fb..a959517b23 100644 --- a/Documentation/technical/api-argv-array.txt +++ b/Documentation/technical/api-argv-array.txt @@ -53,3 +53,11 @@ Functions `argv_array_clear`:: Free all memory associated with the array and return it to the initial, empty state. + +`argv_array_detach`:: + Detach the argv array from the `struct argv_array`, transfering + ownership of the allocated array and strings. + +`argv_array_free_detached`:: + Free the memory allocated by a `struct argv_array` that was later + detached and is now no longer needed. diff --git a/Documentation/urls.txt b/Documentation/urls.txt index 289019478d..1d15ee7e52 100644 --- a/Documentation/urls.txt +++ b/Documentation/urls.txt @@ -6,8 +6,12 @@ address of the remote server, and the path to the repository. Depending on the transport protocol, some of this information may be absent. -Git natively supports ssh, git, http, https, ftp, ftps, and rsync -protocols. The following syntaxes may be used with them: +Git supports ssh, git, http, and https protocols (in addition, ftp, +and ftps can be used for fetching and rsync can be used for fetching +and pushing, but these are inefficient and deprecated; do not use +them). + +The following syntaxes may be used with them: - ssh://{startsb}user@{endsb}host.xz{startsb}:port{endsb}/path/to/repo.git/ - git://host.xz{startsb}:port{endsb}/path/to/repo.git/ diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 7f71eefd43..b09d264a86 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.8.0-rc0 +DEF_VER=v1.8.0 LF=' ' @@ -495,6 +495,7 @@ PROGRAM_OBJS += sh-i18n--envsubst.o PROGRAM_OBJS += shell.o PROGRAM_OBJS += show-index.o PROGRAM_OBJS += upload-pack.o +PROGRAM_OBJS += remote-testsvn.o # Binary suffix, set to .exe for Windows builds X = @@ -2449,6 +2450,10 @@ git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) +git-remote-testsvn$X: remote-testsvn.o GIT-LDFLAGS $(GITLIBS) $(VCSSVN_LIB) + $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) \ + $(VCSSVN_LIB) + $(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY) $(QUIET_LNCP)$(RM) $@ && \ ln $< $@ 2>/dev/null || \ @@ -2636,6 +2641,7 @@ bin-wrappers/%: wrap-for-bin.sh # with that. export NO_SVN_TESTS +export TEST_NO_MALLOC_CHECK ### Testing rules diff --git a/argv-array.c b/argv-array.c index 256741d226..9e960d549c 100644 --- a/argv-array.c +++ b/argv-array.c @@ -68,3 +68,23 @@ void argv_array_clear(struct argv_array *array) } argv_array_init(array); } + +const char **argv_array_detach(struct argv_array *array, int *argc) +{ + const char **argv = + array->argv == empty_argv || array->argc == 0 ? NULL : array->argv; + if (argc) + *argc = array->argc; + argv_array_init(array); + return argv; +} + +void argv_array_free_detached(const char **argv) +{ + if (argv) { + int i; + for (i = 0; argv[i]; i++) + free((char **)argv[i]); + free(argv); + } +} diff --git a/argv-array.h b/argv-array.h index f4b98660f8..40248d424c 100644 --- a/argv-array.h +++ b/argv-array.h @@ -18,5 +18,7 @@ void argv_array_pushf(struct argv_array *, const char *fmt, ...); void argv_array_pushl(struct argv_array *, ...); void argv_array_pop(struct argv_array *); void argv_array_clear(struct argv_array *); +const char **argv_array_detach(struct argv_array *array, int *argc); +void argv_array_free_detached(const char **argv); #endif /* ARGV_ARRAY_H */ @@ -115,6 +115,13 @@ struct attr_state { const char *setto; }; +struct pattern { + const char *pattern; + int patternlen; + int nowildcardlen; + int flags; /* EXC_FLAG_* */ +}; + /* * One rule, as from a .gitattributes file. * @@ -131,7 +138,7 @@ struct attr_state { */ struct match_attr { union { - char *pattern; + struct pattern pat; struct git_attr *attr; } u; char is_macro; @@ -241,9 +248,16 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, if (is_macro) res->u.attr = git_attr_internal(name, namelen); else { - res->u.pattern = (char *)&(res->state[num_attr]); - memcpy(res->u.pattern, name, namelen); - res->u.pattern[namelen] = 0; + char *p = (char *)&(res->state[num_attr]); + memcpy(p, name, namelen); + res->u.pat.pattern = p; + parse_exclude_pattern(&res->u.pat.pattern, + &res->u.pat.patternlen, + &res->u.pat.flags, + &res->u.pat.nowildcardlen); + if (res->u.pat.flags & EXC_FLAG_NEGATIVE) + die(_("Negative patterns are forbidden in git attributes\n" + "Use '\\!' for literal leading exclamation.")); } res->is_macro = is_macro; res->num_attr = num_attr; @@ -277,6 +291,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, static struct attr_stack { struct attr_stack *prev; char *origin; + size_t originlen; unsigned num_matches; unsigned alloc; struct match_attr **attrs; @@ -535,6 +550,7 @@ static void bootstrap_attr_stack(void) if (!is_bare_repository() || direction == GIT_ATTR_INDEX) { elem = read_attr(GITATTRIBUTES_FILE, 1); elem->origin = xstrdup(""); + elem->originlen = 0; elem->prev = attr_stack; attr_stack = elem; debug_push(elem); @@ -628,7 +644,7 @@ static void prepare_attr_stack(const char *path) strbuf_addstr(&pathbuf, GITATTRIBUTES_FILE); elem = read_attr(pathbuf.buf, 0); strbuf_setlen(&pathbuf, cp - path); - elem->origin = strbuf_detach(&pathbuf, NULL); + elem->origin = strbuf_detach(&pathbuf, &elem->originlen); elem->prev = attr_stack; attr_stack = elem; debug_push(elem); @@ -645,28 +661,22 @@ static void prepare_attr_stack(const char *path) } static int path_matches(const char *pathname, int pathlen, - const char *pattern, + const char *basename, + const struct pattern *pat, const char *base, int baselen) { - if (!strchr(pattern, '/')) { - /* match basename */ - const char *basename = strrchr(pathname, '/'); - basename = basename ? basename + 1 : pathname; - return (fnmatch_icase(pattern, basename, 0) == 0); + const char *pattern = pat->pattern; + int prefix = pat->nowildcardlen; + + if (pat->flags & EXC_FLAG_NODIR) { + return match_basename(basename, + pathlen - (basename - pathname), + pattern, prefix, + pat->patternlen, pat->flags); } - /* - * match with FNM_PATHNAME; the pattern has base implicitly - * in front of it. - */ - if (*pattern == '/') - pattern++; - if (pathlen < baselen || - (baselen && pathname[baselen] != '/') || - strncmp(pathname, base, baselen)) - return 0; - if (baselen != 0) - baselen++; - return fnmatch_icase(pattern, pathname + baselen, FNM_PATHNAME) == 0; + return match_pathname(pathname, pathlen, + base, baselen, + pattern, prefix, pat->patternlen, pat->flags); } static int macroexpand_one(int attr_nr, int rem); @@ -693,7 +703,8 @@ static int fill_one(const char *what, struct match_attr *a, int rem) return rem; } -static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem) +static int fill(const char *path, int pathlen, const char *basename, + struct attr_stack *stk, int rem) { int i; const char *base = stk->origin ? stk->origin : ""; @@ -702,8 +713,8 @@ static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem) struct match_attr *a = stk->attrs[i]; if (a->is_macro) continue; - if (path_matches(path, pathlen, - a->u.pattern, base, strlen(base))) + if (path_matches(path, pathlen, basename, + &a->u.pat, base, stk->originlen)) rem = fill_one("fill", a, rem); } return rem; @@ -741,15 +752,19 @@ static void collect_all_attrs(const char *path) { struct attr_stack *stk; int i, pathlen, rem; + const char *basename; prepare_attr_stack(path); for (i = 0; i < attr_nr; i++) check_all_attr[i].value = ATTR__UNKNOWN; + basename = strrchr(path, '/'); + basename = basename ? basename + 1 : path; + pathlen = strlen(path); rem = attr_nr; for (stk = attr_stack; 0 < rem && stk; stk = stk->prev) - rem = fill(path, pathlen, stk, rem); + rem = fill(path, pathlen, basename, stk, rem); } int git_check_attr(const char *path, int num, struct git_attr_check *check) diff --git a/builtin/branch.c b/builtin/branch.c index ffd26849c7..1ec9c02612 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -154,10 +154,37 @@ static int branch_merged(int kind, const char *name, return merged; } +static int check_branch_commit(const char *branchname, const char *refname, + unsigned char *sha1, struct commit *head_rev, + int kinds, int force) +{ + struct commit *rev = lookup_commit_reference(sha1); + if (!rev) { + error(_("Couldn't look up commit object for '%s'"), refname); + return -1; + } + if (!force && !branch_merged(kinds, branchname, rev, head_rev)) { + error(_("The branch '%s' is not fully merged.\n" + "If you are sure you want to delete it, " + "run 'git branch -D %s'."), branchname, branchname); + return -1; + } + return 0; +} + +static void delete_branch_config(const char *branchname) +{ + struct strbuf buf = STRBUF_INIT; + strbuf_addf(&buf, "branch.%s", branchname); + if (git_config_rename_section(buf.buf, NULL) < 0) + warning(_("Update of config-file failed")); + strbuf_release(&buf); +} + static int delete_branches(int argc, const char **argv, int force, int kinds, int quiet) { - struct commit *rev, *head_rev = NULL; + struct commit *head_rev = NULL; unsigned char sha1[20]; char *name = NULL; const char *fmt; @@ -187,6 +214,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, die(_("Couldn't look up commit object for HEAD")); } for (i = 0; i < argc; i++, strbuf_release(&bname)) { + const char *target; + int flags = 0; + strbuf_branchname(&bname, argv[i]); if (kinds == REF_LOCAL_BRANCH && !strcmp(head, bname.buf)) { error(_("Cannot delete the branch '%s' " @@ -198,7 +228,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, free(name); name = mkpathdup(fmt, bname.buf); - if (read_ref(name, sha1)) { + target = resolve_ref_unsafe(name, sha1, 0, &flags); + if (!target || + (!(flags & REF_ISSYMREF) && is_null_sha1(sha1))) { error(remote_branch ? _("remote branch '%s' not found.") : _("branch '%s' not found."), bname.buf); @@ -206,40 +238,31 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, continue; } - rev = lookup_commit_reference(sha1); - if (!rev) { - error(_("Couldn't look up commit object for '%s'"), name); - ret = 1; - continue; - } - - if (!force && !branch_merged(kinds, bname.buf, rev, head_rev)) { - error(_("The branch '%s' is not fully merged.\n" - "If you are sure you want to delete it, " - "run 'git branch -D %s'."), bname.buf, bname.buf); + if (!(flags & REF_ISSYMREF) && + check_branch_commit(bname.buf, name, sha1, head_rev, kinds, + force)) { ret = 1; continue; } - if (delete_ref(name, sha1, 0)) { + if (delete_ref(name, sha1, REF_NODEREF)) { error(remote_branch ? _("Error deleting remote branch '%s'") : _("Error deleting branch '%s'"), bname.buf); ret = 1; - } else { - struct strbuf buf = STRBUF_INIT; - if (!quiet) - printf(remote_branch - ? _("Deleted remote branch %s (was %s).\n") - : _("Deleted branch %s (was %s).\n"), - bname.buf, - find_unique_abbrev(sha1, DEFAULT_ABBREV)); - strbuf_addf(&buf, "branch.%s", bname.buf); - if (git_config_rename_section(buf.buf, NULL) < 0) - warning(_("Update of config-file failed")); - strbuf_release(&buf); + continue; + } + if (!quiet) { + printf(remote_branch + ? _("Deleted remote branch %s (was %s).\n") + : _("Deleted branch %s (was %s).\n"), + bname.buf, + (flags & REF_ISSYMREF) + ? target + : find_unique_abbrev(sha1, DEFAULT_ABBREV)); } + delete_branch_config(bname.buf); } free(name); diff --git a/builtin/commit.c b/builtin/commit.c index a17a5df449..1dd2ec5e6f 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -112,10 +112,11 @@ static const char *only_include_assumed; static struct strbuf message = STRBUF_INIT; static enum { + STATUS_FORMAT_NONE = 0, STATUS_FORMAT_LONG, STATUS_FORMAT_SHORT, STATUS_FORMAT_PORCELAIN -} status_format = STATUS_FORMAT_LONG; +} status_format; static int opt_parse_m(const struct option *opt, const char *arg, int unset) { @@ -454,6 +455,7 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int case STATUS_FORMAT_PORCELAIN: wt_porcelain_print(s); break; + case STATUS_FORMAT_NONE: case STATUS_FORMAT_LONG: wt_status_print(s); break; @@ -1058,9 +1060,13 @@ static int parse_and_validate_options(int argc, const char *argv[], if (all && argc > 0) die(_("Paths with -a does not make sense.")); - if (s->null_termination && status_format == STATUS_FORMAT_LONG) - status_format = STATUS_FORMAT_PORCELAIN; - if (status_format != STATUS_FORMAT_LONG) + if (s->null_termination) { + if (status_format == STATUS_FORMAT_NONE) + status_format = STATUS_FORMAT_PORCELAIN; + else if (status_format == STATUS_FORMAT_LONG) + die(_("--long and -z are incompatible")); + } + if (status_format != STATUS_FORMAT_NONE) dry_run = 1; return argc; @@ -1159,6 +1165,9 @@ int cmd_status(int argc, const char **argv, const char *prefix) OPT_SET_INT(0, "porcelain", &status_format, N_("machine-readable output"), STATUS_FORMAT_PORCELAIN), + OPT_SET_INT(0, "long", &status_format, + N_("show status in long format (default)"), + STATUS_FORMAT_LONG), OPT_BOOLEAN('z', "null", &s.null_termination, N_("terminate entries with NUL")), { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, @@ -1186,8 +1195,12 @@ int cmd_status(int argc, const char **argv, const char *prefix) builtin_status_usage, 0); finalize_colopts(&s.colopts, -1); - if (s.null_termination && status_format == STATUS_FORMAT_LONG) - status_format = STATUS_FORMAT_PORCELAIN; + if (s.null_termination) { + if (status_format == STATUS_FORMAT_NONE) + status_format = STATUS_FORMAT_PORCELAIN; + else if (status_format == STATUS_FORMAT_LONG) + die(_("--long and -z are incompatible")); + } handle_untracked_files_arg(&s); if (show_ignored_in_status) @@ -1216,6 +1229,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) case STATUS_FORMAT_PORCELAIN: wt_porcelain_print(&s); break; + case STATUS_FORMAT_NONE: case STATUS_FORMAT_LONG: s.verbose = verbose; s.ignore_submodule_arg = ignore_submodule_arg; @@ -1386,6 +1400,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix) OPT_BOOLEAN(0, "branch", &s.show_branch, N_("show branch information")), OPT_SET_INT(0, "porcelain", &status_format, N_("machine-readable output"), STATUS_FORMAT_PORCELAIN), + OPT_SET_INT(0, "long", &status_format, + N_("show status in long format (default)"), + STATUS_FORMAT_LONG), OPT_BOOLEAN('z', "null", &s.null_termination, N_("terminate entries with NUL")), OPT_BOOLEAN(0, "amend", &amend, N_("amend previous commit")), diff --git a/builtin/describe.c b/builtin/describe.c index 9fe11ed9de..04c185b1fb 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -144,7 +144,7 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void if (!all && !might_be_tag) return 0; - if (!peel_ref(path, peeled) && !is_null_sha1(peeled)) { + if (!peel_ref(path, peeled)) { is_tag = !!hashcmp(sha1, peeled); } else { hashcpy(peeled, sha1); diff --git a/builtin/grep.c b/builtin/grep.c index 82530a61b4..0e1b6c860e 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -86,7 +86,7 @@ static pthread_cond_t cond_result; static int skip_first_line; static void add_work(struct grep_opt *opt, enum grep_source_type type, - const char *name, const void *id) + const char *name, const char *path, const void *id) { grep_lock(); @@ -94,7 +94,7 @@ static void add_work(struct grep_opt *opt, enum grep_source_type type, pthread_cond_wait(&cond_write, &grep_mutex); } - grep_source_init(&todo[todo_end].source, type, name, id); + grep_source_init(&todo[todo_end].source, type, name, path, id); if (opt->binary != GREP_BINARY_TEXT) grep_source_load_driver(&todo[todo_end].source); todo[todo_end].done = 0; @@ -261,103 +261,12 @@ static int wait_all(void) } #endif -static int parse_pattern_type_arg(const char *opt, const char *arg) +static int grep_cmd_config(const char *var, const char *value, void *cb) { - if (!strcmp(arg, "default")) - return GREP_PATTERN_TYPE_UNSPECIFIED; - else if (!strcmp(arg, "basic")) - return GREP_PATTERN_TYPE_BRE; - else if (!strcmp(arg, "extended")) - return GREP_PATTERN_TYPE_ERE; - else if (!strcmp(arg, "fixed")) - return GREP_PATTERN_TYPE_FIXED; - else if (!strcmp(arg, "perl")) - return GREP_PATTERN_TYPE_PCRE; - die("bad %s argument: %s", opt, arg); -} - -static void grep_pattern_type_options(const int pattern_type, struct grep_opt *opt) -{ - switch (pattern_type) { - case GREP_PATTERN_TYPE_UNSPECIFIED: - /* fall through */ - - case GREP_PATTERN_TYPE_BRE: - opt->fixed = 0; - opt->pcre = 0; - opt->regflags &= ~REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_ERE: - opt->fixed = 0; - opt->pcre = 0; - opt->regflags |= REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_FIXED: - opt->fixed = 1; - opt->pcre = 0; - opt->regflags &= ~REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_PCRE: - opt->fixed = 0; - opt->pcre = 1; - opt->regflags &= ~REG_EXTENDED; - break; - } -} - -static int grep_config(const char *var, const char *value, void *cb) -{ - struct grep_opt *opt = cb; - char *color = NULL; - - if (userdiff_config(var, value) < 0) - return -1; - - if (!strcmp(var, "grep.extendedregexp")) { - if (git_config_bool(var, value)) - opt->extended_regexp_option = 1; - else - opt->extended_regexp_option = 0; - return 0; - } - - if (!strcmp(var, "grep.patterntype")) { - opt->pattern_type_option = parse_pattern_type_arg(var, value); - return 0; - } - - if (!strcmp(var, "grep.linenumber")) { - opt->linenum = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "color.grep")) - opt->color = git_config_colorbool(var, value); - else if (!strcmp(var, "color.grep.context")) - color = opt->color_context; - else if (!strcmp(var, "color.grep.filename")) - color = opt->color_filename; - else if (!strcmp(var, "color.grep.function")) - color = opt->color_function; - else if (!strcmp(var, "color.grep.linenumber")) - color = opt->color_lineno; - else if (!strcmp(var, "color.grep.match")) - color = opt->color_match; - else if (!strcmp(var, "color.grep.selected")) - color = opt->color_selected; - else if (!strcmp(var, "color.grep.separator")) - color = opt->color_sep; - else - return git_color_default_config(var, value, cb); - if (color) { - if (!value) - return config_error_nonbool(var); - color_parse(value, var, color); - } - return 0; + int st = grep_config(var, value, cb); + if (git_color_default_config(var, value, cb) < 0) + st = -1; + return st; } static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size) @@ -371,7 +280,8 @@ static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type } static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, - const char *filename, int tree_name_len) + const char *filename, int tree_name_len, + const char *path) { struct strbuf pathbuf = STRBUF_INIT; @@ -385,7 +295,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, #ifndef NO_PTHREADS if (use_threads) { - add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, sha1); + add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); return 0; } else @@ -394,7 +304,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, struct grep_source gs; int hit; - grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, sha1); + grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); hit = grep_source(opt, &gs); @@ -414,7 +324,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) #ifndef NO_PTHREADS if (use_threads) { - add_work(opt, GREP_SOURCE_FILE, buf.buf, filename); + add_work(opt, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); return 0; } else @@ -423,7 +333,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) struct grep_source gs; int hit; - grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename); + grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); hit = grep_source(opt, &gs); @@ -479,7 +389,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) { if (ce_stage(ce)) continue; - hit |= grep_sha1(opt, ce->sha1, ce->name, 0); + hit |= grep_sha1(opt, ce->sha1, ce->name, 0, ce->name); } else hit |= grep_file(opt, ce->name); @@ -497,7 +407,8 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int } static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, - struct tree_desc *tree, struct strbuf *base, int tn_len) + struct tree_desc *tree, struct strbuf *base, int tn_len, + int check_attr) { int hit = 0; enum interesting match = entry_not_interesting; @@ -518,7 +429,8 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_add(base, entry.path, te_len); if (S_ISREG(entry.mode)) { - hit |= grep_sha1(opt, entry.sha1, base->buf, tn_len); + hit |= grep_sha1(opt, entry.sha1, base->buf, tn_len, + check_attr ? base->buf + tn_len : NULL); } else if (S_ISDIR(entry.mode)) { enum object_type type; @@ -533,7 +445,8 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_addch(base, '/'); init_tree_desc(&sub, data, size); - hit |= grep_tree(opt, pathspec, &sub, base, tn_len); + hit |= grep_tree(opt, pathspec, &sub, base, tn_len, + check_attr); free(data); } strbuf_setlen(base, old_baselen); @@ -548,7 +461,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, struct object *obj, const char *name) { if (obj->type == OBJ_BLOB) - return grep_sha1(opt, obj->sha1, name, 0); + return grep_sha1(opt, obj->sha1, name, 0, NULL); if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) { struct tree_desc tree; void *data; @@ -571,7 +484,8 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_addch(&base, ':'); } init_tree_desc(&tree, data, size); - hit = grep_tree(opt, pathspec, &tree, &base, base.len); + hit = grep_tree(opt, pathspec, &tree, &base, base.len, + obj->type == OBJ_COMMIT); strbuf_release(&base); free(data); return hit; @@ -839,27 +753,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) if (argc == 2 && !strcmp(argv[1], "-h")) usage_with_options(grep_usage, options); - memset(&opt, 0, sizeof(opt)); - opt.prefix = prefix; - opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0; - opt.relative = 1; - opt.pathname = 1; - opt.pattern_tail = &opt.pattern_list; - opt.header_tail = &opt.header_list; - opt.regflags = REG_NEWLINE; - opt.max_depth = -1; - opt.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED; - opt.extended_regexp_option = 0; - - strcpy(opt.color_context, ""); - strcpy(opt.color_filename, ""); - strcpy(opt.color_function, ""); - strcpy(opt.color_lineno, ""); - strcpy(opt.color_match, GIT_COLOR_BOLD_RED); - strcpy(opt.color_selected, ""); - strcpy(opt.color_sep, GIT_COLOR_CYAN); - opt.color = -1; - git_config(grep_config, &opt); + init_grep_defaults(); + git_config(grep_cmd_config, NULL); + grep_init(&opt, prefix); /* * If there is no -- then the paths must exist in the working @@ -875,13 +771,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_STOP_AT_NON_OPTION | PARSE_OPT_NO_INTERNAL_HELP); - - if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED) - grep_pattern_type_options(pattern_type_arg, &opt); - else if (opt.pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED) - grep_pattern_type_options(opt.pattern_type_option, &opt); - else if (opt.extended_regexp_option) - grep_pattern_type_options(GREP_PATTERN_TYPE_ERE, &opt); + grep_commit_pattern_type(pattern_type_arg, &opt); if (use_index && !startup_info->have_repository) /* die the same way as if we did it at the beginning */ diff --git a/builtin/log.c b/builtin/log.c index 09cf43e6d4..e7b7db1cac 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -351,7 +351,8 @@ static int git_log_config(const char *var, const char *value, void *cb) } if (!prefixcmp(var, "color.decorate.")) return parse_decorate_color_config(var, 15, value); - + if (grep_config(var, value, cb) < 0) + return -1; return git_diff_ui_config(var, value, cb); } @@ -360,6 +361,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix) struct rev_info rev; struct setup_revision_opt opt; + init_grep_defaults(); git_config(git_log_config, NULL); init_revisions(&rev, prefix); @@ -450,6 +452,7 @@ int cmd_show(int argc, const char **argv, const char *prefix) struct pathspec match_all; int i, count, ret = 0; + init_grep_defaults(); git_config(git_log_config, NULL); init_pathspec(&match_all, NULL); @@ -530,6 +533,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix) struct rev_info rev; struct setup_revision_opt opt; + init_grep_defaults(); git_config(git_log_config, NULL); init_revisions(&rev, prefix); @@ -552,6 +556,7 @@ int cmd_log(int argc, const char **argv, const char *prefix) struct rev_info rev; struct setup_revision_opt opt; + init_grep_defaults(); git_config(git_log_config, NULL); init_revisions(&rev, prefix); @@ -1121,6 +1126,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) extra_hdr.strdup_strings = 1; extra_to.strdup_strings = 1; extra_cc.strdup_strings = 1; + init_grep_defaults(); git_config(git_format_config, NULL); init_revisions(&rev, prefix); rev.commit_format = CMIT_FMT_EMAIL; diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 5e14064094..f069462cb0 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2033,7 +2033,6 @@ static int add_ref_tag(const char *path, const unsigned char *sha1, int flag, vo if (!prefixcmp(path, "refs/tags/") && /* is a tag? */ !peel_ref(path, peeled) && /* peelable? */ - !is_null_sha1(peeled) && /* annotated tag? */ locate_object_entry(peeled)) /* object packed? */ add_object_entry(sha1, OBJ_TAG, NULL, 0); return 0; diff --git a/builtin/rm.c b/builtin/rm.c index b384c4c3cf..2aea3b5653 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -9,6 +9,7 @@ #include "cache-tree.h" #include "tree-walk.h" #include "parse-options.h" +#include "submodule.h" static const char * const builtin_rm_usage[] = { N_("git rm [options] [--] <file>..."), @@ -17,9 +18,58 @@ static const char * const builtin_rm_usage[] = { static struct { int nr, alloc; - const char **name; + struct { + const char *name; + char is_submodule; + } *entry; } list; +static int get_ours_cache_pos(const char *path, int pos) +{ + int i = -pos - 1; + + while ((i < active_nr) && !strcmp(active_cache[i]->name, path)) { + if (ce_stage(active_cache[i]) == 2) + return i; + i++; + } + return -1; +} + +static int check_submodules_use_gitfiles(void) +{ + int i; + int errs = 0; + + for (i = 0; i < list.nr; i++) { + const char *name = list.entry[i].name; + int pos; + struct cache_entry *ce; + struct stat st; + + pos = cache_name_pos(name, strlen(name)); + if (pos < 0) { + pos = get_ours_cache_pos(name, pos); + if (pos < 0) + continue; + } + ce = active_cache[pos]; + + if (!S_ISGITLINK(ce->ce_mode) || + (lstat(ce->name, &st) < 0) || + is_empty_dir(name)) + continue; + + if (!submodule_uses_gitfile(name)) + errs = error(_("submodule '%s' (or one of its nested " + "submodules) uses a .git directory\n" + "(use 'rm -rf' if you really want to remove " + "it including all of its history)"), name); + } + + return errs; +} + static int check_local_mod(unsigned char *head, int index_only) { /* @@ -37,15 +87,26 @@ static int check_local_mod(unsigned char *head, int index_only) struct stat st; int pos; struct cache_entry *ce; - const char *name = list.name[i]; + const char *name = list.entry[i].name; unsigned char sha1[20]; unsigned mode; int local_changes = 0; int staged_changes = 0; pos = cache_name_pos(name, strlen(name)); - if (pos < 0) - continue; /* removing unmerged entry */ + if (pos < 0) { + /* + * Skip unmerged entries except for populated submodules + * that could lose history when removed. + */ + pos = get_ours_cache_pos(name, pos); + if (pos < 0) + continue; + + if (!S_ISGITLINK(active_cache[pos]->ce_mode) || + is_empty_dir(name)) + continue; + } ce = active_cache[pos]; if (lstat(ce->name, &st) < 0) { @@ -58,9 +119,10 @@ static int check_local_mod(unsigned char *head, int index_only) /* if a file was removed and it is now a * directory, that is the same as ENOENT as * far as git is concerned; we do not track - * directories. + * directories unless they are submodules. */ - continue; + if (!S_ISGITLINK(ce->ce_mode)) + continue; } /* @@ -80,8 +142,11 @@ static int check_local_mod(unsigned char *head, int index_only) /* * Is the index different from the file in the work tree? + * If it's a submodule, is its work tree modified? */ - if (ce_match_stat(ce, &st, 0)) + if (ce_match_stat(ce, &st, 0) || + (S_ISGITLINK(ce->ce_mode) && + !ok_to_remove_submodule(ce->name))) local_changes = 1; /* @@ -115,10 +180,18 @@ static int check_local_mod(unsigned char *head, int index_only) errs = error(_("'%s' has changes staged in the index\n" "(use --cached to keep the file, " "or -f to force removal)"), name); - if (local_changes) - errs = error(_("'%s' has local modifications\n" - "(use --cached to keep the file, " - "or -f to force removal)"), name); + if (local_changes) { + if (S_ISGITLINK(ce->ce_mode) && + !submodule_uses_gitfile(name)) { + errs = error(_("submodule '%s' (or one of its nested " + "submodules) uses a .git directory\n" + "(use 'rm -rf' if you really want to remove " + "it including all of its history)"), name); + } else + errs = error(_("'%s' has local modifications\n" + "(use --cached to keep the file, " + "or -f to force removal)"), name); + } } } return errs; @@ -173,8 +246,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix) struct cache_entry *ce = active_cache[i]; if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen)) continue; - ALLOC_GROW(list.name, list.nr + 1, list.alloc); - list.name[list.nr++] = ce->name; + ALLOC_GROW(list.entry, list.nr + 1, list.alloc); + list.entry[list.nr].name = ce->name; + list.entry[list.nr++].is_submodule = S_ISGITLINK(ce->ce_mode); } if (pathspec) { @@ -215,6 +289,9 @@ int cmd_rm(int argc, const char **argv, const char *prefix) hashclr(sha1); if (check_local_mod(sha1, index_only)) exit(1); + } else if (!index_only) { + if (check_submodules_use_gitfiles()) + exit(1); } /* @@ -222,7 +299,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix) * the index unless all of them succeed. */ for (i = 0; i < list.nr; i++) { - const char *path = list.name[i]; + const char *path = list.entry[i].name; if (!quiet) printf("rm '%s'\n", path); @@ -244,7 +321,25 @@ int cmd_rm(int argc, const char **argv, const char *prefix) if (!index_only) { int removed = 0; for (i = 0; i < list.nr; i++) { - const char *path = list.name[i]; + const char *path = list.entry[i].name; + if (list.entry[i].is_submodule) { + if (is_empty_dir(path)) { + if (!rmdir(path)) { + removed = 1; + continue; + } + } else { + struct strbuf buf = STRBUF_INIT; + strbuf_addstr(&buf, path); + if (!remove_dir_recursively(&buf, 0)) { + removed = 1; + strbuf_release(&buf); + continue; + } + strbuf_release(&buf); + /* Fallthrough and let remove_path() fail. */ + } + } if (!remove_path(path)) { removed = 1; continue; diff --git a/builtin/show-ref.c b/builtin/show-ref.c index 4eb016d6e5..8d9b76a02f 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -28,7 +28,6 @@ static void show_one(const char *refname, const unsigned char *sha1) static int show_ref(const char *refname, const unsigned char *sha1, int flag, void *cbdata) { - struct object *obj; const char *hex; unsigned char peeled[20]; @@ -79,25 +78,9 @@ match: if (!deref_tags) return 0; - if ((flag & REF_ISPACKED) && !peel_ref(refname, peeled)) { - if (!is_null_sha1(peeled)) { - hex = find_unique_abbrev(peeled, abbrev); - printf("%s %s^{}\n", hex, refname); - } - } - else { - obj = parse_object(sha1); - if (!obj) - die("git show-ref: bad ref %s (%s)", refname, - sha1_to_hex(sha1)); - if (obj->type == OBJ_TAG) { - obj = deref_tag(obj, refname, 0); - if (!obj) - die("git show-ref: bad tag at ref %s (%s)", refname, - sha1_to_hex(sha1)); - hex = find_unique_abbrev(obj->sha1, abbrev); - printf("%s %s^{}\n", hex, refname); - } + if (!peel_ref(refname, peeled)) { + hex = find_unique_abbrev(peeled, abbrev); + printf("%s %s^{}\n", hex, refname); } return 0; } @@ -609,6 +609,7 @@ static struct commit *interesting(struct commit_list *list) return NULL; } +/* all input commits in one and twos[] must have been parsed! */ static struct commit_list *paint_down_to_common(struct commit *one, int n, struct commit **twos) { struct commit_list *list = NULL; @@ -617,6 +618,8 @@ static struct commit_list *paint_down_to_common(struct commit *one, int n, struc one->object.flags |= PARENT1; commit_list_insert_by_date(one, &list); + if (!n) + return list; for (i = 0; i < n; i++) { twos[i]->object.flags |= PARENT2; commit_list_insert_by_date(twos[i], &list); @@ -737,6 +740,8 @@ static int remove_redundant(struct commit **array, int cnt) redundant = xcalloc(cnt, 1); filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1)); + for (i = 0; i < cnt; i++) + parse_commit(array[i]); for (i = 0; i < cnt; i++) { struct commit_list *common; diff --git a/compat/mingw.c b/compat/mingw.c index afc892d6b1..4e6383898c 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -335,6 +335,28 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream) return freopen(filename, otype, stream); } +#undef fflush +int mingw_fflush(FILE *stream) +{ + int ret = fflush(stream); + + /* + * write() is used behind the scenes of stdio output functions. + * Since git code does not check for errors after each stdio write + * operation, it can happen that write() is called by a later + * stdio function even if an earlier write() call failed. In the + * case of a pipe whose readable end was closed, only the first + * call to write() reports EPIPE on Windows. Subsequent write() + * calls report EINVAL. It is impossible to notice whether this + * fflush invocation triggered such a case, therefore, we have to + * catch all EINVAL errors whole-sale. + */ + if (ret && errno == EINVAL) + errno = EPIPE; + + return ret; +} + /* * The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC. * Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch. diff --git a/compat/mingw.h b/compat/mingw.h index 61a652138a..eeb08d120b 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -185,6 +185,9 @@ FILE *mingw_fopen (const char *filename, const char *otype); FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); #define freopen mingw_freopen +int mingw_fflush(FILE *stream); +#define fflush mingw_fflush + char *mingw_getcwd(char *pointer, int len); #define getcwd mingw_getcwd @@ -10,8 +10,6 @@ #include "strbuf.h" #include "quote.h" -#define MAXNAME (256) - typedef struct config_file { struct config_file *prev; FILE *f; @@ -19,7 +17,7 @@ typedef struct config_file { int linenr; int eof; struct strbuf value; - char var[MAXNAME]; + struct strbuf var; } config_file; static config_file *cf; @@ -260,7 +258,7 @@ static inline int iskeychar(int c) return isalnum(c) || c == '-'; } -static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) +static int get_value(config_fn_t fn, void *data, struct strbuf *name) { int c; char *value; @@ -272,11 +270,9 @@ static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) break; if (!iskeychar(c)) break; - name[len++] = tolower(c); - if (len >= MAXNAME) - return -1; + strbuf_addch(name, tolower(c)); } - name[len] = 0; + while (c == ' ' || c == '\t') c = get_next_char(); @@ -288,10 +284,10 @@ static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) if (!value) return -1; } - return fn(name, value, data); + return fn(name->buf, value, data); } -static int get_extended_base_var(char *name, int baselen, int c) +static int get_extended_base_var(struct strbuf *name, int c) { do { if (c == '\n') @@ -302,7 +298,7 @@ static int get_extended_base_var(char *name, int baselen, int c) /* We require the format to be '[base "extension"]' */ if (c != '"') return -1; - name[baselen++] = '.'; + strbuf_addch(name, '.'); for (;;) { int c = get_next_char(); @@ -315,37 +311,31 @@ static int get_extended_base_var(char *name, int baselen, int c) if (c == '\n') goto error_incomplete_line; } - name[baselen++] = c; - if (baselen > MAXNAME / 2) - return -1; + strbuf_addch(name, c); } /* Final ']' */ if (get_next_char() != ']') return -1; - return baselen; + return 0; error_incomplete_line: cf->linenr--; return -1; } -static int get_base_var(char *name) +static int get_base_var(struct strbuf *name) { - int baselen = 0; - for (;;) { int c = get_next_char(); if (cf->eof) return -1; if (c == ']') - return baselen; + return 0; if (isspace(c)) - return get_extended_base_var(name, baselen, c); + return get_extended_base_var(name, c); if (!iskeychar(c) && c != '.') return -1; - if (baselen > MAXNAME / 2) - return -1; - name[baselen++] = tolower(c); + strbuf_addch(name, tolower(c)); } } @@ -353,7 +343,7 @@ static int git_parse_file(config_fn_t fn, void *data) { int comment = 0; int baselen = 0; - char *var = cf->var; + struct strbuf *var = &cf->var; /* U+FEFF Byte Order Mark in UTF8 */ static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf"; @@ -389,17 +379,24 @@ static int git_parse_file(config_fn_t fn, void *data) continue; } if (c == '[') { - baselen = get_base_var(var); - if (baselen <= 0) + /* Reset prior to determining a new stem */ + strbuf_reset(var); + if (get_base_var(var) < 0 || var->len < 1) break; - var[baselen++] = '.'; - var[baselen] = 0; + strbuf_addch(var, '.'); + baselen = var->len; continue; } if (!isalpha(c)) break; - var[baselen] = tolower(c); - if (get_value(fn, data, var, baselen+1) < 0) + /* + * Truncate the var name back to the section header + * stem prior to grabbing the suffix part of the name + * and the value. + */ + strbuf_setlen(var, baselen); + strbuf_addch(var, tolower(c)); + if (get_value(fn, data, var) < 0) break; } die("bad config file line %d in %s", cf->linenr, cf->name); @@ -899,12 +896,14 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data) top.linenr = 1; top.eof = 0; strbuf_init(&top.value, 1024); + strbuf_init(&top.var, 1024); cf = ⊤ ret = git_parse_file(fn, data); /* pop config-file parsing state stack */ strbuf_release(&top.value); + strbuf_release(&top.var); cf = top.prev; fclose(f); diff --git a/configure.ac b/configure.ac index da1f41f588..ad215cc4a1 100644 --- a/configure.ac +++ b/configure.ac @@ -411,7 +411,7 @@ else LDFLAGS="${SAVE_LDFLAGS}" ]) if test "$git_cv_ld_wl_rpath" = "yes"; then - CC_LD_DYNPATH=-Wl,-rpath + CC_LD_DYNPATH=-Wl,-rpath, else AC_CACHE_CHECK([if linker supports -rpath], git_cv_ld_rpath, [ SAVE_LDFLAGS="${LDFLAGS}" @@ -1024,7 +1024,7 @@ elif test -z "$PTHREAD_CFLAGS"; then for opt in -mt -pthread -lpthread; do old_CFLAGS="$CFLAGS" CFLAGS="$opt $CFLAGS" - AC_MSG_CHECKING([Checking for POSIX Threads with '$opt']) + AC_MSG_CHECKING([for POSIX Threads with '$opt']) AC_LINK_IFELSE([PTHREADTEST_SRC], [AC_MSG_RESULT([yes]) NO_PTHREADS= @@ -1044,7 +1044,7 @@ elif test -z "$PTHREAD_CFLAGS"; then else old_CFLAGS="$CFLAGS" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" - AC_MSG_CHECKING([Checking for POSIX Threads with '$PTHREAD_CFLAGS']) + AC_MSG_CHECKING([for POSIX Threads with '$PTHREAD_CFLAGS']) AC_LINK_IFELSE([PTHREADTEST_SRC], [AC_MSG_RESULT([yes]) NO_PTHREADS= diff --git a/contrib/hooks/post-receive-email b/contrib/hooks/post-receive-email index 01af9df15e..b2171a092e 100755 --- a/contrib/hooks/post-receive-email +++ b/contrib/hooks/post-receive-email @@ -403,7 +403,7 @@ generate_update_branch_email() echo " \\" echo " O -- O -- O ($oldrev)" echo "" - echo "The removed revisions are not necessarilly gone - if another reference" + echo "The removed revisions are not necessarily gone - if another reference" echo "still refers to them they will stay in the repository." rewind_only=1 else diff --git a/contrib/svn-fe/svn-fe.c b/contrib/svn-fe/svn-fe.c index 35db24f5ea..f363505abb 100644 --- a/contrib/svn-fe/svn-fe.c +++ b/contrib/svn-fe/svn-fe.c @@ -10,7 +10,8 @@ int main(int argc, char **argv) { if (svndump_init(NULL)) return 1; - svndump_read((argc > 1) ? argv[1] : NULL); + svndump_read((argc > 1) ? argv[1] : NULL, "refs/heads/master", + "refs/notes/svn/revs"); svndump_deinit(); svndump_reset(); return 0; diff --git a/contrib/svn-fe/svnrdump_sim.py b/contrib/svn-fe/svnrdump_sim.py new file mode 100755 index 0000000000..1cfac4a6f8 --- /dev/null +++ b/contrib/svn-fe/svnrdump_sim.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +""" +Simulates svnrdump by replaying an existing dump from a file, taking care +of the specified revision range. +To simulate incremental imports the environment variable SVNRMAX can be set +to the highest revision that should be available. +""" +import sys, os + + +def getrevlimit(): + var = 'SVNRMAX' + if os.environ.has_key(var): + return os.environ[var] + return None + +def writedump(url, lower, upper): + if url.startswith('sim://'): + filename = url[6:] + if filename[-1] == '/': filename = filename[:-1] #remove terminating slash + else: + raise ValueError('sim:// url required') + f = open(filename, 'r'); + state = 'header' + wroterev = False + while(True): + l = f.readline() + if l == '': break + if state == 'header' and l.startswith('Revision-number: '): + state = 'prefix' + if state == 'prefix' and l == 'Revision-number: %s\n' % lower: + state = 'selection' + if not upper == 'HEAD' and state == 'selection' and l == 'Revision-number: %s\n' % upper: + break; + + if state == 'header' or state == 'selection': + if state == 'selection': wroterev = True + sys.stdout.write(l) + return wroterev + +if __name__ == "__main__": + if not (len(sys.argv) in (3, 4, 5)): + print "usage: %s dump URL -rLOWER:UPPER" + sys.exit(1) + if not sys.argv[1] == 'dump': raise NotImplementedError('only "dump" is suppported.') + url = sys.argv[2] + r = ('0', 'HEAD') + if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r': + r = sys.argv[3][2:].lstrip().split(':') + if not getrevlimit() is None: r[1] = getrevlimit() + if writedump(url, r[0], r[1]): ret = 0 + else: ret = 1 + sys.exit(ret) @@ -15,6 +15,7 @@ #include "sigchain.h" #include "submodule.h" #include "ll-merge.h" +#include "string-list.h" #ifdef NO_FAST_WORKING_DIRECTORY #define FAST_WORKING_DIRECTORY 0 @@ -26,6 +27,7 @@ static int diff_detect_rename_default; static int diff_rename_limit_default = 400; static int diff_suppress_blank_empty; static int diff_use_color_default = -1; +static int diff_context_default = 3; static const char *diff_word_regex_cfg; static const char *external_diff_cmd_cfg; int diff_auto_refresh_index = 1; @@ -68,26 +70,30 @@ static int parse_diff_color_slot(const char *var, int ofs) return -1; } -static int parse_dirstat_params(struct diff_options *options, const char *params, +static int parse_dirstat_params(struct diff_options *options, const char *params_string, struct strbuf *errmsg) { - const char *p = params; - int p_len, ret = 0; + char *params_copy = xstrdup(params_string); + struct string_list params = STRING_LIST_INIT_NODUP; + int ret = 0; + int i; - while (*p) { - p_len = strchrnul(p, ',') - p; - if (!memcmp(p, "changes", p_len)) { + if (*params_copy) + string_list_split_in_place(¶ms, params_copy, ',', -1); + for (i = 0; i < params.nr; i++) { + const char *p = params.items[i].string; + if (!strcmp(p, "changes")) { DIFF_OPT_CLR(options, DIRSTAT_BY_LINE); DIFF_OPT_CLR(options, DIRSTAT_BY_FILE); - } else if (!memcmp(p, "lines", p_len)) { + } else if (!strcmp(p, "lines")) { DIFF_OPT_SET(options, DIRSTAT_BY_LINE); DIFF_OPT_CLR(options, DIRSTAT_BY_FILE); - } else if (!memcmp(p, "files", p_len)) { + } else if (!strcmp(p, "files")) { DIFF_OPT_CLR(options, DIRSTAT_BY_LINE); DIFF_OPT_SET(options, DIRSTAT_BY_FILE); - } else if (!memcmp(p, "noncumulative", p_len)) { + } else if (!strcmp(p, "noncumulative")) { DIFF_OPT_CLR(options, DIRSTAT_CUMULATIVE); - } else if (!memcmp(p, "cumulative", p_len)) { + } else if (!strcmp(p, "cumulative")) { DIFF_OPT_SET(options, DIRSTAT_CUMULATIVE); } else if (isdigit(*p)) { char *end; @@ -99,24 +105,21 @@ static int parse_dirstat_params(struct diff_options *options, const char *params while (isdigit(*++end)) ; /* nothing */ } - if (end - p == p_len) + if (!*end) options->dirstat_permille = permille; else { - strbuf_addf(errmsg, _(" Failed to parse dirstat cut-off percentage '%.*s'\n"), - p_len, p); + strbuf_addf(errmsg, _(" Failed to parse dirstat cut-off percentage '%s'\n"), + p); ret++; } } else { - strbuf_addf(errmsg, _(" Unknown dirstat parameter '%.*s'\n"), - p_len, p); + strbuf_addf(errmsg, _(" Unknown dirstat parameter '%s'\n"), p); ret++; } - p += p_len; - - if (*p) - p++; /* more parameters, swallow separator */ } + string_list_clear(¶ms, 0); + free(params_copy); return ret; } @@ -141,6 +144,12 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) diff_use_color_default = git_config_colorbool(var, value); return 0; } + if (!strcmp(var, "diff.context")) { + diff_context_default = git_config_int(var, value); + if (diff_context_default < 0) + return -1; + return 0; + } if (!strcmp(var, "diff.renames")) { diff_detect_rename_default = git_config_rename(var, value); return 0; @@ -3170,7 +3179,7 @@ void diff_setup(struct diff_options *options) options->break_opt = -1; options->rename_limit = -1; options->dirstat_permille = diff_dirstat_permille_default; - options->context = 3; + options->context = diff_context_default; DIFF_OPT_SET(options, RENAME_EMPTY); options->change = diff_change; @@ -308,42 +308,69 @@ static int no_wildcard(const char *string) return string[simple_length(string)] == '\0'; } +void parse_exclude_pattern(const char **pattern, + int *patternlen, + int *flags, + int *nowildcardlen) +{ + const char *p = *pattern; + size_t i, len; + + *flags = 0; + if (*p == '!') { + *flags |= EXC_FLAG_NEGATIVE; + p++; + } + len = strlen(p); + if (len && p[len - 1] == '/') { + len--; + *flags |= EXC_FLAG_MUSTBEDIR; + } + for (i = 0; i < len; i++) { + if (p[i] == '/') + break; + } + if (i == len) + *flags |= EXC_FLAG_NODIR; + *nowildcardlen = simple_length(p); + /* + * we should have excluded the trailing slash from 'p' too, + * but that's one more allocation. Instead just make sure + * nowildcardlen does not exceed real patternlen + */ + if (*nowildcardlen > len) + *nowildcardlen = len; + if (*p == '*' && no_wildcard(p + 1)) + *flags |= EXC_FLAG_ENDSWITH; + *pattern = p; + *patternlen = len; +} + void add_exclude(const char *string, const char *base, int baselen, struct exclude_list *which) { struct exclude *x; - size_t len; - int to_exclude = 1; - int flags = 0; + int patternlen; + int flags; + int nowildcardlen; - if (*string == '!') { - to_exclude = 0; - string++; - } - len = strlen(string); - if (len && string[len - 1] == '/') { + parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen); + if (flags & EXC_FLAG_MUSTBEDIR) { char *s; - x = xmalloc(sizeof(*x) + len); + x = xmalloc(sizeof(*x) + patternlen + 1); s = (char *)(x+1); - memcpy(s, string, len - 1); - s[len - 1] = '\0'; - string = s; + memcpy(s, string, patternlen); + s[patternlen] = '\0'; x->pattern = s; - flags = EXC_FLAG_MUSTBEDIR; } else { x = xmalloc(sizeof(*x)); x->pattern = string; } - x->to_exclude = to_exclude; - x->patternlen = strlen(string); + x->patternlen = patternlen; + x->nowildcardlen = nowildcardlen; x->base = base; x->baselen = baselen; x->flags = flags; - if (!strchr(string, '/')) - x->flags |= EXC_FLAG_NODIR; - x->nowildcardlen = simple_length(string); - if (*string == '*' && no_wildcard(string+1)) - x->flags |= EXC_FLAG_ENDSWITH; ALLOC_GROW(which->excludes, which->nr + 1, which->alloc); which->excludes[which->nr++] = x; } @@ -505,6 +532,72 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen) dir->basebuf[baselen] = '\0'; } +int match_basename(const char *basename, int basenamelen, + const char *pattern, int prefix, int patternlen, + int flags) +{ + if (prefix == patternlen) { + if (!strcmp_icase(pattern, basename)) + return 1; + } else if (flags & EXC_FLAG_ENDSWITH) { + if (patternlen - 1 <= basenamelen && + !strcmp_icase(pattern + 1, + basename + basenamelen - patternlen + 1)) + return 1; + } else { + if (fnmatch_icase(pattern, basename, 0) == 0) + return 1; + } + return 0; +} + +int match_pathname(const char *pathname, int pathlen, + const char *base, int baselen, + const char *pattern, int prefix, int patternlen, + int flags) +{ + const char *name; + int namelen; + + /* + * match with FNM_PATHNAME; the pattern has base implicitly + * in front of it. + */ + if (*pattern == '/') { + pattern++; + prefix--; + } + + /* + * baselen does not count the trailing slash. base[] may or + * may not end with a trailing slash though. + */ + if (pathlen < baselen + 1 || + (baselen && pathname[baselen] != '/') || + strncmp_icase(pathname, base, baselen)) + return 0; + + namelen = baselen ? pathlen - baselen - 1 : pathlen; + name = pathname + pathlen - namelen; + + if (prefix) { + /* + * if the non-wildcard part is longer than the + * remaining pathname, surely it cannot match. + */ + if (prefix > namelen) + return 0; + + if (strncmp_icase(pattern, name, prefix)) + return 0; + pattern += prefix; + name += prefix; + namelen -= prefix; + } + + return fnmatch_icase(pattern, name, FNM_PATHNAME) == 0; +} + /* Scan the list and let the last match determine the fate. * Return 1 for exclude, 0 for include and -1 for undecided. */ @@ -519,9 +612,9 @@ int excluded_from_list(const char *pathname, for (i = el->nr - 1; 0 <= i; i--) { struct exclude *x = el->excludes[i]; - const char *name, *exclude = x->pattern; - int to_exclude = x->to_exclude; - int namelen, prefix = x->nowildcardlen; + const char *exclude = x->pattern; + int to_exclude = x->flags & EXC_FLAG_NEGATIVE ? 0 : 1; + int prefix = x->nowildcardlen; if (x->flags & EXC_FLAG_MUSTBEDIR) { if (*dtype == DT_UNKNOWN) @@ -531,51 +624,18 @@ int excluded_from_list(const char *pathname, } if (x->flags & EXC_FLAG_NODIR) { - /* match basename */ - if (prefix == x->patternlen) { - if (!strcmp_icase(exclude, basename)) - return to_exclude; - } else if (x->flags & EXC_FLAG_ENDSWITH) { - if (x->patternlen - 1 <= pathlen && - !strcmp_icase(exclude + 1, pathname + pathlen - x->patternlen + 1)) - return to_exclude; - } else { - if (fnmatch_icase(exclude, basename, 0) == 0) - return to_exclude; - } - continue; - } - - /* match with FNM_PATHNAME: - * exclude has base (baselen long) implicitly in front of it. - */ - if (*exclude == '/') { - exclude++; - prefix--; - } - - if (pathlen < x->baselen || - (x->baselen && pathname[x->baselen-1] != '/') || - strncmp_icase(pathname, x->base, x->baselen)) + if (match_basename(basename, + pathlen - (basename - pathname), + exclude, prefix, x->patternlen, + x->flags)) + return to_exclude; continue; - - namelen = x->baselen ? pathlen - x->baselen : pathlen; - name = pathname + pathlen - namelen; - - /* if the non-wildcard part is longer than the - remaining pathname, surely it cannot match */ - if (prefix > namelen) - continue; - - if (prefix) { - if (strncmp_icase(exclude, name, prefix)) - continue; - exclude += prefix; - name += prefix; - namelen -= prefix; } - if (!namelen || !fnmatch_icase(exclude, name, FNM_PATHNAME)) + assert(x->baselen == 0 || x->base[x->baselen - 1] == '/'); + if (match_pathname(pathname, pathlen, + x->base, x->baselen ? x->baselen - 1 : 0, + exclude, prefix, x->patternlen, x->flags)) return to_exclude; } return -1; /* undecided */ @@ -11,6 +11,7 @@ struct dir_entry { #define EXC_FLAG_NODIR 1 #define EXC_FLAG_ENDSWITH 4 #define EXC_FLAG_MUSTBEDIR 8 +#define EXC_FLAG_NEGATIVE 16 struct exclude_list { int nr; @@ -21,7 +22,6 @@ struct exclude_list { int nowildcardlen; const char *base; int baselen; - int to_exclude; int flags; } **excludes; }; @@ -81,6 +81,16 @@ extern int excluded_from_list(const char *pathname, int pathlen, const char *bas struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len); /* + * these implement the matching logic for dir.c:excluded_from_list and + * attr.c:path_matches() + */ +extern int match_basename(const char *, int, + const char *, int, int, int); +extern int match_pathname(const char *, int, + const char *, int, + const char *, int, int, int); + +/* * The excluded() API is meant for callers that check each level of leading * directory hierarchies with excluded() to avoid recursing into excluded * directories. Callers that do not do so should use this API instead. @@ -97,6 +107,7 @@ extern int path_excluded(struct path_exclude_check *, const char *, int namelen, extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, char **buf_p, struct exclude_list *which, int check_index); extern void add_excludes_from_file(struct dir_struct *, const char *fname); +extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen); extern void add_exclude(const char *string, const char *base, int baselen, struct exclude_list *which); extern void free_excludes(struct exclude_list *el); diff --git a/git-compat-util.h b/git-compat-util.h index 2fbf1fd8b1..2e79b8a2f3 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -506,6 +506,7 @@ extern const char tolower_trans_tbl[256]; #undef isdigit #undef isalpha #undef isalnum +#undef isprint #undef islower #undef isupper #undef tolower @@ -523,6 +524,7 @@ extern unsigned char sane_ctype[256]; #define isdigit(x) sane_istest(x,GIT_DIGIT) #define isalpha(x) sane_istest(x,GIT_ALPHA) #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT) +#define isprint(x) ((x) >= 0x20 && (x) <= 0x7e) #define islower(x) sane_iscase(x, 1) #define isupper(x) sane_iscase(x, 0) #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL) diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 178e45305d..53142492af 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -64,37 +64,19 @@ EOF eval "$functions" -# When piped a commit, output a script to set the ident of either -# "author" or "committer +finish_ident() { + # Ensure non-empty id name. + echo "case \"\$GIT_$1_NAME\" in \"\") GIT_$1_NAME=\"\${GIT_$1_EMAIL%%@*}\" && export GIT_$1_NAME;; esac" + # And make sure everything is exported. + echo "export GIT_$1_NAME" + echo "export GIT_$1_EMAIL" + echo "export GIT_$1_DATE" +} set_ident () { - lid="$(echo "$1" | tr "[A-Z]" "[a-z]")" - uid="$(echo "$1" | tr "[a-z]" "[A-Z]")" - pick_id_script=' - /^'$lid' /{ - s/'\''/'\''\\'\'\''/g - h - s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/ - s/'\''/'\''\'\'\''/g - s/.*/GIT_'$uid'_NAME='\''&'\''; export GIT_'$uid'_NAME/p - - g - s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/ - s/'\''/'\''\'\'\''/g - s/.*/GIT_'$uid'_EMAIL='\''&'\''; export GIT_'$uid'_EMAIL/p - - g - s/^'$lid' [^<]* <[^>]*> \(.*\)$/@\1/ - s/'\''/'\''\'\'\''/g - s/.*/GIT_'$uid'_DATE='\''&'\''; export GIT_'$uid'_DATE/p - - q - } - ' - - LANG=C LC_ALL=C sed -ne "$pick_id_script" - # Ensure non-empty id name. - echo "case \"\$GIT_${uid}_NAME\" in \"\") GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\" && export GIT_${uid}_NAME;; esac" + parse_ident_from_commit author AUTHOR committer COMMITTER + finish_ident AUTHOR + finish_ident COMMITTER } USAGE="[--env-filter <command>] [--tree-filter <command>] @@ -320,10 +302,8 @@ while read commit parents; do git cat-file commit "$commit" >../commit || die "Cannot read commit $commit" - eval "$(set_ident AUTHOR <../commit)" || - die "setting author failed for commit $commit" - eval "$(set_ident COMMITTER <../commit)" || - die "setting committer failed for commit $commit" + eval "$(set_ident <../commit)" || + die "setting author/committer failed for commit $commit" eval "$filter_env" < /dev/null || die "env filter failed: $filter_env" diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index 65709437ff..49b62ea6eb 100755 --- a/git-gui/GIT-VERSION-GEN +++ b/git-gui/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=0.16.GITGUI +DEF_VER=0.17.GITGUI LF=' ' diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index ba4e5c1330..89f636f496 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -154,6 +154,7 @@ set _trace [lsearch -exact $argv --trace] if {$_trace >= 0} { set argv [lreplace $argv $_trace $_trace] set _trace 1 + if {[tk windowingsystem] eq "win32"} { console show } } else { set _trace 0 } @@ -1463,7 +1464,7 @@ proc rescan {after {honor_trustmtime 1}} { (![$ui_comm edit modified] || [string trim [$ui_comm get 0.0 end]] eq {})} { if {[string match amend* $commit_type]} { - } elseif {[load_message GITGUI_MSG]} { + } elseif {[load_message GITGUI_MSG utf-8]} { } elseif {[run_prepare_commit_msg_hook]} { } elseif {[load_message MERGE_MSG]} { } elseif {[load_message SQUASH_MSG]} { @@ -1549,7 +1550,7 @@ proc rescan_stage2 {fd after} { fileevent $fd_lo readable [list read_ls_others $fd_lo $after] } -proc load_message {file} { +proc load_message {file {encoding {}}} { global ui_comm set f [gitdir $file] @@ -1558,6 +1559,9 @@ proc load_message {file} { return 0 } fconfigure $fd -eofchar {} + if {$encoding ne {}} { + fconfigure $fd -encoding $encoding + } set content [string trim [read $fd]] close $fd regsub -all -line {[ \r\t]+$} $content {} content @@ -2266,6 +2270,7 @@ proc do_quit {{rc {1}}} { && $msg ne {}} { catch { set fd [open $save w] + fconfigure $fd -encoding utf-8 puts -nonewline $fd $msg close $fd } @@ -2998,10 +3003,19 @@ blame { set jump_spec {} set is_path 0 foreach a $argv { - if {$is_path || [file exists $_prefix$a]} { + if {[file exists $a]} { + if {$path ne {}} usage + set path [normalize_relpath $a] + break + } elseif {[file exists $_prefix$a]} { if {$path ne {}} usage set path [normalize_relpath $_prefix$a] break + } + + if {$is_path} { + if {$path ne {}} usage + break } elseif {$a eq {--}} { if {$path ne {}} { if {$head ne {}} usage @@ -3023,8 +3037,13 @@ blame { unset is_path if {$head ne {} && $path eq {}} { - set path [normalize_relpath $_prefix$head] - set head {} + if {[string index $head 0] eq {/}} { + set path [normalize_relpath $head] + set head {} + } else { + set path [normalize_relpath $_prefix$head] + set head {} + } } if {$head eq {}} { @@ -3710,6 +3729,8 @@ bind $ui_diff <$M1B-Key-v> {break} bind $ui_diff <$M1B-Key-V> {break} bind $ui_diff <$M1B-Key-a> {%W tag add sel 0.0 end;break} bind $ui_diff <$M1B-Key-A> {%W tag add sel 0.0 end;break} +bind $ui_diff <$M1B-Key-j> {do_revert_selection;break} +bind $ui_diff <$M1B-Key-J> {do_revert_selection;break} bind $ui_diff <Key-Up> {catch {%W yview scroll -1 units};break} bind $ui_diff <Key-Down> {catch {%W yview scroll 1 units};break} bind $ui_diff <Key-Left> {catch {%W xview scroll -1 units};break} @@ -3742,6 +3763,8 @@ bind . <$M1B-Key-s> do_signoff bind . <$M1B-Key-S> do_signoff bind . <$M1B-Key-t> do_add_selection bind . <$M1B-Key-T> do_add_selection +bind . <$M1B-Key-u> do_unstage_selection +bind . <$M1B-Key-U> do_unstage_selection bind . <$M1B-Key-j> do_revert_selection bind . <$M1B-Key-J> do_revert_selection bind . <$M1B-Key-i> do_add_all @@ -3835,7 +3858,7 @@ if {[is_enabled transport]} { } if {[winfo exists $ui_comm]} { - set GITGUI_BCK_exists [load_message GITGUI_BCK] + set GITGUI_BCK_exists [load_message GITGUI_BCK utf-8] # -- If both our backup and message files exist use the # newer of the two files to initialize the buffer. @@ -3872,6 +3895,7 @@ if {[winfo exists $ui_comm]} { } elseif {$m} { catch { set fd [open [gitdir GITGUI_BCK] w] + fconfigure $fd -encoding utf-8 puts -nonewline $fd $msg close $fd set GITGUI_BCK_exists 1 diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl index 0d81432af5..864b687057 100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@ -268,7 +268,7 @@ proc commit_commitmsg {curHEAD msg_p} { && [is_config_true gui.warndetachedcommit]} { set msg [mc "You are about to commit on a detached head.\ This is a potentially dangerous thing to do because if you switch\ -to another branch you will loose your changes and it can be difficult\ +to another branch you will lose your changes and it can be difficult\ to retrieve them later from the reflog. You should probably cancel this\ commit and create a new branch to continue.\n\ \n\ @@ -409,6 +409,7 @@ A rescan will be automatically started now. catch {file delete [gitdir MERGE_MSG]} catch {file delete [gitdir SQUASH_MSG]} catch {file delete [gitdir GITGUI_MSG]} + catch {file delete [gitdir CHERRY_PICK_HEAD]} # -- Let rerere do its thing. # diff --git a/git-gui/lib/status_bar.tcl b/git-gui/lib/status_bar.tcl index 95cb44991f..02111a1742 100644 --- a/git-gui/lib/status_bar.tcl +++ b/git-gui/lib/status_bar.tcl @@ -77,6 +77,7 @@ method start {msg uds} { method update {have total} { set pdone 0 + set cdone 0 if {$total > 0} { set pdone [expr {100 * $have / $total}] set cdone [expr {[winfo width $w_c] * $have / $total}] diff --git a/git-gui/macosx/AppMain.tcl b/git-gui/macosx/AppMain.tcl index ddbe6334a2..738bdd03ed 100644 --- a/git-gui/macosx/AppMain.tcl +++ b/git-gui/macosx/AppMain.tcl @@ -12,7 +12,9 @@ if {[file tail [lindex $argv 0]] eq {gitk}} { } else { set argv0 [file join $gitexecdir [file tail [lindex $argv 0]]] set AppMain_source [file join $gitguilib git-gui.tcl] - if {[pwd] eq {/}} { + if {[info exists env(PWD)]} { + cd $env(PWD) + } elseif {[pwd] eq {/}} { cd $env(HOME) } } diff --git a/git-gui/po/de.po b/git-gui/po/de.po index 44c5ddc8b6..baebff2fff 100644 --- a/git-gui/po/de.po +++ b/git-gui/po/de.po @@ -72,7 +72,7 @@ msgstr "" #: git-gui.sh:1154 msgid "Cannot use bare repository:" -msgstr "Leeres Projektarchiv kann nicht benutzt werden:" +msgstr "Bloßes Projektarchiv kann nicht benutzt werden:" #: git-gui.sh:1162 msgid "No working directory" @@ -88,7 +88,7 @@ msgstr "Nach geänderten Dateien suchen..." #: git-gui.sh:1454 msgid "Calling prepare-commit-msg hook..." -msgstr "Aufrufen der Eintragen-Vorbereiten-Kontrolle..." +msgstr "Aufrufen der Eintragen-Vorbereiten-Kontrolle (»prepare-commit hook«)..." #: git-gui.sh:1471 msgid "Commit declined by prepare-commit-msg hook." @@ -188,7 +188,7 @@ msgstr "Zusammenführen" #: git-gui.sh:2465 lib/choose_rev.tcl:557 msgid "Remote" -msgstr "Andere Archive" +msgstr "Externe Archive" #: git-gui.sh:2468 msgid "Tools" @@ -478,7 +478,7 @@ msgstr "Zusammenführungswerkzeug" #: git-gui.sh:3328 msgid "Use Remote Version" -msgstr "Entfernte Version benutzen" +msgstr "Externe Version benutzen" #: git-gui.sh:3332 msgid "Use Local Version" @@ -771,7 +771,7 @@ msgstr "Bitte wählen Sie einen Übernahmezweig." #: lib/branch_create.tcl:140 #, tcl-format msgid "Tracking branch %s is not a branch in the remote repository." -msgstr "Übernahmezweig »%s« ist kein Zweig im anderen Projektarchiv." +msgstr "Übernahmezweig »%s« ist kein Zweig im externen Projektarchiv." #: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 msgid "Please supply a branch name." @@ -1446,7 +1446,7 @@ msgstr "" #: lib/commit.tcl:234 msgid "Calling pre-commit hook..." -msgstr "Aufrufen der Vor-Eintragen-Kontrolle..." +msgstr "Aufrufen der Vor-Eintragen-Kontrolle (»pre-commit hook«)..." #: lib/commit.tcl:249 msgid "Commit declined by pre-commit hook." @@ -1454,7 +1454,7 @@ msgstr "Eintragen abgelehnt durch Vor-Eintragen-Kontrolle (»pre-commit hook«). #: lib/commit.tcl:272 msgid "Calling commit-msg hook..." -msgstr "Aufrufen der Versionsbeschreibungs-Kontrolle..." +msgstr "Aufrufen der Versionsbeschreibungs-Kontrolle (»commit-message hook«)..." #: lib/commit.tcl:287 msgid "Commit declined by commit-msg hook." @@ -2134,11 +2134,11 @@ msgstr "Optionen konnten nicht gespeichert werden:" #: lib/remote_add.tcl:19 msgid "Add Remote" -msgstr "Anderes Archiv hinzufügen" +msgstr "Externes Archiv hinzufügen" #: lib/remote_add.tcl:24 msgid "Add New Remote" -msgstr "Neues anderes Archiv hinzufügen" +msgstr "Neues externes Archiv hinzufügen" #: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36 msgid "Add" @@ -2146,7 +2146,7 @@ msgstr "Hinzufügen" #: lib/remote_add.tcl:37 msgid "Remote Details" -msgstr "Einzelheiten des anderen Archivs" +msgstr "Einzelheiten des externen Archivs" #: lib/remote_add.tcl:50 msgid "Location:" @@ -2162,7 +2162,7 @@ msgstr "Gleich anfordern" #: lib/remote_add.tcl:71 msgid "Initialize Remote Repository and Push" -msgstr "Anderes Archiv initialisieren und dahin versenden" +msgstr "Externes Archiv initialisieren und dahin versenden" #: lib/remote_add.tcl:77 msgid "Do Nothing Else Now" @@ -2170,17 +2170,17 @@ msgstr "Nichts tun" #: lib/remote_add.tcl:101 msgid "Please supply a remote name." -msgstr "Bitte geben Sie einen Namen des anderen Archivs an." +msgstr "Bitte geben Sie einen Namen des externen Archivs an." #: lib/remote_add.tcl:114 #, tcl-format msgid "'%s' is not an acceptable remote name." -msgstr "»%s« ist kein zulässiger Name eines anderen Archivs." +msgstr "»%s« ist kein zulässiger Name eines externen Archivs." #: lib/remote_add.tcl:125 #, tcl-format msgid "Failed to add remote '%s' of location '%s'." -msgstr "Fehler beim Hinzufügen des anderen Archivs »%s« aus Herkunftsort »%s«." +msgstr "Fehler beim Hinzufügen des externen Archivs »%s« aus Herkunftsort »%s«." #: lib/remote_add.tcl:133 lib/transport.tcl:6 #, tcl-format @@ -2195,7 +2195,7 @@ msgstr "»%s« anfordern" #: lib/remote_add.tcl:157 #, tcl-format msgid "Do not know how to initialize repository at location '%s'." -msgstr "Initialisieren eines anderen Archivs an Adresse »%s« ist nicht möglich." +msgstr "Initialisieren eines externen Archivs an Adresse »%s« ist nicht möglich." #: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 #: lib/transport.tcl:81 @@ -2210,7 +2210,7 @@ msgstr "Einrichten von »%s« an »%s«" #: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 msgid "Delete Branch Remotely" -msgstr "Zweig in anderem Archiv löschen" +msgstr "Zweig in externem Archiv löschen" #: lib/remote_branch_delete.tcl:47 msgid "From Repository" @@ -2218,7 +2218,7 @@ msgstr "In Projektarchiv" #: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" -msgstr "Anderes Archiv:" +msgstr "Externes Archiv:" #: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" @@ -2281,7 +2281,7 @@ msgstr "»%s« laden..." #: lib/remote.tcl:163 msgid "Remove Remote" -msgstr "Anderes Archiv entfernen" +msgstr "Externes Archiv entfernen" #: lib/remote.tcl:168 msgid "Prune from" @@ -2397,7 +2397,7 @@ msgid "Generation failed." msgstr "Schlüsselerzeugung fehlgeschlagen." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Schlüsselerzeugung erfolgreich, aber keine Schlüssel gefunden." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/fr.po b/git-gui/po/fr.po index 81706965f3..40441dbb0d 100644 --- a/git-gui/po/fr.po +++ b/git-gui/po/fr.po @@ -2399,7 +2399,7 @@ msgid "Generation failed." msgstr "La génération a échoué." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "La génération a réussi, mais aucune clé n'a été trouvée." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/git-gui.pot b/git-gui/po/git-gui.pot index 1ae2aaa0b3..0c94f9c2c6 100644 --- a/git-gui/po/git-gui.pot +++ b/git-gui/po/git-gui.pot @@ -2203,7 +2203,7 @@ msgid "Generation failed." msgstr "" #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/hu.po b/git-gui/po/hu.po index 0f87bc1cbe..d106dadac8 100644 --- a/git-gui/po/hu.po +++ b/git-gui/po/hu.po @@ -2354,7 +2354,7 @@ msgid "Generation failed." msgstr "A generálás nem sikerült." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "A generálás sikeres, de egy kulcs se található." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/it.po b/git-gui/po/it.po index aa15a204d8..1bd8b8e04f 100644 --- a/git-gui/po/it.po +++ b/git-gui/po/it.po @@ -2397,7 +2397,7 @@ msgid "Generation failed." msgstr "Errore durante la creazione della chiave." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "La chiave è stata creata con successo, ma non è stata trovata." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/ja.po b/git-gui/po/ja.po index 15017985e5..9aff249d5f 100644 --- a/git-gui/po/ja.po +++ b/git-gui/po/ja.po @@ -2362,7 +2362,7 @@ msgid "Generation failed." msgstr "生成に失敗しました。" #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "生成には成功しましたが、鍵が見つかりません。" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/nb.po b/git-gui/po/nb.po index 6de93c28c2..d66aa50263 100644 --- a/git-gui/po/nb.po +++ b/git-gui/po/nb.po @@ -2286,7 +2286,7 @@ msgid "Generation failed." msgstr "Generering feilet." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Generering vellykket, men ingen nøkler er funnet." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/pt_br.po b/git-gui/po/pt_br.po index b175b9791e..bad116c780 100644 --- a/git-gui/po/pt_br.po +++ b/git-gui/po/pt_br.po @@ -2375,7 +2375,7 @@ msgid "Generation failed." msgstr "A geração da chave falhou." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "A geração da chave foi bem-sucedida, mas nenhuma chave foi encontrada." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/ru.po b/git-gui/po/ru.po index 30f4b77dac..ca4343b40c 100644 --- a/git-gui/po/ru.po +++ b/git-gui/po/ru.po @@ -2370,7 +2370,7 @@ msgid "Generation failed." msgstr "Ключ не создан." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Создание ключа завершилось, но результат не был найден" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/sv.po b/git-gui/po/sv.po index 24cc4e3675..fcb063ffa6 100644 --- a/git-gui/po/sv.po +++ b/git-gui/po/sv.po @@ -2382,7 +2382,7 @@ msgid "Generation failed." msgstr "Misslyckades med att skapa." #: lib/sshkey.tcl:120 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Lyckades skapa nyckeln, men hittar inte någon nyckel." #: lib/sshkey.tcl:123 diff --git a/git-pull.sh b/git-pull.sh index 2a10047eb7..266e682f6c 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -200,6 +200,7 @@ test true = "$rebase" && { require_clean_work_tree "pull with rebase" "Please commit or stash them." fi oldremoteref= && + test -n "$curr_branch" && . git-parse-remote && remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && oldremoteref="$(git rev-parse -q --verify "$remoteref")" && diff --git a/git-sh-setup.sh b/git-sh-setup.sh index ee0e0bc045..22f0aed6db 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -191,28 +191,52 @@ require_clean_work_tree () { fi } +# Generate a sed script to parse identities from a commit. +# +# Reads the commit from stdin, which should be in raw format (e.g., from +# cat-file or "--pretty=raw"). +# +# The first argument specifies the ident line to parse (e.g., "author"), and +# the second specifies the environment variable to put it in (e.g., "AUTHOR" +# for "GIT_AUTHOR_*"). Multiple pairs can be given to parse author and +# committer. +pick_ident_script () { + while test $# -gt 0 + do + lid=$1; shift + uid=$1; shift + printf '%s' " + /^$lid /{ + s/'/'\\\\''/g + h + s/^$lid "'\([^<]*\) <[^>]*> .*$/\1/'" + s/.*/GIT_${uid}_NAME='&'/p + + g + s/^$lid "'[^<]* <\([^>]*\)> .*$/\1/'" + s/.*/GIT_${uid}_EMAIL='&'/p + + g + s/^$lid "'[^<]* <[^>]*> \(.*\)$/@\1/'" + s/.*/GIT_${uid}_DATE='&'/p + } + " + done + echo '/^$/q' +} + +# Create a pick-script as above and feed it to sed. Stdout is suitable for +# feeding to eval. +parse_ident_from_commit () { + LANG=C LC_ALL=C sed -ne "$(pick_ident_script "$@")" +} + +# Parse the author from a commit given as an argument. Stdout is suitable for +# feeding to eval to set the usual GIT_* ident variables. get_author_ident_from_commit () { - pick_author_script=' - /^author /{ - s/'\''/'\''\\'\'\''/g - h - s/^author \([^<]*\) <[^>]*> .*$/\1/ - s/.*/GIT_AUTHOR_NAME='\''&'\''/p - - g - s/^author [^<]* <\([^>]*\)> .*$/\1/ - s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p - - g - s/^author [^<]* <[^>]*> \(.*\)$/@\1/ - s/.*/GIT_AUTHOR_DATE='\''&'\''/p - - q - } - ' encoding=$(git config i18n.commitencoding || echo UTF-8) git show -s --pretty=raw --encoding="$encoding" "$1" -- | - LANG=C LC_ALL=C sed -ne "$pick_author_script" + parse_ident_from_commit author AUTHOR } # Clear repo-local GIT_* environment variables. Useful when switching to diff --git a/git-submodule.sh b/git-submodule.sh index ab6b1107b6..3d1617fa9e 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -5,7 +5,7 @@ # Copyright (c) 2007 Lars Hjemli dashless=$(basename "$0" | sed -e 's/-/ /') -USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <repository> [<path>] +USAGE="[--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] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...] @@ -29,6 +29,7 @@ files= nofetch= update= prefix= +custom_name= # The function takes at most 2 arguments. The first argument is the # URL that navigates to the submodule origin repo. When relative, this URL @@ -179,8 +180,9 @@ module_name() module_clone() { sm_path=$1 - url=$2 - reference="$3" + name=$2 + url=$3 + reference="$4" quiet= if test -n "$GIT_QUIET" then @@ -189,8 +191,6 @@ module_clone() gitdir= gitdir_base= - name=$(module_name "$sm_path" 2>/dev/null) - test -n "$name" || name="$sm_path" base_name=$(dirname "$name") gitdir=$(git rev-parse --git-dir) @@ -270,6 +270,10 @@ cmd_add() ;; --reference=*) reference="$1" + ;; + --name) + case "$2" in '') usage ;; esac + custom_name=$2 shift ;; --) @@ -336,6 +340,13 @@ Use -f if you really want to add it." >&2 exit 1 fi + if test -n "$custom_name" + then + sm_name="$custom_name" + else + sm_name="$sm_path" + fi + # perhaps the path exists and is already a git repo, else clone it if test -e "$sm_path" then @@ -347,8 +358,21 @@ Use -f if you really want to add it." >&2 fi else - - module_clone "$sm_path" "$realrepo" "$reference" || exit + if test -d ".git/modules/$sm_name" + then + if test -z "$force" + then + echo >&2 "$(eval_gettext "A git directory for '\$sm_name' is found locally with remote(s):")" + GIT_DIR=".git/modules/$sm_name" GIT_WORK_TREE=. git remote -v | grep '(fetch)' | sed -e s,^," ", -e s,' (fetch)',, >&2 + echo >&2 "$(eval_gettext "If you want to reuse this local git directory instead of cloning again from")" + echo >&2 " $realrepo" + echo >&2 "$(eval_gettext "use the '--force' option. If the local git directory is not the correct repo")" + die "$(eval_gettext "or you are unsure what this means choose another name with the '--name' option.")" + else + echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")" + fi + fi + module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" || exit ( clear_local_git_env cd "$sm_path" && @@ -359,13 +383,13 @@ Use -f if you really want to add it." >&2 esac ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")" fi - git config submodule."$sm_path".url "$realrepo" + git config submodule."$sm_name".url "$realrepo" git add $force "$sm_path" || die "$(eval_gettext "Failed to add submodule '\$sm_path'")" - git config -f .gitmodules submodule."$sm_path".path "$sm_path" && - git config -f .gitmodules submodule."$sm_path".url "$repo" && + git config -f .gitmodules submodule."$sm_name".path "$sm_path" && + git config -f .gitmodules submodule."$sm_name".url "$repo" && git add --force .gitmodules || die "$(eval_gettext "Failed to register submodule '\$sm_path'")" } @@ -594,7 +618,7 @@ Maybe you want to use 'update --init'?")" if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git then - module_clone "$sm_path" "$url" "$reference"|| exit + module_clone "$sm_path" "$name" "$url" "$reference" || exit cloned_modules="$cloned_modules;$name" subsha1= else diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 7f8c1878d4..10ed9e51a5 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -8028,7 +8028,7 @@ sub git_feed { %latest_commit = %{$commitlist[0]}; my $latest_epoch = $latest_commit{'committer_epoch'}; exit_if_unmodified_since($latest_epoch); - %latest_date = parse_date($latest_epoch, $latest_commit{'comitter_tz'}); + %latest_date = parse_date($latest_epoch, $latest_commit{'committer_tz'}); } print $cgi->header( -type => $content_type, @@ -6,6 +6,183 @@ static int grep_source_load(struct grep_source *gs); static int grep_source_is_binary(struct grep_source *gs); +static struct grep_opt grep_defaults; + +/* + * Initialize the grep_defaults template with hardcoded defaults. + * We could let the compiler do this, but without C99 initializers + * the code gets unwieldy and unreadable, so... + */ +void init_grep_defaults(void) +{ + struct grep_opt *opt = &grep_defaults; + static int run_once; + + if (run_once) + return; + run_once++; + + memset(opt, 0, sizeof(*opt)); + opt->relative = 1; + opt->pathname = 1; + opt->regflags = REG_NEWLINE; + opt->max_depth = -1; + opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED; + opt->extended_regexp_option = 0; + strcpy(opt->color_context, ""); + strcpy(opt->color_filename, ""); + strcpy(opt->color_function, ""); + strcpy(opt->color_lineno, ""); + strcpy(opt->color_match, GIT_COLOR_BOLD_RED); + strcpy(opt->color_selected, ""); + strcpy(opt->color_sep, GIT_COLOR_CYAN); + opt->color = -1; +} + +static int parse_pattern_type_arg(const char *opt, const char *arg) +{ + if (!strcmp(arg, "default")) + return GREP_PATTERN_TYPE_UNSPECIFIED; + else if (!strcmp(arg, "basic")) + return GREP_PATTERN_TYPE_BRE; + else if (!strcmp(arg, "extended")) + return GREP_PATTERN_TYPE_ERE; + else if (!strcmp(arg, "fixed")) + return GREP_PATTERN_TYPE_FIXED; + else if (!strcmp(arg, "perl")) + return GREP_PATTERN_TYPE_PCRE; + die("bad %s argument: %s", opt, arg); +} + +/* + * Read the configuration file once and store it in + * the grep_defaults template. + */ +int grep_config(const char *var, const char *value, void *cb) +{ + struct grep_opt *opt = &grep_defaults; + char *color = NULL; + + if (userdiff_config(var, value) < 0) + return -1; + + if (!strcmp(var, "grep.extendedregexp")) { + if (git_config_bool(var, value)) + opt->extended_regexp_option = 1; + else + opt->extended_regexp_option = 0; + return 0; + } + + if (!strcmp(var, "grep.patterntype")) { + opt->pattern_type_option = parse_pattern_type_arg(var, value); + return 0; + } + + if (!strcmp(var, "grep.linenumber")) { + opt->linenum = git_config_bool(var, value); + return 0; + } + + if (!strcmp(var, "color.grep")) + opt->color = git_config_colorbool(var, value); + else if (!strcmp(var, "color.grep.context")) + color = opt->color_context; + else if (!strcmp(var, "color.grep.filename")) + color = opt->color_filename; + else if (!strcmp(var, "color.grep.function")) + color = opt->color_function; + else if (!strcmp(var, "color.grep.linenumber")) + color = opt->color_lineno; + else if (!strcmp(var, "color.grep.match")) + color = opt->color_match; + else if (!strcmp(var, "color.grep.selected")) + color = opt->color_selected; + else if (!strcmp(var, "color.grep.separator")) + color = opt->color_sep; + + if (color) { + if (!value) + return config_error_nonbool(var); + color_parse(value, var, color); + } + return 0; +} + +/* + * Initialize one instance of grep_opt and copy the + * default values from the template we read the configuration + * information in an earlier call to git_config(grep_config). + */ +void grep_init(struct grep_opt *opt, const char *prefix) +{ + struct grep_opt *def = &grep_defaults; + + memset(opt, 0, sizeof(*opt)); + opt->prefix = prefix; + opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0; + opt->pattern_tail = &opt->pattern_list; + opt->header_tail = &opt->header_list; + + opt->color = def->color; + opt->extended_regexp_option = def->extended_regexp_option; + opt->pattern_type_option = def->pattern_type_option; + opt->linenum = def->linenum; + opt->max_depth = def->max_depth; + opt->pathname = def->pathname; + opt->regflags = def->regflags; + opt->relative = def->relative; + + strcpy(opt->color_context, def->color_context); + strcpy(opt->color_filename, def->color_filename); + strcpy(opt->color_function, def->color_function); + strcpy(opt->color_lineno, def->color_lineno); + strcpy(opt->color_match, def->color_match); + strcpy(opt->color_selected, def->color_selected); + strcpy(opt->color_sep, def->color_sep); +} + +void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt) +{ + if (pattern_type != GREP_PATTERN_TYPE_UNSPECIFIED) + grep_set_pattern_type_option(pattern_type, opt); + else if (opt->pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED) + grep_set_pattern_type_option(opt->pattern_type_option, opt); + else if (opt->extended_regexp_option) + grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, opt); +} + +void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt) +{ + switch (pattern_type) { + case GREP_PATTERN_TYPE_UNSPECIFIED: + /* fall through */ + + case GREP_PATTERN_TYPE_BRE: + opt->fixed = 0; + opt->pcre = 0; + opt->regflags &= ~REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_ERE: + opt->fixed = 0; + opt->pcre = 0; + opt->regflags |= REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_FIXED: + opt->fixed = 1; + opt->pcre = 0; + opt->regflags &= ~REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_PCRE: + opt->fixed = 0; + opt->pcre = 1; + opt->regflags &= ~REG_EXTENDED; + break; + } +} static struct grep_pat *create_grep_pat(const char *pat, size_t patlen, const char *origin, int no, @@ -1373,7 +1550,7 @@ int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size) struct grep_source gs; int r; - grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL); + grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL, NULL); gs.buf = buf; gs.size = size; @@ -1384,10 +1561,12 @@ int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size) } void grep_source_init(struct grep_source *gs, enum grep_source_type type, - const char *name, const void *identifier) + const char *name, const char *path, + const void *identifier) { gs->type = type; gs->name = name ? xstrdup(name) : NULL; + gs->path = path ? xstrdup(path) : NULL; gs->buf = NULL; gs->size = 0; gs->driver = NULL; @@ -1409,6 +1588,8 @@ void grep_source_clear(struct grep_source *gs) { free(gs->name); gs->name = NULL; + free(gs->path); + gs->path = NULL; free(gs->identifier); gs->identifier = NULL; grep_source_clear_data(gs); @@ -1501,7 +1682,8 @@ void grep_source_load_driver(struct grep_source *gs) return; grep_attr_lock(); - gs->driver = userdiff_find_by_path(gs->name); + if (gs->path) + gs->driver = userdiff_find_by_path(gs->path); if (!gs->driver) gs->driver = userdiff_find_by_name("default"); grep_attr_unlock(); @@ -138,6 +138,12 @@ struct grep_opt { void *output_priv; }; +extern void init_grep_defaults(void); +extern int grep_config(const char *var, const char *value, void *); +extern void grep_init(struct grep_opt *, const char *prefix); +void grep_set_pattern_type_option(enum grep_pattern_type, struct grep_opt *opt); +void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt); + extern void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t); extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t); extern void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *); @@ -158,11 +164,13 @@ struct grep_source { char *buf; unsigned long size; + char *path; /* for attribute lookups */ struct userdiff_driver *driver; }; void grep_source_init(struct grep_source *gs, enum grep_source_type type, - const char *name, const void *identifier); + const char *name, const char *path, + const void *identifier); void grep_source_clear_data(struct grep_source *gs); void grep_source_clear(struct grep_source *gs); void grep_source_load_driver(struct grep_source *gs); @@ -745,10 +745,8 @@ char *get_remote_object_url(const char *url, const char *hex, return strbuf_detach(&buf, NULL); } -int handle_curl_result(struct active_request_slot *slot) +int handle_curl_result(struct slot_results *results) { - struct slot_results *results = slot->results; - if (results->curl_result == CURLE_OK) { credential_approve(&http_auth); return HTTP_OK; @@ -760,7 +758,6 @@ int handle_curl_result(struct active_request_slot *slot) return HTTP_NOAUTH; } else { credential_fill(&http_auth); - init_curl_http_auth(slot->curl); return HTTP_REAUTH; } } else { @@ -822,7 +819,7 @@ static int http_request(const char *url, void *result, int target, int options) if (start_active_slot(slot)) { run_active_slot(slot); - ret = handle_curl_result(slot); + ret = handle_curl_result(&results); } else { error("Unable to start HTTP request for %s", url); ret = HTTP_START_FAILED; @@ -78,7 +78,7 @@ extern int start_active_slot(struct active_request_slot *slot); extern void run_active_slot(struct active_request_slot *slot); extern void finish_active_slot(struct active_request_slot *slot); extern void finish_all_active_slots(void); -extern int handle_curl_result(struct active_request_slot *slot); +extern int handle_curl_result(struct slot_results *results); #ifdef USE_CURL_MULTI extern void fill_active_slots(void); @@ -118,7 +118,7 @@ static char *parse_name_and_email(char *buffer, char **name, while (isspace(*nstart) && nstart < left) ++nstart; nend = left-1; - while (isspace(*nend) && nend > nstart) + while (nend > nstart && isspace(*nend)) --nend; *name = (nstart < nend ? nstart : NULL); diff --git a/mergetools/p4merge b/mergetools/p4merge index 1a45c1b0c5..295361a8aa 100644 --- a/mergetools/p4merge +++ b/mergetools/p4merge @@ -1,5 +1,30 @@ diff_cmd () { + # p4merge does not like /dev/null + rm_local= + rm_remote= + if test "/dev/null" = "$LOCAL" + then + LOCAL="./p4merge-dev-null.LOCAL.$$" + >"$LOCAL" + rm_local=true + fi + if test "/dev/null" = "$REMOTE" + then + REMOTE="./p4merge-dev-null.REMOTE.$$" + >"$REMOTE" + rm_remote=true + fi + "$merge_tool_path" "$LOCAL" "$REMOTE" + + if test -n "$rm_local" + then + rm -f "$LOCAL" + fi + if test -n "$rm_remote" + then + rm -f "$REMOTE" + fi } merge_cmd () { @@ -11,21 +11,6 @@ * something different on Windows. */ -#ifndef WIN32 -static void pager_preexec(void) -{ - /* - * Work around bug in "less" by not starting it until we - * have real input - */ - fd_set in; - - FD_ZERO(&in); - FD_SET(0, &in); - select(1, &in, NULL, &in, NULL); -} -#endif - static const char *pager_argv[] = { NULL, NULL }; static struct child_process pager_process; @@ -93,9 +78,6 @@ void setup_pager(void) static const char *env[] = { "LESS=FRSX", NULL }; pager_process.env = env; } -#ifndef WIN32 - pager_process.preexec_cb = pager_preexec; -#endif if (start_command(&pager_process)) return; diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm index 755092fdff..3bbc20a054 100644 --- a/perl/Git/SVN/Editor.pm +++ b/perl/Git/SVN/Editor.pm @@ -345,7 +345,30 @@ sub M { $self->close_file($fbat,undef,$self->{pool}); } -sub T { shift->M(@_) } +sub T { + my ($self, $m, $deletions) = @_; + + # Work around subversion issue 4091: toggling the "is a + # symlink" property requires removing and re-adding a + # file or else "svn up" on affected clients trips an + # assertion and aborts. + if (($m->{mode_b} =~ /^120/ && $m->{mode_a} !~ /^120/) || + ($m->{mode_b} !~ /^120/ && $m->{mode_a} =~ /^120/)) { + $self->D({ + mode_a => $m->{mode_a}, mode_b => '000000', + sha1_a => $m->{sha1_a}, sha1_b => '0' x 40, + chg => 'D', file_b => $m->{file_b} + }); + $self->A({ + mode_a => '000000', mode_b => $m->{mode_b}, + sha1_a => '0' x 40, sha1_b => $m->{sha1_b}, + chg => 'A', file_b => $m->{file_b} + }); + return; + } + + $self->M($m, $deletions); +} sub change_file_prop { my ($self, $fbat, $pname, $pval) = @_; @@ -55,7 +55,7 @@ msgstr "Konnte '%s' nicht öffnen" #: bundle.c:140 msgid "Repository lacks these prerequisite commits:" -msgstr "Dem Projektarchiv fehlen folgende vorrausgesetzte Versionen:" +msgstr "Dem Projektarchiv fehlen folgende vorausgesetzte Versionen:" #: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 @@ -1755,7 +1755,7 @@ msgstr "Anzahl" #: builtin/apply.c:4290 msgid "remove <num> leading slashes from traditional diff paths" msgstr "" -"entfernt <Anzahl> vorrangestellte Schrägstriche von herkömmlichen " +"entfernt <Anzahl> vorangestellte Schrägstriche von herkömmlichen " "Differenzpfaden" #: builtin/apply.c:4293 @@ -2062,7 +2062,7 @@ msgstr "Konnte einige Referenzen nicht lesen" #: builtin/branch.c:613 msgid "cannot rename the current branch while not on any." msgstr "" -"Kann aktuellen Zweig nicht umbennen, solange du dich auf keinem befindest." +"Kann aktuellen Zweig nicht umbenennen, solange du dich auf keinem befindest." #: builtin/branch.c:623 #, c-format @@ -2346,7 +2346,7 @@ msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" -"git checkout: --ours/--theirs, --force and --merge sind inkompatibel wenn\n" +"git checkout: --ours/--theirs, --force und --merge sind inkompatibel wenn\n" "du aus der Bereitstellung auscheckst." #: builtin/checkout.c:1092 @@ -3654,7 +3654,7 @@ msgstr "Konnte %s nicht nach %s verschieben" #: builtin/init-db.c:363 #, c-format msgid "Could not create git link %s" -msgstr "Konnte git-Verknüfung %s nicht erstellen" +msgstr "Konnte git-Verknüpfung %s nicht erstellen" #. #. * TRANSLATORS: The first '%s' is either "Reinitialized @@ -3766,11 +3766,11 @@ msgstr "unechte Einreicher-Informationen %s" #: builtin/log.c:1202 msgid "-n and -k are mutually exclusive." -msgstr "-n und -k schliessen sich gegenseitig aus" +msgstr "-n und -k schließen sich gegenseitig aus" #: builtin/log.c:1204 msgid "--subject-prefix and -k are mutually exclusive." -msgstr "--subject-prefix und -k schliessen sich gegenseitig aus" +msgstr "--subject-prefix und -k schließen sich gegenseitig aus" #: builtin/log.c:1212 msgid "--name-only does not make sense" diff --git a/po/git.pot b/po/git.pot index 05177d6c8e..e5611581e6 100644 --- a/po/git.pot +++ b/po/git.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-09-15 10:21+0800\n" +"POT-Creation-Date: 2012-10-16 08:38+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -68,11 +68,11 @@ msgstr "" msgid "prepend prefix to each pathname in the archive" msgstr "" -#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332 -#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642 -#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77 -#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537 -#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149 +#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2389 +#: builtin/blame.c:2390 builtin/config.c:56 builtin/fast-export.c:642 +#: builtin/fast-export.c:644 builtin/grep.c:801 builtin/hash-object.c:77 +#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:540 +#: builtin/notes.c:697 builtin/read-tree.c:107 parse-options.h:149 msgid "file" msgstr "" @@ -112,7 +112,7 @@ msgstr "" msgid "retrieve the archive from remote repository <repo>" msgstr "" -#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616 +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 msgid "command" msgstr "" @@ -130,7 +130,7 @@ msgstr "" msgid "unrecognized header: %s%s (%d)" msgstr "" -#: bundle.c:89 builtin/commit.c:714 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "" @@ -139,7 +139,7 @@ msgstr "" msgid "Repository lacks these prerequisite commits:" msgstr "" -#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290 +#: bundle.c:164 sequencer.c:562 sequencer.c:994 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" @@ -198,12 +198,12 @@ msgstr "" msgid "index-pack died" msgstr "" -#: commit.c:48 +#: commit.c:50 #, c-format msgid "could not parse %s" msgstr "" -#: commit.c:50 +#: commit.c:52 #, c-format msgid "%s %s is not a commit!" msgstr "" @@ -310,32 +310,7 @@ msgid "" "%s" msgstr "" -#: diff.c:1401 -msgid " 0 files changed" -msgstr "" - -#: diff.c:1405 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1422 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1433 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:3460 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -354,17 +329,17 @@ msgstr "" msgid "gpg failed to sign the data" msgstr "" -#: grep.c:1320 +#: grep.c:1441 #, c-format msgid "'%s': unable to read %s" msgstr "" -#: grep.c:1337 +#: grep.c:1458 #, c-format msgid "'%s': %s" msgstr "" -#: grep.c:1348 +#: grep.c:1469 #, c-format msgid "'%s': short read %s" msgstr "" @@ -709,239 +684,239 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977 +#: sequencer.c:123 builtin/merge.c:864 builtin/merge.c:977 #: builtin/merge.c:1087 builtin/merge.c:1097 #, c-format msgid "Could not open '%s' for writing" msgstr "" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867 +#: sequencer.c:125 builtin/merge.c:333 builtin/merge.c:867 #: builtin/merge.c:1089 builtin/merge.c:1102 #, c-format msgid "Could not write to '%s'" msgstr "" -#: sequencer.c:144 +#: sequencer.c:146 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" msgstr "" -#: sequencer.c:147 +#: sequencer.c:149 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" "and commit the result with 'git commit'" msgstr "" -#: sequencer.c:160 sequencer.c:765 sequencer.c:848 +#: sequencer.c:162 sequencer.c:770 sequencer.c:853 #, c-format msgid "Could not write to %s" msgstr "" -#: sequencer.c:163 +#: sequencer.c:165 #, c-format msgid "Error wrapping up %s" msgstr "" -#: sequencer.c:178 +#: sequencer.c:180 msgid "Your local changes would be overwritten by cherry-pick." msgstr "" -#: sequencer.c:180 +#: sequencer.c:182 msgid "Your local changes would be overwritten by revert." msgstr "" -#: sequencer.c:183 +#: sequencer.c:185 msgid "Commit your changes or stash them to proceed." msgstr "" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:233 +#: sequencer.c:235 #, c-format msgid "%s: Unable to write new index file" msgstr "" -#: sequencer.c:261 +#: sequencer.c:266 msgid "Could not resolve HEAD commit\n" msgstr "" -#: sequencer.c:282 +#: sequencer.c:287 msgid "Unable to update cache tree\n" msgstr "" -#: sequencer.c:327 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "" -#: sequencer.c:332 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "" -#: sequencer.c:398 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "" -#: sequencer.c:401 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "" -#: sequencer.c:416 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -#: sequencer.c:424 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "" -#: sequencer.c:428 +#: sequencer.c:433 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:439 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "" -#: sequencer.c:443 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "" -#: sequencer.c:527 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "" -#: sequencer.c:528 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "" -#: sequencer.c:560 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "" -#: sequencer.c:568 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "" -#: sequencer.c:573 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "" -#: sequencer.c:631 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "" -#: sequencer.c:653 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "" -#: sequencer.c:658 +#: sequencer.c:663 msgid "No commits parsed." msgstr "" -#: sequencer.c:671 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "" -#: sequencer.c:675 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "" -#: sequencer.c:682 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "" -#: sequencer.c:710 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "" -#: sequencer.c:713 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "" -#: sequencer.c:725 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "" -#: sequencer.c:746 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "" -#: sequencer.c:747 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "" -#: sequencer.c:751 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "" -#: sequencer.c:767 sequencer.c:852 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "" -#: sequencer.c:786 sequencer.c:920 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "" -#: sequencer.c:788 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "" -#: sequencer.c:790 +#: sequencer.c:795 msgid "cannot abort from a branch yet to be born" msgstr "" -#: sequencer.c:812 builtin/apply.c:4005 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "" -#: sequencer.c:815 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "" -#: sequencer.c:816 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "" -#: sequencer.c:822 +#: sequencer.c:827 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" -#: sequencer.c:845 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "" -#: sequencer.c:1007 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "" -#: sequencer.c:1008 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "" @@ -1324,7 +1299,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "" -#: builtin/add.c:67 builtin/commit.c:229 +#: builtin/add.c:67 builtin/commit.c:230 msgid "updating files failed" msgstr "" @@ -1389,7 +1364,7 @@ msgstr "" msgid "dry run" msgstr "" -#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187 +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1154 #: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477 #: builtin/mv.c:62 builtin/read-tree.c:112 msgid "be verbose" @@ -1466,7 +1441,7 @@ msgstr "" msgid "Maybe you wanted to say 'git add .'?\n" msgstr "" -#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82 +#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:290 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "" @@ -2000,95 +1975,95 @@ msgstr "" msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "" -#: builtin/blame.c:2316 +#: builtin/blame.c:2373 msgid "Show blame entries as we find them, incrementally" msgstr "" -#: builtin/blame.c:2317 +#: builtin/blame.c:2374 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "" -#: builtin/blame.c:2318 +#: builtin/blame.c:2375 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "" -#: builtin/blame.c:2319 +#: builtin/blame.c:2376 msgid "Show work cost statistics" msgstr "" -#: builtin/blame.c:2320 +#: builtin/blame.c:2377 msgid "Show output score for blame entries" msgstr "" -#: builtin/blame.c:2321 +#: builtin/blame.c:2378 msgid "Show original filename (Default: auto)" msgstr "" -#: builtin/blame.c:2322 +#: builtin/blame.c:2379 msgid "Show original linenumber (Default: off)" msgstr "" -#: builtin/blame.c:2323 +#: builtin/blame.c:2380 msgid "Show in a format designed for machine consumption" msgstr "" -#: builtin/blame.c:2324 +#: builtin/blame.c:2381 msgid "Show porcelain format with per-line commit information" msgstr "" -#: builtin/blame.c:2325 +#: builtin/blame.c:2382 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "" -#: builtin/blame.c:2326 +#: builtin/blame.c:2383 msgid "Show raw timestamp (Default: off)" msgstr "" -#: builtin/blame.c:2327 +#: builtin/blame.c:2384 msgid "Show long commit SHA1 (Default: off)" msgstr "" -#: builtin/blame.c:2328 +#: builtin/blame.c:2385 msgid "Suppress author name and timestamp (Default: off)" msgstr "" -#: builtin/blame.c:2329 +#: builtin/blame.c:2386 msgid "Show author email instead of name (Default: off)" msgstr "" -#: builtin/blame.c:2330 +#: builtin/blame.c:2387 msgid "Ignore whitespace differences" msgstr "" -#: builtin/blame.c:2331 +#: builtin/blame.c:2388 msgid "Spend extra cycles to find better match" msgstr "" -#: builtin/blame.c:2332 +#: builtin/blame.c:2389 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "" -#: builtin/blame.c:2333 +#: builtin/blame.c:2390 msgid "Use <file>'s contents as the final image" msgstr "" -#: builtin/blame.c:2334 builtin/blame.c:2335 +#: builtin/blame.c:2391 builtin/blame.c:2392 msgid "score" msgstr "" -#: builtin/blame.c:2334 +#: builtin/blame.c:2391 msgid "Find line copies within and across files" msgstr "" -#: builtin/blame.c:2335 +#: builtin/blame.c:2392 msgid "Find line movements within and across files" msgstr "" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "n,m" msgstr "" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "Process only line range n,m, counting from 1" msgstr "" @@ -2290,8 +2265,8 @@ msgid "act on remote-tracking branches" msgstr "" #: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765 -#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396 -#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470 +#: builtin/branch.c:771 builtin/commit.c:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 msgid "commit" msgstr "" @@ -2460,7 +2435,7 @@ msgid "git check-attr [-a | --all | attr...] [--] pathname..." msgstr "" #: builtin/check-attr.c:12 -msgid "git check-attr --stdin [-a | --all | attr...] < <list-of-paths>" +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>" msgstr "" #: builtin/check-attr.c:19 @@ -2823,7 +2798,7 @@ msgstr "" msgid "remove whole directories" msgstr "" -#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802 +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:803 #: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 msgid "pattern" msgstr "" @@ -2945,7 +2920,7 @@ msgstr "" msgid "path to git-upload-pack on the remote" msgstr "" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747 +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 msgid "depth" msgstr "" @@ -3022,69 +2997,69 @@ msgstr "" msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" -#: builtin/clone.c:642 +#: builtin/clone.c:690 msgid "Too many arguments." msgstr "" -#: builtin/clone.c:646 +#: builtin/clone.c:694 msgid "You must specify a repository to clone." msgstr "" -#: builtin/clone.c:657 +#: builtin/clone.c:705 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "" -#: builtin/clone.c:671 +#: builtin/clone.c:719 #, c-format msgid "repository '%s' does not exist" msgstr "" -#: builtin/clone.c:676 +#: builtin/clone.c:724 msgid "--depth is ignored in local clones; use file:// instead." msgstr "" -#: builtin/clone.c:686 +#: builtin/clone.c:734 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "" -#: builtin/clone.c:696 +#: builtin/clone.c:744 #, c-format msgid "working tree '%s' already exists." msgstr "" -#: builtin/clone.c:709 builtin/clone.c:723 +#: builtin/clone.c:757 builtin/clone.c:771 #, c-format msgid "could not create leading directories of '%s'" msgstr "" -#: builtin/clone.c:712 +#: builtin/clone.c:760 #, c-format msgid "could not create work tree dir '%s'." msgstr "" -#: builtin/clone.c:731 +#: builtin/clone.c:779 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "" -#: builtin/clone.c:733 +#: builtin/clone.c:781 #, c-format msgid "Cloning into '%s'...\n" msgstr "" -#: builtin/clone.c:789 +#: builtin/clone.c:823 #, c-format msgid "Don't know how to clone %s" msgstr "" -#: builtin/clone.c:838 +#: builtin/clone.c:872 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "" -#: builtin/clone.c:845 +#: builtin/clone.c:879 msgid "You appear to have cloned an empty repository." msgstr "" @@ -3120,15 +3095,15 @@ msgstr "" msgid "--command must be the first argument" msgstr "" -#: builtin/commit.c:33 +#: builtin/commit.c:34 msgid "git commit [options] [--] <filepattern>..." msgstr "" -#: builtin/commit.c:38 +#: builtin/commit.c:39 msgid "git status [options] [--] <filepattern>..." msgstr "" -#: builtin/commit.c:43 +#: builtin/commit.c:44 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3142,14 +3117,14 @@ msgid "" " git commit --amend --reset-author\n" msgstr "" -#: builtin/commit.c:55 +#: builtin/commit.c:56 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" "remove the commit entirely with \"git reset HEAD^\".\n" msgstr "" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3159,93 +3134,93 @@ msgid "" "Otherwise, please use 'git reset'\n" msgstr "" -#: builtin/commit.c:256 +#: builtin/commit.c:257 msgid "failed to unpack HEAD tree object" msgstr "" -#: builtin/commit.c:298 +#: builtin/commit.c:299 msgid "unable to create temporary index" msgstr "" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "interactive add failed" msgstr "" -#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408 +#: builtin/commit.c:338 builtin/commit.c:359 builtin/commit.c:409 msgid "unable to write new_index file" msgstr "" -#: builtin/commit.c:389 +#: builtin/commit.c:390 msgid "cannot do a partial commit during a merge." msgstr "" -#: builtin/commit.c:391 +#: builtin/commit.c:392 msgid "cannot do a partial commit during a cherry-pick." msgstr "" -#: builtin/commit.c:401 +#: builtin/commit.c:402 msgid "cannot read the index" msgstr "" -#: builtin/commit.c:421 +#: builtin/commit.c:422 msgid "unable to write temporary index file" msgstr "" -#: builtin/commit.c:510 builtin/commit.c:516 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "" -#: builtin/commit.c:539 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "" -#: builtin/commit.c:600 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "" -#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985 +#: builtin/commit.c:596 builtin/commit.c:629 builtin/commit.c:952 #, c-format msgid "could not lookup commit %s" msgstr "" -#: builtin/commit.c:650 builtin/shortlog.c:296 +#: builtin/commit.c:608 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "" -#: builtin/commit.c:652 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "" -#: builtin/commit.c:656 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "" -#: builtin/commit.c:662 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "" -#: builtin/commit.c:678 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "" -#: builtin/commit.c:682 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "" -#: builtin/commit.c:686 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "" -#: builtin/commit.c:738 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "" -#: builtin/commit.c:749 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -3255,7 +3230,7 @@ msgid "" "and try again.\n" msgstr "" -#: builtin/commit.c:754 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -3265,356 +3240,356 @@ msgid "" "and try again.\n" msgstr "" -#: builtin/commit.c:766 +#: builtin/commit.c:733 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:771 +#: builtin/commit.c:738 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" "An empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:784 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "" -#: builtin/commit.c:791 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "" -#: builtin/commit.c:811 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "" -#: builtin/commit.c:848 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "" -#: builtin/commit.c:863 builtin/tag.c:361 +#: builtin/commit.c:830 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "" -#: builtin/commit.c:960 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "" -#: builtin/commit.c:975 builtin/commit.c:1175 +#: builtin/commit.c:942 builtin/commit.c:1142 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "" -#: builtin/commit.c:1015 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "" -#: builtin/commit.c:1026 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "" -#: builtin/commit.c:1029 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "" -#: builtin/commit.c:1031 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" -#: builtin/commit.c:1034 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "" -#: builtin/commit.c:1044 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "" -#: builtin/commit.c:1046 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "" -#: builtin/commit.c:1054 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" -#: builtin/commit.c:1071 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" -#: builtin/commit.c:1073 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "" -#: builtin/commit.c:1075 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "" -#: builtin/commit.c:1077 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -#: builtin/commit.c:1087 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "" -#: builtin/commit.c:1092 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "" -#: builtin/commit.c:1189 builtin/commit.c:1417 +#: builtin/commit.c:1156 builtin/commit.c:1384 msgid "show status concisely" msgstr "" -#: builtin/commit.c:1191 builtin/commit.c:1419 +#: builtin/commit.c:1158 builtin/commit.c:1386 msgid "show branch information" msgstr "" -#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389 +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 msgid "machine-readable output" msgstr "" -#: builtin/commit.c:1196 builtin/commit.c:1423 +#: builtin/commit.c:1163 builtin/commit.c:1390 msgid "terminate entries with NUL" msgstr "" -#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636 +#: builtin/commit.c:1165 builtin/commit.c:1393 builtin/fast-export.c:636 #: builtin/fast-export.c:639 builtin/tag.c:461 msgid "mode" msgstr "" -#: builtin/commit.c:1199 builtin/commit.c:1426 +#: builtin/commit.c:1166 builtin/commit.c:1393 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" -#: builtin/commit.c:1202 +#: builtin/commit.c:1169 msgid "show ignored files" msgstr "" -#: builtin/commit.c:1203 parse-options.h:151 +#: builtin/commit.c:1170 parse-options.h:151 msgid "when" msgstr "" -#: builtin/commit.c:1204 +#: builtin/commit.c:1171 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" msgstr "" -#: builtin/commit.c:1206 +#: builtin/commit.c:1173 msgid "list untracked files in columns" msgstr "" -#: builtin/commit.c:1275 +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "" -#: builtin/commit.c:1277 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "" -#: builtin/commit.c:1318 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "" -#: builtin/commit.c:1320 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr "" -#: builtin/commit.c:1387 +#: builtin/commit.c:1354 msgid "suppress summary after successful commit" msgstr "" -#: builtin/commit.c:1388 +#: builtin/commit.c:1355 msgid "show diff in commit message template" msgstr "" -#: builtin/commit.c:1390 +#: builtin/commit.c:1357 msgid "Commit message options" msgstr "" -#: builtin/commit.c:1391 builtin/tag.c:459 +#: builtin/commit.c:1358 builtin/tag.c:459 msgid "read message from file" msgstr "" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "author" msgstr "" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "override author for commit" msgstr "" -#: builtin/commit.c:1393 builtin/gc.c:178 +#: builtin/commit.c:1360 builtin/gc.c:178 msgid "date" msgstr "" -#: builtin/commit.c:1393 +#: builtin/commit.c:1360 msgid "override date for commit" msgstr "" -#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534 -#: builtin/notes.c:691 builtin/tag.c:457 +#: builtin/commit.c:1361 builtin/merge.c:206 builtin/notes.c:537 +#: builtin/notes.c:694 builtin/tag.c:457 msgid "message" msgstr "" -#: builtin/commit.c:1394 +#: builtin/commit.c:1361 msgid "commit message" msgstr "" -#: builtin/commit.c:1395 +#: builtin/commit.c:1362 msgid "reuse and edit message from specified commit" msgstr "" -#: builtin/commit.c:1396 +#: builtin/commit.c:1363 msgid "reuse message from specified commit" msgstr "" -#: builtin/commit.c:1397 +#: builtin/commit.c:1364 msgid "use autosquash formatted message to fixup specified commit" msgstr "" -#: builtin/commit.c:1398 +#: builtin/commit.c:1365 msgid "use autosquash formatted message to squash specified commit" msgstr "" -#: builtin/commit.c:1399 +#: builtin/commit.c:1366 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "" -#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109 +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 msgid "add Signed-off-by:" msgstr "" -#: builtin/commit.c:1401 +#: builtin/commit.c:1368 msgid "use specified template file" msgstr "" -#: builtin/commit.c:1402 +#: builtin/commit.c:1369 msgid "force edit of commit" msgstr "" -#: builtin/commit.c:1403 +#: builtin/commit.c:1370 msgid "default" msgstr "" -#: builtin/commit.c:1403 builtin/tag.c:462 +#: builtin/commit.c:1370 builtin/tag.c:462 msgid "how to strip spaces and #comments from message" msgstr "" -#: builtin/commit.c:1404 +#: builtin/commit.c:1371 msgid "include status in commit message template" msgstr "" -#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463 +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 msgid "key id" msgstr "" -#: builtin/commit.c:1406 builtin/merge.c:214 +#: builtin/commit.c:1373 builtin/merge.c:214 msgid "GPG sign commit" msgstr "" #. end commit message options -#: builtin/commit.c:1409 +#: builtin/commit.c:1376 msgid "Commit contents options" msgstr "" -#: builtin/commit.c:1410 +#: builtin/commit.c:1377 msgid "commit all changed files" msgstr "" -#: builtin/commit.c:1411 +#: builtin/commit.c:1378 msgid "add specified files to index for commit" msgstr "" -#: builtin/commit.c:1412 +#: builtin/commit.c:1379 msgid "interactively add files" msgstr "" -#: builtin/commit.c:1413 +#: builtin/commit.c:1380 msgid "interactively add changes" msgstr "" -#: builtin/commit.c:1414 +#: builtin/commit.c:1381 msgid "commit only specified files" msgstr "" -#: builtin/commit.c:1415 +#: builtin/commit.c:1382 msgid "bypass pre-commit hook" msgstr "" -#: builtin/commit.c:1416 +#: builtin/commit.c:1383 msgid "show what would be committed" msgstr "" -#: builtin/commit.c:1424 +#: builtin/commit.c:1391 msgid "amend previous commit" msgstr "" -#: builtin/commit.c:1425 +#: builtin/commit.c:1392 msgid "bypass post-rewrite hook" msgstr "" -#: builtin/commit.c:1430 +#: builtin/commit.c:1397 msgid "ok to record an empty change" msgstr "" -#: builtin/commit.c:1433 +#: builtin/commit.c:1400 msgid "ok to record a change with an empty message" msgstr "" -#: builtin/commit.c:1464 +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "" -#: builtin/commit.c:1502 builtin/merge.c:508 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "" -#: builtin/commit.c:1509 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "" -#: builtin/commit.c:1516 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "" -#: builtin/commit.c:1535 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "" -#: builtin/commit.c:1549 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" -#: builtin/commit.c:1554 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" -#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "" -#: builtin/commit.c:1590 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "" -#: builtin/commit.c:1594 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "" -#: builtin/commit.c:1605 +#: builtin/commit.c:1573 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4034,145 +4009,145 @@ msgstr "" msgid "object %s not found" msgstr "" -#: builtin/fetch.c:260 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "" -#: builtin/fetch.c:274 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "" -#: builtin/fetch.c:275 builtin/fetch.c:361 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "" -#: builtin/fetch.c:286 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "" -#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr "" -#: builtin/fetch.c:306 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "" -#: builtin/fetch.c:309 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "" -#: builtin/fetch.c:312 +#: builtin/fetch.c:311 msgid "[new ref]" msgstr "" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "forced update" msgstr "" -#: builtin/fetch.c:363 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" msgstr "" -#: builtin/fetch.c:394 builtin/fetch.c:686 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "" -#: builtin/fetch.c:403 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "" -#: builtin/fetch.c:489 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "" -#: builtin/fetch.c:500 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" " 'git remote prune %s' to remove any old, conflicting branches" msgstr "" -#: builtin/fetch.c:550 +#: builtin/fetch.c:549 #, c-format msgid " (%s will become dangling)" msgstr "" -#: builtin/fetch.c:551 +#: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)" msgstr "" -#: builtin/fetch.c:558 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "" -#: builtin/fetch.c:559 builtin/remote.c:1055 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "" -#: builtin/fetch.c:676 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" -#: builtin/fetch.c:710 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "" -#: builtin/fetch.c:787 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "" -#: builtin/fetch.c:790 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "" -#: builtin/fetch.c:892 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "" -#: builtin/fetch.c:894 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "" -#: builtin/fetch.c:913 +#: builtin/fetch.c:912 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." msgstr "" -#: builtin/fetch.c:933 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "" -#: builtin/fetch.c:985 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "" -#: builtin/fetch.c:987 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "" -#: builtin/fetch.c:998 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "" -#: builtin/fetch.c:1006 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" @@ -4180,7 +4155,7 @@ msgstr "" msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" msgstr "" -#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786 +#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:787 #: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192 #: builtin/tag.c:448 parse-options.h:133 parse-options.h:235 msgid "n" @@ -4316,19 +4291,14 @@ msgstr "" msgid "enable auto-gc mode" msgstr "" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "" - -#: builtin/gc.c:224 +#: builtin/gc.c:222 #, c-format 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 "" -#: builtin/gc.c:251 +#: builtin/gc.c:249 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -4337,226 +4307,230 @@ msgstr "" msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "" -#: builtin/grep.c:216 +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "" -#: builtin/grep.c:454 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "" -#: builtin/grep.c:530 builtin/grep.c:564 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "" -#: builtin/grep.c:578 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "" -#: builtin/grep.c:636 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "" -#: builtin/grep.c:653 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "" -#: builtin/grep.c:728 +#: builtin/grep.c:729 msgid "search in index instead of in the work tree" msgstr "" -#: builtin/grep.c:730 +#: builtin/grep.c:731 msgid "find in contents not managed by git" msgstr "" -#: builtin/grep.c:732 +#: builtin/grep.c:733 msgid "search in both tracked and untracked files" msgstr "" -#: builtin/grep.c:734 +#: builtin/grep.c:735 msgid "search also in ignored files" msgstr "" -#: builtin/grep.c:737 +#: builtin/grep.c:738 msgid "show non-matching lines" msgstr "" -#: builtin/grep.c:739 +#: builtin/grep.c:740 msgid "case insensitive matching" msgstr "" -#: builtin/grep.c:741 +#: builtin/grep.c:742 msgid "match patterns only at word boundaries" msgstr "" -#: builtin/grep.c:743 +#: builtin/grep.c:744 msgid "process binary files as text" msgstr "" -#: builtin/grep.c:745 +#: builtin/grep.c:746 msgid "don't match patterns in binary files" msgstr "" -#: builtin/grep.c:748 +#: builtin/grep.c:749 msgid "descend at most <depth> levels" msgstr "" -#: builtin/grep.c:752 +#: builtin/grep.c:753 msgid "use extended POSIX regular expressions" msgstr "" -#: builtin/grep.c:755 +#: builtin/grep.c:756 msgid "use basic POSIX regular expressions (default)" msgstr "" -#: builtin/grep.c:758 +#: builtin/grep.c:759 msgid "interpret patterns as fixed strings" msgstr "" -#: builtin/grep.c:761 +#: builtin/grep.c:762 msgid "use Perl-compatible regular expressions" msgstr "" -#: builtin/grep.c:764 +#: builtin/grep.c:765 msgid "show line numbers" msgstr "" -#: builtin/grep.c:765 +#: builtin/grep.c:766 msgid "don't show filenames" msgstr "" -#: builtin/grep.c:766 +#: builtin/grep.c:767 msgid "show filenames" msgstr "" -#: builtin/grep.c:768 +#: builtin/grep.c:769 msgid "show filenames relative to top directory" msgstr "" -#: builtin/grep.c:770 +#: builtin/grep.c:771 msgid "show only filenames instead of matching lines" msgstr "" -#: builtin/grep.c:772 +#: builtin/grep.c:773 msgid "synonym for --files-with-matches" msgstr "" -#: builtin/grep.c:775 +#: builtin/grep.c:776 msgid "show only the names of files without match" msgstr "" -#: builtin/grep.c:777 +#: builtin/grep.c:778 msgid "print NUL after filenames" msgstr "" -#: builtin/grep.c:779 +#: builtin/grep.c:780 msgid "show the number of matches instead of matching lines" msgstr "" -#: builtin/grep.c:780 +#: builtin/grep.c:781 msgid "highlight matches" msgstr "" -#: builtin/grep.c:782 +#: builtin/grep.c:783 msgid "print empty line between matches from different files" msgstr "" -#: builtin/grep.c:784 +#: builtin/grep.c:785 msgid "show filename only once above matches from same file" msgstr "" -#: builtin/grep.c:787 +#: builtin/grep.c:788 msgid "show <n> context lines before and after matches" msgstr "" -#: builtin/grep.c:790 +#: builtin/grep.c:791 msgid "show <n> context lines before matches" msgstr "" -#: builtin/grep.c:792 +#: builtin/grep.c:793 msgid "show <n> context lines after matches" msgstr "" -#: builtin/grep.c:793 +#: builtin/grep.c:794 msgid "shortcut for -C NUM" msgstr "" -#: builtin/grep.c:796 +#: builtin/grep.c:797 msgid "show a line with the function name before matches" msgstr "" -#: builtin/grep.c:798 +#: builtin/grep.c:799 msgid "show the surrounding function" msgstr "" -#: builtin/grep.c:801 +#: builtin/grep.c:802 msgid "read patterns from file" msgstr "" -#: builtin/grep.c:803 +#: builtin/grep.c:804 msgid "match <pattern>" msgstr "" -#: builtin/grep.c:805 +#: builtin/grep.c:806 msgid "combine patterns specified with -e" msgstr "" -#: builtin/grep.c:817 +#: builtin/grep.c:818 msgid "indicate hit with exit status without output" msgstr "" -#: builtin/grep.c:819 +#: builtin/grep.c:820 msgid "show only matches from files that match all patterns" msgstr "" #: builtin/grep.c:822 +msgid "show parse tree for grep expression" +msgstr "" + +#: builtin/grep.c:826 msgid "pager" msgstr "" -#: builtin/grep.c:822 +#: builtin/grep.c:826 msgid "show matching files in the pager" msgstr "" -#: builtin/grep.c:825 +#: builtin/grep.c:829 msgid "allow calling of grep(1) (ignored by this build)" msgstr "" -#: builtin/grep.c:826 builtin/show-ref.c:201 +#: builtin/grep.c:830 builtin/show-ref.c:201 msgid "show usage" msgstr "" -#: builtin/grep.c:917 +#: builtin/grep.c:921 msgid "no pattern given." msgstr "" -#: builtin/grep.c:931 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "" -#: builtin/grep.c:972 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "" -#: builtin/grep.c:995 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "" -#: builtin/grep.c:1000 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "" -#: builtin/grep.c:1003 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" -#: builtin/grep.c:1011 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "" @@ -5552,7 +5526,7 @@ msgstr "" msgid "abort if fast-forward is not possible" msgstr "" -#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112 +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 msgid "strategy" msgstr "" @@ -6000,338 +5974,338 @@ msgstr "" msgid "allow to print `undefined` names" msgstr "" -#: builtin/notes.c:23 +#: builtin/notes.c:26 msgid "git notes [--ref <notes_ref>] [list [<object>]]" msgstr "" -#: builtin/notes.c:24 +#: builtin/notes.c:27 msgid "" "git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " "<object>] [<object>]" msgstr "" -#: builtin/notes.c:25 +#: builtin/notes.c:28 msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" msgstr "" -#: builtin/notes.c:26 +#: builtin/notes.c:29 msgid "" "git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " "<object>] [<object>]" msgstr "" -#: builtin/notes.c:27 +#: builtin/notes.c:30 msgid "git notes [--ref <notes_ref>] edit [<object>]" msgstr "" -#: builtin/notes.c:28 +#: builtin/notes.c:31 msgid "git notes [--ref <notes_ref>] show [<object>]" msgstr "" -#: builtin/notes.c:29 +#: builtin/notes.c:32 msgid "" "git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" msgstr "" -#: builtin/notes.c:30 +#: builtin/notes.c:33 msgid "git notes merge --commit [-v | -q]" msgstr "" -#: builtin/notes.c:31 +#: builtin/notes.c:34 msgid "git notes merge --abort [-v | -q]" msgstr "" -#: builtin/notes.c:32 +#: builtin/notes.c:35 msgid "git notes [--ref <notes_ref>] remove [<object>...]" msgstr "" -#: builtin/notes.c:33 +#: builtin/notes.c:36 msgid "git notes [--ref <notes_ref>] prune [-n | -v]" msgstr "" -#: builtin/notes.c:34 +#: builtin/notes.c:37 msgid "git notes [--ref <notes_ref>] get-ref" msgstr "" -#: builtin/notes.c:39 +#: builtin/notes.c:42 msgid "git notes [list [<object>]]" msgstr "" -#: builtin/notes.c:44 +#: builtin/notes.c:47 msgid "git notes add [<options>] [<object>]" msgstr "" -#: builtin/notes.c:49 +#: builtin/notes.c:52 msgid "git notes copy [<options>] <from-object> <to-object>" msgstr "" -#: builtin/notes.c:50 +#: builtin/notes.c:53 msgid "git notes copy --stdin [<from-object> <to-object>]..." msgstr "" -#: builtin/notes.c:55 +#: builtin/notes.c:58 msgid "git notes append [<options>] [<object>]" msgstr "" -#: builtin/notes.c:60 +#: builtin/notes.c:63 msgid "git notes edit [<object>]" msgstr "" -#: builtin/notes.c:65 +#: builtin/notes.c:68 msgid "git notes show [<object>]" msgstr "" -#: builtin/notes.c:70 +#: builtin/notes.c:73 msgid "git notes merge [<options>] <notes_ref>" msgstr "" -#: builtin/notes.c:71 +#: builtin/notes.c:74 msgid "git notes merge --commit [<options>]" msgstr "" -#: builtin/notes.c:72 +#: builtin/notes.c:75 msgid "git notes merge --abort [<options>]" msgstr "" -#: builtin/notes.c:77 +#: builtin/notes.c:80 msgid "git notes remove [<object>]" msgstr "" -#: builtin/notes.c:82 +#: builtin/notes.c:85 msgid "git notes prune [<options>]" msgstr "" -#: builtin/notes.c:87 +#: builtin/notes.c:90 msgid "git notes get-ref" msgstr "" -#: builtin/notes.c:139 +#: builtin/notes.c:142 #, c-format msgid "unable to start 'show' for object '%s'" msgstr "" -#: builtin/notes.c:145 +#: builtin/notes.c:148 msgid "can't fdopen 'show' output fd" msgstr "" -#: builtin/notes.c:155 +#: builtin/notes.c:158 #, c-format msgid "failed to close pipe to 'show' for object '%s'" msgstr "" -#: builtin/notes.c:158 +#: builtin/notes.c:161 #, c-format msgid "failed to finish 'show' for object '%s'" msgstr "" -#: builtin/notes.c:175 builtin/tag.c:347 +#: builtin/notes.c:178 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "" -#: builtin/notes.c:189 +#: builtin/notes.c:192 msgid "Please supply the note contents using either -m or -F option" msgstr "" -#: builtin/notes.c:210 builtin/notes.c:973 +#: builtin/notes.c:213 builtin/notes.c:976 #, c-format msgid "Removing note for object %s\n" msgstr "" -#: builtin/notes.c:215 +#: builtin/notes.c:218 msgid "unable to write note object" msgstr "" -#: builtin/notes.c:217 +#: builtin/notes.c:220 #, c-format msgid "The note contents has been left in %s" msgstr "" -#: builtin/notes.c:251 builtin/tag.c:542 +#: builtin/notes.c:254 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "" -#: builtin/notes.c:253 builtin/tag.c:545 +#: builtin/notes.c:256 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "" -#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 -#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 -#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#: builtin/notes.c:275 builtin/notes.c:448 builtin/notes.c:450 +#: builtin/notes.c:510 builtin/notes.c:564 builtin/notes.c:647 +#: builtin/notes.c:652 builtin/notes.c:727 builtin/notes.c:769 +#: builtin/notes.c:971 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "" -#: builtin/notes.c:275 +#: builtin/notes.c:278 #, c-format msgid "Failed to read object '%s'." msgstr "" -#: builtin/notes.c:299 +#: builtin/notes.c:302 msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "" -#: builtin/notes.c:340 +#: builtin/notes.c:343 #, c-format msgid "Bad notes.rewriteMode value: '%s'" msgstr "" -#: builtin/notes.c:350 +#: builtin/notes.c:353 #, c-format msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" msgstr "" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: builtin/notes.c:377 +#: builtin/notes.c:380 #, c-format msgid "Bad %s value: '%s'" msgstr "" -#: builtin/notes.c:441 +#: builtin/notes.c:444 #, c-format msgid "Malformed input line: '%s'." msgstr "" -#: builtin/notes.c:456 +#: builtin/notes.c:459 #, c-format msgid "Failed to copy notes from '%s' to '%s'" msgstr "" -#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 -#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 -#: builtin/notes.c:1033 +#: builtin/notes.c:503 builtin/notes.c:557 builtin/notes.c:630 +#: builtin/notes.c:642 builtin/notes.c:715 builtin/notes.c:762 +#: builtin/notes.c:1036 msgid "too many parameters" msgstr "" -#: builtin/notes.c:513 builtin/notes.c:772 +#: builtin/notes.c:516 builtin/notes.c:775 #, c-format msgid "No note found for object %s." msgstr "" -#: builtin/notes.c:535 builtin/notes.c:692 +#: builtin/notes.c:538 builtin/notes.c:695 msgid "note contents as a string" msgstr "" -#: builtin/notes.c:538 builtin/notes.c:695 +#: builtin/notes.c:541 builtin/notes.c:698 msgid "note contents in a file" msgstr "" -#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697 -#: builtin/notes.c:700 builtin/tag.c:476 +#: builtin/notes.c:543 builtin/notes.c:546 builtin/notes.c:700 +#: builtin/notes.c:703 builtin/tag.c:476 msgid "object" msgstr "" -#: builtin/notes.c:541 builtin/notes.c:698 +#: builtin/notes.c:544 builtin/notes.c:701 msgid "reuse and edit specified note object" msgstr "" -#: builtin/notes.c:544 builtin/notes.c:701 +#: builtin/notes.c:547 builtin/notes.c:704 msgid "reuse specified note object" msgstr "" -#: builtin/notes.c:546 builtin/notes.c:614 +#: builtin/notes.c:549 builtin/notes.c:617 msgid "replace existing notes" msgstr "" -#: builtin/notes.c:580 +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " "existing notes" msgstr "" -#: builtin/notes.c:585 builtin/notes.c:662 +#: builtin/notes.c:588 builtin/notes.c:665 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "" -#: builtin/notes.c:615 +#: builtin/notes.c:618 msgid "read objects from stdin" msgstr "" -#: builtin/notes.c:617 +#: builtin/notes.c:620 msgid "load rewriting config for <command> (implies --stdin)" msgstr "" -#: builtin/notes.c:635 +#: builtin/notes.c:638 msgid "too few parameters" msgstr "" -#: builtin/notes.c:656 +#: builtin/notes.c:659 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " "existing notes" msgstr "" -#: builtin/notes.c:668 +#: builtin/notes.c:671 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "" -#: builtin/notes.c:717 +#: builtin/notes.c:720 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" "Please use 'git notes add -f -m/-F/-c/-C' instead.\n" msgstr "" -#: builtin/notes.c:864 +#: builtin/notes.c:867 msgid "General options" msgstr "" -#: builtin/notes.c:866 +#: builtin/notes.c:869 msgid "Merge options" msgstr "" -#: builtin/notes.c:868 +#: builtin/notes.c:871 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" msgstr "" -#: builtin/notes.c:870 +#: builtin/notes.c:873 msgid "Committing unmerged notes" msgstr "" -#: builtin/notes.c:872 +#: builtin/notes.c:875 msgid "finalize notes merge by committing unmerged notes" msgstr "" -#: builtin/notes.c:874 +#: builtin/notes.c:877 msgid "Aborting notes merge resolution" msgstr "" -#: builtin/notes.c:876 +#: builtin/notes.c:879 msgid "abort notes merge" msgstr "" -#: builtin/notes.c:971 +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "" -#: builtin/notes.c:983 +#: builtin/notes.c:986 msgid "attempt to remove non-existent note is not an error" msgstr "" -#: builtin/notes.c:986 +#: builtin/notes.c:989 msgid "read object names from the standard input" msgstr "" -#: builtin/notes.c:1067 +#: builtin/notes.c:1070 msgid "notes_ref" msgstr "" -#: builtin/notes.c:1068 +#: builtin/notes.c:1071 msgid "use notes from <notes_ref>" msgstr "" -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "" @@ -8577,7 +8551,7 @@ msgstr "" msgid "Cannot rebase onto multiple branches" msgstr "" -#: git-rebase.sh:52 +#: git-rebase.sh:53 msgid "" "When you have resolved this problem, run \"git rebase --continue\".\n" "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" @@ -8585,38 +8559,42 @@ msgid "" "\"." msgstr "" -#: git-rebase.sh:159 +#: git-rebase.sh:160 msgid "The pre-rebase hook refused to rebase." msgstr "" -#: git-rebase.sh:164 +#: git-rebase.sh:165 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "" -#: git-rebase.sh:295 +#: git-rebase.sh:296 msgid "The --exec option must be used with the --interactive option" msgstr "" -#: git-rebase.sh:300 +#: git-rebase.sh:301 msgid "No rebase in progress?" msgstr "" -#: git-rebase.sh:313 +#: git-rebase.sh:312 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "" + +#: git-rebase.sh:319 msgid "Cannot read HEAD" msgstr "" -#: git-rebase.sh:316 +#: git-rebase.sh:322 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" msgstr "" -#: git-rebase.sh:334 +#: git-rebase.sh:340 #, sh-format msgid "Could not move back to $head_name" msgstr "" -#: git-rebase.sh:350 +#: git-rebase.sh:359 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -8629,56 +8607,56 @@ msgid "" "valuable there." msgstr "" -#: git-rebase.sh:395 +#: git-rebase.sh:404 #, sh-format msgid "invalid upstream $upstream_name" msgstr "" -#: git-rebase.sh:419 +#: git-rebase.sh:428 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "" -#: git-rebase.sh:422 git-rebase.sh:426 +#: git-rebase.sh:431 git-rebase.sh:435 #, sh-format msgid "$onto_name: there is no merge base" msgstr "" -#: git-rebase.sh:431 +#: git-rebase.sh:440 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "" -#: git-rebase.sh:454 +#: git-rebase.sh:463 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "" -#: git-rebase.sh:474 +#: git-rebase.sh:483 msgid "Please commit or stash them." msgstr "" -#: git-rebase.sh:492 +#: git-rebase.sh:501 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "" -#: git-rebase.sh:495 +#: git-rebase.sh:504 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "" -#: git-rebase.sh:506 +#: git-rebase.sh:515 #, sh-format msgid "Changes from $mb to $onto:" msgstr "" #. Detach HEAD and reset the tree -#: git-rebase.sh:515 +#: git-rebase.sh:524 msgid "First, rewinding head to replay your work on top of it..." msgstr "" -#: git-rebase.sh:523 +#: git-rebase.sh:532 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "" @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git 1.7.12\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-09-15 10:21+0800\n" -"PO-Revision-Date: 2012-10-02 08:15+0100\n" +"POT-Creation-Date: 2012-10-16 08:38+0800\n" +"PO-Revision-Date: 2012-10-16 08:36+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" @@ -73,12 +73,11 @@ msgstr "prefix" msgid "prepend prefix to each pathname in the archive" msgstr "lägg till prefix till varje sökväg i arkivet" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332 -#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642 -#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77 -#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537 -#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149 +#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2389 +#: builtin/blame.c:2390 builtin/config.c:56 builtin/fast-export.c:642 +#: builtin/fast-export.c:644 builtin/grep.c:801 builtin/hash-object.c:77 +#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:540 +#: builtin/notes.c:697 builtin/read-tree.c:107 parse-options.h:149 msgid "file" msgstr "fil" @@ -118,7 +117,7 @@ msgstr "arkiv" msgid "retrieve the archive from remote repository <repo>" msgstr "hämta arkivet från fjärrarkivet <arkiv>" -#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616 +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 msgid "command" msgstr "kommando" @@ -136,7 +135,7 @@ msgstr "'%s' ser inte ut som en v2-bundle-fil" msgid "unrecognized header: %s%s (%d)" msgstr "okänt huvud: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:714 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "kunde inte öppna \"%s\"" @@ -145,7 +144,7 @@ msgstr "kunde inte öppna \"%s\"" msgid "Repository lacks these prerequisite commits:" msgstr "Arkivet saknar dessa nödvändiga incheckningar:" -#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290 +#: bundle.c:164 sequencer.c:562 sequencer.c:994 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" @@ -204,12 +203,12 @@ msgstr "kan inte skapa \"%s\"" msgid "index-pack died" msgstr "index-pack dog" -#: commit.c:48 +#: commit.c:50 #, c-format msgid "could not parse %s" msgstr "kunde inte tolka %s" -#: commit.c:50 +#: commit.c:52 #, c-format msgid "%s %s is not a commit!" msgstr "%s %s är inte en incheckning!" @@ -318,32 +317,7 @@ msgstr "" "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n" "%s" -#: diff.c:1401 -msgid " 0 files changed" -msgstr " 0 filer ändrade" - -#: diff.c:1405 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d fil ändrad" -msgstr[1] " %d filer ändrade" - -#: diff.c:1422 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d tillägg(+)" -msgstr[1] ", %d tillägg(+)" - -#: diff.c:1433 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d borttagning(-)" -msgstr[1] ", %d borttagningar(-)" - -#: diff.c:3460 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -364,17 +338,17 @@ msgstr "gpg godtog inte data" msgid "gpg failed to sign the data" msgstr "gpg misslyckades signera data" -#: grep.c:1320 +#: grep.c:1441 #, c-format msgid "'%s': unable to read %s" msgstr "\"%s\" kunde inte läsa %s" -#: grep.c:1337 +#: grep.c:1458 #, c-format msgid "'%s': %s" msgstr "\"%s\": %s" -#: grep.c:1348 +#: grep.c:1469 #, c-format msgid "'%s': short read %s" msgstr "\"%s\": kort läsning %s" @@ -741,19 +715,19 @@ msgstr[1] "" "Din gren och \"%s\" har divergerat,\n" "och har %d respektive %d olika incheckningar.\n" -#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977 +#: sequencer.c:123 builtin/merge.c:864 builtin/merge.c:977 #: builtin/merge.c:1087 builtin/merge.c:1097 #, c-format msgid "Could not open '%s' for writing" msgstr "Kunde inte öppna \"%s\" för skrivning" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867 +#: sequencer.c:125 builtin/merge.c:333 builtin/merge.c:867 #: builtin/merge.c:1089 builtin/merge.c:1102 #, c-format msgid "Could not write to '%s'" msgstr "Kunde inte skriva till \"%s\"" -#: sequencer.c:144 +#: sequencer.c:146 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" @@ -761,7 +735,7 @@ msgstr "" "efter att ha löst konflikterna, markera de rättade sökvägarna\n" "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"" -#: sequencer.c:147 +#: sequencer.c:149 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" @@ -771,214 +745,214 @@ msgstr "" "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n" "och checka in resultatet med \"git commit\"" -#: sequencer.c:160 sequencer.c:765 sequencer.c:848 +#: sequencer.c:162 sequencer.c:770 sequencer.c:853 #, c-format msgid "Could not write to %s" msgstr "Kunde inte skriva till %s" -#: sequencer.c:163 +#: sequencer.c:165 #, c-format msgid "Error wrapping up %s" msgstr "Fel vid ombrytning av %s" -#: sequencer.c:178 +#: sequencer.c:180 msgid "Your local changes would be overwritten by cherry-pick." msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"." -#: sequencer.c:180 +#: sequencer.c:182 msgid "Your local changes would be overwritten by revert." msgstr "Dina lokala ändringar skulle skrivas över av \"revert\"." -#: sequencer.c:183 +#: sequencer.c:185 msgid "Commit your changes or stash them to proceed." msgstr "Checka in dina ändringar eller använd \"stash\" för att fortsätta." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:233 +#: sequencer.c:235 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Kunde inte skriva ny indexfil" -#: sequencer.c:261 +#: sequencer.c:266 msgid "Could not resolve HEAD commit\n" msgstr "Kunde inte bestämma HEAD:s incheckning\n" -#: sequencer.c:282 +#: sequencer.c:287 msgid "Unable to update cache tree\n" msgstr "Kan inte uppdatera cacheträd\n" -#: sequencer.c:327 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "Kunde inte tolka incheckningen %s\n" -#: sequencer.c:332 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Kunde inte tolka föräldraincheckningen %s\n" -#: sequencer.c:398 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "Din indexfil har inte slagits ihop." -#: sequencer.c:401 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "Du har ingen giltig HEAD" -#: sequencer.c:416 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte." -#: sequencer.c:424 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "Incheckning %s har inte förälder %d" -#: sequencer.c:428 +#: sequencer.c:433 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:439 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kan inte tolka föräldraincheckningen %s" -#: sequencer.c:443 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "Kan inte hämta incheckningsmeddelande för %s" -#: sequencer.c:527 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "kunde inte ångra %s... %s" -#: sequencer.c:528 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "kunde inte tillämpa %s... %s" -#: sequencer.c:560 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "den angivna uppsättningen incheckningar är tom" -#: sequencer.c:568 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: misslyckades läsa indexet" -#: sequencer.c:573 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: misslyckades uppdatera indexet" -#: sequencer.c:631 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "kan inte %s under en %s" -#: sequencer.c:653 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "Kan inte tolka rad %d." -#: sequencer.c:658 +#: sequencer.c:663 msgid "No commits parsed." msgstr "Inga incheckningar lästes." -#: sequencer.c:671 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "Kunde inte öppna %s" -#: sequencer.c:675 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "kunde inte läsa %s." -#: sequencer.c:682 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Oanvändbart manus: %s" -#: sequencer.c:710 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "Felaktig nyckel: %s" -#: sequencer.c:713 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "Felaktigt värde för %s: %s" -#: sequencer.c:725 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "Trasigt manus: %s" -#: sequencer.c:746 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "en \"cherry-pick\" eller \"revert\" pågår redan" -#: sequencer.c:747 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:751 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\"" -#: sequencer.c:767 sequencer.c:852 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "Fel vid ombrytning av %s." -#: sequencer.c:786 sequencer.c:920 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "ingen \"cherry-pick\" eller \"revert\" pågår" -#: sequencer.c:788 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "kan inte bestämma HEAD" -#: sequencer.c:790 +#: sequencer.c:795 msgid "cannot abort from a branch yet to be born" msgstr "kan inte avbryta från en gren som ännu inte är född" -#: sequencer.c:812 builtin/apply.c:4005 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "kan inte öppna %s: %s" -#: sequencer.c:815 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "kan inte läsa %s: %s" -#: sequencer.c:816 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "oväntat filslut" -#: sequencer.c:822 +#: sequencer.c:827 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig" -#: sequencer.c:845 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "Kunde inte formatera %s." -#: sequencer.c:1007 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "Kan inte ångra som första incheckning" -#: sequencer.c:1008 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud" @@ -1374,7 +1348,7 @@ msgstr "git add [flaggor] [--] <filmönster>..." msgid "unexpected diff status %c" msgstr "diff-status %c förväntades inte" -#: builtin/add.c:67 builtin/commit.c:229 +#: builtin/add.c:67 builtin/commit.c:230 msgid "updating files failed" msgstr "misslyckades uppdatera filer" @@ -1439,7 +1413,7 @@ msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n" msgid "dry run" msgstr "testkörning" -#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187 +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1154 #: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477 #: builtin/mv.c:62 builtin/read-tree.c:112 msgid "be verbose" @@ -1516,7 +1490,7 @@ msgstr "Inget angivet, inget tillagt.\n" msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Kanske menade du att skriva \"git add .\"?\n" -#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82 +#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:290 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "indexfilen trasig" @@ -2057,95 +2031,95 @@ msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil" msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)" -#: builtin/blame.c:2316 +#: builtin/blame.c:2373 msgid "Show blame entries as we find them, incrementally" msgstr "Visa klandringsposter när vi hittar dem, interaktivt" -#: builtin/blame.c:2317 +#: builtin/blame.c:2374 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)" -#: builtin/blame.c:2318 +#: builtin/blame.c:2375 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Behandla inte rotincheckningar som gränser (Standard: av)" -#: builtin/blame.c:2319 +#: builtin/blame.c:2376 msgid "Show work cost statistics" msgstr "Visa statistik över arbetskostnad" -#: builtin/blame.c:2320 +#: builtin/blame.c:2377 msgid "Show output score for blame entries" msgstr "Visa utdatapoäng för klandringsposter" -#: builtin/blame.c:2321 +#: builtin/blame.c:2378 msgid "Show original filename (Default: auto)" msgstr "Visa originalfilnamn (Standard: auto)" -#: builtin/blame.c:2322 +#: builtin/blame.c:2379 msgid "Show original linenumber (Default: off)" msgstr "Visa ursprungligt radnummer (Standard: av)" -#: builtin/blame.c:2323 +#: builtin/blame.c:2380 msgid "Show in a format designed for machine consumption" msgstr "Visa i ett format avsett för maskinkonsumtion" -#: builtin/blame.c:2324 +#: builtin/blame.c:2381 msgid "Show porcelain format with per-line commit information" msgstr "Visa porslinsformat med per-rad-incheckningsinformation" -#: builtin/blame.c:2325 +#: builtin/blame.c:2382 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "Använd samma utdataläge som git-annotate (Standard: av)" -#: builtin/blame.c:2326 +#: builtin/blame.c:2383 msgid "Show raw timestamp (Default: off)" msgstr "Visa rå tidsstämpel (Standard: av)" -#: builtin/blame.c:2327 +#: builtin/blame.c:2384 msgid "Show long commit SHA1 (Default: off)" msgstr "Visa lång inchecknings-SHA1 (Standard: av)" -#: builtin/blame.c:2328 +#: builtin/blame.c:2385 msgid "Suppress author name and timestamp (Default: off)" msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)" -#: builtin/blame.c:2329 +#: builtin/blame.c:2386 msgid "Show author email instead of name (Default: off)" msgstr "Visa författarens e-post istället för namn (Standard: av)" -#: builtin/blame.c:2330 +#: builtin/blame.c:2387 msgid "Ignore whitespace differences" msgstr "Ignorera ändringar i blanksteg" -#: builtin/blame.c:2331 +#: builtin/blame.c:2388 msgid "Spend extra cycles to find better match" msgstr "Slösa extra cykler med att hitta bättre träff" -#: builtin/blame.c:2332 +#: builtin/blame.c:2389 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "Använd revisioner från <fil> istället för att anropa git-rev-list" -#: builtin/blame.c:2333 +#: builtin/blame.c:2390 msgid "Use <file>'s contents as the final image" msgstr "Använd <fil>s innehåll som slutgiltig bild" -#: builtin/blame.c:2334 builtin/blame.c:2335 +#: builtin/blame.c:2391 builtin/blame.c:2392 msgid "score" msgstr "poäng" -#: builtin/blame.c:2334 +#: builtin/blame.c:2391 msgid "Find line copies within and across files" msgstr "Hitta kopierade rader inuti och mellan filer" -#: builtin/blame.c:2335 +#: builtin/blame.c:2392 msgid "Find line movements within and across files" msgstr "Hitta flyttade rader inuti och mellan filer" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "Process only line range n,m, counting from 1" msgstr "Behandla endast radintervallet n,m, med början på 1" @@ -2354,8 +2328,8 @@ msgid "act on remote-tracking branches" msgstr "arbeta på fjärrspårande grenar" #: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765 -#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396 -#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470 +#: builtin/branch.c:771 builtin/commit.c:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 msgid "commit" msgstr "incheckning" @@ -2531,8 +2505,8 @@ msgid "git check-attr [-a | --all | attr...] [--] pathname..." msgstr "git check-attr [-a | --all | attr...] [--] sökväg..." #: builtin/check-attr.c:12 -msgid "git check-attr --stdin [-a | --all | attr...] < <list-of-paths>" -msgstr "git check-attr --stdin [-a | --all | attr...] < <sökvägslista>" +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>" +msgstr "git check-attr --stdin [-z] [-a | --all | attr...] < <sökvägslista>" #: builtin/check-attr.c:19 msgid "report all attributes set on file" @@ -2912,7 +2886,7 @@ msgstr "tvinga" msgid "remove whole directories" msgstr "ta bort hela kataloger" -#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802 +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:803 #: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 msgid "pattern" msgstr "mönster" @@ -3038,7 +3012,7 @@ msgstr "checka ut <gren> istället för fjärrens HEAD" msgid "path to git-upload-pack on the remote" msgstr "sökväg till git-upload-pack på fjärren" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747 +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 msgid "depth" msgstr "djup" @@ -3116,69 +3090,69 @@ msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" "HEAD hos fjärren pekar på en obefintlig referens, kan inte checka ut.\n" -#: builtin/clone.c:642 +#: builtin/clone.c:690 msgid "Too many arguments." msgstr "För många argument." -#: builtin/clone.c:646 +#: builtin/clone.c:694 msgid "You must specify a repository to clone." msgstr "Du måste ange ett arkiv att klona." -#: builtin/clone.c:657 +#: builtin/clone.c:705 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "flaggorna --bare och --origin %s är inkompatibla." -#: builtin/clone.c:671 +#: builtin/clone.c:719 #, c-format msgid "repository '%s' does not exist" msgstr "arkivet \"%s\" finns inte" -#: builtin/clone.c:676 +#: builtin/clone.c:724 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth ignoreras i lokala kloningar; använd file:// istället" -#: builtin/clone.c:686 +#: builtin/clone.c:734 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "destinationssökvägen \"%s\" finns redan och är inte en tom katalog." -#: builtin/clone.c:696 +#: builtin/clone.c:744 #, c-format msgid "working tree '%s' already exists." msgstr "arbetsträdet \"%s\" finns redan." -#: builtin/clone.c:709 builtin/clone.c:723 +#: builtin/clone.c:757 builtin/clone.c:771 #, c-format msgid "could not create leading directories of '%s'" msgstr "kunde inte skapa inledande kataloger för \"%s\"" -#: builtin/clone.c:712 +#: builtin/clone.c:760 #, c-format msgid "could not create work tree dir '%s'." msgstr "kunde inte skapa arbetskatalogen \"%s\"" -#: builtin/clone.c:731 +#: builtin/clone.c:779 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Klonar till ett naket arkiv \"%s\"...\n" -#: builtin/clone.c:733 +#: builtin/clone.c:781 #, c-format msgid "Cloning into '%s'...\n" msgstr "Klonar till \"%s\"...\n" -#: builtin/clone.c:789 +#: builtin/clone.c:823 #, c-format msgid "Don't know how to clone %s" msgstr "Vet inte hur man klonar %s" -#: builtin/clone.c:838 +#: builtin/clone.c:872 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s" -#: builtin/clone.c:845 +#: builtin/clone.c:879 msgid "You appear to have cloned an empty repository." msgstr "Du verkar ha klonat ett tomt arkiv." @@ -3214,15 +3188,15 @@ msgstr "Spaltfyllnad mellan spalter" msgid "--command must be the first argument" msgstr "--command måste vara första argument" -#: builtin/commit.c:33 +#: builtin/commit.c:34 msgid "git commit [options] [--] <filepattern>..." msgstr "git commit [flaggor] [--] <filmöster>..." -#: builtin/commit.c:38 +#: builtin/commit.c:39 msgid "git status [options] [--] <filepattern>..." msgstr "git status [flaggor] [--] <filmönster>..." -#: builtin/commit.c:43 +#: builtin/commit.c:44 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3247,7 +3221,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:55 +#: builtin/commit.c:56 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -3257,7 +3231,7 @@ msgstr "" "blir den tom. Du kan köra kommandot på nytt med --allow-empty, eller\n" "så kan du ta bort incheckningen helt med \"git reset HEAD^\".\n" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3273,93 +3247,93 @@ msgstr "" "\n" "Annars använder du \"git reset\"\n" -#: builtin/commit.c:256 +#: builtin/commit.c:257 msgid "failed to unpack HEAD tree object" msgstr "misslyckades packa upp HEAD:s trädobjekt" -#: builtin/commit.c:298 +#: builtin/commit.c:299 msgid "unable to create temporary index" msgstr "kunde inte skapa temporär indexfil" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "interactive add failed" msgstr "interaktiv tilläggning misslyckades" -#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408 +#: builtin/commit.c:338 builtin/commit.c:359 builtin/commit.c:409 msgid "unable to write new_index file" msgstr "kunde inte skriva filen new_index" -#: builtin/commit.c:389 +#: builtin/commit.c:390 msgid "cannot do a partial commit during a merge." msgstr "kan inte utföra en delvis incheckning under en sammanslagning." -#: builtin/commit.c:391 +#: builtin/commit.c:392 msgid "cannot do a partial commit during a cherry-pick." msgstr "kan inte utföra en delvis incheckning under en cherry-pick." -#: builtin/commit.c:401 +#: builtin/commit.c:402 msgid "cannot read the index" msgstr "kan inte läsa indexet" -#: builtin/commit.c:421 +#: builtin/commit.c:422 msgid "unable to write temporary index file" msgstr "kunde inte skriva temporär indexfil" -#: builtin/commit.c:510 builtin/commit.c:516 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "felaktig incheckning: %s" -#: builtin/commit.c:539 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "felformad \"--author\"-flagga" -#: builtin/commit.c:600 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "Felaktig indragningssträng: \"%s\"" -#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985 +#: builtin/commit.c:596 builtin/commit.c:629 builtin/commit.c:952 #, c-format msgid "could not lookup commit %s" msgstr "kunde inte slå upp incheckningen %s" -#: builtin/commit.c:650 builtin/shortlog.c:296 +#: builtin/commit.c:608 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(läser loggmeddelande från standard in)\n" -#: builtin/commit.c:652 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "kunde inte läsa logg från standard in" -#: builtin/commit.c:656 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "kunde inte läsa loggfilen \"%s\"" -#: builtin/commit.c:662 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "incheckningen har ett tomt meddelande" -#: builtin/commit.c:678 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "kunde inte läsa MERGE_MSG" -#: builtin/commit.c:682 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "kunde inte läsa SQUASH_MSG" -#: builtin/commit.c:686 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/commit.c:738 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "kunde inte skriva incheckningsmall" -#: builtin/commit.c:749 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -3374,7 +3348,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:754 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -3389,7 +3363,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:766 +#: builtin/commit.c:733 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" @@ -3397,7 +3371,7 @@ msgstr "" "Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n" "med \"#\" kommer ignoreras, och ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:771 +#: builtin/commit.c:738 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" @@ -3407,131 +3381,131 @@ msgstr "" "med \"#\" kommer behållas; du kan själv ta bort dem om du vill.\n" "Ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:784 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "%sFörfattare: %s" -#: builtin/commit.c:791 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "%sIncheckare: %s" -#: builtin/commit.c:811 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "Kan inte läsa indexet" -#: builtin/commit.c:848 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "Fel vid byggande av träd" -#: builtin/commit.c:863 builtin/tag.c:361 +#: builtin/commit.c:830 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Ange meddelandet en av flaggorna -m eller -F.\n" -#: builtin/commit.c:960 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "Hittade ingen befintlig författare med \"%s\"" -#: builtin/commit.c:975 builtin/commit.c:1175 +#: builtin/commit.c:942 builtin/commit.c:1142 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ogiltigt läge för ospårade filer: \"%s\"" -#: builtin/commit.c:1015 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "Kan inte använda både --reset-author och --author" -#: builtin/commit.c:1026 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "Du har inget att utöka." -#: builtin/commit.c:1029 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "Du är i mitten av en sammanslagning -- kan inte utöka." -#: builtin/commit.c:1031 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "Du är i mitten av en cherry-pick -- kan inte utöka." -#: builtin/commit.c:1034 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt" -#: builtin/commit.c:1044 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Endast en av -c/-C/-F/--fixup kan användas." -#: builtin/commit.c:1046 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup." -#: builtin/commit.c:1054 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author kan endast användas med -C, -c eller --amend." -#: builtin/commit.c:1071 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Endast en av --include/--only/--all/--interactive/--patch kan användas." -#: builtin/commit.c:1073 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "Du måste ange sökvägar tillsammans med --include/--only." -#: builtin/commit.c:1075 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "Smart... utöka den senaste med smutsigt index." -#: builtin/commit.c:1077 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..." -#: builtin/commit.c:1087 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "Felaktigt städningsläge %s" -#: builtin/commit.c:1092 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "Kan inte ange sökvägar med -a." -#: builtin/commit.c:1189 builtin/commit.c:1417 +#: builtin/commit.c:1156 builtin/commit.c:1384 msgid "show status concisely" msgstr "vis koncis status" -#: builtin/commit.c:1191 builtin/commit.c:1419 +#: builtin/commit.c:1158 builtin/commit.c:1386 msgid "show branch information" msgstr "visa information om gren" -#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389 +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 msgid "machine-readable output" msgstr "maskinläsbar utdata" -#: builtin/commit.c:1196 builtin/commit.c:1423 +#: builtin/commit.c:1163 builtin/commit.c:1390 msgid "terminate entries with NUL" msgstr "terminera poster med NUL" -#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636 +#: builtin/commit.c:1165 builtin/commit.c:1393 builtin/fast-export.c:636 #: builtin/fast-export.c:639 builtin/tag.c:461 msgid "mode" msgstr "läge" -#: builtin/commit.c:1199 builtin/commit.c:1426 +#: builtin/commit.c:1166 builtin/commit.c:1393 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "visa ospårade filer, valfria lägen: alla, normal, no. (Standard: all)" -#: builtin/commit.c:1202 +#: builtin/commit.c:1169 msgid "show ignored files" msgstr "visa ignorerade filer" -#: builtin/commit.c:1203 parse-options.h:151 +#: builtin/commit.c:1170 parse-options.h:151 msgid "when" msgstr "när" -#: builtin/commit.c:1204 +#: builtin/commit.c:1171 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -3539,217 +3513,217 @@ msgstr "" "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. " "(Default: all)" -#: builtin/commit.c:1206 +#: builtin/commit.c:1173 msgid "list untracked files in columns" msgstr "visa ospårade filer i spalter" -#: builtin/commit.c:1275 +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "kunde inte slå upp en precis skapad incheckning" -#: builtin/commit.c:1277 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "kunde inte tolka en precis skapad incheckning" -#: builtin/commit.c:1318 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "frånkopplad HEAD" -#: builtin/commit.c:1320 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr " (rotincheckning)" -#: builtin/commit.c:1387 +#: builtin/commit.c:1354 msgid "suppress summary after successful commit" msgstr "undertryck sammanfattning efter framgångsrik incheckning" -#: builtin/commit.c:1388 +#: builtin/commit.c:1355 msgid "show diff in commit message template" msgstr "visa diff i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1390 +#: builtin/commit.c:1357 msgid "Commit message options" msgstr "Alternativ för incheckningsmeddelande" -#: builtin/commit.c:1391 builtin/tag.c:459 +#: builtin/commit.c:1358 builtin/tag.c:459 msgid "read message from file" msgstr "läs meddelande från fil" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "author" msgstr "författare" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "override author for commit" msgstr "överstyr författare för incheckningen" -#: builtin/commit.c:1393 builtin/gc.c:178 +#: builtin/commit.c:1360 builtin/gc.c:178 msgid "date" msgstr "datum" -#: builtin/commit.c:1393 +#: builtin/commit.c:1360 msgid "override date for commit" msgstr "överstyr datum för inchecknignen" -#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534 -#: builtin/notes.c:691 builtin/tag.c:457 +#: builtin/commit.c:1361 builtin/merge.c:206 builtin/notes.c:537 +#: builtin/notes.c:694 builtin/tag.c:457 msgid "message" msgstr "meddelande" -#: builtin/commit.c:1394 +#: builtin/commit.c:1361 msgid "commit message" msgstr "incheckningsmeddelande" -#: builtin/commit.c:1395 +#: builtin/commit.c:1362 msgid "reuse and edit message from specified commit" msgstr "återanvänd och redigera meddelande från angiven incheckning" -#: builtin/commit.c:1396 +#: builtin/commit.c:1363 msgid "reuse message from specified commit" msgstr "återanvänd meddelande från angiven incheckning" -#: builtin/commit.c:1397 +#: builtin/commit.c:1364 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "använd autosquash-formaterat meddelande för att fixa angiven incheckning" -#: builtin/commit.c:1398 +#: builtin/commit.c:1365 msgid "use autosquash formatted message to squash specified commit" msgstr "" "använd autosquash-formaterat meddelande för att slå ihop med angiven " "incheckning" -#: builtin/commit.c:1399 +#: builtin/commit.c:1366 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)" -#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109 +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 msgid "add Signed-off-by:" msgstr "lägg till Signed-off-by:" -#: builtin/commit.c:1401 +#: builtin/commit.c:1368 msgid "use specified template file" msgstr "använd angiven mallfil" -#: builtin/commit.c:1402 +#: builtin/commit.c:1369 msgid "force edit of commit" msgstr "tvinga redigering av incheckning" -#: builtin/commit.c:1403 +#: builtin/commit.c:1370 msgid "default" msgstr "standard" -#: builtin/commit.c:1403 builtin/tag.c:462 +#: builtin/commit.c:1370 builtin/tag.c:462 msgid "how to strip spaces and #comments from message" msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande" -#: builtin/commit.c:1404 +#: builtin/commit.c:1371 msgid "include status in commit message template" msgstr "inkludera status i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463 +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 msgid "key id" msgstr "nyckel-id" -#: builtin/commit.c:1406 builtin/merge.c:214 +#: builtin/commit.c:1373 builtin/merge.c:214 msgid "GPG sign commit" msgstr "GPG-signera incheckning" #. end commit message options -#: builtin/commit.c:1409 +#: builtin/commit.c:1376 msgid "Commit contents options" msgstr "Alternativ för incheckningens innehåll" -#: builtin/commit.c:1410 +#: builtin/commit.c:1377 msgid "commit all changed files" msgstr "checka in alla ändrade filer" -#: builtin/commit.c:1411 +#: builtin/commit.c:1378 msgid "add specified files to index for commit" msgstr "lägg till angivna filer till indexet för incheckning" -#: builtin/commit.c:1412 +#: builtin/commit.c:1379 msgid "interactively add files" msgstr "lägg till filer interaktivt" -#: builtin/commit.c:1413 +#: builtin/commit.c:1380 msgid "interactively add changes" msgstr "lägg till ändringar interaktivt" -#: builtin/commit.c:1414 +#: builtin/commit.c:1381 msgid "commit only specified files" msgstr "checka endast in angivna filer" -#: builtin/commit.c:1415 +#: builtin/commit.c:1382 msgid "bypass pre-commit hook" msgstr "förbigå pre-commit-krok" -#: builtin/commit.c:1416 +#: builtin/commit.c:1383 msgid "show what would be committed" msgstr "visa vad som skulle checkas in" -#: builtin/commit.c:1424 +#: builtin/commit.c:1391 msgid "amend previous commit" msgstr "lägg till föregående incheckning" -#: builtin/commit.c:1425 +#: builtin/commit.c:1392 msgid "bypass post-rewrite hook" msgstr "förbigå post-rewrite-krok" -#: builtin/commit.c:1430 +#: builtin/commit.c:1397 msgid "ok to record an empty change" msgstr "ok att registrera en tom ändring" -#: builtin/commit.c:1433 +#: builtin/commit.c:1400 msgid "ok to record a change with an empty message" msgstr "ok att registrera en ändring med tomt meddelande" -#: builtin/commit.c:1464 +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "kunde inte tolka HEAD:s incheckning" -#: builtin/commit.c:1502 builtin/merge.c:508 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "kunde inte öppna \"%s\" för läsning" -#: builtin/commit.c:1509 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Trasig MERGE_HEAD-fil (%s)" -#: builtin/commit.c:1516 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "kunde inte läsa MERGE_MODE" -#: builtin/commit.c:1535 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "kunde inte läsa incheckningsmeddelande: %s" -#: builtin/commit.c:1549 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Avbryter incheckning; meddelandet inte redigerat.\n" -#: builtin/commit.c:1554 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n" -#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "kunde inte skriva incheckningsobjekt" -#: builtin/commit.c:1590 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "kunde inte låsa HEAD-referens" -#: builtin/commit.c:1594 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "kunde inte uppdatera HEAD-referens" -#: builtin/commit.c:1605 +#: builtin/commit.c:1573 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4179,67 +4153,67 @@ msgstr "Kunde inte hitta fjärr-referensen HEAD" msgid "object %s not found" msgstr "objektet %s hittades inte" -#: builtin/fetch.c:260 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "[àjour]" -#: builtin/fetch.c:274 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (kan inte hämta i aktuell gren)" -#: builtin/fetch.c:275 builtin/fetch.c:361 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "[refuserad]" -#: builtin/fetch.c:286 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "[uppdaterad tagg]" -#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr " (kunde inte uppdatera lokal ref)" -#: builtin/fetch.c:306 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "[ny tagg]" -#: builtin/fetch.c:309 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "[ny gren]" -#: builtin/fetch.c:312 +#: builtin/fetch.c:311 msgid "[new ref]" msgstr "[ny ref]" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "kunde inte uppdatera lokal ref" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "forced update" msgstr "tvingad uppdatering" -#: builtin/fetch.c:363 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" msgstr "(ej snabbspolad)" -#: builtin/fetch.c:394 builtin/fetch.c:686 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "kan inte öppna %s: %s\n" -#: builtin/fetch.c:403 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s sände inte alla nödvändiga objekt\n" -#: builtin/fetch.c:489 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "Från %.*s\n" -#: builtin/fetch.c:500 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -4248,55 +4222,55 @@ msgstr "" "vissa lokala referenser kunde inte uppdateras; testa att köra\n" " \"git remote prune %s\" för att ta bort gamla grenar som står i konflikt" -#: builtin/fetch.c:550 +#: builtin/fetch.c:549 #, c-format msgid " (%s will become dangling)" msgstr " (%s kommer bli dinglande)" -#: builtin/fetch.c:551 +#: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)" msgstr " (%s har blivit dinglande)" -#: builtin/fetch.c:558 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "[borttagen]" -#: builtin/fetch.c:559 builtin/remote.c:1055 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "(ingen)" -#: builtin/fetch.c:676 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv" -#: builtin/fetch.c:710 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "Vet inte hur man hämtar från %s" -#: builtin/fetch.c:787 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s" -#: builtin/fetch.c:790 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Flaggan \"%s\" ignoreras för %s\n" -#: builtin/fetch.c:892 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "Hämtar %s\n" -#: builtin/fetch.c:894 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "Kunde inte hämta %s" -#: builtin/fetch.c:913 +#: builtin/fetch.c:912 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -4304,24 +4278,24 @@ msgstr "" "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n" "fjärrarkiv som nya incheckningar skall hämtas från." -#: builtin/fetch.c:933 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "Du måste ange namnet på en tagg." -#: builtin/fetch.c:985 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "fetch --all tar inte namnet på ett arkiv som argument" -#: builtin/fetch.c:987 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kan inte anges med referensspecifikationer" -#: builtin/fetch.c:998 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "Fjärren eller fjärrgruppen finns inte: %s" -#: builtin/fetch.c:1006 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Kan inte hämta från grupp och ange referensspecifikationer" @@ -4330,7 +4304,7 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" msgstr "" "git fmt-merge-msg [-m <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]" -#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786 +#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:787 #: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192 #: builtin/tag.c:448 parse-options.h:133 parse-options.h:235 msgid "n" @@ -4466,12 +4440,7 @@ msgstr "var mer grundlig (ökar körtiden)" msgid "enable auto-gc mode" msgstr "aktivera auto-gc-läge" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "Packar arkivet automatiskt för optimal prestanda.\n" - -#: builtin/gc.c:224 +#: builtin/gc.c:222 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -4480,7 +4449,7 @@ msgstr "" "Packar arkivet automatiskt för optimal prestanda. Du kan även\n" "köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n" -#: builtin/gc.c:251 +#: builtin/gc.c:249 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -4491,227 +4460,230 @@ msgstr "" msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [flaggor] [-e] <mönster> [<rev>...] [[--] <sökväg>...]" -#: builtin/grep.c:216 +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: misslyckades skapa tråd. %s" -#: builtin/grep.c:454 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "Kunde inte byta katalog (chdir): %s" -#: builtin/grep.c:530 builtin/grep.c:564 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "kunde inte läsa träd (%s)" -#: builtin/grep.c:578 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "Kunde inte \"grep\" från objekt av typen %s" -#: builtin/grep.c:636 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "flaggan \"%c\" antar ett numeriskt värde" -#: builtin/grep.c:653 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "kan inte öppna \"%s\"" -#: builtin/grep.c:728 +#: builtin/grep.c:729 msgid "search in index instead of in the work tree" msgstr "sök i indexet istället för i arbetskatalogen" -#: builtin/grep.c:730 +#: builtin/grep.c:731 msgid "find in contents not managed by git" msgstr "sök i innehål som inte hanteras av git" -#: builtin/grep.c:732 +#: builtin/grep.c:733 msgid "search in both tracked and untracked files" msgstr "sök i både spårade och ospårade filer" -#: builtin/grep.c:734 +#: builtin/grep.c:735 msgid "search also in ignored files" msgstr "sök även i ignorerade filer" -#: builtin/grep.c:737 +#: builtin/grep.c:738 msgid "show non-matching lines" msgstr "vis rader som inte träffas" -#: builtin/grep.c:739 +#: builtin/grep.c:740 msgid "case insensitive matching" msgstr "skiftlägesokänslig sökning" -#: builtin/grep.c:741 +#: builtin/grep.c:742 msgid "match patterns only at word boundaries" msgstr "matcha endast mönster vid ordgränser" -#: builtin/grep.c:743 +#: builtin/grep.c:744 msgid "process binary files as text" msgstr "hantera binärfiler som text" -#: builtin/grep.c:745 +#: builtin/grep.c:746 msgid "don't match patterns in binary files" msgstr "träffa inte mönster i binärfiler" -#: builtin/grep.c:748 +#: builtin/grep.c:749 msgid "descend at most <depth> levels" msgstr "gå som mest ned <djup> nivåer" -#: builtin/grep.c:752 +#: builtin/grep.c:753 msgid "use extended POSIX regular expressions" msgstr "använd utökade POSIX-reguljära uttryck" -#: builtin/grep.c:755 +#: builtin/grep.c:756 msgid "use basic POSIX regular expressions (default)" msgstr "använd grundläggande POSIX-reguljära uttryck (standard)" -#: builtin/grep.c:758 +#: builtin/grep.c:759 msgid "interpret patterns as fixed strings" msgstr "tolka mönster som fixerade strängar" -#: builtin/grep.c:761 +#: builtin/grep.c:762 msgid "use Perl-compatible regular expressions" msgstr "använd Perlkompatibla reguljära uttryck" -#: builtin/grep.c:764 +#: builtin/grep.c:765 msgid "show line numbers" msgstr "visa radnummer" -#: builtin/grep.c:765 +#: builtin/grep.c:766 msgid "don't show filenames" msgstr "visa inte filnamn" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: builtin/grep.c:766 +#: builtin/grep.c:767 msgid "show filenames" msgstr "visa filnamn" -#: builtin/grep.c:768 +#: builtin/grep.c:769 msgid "show filenames relative to top directory" msgstr "visa filnamn relativa till toppkatalogen" -#: builtin/grep.c:770 +#: builtin/grep.c:771 msgid "show only filenames instead of matching lines" msgstr "visa endast filnamn istället för träffade rader" -#: builtin/grep.c:772 +#: builtin/grep.c:773 msgid "synonym for --files-with-matches" msgstr "synonym för --files-with-matches" -#: builtin/grep.c:775 +#: builtin/grep.c:776 msgid "show only the names of files without match" msgstr "visa endast namn på filer utan träffar" -#: builtin/grep.c:777 +#: builtin/grep.c:778 msgid "print NUL after filenames" msgstr "skriv NUL efter filnamn" -#: builtin/grep.c:779 +#: builtin/grep.c:780 msgid "show the number of matches instead of matching lines" msgstr "visa antal träffar istället för träffade rader" -#: builtin/grep.c:780 +#: builtin/grep.c:781 msgid "highlight matches" msgstr "ljusmarkera träffar" -#: builtin/grep.c:782 +#: builtin/grep.c:783 msgid "print empty line between matches from different files" msgstr "skriv tomma rader mellan träffar från olika filer" -#: builtin/grep.c:784 +#: builtin/grep.c:785 msgid "show filename only once above matches from same file" msgstr "visa filnamn endast en gång ovanför träffar från samma fil" -#: builtin/grep.c:787 +#: builtin/grep.c:788 msgid "show <n> context lines before and after matches" msgstr "visa <n> rader sammanhang före och efter träffar" -#: builtin/grep.c:790 +#: builtin/grep.c:791 msgid "show <n> context lines before matches" msgstr "visa <n> rader sammanhang före träffar" -#: builtin/grep.c:792 +#: builtin/grep.c:793 msgid "show <n> context lines after matches" msgstr "visa <n> rader sammanhang efter träffar" -#: builtin/grep.c:793 +#: builtin/grep.c:794 msgid "shortcut for -C NUM" msgstr "genväg för -C NUM" -#: builtin/grep.c:796 +#: builtin/grep.c:797 msgid "show a line with the function name before matches" msgstr "visa en rad med funktionsnamnet före träffen" -#: builtin/grep.c:798 +#: builtin/grep.c:799 msgid "show the surrounding function" msgstr "visa den omkringliggande funktionen" -#: builtin/grep.c:801 +#: builtin/grep.c:802 msgid "read patterns from file" msgstr "läs mönster från fil" -#: builtin/grep.c:803 +#: builtin/grep.c:804 msgid "match <pattern>" msgstr "träffa <mönster>" -#: builtin/grep.c:805 +#: builtin/grep.c:806 msgid "combine patterns specified with -e" msgstr "kombinera mönster som anges med -e" -#: builtin/grep.c:817 +#: builtin/grep.c:818 msgid "indicate hit with exit status without output" msgstr "ange träff med slutstatuskod utan utdata" -#: builtin/grep.c:819 +#: builtin/grep.c:820 msgid "show only matches from files that match all patterns" msgstr "visa endast träffar från filer som träffar alla mönster" #: builtin/grep.c:822 +msgid "show parse tree for grep expression" +msgstr "visa analysträd för grep-uttryck" + +#: builtin/grep.c:826 msgid "pager" msgstr "bläddrare" -#: builtin/grep.c:822 +#: builtin/grep.c:826 msgid "show matching files in the pager" msgstr "visa träffade filer i filbläddraren" -#: builtin/grep.c:825 +#: builtin/grep.c:829 msgid "allow calling of grep(1) (ignored by this build)" msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)" -#: builtin/grep.c:826 builtin/show-ref.c:201 +#: builtin/grep.c:830 builtin/show-ref.c:201 msgid "show usage" msgstr "visa användning" -#: builtin/grep.c:917 +#: builtin/grep.c:921 msgid "no pattern given." msgstr "inget mönster angavs." -#: builtin/grep.c:931 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "felaktigt objekt %s" -#: builtin/grep.c:972 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager fungerar endast i arbetskatalogen" -#: builtin/grep.c:995 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached och --untracked kan inte användas med --no-index." -#: builtin/grep.c:1000 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index och --untracked kan inte användas med revisioner." -#: builtin/grep.c:1003 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard kan inte användas för spårat innehåll." -#: builtin/grep.c:1011 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "både --cached och träd angavs." @@ -5718,7 +5690,7 @@ msgstr "tillåt snabbspolning (standard)" msgid "abort if fast-forward is not possible" msgstr "avbryt om snabbspolning inte är möjlig" -#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112 +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 msgid "strategy" msgstr "strategi" @@ -6181,11 +6153,11 @@ msgstr "läs från standard in" msgid "allow to print `undefined` names" msgstr "tillåt att skriva \"odefinierade\" namn" -#: builtin/notes.c:23 +#: builtin/notes.c:26 msgid "git notes [--ref <notes_ref>] [list [<object>]]" msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]" -#: builtin/notes.c:24 +#: builtin/notes.c:27 msgid "" "git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " "<object>] [<object>]" @@ -6193,12 +6165,12 @@ msgstr "" "git notes [--ref <anteckningsref>] add [-f] [-m <medd> | -F <fil> | (-c | -" "C) <objekt>] [<objekt>]" -#: builtin/notes.c:25 +#: builtin/notes.c:28 msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" msgstr "" "git notes [--ref <anteckningsref>] copy [-f] <från-objekt> <till-objekt>" -#: builtin/notes.c:26 +#: builtin/notes.c:29 msgid "" "git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " "<object>] [<object>]" @@ -6206,226 +6178,226 @@ msgstr "" "git notes [--ref <anteckningsref>] append [-m <medd> | -F <fil> | (-c | -C) " "<objekt>] [<objekt>]" -#: builtin/notes.c:27 +#: builtin/notes.c:30 msgid "git notes [--ref <notes_ref>] edit [<object>]" msgstr "git notes [--ref <anteckningsref>] edit [<objekt>]" -#: builtin/notes.c:28 +#: builtin/notes.c:31 msgid "git notes [--ref <notes_ref>] show [<object>]" msgstr "git notes [--ref <anteckningsref>] show [<objekt>]" -#: builtin/notes.c:29 +#: builtin/notes.c:32 msgid "" "git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" msgstr "" "git notes [--ref <anteckningsref>] merge [-v | -q] [-s <strategi> ] " "<anteckningsref>" -#: builtin/notes.c:30 +#: builtin/notes.c:33 msgid "git notes merge --commit [-v | -q]" msgstr "git notes merge --commit [-v | -q]" -#: builtin/notes.c:31 +#: builtin/notes.c:34 msgid "git notes merge --abort [-v | -q]" msgstr "git notes merge --abort [-v | -q]" -#: builtin/notes.c:32 +#: builtin/notes.c:35 msgid "git notes [--ref <notes_ref>] remove [<object>...]" msgstr "git notes [--ref <anteckningsref>] remove [<objekt>...]" -#: builtin/notes.c:33 +#: builtin/notes.c:36 msgid "git notes [--ref <notes_ref>] prune [-n | -v]" msgstr "git notes [--ref <anteckningsref>] prune [-n | -v]" -#: builtin/notes.c:34 +#: builtin/notes.c:37 msgid "git notes [--ref <notes_ref>] get-ref" msgstr "git notes [--ref <anteckningsref>] get-ref" -#: builtin/notes.c:39 +#: builtin/notes.c:42 msgid "git notes [list [<object>]]" msgstr "git notes [list [<objekt>]]" -#: builtin/notes.c:44 +#: builtin/notes.c:47 msgid "git notes add [<options>] [<object>]" msgstr "git notes add [<flaggor>] [<objekt>]" -#: builtin/notes.c:49 +#: builtin/notes.c:52 msgid "git notes copy [<options>] <from-object> <to-object>" msgstr "git notes copy [<flaggor>] <från-objekt> <till-objekt>" -#: builtin/notes.c:50 +#: builtin/notes.c:53 msgid "git notes copy --stdin [<from-object> <to-object>]..." msgstr "git notes copy --stdin [<från-objekt> <till-objekt>]..." -#: builtin/notes.c:55 +#: builtin/notes.c:58 msgid "git notes append [<options>] [<object>]" msgstr "git notes append [<flaggor>] [<objekt>]" -#: builtin/notes.c:60 +#: builtin/notes.c:63 msgid "git notes edit [<object>]" msgstr "git notes edit [<objekt>]" -#: builtin/notes.c:65 +#: builtin/notes.c:68 msgid "git notes show [<object>]" msgstr "git notes show [<objekt>]" -#: builtin/notes.c:70 +#: builtin/notes.c:73 msgid "git notes merge [<options>] <notes_ref>" msgstr "git notes merge [<flaggor>] <anteckningsref>" -#: builtin/notes.c:71 +#: builtin/notes.c:74 msgid "git notes merge --commit [<options>]" msgstr "git notes merge --commit [<flaggor>]" -#: builtin/notes.c:72 +#: builtin/notes.c:75 msgid "git notes merge --abort [<options>]" msgstr "git notes merge --abort [<flaggor>]" -#: builtin/notes.c:77 +#: builtin/notes.c:80 msgid "git notes remove [<object>]" msgstr "git notes remove [<objekt>]" -#: builtin/notes.c:82 +#: builtin/notes.c:85 msgid "git notes prune [<options>]" msgstr "git notes prune [<flaggor>]" -#: builtin/notes.c:87 +#: builtin/notes.c:90 msgid "git notes get-ref" msgstr "git notes get-ref" -#: builtin/notes.c:139 +#: builtin/notes.c:142 #, c-format msgid "unable to start 'show' for object '%s'" msgstr "kunde inte starta \"show\" för objektet \"%s\"" -#: builtin/notes.c:145 +#: builtin/notes.c:148 msgid "can't fdopen 'show' output fd" msgstr "kunde inte öppna (fdopen) \"show\"-utdata-filhandtag" -#: builtin/notes.c:155 +#: builtin/notes.c:158 #, c-format msgid "failed to close pipe to 'show' for object '%s'" msgstr "kunde inte stänga röret till \"show\" för objektet \"%s\"" -#: builtin/notes.c:158 +#: builtin/notes.c:161 #, c-format msgid "failed to finish 'show' for object '%s'" msgstr "kunde inte avsluta \"show\" för objektet \"%s\"" -#: builtin/notes.c:175 builtin/tag.c:347 +#: builtin/notes.c:178 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "kunde inte skapa filen \"%s\"" -#: builtin/notes.c:189 +#: builtin/notes.c:192 msgid "Please supply the note contents using either -m or -F option" msgstr "Ange innehåll för anteckningen med antingen -m eller -F" -#: builtin/notes.c:210 builtin/notes.c:973 +#: builtin/notes.c:213 builtin/notes.c:976 #, c-format msgid "Removing note for object %s\n" msgstr "Tar bort anteckning för objektet %s\n" -#: builtin/notes.c:215 +#: builtin/notes.c:218 msgid "unable to write note object" msgstr "kunde inte skriva anteckningsobjekt" -#: builtin/notes.c:217 +#: builtin/notes.c:220 #, c-format msgid "The note contents has been left in %s" msgstr "Anteckningens innehåll har lämnats kvar i %s" -#: builtin/notes.c:251 builtin/tag.c:542 +#: builtin/notes.c:254 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/notes.c:253 builtin/tag.c:545 +#: builtin/notes.c:256 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "kunde inte öppna eller läsa \"%s\"" -#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 -#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 -#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#: builtin/notes.c:275 builtin/notes.c:448 builtin/notes.c:450 +#: builtin/notes.c:510 builtin/notes.c:564 builtin/notes.c:647 +#: builtin/notes.c:652 builtin/notes.c:727 builtin/notes.c:769 +#: builtin/notes.c:971 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Kunde inte slå upp \"%s\" som en giltig referens." -#: builtin/notes.c:275 +#: builtin/notes.c:278 #, c-format msgid "Failed to read object '%s'." msgstr "Kunde inte läsa objektet \"%s\"." -#: builtin/notes.c:299 +#: builtin/notes.c:302 msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd" -#: builtin/notes.c:340 +#: builtin/notes.c:343 #, c-format msgid "Bad notes.rewriteMode value: '%s'" msgstr "Felaktigt värde för notes.rewriteMode: '%s'" -#: builtin/notes.c:350 +#: builtin/notes.c:353 #, c-format msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: builtin/notes.c:377 +#: builtin/notes.c:380 #, c-format msgid "Bad %s value: '%s'" msgstr "Felaktigt värde på %s: \"%s\"" -#: builtin/notes.c:441 +#: builtin/notes.c:444 #, c-format msgid "Malformed input line: '%s'." msgstr "Felaktig indatarad: \"%s\"." -#: builtin/notes.c:456 +#: builtin/notes.c:459 #, c-format msgid "Failed to copy notes from '%s' to '%s'" msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\"" -#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 -#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 -#: builtin/notes.c:1033 +#: builtin/notes.c:503 builtin/notes.c:557 builtin/notes.c:630 +#: builtin/notes.c:642 builtin/notes.c:715 builtin/notes.c:762 +#: builtin/notes.c:1036 msgid "too many parameters" msgstr "för många parametrar" -#: builtin/notes.c:513 builtin/notes.c:772 +#: builtin/notes.c:516 builtin/notes.c:775 #, c-format msgid "No note found for object %s." msgstr "Inga anteckningar hittades för objektet %s." -#: builtin/notes.c:535 builtin/notes.c:692 +#: builtin/notes.c:538 builtin/notes.c:695 msgid "note contents as a string" msgstr "anteckningsinnehåll som sträng" -#: builtin/notes.c:538 builtin/notes.c:695 +#: builtin/notes.c:541 builtin/notes.c:698 msgid "note contents in a file" msgstr "anteckningsinnehåll i en fil" -#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697 -#: builtin/notes.c:700 builtin/tag.c:476 +#: builtin/notes.c:543 builtin/notes.c:546 builtin/notes.c:700 +#: builtin/notes.c:703 builtin/tag.c:476 msgid "object" msgstr "objekt" -#: builtin/notes.c:541 builtin/notes.c:698 +#: builtin/notes.c:544 builtin/notes.c:701 msgid "reuse and edit specified note object" msgstr "återanvänd och redigera angivet anteckningsobjekt" -#: builtin/notes.c:544 builtin/notes.c:701 +#: builtin/notes.c:547 builtin/notes.c:704 msgid "reuse specified note object" msgstr "återanvänd angivet anteckningsobjekt" -#: builtin/notes.c:546 builtin/notes.c:614 +#: builtin/notes.c:549 builtin/notes.c:617 msgid "replace existing notes" msgstr "ersätt befintliga anteckningar" -#: builtin/notes.c:580 +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6434,24 +6406,24 @@ msgstr "" "Kan inte lägga till anteckningar. Hittade befintliga anteckningar för " "objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar" -#: builtin/notes.c:585 builtin/notes.c:662 +#: builtin/notes.c:588 builtin/notes.c:665 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Skriver över befintliga anteckningar för objektet %s\n" -#: builtin/notes.c:615 +#: builtin/notes.c:618 msgid "read objects from stdin" msgstr "läs objekt från standard in" -#: builtin/notes.c:617 +#: builtin/notes.c:620 msgid "load rewriting config for <command> (implies --stdin)" msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)" -#: builtin/notes.c:635 +#: builtin/notes.c:638 msgid "too few parameters" msgstr "för få parametrar" -#: builtin/notes.c:656 +#: builtin/notes.c:659 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6460,12 +6432,12 @@ msgstr "" "Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet " "%s. Använd \"-f\" för att skriva över befintliga anteckningar" -#: builtin/notes.c:668 +#: builtin/notes.c:671 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera." -#: builtin/notes.c:717 +#: builtin/notes.c:720 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" @@ -6474,15 +6446,15 @@ msgstr "" "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n" "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n" -#: builtin/notes.c:864 +#: builtin/notes.c:867 msgid "General options" msgstr "Allmänna flaggor" -#: builtin/notes.c:866 +#: builtin/notes.c:869 msgid "Merge options" msgstr "Flaggor för sammanslagning" -#: builtin/notes.c:868 +#: builtin/notes.c:871 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" @@ -6490,46 +6462,46 @@ msgstr "" "läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/" "cat_sort_uniq)" -#: builtin/notes.c:870 +#: builtin/notes.c:873 msgid "Committing unmerged notes" msgstr "Checkar in ej sammanslagna anteckningar" -#: builtin/notes.c:872 +#: builtin/notes.c:875 msgid "finalize notes merge by committing unmerged notes" msgstr "" "färdigställ sammanslagning av anteckningar genom att checka in ej " "sammanslagna anteckningar" -#: builtin/notes.c:874 +#: builtin/notes.c:877 msgid "Aborting notes merge resolution" msgstr "Avbryt lösning av sammanslagning av anteckningar" -#: builtin/notes.c:876 +#: builtin/notes.c:879 msgid "abort notes merge" msgstr "avbryt sammanslagning av anteckningar" -#: builtin/notes.c:971 +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "Objektet %s har ingen anteckning\n" -#: builtin/notes.c:983 +#: builtin/notes.c:986 msgid "attempt to remove non-existent note is not an error" msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel" -#: builtin/notes.c:986 +#: builtin/notes.c:989 msgid "read object names from the standard input" msgstr "läs objektnamn från standard in" -#: builtin/notes.c:1067 +#: builtin/notes.c:1070 msgid "notes_ref" msgstr "anteckningar-ref" -#: builtin/notes.c:1068 +#: builtin/notes.c:1071 msgid "use notes from <notes_ref>" msgstr "använd anteckningar från <anteckningsref>" -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Okänt underkommando: %s" @@ -8935,7 +8907,7 @@ msgstr "Kan inte slå ihop flera grenar i ett tomt huvud." msgid "Cannot rebase onto multiple branches" msgstr "Kan inte utföra en \"rebase\" ovanpå flera grenar" -#: git-rebase.sh:52 +#: git-rebase.sh:53 msgid "" "When you have resolved this problem, run \"git rebase --continue\".\n" "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" @@ -8946,27 +8918,31 @@ msgstr "" "Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n" "För att återställa originalgrenen och avbryta kör du \"git rebase --abort\"." -#: git-rebase.sh:159 +#: git-rebase.sh:160 msgid "The pre-rebase hook refused to rebase." msgstr "Kroken pre-rebase vägrade ombaseringen." -#: git-rebase.sh:164 +#: git-rebase.sh:165 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "Det verkar som en git-am körs. Kan inte ombasera." -#: git-rebase.sh:295 +#: git-rebase.sh:296 msgid "The --exec option must be used with the --interactive option" msgstr "Flaggan --exec måste användas tillsammans med flaggan --interactive" -#: git-rebase.sh:300 +#: git-rebase.sh:301 msgid "No rebase in progress?" msgstr "Ingen ombasering pågår?" -#: git-rebase.sh:313 +#: git-rebase.sh:312 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering." + +#: git-rebase.sh:319 msgid "Cannot read HEAD" msgstr "Kan inte läsa HEAD" -#: git-rebase.sh:316 +#: git-rebase.sh:322 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -8974,12 +8950,12 @@ msgstr "" "Du måste redigera alla sammanslagningskonflikter och\n" "därefter markera dem som lösta med git add" -#: git-rebase.sh:334 +#: git-rebase.sh:340 #, sh-format msgid "Could not move back to $head_name" msgstr "Kunde inte flytta tillbaka till $head_name" -#: git-rebase.sh:350 +#: git-rebase.sh:359 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9000,57 +8976,57 @@ msgstr "" "och kör programmet igen. Jag avslutar ifall du fortfarande har\n" "något av värde där." -#: git-rebase.sh:395 +#: git-rebase.sh:404 #, sh-format msgid "invalid upstream $upstream_name" msgstr "ogiltig uppström $upstream_name" -#: git-rebase.sh:419 +#: git-rebase.sh:428 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: mer än en sammanslagningsbas finns" -#: git-rebase.sh:422 git-rebase.sh:426 +#: git-rebase.sh:431 git-rebase.sh:435 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ingen sammanslagningsbas finns" -#: git-rebase.sh:431 +#: git-rebase.sh:440 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Peka på en giltig incheckning: $onto_name" -#: git-rebase.sh:454 +#: git-rebase.sh:463 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "ödesdigert: ingen sådan gren: $branch_name" -#: git-rebase.sh:474 +#: git-rebase.sh:483 msgid "Please commit or stash them." msgstr "Checka in eller använd \"stash\" på dem." -#: git-rebase.sh:492 +#: git-rebase.sh:501 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Aktuell gren $branch_name är à jour." -#: git-rebase.sh:495 +#: git-rebase.sh:504 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad." -#: git-rebase.sh:506 +#: git-rebase.sh:515 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Ändringar från $mb till $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:515 +#: git-rebase.sh:524 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpå det..." -#: git-rebase.sh:523 +#: git-rebase.sh:532 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Snabbspolade $branch_name till $onto_name." @@ -9379,6 +9355,27 @@ msgstr "# Undermodulers ändringar att checka in:" msgid "Synchronizing submodule url for '$name'" msgstr "Synkroniserar undermodul-url för \"$name\"" +#~ msgid " 0 files changed" +#~ msgstr " 0 filer ändrade" + +#~ msgid " %d file changed" +#~ msgid_plural " %d files changed" +#~ msgstr[0] " %d fil ändrad" +#~ msgstr[1] " %d filer ändrade" + +#~ msgid ", %d insertion(+)" +#~ msgid_plural ", %d insertions(+)" +#~ msgstr[0] ", %d tillägg(+)" +#~ msgstr[1] ", %d tillägg(+)" + +#~ msgid ", %d deletion(-)" +#~ msgid_plural ", %d deletions(-)" +#~ msgstr[0] ", %d borttagning(-)" +#~ msgstr[1] ", %d borttagningar(-)" + +#~ msgid "Auto packing the repository for optimum performance.\n" +#~ msgstr "Packar arkivet automatiskt för optimal prestanda.\n" + #~ msgid " (use \"git add\" to track)" #~ msgstr " (spåra med \"git add\")" @@ -6,10 +6,10 @@ # msgid "" msgstr "" -"Project-Id-Version: git-1.7.12-146-g16d26\n" +"Project-Id-Version: git-v1.8.0-rc2-4-g42e55\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-09-05 06:20+0800\n" -"PO-Revision-Date: 2012-09-08 08:00+0700\n" +"POT-Creation-Date: 2012-10-16 08:38+0800\n" +"PO-Revision-Date: 2012-10-17 08:09+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" @@ -37,30 +37,117 @@ msgid "" "or use 'git commit -a'." msgstr "" "Sửa chúng trong cây làm việc,\n" -"và sau đó dùng lệnh 'git add/rm <tập-tin>'\n" +"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,\n" -"hoặc là dùng lệnh 'git commit -a'." +"hoặc là dùng lệnh `git commit -a'." + +#: archive.c:10 +msgid "git archive [options] <tree-ish> [<path>...]" +msgstr "git archive [các-tùy-chọn] <tree-ish> [<đường-dẫn>...]" + +#: archive.c:11 +msgid "git archive --list" +msgstr "git archive --list" + +#: archive.c:12 +msgid "" +"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]" +msgstr "" +"git archive --remote <kho> [--exec <lệnh>] [các-tùy-chọn] <tree-ish> [<đường-" +"dẫn>...]" + +#: archive.c:13 +msgid "git archive --remote <repo> [--exec <cmd>] --list" +msgstr "git archive --remote <kho> [--exec <lệnh>] --list" + +#: archive.c:322 +msgid "fmt" +msgstr "fmt" + +#: archive.c:322 +msgid "archive format" +msgstr "định dạng lưu trữ" + +#: archive.c:323 builtin/log.c:1079 +msgid "prefix" +msgstr "tiền tố" + +#: archive.c:324 +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:325 builtin/archive.c:91 builtin/blame.c:2389 +#: builtin/blame.c:2390 builtin/config.c:56 builtin/fast-export.c:642 +#: builtin/fast-export.c:644 builtin/grep.c:801 builtin/hash-object.c:77 +#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:540 +#: builtin/notes.c:697 builtin/read-tree.c:107 parse-options.h:149 +msgid "file" +msgstr "tập-tin" + +#: archive.c:326 builtin/archive.c:92 +msgid "write the archive to this file" +msgstr "ghi kho lưu vào tập tin này" + +#: archive.c:328 +msgid "read .gitattributes in working directory" +msgstr "đọc .gitattributes trong thư mục làm việc" + +#: archive.c:329 +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 chuẩn)" + +#: archive.c:330 +msgid "store only" +msgstr "chỉ lưu" + +#: archive.c:331 +msgid "compress faster" +msgstr "nén nhanh hơn" + +#: archive.c:339 +msgid "compress better" +msgstr "nén nhỏ hơn" + +#: archive.c:342 +msgid "list supported archive formats" +msgstr "liệt kê các kiểu né được hỗ trợ" + +#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85 +msgid "repo" +msgstr "kho" + +#: archive.c:345 builtin/archive.c:94 +msgid "retrieve the archive from remote repository <repo>" +msgstr "nhận kho lưu từ kho chứa <kho> trên máy chủ" + +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 +msgid "command" +msgstr "lệnh" + +#: archive.c:347 builtin/archive.c:96 +msgid "path to the remote git-upload-archive command" +msgstr "đường dẫn đến lệnh git-upload-pack trên máy chủ" #: bundle.c:36 #, c-format msgid "'%s' does not look like a v2 bundle file" -msgstr "'%s' không giống như tập tin v2 bundle (cụm)" +msgstr "`%s' không giống như tập tin v2 bundle (cụm)" #: bundle.c:63 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "phần đầu (header) không được thừa nhận: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:699 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" -msgstr "không thể mở '%s'" +msgstr "không thể mở `%s'" #: bundle.c:140 msgid "Repository lacks these prerequisite commits:" msgstr "Khó chứa thiếu những lần chuyển giao (commit) cần trước hết này:" -#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290 +#: bundle.c:164 sequencer.c:562 sequencer.c:994 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" @@ -96,7 +183,7 @@ msgstr "đối số không được thừa nhận: %s" #: bundle.c:335 #, c-format msgid "ref '%s' is excluded by the rev-list options" -msgstr "tham chiếu '%s' bị loại trừ bởi các tùy chọn rev-list" +msgstr "tham chiếu `%s' bị loại trừ bởi các tùy chọn rev-list" #: bundle.c:380 msgid "Refusing to create empty bundle." @@ -113,18 +200,18 @@ msgstr "pack-objects đã chết" #: bundle.c:419 #, c-format msgid "cannot create '%s'" -msgstr "không thể tạo '%s'" +msgstr "không thể tạo `%s'" #: bundle.c:441 msgid "index-pack died" msgstr "index-pack đã chết" -#: commit.c:48 +#: commit.c:50 #, c-format msgid "could not parse %s" msgstr "không thể phân tích %s" -#: commit.c:50 +#: commit.c:52 #, c-format msgid "%s %s is not a commit!" msgstr "%s %s không phải là một lần commit!" @@ -135,7 +222,7 @@ msgstr "cạn bộ nhớ" #: connected.c:39 msgid "Could not run 'git rev-list'" -msgstr "Không thể chạy 'git rev-list'" +msgstr "Không thể chạy `git rev-list'" #: connected.c:48 #, c-format @@ -217,12 +304,12 @@ msgstr[1] "%lu năm trước" #: diff.c:105 #, c-format msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" -msgstr " Gặp lỗi khi phân tích dirstat cắt bỏ phần trăm '%.*s'\n" +msgstr " Gặp lỗi khi phân tích dirstat cắt bỏ phần trăm `%.*s'\n" #: diff.c:110 #, c-format msgid " Unknown dirstat parameter '%.*s'\n" -msgstr " Không hiểu đối số dirstat '%.*s'\n" +msgstr " Không hiểu đối số dirstat `%.*s'\n" #: diff.c:210 #, c-format @@ -233,32 +320,7 @@ msgstr "" "Tìm thấy các lỗi trong biến cấu hình 'diff.dirstat':\n" "%s" -#: diff.c:1401 -msgid " 0 files changed" -msgstr " 0 có tập tin nào thay đổi cả" - -#: diff.c:1405 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d tập tin thay đổi" -msgstr[1] " %d tập tin thay đổi" - -#: diff.c:1422 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d thêm(+)" -msgstr[1] ", %d thêm(+)" - -#: diff.c:1433 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d xóa(-)" -msgstr[1] ", %d xóa(-)" - -#: diff.c:3460 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -279,25 +341,25 @@ msgstr "gpg đã không đồng ý dữ liệu" msgid "gpg failed to sign the data" msgstr "gpg gặp lỗi khi ký dữ liệu" -#: grep.c:1320 +#: grep.c:1441 #, c-format msgid "'%s': unable to read %s" -msgstr "'%s': không thể đọc %s" +msgstr "`%s': không thể đọc %s" -#: grep.c:1337 +#: grep.c:1458 #, c-format msgid "'%s': %s" -msgstr "'%s': %s" +msgstr "`%s': %s" -#: grep.c:1348 +#: grep.c:1469 #, c-format msgid "'%s': short read %s" -msgstr "'%s': đọc ngắn %s" +msgstr "`%s': đọc ngắn %s" #: help.c:212 #, c-format msgid "available git commands in '%s'" -msgstr "các lệnh git sẵn sàng để dùng trong '%s'" +msgstr "các lệnh git sẵn sàng để dùng trong `%s'" #: help.c:219 msgid "git commands available from elsewhere on your $PATH" @@ -309,7 +371,7 @@ msgid "" "'%s' appears to be a git command, but we were not\n" "able to execute it. Maybe git-%s is broken?" msgstr "" -"'%s' trông như là một lệnh git, nhưng chúng tôi không\n" +"`%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:332 @@ -322,8 +384,8 @@ msgid "" "WARNING: You called a Git command named '%s', which does not exist.\n" "Continuing under the assumption that you meant '%s'" 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.\n" -"Giả định rằng ý bạn là '%s'" +"CẢNH BÁO: Bạn đã gọi lệnh Git có tên `%s', mà nó lại không có sẵn.\n" +"Giả định rằng ý bạn là `%s'" #: help.c:359 #, c-format @@ -333,7 +395,7 @@ msgstr "trong %0.1f giây một cách tự động..." #: help.c:366 #, 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'." +msgstr "git: `%s' không phải là một lệnh của git. Xem `git --help'." #: help.c:370 msgid "" @@ -357,7 +419,7 @@ msgstr "(commit sai)\n" #: merge-recursive.c:206 #, c-format msgid "addinfo_cache failed for path '%s'" -msgstr "addinfo_cache gặp lỗi đối với đường dẫn '%s'" +msgstr "addinfo_cache gặp lỗi đối với đường dẫn `%s'" #: merge-recursive.c:268 msgid "error building trees" @@ -366,7 +428,7 @@ msgstr "gặp lỗi khi xây dựng cây" #: merge-recursive.c:672 #, c-format msgid "failed to create path '%s'%s" -msgstr "gặp lỗi khi tạo đường dẫn '%s'%s" +msgstr "gặp lỗi khi tạo đường dẫn `%s'%s" #: merge-recursive.c:683 #, c-format @@ -382,47 +444,47 @@ msgstr ": có lẽ là một xung đột D/F?" #: merge-recursive.c:708 #, c-format msgid "refusing to lose untracked file at '%s'" -msgstr "từ chối đóng tập tin không được theo vết tại '%s'" +msgstr "từ chối đóng tập tin không được theo vết tại `%s'" #: merge-recursive.c:748 #, c-format msgid "cannot read object %s '%s'" -msgstr "không thể đọc đối tượng %s '%s'" +msgstr "không thể đọc đối tượng %s `%s'" #: merge-recursive.c:750 #, c-format msgid "blob expected for %s '%s'" -msgstr "đối tượng blob được mong đợi cho %s '%s'" +msgstr "đối tượng blob được mong đợi cho %s `%s'" #: merge-recursive.c:773 builtin/clone.c:302 #, c-format msgid "failed to open '%s'" -msgstr "gặp lỗi khi mở '%s'" +msgstr "gặp lỗi khi mở `%s'" #: merge-recursive.c:781 #, c-format msgid "failed to symlink '%s'" -msgstr "gặp lỗi khi tạo liên kết tượng trưng (symlink) '%s'" +msgstr "gặp lỗi khi tạo liên kết tượng trưng (symlink) `%s'" #: merge-recursive.c:784 #, 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'" +msgstr "không hiểu phải làm gì với %06o %s `%s'" -#: merge-recursive.c:921 +#: merge-recursive.c:922 msgid "Failed to execute internal merge" msgstr "Gặp lỗi khi thực hiện trộn nội bộ" -#: merge-recursive.c:925 +#: merge-recursive.c:926 #, 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:941 +#: merge-recursive.c:942 msgid "unsupported object type in the tree" msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)" -#: merge-recursive.c:1020 merge-recursive.c:1034 +#: merge-recursive.c:1021 merge-recursive.c:1035 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -431,7 +493,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:1026 merge-recursive.c:1039 +#: merge-recursive.c:1027 merge-recursive.c:1040 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -440,20 +502,20 @@ 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:1080 +#: merge-recursive.c:1081 msgid "rename" msgstr "đổi tên" -#: merge-recursive.c:1080 +#: merge-recursive.c:1081 msgid "renamed" msgstr "đã đổi tên" -#: merge-recursive.c:1136 +#: merge-recursive.c:1137 #, 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:1158 +#: merge-recursive.c:1159 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -462,146 +524,146 @@ 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:1163 +#: merge-recursive.c:1164 msgid " (left unresolved)" msgstr " (cần giải quyết)" -#: merge-recursive.c:1217 +#: merge-recursive.c:1218 #, 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:1247 +#: merge-recursive.c:1248 #, 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:1446 +#: merge-recursive.c:1447 #, 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:1456 +#: merge-recursive.c:1457 #, c-format msgid "Adding merged %s" msgstr "Thêm hòa trộn %s" -#: merge-recursive.c:1461 merge-recursive.c:1659 +#: merge-recursive.c:1462 merge-recursive.c:1660 #, c-format msgid "Adding as %s instead" msgstr "Thay vào đó thêm vào %s" -#: merge-recursive.c:1512 +#: merge-recursive.c:1513 #, c-format msgid "cannot read object %s" msgstr "không thể đọc đối tượng %s" -#: merge-recursive.c:1515 +#: merge-recursive.c:1516 #, 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:1563 +#: merge-recursive.c:1564 msgid "modify" msgstr "sửa đổi" -#: merge-recursive.c:1563 +#: merge-recursive.c:1564 msgid "modified" -msgstr "đã bị sửa" +msgstr "đã sửa" -#: merge-recursive.c:1573 +#: merge-recursive.c:1574 msgid "content" msgstr "nội dung" -#: merge-recursive.c:1580 +#: merge-recursive.c:1581 msgid "add/add" msgstr "thêm/thêm" -#: merge-recursive.c:1614 +#: merge-recursive.c:1615 #, 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:1628 +#: merge-recursive.c:1629 #, c-format msgid "Auto-merging %s" msgstr "Tự-động-hòa-trộn %s" -#: merge-recursive.c:1632 git-submodule.sh:869 +#: merge-recursive.c:1633 git-submodule.sh:869 msgid "submodule" -msgstr "mô-đun con" +msgstr "mô-đun-con" -#: merge-recursive.c:1633 +#: merge-recursive.c:1634 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s" -#: merge-recursive.c:1723 +#: merge-recursive.c:1724 #, c-format msgid "Removing %s" msgstr "Đang xóa %s" -#: merge-recursive.c:1748 +#: merge-recursive.c:1749 msgid "file/directory" msgstr "tập-tin/thư-mục" -#: merge-recursive.c:1754 +#: merge-recursive.c:1755 msgid "directory/file" msgstr "thư-mục/tập tin" -#: merge-recursive.c:1759 +#: merge-recursive.c:1760 #, 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:1769 +#: merge-recursive.c:1770 #, c-format msgid "Adding %s" msgstr "Thêm \"%s\"" -#: merge-recursive.c:1786 +#: merge-recursive.c:1787 msgid "Fatal merge failure, shouldn't happen." msgstr "Việc hòa trộn hỏng nghiêm trọng, không nên để xảy ra." -#: merge-recursive.c:1805 +#: merge-recursive.c:1806 msgid "Already up-to-date!" msgstr "Đã cập nhật rồi!" -#: merge-recursive.c:1814 +#: merge-recursive.c:1815 #, c-format msgid "merging of trees %s and %s failed" msgstr "hòa trộn cây (tree) %s và %s gặp lỗi" -#: merge-recursive.c:1844 +#: merge-recursive.c:1845 #, c-format msgid "Unprocessed path??? %s" msgstr "Đường dẫn chưa được xử lý??? %s" -#: merge-recursive.c:1889 +#: merge-recursive.c:1890 msgid "Merging:" msgstr "Đang trộn:" -#: merge-recursive.c:1902 +#: merge-recursive.c:1903 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "tìm thấy %u tổ tiên chung:" msgstr[1] "tìm thấy %u tổ tiên chung:" -#: merge-recursive.c:1939 +#: merge-recursive.c:1940 msgid "merge returned no commit" msgstr "hòa trộn không trả về lần chuyển giao (commit) nào" -#: merge-recursive.c:1996 +#: merge-recursive.c:1997 #, 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'" -#: merge-recursive.c:2008 builtin/merge.c:696 +#: merge-recursive.c:2009 builtin/merge.c:696 msgid "Unable to write index." msgstr "Không thể ghi bảng mục lục" @@ -630,8 +692,8 @@ msgstr " %s" #, 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 là đầu của '%s' bởi %d lần chuyển giao (commit).\n" -msgstr[1] "Nhánh của bạn là đầu của '%s' bởi %d lần chuyển giao (commit).\n" +msgstr[0] "Nhánh của bạn là đầu của `%s' bởi %d lần chuyển giao (commit).\n" +msgstr[1] "Nhánh của bạn là đầu của `%s' bởi %d lần chuyển giao (commit).\n" #: remote.c:1638 #, c-format @@ -639,10 +701,10 @@ msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" msgstr[0] "" -"Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể " +"Nhánh của bạn thì ở đằng sau `%s' bởi %d lần chuyển giao (commit), và có thể " "được fast-forward.\n" msgstr[1] "" -"Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể " +"Nhánh của bạn thì ở đằng sau `%s' bởi %d lần chuyển giao (commit), và có thể " "được fast-forward.\n" #: remote.c:1646 @@ -654,110 +716,110 @@ msgid_plural "" "Your branch and '%s' have diverged,\n" "and have %d and %d different commits each, respectively.\n" msgstr[0] "" -"Nhánh của bạn và '%s' bị phân kỳ,\n" +"Nhánh của bạn và `%s' bị phân kỳ,\n" "và có %d và %d lần chuyển giao (commit) khác nhau cho từng cái,\n" "tương ứng với mỗi lần.\n" msgstr[1] "" -"Your branch and '%s' have diverged,\n" +"Your branch and `%s' have diverged,\n" "and have %d and %d different commit each, respectively.\n" -#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977 +#: sequencer.c:123 builtin/merge.c:864 builtin/merge.c:977 #: builtin/merge.c:1087 builtin/merge.c:1097 #, c-format msgid "Could not open '%s' for writing" msgstr "Không thể mở %s' để ghi" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867 +#: sequencer.c:125 builtin/merge.c:333 builtin/merge.c:867 #: builtin/merge.c:1089 builtin/merge.c:1102 #, c-format msgid "Could not write to '%s'" -msgstr "Không thể ghi vào '%s'" +msgstr "Không thể ghi vào `%s'" -#: sequencer.c:144 +#: sequencer.c:146 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" 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>'" +"với lệnh `git add <đường_dẫn>' hoặc `git rm <đường_dẫn>'" -#: sequencer.c:147 +#: sequencer.c:149 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" "and commit the result with 'git commit'" msgstr "" "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>'\n" -"và chuyển giao (commit) kết quả bằng lệnh 'git commit'" +"với lệnh `git add <đường_dẫn>' hoặc `git rm <đường_dẫn>'\n" +"và chuyển giao (commit) kết quả bằng lệnh `git commit'" -#: sequencer.c:160 sequencer.c:758 sequencer.c:841 +#: sequencer.c:162 sequencer.c:770 sequencer.c:853 #, c-format msgid "Could not write to %s" msgstr "Không thể ghi vào %s" -#: sequencer.c:163 +#: sequencer.c:165 #, c-format msgid "Error wrapping up %s" msgstr "Lỗi bao bọc %s" -#: sequencer.c:178 +#: sequencer.c:180 msgid "Your local changes would be overwritten by cherry-pick." msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh cherry-pick." -#: sequencer.c:180 +#: sequencer.c:182 msgid "Your local changes would be overwritten by revert." msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh revert." -#: sequencer.c:183 +#: sequencer.c:185 msgid "Commit your changes or stash them to proceed." msgstr "Chuyển giao (commit) các thay đổi của bạn hay stash chúng để xử lý." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:233 +#: sequencer.c:235 #, 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:261 +#: sequencer.c:266 msgid "Could not resolve HEAD commit\n" msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n" -#: sequencer.c:282 +#: sequencer.c:287 msgid "Unable to update cache tree\n" msgstr "Không thể cập nhật cây bộ nhớ đệm\n" -#: sequencer.c:324 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "Không thể phân tích commit (lần chuyển giao) %s\n" -#: sequencer.c:329 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Không thể phân tích commit (lần chuyển giao) cha mẹ %s\n" -#: sequencer.c:395 +#: sequencer.c:403 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:398 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "Bạn không có HEAD nào hợp lệ" -#: sequencer.c:413 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" "Lần chuyển giao (commit) %s là một lần hòa trộn nhưng không đưa ra tùy chọn -" "m." -#: sequencer.c:421 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "Lần chuyển giao (commit) %s không có cha mẹ %d" -#: sequencer.c:425 +#: sequencer.c:433 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" @@ -766,143 +828,143 @@ msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:436 +#: sequencer.c:444 #, 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:440 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "Không thể lấy thông điệp lần chuyển giao (commit) cho %s" -#: sequencer.c:524 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "không thể revert %s... %s" -#: sequencer.c:525 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "không thể apply (áp dụng miếng vá) %s... %s" -#: sequencer.c:553 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "lần chuyển giao (commit) trống rỗng đặt là hợp quy cách" -#: sequencer.c:561 +#: sequencer.c:573 #, 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:566 +#: sequencer.c:578 #, 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:624 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "Không thể %s trong khi %s" -#: sequencer.c:646 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "Không phân tích được dòng %d." -#: sequencer.c:651 +#: sequencer.c:663 msgid "No commits parsed." msgstr "Không có lần chuyển giao (commit) nào được phân tích." -#: sequencer.c:664 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "Không thể mở %s" -#: sequencer.c:668 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "Không thể đọc %s." -#: sequencer.c:675 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Bảng chỉ thị không thể dùng được: %s" -#: sequencer.c:703 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "Khóa không đúng: %s" -#: sequencer.c:706 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "Giá trị không hợp lệ %s: %s" -#: sequencer.c:718 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "Bảng tùy chọn dị hình: %s" -#: sequencer.c:739 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "một thao tác cherry-pick hoặc revert đang được thực hiện" -#: sequencer.c:740 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:744 +#: sequencer.c:756 #, 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:760 sequencer.c:845 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "Lỗi bao bọc %s." -#: sequencer.c:779 sequencer.c:913 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "không cherry-pick hay revert trong tiến trình" -#: sequencer.c:781 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "không thể phân giải HEAD" -#: sequencer.c:783 +#: sequencer.c:795 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:805 builtin/apply.c:3987 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "không thể mở %s: %s" -#: sequencer.c:808 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "không thể đọc %s: %s" -#: sequencer.c:809 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "kết thúc tập tin đột xuất" -#: sequencer.c:815 +#: sequencer.c:827 #, 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" +msgstr "tập tin HEAD 'pre-cherry-pick' đã lưu `%s' bị hỏng" -#: sequencer.c:838 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "Không thể định dạng %s." -#: sequencer.c:1000 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "Không thể revert một lần chuyển giao (commit) khởi tạo" -#: sequencer.c:1001 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng" @@ -913,26 +975,31 @@ msgstr "HEAD không chỉ đến một nhánh nào cả" #: sha1_name.c:1047 #, c-format msgid "No such branch: '%s'" -msgstr "Không có nhánh nào như thế: '%s'" +msgstr "Không có nhánh nào như thế: `%s'" #: sha1_name.c:1049 #, c-format msgid "No upstream configured for branch '%s'" -msgstr "Không có dòng ngược (upstream) được cấu hình cho nhánh '%s'" +msgstr "Không có thượng nguồn (upstream) được cấu hình cho nhánh `%s'" #: sha1_name.c:1052 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "" -"Nhánh dòng ngược (upstream) '%s' không được lưu lại như là một nhánh 'remote-" -"tracking'" +"Nhánh thượng nguồn (upstream) `%s' không được lưu lại như là một nhánh " +"'remote-tracking'" + +#: wrapper.c:408 +#, c-format +msgid "unable to access '%s': %s" +msgstr "không thể truy cập `%s': %s" -#: wrapper.c:413 +#: wrapper.c:426 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "không tìm thấy người dùng hiện tại trong tập tin passwd: %s" -#: wrapper.c:414 +#: wrapper.c:427 msgid "no such user" msgstr "không có người dùng như vậy" @@ -956,8 +1023,8 @@ msgstr " (dùng \"git add <tập-tin>...\" để đánh dấu là cần giải #: wt-status.c:175 wt-status.c:179 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)" +" (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:177 msgid " (use \"git rm <file>...\" to mark resolution)" @@ -981,8 +1048,7 @@ msgstr "" #: wt-status.c:212 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)" +" (dùng \"git add/rm <tập-tin>...\" để cập nhật những gì sẽ được chuyển giao)" #: wt-status.c:213 msgid "" @@ -997,11 +1063,6 @@ msgstr "" " (chuyển giao (commit) hoặc là loại bỏ các nội dung không-bị-theo-vết hay " "đã bị chỉnh sửa trong mô-đun-con)" -#: wt-status.c:224 -#, c-format -msgid "%s files:" -msgstr "%s tập tin:" - #: wt-status.c:227 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" @@ -1212,12 +1273,12 @@ msgid "Initial commit" msgstr "Lần chuyển giao (commit) khởi đầu" #: wt-status.c:1011 -msgid "Untracked" -msgstr "Không được theo vết" +msgid "Untracked files" +msgstr "Những tập tin chưa được theo dõi" #: wt-status.c:1013 -msgid "Ignored" -msgstr "Bị bỏ qua" +msgid "Ignored files" +msgstr "Những tập tin bị lờ đi" #: wt-status.c:1015 #, c-format @@ -1232,60 +1293,75 @@ msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được msgid "No changes" msgstr "Không có thay đổi nào" -#: wt-status.c:1027 +#: wt-status.c:1028 #, c-format -msgid "no changes added to commit%s\n" -msgstr "không có thay đổi nào được thêm vào lần chuyển giao (commit)%s\n" - -#: wt-status.c:1029 -msgid " (use \"git add\" and/or \"git commit -a\")" -msgstr " (dùng \"git add\" và/hoặc \"git commit -a\")" +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 commit (dùng \"git add\" và/hoặc \"git " +"commit -a\")\n" #: wt-status.c:1031 #, c-format -msgid "nothing added to commit but untracked files present%s\n" +msgid "no changes added to commit\n" +msgstr "không có thay đổi nào được thêm vào lần chuyển giao (commit)\n" + +#: wt-status.c:1034 +#, c-format +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" msgstr "" "không có gì được thêm vào lần chuyển giao (commit) nhưng có những tập tin " -"không được theo dấu vết hiện diện%s\n" +"không được theo dấu vết hiện diện (dùng \"git add\" để đưa vào theo dõi)\n" -#: wt-status.c:1033 -msgid " (use \"git add\" to track)" -msgstr " (dùng \"git add\" để theo dõi dấu vết)" +#: wt-status.c:1037 +#, 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 (commit) nhưng có những tập tin " +"không được theo dấu vết hiện diện\n" -#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041 +#: wt-status.c:1040 #, c-format -msgid "nothing to commit%s\n" -msgstr "không có gì để chuyển giao (commit) %s\n" +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" +msgstr "" +" không có gì để commit (tạo/sao-chép các tập tin và dùng \"git add\" để theo " +"dõi dấu vết)\n" -#: wt-status.c:1036 -msgid " (create/copy files and use \"git add\" to track)" -msgstr " (tạo/sao-chép các tập tin và dùng \"git add\" để theo dõi dấu vết)" +#: wt-status.c:1043 wt-status.c:1048 +#, c-format +msgid "nothing to commit\n" +msgstr "không có gì để chuyển giao (commit)\n" -#: wt-status.c:1039 -msgid " (use -u 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:1046 +#, c-format +msgid "nothing to commit (use -u to show untracked files)\n" +msgstr "" +"không có gì để chuyển giao (commit) (dùng -u để bỏ các tập tin cần theo dấu " +"vết)\n" -#: wt-status.c:1042 -msgid " (working directory clean)" -msgstr " (thư mục làm việc sạch sẽ)" +#: wt-status.c:1050 +#, c-format +msgid "nothing to commit, working directory clean\n" +msgstr "không có gì để chuyển giao (commit), thư mục làm việc sạch sẽ\n" -#: wt-status.c:1150 +#: wt-status.c:1158 msgid "HEAD (no branch)" msgstr "HEAD (không nhánh)" -#: wt-status.c:1156 +#: wt-status.c:1164 msgid "Initial commit on " msgstr "Lần chuyển giao (commit) khởi tạo trên " -#: wt-status.c:1171 +#: wt-status.c:1179 msgid "behind " msgstr "đằng sau " -#: wt-status.c:1174 wt-status.c:1177 +#: wt-status.c:1182 wt-status.c:1185 msgid "ahead " msgstr "phía trước " -#: wt-status.c:1179 +#: wt-status.c:1187 msgid ", behind " msgstr ", đằng sau " @@ -1294,39 +1370,43 @@ msgstr ", đằng sau " msgid "failed to unlink '%s'" msgstr "bỏ liên kết (unlink) %s không thành công" +#: builtin/add.c:19 +msgid "git add [options] [--] <filepattern>..." +msgstr "git add [các-tùy-chọn] [--] <mẫu-tập-tin>..." + #: builtin/add.c:62 #, c-format msgid "unexpected diff status %c" msgstr "trạng thái lệnh diff không như mong đợi %c" -#: builtin/add.c:67 builtin/commit.c:229 +#: builtin/add.c:67 builtin/commit.c:230 msgid "updating files failed" msgstr "Cập nhật tập tin gặp lỗi" #: builtin/add.c:77 #, c-format msgid "remove '%s'\n" -msgstr "gỡ bỏ '%s'\n" +msgstr "gỡ bỏ `%s'\n" #: builtin/add.c:176 #, c-format msgid "Path '%s' is in submodule '%.*s'" -msgstr "Đường dẫn '%s' thì ở trong mô-đun-con '%.*s'" +msgstr "Đường dẫn `%s' thì ở trong mô-đun-con `%.*s'" #: builtin/add.c:192 msgid "Unstaged changes after refreshing the index:" msgstr "" "Các thay đổi không được lưu trạng thái sau khi làm tươi mới lại bảng mục lục:" -#: builtin/add.c:195 builtin/add.c:459 builtin/rm.c:186 +#: builtin/add.c:195 builtin/add.c:460 builtin/rm.c:186 #, c-format msgid "pathspec '%s' did not match any files" -msgstr "pathspec '%s' không khớp với bất kỳ tập tin nào" +msgstr "pathspec `%s' không khớp với bất kỳ tập tin nào" #: builtin/add.c:209 #, c-format msgid "'%s' is beyond a symbolic link" -msgstr "'%s' nằm ngoài một liên kết tượng trưng" +msgstr "`%s' nằm ngoài một liên kết tượng trưng" #: builtin/add.c:276 msgid "Could not read the index" @@ -1335,7 +1415,7 @@ msgstr "Không thể đọc bảng mục lục" #: builtin/add.c:286 #, c-format msgid "Could not open '%s' for writing." -msgstr "Không thể mở '%s' để ghi" +msgstr "Không thể mở `%s' để ghi" #: builtin/add.c:290 msgid "Could not write patch" @@ -1344,7 +1424,7 @@ msgstr "Không thể ghi ra miếng vá" #: builtin/add.c:295 #, c-format msgid "Could not stat '%s'" -msgstr "không thể lấy trạng thái về '%s'" +msgstr "không thể lấy trạng thái về `%s'" #: builtin/add.c:297 msgid "Empty patch. Aborted." @@ -1353,51 +1433,106 @@ msgstr "Miếng vá trống rỗng. Đã bỏ qua." #: builtin/add.c:303 #, c-format msgid "Could not apply '%s'" -msgstr "Không thể apply (áp dụng miếng vá) '%s'" +msgstr "Không thể apply (áp dụng miếng vá) `%s'" -#: builtin/add.c:312 +#: builtin/add.c:313 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:352 +#: builtin/add.c:319 builtin/clean.c:52 builtin/fetch.c:78 builtin/mv.c:63 +#: builtin/prune-packed.c:76 builtin/push.c:388 builtin/remote.c:1253 +#: builtin/rm.c:133 +msgid "dry run" +msgstr "chạy thử" + +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1154 +#: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477 +#: builtin/mv.c:62 builtin/read-tree.c:112 +msgid "be verbose" +msgstr "chi tiết" + +#: builtin/add.c:322 +msgid "interactive picking" +msgstr "sửa bằng cách tương tác" + +#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248 +msgid "select hunks interactively" +msgstr "chọn `hunks' một cách tương tác" + +#: builtin/add.c:324 +msgid "edit current diff and apply" +msgstr "sửa diff hiện nay và áp dụng nó" + +#: builtin/add.c:325 +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:326 +msgid "update tracked files" +msgstr "cập nhật các tập tin được theo vết" + +#: builtin/add.c:327 +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:328 +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:329 +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:330 +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:331 +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:353 #, 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:353 +#: builtin/add.c:354 msgid "no files added" msgstr "chưa có tập tin nào được thêm vào" -#: builtin/add.c:359 +#: builtin/add.c:360 msgid "adding files failed" msgstr "thêm tập tin gặp lỗi" -#: builtin/add.c:391 +#: builtin/add.c:392 msgid "-A and -u are mutually incompatible" msgstr "-A và -u xung khắc nhau" -#: builtin/add.c:393 +#: builtin/add.c:394 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:413 +#: builtin/add.c:414 #, 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:414 +#: builtin/add.c:415 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "Có lẽ bạn muốn nói là 'git add .' phải không?\n" +msgstr "Có lẽ bạn muốn là `git add .' phải không?\n" -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82 +#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:290 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "tập tin ghi bảng mục lục bị hỏng" -#: builtin/add.c:480 builtin/apply.c:4432 builtin/mv.c:229 builtin/rm.c:260 +#: builtin/add.c:481 builtin/apply.c:4450 builtin/mv.c:229 builtin/rm.c:260 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" @@ -1408,12 +1543,12 @@ msgstr "git apply [các-tùy-chọn] [<miếng-vá>...]" #: builtin/apply.c:110 #, c-format msgid "unrecognized whitespace option '%s'" -msgstr "không nhận ra tùy chọn về khoảng trắng '%s'" +msgstr "không nhận ra tùy chọn về khoảng trắng `%s'" #: builtin/apply.c:125 #, c-format msgid "unrecognized whitespace ignore option '%s'" -msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng '%s'" +msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng `%s'" #: builtin/apply.c:823 #, c-format @@ -1452,17 +1587,17 @@ msgstr "git apply: git-diff sai - tên tập tin cũ mâu thuấn trên dòng %d msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "git apply: git-diff sai - mong đợi /dev/null trên dòng %d" -#: builtin/apply.c:1402 +#: builtin/apply.c:1420 #, c-format msgid "recount: unexpected line: %.*s" msgstr "chi tiết: dòng không được mong đợi: %.*s" -#: builtin/apply.c:1459 +#: builtin/apply.c:1477 #, 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" -#: builtin/apply.c:1476 +#: builtin/apply.c:1494 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -1477,82 +1612,82 @@ msgstr[1] "" "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)" -#: builtin/apply.c:1636 +#: builtin/apply.c:1654 msgid "new file depends on old contents" msgstr "tập tin mới phụ thuộc vào nội dung cũ" -#: builtin/apply.c:1638 +#: builtin/apply.c:1656 msgid "deleted file still has contents" msgstr "tập tin đã xóa vẫn còn nội dung" -#: builtin/apply.c:1664 +#: builtin/apply.c:1682 #, c-format msgid "corrupt patch at line %d" msgstr "miếng vá hỏng tại dòng %d" -#: builtin/apply.c:1700 +#: builtin/apply.c:1718 #, 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ũ" -#: builtin/apply.c:1702 +#: builtin/apply.c:1720 #, c-format msgid "deleted file %s still has contents" msgstr "tập tin đã xóa %s vẫn còn nội dung" -#: builtin/apply.c:1705 +#: builtin/apply.c:1723 #, 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" -#: builtin/apply.c:1851 +#: builtin/apply.c:1869 #, 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" #. there has to be one hunk (forward hunk) -#: builtin/apply.c:1880 +#: builtin/apply.c:1898 #, 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" -#: builtin/apply.c:1966 +#: builtin/apply.c:1984 #, c-format msgid "patch with only garbage at line %d" msgstr "vá chỉ với 'garbage' tại dòng %d" -#: builtin/apply.c:2056 +#: builtin/apply.c:2074 #, c-format msgid "unable to read symlink %s" msgstr "không thể đọc liên kết tượng trưng %s" -#: builtin/apply.c:2060 +#: builtin/apply.c:2078 #, c-format msgid "unable to open or read %s" msgstr "không thể mở để đọc hay ghi %s" -#: builtin/apply.c:2131 +#: builtin/apply.c:2149 msgid "oops" msgstr "ôi?" -#: builtin/apply.c:2653 +#: builtin/apply.c:2671 #, c-format msgid "invalid start of line: '%c'" -msgstr "sai khởi đầu dòng: '%c'" +msgstr "sai khởi đầu dòng: `%c'" -#: builtin/apply.c:2771 +#: builtin/apply.c:2789 #, 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)." msgstr[1] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)." -#: builtin/apply.c:2783 +#: builtin/apply.c:2801 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "Nội dung bị giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %d" -#: builtin/apply.c:2789 +#: builtin/apply.c:2807 #, c-format msgid "" "while searching for:\n" @@ -1561,327 +1696,325 @@ msgstr "" "Trong khi đang tìm kiếm cho:\n" "%.*s" -#: builtin/apply.c:2808 +#: builtin/apply.c:2826 #, 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'" +msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho `%s'" -#: builtin/apply.c:2911 +#: builtin/apply.c:2929 #, 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'" +msgstr "miếng vá định dạng nhị phân không được áp dụng cho `%s'" -#: builtin/apply.c:2917 +#: builtin/apply.c:2935 #, 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)" +"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)" -#: builtin/apply.c:2938 +#: builtin/apply.c:2956 #, c-format msgid "patch failed: %s:%ld" msgstr "vá gặp lỗi: %s:%ld" -#: builtin/apply.c:3060 +#: builtin/apply.c:3078 #, c-format msgid "cannot checkout %s" msgstr "không thể \"checkout\" %s" -#: builtin/apply.c:3105 builtin/apply.c:3114 builtin/apply.c:3158 +#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176 #, c-format msgid "read of %s failed" msgstr "đọc %s gặp lỗi" -#: builtin/apply.c:3138 builtin/apply.c:3360 +#: builtin/apply.c:3156 builtin/apply.c:3378 #, c-format msgid "path %s has been renamed/deleted" msgstr "đường dẫn %s đã bị xóa/đổi tên" -#: builtin/apply.c:3219 builtin/apply.c:3374 +#: builtin/apply.c:3237 builtin/apply.c:3392 #, c-format msgid "%s: does not exist in index" msgstr "%s: không tồn tại trong bảng mục lục" -#: builtin/apply.c:3223 builtin/apply.c:3366 builtin/apply.c:3388 +#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: builtin/apply.c:3228 builtin/apply.c:3382 +#: builtin/apply.c:3246 builtin/apply.c:3400 #, c-format msgid "%s: does not match index" msgstr "%s: không khớp trong mục lục" -#: builtin/apply.c:3330 +#: builtin/apply.c:3348 msgid "removal patch leaves file contents" msgstr "loại bỏ miếng vá để lại nội dung tập tin" -#: builtin/apply.c:3399 +#: builtin/apply.c:3417 #, c-format msgid "%s: wrong type" msgstr "%s: sai kiểu" -#: builtin/apply.c:3401 +#: builtin/apply.c:3419 #, c-format msgid "%s has type %o, expected %o" msgstr "%s có kiểu %o, mong chờ %o" -#: builtin/apply.c:3502 +#: builtin/apply.c:3520 #, c-format msgid "%s: already exists in index" msgstr "%s: đã có từ trước trong bảng mục lục" -#: builtin/apply.c:3505 +#: builtin/apply.c:3523 #, c-format msgid "%s: already exists in working directory" msgstr "%s: đã sẵn có trong thư mục đang làm việc" -#: builtin/apply.c:3525 +#: builtin/apply.c:3543 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)" -#: builtin/apply.c:3530 +#: builtin/apply.c:3548 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s" -#: builtin/apply.c:3538 +#: builtin/apply.c:3556 #, c-format msgid "%s: patch does not apply" msgstr "%s: miếng vá không được áp dụng" -#: builtin/apply.c:3551 +#: builtin/apply.c:3569 #, c-format msgid "Checking patch %s..." msgstr "Đang kiểm tra miếng vá %s..." -#: builtin/apply.c:3606 builtin/checkout.c:213 builtin/reset.c:158 +#: builtin/apply.c:3624 builtin/checkout.c:215 builtin/reset.c:158 #, 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'" +msgstr "make_cache_entry gặp lỗi đối với đường dẫn `%s'" -#: builtin/apply.c:3749 +#: builtin/apply.c:3767 #, c-format msgid "unable to remove %s from index" msgstr "không thể gỡ bỏ %s từ mục lục" -#: builtin/apply.c:3777 +#: builtin/apply.c:3795 #, c-format msgid "corrupt patch for subproject %s" msgstr "miếng vá sai hỏng cho dự án con (subproject) %s" -#: builtin/apply.c:3781 +#: builtin/apply.c:3799 #, c-format msgid "unable to stat newly created file '%s'" msgstr "không thể lấy trạng thái về tập tin %s mới hơn đã được tạo" -#: builtin/apply.c:3786 +#: builtin/apply.c:3804 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "không thể tạo 'backing store' cho tập tin được tạo mới hơn %s" -#: builtin/apply.c:3789 builtin/apply.c:3897 +#: builtin/apply.c:3807 builtin/apply.c:3915 #, c-format msgid "unable to add cache entry for %s" msgstr "không thể thêm mục nhớ tạm cho %s" -#: builtin/apply.c:3822 +#: builtin/apply.c:3840 #, c-format msgid "closing file '%s'" -msgstr "đang đóng tập tin '%s'" +msgstr "đang đóng tập tin `%s'" -#: builtin/apply.c:3871 +#: builtin/apply.c:3889 #, c-format msgid "unable to write file '%s' mode %o" -msgstr "không thể ghi vào tập tin '%s' chế độ (mode) %o" +msgstr "không thể ghi vào tập tin `%s' chế độ (mode) %o" -#: builtin/apply.c:3958 +#: builtin/apply.c:3976 #, c-format msgid "Applied patch %s cleanly." msgstr "Đã áp dụng miếng và %s một cách sạch sẽ." -#: builtin/apply.c:3966 +#: builtin/apply.c:3984 msgid "internal error" msgstr "lỗi nội bộ" #. Say this even without --verbose -#: builtin/apply.c:3969 +#: builtin/apply.c:3987 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối..." msgstr[1] "Đang áp dụng miếng vá %%s với %d lần từ chối..." -#: builtin/apply.c:3979 +#: builtin/apply.c:3997 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "đang cắt cụt tên tập tin .rej thành %.*s.rej" -#: builtin/apply.c:4000 +#: builtin/apply.c:4018 #, c-format msgid "Hunk #%d applied cleanly." msgstr "Khối nhớ #%d được áp dụng gọn gàng." -#: builtin/apply.c:4003 +#: builtin/apply.c:4021 #, c-format msgid "Rejected hunk #%d." msgstr "hunk #%d bị từ chối." -#: builtin/apply.c:4153 +#: builtin/apply.c:4171 msgid "unrecognized input" msgstr "không thừa nhận đầu vào" -#: builtin/apply.c:4164 +#: builtin/apply.c:4182 msgid "unable to read index file" msgstr "không thể đọc tập tin lưu bảng mục lục" -#: builtin/apply.c:4283 builtin/apply.c:4286 +#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91 +#: builtin/fetch.c:63 msgid "path" msgstr "đường-dẫn" -#: builtin/apply.c:4284 +#: builtin/apply.c:4302 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" -#: builtin/apply.c:4287 +#: builtin/apply.c:4305 msgid "apply changes matching the given path" msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho" -#: builtin/apply.c:4289 +#: builtin/apply.c:4307 msgid "num" msgstr "số" -#: builtin/apply.c:4290 +#: builtin/apply.c:4308 msgid "remove <num> leading slashes from traditional diff paths" msgstr "gỡ bỏ <số> phần dẫn đầu (slashe) từ đường dẫn diff cổ điển" -#: builtin/apply.c:4293 +#: builtin/apply.c:4311 msgid "ignore additions made by the patch" msgstr "lờ đi phần phụ thêm tạo ra bởi miếng vá" -#: builtin/apply.c:4295 +#: builtin/apply.c:4313 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" -#: builtin/apply.c:4299 -msgid "shows number of added and deleted lines in decimal notation" +#: builtin/apply.c:4317 +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" -#: builtin/apply.c:4301 +#: builtin/apply.c:4319 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" -#: builtin/apply.c:4303 +#: builtin/apply.c:4321 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" -#: builtin/apply.c:4305 +#: builtin/apply.c:4323 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" -#: builtin/apply.c:4307 +#: builtin/apply.c:4325 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" -#: builtin/apply.c:4309 +#: builtin/apply.c:4327 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)" -#: builtin/apply.c:4311 +#: builtin/apply.c:4329 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" -#: builtin/apply.c:4313 +#: builtin/apply.c:4331 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" -#: builtin/apply.c:4315 +#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460 msgid "paths are separated with NUL character" msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL" -#: builtin/apply.c:4318 +#: builtin/apply.c:4336 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" -#: builtin/apply.c:4319 +#: builtin/apply.c:4337 msgid "action" msgstr "hành động" -#: builtin/apply.c:4320 +#: builtin/apply.c:4338 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" -#: builtin/apply.c:4323 builtin/apply.c:4326 +#: builtin/apply.c:4341 builtin/apply.c:4344 msgid "ignore changes in whitespace when finding context" msgstr "lờ đi sự thay đổi do khoảng trắng khi quét nội dung" -#: builtin/apply.c:4329 +#: builtin/apply.c:4347 msgid "apply the patch in reverse" msgstr "áp dụng miếng vá theo chiều ngược" -#: builtin/apply.c:4331 +#: builtin/apply.c:4349 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" -#: builtin/apply.c:4333 +#: builtin/apply.c:4351 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" -#: builtin/apply.c:4335 +#: builtin/apply.c:4353 msgid "allow overlapping hunks" msgstr "cho phép chồng khối nhớ" -#: builtin/apply.c:4336 -msgid "be verbose" -msgstr "chi tiết" - -#: builtin/apply.c:4338 +#: builtin/apply.c:4356 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" -#: builtin/apply.c:4341 +#: builtin/apply.c:4359 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" -#: builtin/apply.c:4343 +#: builtin/apply.c:4361 msgid "root" msgstr "root" -#: builtin/apply.c:4344 +#: builtin/apply.c:4362 msgid "prepend <root> to all filenames" msgstr "treo thêm <root> vào tất cả các tên tập tin" -#: builtin/apply.c:4366 +#: builtin/apply.c:4384 msgid "--3way outside a repository" msgstr "--3way ở ngoài một kho chứa" -#: builtin/apply.c:4374 +#: builtin/apply.c:4392 msgid "--index outside a repository" msgstr "--index ở ngoài một kho chứa" -#: builtin/apply.c:4377 +#: builtin/apply.c:4395 msgid "--cached outside a repository" msgstr "--cached ở ngoài một kho chứa" -#: builtin/apply.c:4393 +#: builtin/apply.c:4411 #, c-format msgid "can't open patch '%s'" -msgstr "không thể mở miếng vá '%s'" +msgstr "không thể mở miếng vá `%s'" -#: builtin/apply.c:4407 +#: builtin/apply.c:4425 #, 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" msgstr[1] "đã chấm dứt %d lỗi khoảng trắng" -#: builtin/apply.c:4413 builtin/apply.c:4423 +#: builtin/apply.c:4431 builtin/apply.c:4441 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -1891,7 +2024,7 @@ msgstr[1] "%d dòng thêm khoảng trắng lỗi." #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" -msgstr "không thể tạo tập tin kho (lưu trữ, nén) '%s'" +msgstr "không thể tạo tập tin kho (lưu trữ, nén) `%s'" #: builtin/archive.c:20 msgid "could not redirect output" @@ -1923,187 +2056,449 @@ msgstr "git archive: lỗi giao thức" msgid "git archive: expected a flush" msgstr "git archive: đã mong chờ một flush" -#: builtin/branch.c:144 +#: builtin/bisect--helper.c:7 +msgid "git bisect--helper --next-all [--no-checkout]" +msgstr "git bisect--helper --next-all [--no-checkout]" + +#: builtin/bisect--helper.c:17 +msgid "perform 'git bisect next'" +msgstr "thực hiện `git bisect next'" + +#: builtin/bisect--helper.c:19 +msgid "update BISECT_HEAD instead of checking out the current commit" +msgstr "" +"cập nhật BISECT_HEAD thay vì lấy ra (checking out) lần chuyển giao (commit) " +"hiện hành" + +#: builtin/blame.c:25 +msgid "git blame [options] [rev-opts] [rev] [--] file" +msgstr "git blame [các-tùy-chọn] [rev-opts] [rev] [--] tập-tin" + +#: builtin/blame.c:30 builtin/shortlog.c:15 +msgid "[rev-opts] are documented in git-rev-list(1)" +msgstr "[rev-opts] được mô tả trong git-rev-list(1)" + +#: builtin/blame.c:2373 +msgid "Show blame entries as we find them, incrementally" +msgstr "Hiển thị các mục `blame' như là chúng ta thấy chúng, tăng dần" + +#: builtin/blame.c:2374 +msgid "Show blank SHA-1 for boundary commits (Default: off)" +msgstr "" +"Hiển thị SHA-1 trống cho những lần chuyển giao biên giới (Mặc định: off)" + +#: builtin/blame.c:2375 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "Không coi các lần chuyển giao gốc là giới hạn (Mặc định: off)" + +#: builtin/blame.c:2376 +msgid "Show work cost statistics" +msgstr "Hiển thị thống kê công sức làm việc" + +#: builtin/blame.c:2377 +msgid "Show output score for blame entries" +msgstr "Hiển thị kết xuất điểm số có các mục tin `blame'" + +#: builtin/blame.c:2378 +msgid "Show original filename (Default: auto)" +msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)" + +#: builtin/blame.c:2379 +msgid "Show original linenumber (Default: off)" +msgstr "Hiển thị số dòng gốc (Mặc định: off)" + +#: builtin/blame.c:2380 +msgid "Show in a format designed for machine consumption" +msgstr "Hiển thị ở định dạng đã thiết kế cho sự tiêu dùng bằng máy" + +#: builtin/blame.c:2381 +msgid "Show porcelain format with per-line commit information" +msgstr "Hiển thị định dạng 'porcelain' với thông tin chuyển giao mỗi dòng" + +#: builtin/blame.c:2382 +msgid "Use the same output mode as git-annotate (Default: off)" +msgstr "Dùng cùng chế độ xuất ra vóigit-annotate (Mặc định: off)" + +#: builtin/blame.c:2383 +msgid "Show raw timestamp (Default: off)" +msgstr "Hiển thị dấu vết thời gian dạng thô (Mặc định: off)" + +#: builtin/blame.c:2384 +msgid "Show long commit SHA1 (Default: off)" +msgstr "Hiển thị SHA1 của lần chuyển giao (commit) dạng dài (Mặc định: off)" + +#: builtin/blame.c:2385 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "Không hiển thị tên tác giả và dấu vết thời gian (Mặc định: off)" + +#: builtin/blame.c:2386 +msgid "Show author email instead of name (Default: off)" +msgstr "Hiển thị thư điện tử của tác giả thay vì tên (Mặc định: off)" + +#: builtin/blame.c:2387 +msgid "Ignore whitespace differences" +msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra" + +#: builtin/blame.c:2388 +msgid "Spend extra cycles to find better match" +msgstr "Tiêu thụ thêm năng tài nguyên máy móc để tìm kiếm tốt hơn nữa" + +#: builtin/blame.c:2389 +msgid "Use revisions from <file> instead of calling git-rev-list" +msgstr "" +"Sử dụng điểm xét duyệt (revision) từ <tập tin> thay vì gọi `git-rev-list'" + +#: builtin/blame.c:2390 +msgid "Use <file>'s contents as the final image" +msgstr "Sử dụng nội dung của <tập tin> như là ảnh cuối cùng" + +#: builtin/blame.c:2391 builtin/blame.c:2392 +msgid "score" +msgstr "điểm số" + +#: builtin/blame.c:2391 +msgid "Find line copies within and across files" +msgstr "Tìm các bản sao chép dòng trong và ngang qua tập tin" + +#: builtin/blame.c:2392 +msgid "Find line movements within and across files" +msgstr "Tìm các di chuyển dòng trong và ngang qua tập tin" + +#: builtin/blame.c:2393 +msgid "n,m" +msgstr "n,m" + +#: builtin/blame.c:2393 +msgid "Process only line range n,m, counting from 1" +msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1" + +#: builtin/branch.c:23 +msgid "git branch [options] [-r | -a] [--merged | --no-merged]" +msgstr "git branch [các-tùy-chọn] [-r | -a] [--merged | --no-merged]" + +#: builtin/branch.c:24 +msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]" +msgstr "git branch [các-tùy-chọn] [-l] [-f] <tên-nhánh> [<điểm-đầu>]" + +#: builtin/branch.c:25 +msgid "git branch [options] [-r] (-d | -D) <branchname>..." +msgstr "git branch [các-tùy-chọn] [-r] (-d | -D) <tên-nhánh> ..." + +#: builtin/branch.c:26 +msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>" +msgstr "git branch [các-tùy-chọn] (-m | -M) [<nhánh-cũ>] <nhánh-mới>" + +#: builtin/branch.c:145 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD." msgstr "" -"đang xóa nhánh '%s' mà nó lại đã được hòa trộn vào\n" -" '%s', nhưng vẫn chưa được hòa trộn vào HEAD." +"đang xóa nhánh `%s' mà nó lại đã được hòa trộn vào\n" +" `%s', nhưng vẫn chưa được hòa trộn vào HEAD." -#: builtin/branch.c:148 +#: builtin/branch.c:149 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" " '%s', even though it is merged to HEAD." msgstr "" -"không xóa nhánh '%s' cái mà chưa được hòa trộng vào\n" -" '%s', cho dù là nó đã được hòa trộn vào HEAD." +"không xóa nhánh `%s' cái mà chưa được hòa trộng vào\n" +" `%s', cho dù là nó đã được hòa trộn vào HEAD." -#: builtin/branch.c:180 +#: builtin/branch.c:181 msgid "cannot use -a with -d" msgstr "không thể dùng tùy chọn -a với -d" -#: builtin/branch.c:186 +#: builtin/branch.c:187 msgid "Couldn't look up commit object for HEAD" msgstr "Không thể tìm kiếm đối tượng chuyển giao (commit) cho HEAD" -#: builtin/branch.c:191 +#: builtin/branch.c:192 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." -msgstr "Không thể xóa nhánh '%s' cái mà bạn hiện nay đang ở." +msgstr "Không thể xóa nhánh `%s' cái mà bạn hiện nay đang ở." -#: builtin/branch.c:202 +#: builtin/branch.c:203 #, c-format msgid "remote branch '%s' not found." -msgstr "không tìm thấy nhánh máy chủ '%s'." +msgstr "không tìm thấy nhánh máy chủ `%s'." -#: builtin/branch.c:203 +#: builtin/branch.c:204 #, c-format msgid "branch '%s' not found." -msgstr "không tìm thấy nhánh '%s'." +msgstr "không tìm thấy nhánh `%s'." -#: builtin/branch.c:210 +#: builtin/branch.c:211 #, c-format msgid "Couldn't look up commit object for '%s'" -msgstr "Không thể tìm kiếm đối tượng chuyển giao (commit) cho '%s'" +msgstr "Không thể tìm kiếm đối tượng chuyển giao (commit) cho `%s'" -#: builtin/branch.c:216 +#: builtin/branch.c:217 #, c-format msgid "" "The branch '%s' is not fully merged.\n" "If you are sure you want to delete it, run 'git branch -D %s'." msgstr "" -"Nhánh '%s' không được trộn một cách đầy đủ.\n" -"Nếu bạn thực sự muốn xóa nó, thì chạy lệnh 'git branch -D %s'." +"Nhánh `%s' không được trộn một cách đầy đủ.\n" +"Nếu bạn thực sự muốn xóa nó, thì chạy lệnh `git branch -D %s'." -#: builtin/branch.c:225 +#: builtin/branch.c:226 #, c-format msgid "Error deleting remote branch '%s'" -msgstr "Gặp lỗi khi đang xóa nhánh máy chủ '%s'" +msgstr "Gặp lỗi khi đang xóa nhánh máy chủ `%s'" -#: builtin/branch.c:226 +#: builtin/branch.c:227 #, c-format msgid "Error deleting branch '%s'" -msgstr "Lỗi khi xoá bỏ nhánh '%s'" +msgstr "Lỗi khi xoá bỏ nhánh `%s'" -#: builtin/branch.c:233 +#: builtin/branch.c:234 #, c-format msgid "Deleted remote branch %s (was %s).\n" msgstr "Nhánh máy chủ \"%s\" đã bị xóa (từng là %s).\n" -#: builtin/branch.c:234 +#: builtin/branch.c:235 #, c-format msgid "Deleted branch %s (was %s).\n" -msgstr "Nhánh '%s' đã bị xóa (từng là %s)\n" +msgstr "Nhánh `%s' đã bị xóa (từng là %s)\n" -#: builtin/branch.c:239 +#: builtin/branch.c:240 msgid "Update of config-file failed" msgstr "Cập nhật tập tin cấu hình gặp lỗi" -#: builtin/branch.c:337 +#: builtin/branch.c:338 #, c-format msgid "branch '%s' does not point at a commit" -msgstr "nhánh '%s' không chỉ đến một lần chuyển giao (commit) nào cả" +msgstr "nhánh `%s' không chỉ đến một lần chuyển giao (commit) nào cả" -#: builtin/branch.c:409 +#: builtin/branch.c:410 #, c-format msgid "[%s: behind %d]" msgstr "[%s: đằng sau %d]" -#: builtin/branch.c:411 +#: builtin/branch.c:412 #, c-format msgid "[behind %d]" msgstr "[đằng sau %d]" -#: builtin/branch.c:415 +#: builtin/branch.c:416 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: phía trước %d]" -#: builtin/branch.c:417 +#: builtin/branch.c:418 #, c-format msgid "[ahead %d]" msgstr "[phía trước %d]" -#: builtin/branch.c:420 +#: builtin/branch.c:421 #, c-format msgid "[%s: ahead %d, behind %d]" -msgstr "[%s: phía trước %d, phía sau %d]" +msgstr "[%s: trước %d, sau %d]" -#: builtin/branch.c:423 +#: builtin/branch.c:424 #, c-format msgid "[ahead %d, behind %d]" -msgstr "[phía trước %d, phía sau %d]" +msgstr "[trước %d, sau %d]" -#: builtin/branch.c:535 +#: builtin/branch.c:537 msgid "(no branch)" msgstr "(không nhánh)" -#: builtin/branch.c:600 +#: builtin/branch.c:602 msgid "some refs could not be read" msgstr "một số tham chiếu đã không thể đọc được" -#: builtin/branch.c:613 +#: builtin/branch.c:615 msgid "cannot rename the current branch while not on any." msgstr "không thể đổi tên nhánh hiện hành trong khi nó chẳng ở đâu cả." -#: builtin/branch.c:623 +#: builtin/branch.c:625 #, c-format msgid "Invalid branch name: '%s'" -msgstr "Sai tên nhánh: '%s'" +msgstr "Sai tên nhánh: `%s'" -#: builtin/branch.c:638 +#: builtin/branch.c:640 msgid "Branch rename failed" msgstr "Đổi tên nhánh gặp lỗi" -#: builtin/branch.c:642 +#: builtin/branch.c:644 #, c-format msgid "Renamed a misnamed branch '%s' away" -msgstr "Đã đổi tên nhánh khuyết danh '%s' đi" +msgstr "Đã đổi tên nhánh khuyết danh `%s' đi" -#: builtin/branch.c:646 +#: builtin/branch.c:648 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "Nhánh bị đổi tên thành %s, nhưng HEAD lại không được cập nhật!" -#: builtin/branch.c:653 +#: builtin/branch.c:655 msgid "Branch is renamed, but update of config-file failed" msgstr "Nhánh bị đổi tên, nhưng cập nhật tập tin cấu hình gặp lỗi" -#: builtin/branch.c:668 +#: builtin/branch.c:670 #, c-format msgid "malformed object name %s" msgstr "tên đối tượng dị hình %s" -#: builtin/branch.c:692 +#: builtin/branch.c:694 #, c-format msgid "could not write branch description template: %s" msgstr "không thể ghi vào mẫu mô tả nhánh: %s" -#: builtin/branch.c:783 +#: builtin/branch.c:724 +msgid "Generic options" +msgstr "Tùy chọn chung" + +#: builtin/branch.c:726 +msgid "show hash and subject, give twice for upstream branch" +msgstr "hiển thị mã băm và chủ đề, đưa ra hai lần cho nhánh thượng nguồn" + +#: builtin/branch.c:727 +msgid "suppress informational messages" +msgstr "Thu hồi các thông điệp thông tin" + +#: builtin/branch.c:728 +msgid "set up tracking mode (see git-pull(1))" +msgstr "cài đặt chế độ theo vết (xem git-pull(1))" + +#: builtin/branch.c:730 +msgid "change upstream info" +msgstr "thay đổi thông tin thượng nguồn (upstream)" + +#: builtin/branch.c:734 +msgid "use colored output" +msgstr "sử dụng kết xuất có tô màu" + +#: builtin/branch.c:735 +msgid "act on remote-tracking branches" +msgstr "thao tác trên nhánh `remote-tracking'" + +#: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765 +#: builtin/branch.c:771 builtin/commit.c:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 +msgid "commit" +msgstr "commit" + +#: builtin/branch.c:739 builtin/branch.c:745 +msgid "print only branches that contain the commit" +msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao" + +#: builtin/branch.c:751 +msgid "Specific git-branch actions:" +msgstr "Hành động git-branch:" + +#: builtin/branch.c:752 +msgid "list both remote-tracking and local branches" +msgstr "liệt kê cả nhánh `remote-tracking' và nội bộ" + +#: builtin/branch.c:754 +msgid "delete fully merged branch" +msgstr "xóa một cách đầy đủ nhánh đã hòa trộn" + +#: builtin/branch.c:755 +msgid "delete branch (even if not merged)" +msgstr "xoá nhánh (cho dù là chưa được hòa trộn)" + +#: builtin/branch.c:756 +msgid "move/rename a branch and its reflog" +msgstr "di chuyển hay đổi tên một nhánh và reflog của nó" + +#: builtin/branch.c:757 +msgid "move/rename a branch, even if target exists" +msgstr "di chuyể hoặc đổi tên một nhánh, thậm chí cả khi đích đã có sẵn" + +#: builtin/branch.c:758 +msgid "list branch names" +msgstr "liệt kê các tên nhánh" + +#: builtin/branch.c:759 +msgid "create the branch's reflog" +msgstr "tạo reflog của nhánh" + +#: builtin/branch.c:761 +msgid "edit the description for the branch" +msgstr "sửa mô tả cho nhánh" + +#: builtin/branch.c:762 +msgid "force creation (when already exists)" +msgstr "ép buộc tạo (khi đã sẵn tồn tại rồi)" + +#: builtin/branch.c:765 +msgid "print only not merged branches" +msgstr "chỉ hiển thị các nhánh chưa được hòa trộn" + +#: builtin/branch.c:771 +msgid "print only merged branches" +msgstr "chỉ hiển thị các nhánh được hòa trộn" + +#: builtin/branch.c:775 +msgid "list branches in columns" +msgstr "liệt kê các nhánh trong các cột" + +#: builtin/branch.c:788 msgid "Failed to resolve HEAD as a valid ref." msgstr "Gặp lỗi khi giải quyết HEAD như là một tham chiếu (ref) hợp lệ." -#: builtin/branch.c:788 builtin/clone.c:561 +#: builtin/branch.c:793 builtin/clone.c:561 msgid "HEAD not found below refs/heads!" msgstr "không tìm thấy HEAD ở dưới refs/heads!" -#: builtin/branch.c:808 +#: builtin/branch.c:813 msgid "--column and --verbose are incompatible" msgstr "--column và --verbose xung khắc nhau" -#: builtin/branch.c:857 +#: builtin/branch.c:864 +#, c-format +msgid "branch '%s' does not exist" +msgstr "nhánh `%s' chưa sẵn có" + +#: builtin/branch.c:876 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "Nhánh `%s' không có thông tin thượng nguồn (upstream)" + +#: builtin/branch.c:891 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" -"hai tùy chọn -a và -r áp dụng cho lệnh 'git branch' không hợp lý đối với tên " +"hai tùy chọn -a và -r áp dụng cho lệnh `git branch' không hợp lý đối với tên " "nhánh" +#: builtin/branch.c:894 +#, c-format +msgid "" +"The --set-upstream flag is deprecated and will be removed. Consider using --" +"track or --set-upstream-to\n" +msgstr "" +"Cờ --set-upstream bị phản đối và sẽ bị xóa bỏ. Nên dùng --track hoặc --set-" +"upstream-to\n" + +#: builtin/branch.c:911 +#, c-format +msgid "" +"\n" +"If you wanted to make '%s' track '%s', do this:\n" +"\n" +msgstr "" +"\n" +"Nếu bạn muốn `%s' theo dõi `%s', thực hiện lệnh sau:\n" +"\n" + +#: builtin/branch.c:912 +#, c-format +msgid " git branch -d %s\n" +msgstr " git branch -d %s\n" + +#: builtin/branch.c:913 +#, c-format +msgid " git branch --set-upstream-to %s\n" +msgstr " git branch --set-upstream-to %s\n" + #: builtin/bundle.c:47 #, c-format msgid "%s is okay\n" -msgstr "'%s' tốt\n" +msgstr "`%s' tốt\n" #: builtin/bundle.c:56 msgid "Need a repository to create a bundle." @@ -2113,95 +2508,231 @@ msgstr "Cần một kho chứa để mà tạo một bundle." msgid "Need a repository to unbundle." msgstr "Cần một kho chứa để mà bung một bundle." -#: builtin/checkout.c:114 builtin/checkout.c:147 +#: builtin/cat-file.c:247 +msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" +msgstr "git cat-file (-t|-s|-e|-p|<kiểu>|--textconv) <đối tượng>" + +#: builtin/cat-file.c:248 +msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" +msgstr "git cat-file (--batch|--batch-check) < <danh-sách-đối-tượng>" + +#: builtin/cat-file.c:266 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "<kiểu> là một trong số: blob, tree, commit, tag" + +#: builtin/cat-file.c:267 +msgid "show object type" +msgstr "hiển thị kiểu đối tượng" + +#: builtin/cat-file.c:268 +msgid "show object size" +msgstr "hiển thị kích thước đối tượng" + +#: builtin/cat-file.c:270 +msgid "exit with zero when there's no error" +msgstr "thoát với 0 khi không có lỗi" + +#: builtin/cat-file.c:271 +msgid "pretty-print object's content" +msgstr "in nội dung đối tượng dạng dễ đọc" + +#: builtin/cat-file.c:273 +msgid "for blob objects, run textconv on object's content" +msgstr "với đối tượng blob, chạy lệnh textconv trên nội dung của đối tượng" + +#: builtin/cat-file.c:275 +msgid "show info and content of objects fed from the standard input" +msgstr "" +"hiển thị thông tin và nội dung của các đối tượng lấy từ đầu vào tiêu chuẩn" + +#: builtin/cat-file.c:278 +msgid "show info about objects fed from the standard input" +msgstr "hiển thị các thông tin về đối tượng fed từ đầu vào tiêu chuẩn" + +#: builtin/check-attr.c:11 +msgid "git check-attr [-a | --all | attr...] [--] pathname..." +msgstr "git check-attr [-a | --all | attr...] [--] tên-đường-dẫn..." + +#: builtin/check-attr.c:12 +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>" +msgstr "" +"git check-attr --stdin [-z] [-a | --all | attr...] < <danh-sách-đường-dẫn>" + +#: builtin/check-attr.c:19 +msgid "report all attributes set on file" +msgstr "báo cáo tất cả các thuộc tính đặt trên tập tin" + +#: builtin/check-attr.c:20 +msgid "use .gitattributes only from the index" +msgstr "chỉ sử dụng .gitattributes từ bảng mục lục" + +#: builtin/check-attr.c:21 builtin/hash-object.c:75 +msgid "read file names from stdin" +msgstr "đọc tên tập tin từ đầu vào tiêu chuẩn" + +#: builtin/check-attr.c:23 +msgid "input paths are terminated by a null character" +msgstr "các đường dẫn được ngăn cách bởi ký tự null" + +#: builtin/checkout-index.c:126 +msgid "git checkout-index [options] [--] [<file>...]" +msgstr "git checkout-index [các-tùy-chọn] [--] [<tập-tin>...]" + +#: builtin/checkout-index.c:187 +msgid "check out all files in the index" +msgstr "lấy ra toàn bộ các tập tin trong bảng mục lục" + +#: builtin/checkout-index.c:188 +msgid "force overwrite of existing files" +msgstr "ép buộc ghi đè lên tập tin đã sẵn có từ trước" + +#: builtin/checkout-index.c:190 +msgid "no warning for existing files and files not in index" +msgstr "" +"không cảnh báo cho những tập tin tồn tại và không có trong bảng mục lục" + +#: builtin/checkout-index.c:192 +msgid "don't checkout new files" +msgstr "không checkout các tập tin mới" + +#: builtin/checkout-index.c:194 +msgid "update stat information in the index file" +msgstr "cập nhật thông tin thống kê trong tập tin lưu bảng mục lục mới" + +#: builtin/checkout-index.c:200 +msgid "read list of paths from the standard input" +msgstr " đọc danh sách đường dẫn từ thiết bị nhập chuẩn" + +#: builtin/checkout-index.c:202 +msgid "write the content to temporary files" +msgstr "ghi nội dung vào tập tin tạm" + +#: builtin/checkout-index.c:203 builtin/column.c:30 +msgid "string" +msgstr "chuỗi" + +#: builtin/checkout-index.c:204 +msgid "when creating files, prepend <string>" +msgstr "khi tạo các tập tin, nối thêm <chuỗi>" + +#: builtin/checkout-index.c:207 +msgid "copy out the files from named stage" +msgstr "sao chép ra các tập tin từ trạng thái được đặt tên" + +#: builtin/checkout.c:25 +msgid "git checkout [options] <branch>" +msgstr "git checkout [các-tùy-chọn] <nhánh>" + +#: builtin/checkout.c:26 +msgid "git checkout [options] [<branch>] -- <file>..." +msgstr "git checkout [các-tùy-chọn] [<nhánh>] -- <tập-tin>..." + +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have our version" -msgstr "đường dẫn '%s' không có các phiên bản của chúng ta" +msgstr "đường dẫn `%s' không có các phiên bản của chúng ta" -#: builtin/checkout.c:116 builtin/checkout.c:149 +#: builtin/checkout.c:118 builtin/checkout.c:151 #, c-format msgid "path '%s' does not have their version" -msgstr "đường dẫn '%s' không có các phiên bản của chúng" +msgstr "đường dẫn `%s' không có các phiên bản của chúng" -#: builtin/checkout.c:132 +#: builtin/checkout.c:134 #, c-format msgid "path '%s' does not have all necessary versions" -msgstr "đường dẫn '%s' không có tất cả các phiên bản cần thiết" +msgstr "đường dẫn `%s' không có tất cả các phiên bản cần thiết" -#: builtin/checkout.c:176 +#: builtin/checkout.c:178 #, c-format msgid "path '%s' does not have necessary versions" -msgstr "đường dẫn '%s' không có các phiên bản cần thiết" +msgstr "đường dẫn `%s' không có các phiên bản cần thiết" -#: builtin/checkout.c:193 +#: builtin/checkout.c:195 #, c-format msgid "path '%s': cannot merge" -msgstr "đường dẫn '%s': không thể hòa trộn" +msgstr "đường dẫn `%s': không thể hòa trộn" -#: builtin/checkout.c:210 +#: builtin/checkout.c:212 #, c-format msgid "Unable to add merge result for '%s'" -msgstr "Không thể thêm kết quả hòa trộn cho '%s'" +msgstr "Không thể thêm kết quả hòa trộn cho `%s'" + +#: builtin/checkout.c:236 builtin/checkout.c:239 builtin/checkout.c:242 +#: builtin/checkout.c:245 +#, c-format +msgid "'%s' cannot be used with updating paths" +msgstr "`%s' không thể được sử dụng với các đường dẫn cập nhật" + +#: builtin/checkout.c:248 builtin/checkout.c:251 +#, c-format +msgid "'%s' cannot be used with %s" +msgstr "`%s' không thể được sử dụng với %s" + +#: builtin/checkout.c:254 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "" +"Không thể cập nhật các đường dẫn và chuyển đến nhánh `%s' cùng một lúc." -#: builtin/checkout.c:235 builtin/checkout.c:392 +#: builtin/checkout.c:265 builtin/checkout.c:426 msgid "corrupt index file" msgstr "tập tin ghi bảng mục lục bị hỏng" -#: builtin/checkout.c:265 builtin/checkout.c:272 +#: builtin/checkout.c:295 builtin/checkout.c:302 #, c-format msgid "path '%s' is unmerged" -msgstr "đường dẫn '%s' không được hòa trộn" +msgstr "đường dẫn `%s' không được hòa trộn" -#: builtin/checkout.c:303 builtin/checkout.c:498 builtin/clone.c:586 +#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586 #: builtin/merge.c:811 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" -#: builtin/checkout.c:414 +#: builtin/checkout.c:448 msgid "you need to resolve your current index first" msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã!" -#: builtin/checkout.c:533 +#: builtin/checkout.c:569 #, c-format msgid "Can not do reflog for '%s'\n" -msgstr "Không thể thực hiện reflog cho '%s'\n" +msgstr "Không thể thực hiện reflog cho `%s'\n" -#: builtin/checkout.c:566 +#: builtin/checkout.c:602 msgid "HEAD is now at" msgstr "HEAD hiện giờ tại" -#: builtin/checkout.c:573 +#: builtin/checkout.c:609 #, c-format msgid "Reset branch '%s'\n" -msgstr "Đặt lại nhánh '%s'\n" +msgstr "Đặt lại nhánh `%s'\n" -#: builtin/checkout.c:576 +#: builtin/checkout.c:612 #, c-format msgid "Already on '%s'\n" -msgstr "Đã sẵn sàng trên '%s'\n" +msgstr "Đã sẵn sàng trên `%s'\n" -#: builtin/checkout.c:580 +#: builtin/checkout.c:616 #, c-format msgid "Switched to and reset branch '%s'\n" -msgstr "Đã chuyển tới và reset nhánh '%s'\n" +msgstr "Đã chuyển tới và reset nhánh `%s'\n" -#: builtin/checkout.c:582 +#: builtin/checkout.c:618 #, c-format msgid "Switched to a new branch '%s'\n" -msgstr "Đã chuyển đến nhánh mới '%s'\n" +msgstr "Đã chuyển đến nhánh mới `%s'\n" -#: builtin/checkout.c:584 +#: builtin/checkout.c:620 #, c-format msgid "Switched to branch '%s'\n" -msgstr "Đã chuyển đến nhánh '%s'\n" +msgstr "Đã chuyển đến nhánh `%s'\n" -#: builtin/checkout.c:640 +#: builtin/checkout.c:676 #, c-format msgid " ... and %d more.\n" msgstr " ... và nhiều hơn %d.\n" #. The singular version -#: builtin/checkout.c:646 +#: builtin/checkout.c:682 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2226,7 +2757,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:664 +#: builtin/checkout.c:700 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -2242,92 +2773,153 @@ msgstr "" " git branch tên_nhánh_mới %s\n" "\n" -#: builtin/checkout.c:694 +#: builtin/checkout.c:730 msgid "internal error in revision walk" msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét lại" -#: builtin/checkout.c:698 +#: builtin/checkout.c:734 msgid "Previous HEAD position was" msgstr "Vị trí kế trước của HEAD là" -#: builtin/checkout.c:724 builtin/checkout.c:919 +#: builtin/checkout.c:761 builtin/checkout.c:950 msgid "You are on a branch yet to be born" msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra" #. case (1) -#: builtin/checkout.c:855 +#: builtin/checkout.c:886 #, c-format msgid "invalid reference: %s" msgstr "tham chiếu sai: %s" #. case (1): want a tree -#: builtin/checkout.c:894 +#: builtin/checkout.c:925 #, c-format msgid "reference is not a tree: %s" msgstr "tham chiếu không phải là một cây (tree):%s" -#: builtin/checkout.c:976 -msgid "-B cannot be used with -b" -msgstr "tùy chọn -B không thể dùng -b" +#: builtin/checkout.c:961 +msgid "paths cannot be used with switching branches" +msgstr "các đường dẫn không thể dùng cùng với các nhánh chuyển" -#: builtin/checkout.c:985 -msgid "--patch is incompatible with all other options" -msgstr "--patch xung khắc với tất cả các tùy chọn khác" +#: builtin/checkout.c:964 builtin/checkout.c:968 +#, c-format +msgid "'%s' cannot be used with switching branches" +msgstr "`%s' không thể được sử dụng với các nhánh chuyển" + +#: builtin/checkout.c:972 builtin/checkout.c:975 builtin/checkout.c:980 +#: builtin/checkout.c:983 +#, c-format +msgid "'%s' cannot be used with '%s'" +msgstr "`%s' không thể được sử dụng với `%s'" #: builtin/checkout.c:988 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "--detach không thể được sử dụng với tùy chọn -b/-B/--orphan" +#, c-format +msgid "Cannot switch branch to a non-commit '%s'" +msgstr "Không thể chuyển nhánh đến một non-commit `%s'" -#: builtin/checkout.c:990 -msgid "--detach cannot be used with -t" -msgstr "--detach không thể được sử dụng với tùy chọn -t" +#: builtin/checkout.c:1009 builtin/gc.c:177 +msgid "suppress progress reporting" +msgstr "chặn các báo cáo tiến trình hoạt động" -#: builtin/checkout.c:996 -msgid "--track needs a branch name" -msgstr "--track cần tên một nhánh" +#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89 +#: builtin/remote.c:169 builtin/remote.c:171 +msgid "branch" +msgstr "nhánh" -#: builtin/checkout.c:1003 -msgid "Missing branch name; try -b" -msgstr "Thiếu tên nhánh; hãy thử -b" +#: builtin/checkout.c:1011 +msgid "create and checkout a new branch" +msgstr "tạo và checkout một nhánh mới" -#: builtin/checkout.c:1009 -msgid "--orphan and -b|-B are mutually exclusive" -msgstr "Tùy chọn --orphan và -b|-B loại từ lẫn nhau" +#: builtin/checkout.c:1013 +msgid "create/reset and checkout a branch" +msgstr "create/reset và checkout một nhánh" -#: builtin/checkout.c:1011 -msgid "--orphan cannot be used with -t" -msgstr "--orphan không thể được sử dụng với tùy chọn -t" +#: builtin/checkout.c:1014 +msgid "create reflog for new branch" +msgstr "tạo reflog cho nhánh mới" + +#: builtin/checkout.c:1015 +msgid "detach the HEAD at named commit" +msgstr "rời bỏ HEAD tại lần chuyển giao danh nghĩa" + +#: builtin/checkout.c:1016 +msgid "set upstream info for new branch" +msgstr "đặt thông tin thượng nguồn (upstream) cho nhánh mới" + +#: builtin/checkout.c:1018 +msgid "new branch" +msgstr "nhánh mới" + +#: builtin/checkout.c:1018 +msgid "new unparented branch" +msgstr "nhánh mồ côi mới" + +#: builtin/checkout.c:1019 +msgid "checkout our version for unmerged files" +msgstr "" +"lấy ra (checkout) phiên bản của chúng ta cho các tập tin chưa được hòa trộn" #: builtin/checkout.c:1021 -msgid "git checkout: -f and -m are incompatible" -msgstr "git checkout: hai tùy chọn -f và -m xung khắc nhau" +msgid "checkout their version for unmerged files" +msgstr "" +"lấy ra (checkout) phiên bản của chúng họ cho các tập tin chưa được hòa trộn" + +#: builtin/checkout.c:1023 +msgid "force checkout (throw away local modifications)" +msgstr "ép buộc lấy ra (checkout) (bỏ đi những thay đổi nội bộ)" -#: builtin/checkout.c:1055 +#: builtin/checkout.c:1024 +msgid "perform a 3-way merge with the new branch" +msgstr "thực hiện hòa trộn kiểu 3-way với nhánh mới" + +#: builtin/checkout.c:1025 builtin/merge.c:215 +msgid "update ignored files (default)" +msgstr "cập nhật các tập tin bị bỏ qua (mặc định)" + +#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241 +msgid "style" +msgstr "kiểu" + +#: builtin/checkout.c:1027 +msgid "conflict style (merge or diff3)" +msgstr "xung đột kiểu (hòa trộn hay diff3)" + +#: builtin/checkout.c:1030 +msgid "second guess 'git checkout no-such-branch'" +msgstr "gợi ý thứ hai `git checkout không-nhánh-nào-như-vậy'" + +#: builtin/checkout.c:1054 +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "Tùy chọn -b|-B và --orphan loại từ lẫn nhau" + +#: builtin/checkout.c:1071 +msgid "--track needs a branch name" +msgstr "--track cần tên một nhánh" + +#: builtin/checkout.c:1078 +msgid "Missing branch name; try -b" +msgstr "Thiếu tên nhánh; hãy thử -b" + +#: builtin/checkout.c:1113 msgid "invalid path specification" msgstr "đường dẫn đã cho không hợp lệ" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1120 #, c-format msgid "" -"git checkout: updating paths is incompatible with switching branches.\n" +"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 "" -"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi " -"các nhánh..\n" -"Bạn đã có ý định checkout '%s' cái mà không thể được phân giải như là lần " +"Không thể cập nhật và chuyển thành nhánh `%s' cùng lúc\n" +"Bạn đã có ý định checkout `%s' cái mà không thể được phân giải như là lần " "chuyển giao (commit)?" -#: builtin/checkout.c:1065 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "" -"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi " -"các nhánh." - -#: builtin/checkout.c:1070 -msgid "git checkout: --detach does not take a path argument" -msgstr "git checkout: --detach không nhận một đối số là đường dẫn" +#: builtin/checkout.c:1125 +#, c-format +msgid "git checkout: --detach does not take a path argument '%s'" +msgstr "git checkout: --detach không nhận một đối số đường dẫn `%s'" -#: builtin/checkout.c:1073 +#: builtin/checkout.c:1129 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -2335,13 +2927,38 @@ msgstr "" "git checkout: --ours/--theirs, --force và --merge là xung khắc với nhau khi\n" "checkout bảng mục lục (index)." -#: builtin/checkout.c:1092 -msgid "Cannot switch branch to a non-commit." -msgstr "Không thể chuyển đến một non-commit." +#: builtin/clean.c:19 +msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +msgstr "git clean [-d] [-f] [-n] [-q] [-e <mẫu>] [-x | -X] [--] <đường-dẫn>..." + +#: builtin/clean.c:51 +msgid "do not print names of files removed" +msgstr "không hiển thị tên của các tập tin đã gỡ bỏ" -#: builtin/checkout.c:1095 -msgid "--ours/--theirs is incompatible with switching branches." -msgstr "--ours/--theirs là xung khắc nhau khi chuyển đổi các nhánh." +#: builtin/clean.c:53 +msgid "force" +msgstr "ép buộc" + +#: builtin/clean.c:55 +msgid "remove whole directories" +msgstr "gỡ bỏ toàn bộ thư mục" + +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:803 +#: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 +msgid "pattern" +msgstr "mẫu" + +#: builtin/clean.c:57 +msgid "add <pattern> to ignore rules" +msgstr "thêm <mẫu> vào trong qui tắc bỏ qua" + +#: builtin/clean.c:58 +msgid "remove ignored files, too" +msgstr "đồng thời gỡ bỏ cả các tập tin bị bỏ qua" + +#: builtin/clean.c:60 +msgid "remove only ignored files" +msgstr "chỉ gỡ bỏ những tập tin bị bỏ qua" #: builtin/clean.c:78 msgid "-x and -X cannot be used together" @@ -2387,10 +3004,103 @@ msgstr "Không thể gỡ bỏ %s\n" msgid "Not removing %s\n" msgstr "Không xóa %s\n" +#: builtin/clone.c:36 +msgid "git clone [options] [--] <repo> [<dir>]" +msgstr "git clone [các-tùy-chọn] [--] <kho> [<t.mục>]" + +#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212 +#: builtin/push.c:399 +msgid "force progress reporting" +msgstr "ép buộc báo cáo tiến trình" + +#: builtin/clone.c:66 +msgid "don't create a checkout" +msgstr "không tạo một checkout" + +#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488 +msgid "create a bare repository" +msgstr "tạo kho chứa bare" + +#: builtin/clone.c:72 +msgid "create a mirror repository (implies bare)" +msgstr "tạo kho bản sao (mirror) (ngụ ý là bare)" + +#: builtin/clone.c:74 +msgid "to clone from a local repository" +msgstr "để nhân bản từ kho nội bộ" + +#: builtin/clone.c:76 +msgid "don't use local hardlinks, always copy" +msgstr "không sử dụng liên kết cứng nội bộ, luôn sao chép" + +#: builtin/clone.c:78 +msgid "setup as shared repository" +msgstr "cài đặt đây là kho chia sẻ" + +#: builtin/clone.c:80 builtin/clone.c:82 +msgid "initialize submodules in the clone" +msgstr "khởi tạo mô-đun-con trong bản sao" + +#: builtin/clone.c:83 builtin/init-db.c:485 +msgid "template-directory" +msgstr "thư-mục-tạm" + +#: builtin/clone.c:84 builtin/init-db.c:486 +msgid "directory from which templates will be used" +msgstr "thư mục mà tại đó các mẫu sẽ được dùng" + +#: builtin/clone.c:86 +msgid "reference repository" +msgstr "kho tham chiếu" + +#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +msgid "name" +msgstr "tên" + +#: builtin/clone.c:88 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "dùng <tên> thay vì `origin' để theo dõi thượng nguồn (uptream)" + +#: builtin/clone.c:90 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "lấy ra nhánh (checkout <nhánh>) thay vì HEAD của máy chủ" + +#: builtin/clone.c:92 +msgid "path to git-upload-pack on the remote" +msgstr "đường dẫn đến git-upload-pack trên máy chủ" + +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 +msgid "depth" +msgstr "độ sâu" + +#: builtin/clone.c:94 +msgid "create a shallow clone of that depth" +msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho" + +#: builtin/clone.c:96 +msgid "clone only one branch, HEAD or --branch" +msgstr "nhân bản (clone) chỉ một nhánh, HEAD hoặc --branch" + +#: builtin/clone.c:97 builtin/init-db.c:494 +msgid "gitdir" +msgstr "gitdir" + +#: builtin/clone.c:98 builtin/init-db.c:495 +msgid "separate git dir from working tree" +msgstr "không dùng chung thư mục dành riêng cho git và thư mục làm việc" + +#: builtin/clone.c:99 +msgid "key=value" +msgstr "khóa=giá trị" + +#: builtin/clone.c:100 +msgid "set config inside the new repository" +msgstr "đặt cấu hình bên trong một kho chứa mới" + #: builtin/clone.c:243 #, c-format msgid "reference repository '%s' is not a local directory." -msgstr "kho tham chiếu '%s' không phải là một thư mục nội bộ." +msgstr "kho tham chiếu `%s' không phải là một thư mục nội bộ." #: builtin/clone.c:306 #, c-format @@ -2400,7 +3110,7 @@ msgstr "tạo thư mục \"%s\" gặp lỗi" #: builtin/clone.c:308 builtin/diff.c:77 #, c-format msgid "failed to stat '%s'" -msgstr "gặp lỗi stat (lấy trạng thái về) '%s'" +msgstr "gặp lỗi stat (lấy trạng thái về) `%s'" #: builtin/clone.c:310 #, c-format @@ -2420,7 +3130,7 @@ msgstr "gặp lỗi khi tạo được liên kết mềm %s" #: builtin/clone.c:350 #, c-format msgid "failed to copy file to '%s'" -msgstr "gặp lỗi khi chép tập tin tới '%s'" +msgstr "gặp lỗi khi chép tập tin tới `%s'" #: builtin/clone.c:373 #, c-format @@ -2436,77 +3146,113 @@ msgstr "Không tìm thấy nhánh máy chủ %s để nhân bản (clone)." msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "refers HEAD máy chủ chỉ đến ref không tồn tại, không thể checkout.\n" -#: builtin/clone.c:642 +#: builtin/clone.c:690 msgid "Too many arguments." msgstr "Có quá nhiều đối số." -#: builtin/clone.c:646 +#: builtin/clone.c:694 msgid "You must specify a repository to clone." msgstr "Bạn phải chỉ định một kho để mà nhân bản (clone)." -#: builtin/clone.c:657 +#: builtin/clone.c:705 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "tùy chọn --bare và --origin %s xung khắc nhau." -#: builtin/clone.c:671 +#: builtin/clone.c:719 #, c-format msgid "repository '%s' does not exist" -msgstr "kho chứa '%s' chưa tồn tại" +msgstr "kho chứa `%s' chưa tồn tại" -#: builtin/clone.c:676 +#: builtin/clone.c:724 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay thế." -#: builtin/clone.c:686 +#: builtin/clone.c:734 #, c-format msgid "destination path '%s' already exists and is not an empty directory." -msgstr "đường dẫn đích '%s' đã có từ trước và không phải là một thư mục rỗng." +msgstr "đường dẫn đích `%s' đã có từ trước và không phải là một thư mục rỗng." -#: builtin/clone.c:696 +#: builtin/clone.c:744 #, c-format msgid "working tree '%s' already exists." -msgstr "cây làm việc '%s' đã sẵn tồn tại rồi." +msgstr "cây làm việc `%s' đã sẵn tồn tại rồi." -#: builtin/clone.c:709 builtin/clone.c:723 +#: builtin/clone.c:757 builtin/clone.c:771 #, c-format msgid "could not create leading directories of '%s'" -msgstr "không thể tạo các thư mục dẫn đầu của '%s'" +msgstr "không thể tạo các thư mục dẫn đầu của `%s'" -#: builtin/clone.c:712 +#: builtin/clone.c:760 #, c-format msgid "could not create work tree dir '%s'." -msgstr "không thể tạo cây thư mục làm việc dir '%s'." +msgstr "không thể tạo cây thư mục làm việc dir `%s'." -#: builtin/clone.c:731 +#: builtin/clone.c:779 #, c-format msgid "Cloning into bare repository '%s'...\n" -msgstr "Đang nhân bản thành kho chứa bare '%s'...\n" +msgstr "Đang nhân bản thành kho chứa bare `%s'...\n" -#: builtin/clone.c:733 +#: builtin/clone.c:781 #, c-format msgid "Cloning into '%s'...\n" -msgstr "Đang nhân bản thành '%s'...\n" +msgstr "Đang nhân bản thành `%s'...\n" -#: builtin/clone.c:789 +#: builtin/clone.c:823 #, c-format msgid "Don't know how to clone %s" msgstr "Không biết làm cách nào để nhân bản (clone) %s" -#: builtin/clone.c:838 +#: builtin/clone.c:872 #, c-format msgid "Remote branch %s not found in upstream %s" -msgstr "Nhánh máy chủ %s không tìm thấy trong dòng ngược (upstream) %s" +msgstr "Nhánh máy chủ %s không tìm thấy trong thượng nguồn (upstream) %s" -#: builtin/clone.c:845 +#: builtin/clone.c:879 msgid "You appear to have cloned an empty repository." msgstr "Bạn hình như là đã nhân bản một kho trống rỗng." +#: builtin/column.c:9 +msgid "git column [options]" +msgstr "git column [các-tùy-chọn]" + +#: builtin/column.c:26 +msgid "lookup config vars" +msgstr "tìm kiếm biến cấu hình" + +#: builtin/column.c:27 builtin/column.c:28 +msgid "layout to use" +msgstr "bố cục để dùng" + +#: builtin/column.c:29 +msgid "Maximum width" +msgstr "Độ rộng tối đa" + +#: builtin/column.c:30 +msgid "Padding space on left border" +msgstr "Chèn thêm khoảng trống vào bờ bên trái" + +#: builtin/column.c:31 +msgid "Padding space on right border" +msgstr "Chèn thêm khoảng trắng vào tiếp giáp bên phải" + +#: builtin/column.c:32 +msgid "Padding space between columns" +msgstr "Chèn thêm khoảng trắng giữa các cột" + #: builtin/column.c:51 msgid "--command must be the first argument" msgstr "--command phải là đối số đầu tiên" -#: builtin/commit.c:43 +#: builtin/commit.c:34 +msgid "git commit [options] [--] <filepattern>..." +msgstr "git commit [các-tùy-chọn] [--] <mẫu-tập-tin>..." + +#: builtin/commit.c:39 +msgid "git status [options] [--] <filepattern>..." +msgstr "git status [các-tùy-chọn] [--] <mẫu-tập-tin>..." + +#: builtin/commit.c:44 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -2534,7 +3280,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:55 +#: builtin/commit.c:56 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -2547,7 +3293,7 @@ msgstr "" "hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n" "\"git reset HEAD^\".\n" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -2562,99 +3308,99 @@ msgstr "" "\n" " git commit --allow-empty\n" "\n" -"Nếu không, hãy thử dùng 'git reset'\n" +"Nếu không, hãy thử dùng `git reset'\n" -#: builtin/commit.c:256 +#: builtin/commit.c:257 msgid "failed to unpack HEAD tree object" msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây" -#: builtin/commit.c:298 +#: builtin/commit.c:299 msgid "unable to create temporary index" msgstr "không thể tạo bảng mục lục tạm thời" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "interactive add failed" msgstr "việc thêm tương tác gặp lỗi" -#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408 +#: builtin/commit.c:338 builtin/commit.c:359 builtin/commit.c:409 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 (new_index)" -#: builtin/commit.c:389 +#: builtin/commit.c:390 msgid "cannot do a partial commit during a merge." msgstr "" "không thể thực hiện việc chuyển giao (commit) cục bộ trong khi đang được hòa " "trộn." -#: builtin/commit.c:391 +#: builtin/commit.c:392 msgid "cannot do a partial commit during a cherry-pick." msgstr "" "không thể thực hiện việc chuyển giao (commit) bộ phận trong khi đang cherry-" "pick." -#: builtin/commit.c:401 +#: builtin/commit.c:402 msgid "cannot read the index" msgstr "không đọc được bảng mục lục" -#: builtin/commit.c:421 +#: builtin/commit.c:422 msgid "unable to write temporary index file" msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời" -#: builtin/commit.c:496 builtin/commit.c:502 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "lần chuyển giao (commit) không hợp lệ: %s" -#: builtin/commit.c:525 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "đối số --author bị dị hình" -#: builtin/commit.c:585 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" -msgstr "Chuỗi thụt lề đầu dòng dị hình: '%s'" +msgstr "Chuỗi thụt lề đầu dòng dị hình: `%s'" -#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970 +#: builtin/commit.c:596 builtin/commit.c:629 builtin/commit.c:952 #, c-format msgid "could not lookup commit %s" msgstr "không thể tìm kiếm commit (lần chuyển giao) %s" -#: builtin/commit.c:635 builtin/shortlog.c:296 +#: builtin/commit.c:608 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n" -#: builtin/commit.c:637 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "không thể đọc nhật ký từ đầu vào tiêu chuẩn" -#: builtin/commit.c:641 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" -msgstr "không đọc được tệp nhật ký '%s'" +msgstr "không đọc được tệp nhật ký `%s'" -#: builtin/commit.c:647 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "lần chuyển giao (commit) có ghi chú trống rỗng" -#: builtin/commit.c:663 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "không thể đọc MERGE_MSG" -#: builtin/commit.c:667 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "không thể đọc SQUASH_MSG" -#: builtin/commit.c:671 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" -msgstr "Không thể đọc '%s'." +msgstr "Không thể đọc `%s'." -#: builtin/commit.c:723 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "không thể ghi mẫu commit" -#: builtin/commit.c:734 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -2669,7 +3415,7 @@ msgstr "" "\t%s\n" "và thử lại.\n" -#: builtin/commit.c:739 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -2684,17 +3430,17 @@ msgstr "" "\t%s\n" "và thử lại.\n" -#: builtin/commit.c:751 +#: builtin/commit.c:733 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" "Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng " "được\n" -"bắt đầu bằng '#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm hủy bỏ " +"bắt đầu bằng `#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm hủy bỏ " "lần chuyển giao (commit).\n" -#: builtin/commit.c:756 +#: builtin/commit.c:738 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" @@ -2702,173 +3448,367 @@ msgid "" msgstr "" "Hãy nhập vào các thông tin để giải thích các thay đổi của bạn.Những dòng " "được\n" -"bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n" +"bắt đầu bằng `#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n" "Phần chú thích này nếu rỗng sẽ làm hủy bỏ lần chuyển giao (commit).\n" -#: builtin/commit.c:769 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "%sTác giả: %s" -#: builtin/commit.c:776 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "%sNgười chuyển giao (commit): %s" -#: builtin/commit.c:796 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "không đọc được bảng mục lục" -#: builtin/commit.c:833 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "Gặp lỗi khi xây dựng cây" -#: builtin/commit.c:848 builtin/tag.c:361 +#: builtin/commit.c:830 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Xin hãy áp dụng thông điệp sử dụng hoặc là tùy chọn -m hoặc là -F.\n" -#: builtin/commit.c:945 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" -msgstr "Không tìm thấy tác giả có sẵn với '%s'" +msgstr "Không tìm thấy tác giả có sẵn với `%s'" -#: builtin/commit.c:960 builtin/commit.c:1160 +#: builtin/commit.c:942 builtin/commit.c:1142 #, c-format msgid "Invalid untracked files mode '%s'" -msgstr "Chế độ cho các tập tin không bị theo vết không hợp lệ '%s'" +msgstr "Chế độ cho các tập tin không bị theo vết không hợp lệ `%s'" -#: builtin/commit.c:1000 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "Sử dụng cả hai tùy chọn --reset-author và --author không hợp lý" -#: builtin/commit.c:1011 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "Không có gì để amend (tu bổ) cả." -#: builtin/commit.c:1014 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "" "Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện amend (tu bổ)." -#: builtin/commit.c:1016 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" "Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện amend (tu " "bổ)." -#: builtin/commit.c:1019 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "Các tùy chọn --squash và --fixup không thể sử dụng cùng với nhau" -#: builtin/commit.c:1029 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Chỉ một tùy chọn trong số -c/-C/-F/--fixup được sử dụng" -#: builtin/commit.c:1031 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Tùy chọn -m không thể được tổ hợp cùng với -c/-C/-F/--fixup." -#: builtin/commit.c:1039 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" "--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend." -#: builtin/commit.c:1056 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được " "sử dụng." -#: builtin/commit.c:1058 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "Không đường dẫn với các tùy chọn --include/--only không hợp lý." -#: builtin/commit.c:1060 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "Giỏi... tu bổ cái cuối với bảng mục lục phi nghĩa." -#: builtin/commit.c:1062 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; đang " "giả định --only những-đường-dẫn..." -#: builtin/commit.c:1072 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "Chế độ dọn dẹp không hợp lệ %s" -#: builtin/commit.c:1077 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "Các đường dẫn với tùy chọn -a không hợp lý." -#: builtin/commit.c:1260 +#: builtin/commit.c:1156 builtin/commit.c:1384 +msgid "show status concisely" +msgstr "hiển thị trạng thái ở dạng súc tích" + +#: builtin/commit.c:1158 builtin/commit.c:1386 +msgid "show branch information" +msgstr "hiển thị thông tin nhánh" + +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 +msgid "machine-readable output" +msgstr "kết xuất dạng máy-có-thể-đọc" + +#: builtin/commit.c:1163 builtin/commit.c:1390 +msgid "terminate entries with NUL" +msgstr "chấm dứt các mục bằng NUL" + +#: builtin/commit.c:1165 builtin/commit.c:1393 builtin/fast-export.c:636 +#: builtin/fast-export.c:639 builtin/tag.c:461 +msgid "mode" +msgstr "chế độ" + +#: builtin/commit.c:1166 builtin/commit.c:1393 +msgid "show untracked files, optional modes: all, normal, no. (Default: all)" +msgstr "" +"hiển thị các tập tin chưa được theo dõi dấu vết, các chế độ tùy chọn: all, " +"normal, no. (Mặc định: all)" + +#: builtin/commit.c:1169 +msgid "show ignored files" +msgstr "hiển thị các tập tin ẩn" + +#: builtin/commit.c:1170 parse-options.h:151 +msgid "when" +msgstr "khi" + +#: builtin/commit.c:1171 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "" +"bỏ qua các thay đổi trong mô-đun con, tùy chọn khi: all, dirty, untracked. " +"(Mặc định: all)" + +#: builtin/commit.c:1173 +msgid "list untracked files in columns" +msgstr "hiển thị danh sách các tập-tin chưa được theo dõi trong các cột" + +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "không thể tìm thấy lần chuyển giao (commit) mới hơn đã được tạo" -#: builtin/commit.c:1262 +#: builtin/commit.c:1244 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" -#: builtin/commit.c:1303 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "đã rời khỏi HEAD" -#: builtin/commit.c:1305 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr " (root-commit)" -#: builtin/commit.c:1449 +#: builtin/commit.c:1354 +msgid "suppress summary after successful commit" +msgstr "không hiển thị tổng kết sau khi chuyển giao thành công" + +#: builtin/commit.c:1355 +msgid "show diff in commit message template" +msgstr "hiển thị sự khác biệt trong mẫu tin nhắn chuyển giao" + +#: builtin/commit.c:1357 +msgid "Commit message options" +msgstr "Các tùy chọn ghi chú commit" + +#: builtin/commit.c:1358 builtin/tag.c:459 +msgid "read message from file" +msgstr "đọc chú thích từ tập tin" + +#: builtin/commit.c:1359 +msgid "author" +msgstr "tác giả" + +#: builtin/commit.c:1359 +msgid "override author for commit" +msgstr "ghi đè tác giả cho commit" + +#: builtin/commit.c:1360 builtin/gc.c:178 +msgid "date" +msgstr "ngày tháng" + +#: builtin/commit.c:1360 +msgid "override date for commit" +msgstr "ghi đè ngày tháng cho commit" + +#: builtin/commit.c:1361 builtin/merge.c:206 builtin/notes.c:537 +#: builtin/notes.c:694 builtin/tag.c:457 +msgid "message" +msgstr "thông điệp" + +#: builtin/commit.c:1361 +msgid "commit message" +msgstr "chú thích của lần commit" + +#: builtin/commit.c:1362 +msgid "reuse and edit message from specified commit" +msgstr "" +"dùng lại các ghi chú từ lần chuyển giao (commit) đã cho nhưng có cho sửa chữa" + +#: builtin/commit.c:1363 +msgid "reuse message from specified commit" +msgstr "dùng lại các ghi chú từ lần chuyển giao (commit) đã cho" + +#: builtin/commit.c:1364 +msgid "use autosquash formatted message to fixup specified commit" +msgstr "" +"dùng ghi chú có định dạng autosquash để sửa chữa lần chuyển giao đã chỉ ra" + +#: builtin/commit.c:1365 +msgid "use autosquash formatted message to squash specified commit" +msgstr "" +"dùng lời nhắn có định dạng tự động nén để nén lại các lần chuyển giao đã chỉ " +"ra" + +#: builtin/commit.c:1366 +msgid "the commit is authored by me now (used with -C/-c/--amend)" +msgstr "" +"lần chuyển giao nhận tôi là tác giả (được dùng với tùy chọn -C/-c/--amend)" + +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 +msgid "add Signed-off-by:" +msgstr "thêm dòng Signed-off-by:" + +#: builtin/commit.c:1368 +msgid "use specified template file" +msgstr "sử dụng tập tin mẫu đã cho" + +#: builtin/commit.c:1369 +msgid "force edit of commit" +msgstr "ép buộc sửa lần commit" + +#: builtin/commit.c:1370 +msgid "default" +msgstr "mặc định" + +#: builtin/commit.c:1370 builtin/tag.c:462 +msgid "how to strip spaces and #comments from message" +msgstr "làm thế nào để cắt bỏ khoảng trắng và #ghichú từ mẩu tin nhắn" + +#: builtin/commit.c:1371 +msgid "include status in commit message template" +msgstr "bao gồm các trạng thái ghi mẫu ghi chú chuyển giao (commit)" + +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 +msgid "key id" +msgstr "id khóa" + +#: builtin/commit.c:1373 builtin/merge.c:214 +msgid "GPG sign commit" +msgstr "ký lần commit dùng GPG" + +#. end commit message options +#: builtin/commit.c:1376 +msgid "Commit contents options" +msgstr "Các tùy nội dung ghi chú commit" + +#: builtin/commit.c:1377 +msgid "commit all changed files" +msgstr "chuyển giao tất cả các tập tin có thay đổi" + +#: builtin/commit.c:1378 +msgid "add specified files to index for commit" +msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục để chuyển giao (commit)" + +#: builtin/commit.c:1379 +msgid "interactively add files" +msgstr "thêm các tập-tin bằng tương tác" + +#: builtin/commit.c:1380 +msgid "interactively add changes" +msgstr "thêm các thay đổi bằng tương tác" + +#: builtin/commit.c:1381 +msgid "commit only specified files" +msgstr "chỉ chuyển giao các tập tin đã chỉ ra" + +#: builtin/commit.c:1382 +msgid "bypass pre-commit hook" +msgstr "vòng qua móc (hook) pre-commit" + +#: builtin/commit.c:1383 +msgid "show what would be committed" +msgstr "hiển thị xem cái gì có thể được chuyển giao" + +#: builtin/commit.c:1391 +msgid "amend previous commit" +msgstr "tu bổ (amend) lần commit trước" + +#: builtin/commit.c:1392 +msgid "bypass post-rewrite hook" +msgstr "vòng qua móc (hook) post-rewrite" + +#: builtin/commit.c:1397 +msgid "ok to record an empty change" +msgstr "ok để ghi lại một thay đổi trống rỗng" + +#: builtin/commit.c:1400 +msgid "ok to record a change with an empty message" +msgstr "ok để ghi các thay đổi với lời nhắn trống rỗng" + +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "không thể phân tích commit (lần chuyển giao) HEAD" -#: builtin/commit.c:1487 builtin/merge.c:508 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" -msgstr "không thể mở %s' để đọc" +msgstr "không thể mở `%s' để đọc" -#: builtin/commit.c:1494 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Tập tin MERGE_HEAD sai hỏng (%s)" -#: builtin/commit.c:1501 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "không thể đọc MERGE_MODE" -#: builtin/commit.c:1520 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "không thể đọc thông điệp (message) commit (lần chuyển giao): %s" -#: builtin/commit.c:1534 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" "Đang bỏ qua việc chuyển giao (commit); bạn đã không biên soạn thông điệp " "(message).\n" -#: builtin/commit.c:1539 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" "Đang bỏ qua lần chuyển giao (commit) bởi vì thông điệp của nó trống rỗng.\n" -#: builtin/commit.c:1554 builtin/merge.c:935 builtin/merge.c:960 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "gặp lỗi khi ghi đối tượng chuyển giao (commit)" -#: builtin/commit.c:1575 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "không thể khóa HEAD ref (tham chiếu)" -#: builtin/commit.c:1579 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "không thể cập nhật ref (tham chiếu) HEAD" -#: builtin/commit.c:1590 +#: builtin/commit.c:1573 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -2879,6 +3819,134 @@ msgstr "" "hay quota (hạn nghạch đĩa cứng) bị vượt quá, và sau đó \"git reset HEAD\" để " "khắc phục." +#: builtin/config.c:7 +msgid "git config [options]" +msgstr "git config [các-tùy-chọn]" + +#: builtin/config.c:52 +msgid "Config file location" +msgstr "Vị trí tập tin cấu hình" + +#: builtin/config.c:53 +msgid "use global config file" +msgstr "đặt tập tin cấu hình cần toàn cục" + +#: builtin/config.c:54 +msgid "use system config file" +msgstr "sử dụng tập tin cấu hình hệ thống" + +#: builtin/config.c:55 +msgid "use repository config file" +msgstr "dùng tập tin cấu hình của kho" + +#: builtin/config.c:56 +msgid "use given config file" +msgstr "sử dụng tập tin cấu hình đã cho" + +#: builtin/config.c:57 +msgid "Action" +msgstr "Hành động" + +#: builtin/config.c:58 +msgid "get value: name [value-regex]" +msgstr "lấy giá-trị: tên [value-regex]" + +#: builtin/config.c:59 +msgid "get all values: key [value-regex]" +msgstr "lấy tất cả giá-trị: khóa [value-regex]" + +#: builtin/config.c:60 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "lấy giá trị cho regexp: name-regex [value-regex]" + +#: builtin/config.c:61 +msgid "replace all matching variables: name value [value_regex]" +msgstr "thay thế tất cả các biến khớp mẫu: tên giá-trị [value_regex]" + +#: builtin/config.c:62 +msgid "add a new variable: name value" +msgstr "thêm biến mới: tên giá-trị" + +#: builtin/config.c:63 +msgid "remove a variable: name [value-regex]" +msgstr "gỡ bỏ biến: tên [value-regex]" + +#: builtin/config.c:64 +msgid "remove all matches: name [value-regex]" +msgstr "gỡ bỏ mọi cái khớp: tên [value-regex]" + +#: builtin/config.c:65 +msgid "rename section: old-name new-name" +msgstr "đổi tên chương: tên-cũ tên-mới" + +#: builtin/config.c:66 +msgid "remove a section: name" +msgstr "gỡ bỏ chương: tên" + +#: builtin/config.c:67 +msgid "list all" +msgstr "liệt kê tất" + +#: builtin/config.c:68 +msgid "open an editor" +msgstr "mở một trình biên soạn" + +#: builtin/config.c:69 builtin/config.c:70 +msgid "slot" +msgstr "khe" + +#: builtin/config.c:69 +msgid "find the color configured: [default]" +msgstr "tìm cấu hình màu sắc: [mặc định]" + +#: builtin/config.c:70 +msgid "find the color setting: [stdout-is-tty]" +msgstr "tìm các cài đặt về màu sắc: [stdout-là-tty]" + +#: builtin/config.c:71 +msgid "Type" +msgstr "Kiểu" + +#: builtin/config.c:72 +msgid "value is \"true\" or \"false\"" +msgstr "giá trị là \"true\" hoặc \"false\"" + +#: builtin/config.c:73 +msgid "value is decimal number" +msgstr "giá trị ở dạng số thập phân" + +#: builtin/config.c:74 +msgid "value is --bool or --int" +msgstr "giá trị là --bool hoặc --int" + +#: builtin/config.c:75 +msgid "value is a path (file or directory name)" +msgstr "giá trị là đường dẫn (tên tập tin hay thư mục)" + +#: builtin/config.c:76 +msgid "Other" +msgstr "Khác" + +#: builtin/config.c:77 +msgid "terminate values with NUL byte" +msgstr "chấm dứt giá trị với byte NUL" + +#: builtin/config.c:78 +msgid "respect include directives on lookup" +msgstr "tôn trọng kể cà các hướng trong tìm kiếm" + +#: builtin/count-objects.c:69 +msgid "git count-objects [-v]" +msgstr "git count-objects [-v]" + +#: builtin/describe.c:15 +msgid "git describe [options] <committish>*" +msgstr "git describe [các-tùy-chọn] <committish>*" + +#: builtin/describe.c:16 +msgid "git describe [options] --dirty" +msgstr "git describe [các-tùy-chọn] --dirty" + #: builtin/describe.c:234 #, c-format msgid "annotated tag %s not available" @@ -2892,7 +3960,7 @@ msgstr "thẻ được chú giải %s không có tên nhúng" #: builtin/describe.c:240 #, c-format msgid "tag '%s' is really '%s' here" -msgstr "thẻ '%s' đã thực sự ở đây '%s' rồi" +msgstr "thẻ `%s' đã thực sự ở đây `%s' rồi" #: builtin/describe.c:267 #, c-format @@ -2902,12 +3970,12 @@ msgstr "Không phải tên đối tượng %s hợp lệ" #: builtin/describe.c:270 #, 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ệ" +msgstr "%s không phải là một đối tượng `%s' hợp lệ" #: builtin/describe.c:287 #, c-format msgid "no tag exactly matches '%s'" -msgstr "không có thẻ nào khớp chính xác với '%s'" +msgstr "không có thẻ nào khớp chính xác với `%s'" #: builtin/describe.c:289 #, c-format @@ -2925,7 +3993,7 @@ msgid "" "No annotated tags can describe '%s'.\n" "However, there were unannotated tags: try --tags." msgstr "" -"Không có thẻ được chú giải nào được mô tả là '%s'.\n" +"Không có thẻ được chú giải nào được mô tả là `%s'.\n" "Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags." #: builtin/describe.c:357 @@ -2934,7 +4002,7 @@ msgid "" "No tags can describe '%s'.\n" "Try --always, or create some tags." msgstr "" -"Không có thẻ (tag) có thể mô tả '%s'.\n" +"Không có thẻ (tag) có thể mô tả `%s'.\n" "Hãy thử --always, hoặt tạo một số thẻ." #: builtin/describe.c:378 @@ -2951,6 +4019,50 @@ msgstr "" "tìm thấy nhiều hơn %i thẻ (tag); đã liệt kê %i gần đây nhất\n" "bỏ đi tìm kiếm tại %s\n" +#: builtin/describe.c:403 +msgid "find the tag that comes after the commit" +msgstr "tìm các thẻ mà nó đến trước lần chuyển giao" + +#: builtin/describe.c:404 +msgid "debug search strategy on stderr" +msgstr "chiến lược tìm kiếm trên đầu ra lỗi chuẩn stderr" + +#: builtin/describe.c:405 +msgid "use any ref in .git/refs" +msgstr "sử dụng bất kỳ ref nào trong .git/refs" + +#: builtin/describe.c:406 +msgid "use any tag in .git/refs/tags" +msgstr "sử dụng bất kỳ thẻ nào trong .git/refs/tags" + +#: builtin/describe.c:407 +msgid "always use long format" +msgstr "luôn dùng định dạng dài" + +#: builtin/describe.c:410 +msgid "only output exact matches" +msgstr "chỉ xuất những gì khớp chính xác" + +#: builtin/describe.c:412 +msgid "consider <n> most recent tags (default: 10)" +msgstr "coi như <n> thẻ gần đây nhất (mặc định: 10)" + +#: builtin/describe.c:414 +msgid "only consider tags matching <pattern>" +msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>" + +#: builtin/describe.c:416 builtin/name-rev.c:238 +msgid "show abbreviated commit object as fallback" +msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback" + +#: builtin/describe.c:417 +msgid "mark" +msgstr "dấu" + +#: builtin/describe.c:418 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "thêm <dấu> trên cây thư mục làm việc bẩn (mặc định \"-dirty\")" + #: builtin/describe.c:436 msgid "--long is incompatible with --abbrev=0" msgstr "--long là xung khắc với tùy chọn --abbrev=0" @@ -2966,7 +4078,7 @@ msgstr "--dirty là xung khắc với các tùy chọn dành cho chuyển giao ( #: builtin/diff.c:79 #, c-format msgid "'%s': not a regular file or symlink" -msgstr "'%s': không phải tập tin bình thường hay liên kết tượng trưng" +msgstr "`%s': không phải tập tin bình thường hay liên kết tượng trưng" #: builtin/diff.c:224 #, c-format @@ -2980,28 +4092,150 @@ msgstr "Không phải là kho git" #: builtin/diff.c:344 #, c-format msgid "invalid object '%s' given." -msgstr "đối tượng đã cho '%s' không hợp lệ." +msgstr "đối tượng đã cho `%s' không hợp lệ." #: builtin/diff.c:349 #, c-format msgid "more than %d trees given: '%s'" -msgstr "đã chỉ ra nhiều hơn %d cây (tree): '%s'" +msgstr "đã chỉ ra nhiều hơn %d cây (tree): `%s'" #: builtin/diff.c:359 #, c-format msgid "more than two blobs given: '%s'" -msgstr "đã cho nhiều hơn hai đối tượng blob: '%s'" +msgstr "đã cho nhiều hơn hai đối tượng blob: `%s'" #: builtin/diff.c:367 #, c-format msgid "unhandled object '%s' given." -msgstr "đã cho đối tượng không thể nắm giữ '%s'." +msgstr "đã cho đối tượng không thể nắm giữ `%s'." + +#: builtin/fast-export.c:22 +msgid "git fast-export [rev-list-opts]" +msgstr "git fast-export [rev-list-opts]" + +#: builtin/fast-export.c:635 +msgid "show progress after <n> objects" +msgstr "hiển thị tiến triển sau <n> đối tượng" + +#: builtin/fast-export.c:637 +msgid "select handling of signed tags" +msgstr "chọn điều khiển của thẻ đã ký" + +#: builtin/fast-export.c:640 +msgid "select handling of tags that tag filtered objects" +msgstr "chọn sự xử lý của các thẻ, cái mà đánh thẻ các đối tượng được lọc ra" + +#: builtin/fast-export.c:643 +msgid "Dump marks to this file" +msgstr "Đổ các đánh dấu này vào tập-tin" + +#: builtin/fast-export.c:645 +msgid "Import marks from this file" +msgstr "nhập vào đánh dấu từ tập tin này" + +#: builtin/fast-export.c:647 +msgid "Fake a tagger when tags lack one" +msgstr "Làm giả một cái thẻ khi thẻ bị thiếu một cái" + +#: builtin/fast-export.c:649 +msgid "Output full tree for each commit" +msgstr "Xuất ra toàn bộ cây cho mỗi lần chuyển giao" + +#: builtin/fast-export.c:651 +msgid "Use the done feature to terminate the stream" +msgstr "Sử dụng tính năng done để chấm dứt luồng dữ liệu" + +#: builtin/fast-export.c:652 +msgid "Skip output of blob data" +msgstr "Bỏ qua kết xuất của dữ liệu blob" + +#: builtin/fetch.c:20 +msgid "git fetch [<options>] [<repository> [<refspec>...]]" +msgstr "git fetch [<các-tùy-chọn>] [<kho-chứa> [<refspec>...]]" + +#: builtin/fetch.c:21 +msgid "git fetch [<options>] <group>" +msgstr "git fetch [<các-tùy-chọn>] [<nhóm>" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" +msgstr "git fetch --multiple [<các-tùy-chọn>] [(<kho> | <nhóm>)...]" + +#: builtin/fetch.c:23 +msgid "git fetch --all [<options>]" +msgstr "git fetch --all [<các-tùy-chọn>]" + +#: builtin/fetch.c:60 +msgid "fetch from all remotes" +msgstr "fetch từ tất cả các máy chủ" + +#: builtin/fetch.c:62 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "nối thêm vào .git/FETCH_HEAD thay vì ghi đè lên nó" + +#: builtin/fetch.c:64 +msgid "path to upload pack on remote end" +msgstr "đường dẫn đến gói (pack) tải lên trên máy chủ cuối" + +#: builtin/fetch.c:65 +msgid "force overwrite of local branch" +msgstr "ép buộc ghi đè lên nhánh nội bộ" + +#: builtin/fetch.c:67 +msgid "fetch from multiple remotes" +msgstr "fetch từ nhiều máy chủ cùng lúc" + +#: builtin/fetch.c:69 +msgid "fetch all tags and associated objects" +msgstr "lấy (fetch) tất cả các thẻ cùng với các đối tượng liên quan đến nó" + +#: builtin/fetch.c:71 +msgid "do not fetch all tags (--no-tags)" +msgstr "không lấy (fetch) tất cả các thẻ (--no-tags)" + +#: builtin/fetch.c:73 +msgid "prune remote-tracking branches no longer on remote" +msgstr "" +"cắt cụt (prune) các nhánh `remote-tracking' không còn tồn tại trên máy chủ " +"nữa" + +#: builtin/fetch.c:74 +msgid "on-demand" +msgstr "khi-cần" + +#: builtin/fetch.c:75 +msgid "control recursive fetching of submodules" +msgstr "điều khiển việc lấy về (fetch) đệ quy trong các mô-đun-con" + +#: builtin/fetch.c:79 +msgid "keep downloaded pack" +msgstr "giữ các gói đã tải về" -#: builtin/fetch.c:200 +#: builtin/fetch.c:81 +msgid "allow updating of HEAD ref" +msgstr "cho phép cập nhật ref (tham chiếu) HEAD" + +#: builtin/fetch.c:84 +msgid "deepen history of shallow clone" +msgstr "làm sâu hơn lịch sử của bản sao" + +#: builtin/fetch.c:85 builtin/log.c:1083 +msgid "dir" +msgstr "tmục" + +#: builtin/fetch.c:86 +msgid "prepend this to submodule path output" +msgstr "soạn sẵn cái này cho kết xuất đường dẫn mô-đun-con" + +#: builtin/fetch.c:89 +msgid "default mode for recursion" +msgstr "chế độ mặc định cho đệ qui" + +#: builtin/fetch.c:201 msgid "Couldn't find remote ref HEAD" msgstr "Không thể tìm thấy máy chủ cho tham chiếu HEAD" -#: builtin/fetch.c:253 +#: builtin/fetch.c:254 #, c-format msgid "object %s not found" msgstr "Không tìm thấy đối tượng %s" @@ -3073,7 +4307,7 @@ msgid "" " 'git remote prune %s' to remove any old, conflicting branches" msgstr "" "một số tham chiếu (refs) nội bộ không thể được cập nhật; hãy thử chạy\n" -" 'git remote prune %s' để bỏ đi những nhánh cũ, hay bị xung đột" +" `git remote prune %s' để bỏ đi những nhánh cũ, hay bị xung đột" #: builtin/fetch.c:549 #, c-format @@ -3115,17 +4349,17 @@ msgstr "Tùy chọn \"%s\" có giá trị \"%s\" là không hợp lệ cho %s" msgid "Option \"%s\" is ignored for %s\n" msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n" -#: builtin/fetch.c:888 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "Đang lấy (fetch) %s\n" -#: builtin/fetch.c:890 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "không thể fetch (lấy) %s" -#: builtin/fetch.c:907 +#: builtin/fetch.c:912 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -3133,43 +4367,169 @@ msgstr "" "Chưa chỉ ra kho chứa máy chủ. Xin hãy chỉ định hoặc là URL hoặc\n" "tên máy chủ từ cái mà những điểm xét duyệt mới có thể được fetch (lấy về)." -#: builtin/fetch.c:927 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "Bạn phải định rõ tên thẻ." -#: builtin/fetch.c:979 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "lệnh lấy về \"fetch --all\" không lấy đối số kho chứa" -#: builtin/fetch.c:981 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "lệnh lấy về \"fetch --all\" không hợp lý với refspecs" -#: builtin/fetch.c:992 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "không có nhóm máy chủ hay máy chủ như thế: %s" -#: builtin/fetch.c:1000 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Việc lấy về cả một nhóm và chỉ định refspecs không hợp lý" +#: builtin/fmt-merge-msg.c:13 +msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" +msgstr "" +"git fmt-merge-msg [-m <thông điệp>] [--log[=<n>]|--no-log] [--file <tập-tin>]" + +#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:787 +#: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192 +#: builtin/tag.c:448 parse-options.h:133 parse-options.h:235 +msgid "n" +msgstr "n" + +#: builtin/fmt-merge-msg.c:654 +msgid "populate log with at most <n> entries from shortlog" +msgstr "gắn nhật ký với ít nhất <n> mục từ lệnh `shortlog'" + +#: builtin/fmt-merge-msg.c:657 +msgid "alias for --log (deprecated)" +msgstr "bí danh cho --log (không được dùng)" + +#: builtin/fmt-merge-msg.c:660 +msgid "text" +msgstr "văn bản" + +#: builtin/fmt-merge-msg.c:661 +msgid "use <text> as start of message" +msgstr "dùng <văn bản thường> để bắt đầu ghi chú" + +#: builtin/fmt-merge-msg.c:662 +msgid "file to read from" +msgstr "tập tin để đọc dữ liệu từ đó" + +#: builtin/for-each-ref.c:979 +msgid "git for-each-ref [options] [<pattern>]" +msgstr "git for-each-ref [các-tùy-chọn] [<mẫu>]" + +#: builtin/for-each-ref.c:994 +msgid "quote placeholders suitably for shells" +msgstr "trích dẫn để phù hợp cho hệ vỏ (shell)" + +#: builtin/for-each-ref.c:996 +msgid "quote placeholders suitably for perl" +msgstr "trích dẫn để phù hợp cho perl" + +#: builtin/for-each-ref.c:998 +msgid "quote placeholders suitably for python" +msgstr "trích dẫn để phù hợp cho python" + +#: builtin/for-each-ref.c:1000 +msgid "quote placeholders suitably for tcl" +msgstr "trích dẫn để phù hợp cho tcl" + +#: builtin/for-each-ref.c:1003 +msgid "show only <n> matched refs" +msgstr "hiển thị chỉ <n> tham chiếu khớp" + +#: builtin/for-each-ref.c:1004 +msgid "format" +msgstr "định dạng" + +#: builtin/for-each-ref.c:1004 +msgid "format to use for the output" +msgstr "định dạng sẽ dùng cho đầu ra" + +#: builtin/for-each-ref.c:1005 +msgid "key" +msgstr "khóa" + +#: builtin/for-each-ref.c:1006 +msgid "field name to sort on" +msgstr "tên trường cần sắp xếp" + +#: builtin/fsck.c:608 +msgid "git fsck [options] [<object>...]" +msgstr "git fsck [các-tùy-chọn] [<đối-tượng>...]" + +#: builtin/fsck.c:614 +msgid "show unreachable objects" +msgstr "hiển thị các đối tượng không thể đọc được" + +#: builtin/fsck.c:615 +msgid "show dangling objects" +msgstr "hiển thị các đối tượng không được quản lý" + +#: builtin/fsck.c:616 +msgid "report tags" +msgstr "báo cáo các thẻ" + +#: builtin/fsck.c:617 +msgid "report root nodes" +msgstr "báo cáo node gốc" + +#: builtin/fsck.c:618 +msgid "make index objects head nodes" +msgstr "tạo ` index objects head nodes'" + +#: builtin/fsck.c:619 +msgid "make reflogs head nodes (default)" +msgstr "tạo reflogs head nodes (mặc định)" + +#: builtin/fsck.c:620 +msgid "also consider packs and alternate objects" +msgstr "cũng cân nhắc đến các đối tượng gói và thay thế" + +#: builtin/fsck.c:621 +msgid "enable more strict checking" +msgstr "cho phép kiểm tra hạn chế hơn" + +#: builtin/fsck.c:623 +msgid "write dangling objects in .git/lost-found" +msgstr "ghi các đối tượng không được quản lý trong .git/lost-found" + +#: builtin/fsck.c:624 builtin/prune.c:134 +msgid "show progress" +msgstr "hiển thị quá trình" + +#: builtin/gc.c:22 +msgid "git gc [options]" +msgstr "git gc [các-tùy-chọn]" + #: builtin/gc.c:63 #, c-format msgid "Invalid %s: '%s'" -msgstr "%s không hợp lệ: '%s'" +msgstr "%s không hợp lệ: `%s'" #: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" msgstr "thư mục đối tượng dài một cách điên rồ %.*s" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" +#: builtin/gc.c:179 +msgid "prune unreferenced objects" +msgstr "xóa bỏ các đối tượng không được tham chiếu" + +#: builtin/gc.c:181 +msgid "be more thorough (increased runtime)" +msgstr "cẩn thận hơn nữa (tăng thời gian chạy)" -#: builtin/gc.c:224 +#: builtin/gc.c:182 +msgid "enable auto-gc mode" +msgstr "bật chế độ auto-gc" + +#: builtin/gc.c:222 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -3179,78 +4539,307 @@ msgstr "" "chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm " "chi tiết.\n" -#: builtin/gc.c:251 +#: builtin/gc.c:249 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" -"Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh 'git prune' " +"Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh `git prune' " "để xóa bỏ chúng đi." -#: builtin/grep.c:216 +#: builtin/grep.c:22 +msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "git grep [các-tùy-chọn] [-e] <mẫu> [<rev>...] [[--] <đường-dẫn>...]" + +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: gặp lỗi tạo tuyến (thread): %s" -#: builtin/grep.c:454 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "Gặp lỗi với lệnh chdir: %s" -#: builtin/grep.c:530 builtin/grep.c:564 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "không thể đọc cây (%s)" -#: builtin/grep.c:578 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "không thể thực hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s" -#: builtin/grep.c:636 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "chuyển đến `%c' mong chờ một giá trị bằng số" -#: builtin/grep.c:653 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" -msgstr "không mở được '%s'" +msgstr "không mở được `%s'" + +#: builtin/grep.c:729 +msgid "search in index instead of in the work tree" +msgstr "tìm trong bảng mục lục thay vì trong cây làm việc" + +#: builtin/grep.c:731 +msgid "find in contents not managed by git" +msgstr "tìm trong nội dung không được quản lý bởi git" + +#: builtin/grep.c:733 +msgid "search in both tracked and untracked files" +msgstr "tìm kiếm các tập tin được và chưa được theo dõi dấu vết" + +#: builtin/grep.c:735 +msgid "search also in ignored files" +msgstr "tìm cả trong các tập tin đã bị lờ đi" + +#: builtin/grep.c:738 +msgid "show non-matching lines" +msgstr "hiển thị những dòng không khớp với mẫu" + +#: builtin/grep.c:740 +msgid "case insensitive matching" +msgstr "phân biệt chữ hoa/thường" + +#: builtin/grep.c:742 +msgid "match patterns only at word boundaries" +msgstr "chỉ khớp mẫu tại đường ranh giới từ" + +#: builtin/grep.c:744 +msgid "process binary files as text" +msgstr "xử lý tập tin nhị phân như là dạng văn bản thường" + +#: builtin/grep.c:746 +msgid "don't match patterns in binary files" +msgstr "không khớp mẫu trong các tập tin nhị phân" + +#: builtin/grep.c:749 +msgid "descend at most <depth> levels" +msgstr "giảm xuống ít nhất mức <sâu>" + +#: builtin/grep.c:753 +msgid "use extended POSIX regular expressions" +msgstr "dùng biểu thức chính qui POSIX có mở rộng" + +#: builtin/grep.c:756 +msgid "use basic POSIX regular expressions (default)" +msgstr "sử dụng biểu thức chính quy kiểu POSIX (mặc định)" + +#: builtin/grep.c:759 +msgid "interpret patterns as fixed strings" +msgstr "diễn dịch các mẫu như là chuỗi cố định" + +#: builtin/grep.c:762 +msgid "use Perl-compatible regular expressions" +msgstr "sử dụng biểu thức chính quy tương thích Perl" + +#: builtin/grep.c:765 +msgid "show line numbers" +msgstr "hiển thị số của dòng" + +#: builtin/grep.c:766 +msgid "don't show filenames" +msgstr "không hiển thị tên tập tin" + +#: builtin/grep.c:767 +msgid "show filenames" +msgstr "hiển thị các tên tập tin" + +#: builtin/grep.c:769 +msgid "show filenames relative to top directory" +msgstr "hiển thị tên tập tin tương đối với thư mục đỉnh (top)" + +#: builtin/grep.c:771 +msgid "show only filenames instead of matching lines" +msgstr "chỉ hiển thị tên tập tin thay vì những dòng khớp với mẫu" + +#: builtin/grep.c:773 +msgid "synonym for --files-with-matches" +msgstr "đồng nghĩa với --files-with-matches" + +#: builtin/grep.c:776 +msgid "show only the names of files without match" +msgstr "chỉ hiển thị tên cho những tập tin không khớp với mẫu" + +#: builtin/grep.c:778 +msgid "print NUL after filenames" +msgstr "thêm NUL vào sau tên tập tin" + +#: builtin/grep.c:780 +msgid "show the number of matches instead of matching lines" +msgstr "hiển thị số lượng khớp thay vì những dòng khớp với mẫu" + +#: builtin/grep.c:781 +msgid "highlight matches" +msgstr "tô sáng cái khớp" -#: builtin/grep.c:917 +#: builtin/grep.c:783 +msgid "print empty line between matches from different files" +msgstr "hiển thị dòng trống giữa các lần khớp từ các tập tin khác biệt" + +#: builtin/grep.c:785 +msgid "show filename only once above matches from same file" +msgstr "" +"hiển thị tên tập tin một lần phía trên các lần khớp từ cùng một tập tin" + +#: builtin/grep.c:788 +msgid "show <n> context lines before and after matches" +msgstr "hiển thị <n> dòng nội dung phía trước và sau các lần khớp" + +#: builtin/grep.c:791 +msgid "show <n> context lines before matches" +msgstr "hiển thị <n> dòng nội dung trước khớp" + +#: builtin/grep.c:793 +msgid "show <n> context lines after matches" +msgstr "hiển thị <n> dòng nội dung sau khớp" + +#: builtin/grep.c:794 +msgid "shortcut for -C NUM" +msgstr "Dạng tắt cho -C SỐ" + +#: builtin/grep.c:797 +msgid "show a line with the function name before matches" +msgstr "hiển thị dòng vói tên hàm trước các lần khớp" + +#: builtin/grep.c:799 +msgid "show the surrounding function" +msgstr "hiển thị hàm bao quanh" + +#: builtin/grep.c:802 +msgid "read patterns from file" +msgstr "đọc mẫu từ tập-tin" + +#: builtin/grep.c:804 +msgid "match <pattern>" +msgstr "match <mẫu>" + +#: builtin/grep.c:806 +msgid "combine patterns specified with -e" +msgstr "tổ hợp mẫu được chỉ ra với tùy chọn -e" + +#: builtin/grep.c:818 +msgid "indicate hit with exit status without output" +msgstr "đưa ra gợi ý với trạng thái thoát mà không có kết xuất" + +#: builtin/grep.c:820 +msgid "show only matches from files that match all patterns" +msgstr "chỉ hiển thị những cái khớp từ tập tin mà nó khớp toàn bộ các mẫu" + +#: builtin/grep.c:822 +msgid "show parse tree for grep expression" +msgstr "hiển thị cây phân tích cú pháp cho biểu thức `grep' (tìm kiếm)" + +#: builtin/grep.c:826 +msgid "pager" +msgstr "trang giấy" + +#: builtin/grep.c:826 +msgid "show matching files in the pager" +msgstr "hiển thị các tập tin khớp trong trang giấy" + +#: builtin/grep.c:829 +msgid "allow calling of grep(1) (ignored by this build)" +msgstr "cho phép gọi grep(1) (bị bỏ qua bởi lần dịch này)" + +#: builtin/grep.c:830 builtin/show-ref.c:201 +msgid "show usage" +msgstr "hiển thị cách dùng" + +#: builtin/grep.c:921 msgid "no pattern given." msgstr "chưa chỉ ra mẫu." -#: builtin/grep.c:931 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "đối tượng sai %s" -#: builtin/grep.c:972 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc" -#: builtin/grep.c:995 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached hay --untracked không được sử dụng với --no-index." -#: builtin/grep.c:1000 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên " "quan đến revs." -#: builtin/grep.c:1003 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết." -#: builtin/grep.c:1011 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "cả hai --cached và các cây phải được chỉ ra." +#: builtin/hash-object.c:60 +msgid "" +"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] " +"<file>..." +msgstr "" +"git hash-object [-t <kiểu>] [-w] [--path=<tập-tin>|--no-filters] [--stdin] " +"[--] <tập-tin>..." + +#: builtin/hash-object.c:61 +msgid "git hash-object --stdin-paths < <list-of-paths>" +msgstr "git hash-object --stdin-paths < <danh-sách-đường-dẫn>" + +#: builtin/hash-object.c:72 +msgid "type" +msgstr "kiểu" + +#: builtin/hash-object.c:72 +msgid "object type" +msgstr "kiểu đối tượng" + +#: builtin/hash-object.c:73 +msgid "write the object into the object database" +msgstr "ghi đối tượng vào dữ liệu đối tượng" + +#: builtin/hash-object.c:74 +msgid "read the object from stdin" +msgstr "đọc đối tượng từ đầu vào tiêu chuẩn stdin" + +#: builtin/hash-object.c:76 +msgid "store file as is without filters" +msgstr "lưu các tập tin mà nó không có các bộ lọc" + +#: builtin/hash-object.c:77 +msgid "process file as it were from this path" +msgstr "xử lý tập tin như là nó đang ở thư mục này" + +#: builtin/help.c:43 +msgid "print all available commands" +msgstr "hiển thị danh sách các câu lệnh người dùng có thể sử dụng" + +#: builtin/help.c:44 +msgid "show man page" +msgstr "hiển thị trang man" + +#: builtin/help.c:45 +msgid "show manual in web browser" +msgstr "hiển thị hướng dẫn sử dụng trong trình duyệt web" + +#: builtin/help.c:47 +msgid "show info page" +msgstr "hiện trang info" + +#: builtin/help.c:53 +msgid "git help [--all] [--man|--web|--info] [command]" +msgstr "git help [--all] [--man|--web|--info] [lệnh]" + #: builtin/help.c:65 #, c-format msgid "unrecognized help format '%s'" -msgstr "không nhận ra định dạng trợ giúp '%s'" +msgstr "không nhận ra định dạng trợ giúp `%s'" #: builtin/help.c:93 msgid "Failed to start emacsclient." @@ -3263,12 +4852,12 @@ msgstr "Gặp lỗi khi phân tích phiên bản emacsclient." #: builtin/help.c:114 #, c-format msgid "emacsclient version '%d' too old (< 22)." -msgstr "phiên bản của emacsclient '%d' quá cũ (< 22)." +msgstr "phiên bản của emacsclient `%d' quá cũ (< 22)." #: builtin/help.c:132 builtin/help.c:160 builtin/help.c:169 builtin/help.c:177 #, c-format msgid "failed to exec '%s': %s" -msgstr "gặp lỗi khi thực thi '%s': %s" +msgstr "gặp lỗi khi thực thi `%s': %s" #: builtin/help.c:217 #, c-format @@ -3276,7 +4865,7 @@ msgid "" "'%s': path for unsupported man viewer.\n" "Please consider using 'man.<tool>.cmd' instead." msgstr "" -"'%s': đường dẫn không hỗ trợ bộ trình chiếu man.\n" +"`%s': đường dẫn không hỗ trợ bộ trình chiếu man.\n" "Hãy cân nhắc đến việc sử dụng 'man.<tool>.cmd' để thay thế." #: builtin/help.c:229 @@ -3285,7 +4874,7 @@ msgid "" "'%s': cmd for supported man viewer.\n" "Please consider using 'man.<tool>.path' instead." msgstr "" -"'%s': cmd (lệnh) hỗ trợ bộ trình chiếu man.\n" +"`%s': cmd (lệnh) hỗ trợ bộ trình chiếu man.\n" "Hãy cân nhắc đến việc sử dụng 'man.<tool>.path' để thay thế." #: builtin/help.c:299 @@ -3295,7 +4884,7 @@ msgstr "Những lệnh git hay được sử dụng nhất là:" #: builtin/help.c:367 #, c-format msgid "'%s': unknown man viewer." -msgstr "'%s': không rõ chương trình xem man." +msgstr "`%s': không rõ chương trình xem man." #: builtin/help.c:384 msgid "no man viewer handled the request" @@ -3350,17 +4939,22 @@ msgstr "pack quá lớn so với định nghĩa hiện tại của kiểu off_t" #: builtin/index-pack.c:273 #, c-format msgid "unable to create '%s'" -msgstr "không thể tạo '%s'" +msgstr "không thể tạo `%s'" #: builtin/index-pack.c:278 #, c-format msgid "cannot open packfile '%s'" -msgstr "không thể mở packfile '%s'" +msgstr "không thể mở packfile `%s'" #: builtin/index-pack.c:292 msgid "pack signature mismatch" msgstr "chữ ký cho pack không khớp" +#: builtin/index-pack.c:294 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "không hỗ trợ phiên bản pack %<PRIu32>" + #: builtin/index-pack.c:312 #, c-format msgid "pack has bad object at offset %lu: %s" @@ -3467,93 +5061,123 @@ msgstr "lộn xộn hơn cả điên rồ khi chạy hàm parse_pack_objects()" msgid "Resolving deltas" msgstr "Đang phân giải các delta" -#: builtin/index-pack.c:1105 +#: builtin/index-pack.c:1064 +#, c-format +msgid "unable to create thread: %s" +msgstr "không thể tạo tuyến: %s" + +#: builtin/index-pack.c:1106 msgid "confusion beyond insanity" msgstr "lộn xộn hơn cả điên rồ" -#: builtin/index-pack.c:1124 +#: builtin/index-pack.c:1112 +#, c-format +msgid "completed with %d local objects" +msgstr "đầy đủ với %d đối tượng nội bộ" + +#: builtin/index-pack.c:1121 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "Tổng kiểm tra tail không như mong đợi cho %s (đĩa hỏng?)" + +#: builtin/index-pack.c:1125 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "pack có %d delta chưa được giải quyết" msgstr[1] "pack có %d delta chưa được giải quyết" -#: builtin/index-pack.c:1149 +#: builtin/index-pack.c:1150 #, c-format msgid "unable to deflate appended object (%d)" msgstr "không thể xả đối tượng nối thêm (%d)" -#: builtin/index-pack.c:1228 +#: builtin/index-pack.c:1229 #, c-format msgid "local object %s is corrupt" msgstr "đối tượng nội bộ %s bị hỏng" -#: builtin/index-pack.c:1252 +#: builtin/index-pack.c:1253 msgid "error while closing pack file" msgstr "gặp lỗi trong khi đóng tập tin pack" -#: builtin/index-pack.c:1265 +#: builtin/index-pack.c:1266 #, c-format msgid "cannot write keep file '%s'" -msgstr "không thể ghi tập tin giữ lại '%s'" +msgstr "không thể ghi tập tin giữ lại `%s'" -#: builtin/index-pack.c:1273 +#: builtin/index-pack.c:1274 #, c-format msgid "cannot close written keep file '%s'" -msgstr "không thể đóng tập tin giữ lại đã được ghi '%s'" +msgstr "không thể đóng tập tin giữ lại đã được ghi `%s'" -#: builtin/index-pack.c:1286 +#: builtin/index-pack.c:1287 msgid "cannot store pack file" msgstr "không thể lưu tập tin pack" -#: builtin/index-pack.c:1297 +#: builtin/index-pack.c:1298 msgid "cannot store index file" msgstr "không thể lưu trữ tập tin ghi mục lục" -#: builtin/index-pack.c:1398 +#: builtin/index-pack.c:1331 +#, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "sai pack.indexversion=%<PRIu32>" + +#: builtin/index-pack.c:1337 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "số tuyến chỉ ra không hợp lệ (%d)" + +#: builtin/index-pack.c:1341 builtin/index-pack.c:1514 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "không hỗ trợ đa tuyến, bỏ qua %s" + +#: builtin/index-pack.c:1399 #, c-format msgid "Cannot open existing pack file '%s'" -msgstr "Không thể mở tập tin pack đã sẵn có '%s'" +msgstr "Không thể mở tập tin pack đã sẵn có `%s'" -#: builtin/index-pack.c:1400 +#: builtin/index-pack.c:1401 #, c-format msgid "Cannot open existing pack idx file for '%s'" -msgstr "Không thể mở tập tin 'pack idx' cho '%s'" +msgstr "Không thể mở tập tin 'pack idx' cho `%s'" -#: builtin/index-pack.c:1447 +#: builtin/index-pack.c:1448 #, c-format msgid "non delta: %d object" msgid_plural "non delta: %d objects" msgstr[0] "không delta: %d đối tượng" msgstr[1] "không delta: %d đối tượng" -#: builtin/index-pack.c:1454 +#: builtin/index-pack.c:1455 #, c-format msgid "chain length = %d: %lu object" msgid_plural "chain length = %d: %lu objects" msgstr[0] "chiều dài xích = %d: %lu đối tượng" msgstr[1] "chiều dài xích = %d: %lu đối tượng" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 msgid "Cannot come back to cwd" msgstr "Không thể quay lại cwd" -#: builtin/index-pack.c:1525 builtin/index-pack.c:1528 -#: builtin/index-pack.c:1540 builtin/index-pack.c:1544 +#: builtin/index-pack.c:1526 builtin/index-pack.c:1529 +#: builtin/index-pack.c:1541 builtin/index-pack.c:1545 #, c-format msgid "bad %s" msgstr "%s sai" -#: builtin/index-pack.c:1558 +#: builtin/index-pack.c:1559 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin không thể được dùng mà không có --stdin" -#: builtin/index-pack.c:1562 builtin/index-pack.c:1572 +#: builtin/index-pack.c:1563 builtin/index-pack.c:1573 #, c-format msgid "packfile name '%s' does not end with '.pack'" -msgstr "tên tập tin packfile '%s' không được kết thúc bằng đuôi '.pack'" +msgstr "tên tập tin packfile `%s' không được kết thúc bằng đuôi '.pack'" -#: builtin/index-pack.c:1581 +#: builtin/index-pack.c:1582 msgid "--verify with no packfile name given" msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile" @@ -3570,22 +5194,22 @@ msgstr "tên mẫu dài một cách điên rồ %s" #: builtin/init-db.c:67 #, c-format msgid "cannot stat '%s'" -msgstr "không thể lấy trạng thái (stat) về '%s'" +msgstr "không thể lấy trạng thái (stat) về `%s'" #: builtin/init-db.c:73 #, c-format msgid "cannot stat template '%s'" -msgstr "không thể stat (lấy trạng thái về) mẫu '%s'" +msgstr "không thể stat (lấy trạng thái về) mẫu `%s'" #: builtin/init-db.c:80 #, c-format msgid "cannot opendir '%s'" -msgstr "không thể opendir '%s'" +msgstr "không thể opendir `%s'" #: builtin/init-db.c:97 #, c-format msgid "cannot readlink '%s'" -msgstr "không thể readlink '%s'" +msgstr "không thể readlink `%s'" #: builtin/init-db.c:99 #, c-format @@ -3595,7 +5219,7 @@ msgstr "liên kết tượng trưng dài một cách điên rồ %s" #: builtin/init-db.c:102 #, c-format msgid "cannot symlink '%s' '%s'" -msgstr "không thể tạo liên kết tượng trưng (symlink) '%s' '%s'" +msgstr "không thể tạo liên kết tượng trưng (symlink) `%s' `%s'" #: builtin/init-db.c:106 #, c-format @@ -3620,7 +5244,7 @@ msgstr "các mẫu không được tìm thấy %s" #: builtin/init-db.c:154 #, c-format msgid "not copying templates of a wrong format version %d from '%s'" -msgstr "không sao chép các mẫu của phiên bản sai định dạng %d từ '%s'" +msgstr "không sao chép các mẫu của phiên bản sai định dạng %d từ `%s'" #: builtin/init-db.c:192 #, c-format @@ -3645,7 +5269,7 @@ msgstr "không di chuyển được %s vào %s" #: builtin/init-db.c:363 #, c-format msgid "Could not create git link %s" -msgstr "Không thể tạo liên kết git '%s'" +msgstr "Không thể tạo liên kết git `%s'" #. #. * TRANSLATORS: The first '%s' is either "Reinitialized @@ -3673,6 +5297,26 @@ msgstr " đã chia sẻ" msgid "cannot tell cwd" msgstr "không nói chuyện được với lệnh cwd" +#: builtin/init-db.c:467 +msgid "" +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared" +"[=<permissions>]] [directory]" +msgstr "" +"git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-" +"quyền>]] [thư-mục]" + +#: builtin/init-db.c:490 +msgid "permissions" +msgstr "các quyền" + +#: builtin/init-db.c:491 +msgid "specify that the git repository is to be shared amongst several users" +msgstr "chỉ ra cái mà kho git được chia sẻ giữa nhiều người dùng" + +#: builtin/init-db.c:493 builtin/prune-packed.c:77 +msgid "be quiet" +msgstr "im lặng" + #: builtin/init-db.c:522 builtin/init-db.c:529 #, c-format msgid "cannot mkdir %s" @@ -3699,7 +5343,27 @@ msgstr "Không thể truy cập thư mục làm việc hiện hành" #: builtin/init-db.c:586 #, c-format msgid "Cannot access work tree '%s'" -msgstr "không thể truy cập cây (tree) làm việc '%s'" +msgstr "không thể truy cập cây (tree) làm việc `%s'" + +#: builtin/log.c:37 +msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n" +msgstr "git log [<các-tùy-chọn>] [<kể-từ>..<cho-đến>] [[--] <đường-dẫn>...]\n" + +#: builtin/log.c:38 +msgid " or: git show [options] <object>..." +msgstr " or: git show [các-tùy-chọn] <đối-tượng>..." + +#: builtin/log.c:100 +msgid "suppress diff output" +msgstr "chặn mọi kết xuất từ diff" + +#: builtin/log.c:101 +msgid "show source" +msgstr "hiển thị mã nguồn" + +#: builtin/log.c:102 +msgid "decorate options" +msgstr "các tùy chọn trang trí" #: builtin/log.c:189 #, c-format @@ -3746,10 +5410,130 @@ msgstr "'Cover letter' cần cho định dạng thư" msgid "insane in-reply-to: %s" msgstr "in-reply-to điên rồ: %s" +#: builtin/log.c:890 +msgid "git format-patch [options] [<since> | <revision range>]" +msgstr "git format-patch [các-tùy-chọn] [<kể-từ> | <vùng-xem-xét>]" + #: builtin/log.c:935 msgid "Two output directories?" msgstr "Hai thư mục kết xuất?" +#: builtin/log.c:1063 +msgid "use [PATCH n/m] even with a single patch" +msgstr "dùng [PATCH n/m] ngay cả với miếng vá đơn" + +#: builtin/log.c:1066 +msgid "use [PATCH] even with multiple patches" +msgstr "dùng [VÁ] ngay cả với các miếng vá phức tạp" + +#: builtin/log.c:1070 +msgid "print patches to standard out" +msgstr "hiển thị miếng vá ra đầu ra chuẩn" + +#: builtin/log.c:1072 +msgid "generate a cover letter" +msgstr "tạo bì thư" + +#: builtin/log.c:1074 +msgid "use simple number sequence for output file names" +msgstr "sử dụng chỗi dãy số dạng đơn giản cho tên tập-tin xuất ra" + +#: builtin/log.c:1075 +msgid "sfx" +msgstr "sfx" + +#: builtin/log.c:1076 +msgid "use <sfx> instead of '.patch'" +msgstr "sử dụng <sfx> thay cho '.patch'" + +#: builtin/log.c:1078 +msgid "start numbering patches at <n> instead of 1" +msgstr "bắt đầu đánh số miếng vá từ <n> thay vì 1" + +#: builtin/log.c:1080 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "Dùng [<tiền-tố>] thay cho [VÁ]" + +#: builtin/log.c:1083 +msgid "store resulting files in <dir>" +msgstr "lưu các tập tin kết quả trong <t.mục>" + +#: builtin/log.c:1086 +msgid "don't strip/add [PATCH]" +msgstr "không strip/add [VÁ]" + +#: builtin/log.c:1089 +msgid "don't output binary diffs" +msgstr "không kết xuất diff (những khác biệt) nhị phân" + +#: builtin/log.c:1091 +msgid "don't include a patch matching a commit upstream" +msgstr "không bao gồm miếng vá khớp với một lần chuyển giao thượng nguồn" + +#: builtin/log.c:1093 +msgid "show patch format instead of default (patch + stat)" +msgstr "hiển thị định dạng miếng vá thay vì mặc định (miếng vá + thống kê)" + +#: builtin/log.c:1095 +msgid "Messaging" +msgstr "Lời nhắn" + +#: builtin/log.c:1096 +msgid "header" +msgstr "đầu đề thư" + +#: builtin/log.c:1097 +msgid "add email header" +msgstr "thêm đầu đề thư" + +#: builtin/log.c:1098 builtin/log.c:1100 +msgid "email" +msgstr "thư điện tử" + +#: builtin/log.c:1098 +msgid "add To: header" +msgstr "thêm To: đầu đề thư" + +#: builtin/log.c:1100 +msgid "add Cc: header" +msgstr "thêm Cc: đầu đề thư" + +#: builtin/log.c:1102 +msgid "message-id" +msgstr "message-id" + +#: builtin/log.c:1103 +msgid "make first mail a reply to <message-id>" +msgstr "dùng thư đầu tiên để trả lời <message-id>" + +#: builtin/log.c:1104 builtin/log.c:1107 +msgid "boundary" +msgstr "ranh giới" + +#: builtin/log.c:1105 +msgid "attach the patch" +msgstr "đính kèm miếng vá" + +#: builtin/log.c:1108 +msgid "inline the patch" +msgstr "dùng miếng vá làm nội dung" + +#: builtin/log.c:1112 +msgid "enable message threading, styles: shallow, deep" +msgstr "cho phép luồng lời nhắn, kiểu: `shallow', `deep'" + +#: builtin/log.c:1114 +msgid "signature" +msgstr "chữ ký" + +#: builtin/log.c:1115 +msgid "add a signature" +msgstr "thêm chữ ký" + +#: builtin/log.c:1117 +msgid "don't print the patch filenames" +msgstr "không hiển thị các tên tập tin của miếng vá" + #: builtin/log.c:1157 #, c-format msgid "bogus committer info %s" @@ -3782,18 +5566,22 @@ msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?" #: builtin/log.c:1241 #, c-format msgid "Could not create directory '%s'" -msgstr "Không thể tạo thư mục '%s'" +msgstr "Không thể tạo thư mục `%s'" #: builtin/log.c:1394 msgid "Failed to create output files" msgstr "Gặp lỗi khi tạo các tập tin kết xuất" +#: builtin/log.c:1443 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "git cherry [-v] [<thượng-nguồn> [<head> [<giới-hạn>]]]" + #: builtin/log.c:1498 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -"Không tìm thấy nhánh mạng bị theo vết, hãy chỉ định <dòng-ngược> một cách " +"Không tìm thấy nhánh mạng bị theo vết, hãy chỉ định <thượng-nguồn> một cách " "thủ công.\n" #: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 @@ -3801,6 +5589,149 @@ msgstr "" msgid "Unknown commit %s" msgstr "Không hiểu lần chuyển giao (commit) %s" +#: builtin/ls-files.c:408 +msgid "git ls-files [options] [<file>...]" +msgstr "git ls-files [các-tùy-chọn] [<tập-tin>...]" + +#: builtin/ls-files.c:463 +msgid "identify the file status with tags" +msgstr "nhận dạng các trạng thái tập tin với thẻ" + +#: builtin/ls-files.c:465 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "" +"dùng chữ cái viết thường cho các tập tin 'assume unchanged' (giả định không " +"thay đổi)" + +#: builtin/ls-files.c:467 +msgid "show cached files in the output (default)" +msgstr "hiển thị các tập tin được nhớ tạm vào đầu ra (mặc định)" + +#: builtin/ls-files.c:469 +msgid "show deleted files in the output" +msgstr "hiển thị các tập tin đã xóa trong kết xuất" + +#: builtin/ls-files.c:471 +msgid "show modified files in the output" +msgstr "hiển thị các tập tin đã bị sửa đổi ra kết xuất" + +#: builtin/ls-files.c:473 +msgid "show other files in the output" +msgstr "hiển thị các tập tin khác trong kết xuất" + +#: builtin/ls-files.c:475 +msgid "show ignored files in the output" +msgstr "hiển thị các tập tin bị bỏ qua trong kết xuất" + +#: builtin/ls-files.c:478 +msgid "show staged contents' object name in the output" +msgstr "hiển thị tên đối tượng của nội dung được lưu trạng thái ở kết xuất" + +#: builtin/ls-files.c:480 +msgid "show files on the filesystem that need to be removed" +msgstr "hiển thị các tập tin trên hệ thống tập tin mà nó cần được gỡ bỏ" + +#: builtin/ls-files.c:482 +msgid "show 'other' directories' name only" +msgstr "chỉ hiển thị tên của các thư mục 'khác'" + +#: builtin/ls-files.c:485 +msgid "don't show empty directories" +msgstr "không hiển thị thư mục rỗng" + +#: builtin/ls-files.c:488 +msgid "show unmerged files in the output" +msgstr "hiển thị các tập tin chưa hòa trộn trong kết xuất" + +#: builtin/ls-files.c:490 +msgid "show resolve-undo information" +msgstr "hiển thị thông tin resolve-undo" + +#: builtin/ls-files.c:492 +msgid "skip files matching pattern" +msgstr "bỏ qua những tập tin khớp với một mẫu" + +#: builtin/ls-files.c:495 +msgid "exclude patterns are read from <file>" +msgstr "mẫu loại trừ được đọc từ <tập tin>" + +#: builtin/ls-files.c:498 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "đọc thêm các mẫu ngoại trừ mỗi thư mục trong <tập tin>" + +#: builtin/ls-files.c:500 +msgid "add the standard git exclusions" +msgstr "thêm loại trừ tiêu chuẩn kiểu git" + +#: builtin/ls-files.c:503 +msgid "make the output relative to the project top directory" +msgstr "làm cho kết xuất liên quan đến thư mục ở mức cao nhất (gốc) của dự án" + +#: builtin/ls-files.c:506 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "nếu <tập tin> bất kỳ không ở trong bảng mục lục, xử lý nó như một lỗi" + +#: builtin/ls-files.c:507 +msgid "tree-ish" +msgstr "tree-ish" + +#: builtin/ls-files.c:508 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "" +"giả định rằng các đường dẫn đã bị gỡ bỏ kể từ <tree-ish> nay vẫn hiện diện" + +#: builtin/ls-files.c:510 +msgid "show debugging data" +msgstr "hiển thị dữ liệu gỡ lỗi" + +#: builtin/ls-tree.c:27 +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "git ls-tree [<các-tùy-chọn>] <tree-ish> [<đường-dẫn>...]" + +#: builtin/ls-tree.c:125 +msgid "only show trees" +msgstr "chỉ hiển thị các tree" + +#: builtin/ls-tree.c:127 +msgid "recurse into subtrees" +msgstr "đệ quy vào các thư mục con" + +#: builtin/ls-tree.c:129 +msgid "show trees when recursing" +msgstr "hiển thị cây khi đệ quy" + +#: builtin/ls-tree.c:132 +msgid "terminate entries with NUL byte" +msgstr "chấm dứt mục tin với byte NUL" + +#: builtin/ls-tree.c:133 +msgid "include object size" +msgstr "gồm cả kích thước đối tượng" + +#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +msgid "list only filenames" +msgstr "chỉ liệt kê tên tập tin" + +#: builtin/ls-tree.c:140 +msgid "use full path names" +msgstr "dùng tên đường dẫn đầy đủ" + +#: builtin/ls-tree.c:142 +msgid "list entire tree; not just current directory (implies --full-name)" +msgstr "liệt kê cây mục tin; không chỉ thư mục hiện hành (ngụ ý --full-name)" + +#: builtin/merge.c:43 +msgid "git merge [options] [<commit>...]" +msgstr "git merge [các-tùy-chọn] [<commit>...]" + +#: builtin/merge.c:44 +msgid "git merge [options] <msg> HEAD <commit>" +msgstr "git merge [các-tùy-chọn] <tin-nhắn> HEAD <commit>" + +#: builtin/merge.c:45 +msgid "git merge --abort" +msgstr "git merge --abort" + #: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "switch `m' yêu cầu một giá trị" @@ -3808,7 +5739,7 @@ msgstr "switch `m' yêu cầu một giá trị" #: builtin/merge.c:127 #, c-format msgid "Could not find merge strategy '%s'.\n" -msgstr "Không tìm thấy chiến lược hòa trộn '%s'.\n" +msgstr "Không tìm thấy chiến lược hòa trộn `%s'.\n" #: builtin/merge.c:128 #, c-format @@ -3820,6 +5751,67 @@ msgstr "Các chiến lược sẵn sàng là:" msgid "Available custom strategies are:" msgstr "Các chiến lược tùy chỉnh sẵn sàng là:" +#: builtin/merge.c:183 +msgid "do not show a diffstat at the end of the merge" +msgstr "không hiển thị thống kê khác biệt tại cuối của lần hòa trộn" + +#: builtin/merge.c:186 +msgid "show a diffstat at the end of the merge" +msgstr "hiển thị thống kê khác biệt tại cuối của hòa trộn" + +#: builtin/merge.c:187 +msgid "(synonym to --stat)" +msgstr "(đồng nghĩa với --stat)" + +#: builtin/merge.c:189 +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "thêm (ít nhất <n>) mục từ shortlog cho ghi chú chuyển giao hòa trộn" + +#: builtin/merge.c:192 +msgid "create a single commit instead of doing a merge" +msgstr "tạo một lần chuyển giao (commit) đưon thay vì thực hiện việc hòa trộn" + +#: builtin/merge.c:194 +msgid "perform a commit if the merge succeeds (default)" +msgstr "thực hiện chuyển giao nếu hòa trộn thành công (mặc định)" + +#: builtin/merge.c:196 +msgid "edit message before committing" +msgstr "sửa chú thích trước khi chuyển giao (commit)" + +#: builtin/merge.c:198 +msgid "allow fast-forward (default)" +msgstr "cho phép fast-forward (mặc định)" + +#: builtin/merge.c:200 +msgid "abort if fast-forward is not possible" +msgstr "bỏ qua nếu fast-forward không thể được" + +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 +msgid "strategy" +msgstr "chiến lược" + +#: builtin/merge.c:203 +msgid "merge strategy to use" +msgstr "chiến lược hòa trộn sẽ dùng" + +#: builtin/merge.c:204 +msgid "option=value" +msgstr "tùy_chọn=giá_trị" + +#: builtin/merge.c:205 +msgid "option for selected merge strategy" +msgstr "tùy chọn cho chiến lược hòa trộn đã chọn" + +#: builtin/merge.c:207 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "" +"hòa trộn ghi chú của lần chuyển giao (dành cho hòa trộn non-fast-forward)" + +#: builtin/merge.c:211 +msgid "abort the current in-progress merge" +msgstr "bãi bỏ quá trình hòa trộn hiện tại đang thực hiện" + #: builtin/merge.c:240 msgid "could not run stash." msgstr "không thể chạy stash." @@ -3862,7 +5854,7 @@ msgstr "Không thông điệp hòa trộn -- không cập nhật HEAD\n" #: builtin/merge.c:436 #, c-format msgid "'%s' does not point to a commit" -msgstr "'%s' không chỉ đến một lần chuyển giao (commit) nào cả" +msgstr "`%s' không chỉ đến một lần chuyển giao (commit) nào cả" #: builtin/merge.c:535 #, c-format @@ -3894,13 +5886,13 @@ msgstr "không thể ghi %s" #: builtin/merge.c:876 #, c-format msgid "Could not read from '%s'" -msgstr "Không thể đọc từ '%s'" +msgstr "Không thể đọc từ `%s'" #: builtin/merge.c:885 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" -"Vẫn chưa hòa trộn các lần chuyển giao (commit); sử dụng lệnh 'git commit' để " +"Vẫn chưa hòa trộn các lần chuyển giao (commit); sử dụng lệnh `git commit' để " "hoàn tất việc hòa trộn.\n" #: builtin/merge.c:891 @@ -3913,7 +5905,7 @@ msgid "" msgstr "" "Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần " "thiết,\n" -"đặc biệt là khi nó hòa trộn dòng ngược đã cập nhật vào trong một nhánh " +"đặc biệt là khi nó hòa trộn thượng nguồn đã cập nhật vào trong một nhánh " "topic.\n" "\n" "Những dòng được bắt đầu bằng '#' sẽ được bỏ qua, và phần chú thích này nếu " @@ -3951,7 +5943,7 @@ msgstr "Không có máy chủ cho nhánh hiện hành." #: builtin/merge.c:1053 msgid "No default upstream defined for the current branch." -msgstr "Không có dòng ngược mặc định được định nghĩa cho nhánh hiện hành." +msgstr "Không có thượng nguồn mặc định được định nghĩa cho nhánh hiện hành." #: builtin/merge.c:1058 #, c-format @@ -4073,10 +6065,110 @@ msgstr "" "Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu " "cầu\n" +#: builtin/merge-base.c:26 +msgid "git merge-base [-a|--all] <commit> <commit>..." +msgstr "git merge-base [-a|--all] <commit> <commit>..." + +#: builtin/merge-base.c:27 +msgid "git merge-base [-a|--all] --octopus <commit>..." +msgstr "git merge-base [-a|--all] --octopus <lần commit>..." + +#: builtin/merge-base.c:28 +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <lần commit>..." + +#: builtin/merge-base.c:29 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "git merge-base --is-ancestor <commit> <commit>" + +#: builtin/merge-base.c:98 +msgid "output all common ancestors" +msgstr "xuất ra tất cả các ông bà, tổ tiên chung" + +#: builtin/merge-base.c:99 +msgid "find ancestors for a single n-way merge" +msgstr "tìm tổ tiên của hòa trộn n-way đơn" + +#: builtin/merge-base.c:100 +msgid "list revs not reachable from others" +msgstr "liệt kê các 'rev' mà nó không thể đọc được từ cái khác" + +#: builtin/merge-base.c:102 +msgid "is the first one ancestor of the other?" +msgstr "là cha mẹ đầu tiên của cái khác?" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " +"file2" +msgstr "" +"git merge-file [các-tùy-chọn] [-L tên1 [-L gốc [-L tên2]]] tập-tin1 tập-tin-" +"gốc tập-tin2" + +#: builtin/merge-file.c:33 +msgid "send results to standard output" +msgstr "gửi kết quả vào đầu ra tiêu chuẩn" + +#: builtin/merge-file.c:34 +msgid "use a diff3 based merge" +msgstr "dùng kiểu hòa dựa trên diff3" + +#: builtin/merge-file.c:35 +msgid "for conflicts, use our version" +msgstr "để tránh xung đột, sử dụng phiên bản của chúng ta" + +#: builtin/merge-file.c:37 +msgid "for conflicts, use their version" +msgstr "để tránh xung đột, sử dụng phiên bản của họ" + +#: builtin/merge-file.c:39 +msgid "for conflicts, use a union version" +msgstr "để tránh xung đột, sử dụng phiên bản kết hợp" + +#: builtin/merge-file.c:42 +msgid "for conflicts, use this marker size" +msgstr "để tránh xung đột, hãy sử dụng kích thước bộ tạo này" + +#: builtin/merge-file.c:43 +msgid "do not warn about conflicts" +msgstr "không cảnh báo về các xung đột xảy ra" + +#: builtin/merge-file.c:45 +msgid "set labels for file1/orig_file/file2" +msgstr "đặt nhãn cho tập-tin-1/tập-tin-gốc/tập-tin-2" + +#: builtin/mktree.c:67 +msgid "git mktree [-z] [--missing] [--batch]" +msgstr "git mktree [-z] [--missing] [--batch]" + +#: builtin/mktree.c:153 +msgid "input is NUL terminated" +msgstr "đầu vào được chấm dứt bởi NUL" + +#: builtin/mktree.c:154 builtin/write-tree.c:24 +msgid "allow missing objects" +msgstr "cho phép thiếu đối tượng" + +#: builtin/mktree.c:155 +msgid "allow creation of more than one tree" +msgstr "cho phép tạo nhiều hơn một cây" + +#: builtin/mv.c:14 +msgid "git mv [options] <source>... <destination>" +msgstr "git mv [các-tùy-chọn] <nguồn>... <đích>" + +#: builtin/mv.c:64 +msgid "force move/rename even if target exists" +msgstr "ép buộc di chuyển hay đổi tên thậm chí cả khi đích đã tồn tại" + +#: builtin/mv.c:65 +msgid "skip move/rename errors" +msgstr "bỏ qua các lỗi liên quan đến di chuyển, đổi tên" + #: builtin/mv.c:108 #, c-format msgid "Checking rename of '%s' to '%s'\n" -msgstr "Đang kiểm tra việc đổi tên của '%s' thành '%s'\n" +msgstr "Đang kiểm tra việc đổi tên của `%s' thành `%s'\n" #: builtin/mv.c:112 msgid "bad source" @@ -4110,7 +6202,7 @@ msgstr "đích đã tồn tại sẵn rồi" #: builtin/mv.c:181 #, c-format msgid "overwriting '%s'" -msgstr "đang ghi đè lên '%s'" +msgstr "đang ghi đè lên `%s'" #: builtin/mv.c:184 msgid "Cannot overwrite" @@ -4135,117 +6227,289 @@ msgstr "Đổi tên %s thành %s\n" msgid "renaming '%s' failed" msgstr "đổi tên %s gặp lỗi" -#: builtin/notes.c:139 +#: builtin/name-rev.c:175 +msgid "git name-rev [options] <commit>..." +msgstr "git name-rev [các-tùy-chọn] <commit>..." + +#: builtin/name-rev.c:176 +msgid "git name-rev [options] --all" +msgstr "git name-rev [các-tùy-chọn] --all" + +#: builtin/name-rev.c:177 +msgid "git name-rev [options] --stdin" +msgstr "git name-rev [các-tùy-chọn] --stdin" + +#: builtin/name-rev.c:229 +msgid "print only names (no SHA-1)" +msgstr "chỉ hiển thị tên (không SHA-1)" + +#: builtin/name-rev.c:230 +msgid "only use tags to name the commits" +msgstr "chỉ dùng các thẻ để đặt tên cho các lần chuyển giao" + +#: builtin/name-rev.c:232 +msgid "only use refs matching <pattern>" +msgstr "chỉ sử dụng các tham chiếu (refs) khớp với <mẫu>" + +#: builtin/name-rev.c:234 +msgid "list all commits reachable from all refs" +msgstr "" +"liệt kê tất cả các lần chuyển giao có thể đọc được từ tất cả các tham chiếu" + +#: builtin/name-rev.c:235 +msgid "read from stdin" +msgstr "đọc từ đầu vào tiêu chuẩn" + +#: builtin/name-rev.c:236 +msgid "allow to print `undefined` names" +msgstr "cho phép hiển thị các tên `chưa định nghĩa'" + +#: builtin/notes.c:26 +msgid "git notes [--ref <notes_ref>] [list [<object>]]" +msgstr "git notes [--ref <notes_ref>] [list [<đối-tượng>]]" + +#: builtin/notes.c:27 +msgid "" +"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" +"git notes [--ref <notes_ref>] add [-f] [-m <lời-nhắn> | -F <tập-tin> | (-c | " +"-C) <đối-tượng>] [<đối-tượng>]" + +#: builtin/notes.c:28 +msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" +msgstr "git notes [--ref <notes_ref>] copy [-f] <từ-đối-tượng> <đến-đối-tượng>" + +#: builtin/notes.c:29 +msgid "" +"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" +"git notes [--ref <notes_ref>] append [-m <lời-nhắn> | -F <tập-tin> | (-c | -" +"C) <đối-tượng>] [<đối-tượng>]" + +#: builtin/notes.c:30 +msgid "git notes [--ref <notes_ref>] edit [<object>]" +msgstr "git notes [--ref <notes_ref>] edit [<đối-tượng>]" + +#: builtin/notes.c:31 +msgid "git notes [--ref <notes_ref>] show [<object>]" +msgstr "git notes [--ref <notes_ref>] show [<đối-tượng>]" + +#: builtin/notes.c:32 +msgid "" +"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" +msgstr "" +"git notes [--ref <notes_ref>] merge [-v | -q] [-s <chiến-lược> ] <notes_ref>" + +#: builtin/notes.c:33 +msgid "git notes merge --commit [-v | -q]" +msgstr "git notes merge --commit [-v | -q]" + +#: builtin/notes.c:34 +msgid "git notes merge --abort [-v | -q]" +msgstr "git notes merge --abort [-v | -q]" + +#: builtin/notes.c:35 +msgid "git notes [--ref <notes_ref>] remove [<object>...]" +msgstr "git notes [--ref <notes_ref>] remove [<đối-tượng>...]" + +#: builtin/notes.c:36 +msgid "git notes [--ref <notes_ref>] prune [-n | -v]" +msgstr "git notes [--ref <notes_ref>] prune [-n | -v]" + +#: builtin/notes.c:37 +msgid "git notes [--ref <notes_ref>] get-ref" +msgstr "git notes [--ref <notes_ref>] get-ref" + +#: builtin/notes.c:42 +msgid "git notes [list [<object>]]" +msgstr "git notes [list [<đối tượng>]]" + +#: builtin/notes.c:47 +msgid "git notes add [<options>] [<object>]" +msgstr "git notes add [<các-tùy-chọn>] [<đối-tượng>]" + +#: builtin/notes.c:52 +msgid "git notes copy [<options>] <from-object> <to-object>" +msgstr "git notes copy [<các-tùy-chọn>] <từ-đối-tượng> <đến-đối-tượng>" + +#: builtin/notes.c:53 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "git notes copy --stdin [<từ-đối-tượng> <đến-đối-tượng>]..." + +#: builtin/notes.c:58 +msgid "git notes append [<options>] [<object>]" +msgstr "git notes append [<các-tùy-chọn>] [<đối-tượng>]" + +#: builtin/notes.c:63 +msgid "git notes edit [<object>]" +msgstr "git notes edit [<đối tượng>]" + +#: builtin/notes.c:68 +msgid "git notes show [<object>]" +msgstr "git notes show [<đối tượng>]" + +#: builtin/notes.c:73 +msgid "git notes merge [<options>] <notes_ref>" +msgstr "git notes merge [<các-tùy-chọn>] <notes_ref>" + +#: builtin/notes.c:74 +msgid "git notes merge --commit [<options>]" +msgstr "git notes merge --commit [<các-tùy-chọn>]" + +#: builtin/notes.c:75 +msgid "git notes merge --abort [<options>]" +msgstr "git notes merge --abort [<các-tùy-chọn>]" + +#: builtin/notes.c:80 +msgid "git notes remove [<object>]" +msgstr "git notes remove [<đối tượng>]" + +#: builtin/notes.c:85 +msgid "git notes prune [<options>]" +msgstr "git notes prune [<các-tùy-chọn>]" + +#: builtin/notes.c:90 +msgid "git notes get-ref" +msgstr "git notes get-ref" + +#: builtin/notes.c:142 #, c-format msgid "unable to start 'show' for object '%s'" -msgstr "không thể khởi chạy 'show' cho đối tượng '%s'" +msgstr "không thể khởi chạy 'show' cho đối tượng `%s'" -#: builtin/notes.c:145 +#: builtin/notes.c:148 msgid "can't fdopen 'show' output fd" msgstr "không thể fdopen 'show' (lệnh hiển thị) mô tả tập tin (fd) kết xuất" -#: builtin/notes.c:155 +#: builtin/notes.c:158 #, c-format msgid "failed to close pipe to 'show' for object '%s'" -msgstr "gặp lỗi khi đóng đường ống cho lệnh 'show' cho đối tượng '%s'" +msgstr "gặp lỗi khi đóng đường ống cho lệnh 'show' cho đối tượng `%s'" -#: builtin/notes.c:158 +#: builtin/notes.c:161 #, c-format msgid "failed to finish 'show' for object '%s'" -msgstr "gặp lỗi khi hoàn thành 'show' cho đối tượng '%s'" +msgstr "gặp lỗi khi hoàn thành `show' cho đối tượng `%s'" -#: builtin/notes.c:175 builtin/tag.c:347 +#: builtin/notes.c:178 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" -msgstr "không thể tạo tập tin '%s'" +msgstr "không thể tạo tập tin `%s'" -#: builtin/notes.c:189 +#: builtin/notes.c:192 msgid "Please supply the note contents using either -m or -F option" msgstr "" "Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F" -#: builtin/notes.c:210 builtin/notes.c:973 +#: builtin/notes.c:213 builtin/notes.c:976 #, c-format msgid "Removing note for object %s\n" msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n" -#: builtin/notes.c:215 +#: builtin/notes.c:218 msgid "unable to write note object" msgstr "không thể ghi đối tượng ghi chú (note)" -#: builtin/notes.c:217 +#: builtin/notes.c:220 #, c-format msgid "The note contents has been left in %s" msgstr "Nội dung ghi chú còn lại %s" -#: builtin/notes.c:251 builtin/tag.c:542 +#: builtin/notes.c:254 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" -msgstr "không thể đọc '%s'" +msgstr "không thể đọc `%s'" -#: builtin/notes.c:253 builtin/tag.c:545 +#: builtin/notes.c:256 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" -msgstr "không thể mở để đọc hay ghi '%s'" +msgstr "không thể mở để đọc hay ghi `%s'" -#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 -#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 -#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#: builtin/notes.c:275 builtin/notes.c:448 builtin/notes.c:450 +#: builtin/notes.c:510 builtin/notes.c:564 builtin/notes.c:647 +#: builtin/notes.c:652 builtin/notes.c:727 builtin/notes.c:769 +#: builtin/notes.c:971 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." -msgstr "Gặp lỗi khi giải quyết '%s' như là một tham chiếu (ref) hợp lệ." +msgstr "Gặp lỗi khi giải quyết `%s' như là một tham chiếu (ref) hợp lệ." -#: builtin/notes.c:275 +#: builtin/notes.c:278 #, c-format msgid "Failed to read object '%s'." -msgstr "Gặp lỗi khi đọc đối tượng '%s'." +msgstr "Gặp lỗi khi đọc đối tượng `%s'." -#: builtin/notes.c:299 +#: builtin/notes.c:302 msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "" "Không thể chuyển giao (commit) chưa được khởi tạo hoặc không được tham chiếu " "cây ghi chú" -#: builtin/notes.c:340 +#: builtin/notes.c:343 #, c-format msgid "Bad notes.rewriteMode value: '%s'" -msgstr "Giá trị notes.rewriteMode sai: '%s'" +msgstr "Giá trị notes.rewriteMode sai: `%s'" -#: builtin/notes.c:350 +#: builtin/notes.c:353 #, 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 của refs/notes/)" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: builtin/notes.c:377 +#: builtin/notes.c:380 #, c-format msgid "Bad %s value: '%s'" -msgstr "Giá trị %s sai: '%s'" +msgstr "Giá trị %s sai: `%s'" -#: builtin/notes.c:441 +#: builtin/notes.c:444 #, c-format msgid "Malformed input line: '%s'." -msgstr "Dòng nhập vào dị hình: '%s'." +msgstr "Dòng nhập vào dị hình: `%s'." -#: builtin/notes.c:456 +#: builtin/notes.c:459 #, 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'" +msgstr "Gặp lỗi khi sao chép ghi chú (note) từ `%s' tới `%s'" -#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 -#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 -#: builtin/notes.c:1033 +#: builtin/notes.c:503 builtin/notes.c:557 builtin/notes.c:630 +#: builtin/notes.c:642 builtin/notes.c:715 builtin/notes.c:762 +#: builtin/notes.c:1036 msgid "too many parameters" msgstr "quá nhiều đối số" -#: builtin/notes.c:513 builtin/notes.c:772 +#: builtin/notes.c:516 builtin/notes.c:775 #, c-format msgid "No note found for object %s." msgstr "không tìm thấy ghi chú cho đối tượng %s." -#: builtin/notes.c:580 +#: builtin/notes.c:538 builtin/notes.c:695 +msgid "note contents as a string" +msgstr "nội dung ghi chú (note) nằm trong một chuỗi" + +#: builtin/notes.c:541 builtin/notes.c:698 +msgid "note contents in a file" +msgstr "nội dung ghi chú (note) nằm trong một tập tin" + +#: builtin/notes.c:543 builtin/notes.c:546 builtin/notes.c:700 +#: builtin/notes.c:703 builtin/tag.c:476 +msgid "object" +msgstr "đối tượng" + +#: builtin/notes.c:544 builtin/notes.c:701 +msgid "reuse and edit specified note object" +msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra" + +#: builtin/notes.c:547 builtin/notes.c:704 +msgid "reuse specified note object" +msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra" + +#: builtin/notes.c:549 builtin/notes.c:617 +msgid "replace existing notes" +msgstr "thay thế ghi chú trước" + +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -4254,16 +6518,24 @@ msgstr "" "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng " "%s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ" -#: builtin/notes.c:585 builtin/notes.c:662 +#: builtin/notes.c:588 builtin/notes.c:665 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n" -#: builtin/notes.c:635 +#: builtin/notes.c:618 +msgid "read objects from stdin" +msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn" + +#: builtin/notes.c:620 +msgid "load rewriting config for <command> (implies --stdin)" +msgstr "tải cấu hình chép lại cho <lệnh> (ngầm định là --stdin)" + +#: builtin/notes.c:638 msgid "too few parameters" msgstr "quá ít đối số" -#: builtin/notes.c:656 +#: builtin/notes.c:659 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -4272,30 +6544,92 @@ msgstr "" "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối " "tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ" -#: builtin/notes.c:668 +#: builtin/notes.c:671 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "Thiếu ghi chú trên đối tượng nguốn %s. Không thể sao chép." -#: builtin/notes.c:717 +#: builtin/notes.c:720 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" "Please use 'git notes add -f -m/-F/-c/-C' instead.\n" msgstr "" -"Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con 'edit'.\n" -"Xin hãy sử dụng lệnh sau để thay thế: 'git notes add -f -m/-F/-c/-C'.\n" +"Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con `edit'.\n" +"Xin hãy sử dụng lệnh sau để thay thế: `git notes add -f -m/-F/-c/-C'.\n" + +#: builtin/notes.c:867 +msgid "General options" +msgstr "Tùy chọn chung" + +#: builtin/notes.c:869 +msgid "Merge options" +msgstr "Tùy chọn về hòa trộn" + +#: builtin/notes.c:871 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "" +"phân giải các xung đột `notes' sử dụng chiến lược đã đưa ra (manual/ours/" +"theirs/union/cat_sort_uniq)" + +#: builtin/notes.c:873 +msgid "Committing unmerged notes" +msgstr "Chuyển giao các note chưa được hòa trộn" + +#: builtin/notes.c:875 +msgid "finalize notes merge by committing unmerged notes" +msgstr "" +"các note cuối cùng được hòa trộn bởi các note chưa hòa trộn của lần chuyển " +"giao" -#: builtin/notes.c:971 +#: builtin/notes.c:877 +msgid "Aborting notes merge resolution" +msgstr "Hủy bỏ phân giải ghi chú (note) hòa trộn" + +#: builtin/notes.c:879 +msgid "abort notes merge" +msgstr "bỏ qua hòa trộn các ghi chú (note)" + +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "Đối tượng %s không có ghi chú (note)\n" -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:986 +msgid "attempt to remove non-existent note is not an error" +msgstr "cố gắng gỡ bỏ một note chưa từng tồn tại không phải là một lỗi" + +#: builtin/notes.c:989 +msgid "read object names from the standard input" +msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn" + +#: builtin/notes.c:1070 +msgid "notes_ref" +msgstr "notes_ref" + +#: builtin/notes.c:1071 +msgid "use notes from <notes_ref>" +msgstr "dùng `notes' từ <notes_ref>" + +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Không hiểu câu lệnh con: %s" +#: builtin/pack-objects.c:23 +msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]" +msgstr "" +"git pack-objects --stdout [các-tùy-chọn...] [< danh-sách-ref | < danh-sách-" +"đối-tượng]" + +#: builtin/pack-objects.c:24 +msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" +msgstr "" +"git pack-objects [các-tùy-chọn...] base-name [< danh-sách-ref | < danh-sách-" +"đối-tượng]" + #: builtin/pack-objects.c:183 builtin/pack-objects.c:186 #, c-format msgid "deflate error (%d)" @@ -4309,7 +6643,7 @@ msgstr "phiên bản mục lục không được hỗ trợ %s" #: builtin/pack-objects.c:2402 #, c-format msgid "bad index version '%s'" -msgstr "phiên bản mục lục sai '%s'" +msgstr "phiên bản mục lục sai `%s'" #: builtin/pack-objects.c:2425 #, c-format @@ -4319,7 +6653,164 @@ msgstr "tùy chọn %s không chấp nhận dạng thức âm" #: builtin/pack-objects.c:2429 #, c-format msgid "unable to parse value '%s' for option %s" -msgstr "không thể phân tích giá trị '%s' cho tùy chọn %s" +msgstr "không thể phân tích giá trị `%s' cho tùy chọn %s" + +#: builtin/pack-objects.c:2448 +msgid "do not show progress meter" +msgstr "không hiển thị bộ đo tiến trình" + +#: builtin/pack-objects.c:2450 +msgid "show progress meter" +msgstr "hiển thị bộ đo tiến trình" + +#: builtin/pack-objects.c:2452 +msgid "show progress meter during object writing phase" +msgstr "hiển thị bộ đo tiến triển trong suốt pha ghi đối tượng" + +#: builtin/pack-objects.c:2455 +msgid "similar to --all-progress when progress meter is shown" +msgstr "tương tự --all-progress khi bộ đo tiến trình được xuất hiện" + +#: builtin/pack-objects.c:2456 +msgid "version[,offset]" +msgstr "phiên bản[,offset]" + +#: builtin/pack-objects.c:2457 +msgid "write the pack index file in the specified idx format version" +msgstr "ghi tập tin bảng mục lục gói (pack) ở phiên bản định dạng idx đã cho" + +#: builtin/pack-objects.c:2460 +msgid "maximum size of each output pack file" +msgstr "kcíh thước tối đa cho tập tin gói được tạo" + +#: builtin/pack-objects.c:2462 +msgid "ignore borrowed objects from alternate object store" +msgstr "bỏ qua các đối tượng vay mượn từ kho đối tượng thay thế" + +#: builtin/pack-objects.c:2464 +msgid "ignore packed objects" +msgstr "bỏ qua các đối tượng đóng gói" + +#: builtin/pack-objects.c:2466 +msgid "limit pack window by objects" +msgstr "giới hạn cửa sổ đóng gói theo đối tượng" + +#: builtin/pack-objects.c:2468 +msgid "limit pack window by memory in addition to object limit" +msgstr "giới hạn cửa sổ đóng gói theo bộ nhớ cộng thêm với giới hạn đối tượng" + +#: builtin/pack-objects.c:2470 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "độ dài tối đa của chuỗi móc xích `delta' được phép trong gói kết quả" + +#: builtin/pack-objects.c:2472 +msgid "reuse existing deltas" +msgstr "dùng lại các delta sẵn có" + +#: builtin/pack-objects.c:2474 +msgid "reuse existing objects" +msgstr "dùng lại các đối tượng sẵn có" + +#: builtin/pack-objects.c:2476 +msgid "use OFS_DELTA objects" +msgstr "dùng các đối tượng OFS_DELTA" + +#: builtin/pack-objects.c:2478 +msgid "use threads when searching for best delta matches" +msgstr "sử dụng các tuyến trình khi tìm kiếm cho các mẫu khớp delta tốt nhất" + +#: builtin/pack-objects.c:2480 +msgid "do not create an empty pack output" +msgstr "không thể tạo kết xuất gói (pack) trống rỗng" + +#: builtin/pack-objects.c:2482 +msgid "read revision arguments from standard input" +msgstr " đọc tham số `revision' từ thiết bị nhập chuẩn" + +#: builtin/pack-objects.c:2484 +msgid "limit the objects to those that are not yet packed" +msgstr "giới hạn các đối tượng thành những cái mà chúng vẫn chưa được đóng gói" + +#: builtin/pack-objects.c:2487 +msgid "include objects reachable from any reference" +msgstr "bao gồm các đối tượng có thể đọc được từ bất kỳ tham chiếu nào" + +#: builtin/pack-objects.c:2490 +msgid "include objects referred by reflog entries" +msgstr "bao gồm các đối tượng được tham chiếu bởi các mục reflog" + +#: builtin/pack-objects.c:2493 +msgid "output pack to stdout" +msgstr "xuất gói ra đầu ra tiêu chuẩn" + +#: builtin/pack-objects.c:2495 +msgid "include tag objects that refer to objects to be packed" +msgstr "bao gồm các đối tượng tham chiếu đến các đối tượng được đóng gói" + +#: builtin/pack-objects.c:2497 +msgid "keep unreachable objects" +msgstr "giữ lại các đối tượng không thể đọc được" + +#: builtin/pack-objects.c:2498 parse-options.h:141 +msgid "time" +msgstr "thời-gian" + +#: builtin/pack-objects.c:2499 +msgid "unpack unreachable objects newer than <time>" +msgstr "" +"xả nén (gỡ khỏi gói) các đối tượng không thể đọc được mới hơn <thời-gian>" + +#: builtin/pack-objects.c:2502 +msgid "create thin packs" +msgstr "tạo gói nhẹ" + +#: builtin/pack-objects.c:2504 +msgid "ignore packs that have companion .keep file" +msgstr "bỏ qua các gói mà nó có tập tin .keep đi kèm" + +#: builtin/pack-objects.c:2506 +msgid "pack compression level" +msgstr "mức nén gói" + +#: builtin/pack-objects.c:2508 +msgid "do not hide commits by grafts" +msgstr "không ẩn các lần chuyển giao bởi `grafts'" + +#: builtin/pack-refs.c:6 +msgid "git pack-refs [options]" +msgstr "git pack-refs [các-tùy-chọn]" + +#: builtin/pack-refs.c:14 +msgid "pack everything" +msgstr "đóng gói mọi thứ" + +#: builtin/pack-refs.c:15 +msgid "prune loose refs (default)" +msgstr "prune (cắt cụt) những tham chiếu (refs) bị mất (mặc định)" + +#: builtin/prune-packed.c:7 +msgid "git prune-packed [-n|--dry-run] [-q|--quiet]" +msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" + +#: builtin/prune.c:12 +msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" +msgstr "git prune [-n] [-v] [--expire <thời-gian>] [--] [<head>...]" + +#: builtin/prune.c:132 +msgid "do not remove, show only" +msgstr "không gỡ bỏ, chỉ hiển thị" + +#: builtin/prune.c:133 +msgid "report pruned objects" +msgstr "báo cáo các đối tượng đã prune" + +#: builtin/prune.c:136 +msgid "expire objects older than <time>" +msgstr "các đối tượng hết hạn cũ hơn khoảng <thời gian>" + +#: builtin/push.c:14 +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "git push [<các-tùy-chọn>] [<kho-chứa> [<refspec>...]]" #: builtin/push.c:45 msgid "tag shorthand without <tag>" @@ -4335,7 +6826,7 @@ msgid "" "To choose either option permanently, see push.default in 'git help config'." msgstr "" "\n" -"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong 'git help " +"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong `git help " "config'." #: builtin/push.c:102 @@ -4352,8 +6843,8 @@ msgid "" " git push %s %s\n" "%s" msgstr "" -"Nhánh dòng ngược (upstream) của nhánh hiện tại của bạn không khớp\n" -"với tên của nhánh hiện tại của bạn. Để push đến nhánh dòng ngược\n" +"Nhánh thượng nguồn (upstream) của nhánh hiện tại của bạn không khớp\n" +"với tên của nhánh hiện tại của bạn. Để push đến nhánh thượng nguồn\n" "trên máy chủ, sử dụng\n" "\n" " git push %s HEAD:%s\n" @@ -4386,8 +6877,8 @@ msgid "" "\n" " git push --set-upstream %s %s\n" msgstr "" -"Nhánh hiện tại %s không có nhánh dòng ngược (upstream) nào.\n" -"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ như là dòng ngược " +"Nhánh hiện tại %s không có nhánh thượng nguồn (upstream) nào.\n" +"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ như là thượng nguồn " "(upstream), sử dụng\n" "\n" " git push --set-upstream %s %s\n" @@ -4395,7 +6886,7 @@ msgstr "" #: builtin/push.c:136 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." -msgstr "Nhánh hiện tại %s có đa nhánh dòng ngược (upstream), từ chối push." +msgstr "Nhánh hiện tại %s có đa nhánh thượng nguồn (upstream), từ chối push." #: builtin/push.c:139 #, c-format @@ -4404,9 +6895,9 @@ msgid "" "your current branch '%s', without telling me what to push\n" "to update which remote branch." msgstr "" -"Bạn đang push (đẩy lên) máy chủ '%s', mà nó không phải là dòng ngược " +"Bạn đang push (đẩy lên) máy chủ `%s', mà nó không phải là thượng nguồn " "(upstream) của\n" -"nhánh hiện tại '%s' của bạn, mà không báo cho tôi biết là cái gì được push\n" +"nhánh hiện tại `%s' của bạn, mà không báo cho tôi biết là cái gì được push\n" "để cập nhật nhánh máy chủ nào." #: builtin/push.c:151 @@ -4426,20 +6917,21 @@ msgid "" "(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 chưa được đặt; giá trị ngầm định của nó đã được thay đổi trong\n" -"Git 2.0 từ 'matching' thành 'simple'. Để chấm dứt lời nhắc nhở này\n" -"và duy trì cách xử lý sau những thay đổi mặc định này, hãy chạy lệnh:\n" +"biến push.default chưa được đặt; giá trị ngầm định của nó\n" +"đã được thay đổi trong Git 2.0 từ 'matching' thành 'simple'.\n" +"Để không hiển thị nhắc nhở này và duy trì cách xử lý sau\n" +"những thay đổi mặc định này, hãy chạy lệnh:\n" "\n" " git config --global push.default matching\n" "\n" -"Để chấm dứt lời nhắc nhở này và sử dụng cách xử lý mới, hãy chạy lệnh:\n" +"Để không hiển thị nhắc nhở này và áp dụng cách xử lý mới, hãy chạy lệnh:\n" "\n" " git config --global push.default simple\n" "\n" -"Xem 'git help config' và tìm đến 'push.default' để có thêm thông tin.\n" +"Xem `git help config' và tìm đến `push.default' để có thêm thông tin.\n" "(chế độ 'simple' được bắt đầu sử dụng từ Git 1.7.11. Sử dụng chế độ tương " "tự\n" -"'current' thay vì 'simple' nếu bạn thỉnh thoảng phải sử dụng bản Git cũ)" +"`current' thay vì `simple' nếu bạn thỉnh thoảng phải sử dụng bản Git cũ)" #: builtin/push.c:199 msgid "" @@ -4456,10 +6948,10 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n" -"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. 'git " +"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. `git " "pull')\n" "trước khi lại push lần nữa.\n" -"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có " +"Xem trong phần 'Note about fast-forwards' từ lệnh `git push --help' để có " "thông tin chi tiết." #: builtin/push.c:212 @@ -4487,8 +6979,8 @@ msgstr "" "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n" "phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi " "từ máy chủ\n" -"(v.d. 'git pull') trước khi lại push lần nữa.\n" -"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có " +"(v.d. `git pull') trước khi lại push lần nữa.\n" +"Xem trong phần 'Note about fast-forwards' từ lệnh `git push --help' để có " "thông tin chi tiết." #: builtin/push.c:258 @@ -4499,12 +6991,12 @@ msgstr "Đang push (đẩy) lên %s\n" #: builtin/push.c:262 #, c-format msgid "failed to push some refs to '%s'" -msgstr "gặp lỗi khi push (đẩy lên) một số tham chiếu (ref) đến '%s'" +msgstr "gặp lỗi khi push (đẩy lên) một số tham chiếu (ref) đến `%s'" #: builtin/push.c:294 #, c-format msgid "bad repository '%s'" -msgstr "repository (kho) sai '%s'" +msgstr "repository (kho) sai `%s'" #: builtin/push.c:295 msgid "" @@ -4547,6 +7039,55 @@ msgstr "--mirror không thể được tổ hợp cùng với refspecs" msgid "--all and --mirror are incompatible" msgstr "--all và --mirror xung khắc nhau" +#: builtin/push.c:382 +msgid "repository" +msgstr "kho" + +#: builtin/push.c:383 +msgid "push all refs" +msgstr "push tất cả refs" + +#: builtin/push.c:384 +msgid "mirror all refs" +msgstr "mirror tất cả refs" + +#: builtin/push.c:386 +msgid "delete refs" +msgstr "xóa refs" + +#: builtin/push.c:387 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "" +"các thẻ push (không thể sử dụng cùng với các tùy chọn --all hay --mirror)" + +#: builtin/push.c:390 +msgid "force updates" +msgstr "ép buộc cập nhật" + +#: builtin/push.c:391 +msgid "check" +msgstr "kiểm tra" + +#: builtin/push.c:392 +msgid "control recursive pushing of submodules" +msgstr "điều khiển việc đẩy lên (push) đệ qui của mô-đun-con" + +#: builtin/push.c:394 +msgid "use thin pack" +msgstr "tạo gói nhẹ" + +#: builtin/push.c:395 builtin/push.c:396 +msgid "receive pack program" +msgstr "nhận về chương trình pack" + +#: builtin/push.c:397 +msgid "set upstream for git pull/status" +msgstr "đặt thượng nguồn (upstream) cho git pull/status" + +#: builtin/push.c:400 +msgid "prune locally removed refs" +msgstr "prune (cắt cụt) những tham chiếu (refs) bị gỡ bỏ" + #: builtin/push.c:410 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --tags" @@ -4555,6 +7096,164 @@ msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --ta msgid "--delete doesn't make sense without any refs" msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu (refs) nào" +#: builtin/read-tree.c:36 +msgid "" +"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] " +"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--" +"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" +msgstr "" +"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<tiền-" +"tố>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] " +"[--index-output=<tập-tin>] (--empty | <tree-ish1> [<tree-ish2> [<tree-" +"ish3>]])" + +#: builtin/read-tree.c:108 +msgid "write resulting index to <file>" +msgstr "ghi mục lục kết quả vào <tập-tin>" + +#: builtin/read-tree.c:111 +msgid "only empty the index" +msgstr "chỉ với bảng mục lục trống rỗng" + +#: builtin/read-tree.c:113 +msgid "Merging" +msgstr "Hòa trộn" + +#: builtin/read-tree.c:115 +msgid "perform a merge in addition to a read" +msgstr "thực hiện một hòa trộn thêm vào việc đọc" + +#: builtin/read-tree.c:117 +msgid "3-way merge if no file level merging required" +msgstr "" +"hòa trộn kiểu `3-way' nếu không có tập tin mức hòa trộn nào được yêu cầu " + +#: builtin/read-tree.c:119 +msgid "3-way merge in presence of adds and removes" +msgstr "hòa trộn 3-way trong sự hiện diện của `adds' và `removes'" + +#: builtin/read-tree.c:121 +msgid "same as -m, but discard unmerged entries" +msgstr "giống với -m, nhưng bỏ qua các mục chưa được hòa trộn" + +#: builtin/read-tree.c:122 +msgid "<subdirectory>/" +msgstr "<thư-mục-con>/" + +#: builtin/read-tree.c:123 +msgid "read the tree into the index under <subdirectory>/" +msgstr "đọc cây vào trong bảng mục lục dưới <thư_mục_con>/" + +#: builtin/read-tree.c:126 +msgid "update working tree with merge result" +msgstr "cập nhật cây làm việc với kết quả hòa trộn" + +#: builtin/read-tree.c:128 +msgid "gitignore" +msgstr "gitignore" + +#: builtin/read-tree.c:129 +msgid "allow explicitly ignored files to be overwritten" +msgstr "cho phép các tập tin rõ ràng bị lờ đi được ghi đè" + +#: builtin/read-tree.c:132 +msgid "don't check the working tree after merging" +msgstr "không kiểm tra cây làm việc sau hòa trộn" + +#: builtin/read-tree.c:133 +msgid "don't update the index or the work tree" +msgstr "không cập nhật bảng mục lục hay cây làm việc" + +#: builtin/read-tree.c:135 +msgid "skip applying sparse checkout filter" +msgstr "bỏ qua áp dụng bộ lọc lấy ra (checkout) thưa thớt" + +#: builtin/read-tree.c:137 +msgid "debug unpack-trees" +msgstr "gỡ lỗi unpack-trees" + +#: builtin/remote.c:11 +msgid "git remote [-v | --verbose]" +msgstr "git remote [-v | --verbose]" + +#: builtin/remote.c:12 +msgid "" +"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <name> <url>" +msgstr "" +"git remote add [-t <nhánh>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <tên> <url>" + +#: builtin/remote.c:13 builtin/remote.c:32 +msgid "git remote rename <old> <new>" +msgstr "git remote rename <tên-cũ> <tên-mới>" + +#: builtin/remote.c:14 builtin/remote.c:37 +msgid "git remote remove <name>" +msgstr "git remote remove <tên>" + +#: builtin/remote.c:15 +msgid "git remote set-head <name> (-a | -d | <branch>)" +msgstr "git remote set-head <tên> (-a | -d | <nhánh>)" + +#: builtin/remote.c:16 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "git remote [-v | --verbose] show [-n] <tên>" + +#: builtin/remote.c:17 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "git remote prune [-n | --dry-run] <tên>" + +#: builtin/remote.c:18 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" +"git remote [-v | --verbose] update [-p | --prune] [(<nhóm> | <máy-chủ>)...]" + +#: builtin/remote.c:19 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "git remote set-branches [--add] <tên> <nhánh>..." + +#: builtin/remote.c:20 builtin/remote.c:68 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "git remote set-url [--push] <tên> <url-mới> [<url-cũ>]" + +#: builtin/remote.c:21 builtin/remote.c:69 +msgid "git remote set-url --add <name> <newurl>" +msgstr "git remote set-url --add <tên> <url-mới>" + +#: builtin/remote.c:22 builtin/remote.c:70 +msgid "git remote set-url --delete <name> <url>" +msgstr "git remote set-url --delete <tên> <url>" + +#: builtin/remote.c:27 +msgid "git remote add [<options>] <name> <url>" +msgstr "git remote add [<các-tùy-chọn>] <tên> <url>" + +#: builtin/remote.c:42 +msgid "git remote set-head <name> (-a | -d | <branch>])" +msgstr "git remote set-head <tên> (-a | -d | <nhánh>])" + +#: builtin/remote.c:47 +msgid "git remote set-branches <name> <branch>..." +msgstr "git remote set-branches <tên> <nhánh>..." + +#: builtin/remote.c:48 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "git remote set-branches --add <tên> <nhánh>..." + +#: builtin/remote.c:53 +msgid "git remote show [<options>] <name>" +msgstr "git remote show [<các-tùy-chọn>] <tên>" + +#: builtin/remote.c:58 +msgid "git remote prune [<options>] <name>" +msgstr "git remote prune [<các-tùy-chọn>] <tên>" + +#: builtin/remote.c:63 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "git remote update [<các-tùy-chọn>] [<nhóm> | <máy-chủ>]..." + #: builtin/remote.c:98 #, c-format msgid "Updating %s" @@ -4573,6 +7272,35 @@ msgstr "" msgid "unknown mirror argument: %s" msgstr "không hiểu tham số máy bản sao (mirror): %s" +#: builtin/remote.c:163 +msgid "fetch the remote branches" +msgstr "lấy về (fetch) các nhánh từ máy chủ" + +#: builtin/remote.c:165 +msgid "import all tags and associated objects when fetching" +msgstr "" +"nhập vào tất cả các đối tượng thẻ và thành phần liên quan khi lấy về (fetch)" + +#: builtin/remote.c:168 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "hoặc không lấy về (fetch) bất kỳ thẻ nào (--no-tags)" + +#: builtin/remote.c:170 +msgid "branch(es) to track" +msgstr "các nhánh theo vết" + +#: builtin/remote.c:171 +msgid "master branch" +msgstr "nhánh master" + +#: builtin/remote.c:172 +msgid "push|fetch" +msgstr "push|fetch" + +#: builtin/remote.c:173 +msgid "set up remote as a mirror to push to or fetch from" +msgstr "đặt máy chủ (remote) như là một máy bản sao để push hay fetch từ đó" + #: builtin/remote.c:185 msgid "specifying a master branch makes no sense with --mirror" msgstr "đang chỉ định một nhánh master không hợp lý với tùy chọn --mirror" @@ -4589,12 +7317,12 @@ msgstr "máy chủ %s đã tồn tại rồi." #: builtin/remote.c:199 builtin/remote.c:650 #, c-format msgid "'%s' is not a valid remote name" -msgstr "'%s' không phải tên máy chủ hợp lệ" +msgstr "`%s' không phải tên máy chủ hợp lệ" #: builtin/remote.c:243 #, c-format msgid "Could not setup master '%s'" -msgstr "Không thể cài đặt nhánh master '%s'" +msgstr "Không thể cài đặt nhánh master `%s'" #: builtin/remote.c:299 #, c-format @@ -4617,7 +7345,7 @@ msgstr "(xoá)" #: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 #, c-format msgid "Could not append '%s' to '%s'" -msgstr "Không thể nối thêm '%s' vào '%s'" +msgstr "Không thể nối thêm `%s' vào `%s'" #: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 #, c-format @@ -4627,12 +7355,12 @@ msgstr "Không có máy chủ nào như thế: %s" #: builtin/remote.c:656 #, c-format msgid "Could not rename config section '%s' to '%s'" -msgstr "Không thể đổi tên chương (section) cấu hình từ '%s' thành '%s'" +msgstr "Không thể đổi tên chương (section) cấu hình từ `%s' thành `%s'" #: builtin/remote.c:662 builtin/remote.c:799 #, c-format msgid "Could not remove config section '%s'" -msgstr "Không thể gỡ bỏ chương (section) cấu hình '%s'" +msgstr "Không thể gỡ bỏ chương (section) cấu hình `%s'" #: builtin/remote.c:677 #, c-format @@ -4648,12 +7376,12 @@ msgstr "" #: builtin/remote.c:683 #, c-format msgid "Could not append '%s'" -msgstr "Không thể nối thêm '%s'" +msgstr "Không thể nối thêm `%s'" #: builtin/remote.c:694 #, c-format msgid "Could not set '%s'" -msgstr "Không thể đặt '%s'" +msgstr "Không thể đặt `%s'" #: builtin/remote.c:716 #, c-format @@ -4692,11 +7420,11 @@ msgstr " mới (lần lấy về tiếp theo sẽ lưu trong remotes/%s)" #: builtin/remote.c:946 msgid " tracked" -msgstr " bị theo vết" +msgstr " được theo vết" #: builtin/remote.c:948 msgid " stale (use 'git remote prune' to remove)" -msgstr " cũ (dùng 'git remote prune' để gỡ bỏ)" +msgstr " cũ (dùng `git remote prune' để gỡ bỏ)" #: builtin/remote.c:950 msgid " ???" @@ -4770,6 +7498,10 @@ msgstr " %-*s ép buộc thành %s" msgid " %-*s pushes to %s" msgstr " %-*s push tới %s" +#: builtin/remote.c:1091 +msgid "do not query remotes" +msgstr "không truy vấn các máy chủ" + #: builtin/remote.c:1118 #, c-format msgid "* remote %s" @@ -4814,19 +7546,27 @@ msgstr " (trạng thái không được yêu cầu)" #: builtin/remote.c:1163 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" -msgstr[0] " Nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" -msgstr[1] " Những nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" +msgstr[0] " Nhánh nội bộ đã được cấu hình cho lệnh `git pull':" +msgstr[1] " Những nhánh nội bộ đã được cấu hình cho lệnh `git pull':" #: builtin/remote.c:1171 msgid " Local refs will be mirrored by 'git push'" -msgstr " refs nội bộ sẽ được phản chiếu bởi lệnh 'git push'" +msgstr " refs nội bộ sẽ được phản chiếu bởi lệnh `git push'" #: builtin/remote.c:1178 #, c-format msgid " Local ref configured for 'git push'%s:" msgid_plural " Local refs configured for 'git push'%s:" -msgstr[0] " Tham chiếu nội bộ được cấu hình cho lệnh 'git push'%s:" -msgstr[1] " Những tham chiếu nội bộ được cấu hình cho lệnh 'git push'%s:" +msgstr[0] " Tham chiếu nội bộ được cấu hình cho lệnh `git push'%s:" +msgstr[1] " Những tham chiếu nội bộ được cấu hình cho lệnh `git push'%s:" + +#: builtin/remote.c:1199 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "đặt refs/remotes/<tên>/HEAD cho phù hợp với máy chủ" + +#: builtin/remote.c:1201 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "xóa refs/remotes/<tên>/HEAD" #: builtin/remote.c:1216 msgid "Cannot determine remote HEAD" @@ -4881,15 +7621,35 @@ msgstr " * [nên xén bớt] %s" msgid " * [pruned] %s" msgstr " *[đã xén bớ] %s" +#: builtin/remote.c:1321 +msgid "prune remotes after fetching" +msgstr "cắt máy chủ sau khi lấy về" + #: builtin/remote.c:1387 builtin/remote.c:1461 #, c-format msgid "No such remote '%s'" -msgstr "Không có máy chủ nào có tên '%s'" +msgstr "Không có máy chủ nào có tên `%s'" + +#: builtin/remote.c:1407 +msgid "add branch" +msgstr "thêm nhánh" #: builtin/remote.c:1414 msgid "no remote specified" msgstr "chưa chỉ ra máy chủ nào" +#: builtin/remote.c:1436 +msgid "manipulate push URLs" +msgstr "đẩy các `URL' bằng tay" + +#: builtin/remote.c:1438 +msgid "add URL" +msgstr "thêm URL" + +#: builtin/remote.c:1440 +msgid "delete URLs" +msgstr "xóa URLs" + #: builtin/remote.c:1447 msgid "--add --delete doesn't make sense" msgstr "--add --delete không hợp lý" @@ -4908,6 +7668,56 @@ msgstr "Không tìm thấy URL như vậy: %s" msgid "Will not delete all non-push URLs" msgstr "Sẽ không xóa những địa chỉ URL không-push" +#: builtin/remote.c:1569 +msgid "be verbose; must be placed before a subcommand" +msgstr "chi tiết; phải được đặt trước một lệnh-con" + +#: builtin/replace.c:17 +msgid "git replace [-f] <object> <replacement>" +msgstr "git replace [-f] <đối-tượng> <thay-thế>" + +#: builtin/replace.c:18 +msgid "git replace -d <object>..." +msgstr "git replace -d <đối tượng>..." + +#: builtin/replace.c:19 +msgid "git replace -l [<pattern>]" +msgstr "git replace -l [<mẫu>]" + +#: builtin/replace.c:118 +msgid "list replace refs" +msgstr "liệt kê các refs thay thế" + +#: builtin/replace.c:119 +msgid "delete replace refs" +msgstr "xóa tham chiếu (refs) thay thế" + +#: builtin/replace.c:120 +msgid "replace the ref if it exists" +msgstr "thay thế tham chiếu (ref) nếu nó đã sẵn có" + +#: builtin/rerere.c:11 +msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" +msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]" + +#: builtin/rerere.c:56 +msgid "register clean resolutions in index" +msgstr "sổ ghi dọn sạch các phân giải trong bản mục lục" + +#: builtin/reset.c:25 +msgid "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" +msgstr "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" + +#: builtin/reset.c:26 +msgid "git reset [-q] <commit> [--] <paths>..." +msgstr "git reset [-q] <commit> [--] <các-đường-dẫn>..." + +#: builtin/reset.c:27 +msgid "git reset --patch [<commit>] [--] [<paths>...]" +msgstr "git reset --patch [<commit>] [--] [<các-đường-dẫn>...]" + #: builtin/reset.c:33 msgid "mixed" msgstr "pha trộn" @@ -4963,10 +7773,30 @@ msgstr "Những thay đổi bị bỏ trạng thái (stage) sau khi reset:" msgid "Cannot do a %s reset in the middle of a merge." msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn." +#: builtin/reset.c:238 +msgid "be quiet, only report errors" +msgstr "làm việc ở chế độ im lặng, chỉ hiển thị khi có lỗi" + +#: builtin/reset.c:240 +msgid "reset HEAD and index" +msgstr "đặt lại (reset) HEAD và bảng mục lục" + +#: builtin/reset.c:241 +msgid "reset only HEAD" +msgstr "chỉ đặt lại (reset) HEAD" + +#: builtin/reset.c:243 builtin/reset.c:245 +msgid "reset HEAD, index and working tree" +msgstr "đặt lại HEAD, bảng mục lục và cây làm việc" + +#: builtin/reset.c:247 +msgid "reset HEAD but keep local changes" +msgstr "đặt lại HEAD nhưng giữ lại các thay đổi nội bộ" + #: builtin/reset.c:303 #, 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/reset.c:308 msgid "--patch is incompatible with --{hard,mixed,soft}" @@ -4975,7 +7805,7 @@ msgstr "--patch xung khắc với --{hard,mixed,soft}" #: builtin/reset.c:317 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "" -"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh 'git " +"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh `git " "reset -- <đường_dẫn>'." #: builtin/reset.c:319 @@ -4991,32 +7821,134 @@ msgstr "%s reset không được phép trên kho bare (trên máy chủ)" #: builtin/reset.c:347 #, c-format msgid "Could not reset index file to revision '%s'." -msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét lại '%s'." +msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét lại `%s'." + +#: builtin/rev-parse.c:339 +msgid "git rev-parse --parseopt [options] -- [<args>...]" +msgstr "git rev-parse --parseopt [các-tùy-chọn] -- [<th.số>...]" + +#: builtin/rev-parse.c:344 +msgid "keep the `--` passed as an arg" +msgstr "giữ '--' chuyển qua làm tham số" + +#: builtin/rev-parse.c:346 +msgid "stop parsing after the first non-option argument" +msgstr "dừng phân tích sau đối số đầu tiên không có tùy chọn" + +#: builtin/rev-parse.c:464 +msgid "" +"git rev-parse --parseopt [options] -- [<args>...]\n" +" or: git rev-parse --sq-quote [<arg>...]\n" +" or: git rev-parse [options] [<arg>...]\n" +"\n" +"Run \"git rev-parse --parseopt -h\" for more information on the first usage." +msgstr "" +"git rev-parse --parseopt [các-tùy-chọn] -- [<đ.số>...]\n" +" or: git rev-parse --sq-quote [<đ.số>...]\n" +" or: git rev-parse [các-tùy-chọn] [<đ.số>...]\n" +"\n" +"Chạy lệnh \"git rev-parse --parseopt -h\" để có thêm thông tin về cách dùng." + +#: builtin/revert.c:22 +msgid "git revert [options] <commit-ish>" +msgstr "git revert [các-tùy-chọn] <commit-ish>" + +#: builtin/revert.c:23 +msgid "git revert <subcommand>" +msgstr "git revert <lệnh-con>" + +#: builtin/revert.c:28 +msgid "git cherry-pick [options] <commit-ish>" +msgstr "git cherry-pick [các-tùy-chọn] <commit-ish>" + +#: builtin/revert.c:29 +msgid "git cherry-pick <subcommand>" +msgstr "git cherry-pick <lệnh-con>" #: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s không thể được sử dụng với %s" -#: builtin/revert.c:131 +#: builtin/revert.c:103 +msgid "end revert or cherry-pick sequence" +msgstr "kết thúc cherry-pick hay revert liên tiếp nhau" + +#: builtin/revert.c:104 +msgid "resume revert or cherry-pick sequence" +msgstr "phục hồi lại cherry-pick hay revert liên tiếp nhau" + +#: builtin/revert.c:105 +msgid "cancel revert or cherry-pick sequence" +msgstr "không cherry-pick hay revert liên tiếp nhau" + +#: builtin/revert.c:106 +msgid "don't automatically commit" +msgstr "không commit một cách tự động." + +#: builtin/revert.c:107 +msgid "edit the commit message" +msgstr "sửa lại chú thích cho commit" + +#: builtin/revert.c:110 +msgid "parent number" +msgstr "số của cha mẹ" + +#: builtin/revert.c:112 +msgid "merge strategy" +msgstr "chiến lược hòa trộn" + +#: builtin/revert.c:113 +msgid "option" +msgstr "tùy chọn" + +#: builtin/revert.c:114 +msgid "option for merge strategy" +msgstr "tùy chọn cho chiến lược hòa trộn" + +#: builtin/revert.c:125 +msgid "append commit name" +msgstr "nối thêm tên lần chuyển giao (commit)" + +#: builtin/revert.c:126 +msgid "allow fast-forward" +msgstr "cho phép fast-forward" + +#: builtin/revert.c:127 +msgid "preserve initially empty commits" +msgstr "cấm khởi tạo lần chuyển giao trống rỗng" + +#: builtin/revert.c:128 +msgid "allow commits with empty messages" +msgstr "chấp nhận chuyển giao (commit) mà không ghi chú gì" + +#: builtin/revert.c:129 +msgid "keep redundant, empty commits" +msgstr "giữ lại các lần chuyển giao dư thừa, rỗng" + +#: builtin/revert.c:133 msgid "program error" msgstr "lỗi chương trình" -#: builtin/revert.c:221 +#: builtin/revert.c:223 msgid "revert failed" msgstr "revert gặp lỗi" -#: builtin/revert.c:236 +#: builtin/revert.c:238 msgid "cherry-pick failed" msgstr "cherry-pick gặp lỗi" +#: builtin/rm.c:14 +msgid "git rm [options] [--] <file>..." +msgstr "git rm [các-tùy-chọn] [--] <tập-tin>..." + #: builtin/rm.c:109 #, c-format msgid "" "'%s' has staged content different from both the file and the HEAD\n" "(use -f to force removal)" msgstr "" -"'%s' có nội dung được lưu trạng thái khác biệt từ cả tập tin và cả HEAD\n" +"`%s' có nội dung được lưu trạng thái khác biệt từ cả tập tin và cả HEAD\n" "(dùng tùy chọn -f để ép buộc gỡ bỏ)" #: builtin/rm.c:115 @@ -5025,7 +7957,7 @@ msgid "" "'%s' has changes staged in the index\n" "(use --cached to keep the file, or -f to force removal)" msgstr "" -"'%s' có các thay đổi được lưu trạng thái trong bảng mục lục\n" +"`%s' có các thay đổi được lưu trạng thái trong bảng mục lục\n" "(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)" #: builtin/rm.c:119 @@ -5034,28 +7966,244 @@ msgid "" "'%s' has local modifications\n" "(use --cached to keep the file, or -f to force removal)" msgstr "" -"'%s' có các thay đổi nội bộ\n" +"`%s' có các thay đổi nội bộ\n" "(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)" +#: builtin/rm.c:134 +msgid "do not list removed files" +msgstr "không liệt kê các tập tin đã gỡ bỏ" + +#: builtin/rm.c:135 +msgid "only remove from the index" +msgstr "chỉ gỡ bỏ từ mục lục" + +#: builtin/rm.c:136 +msgid "override the up-to-date check" +msgstr "ghi đè lên kiểm tra cập nhật" + +#: builtin/rm.c:137 +msgid "allow recursive removal" +msgstr "cho phép gỡ bỏ đệ qui" + +#: builtin/rm.c:139 +msgid "exit with a zero status even if nothing matched" +msgstr "thoát ra với trạng thái khác không thậm chí nếu không có gì khớp" + #: builtin/rm.c:194 #, c-format msgid "not removing '%s' recursively without -r" -msgstr "không thể gỡ bỏ '%s' một cách đệ qui mà không có tùy chọn -r" +msgstr "không thể gỡ bỏ `%s' một cách đệ qui mà không có tùy chọn -r" #: builtin/rm.c:230 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm: không thể gỡ bỏ %s" +#: builtin/shortlog.c:13 +msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" +msgstr "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" + #: builtin/shortlog.c:157 #, c-format msgid "Missing author: %s" msgstr "Thiếu tên tác giả: %s" +#: builtin/shortlog.c:253 +msgid "sort output according to the number of commits per author" +msgstr "sắp xếp kết xuất tuân theo số lượng chuyển giao trên mỗi tác giả" + +#: builtin/shortlog.c:255 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "Chặn mọi mô tả lần chuyển giao, chỉ đưa ra số lượng lần chuyển giao" + +#: builtin/shortlog.c:257 +msgid "Show the email address of each author" +msgstr "Hiển thị thư điện tử cho từng tác giả" + +#: builtin/shortlog.c:258 +msgid "w[,i1[,i2]]" +msgstr "w[,i1[,i2]]" + +#: builtin/shortlog.c:259 +msgid "Linewrap output" +msgstr "Ngắt dòng khi quá dài" + +#: builtin/show-branch.c:9 +msgid "" +"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--" +"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --" +"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | " +"<glob>)...]" +msgstr "" +"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--" +"current] [--color[=<khi>] | --no-color] [--sparse] [--more=<n> | --list | --" +"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | " +"<glob>)...]" + +#: builtin/show-branch.c:10 +msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "git show-branch (-g|--reflog)[=<n>[,<nền>]] [--list] [<ref>]" + +#: builtin/show-branch.c:651 +msgid "show remote-tracking and local branches" +msgstr "hiển thị các nhánh remote-tracking và nội bộ" + +#: builtin/show-branch.c:653 +msgid "show remote-tracking branches" +msgstr "hiển thị các nhánh remote-tracking" + +#: builtin/show-branch.c:655 +msgid "color '*!+-' corresponding to the branch" +msgstr "màu '*!+-' tương ứng với nhánh" + +#: builtin/show-branch.c:657 +msgid "show <n> more commits after the common ancestor" +msgstr "hiển thị thêm <n> lần chuyển giao sau cha mẹ chung" + +#: builtin/show-branch.c:659 +msgid "synonym to more=-1" +msgstr "đồng nghĩa với more=-1" + +#: builtin/show-branch.c:660 +msgid "suppress naming strings" +msgstr "chặn các chuỗi đặt tên" + +#: builtin/show-branch.c:662 +msgid "include the current branch" +msgstr "bao gồm nhánh hiện hành" + +#: builtin/show-branch.c:664 +msgid "name commits with their object names" +msgstr "đặt tên các lần chuyển giao bằng các tên của đối tượng của chúng" + +#: builtin/show-branch.c:666 +msgid "show possible merge bases" +msgstr "hiển thị mọi cơ sở có thể dùng để hòa trộn" + +#: builtin/show-branch.c:668 +msgid "show refs unreachable from any other ref" +msgstr "hiển thị các tham chiếu không thể được đọc bởi bất kỳ tham chiếu khác" + +#: builtin/show-branch.c:670 +msgid "show commits in topological order" +msgstr "hiển thị các lần chuyển giao theo thứ tự tôpô" + +#: builtin/show-branch.c:672 +msgid "show only commits not on the first branch" +msgstr "chỉ hiển thị các lần chuyển giao không nằm trên nhánh đầu tiên" + +#: builtin/show-branch.c:674 +msgid "show merges reachable from only one tip" +msgstr "hiển thị các lần hòa trộn có thể đọc được chỉ từ một đầu mút" + +#: builtin/show-branch.c:676 +msgid "show commits where no parent comes before its children" +msgstr "hiển thị các lần chuyển giao nơi mà cha mẹ đến trước con của nó" + +#: builtin/show-branch.c:678 +msgid "<n>[,<base>]" +msgstr "<n>[,<cơ sở>]" + +#: builtin/show-branch.c:679 +msgid "show <n> most recent ref-log entries starting at base" +msgstr "hiển thị <n> các mục `ref-log' gần nhất kể từ nền (base)" + +#: builtin/show-ref.c:10 +msgid "" +"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash" +"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] " +msgstr "" +"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash" +"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mẫu*] " + +#: builtin/show-ref.c:11 +msgid "git show-ref --exclude-existing[=pattern] < ref-list" +msgstr "git show-ref --exclude-existing[=mẫu] < ref-list" + +#: builtin/show-ref.c:182 +msgid "only show tags (can be combined with heads)" +msgstr "chỉ hiển thị thẻ (có thể tổ hợp cùng với đầu)" + +#: builtin/show-ref.c:183 +msgid "only show heads (can be combined with tags)" +msgstr "chỉ hiển thị đầu (có thể tổ hợp cùng với thẻ)" + +#: builtin/show-ref.c:184 +msgid "stricter reference checking, requires exact ref path" +msgstr "" +"việc kiểm tra tham chiếu chính xác, đòi hỏi chính xác đường dẫn tham chiếu " +"(ref)" + +#: builtin/show-ref.c:187 builtin/show-ref.c:189 +msgid "show the HEAD reference" +msgstr "hiển thị tham chiếu của HEAD" + +#: builtin/show-ref.c:191 +msgid "dereference tags into object IDs" +msgstr "bãi bỏ tham chiếu các thẻ thành ra các ID đối tượng" + +#: builtin/show-ref.c:193 +msgid "only show SHA1 hash using <n> digits" +msgstr "chỉ hiển thị mã băm SHA1 sử dụng <n> chữ số" + +#: builtin/show-ref.c:197 +msgid "do not print results to stdout (useful with --verify)" +msgstr "" +"không hiển thị kết quả ra đầu ra chuẩn (stdout) (chỉ hữu dụng với --verify)" + +#: builtin/show-ref.c:199 +msgid "show refs from stdin that aren't in local repository" +msgstr "" +"hiển thị các tham chiếu (refs) từ đầu vào tiêu chuẩn (stdin) cái mà không ở " +"kho nội bộ" + +#: builtin/symbolic-ref.c:7 +msgid "git symbolic-ref [options] name [ref]" +msgstr "git symbolic-ref [các-tùy-chọn] tên [t.chiếu]" + +#: builtin/symbolic-ref.c:38 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "" +"chặn các thông tin lỗi cho các tham chiếu (refs) `non-symbolic' (bị tách ra)" + +#: builtin/symbolic-ref.c:39 +msgid "shorten ref output" +msgstr "làm ngắn kết xuất ref (tham chiếu)" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason" +msgstr "lý do" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason of the update" +msgstr "lý do cập nhật" + +#: builtin/tag.c:22 +msgid "" +"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]" +msgstr "" +"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <tập-tin>] <tên-thẻ> [<head>]" + +#: builtin/tag.c:23 +msgid "git tag -d <tagname>..." +msgstr "git tag -d <tên-thẻ>..." + +#: builtin/tag.c:24 +msgid "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n" +"\t\t[<pattern>...]" +msgstr "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <đối-tượng>] \n" +"\t\t[<mẫu>...]" + +#: builtin/tag.c:26 +msgid "git tag -v <tagname>..." +msgstr "git tag -v <tên-thẻ>..." + #: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" -msgstr "đối tượng dị hình tại '%s'" +msgstr "đối tượng dị hình tại `%s'" #: builtin/tag.c:207 #, c-format @@ -5065,17 +8213,17 @@ msgstr "tên thẻ quá dài: %.*s..." #: builtin/tag.c:212 #, c-format msgid "tag '%s' not found." -msgstr "không tìm thấy tìm thấy thẻ '%s'." +msgstr "không tìm thấy tìm thấy thẻ `%s'." #: builtin/tag.c:227 #, c-format msgid "Deleted tag '%s' (was %s)\n" -msgstr "Thẻ đã bị xóa '%s' (trước là %s)\n" +msgstr "Thẻ đã bị xóa `%s' (trước là %s)\n" #: builtin/tag.c:239 #, c-format msgid "could not verify the tag '%s'" -msgstr "không thể thẩm tra thẻ '%s'" +msgstr "không thể thẩm tra thẻ `%s'" #: builtin/tag.c:249 msgid "" @@ -5139,7 +8287,63 @@ msgstr "chuyển đến 'points-at' yêu cần một đối tượng" #: builtin/tag.c:427 #, c-format msgid "malformed object name '%s'" -msgstr "tên đối tượng dị hình '%s'" +msgstr "tên đối tượng dị hình `%s'" + +#: builtin/tag.c:447 +msgid "list tag names" +msgstr "chỉ liệt kê tên các thẻ" + +#: builtin/tag.c:449 +msgid "print <n> lines of each tag message" +msgstr "hiển thị <n> dòng cho mỗi ghi chú" + +#: builtin/tag.c:451 +msgid "delete tags" +msgstr "xóa thẻ" + +#: builtin/tag.c:452 +msgid "verify tags" +msgstr "thẩm tra thẻ" + +#: builtin/tag.c:454 +msgid "Tag creation options" +msgstr "Tùy chọn tạo tag" + +#: builtin/tag.c:456 +msgid "annotated tag, needs a message" +msgstr "để chú giải cho thẻ, cần một lời ghi chú" + +#: builtin/tag.c:458 +msgid "tag message" +msgstr "tin nhắn cho thẻ (tag)" + +#: builtin/tag.c:460 +msgid "annotated and GPG-signed tag" +msgstr "thẻ chú giải và ký kiểu GPG" + +#: builtin/tag.c:464 +msgid "use another key to sign the tag" +msgstr "dùng kháo khác để ký thẻ" + +#: builtin/tag.c:465 +msgid "replace the tag if exists" +msgstr "thay thế nếu tag đó đã có trước" + +#: builtin/tag.c:466 +msgid "show tag list in columns" +msgstr "hiển thị danh sách thẻ trong các cột" + +#: builtin/tag.c:468 +msgid "Tag listing options" +msgstr "Các tùy chọn liệt kê thẻ" + +#: builtin/tag.c:471 +msgid "print only tags that contain the commit" +msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao" + +#: builtin/tag.c:477 +msgid "print only tags of the object" +msgstr "chỉ hiển thị các thẻ của đối tượng" #: builtin/tag.c:506 msgid "--column and -n are incompatible" @@ -5168,12 +8372,12 @@ msgstr "quá nhiều đối số" #: builtin/tag.c:561 #, c-format msgid "'%s' is not a valid tag name." -msgstr "'%s' không phải thẻ hợp lệ." +msgstr "`%s' không phải thẻ hợp lệ." #: builtin/tag.c:566 #, c-format msgid "tag '%s' already exists" -msgstr "Thẻ '%s' đã tồn tại rồi" +msgstr "Thẻ `%s' đã tồn tại rồi" #: builtin/tag.c:584 #, c-format @@ -5188,28 +8392,188 @@ msgstr "%s: không thể cập nhật ref (tham chiếu)" #: builtin/tag.c:588 #, c-format msgid "Updated tag '%s' (was %s)\n" -msgstr "Thẻ đã cập nhật '%s' (cũ là %s)\n" +msgstr "Thẻ đã cập nhật `%s' (cũ là %s)\n" -#: git.c:16 -msgid "See 'git help <command>' for more information on a specific command." +#: builtin/update-index.c:401 +msgid "git update-index [options] [--] [<file>...]" +msgstr "git update-index [các-tùy-chọn] [<tập-tin>...]" + +#: builtin/update-index.c:717 +msgid "continue refresh even when index needs update" +msgstr "tiếp tục làm mới ngay cả khi bảng mục lục cần được cập nhật" + +#: builtin/update-index.c:720 +msgid "refresh: ignore submodules" +msgstr "refresh: lờ đi mô-đun-con" + +#: builtin/update-index.c:723 +msgid "do not ignore new files" +msgstr "không bỏ qua các tập tin mới tạo" + +#: builtin/update-index.c:725 +msgid "let files replace directories and vice-versa" +msgstr "để các tập tin thay thế các thư mục và `vice-versa'" + +#: builtin/update-index.c:727 +msgid "notice files missing from worktree" +msgstr "thông báo các tập-tin thiếu trong thư-mục làm việc" + +#: builtin/update-index.c:729 +msgid "refresh even if index contains unmerged entries" msgstr "" -"Chạy lệnh 'git help <tên-lệnh>' để có thêm thông tin về lệnh được chỉ ra." +"làm tươi mới thậm chí khi bảng mục lục chứa các mục tin chưa được hòa trộn" -#: parse-options.h:133 parse-options.h:235 -msgid "n" -msgstr "n" +#: builtin/update-index.c:732 +msgid "refresh stat information" +msgstr "lấy lại thông tin thống kê" -#: parse-options.h:141 -msgid "time" -msgstr "thời-gian" +#: builtin/update-index.c:736 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "giống --refresh, nhưng bỏ qua các cài đặt `assume-unchanged'" -#: parse-options.h:149 -msgid "file" -msgstr "tập-tin" +#: builtin/update-index.c:740 +msgid "<mode> <object> <path>" +msgstr "<mode> <đối tượng> <đường dẫn>" -#: parse-options.h:151 -msgid "when" -msgstr "khi" +#: builtin/update-index.c:741 +msgid "add the specified entry to the index" +msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục" + +#: builtin/update-index.c:745 +msgid "(+/-)x" +msgstr "(+/-)x" + +#: builtin/update-index.c:746 +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/update-index.c:750 +msgid "mark files as \"not changing\"" +msgstr "Đánh dấu các tập tin là \"không thay đổi\"" + +#: builtin/update-index.c:753 +msgid "clear assumed-unchanged bit" +msgstr "xóa bít assumed-unchanged" + +#: builtin/update-index.c:756 +msgid "mark files as \"index-only\"" +msgstr "đánh dấu các tập tin là `chỉ-đọc'" + +#: builtin/update-index.c:759 +msgid "clear skip-worktree bit" +msgstr "xóa bít skip-worktree" + +#: builtin/update-index.c:762 +msgid "add to index only; do not add content to object database" +msgstr "" +"chỉ thêm vào bảng mục lục; không thêm nội dung vào cơ sở dữ liệu đối tượng" + +#: builtin/update-index.c:764 +msgid "remove named paths even if present in worktree" +msgstr "" +"gỡ bỏ các đường dẫn được đặt tên thậm chí cả khi nó hiện diện trong thư mục " +"làm việc" + +#: builtin/update-index.c:766 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "với tùy chọn --stdin: các dòng đầu vào được chấm dứt bởi ký tự null" + +#: builtin/update-index.c:768 +msgid "read list of paths to be updated from standard input" +msgstr "đọc danh sách đường dẫn cần cập nhật từ đầu vào tiêu chuẩn" + +#: builtin/update-index.c:772 +msgid "add entries from standard input to the index" +msgstr "không thể đọc các mục từ đầu vào tiêu chuẩn vào bảng mục lục" + +#: builtin/update-index.c:776 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "phục hồi các trạng thái #2 và #3 cho các đường dẫn được liệt kê" + +#: builtin/update-index.c:780 +msgid "only update entries that differ from HEAD" +msgstr "chỉ cập nhật các mục tin mà nó khác biệt so với HEAD" + +#: builtin/update-index.c:784 +msgid "ignore files missing from worktree" +msgstr "bỏ qua các tập-tin thiếu trong thư-mục làm việc" + +#: builtin/update-index.c:787 +msgid "report actions to standard output" +msgstr "báo cáo các thao tác ra thiết bị xuất chuẩn" + +#: builtin/update-index.c:789 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "(cho `porcelains') quên các xung đột chưa được giải quyết đã ghi" + +#: builtin/update-index.c:793 +msgid "write index in this format" +msgstr "ghi mục lục ở định dạng này" + +#: builtin/update-ref.c:7 +msgid "git update-ref [options] -d <refname> [<oldval>]" +msgstr "git update-ref [các-tùy-chọn] -d <refname> [<biến-cũ>]" + +#: builtin/update-ref.c:8 +msgid "git update-ref [options] <refname> <newval> [<oldval>]" +msgstr "git update-ref [các-tùy-chọn] <refname> <biến-mới> [<biến-cũ>]" + +#: builtin/update-ref.c:19 +msgid "delete the reference" +msgstr "xóa tham chiếu" + +#: builtin/update-ref.c:21 +msgid "update <refname> not the one it points to" +msgstr "cập nhật <tên-tham-chiếu> không phải cái nó chỉ tới" + +#: builtin/update-server-info.c:6 +msgid "git update-server-info [--force]" +msgstr "git update-server-info [--force]" + +#: builtin/update-server-info.c:14 +msgid "update the info files from scratch" +msgstr "cập nhật các tập tin thông tin từ điểm xuất phát" + +#: builtin/verify-pack.c:56 +msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..." +msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <gói>..." + +#: builtin/verify-pack.c:66 +msgid "verbose" +msgstr "chi tiết" + +#: builtin/verify-pack.c:68 +msgid "show statistics only" +msgstr "chỉ hiển thị thống kê" + +#: builtin/verify-tag.c:17 +msgid "git verify-tag [-v|--verbose] <tag>..." +msgstr "git verify-tag [-v|--verbose] <thẻ>..." + +#: builtin/verify-tag.c:73 +msgid "print tag contents" +msgstr "hiển thị nội dung của thẻ" + +#: builtin/write-tree.c:13 +msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" +msgstr "git write-tree [--missing-ok] [--prefix=<tiền-tố>/]" + +#: builtin/write-tree.c:26 +msgid "<prefix>/" +msgstr "<iền tố>/" + +#: builtin/write-tree.c:27 +msgid "write tree object for a subdirectory <prefix>" +msgstr "ghi đối tượng cây (tree) cho <tiền tố> thư mục con" + +#: builtin/write-tree.c:30 +msgid "only useful for debugging" +msgstr "chỉ hữu ích khi cần gỡ lỗi" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "" +"Chạy lệnh `git help <tên-lệnh>' để có thêm thông tin về lệnh được chỉ ra." #: parse-options.h:156 msgid "no-op (backward compatibility)" @@ -5296,7 +8660,7 @@ msgstr "" #: common-cmds.h:23 msgid "Forward-port local commits to the updated upstream head" msgstr "" -"Forward-port những lần chuyển giao nội bộ tới head dòng ngược đã cập nhật" +"Forward-port những lần chuyển giao nội bộ tới head thượng nguồn đã cập nhật" #: common-cmds.h:24 msgid "Reset current HEAD to the specified state" @@ -5460,7 +8824,7 @@ msgid "" "If there is nothing left to stage, chances are that something else\n" "already introduced the same changes; you might want to skip this patch." msgstr "" -"Không có thay đổi nào - bạn đã quên sử dụng lệnh 'git add' à?\n" +"Không có thay đổi nào - bạn đã quên sử dụng lệnh `git add' à?\n" "Nếu ở đây không có gì còn lại stage, tình cờ là có một số thứ khác\n" "đã 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." @@ -5471,7 +8835,7 @@ msgid "" "did you forget to use 'git add'?" msgstr "" "Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục của mình\n" -"bạn đã quên sử dụng lệnh 'git add' à?" +"bạn đã quên sử dụng lệnh `git add' à?" #: git-am.sh:845 msgid "No changes -- Patch already applied." @@ -5482,6 +8846,15 @@ msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồ msgid "Patch failed at $msgnum $FIRSTLINE" msgstr "Vá gặp lỗi tại $msgnum $FIRSTLINE" +#: git-am.sh:858 +#, sh-format +msgid "" +"The copy of the patch that failed is found in:\n" +" $dotest/patch" +msgstr "" +"Bản sao chép của miếng vá mà nó gặp lỗi thì được tìm thấy trong:\n" +" $dotest/patch" + #: git-am.sh:876 msgid "applying to an empty history" msgstr "áp dụng vào một lịch sử trống rỗng" @@ -5516,7 +8889,7 @@ msgstr "HEAD sai - Tôi cần một HEAD" msgid "" "Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." msgstr "" -"Việc checkout '$start_head' gặp lỗi. Hãy thử 'git bisect reset " +"Việc checkout '$start_head' gặp lỗi. Hãy thử `git bisect reset " "<nhánh_hợp_lệ>'." #: git-bisect.sh:140 @@ -5548,7 +8921,7 @@ msgstr "Đầu vào rev sai: $rev" #: git-bisect.sh:250 msgid "'git bisect bad' can take only one argument." -msgstr "'git bisect bad' có thể lấy chỉ một đối số." +msgstr "`git bisect bad' có thể lấy chỉ một đối số." #. have bad but not good. we could bisect although #. this is less optimum. @@ -5599,7 +8972,7 @@ msgid "" "Try 'git bisect reset <commit>'." msgstr "" "Không thể check-out HEAD nguyên thủy của '$branch'.\n" -"Hãy thử 'git bisect reset <lần-chuyển-giao>'." +"Hãy thử `git bisect reset <lần-chuyển-giao>'." #: git-bisect.sh:390 msgid "No logfile given" @@ -5652,8 +9025,8 @@ msgid "" "as appropriate to mark resolution, or use 'git commit -a'." msgstr "" "Pull là không thể được bởi vì bạn có những tập tin chưa được hòa trộn.\n" -"Xin hãy sửa chữa chúng trước, và sau đó sử dụng lệnh 'git add/rm <tập-tin>'\n" -"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng 'git " +"Xin hãy sửa chữa chúng trước, và sau đó sử dụng lệnh `git add/rm <tập-tin>'\n" +"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng `git " "commit -a'." #: git-pull.sh:25 @@ -5690,7 +9063,7 @@ msgstr "Không thể hòa trộn nhiều nhánh và trong một head trống r msgid "Cannot rebase onto multiple branches" msgstr "Không thể thực hiện lệnh rebase (cơ cấu lại) trên nhiều nhánh" -#: git-rebase.sh:52 +#: git-rebase.sh:53 msgid "" "When you have resolved this problem, run \"git rebase --continue\".\n" "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" @@ -5703,29 +9076,35 @@ msgstr "" "Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git " "rebase --abort\"." -#: git-rebase.sh:159 +#: git-rebase.sh:160 msgid "The pre-rebase hook refused to rebase." msgstr "hook (chương trình móc vào git) pre-rebase từ chối rebase." -#: git-rebase.sh:164 +#: git-rebase.sh:165 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "" "Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh " "rebase." -#: git-rebase.sh:295 +#: git-rebase.sh:296 msgid "The --exec option must be used with the --interactive option" msgstr "Tùy chọn --exec phải được sử dụng cùng với tùy chọn --interactive" -#: git-rebase.sh:300 +#: git-rebase.sh:301 msgid "No rebase in progress?" msgstr "Không có tiến trình rebase nào phải không?" -#: git-rebase.sh:313 +#: git-rebase.sh:312 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "" +"Hành động `--edit-todo' chỉ có thể dùng trong quá trình `rebase' (sửa lịch " +"sử) tương tác." + +#: git-rebase.sh:319 msgid "Cannot read HEAD" msgstr "Không thể đọc HEAD" -#: git-rebase.sh:316 +#: git-rebase.sh:322 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -5733,12 +9112,12 @@ msgstr "" "Bạn phải sửa tất cả các lần hòa trộn xung đột và sau\n" "đó đánh dấu chúng là cần xử lý sử dụng lệnh git add" -#: git-rebase.sh:334 +#: git-rebase.sh:340 #, sh-format msgid "Could not move back to $head_name" msgstr "Không thể quay trở lại $head_name" -#: git-rebase.sh:350 +#: git-rebase.sh:359 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -5761,57 +9140,57 @@ msgstr "" "\n" "TÔI: là lệnh bạn vừa gọi!" -#: git-rebase.sh:395 +#: git-rebase.sh:404 #, sh-format msgid "invalid upstream $upstream_name" -msgstr "dòng ngược không hợp lệ $upstream_name" +msgstr "thượng nguồn không hợp lệ $upstream_name" -#: git-rebase.sh:419 +#: git-rebase.sh:428 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: ở đây có nhiều hơn một" -#: git-rebase.sh:422 git-rebase.sh:426 +#: git-rebase.sh:431 git-rebase.sh:435 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ở đây không có gì để hòa trộn" -#: git-rebase.sh:431 +#: git-rebase.sh:440 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Không chỉ đến một lần chuyển giao (commit) không hợp lệ: $onto_name" -#: git-rebase.sh:454 +#: git-rebase.sh:463 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "nghiêm trọng: không có nhánh như thế: $branch_name" -#: git-rebase.sh:474 +#: git-rebase.sh:483 msgid "Please commit or stash them." msgstr "Xin hãy commit hoặc stash chúng." -#: git-rebase.sh:492 +#: git-rebase.sh:501 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi." -#: git-rebase.sh:495 +#: git-rebase.sh:504 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc." -#: git-rebase.sh:506 +#: git-rebase.sh:515 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Thay đổi từ $mb thành $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:515 +#: git-rebase.sh:524 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó..." -#: git-rebase.sh:523 +#: git-rebase.sh:532 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Fast-forward $branch_name thành $onto_name." @@ -5924,25 +9303,25 @@ msgstr "Không thể ghi lại cây chỉ mục" msgid "Cannot unstage modified files" msgstr "Không thể bỏ trạng thía của các tập tin đã được sửa chữa" -#: git-stash.sh:474 +#: git-stash.sh:475 msgid "Index was not unstashed." msgstr "Bảng mục lục đã không được bỏ stash." -#: git-stash.sh:491 +#: git-stash.sh:492 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Đã hạ xuống ${REV} ($s)" -#: git-stash.sh:492 +#: git-stash.sh:493 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Không thể xóa bỏ mục stash" -#: git-stash.sh:499 +#: git-stash.sh:500 msgid "No branch name specified" msgstr "Chưa chỉ ra tên của nhánh" -#: git-stash.sh:570 +#: git-stash.sh:571 msgid "(To restore them type \"git stash apply\")" msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")" @@ -6149,6 +9528,57 @@ msgstr "# Những thay đổi mô-đun-con được chuyển giao (commit):" msgid "Synchronizing submodule url for '$name'" msgstr "Đang đồng bộ hóa url mô-đun-con cho '$name'" +#~ msgid " 0 files changed" +#~ msgstr " 0 có tập tin nào thay đổi cả" + +#~ msgid " %d file changed" +#~ msgid_plural " %d files changed" +#~ msgstr[0] " %d tập tin thay đổi" +#~ msgstr[1] " %d tập tin thay đổi" + +#~ msgid ", %d insertion(+)" +#~ msgid_plural ", %d insertions(+)" +#~ msgstr[0] ", %d thêm(+)" +#~ msgstr[1] ", %d thêm(+)" + +#~ msgid ", %d deletion(-)" +#~ msgid_plural ", %d deletions(-)" +#~ msgstr[0] ", %d xóa(-)" +#~ msgstr[1] ", %d xóa(-)" + +#~ msgid "Auto packing the repository for optimum performance.\n" +#~ msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" + +#~ msgid " (use \"git add\" to track)" +#~ msgstr " (dùng \"git add\" để theo dõi dấu vết)" + +#~ msgid "-B cannot be used with -b" +#~ msgstr "tùy chọn -B không thể dùng -b" + +#~ msgid "--patch is incompatible with all other options" +#~ msgstr "--patch xung khắc với tất cả các tùy chọn khác" + +#~ msgid "--detach cannot be used with -b/-B/--orphan" +#~ msgstr "--detach không thể được sử dụng với tùy chọn -b/-B/--orphan" + +#~ msgid "--detach cannot be used with -t" +#~ msgstr "--detach không thể được sử dụng với tùy chọn -t" + +#~ msgid "--orphan and -b|-B are mutually exclusive" +#~ msgstr "Tùy chọn --orphan và -b|-B loại từ lẫn nhau" + +#~ msgid "--orphan cannot be used with -t" +#~ msgstr "--orphan không thể được sử dụng với tùy chọn -t" + +#~ msgid "git checkout: -f and -m are incompatible" +#~ msgstr "git checkout: hai tùy chọn -f và -m xung khắc nhau" + +#~ msgid "" +#~ "git checkout: updating paths is incompatible with switching branches." +#~ msgstr "" +#~ "git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển " +#~ "đổi các nhánh." + #~ msgid "diff setup failed" #~ msgstr "cài đặt diff gặp lỗi" @@ -6181,7 +9611,3 @@ msgstr "Đang đồng bộ hóa url mô-đun-con cho '$name'" #, fuzzy #~ msgid "cherry-pick" #~ msgstr "< Chọn D-Mod" - -#, fuzzy -#~ msgid "Too many options specified" -#~ msgstr "đã ghi rõ quá nhiều kích cỡ" @@ -231,7 +231,7 @@ static int is_rfc822_special(char ch) } } -static int has_rfc822_specials(const char *s, int len) +static int needs_rfc822_quoting(const char *s, int len) { int i; for (i = 0; i < len; i++) @@ -240,6 +240,17 @@ static int has_rfc822_specials(const char *s, int len) return 0; } +static int last_line_length(struct strbuf *sb) +{ + int i; + + /* How many bytes are already used on the last line? */ + for (i = sb->len - 1; i >= 0; i--) + if (sb->buf[i] == '\n') + break; + return sb->len - (i + 1); +} + static void add_rfc822_quoted(struct strbuf *out, const char *s, int len) { int i; @@ -261,57 +272,110 @@ static void add_rfc822_quoted(struct strbuf *out, const char *s, int len) strbuf_addch(out, '"'); } -static int is_rfc2047_special(char ch) +enum rfc2047_type { + RFC2047_SUBJECT, + RFC2047_ADDRESS, +}; + +static int is_rfc2047_special(char ch, enum rfc2047_type type) { - return (non_ascii(ch) || (ch == '=') || (ch == '?') || (ch == '_')); + /* + * rfc2047, section 4.2: + * + * 8-bit values which correspond to printable ASCII characters other + * than "=", "?", and "_" (underscore), MAY be represented as those + * characters. (But see section 5 for restrictions.) In + * particular, SPACE and TAB MUST NOT be represented as themselves + * within encoded words. + */ + + /* + * rule out non-ASCII characters and non-printable characters (the + * non-ASCII check should be redundant as isprint() is not localized + * and only knows about ASCII, but be defensive about that) + */ + if (non_ascii(ch) || !isprint(ch)) + return 1; + + /* + * rule out special printable characters (' ' should be the only + * whitespace character considered printable, but be defensive and use + * isspace()) + */ + if (isspace(ch) || ch == '=' || ch == '?' || ch == '_') + return 1; + + /* + * rfc2047, section 5.3: + * + * As a replacement for a 'word' entity within a 'phrase', for example, + * one that precedes an address in a From, To, or Cc header. The ABNF + * definition for 'phrase' from RFC 822 thus becomes: + * + * phrase = 1*( encoded-word / word ) + * + * In this case the set of characters that may be used in a "Q"-encoded + * 'encoded-word' is restricted to: <upper and lower case ASCII + * letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_" + * (underscore, ASCII 95.)>. An 'encoded-word' that appears within a + * 'phrase' MUST be separated from any adjacent 'word', 'text' or + * 'special' by 'linear-white-space'. + */ + + if (type != RFC2047_ADDRESS) + return 0; + + /* '=' and '_' are special cases and have been checked above */ + return !(isalnum(ch) || ch == '!' || ch == '*' || ch == '+' || ch == '-' || ch == '/'); } -static void add_rfc2047(struct strbuf *sb, const char *line, int len, - const char *encoding) +static int needs_rfc2047_encoding(const char *line, int len, + enum rfc2047_type type) { - static const int max_length = 78; /* per rfc2822 */ int i; - int line_len; - - /* How many bytes are already used on the current line? */ - for (i = sb->len - 1; i >= 0; i--) - if (sb->buf[i] == '\n') - break; - line_len = sb->len - (i+1); for (i = 0; i < len; i++) { int ch = line[i]; if (non_ascii(ch) || ch == '\n') - goto needquote; + return 1; if ((i + 1 < len) && (ch == '=' && line[i+1] == '?')) - goto needquote; + return 1; } - strbuf_add_wrapped_bytes(sb, line, len, 0, 1, max_length - line_len); - return; -needquote: + return 0; +} + +static void add_rfc2047(struct strbuf *sb, const char *line, int len, + const char *encoding, enum rfc2047_type type) +{ + static const int max_encoded_length = 76; /* per rfc2047 */ + int i; + int line_len = last_line_length(sb); + strbuf_grow(sb, len * 3 + strlen(encoding) + 100); strbuf_addf(sb, "=?%s?q?", encoding); line_len += strlen(encoding) + 5; /* 5 for =??q? */ for (i = 0; i < len; i++) { unsigned ch = line[i] & 0xFF; + int is_special = is_rfc2047_special(ch, type); + + /* + * According to RFC 2047, we could encode the special character + * ' ' (space) with '_' (underscore) for readability. But many + * programs do not understand this and just leave the + * underscore in place. Thus, we do nothing special here, which + * causes ' ' to be encoded as '=20', avoiding this problem. + */ - if (line_len >= max_length - 2) { + if (line_len + 2 + (is_special ? 3 : 1) > max_encoded_length) { strbuf_addf(sb, "?=\n =?%s?q?", encoding); line_len = strlen(encoding) + 5 + 1; /* =??q? plus SP */ } - /* - * We encode ' ' using '=20' even though rfc2047 - * allows using '_' for readability. Unfortunately, - * many programs do not understand this and just - * leave the underscore in place. - */ - if (is_rfc2047_special(ch) || ch == ' ' || ch == '\n') { + if (is_special) { strbuf_addf(sb, "=%02X", ch); line_len += 3; - } - else { + } else { strbuf_addch(sb, ch); line_len++; } @@ -323,6 +387,7 @@ void pp_user_info(const struct pretty_print_context *pp, const char *what, struct strbuf *sb, const char *line, const char *encoding) { + int max_length = 78; /* per rfc2822 */ char *date; int namelen; unsigned long time; @@ -340,25 +405,27 @@ void pp_user_info(const struct pretty_print_context *pp, if (pp->fmt == CMIT_FMT_EMAIL) { char *name_tail = strchr(line, '<'); int display_name_length; - int final_line; if (!name_tail) return; while (line < name_tail && isspace(name_tail[-1])) name_tail--; display_name_length = name_tail - line; strbuf_addstr(sb, "From: "); - if (!has_rfc822_specials(line, display_name_length)) { - add_rfc2047(sb, line, display_name_length, encoding); - } else { + if (needs_rfc2047_encoding(line, display_name_length, RFC2047_ADDRESS)) { + add_rfc2047(sb, line, display_name_length, + encoding, RFC2047_ADDRESS); + max_length = 76; /* per rfc2047 */ + } else if (needs_rfc822_quoting(line, display_name_length)) { struct strbuf quoted = STRBUF_INIT; add_rfc822_quoted("ed, line, display_name_length); - add_rfc2047(sb, quoted.buf, quoted.len, encoding); + strbuf_add_wrapped_bytes(sb, quoted.buf, quoted.len, + -6, 1, max_length); strbuf_release("ed); + } else { + strbuf_add_wrapped_bytes(sb, line, display_name_length, + -6, 1, max_length); } - for (final_line = 0; final_line < sb->len; final_line++) - if (sb->buf[sb->len - final_line - 1] == '\n') - break; - if (namelen - display_name_length + final_line > 78) { + if (namelen - display_name_length + last_line_length(sb) > max_length) { strbuf_addch(sb, '\n'); if (!isspace(name_tail[0])) strbuf_addch(sb, ' '); @@ -1278,6 +1345,7 @@ void pp_title_line(const struct pretty_print_context *pp, const char *encoding, int need_8bit_cte) { + static const int max_length = 78; /* per rfc2047 */ struct strbuf title; strbuf_init(&title, 80); @@ -1287,7 +1355,12 @@ void pp_title_line(const struct pretty_print_context *pp, strbuf_grow(sb, title.len + 1024); if (pp->subject) { strbuf_addstr(sb, pp->subject); - add_rfc2047(sb, title.buf, title.len, encoding); + if (needs_rfc2047_encoding(title.buf, title.len, RFC2047_SUBJECT)) + add_rfc2047(sb, title.buf, title.len, + encoding, RFC2047_SUBJECT); + else + strbuf_add_wrapped_bytes(sb, title.buf, title.len, + -last_line_length(sb), 1, max_length); } else { strbuf_addbuf(sb, &title); } @@ -1202,6 +1202,8 @@ int peel_ref(const char *refname, unsigned char *sha1) if (current_ref && (current_ref->name == refname || !strcmp(current_ref->name, refname))) { if (current_ref->flag & REF_KNOWS_PEELED) { + if (is_null_sha1(current_ref->u.value.peeled)) + return -1; hashcpy(sha1, current_ref->u.value.peeled); return 0; } @@ -1223,9 +1225,16 @@ int peel_ref(const char *refname, unsigned char *sha1) } fallback: - o = parse_object(base); - if (o && o->type == OBJ_TAG) { - o = deref_tag(o, refname, 0); + o = lookup_unknown_object(base); + if (o->type == OBJ_NONE) { + int type = sha1_object_info(base, NULL); + if (type < 0) + return -1; + o->type = type; + } + + if (o->type == OBJ_TAG) { + o = deref_tag_noverify(o); if (o) { hashcpy(sha1, o->sha1); return 0; @@ -1753,26 +1762,18 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt) struct ref_lock *lock; int err, i = 0, ret = 0, flag = 0; - lock = lock_ref_sha1_basic(refname, sha1, 0, &flag); + lock = lock_ref_sha1_basic(refname, sha1, delopt, &flag); if (!lock) return 1; if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) { /* loose */ - const char *path; - - if (!(delopt & REF_NODEREF)) { - i = strlen(lock->lk->filename) - 5; /* .lock */ - lock->lk->filename[i] = 0; - path = lock->lk->filename; - } else { - path = git_path("%s", refname); - } - err = unlink_or_warn(path); + i = strlen(lock->lk->filename) - 5; /* .lock */ + lock->lk->filename[i] = 0; + err = unlink_or_warn(lock->lk->filename); if (err && errno != ENOENT) ret = 1; - if (!(delopt & REF_NODEREF)) - lock->lk->filename[i] = '.'; + lock->lk->filename[i] = '.'; } /* removing the loose one could have resurrected an earlier * packed one. Also, if it was not loose we need to repack diff --git a/remote-curl.c b/remote-curl.c index 10fa8f1ac5..278fecdd9b 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -356,7 +356,7 @@ static int run_slot(struct active_request_slot *slot) slot->curl_result = curl_easy_perform(slot->curl); finish_active_slot(slot); - err = handle_curl_result(slot); + err = handle_curl_result(&results); if (err != HTTP_OK && err != HTTP_REAUTH) { error("RPC failed; result=%d, HTTP code = %ld", results.curl_result, results.http_code); @@ -431,6 +431,11 @@ static int post_rpc(struct rpc_state *rpc) return -1; } + headers = curl_slist_append(headers, rpc->hdr_content_type); + headers = curl_slist_append(headers, rpc->hdr_accept); + headers = curl_slist_append(headers, "Expect:"); + +retry: slot = get_active_slot(); curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0); @@ -438,10 +443,6 @@ static int post_rpc(struct rpc_state *rpc) curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url); curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip"); - headers = curl_slist_append(headers, rpc->hdr_content_type); - headers = curl_slist_append(headers, rpc->hdr_accept); - headers = curl_slist_append(headers, "Expect:"); - if (large_request) { /* The request body is large and the size cannot be predicted. * We must use chunked encoding to send it. @@ -515,9 +516,9 @@ static int post_rpc(struct rpc_state *rpc) curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in); curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc); - do { - err = run_slot(slot); - } while (err == HTTP_REAUTH && !large_request && !use_gzip); + err = run_slot(slot); + if (err == HTTP_REAUTH && !large_request && !use_gzip) + goto retry; if (err != HTTP_OK) err = -1; diff --git a/remote-testsvn.c b/remote-testsvn.c new file mode 100644 index 0000000000..51fba059a2 --- /dev/null +++ b/remote-testsvn.c @@ -0,0 +1,342 @@ +#include "cache.h" +#include "remote.h" +#include "strbuf.h" +#include "url.h" +#include "exec_cmd.h" +#include "run-command.h" +#include "vcs-svn/svndump.h" +#include "notes.h" +#include "argv-array.h" + +static const char *url; +static int dump_from_file; +static const char *private_ref; +static const char *remote_ref = "refs/heads/master"; +static const char *marksfilename, *notes_ref; +struct rev_note { unsigned int rev_nr; }; + +static int cmd_capabilities(const char *line); +static int cmd_import(const char *line); +static int cmd_list(const char *line); + +typedef int (*input_command_handler)(const char *); +struct input_command_entry { + const char *name; + input_command_handler fn; + unsigned char batchable; /* whether the command starts or is part of a batch */ +}; + +static const struct input_command_entry input_command_list[] = { + { "capabilities", cmd_capabilities, 0 }, + { "import", cmd_import, 1 }, + { "list", cmd_list, 0 }, + { NULL, NULL } +}; + +static int cmd_capabilities(const char *line) +{ + printf("import\n"); + printf("bidi-import\n"); + printf("refspec %s:%s\n\n", remote_ref, private_ref); + fflush(stdout); + return 0; +} + +static void terminate_batch(void) +{ + /* terminate a current batch's fast-import stream */ + printf("done\n"); + fflush(stdout); +} + +/* NOTE: 'ref' refers to a git reference, while 'rev' refers to a svn revision. */ +static char *read_ref_note(const unsigned char sha1[20]) +{ + const unsigned char *note_sha1; + char *msg = NULL; + unsigned long msglen; + enum object_type type; + + init_notes(NULL, notes_ref, NULL, 0); + if (!(note_sha1 = get_note(NULL, sha1))) + return NULL; /* note tree not found */ + if (!(msg = read_sha1_file(note_sha1, &type, &msglen))) + error("Empty notes tree. %s", notes_ref); + else if (!msglen || type != OBJ_BLOB) { + error("Note contains unusable content. " + "Is something else using this notes tree? %s", notes_ref); + free(msg); + msg = NULL; + } + free_notes(NULL); + return msg; +} + +static int parse_rev_note(const char *msg, struct rev_note *res) +{ + const char *key, *value, *end; + size_t len; + + while (*msg) { + end = strchr(msg, '\n'); + len = end ? end - msg : strlen(msg); + + key = "Revision-number: "; + if (!prefixcmp(msg, key)) { + long i; + char *end; + value = msg + strlen(key); + i = strtol(value, &end, 0); + if (end == value || i < 0 || i > UINT32_MAX) + return -1; + res->rev_nr = i; + } + msg += len + 1; + } + return 0; +} + +static int note2mark_cb(const unsigned char *object_sha1, + const unsigned char *note_sha1, char *note_path, + void *cb_data) +{ + FILE *file = (FILE *)cb_data; + char *msg; + unsigned long msglen; + enum object_type type; + struct rev_note note; + + if (!(msg = read_sha1_file(note_sha1, &type, &msglen)) || + !msglen || type != OBJ_BLOB) { + free(msg); + return 1; + } + if (parse_rev_note(msg, ¬e)) + return 2; + if (fprintf(file, ":%d %s\n", note.rev_nr, sha1_to_hex(object_sha1)) < 1) + return 3; + return 0; +} + +static void regenerate_marks(void) +{ + int ret; + FILE *marksfile = fopen(marksfilename, "w+"); + + if (!marksfile) + die_errno("Couldn't create mark file %s.", marksfilename); + ret = for_each_note(NULL, 0, note2mark_cb, marksfile); + if (ret) + die("Regeneration of marks failed, returned %d.", ret); + fclose(marksfile); +} + +static void check_or_regenerate_marks(int latestrev) +{ + FILE *marksfile; + struct strbuf sb = STRBUF_INIT; + struct strbuf line = STRBUF_INIT; + int found = 0; + + if (latestrev < 1) + return; + + init_notes(NULL, notes_ref, NULL, 0); + marksfile = fopen(marksfilename, "r"); + if (!marksfile) { + regenerate_marks(); + marksfile = fopen(marksfilename, "r"); + if (!marksfile) + die_errno("cannot read marks file %s!", marksfilename); + fclose(marksfile); + } else { + strbuf_addf(&sb, ":%d ", latestrev); + while (strbuf_getline(&line, marksfile, '\n') != EOF) { + if (!prefixcmp(line.buf, sb.buf)) { + found++; + break; + } + } + fclose(marksfile); + if (!found) + regenerate_marks(); + } + free_notes(NULL); + strbuf_release(&sb); + strbuf_release(&line); +} + +static int cmd_import(const char *line) +{ + int code; + int dumpin_fd; + char *note_msg; + unsigned char head_sha1[20]; + unsigned int startrev; + struct argv_array svndump_argv = ARGV_ARRAY_INIT; + struct child_process svndump_proc; + + if (read_ref(private_ref, head_sha1)) + startrev = 0; + else { + note_msg = read_ref_note(head_sha1); + if(note_msg == NULL) { + warning("No note found for %s.", private_ref); + startrev = 0; + } else { + struct rev_note note = { 0 }; + if (parse_rev_note(note_msg, ¬e)) + die("Revision number couldn't be parsed from note."); + startrev = note.rev_nr + 1; + free(note_msg); + } + } + check_or_regenerate_marks(startrev - 1); + + if (dump_from_file) { + dumpin_fd = open(url, O_RDONLY); + if(dumpin_fd < 0) + die_errno("Couldn't open svn dump file %s.", url); + } else { + memset(&svndump_proc, 0, sizeof(struct child_process)); + svndump_proc.out = -1; + argv_array_push(&svndump_argv, "svnrdump"); + argv_array_push(&svndump_argv, "dump"); + argv_array_push(&svndump_argv, url); + argv_array_pushf(&svndump_argv, "-r%u:HEAD", startrev); + svndump_proc.argv = svndump_argv.argv; + + code = start_command(&svndump_proc); + if (code) + die("Unable to start %s, code %d", svndump_proc.argv[0], code); + dumpin_fd = svndump_proc.out; + } + /* setup marks file import/export */ + printf("feature import-marks-if-exists=%s\n" + "feature export-marks=%s\n", marksfilename, marksfilename); + + svndump_init_fd(dumpin_fd, STDIN_FILENO); + svndump_read(url, private_ref, notes_ref); + svndump_deinit(); + svndump_reset(); + + close(dumpin_fd); + if (!dump_from_file) { + code = finish_command(&svndump_proc); + if (code) + warning("%s, returned %d", svndump_proc.argv[0], code); + argv_array_clear(&svndump_argv); + } + + return 0; +} + +static int cmd_list(const char *line) +{ + printf("? %s\n\n", remote_ref); + fflush(stdout); + return 0; +} + +static int do_command(struct strbuf *line) +{ + const struct input_command_entry *p = input_command_list; + static struct string_list batchlines = STRING_LIST_INIT_DUP; + static const struct input_command_entry *batch_cmd; + /* + * commands can be grouped together in a batch. + * Batches are ended by \n. If no batch is active the program ends. + * During a batch all lines are buffered and passed to the handler function + * when the batch is terminated. + */ + if (line->len == 0) { + if (batch_cmd) { + struct string_list_item *item; + for_each_string_list_item(item, &batchlines) + batch_cmd->fn(item->string); + terminate_batch(); + batch_cmd = NULL; + string_list_clear(&batchlines, 0); + return 0; /* end of the batch, continue reading other commands. */ + } + return 1; /* end of command stream, quit */ + } + if (batch_cmd) { + if (prefixcmp(batch_cmd->name, line->buf)) + die("Active %s batch interrupted by %s", batch_cmd->name, line->buf); + /* buffer batch lines */ + string_list_append(&batchlines, line->buf); + return 0; + } + + for (p = input_command_list; p->name; p++) { + if (!prefixcmp(line->buf, p->name) && (strlen(p->name) == line->len || + line->buf[strlen(p->name)] == ' ')) { + if (p->batchable) { + batch_cmd = p; + string_list_append(&batchlines, line->buf); + return 0; + } + return p->fn(line->buf); + } + } + die("Unknown command '%s'\n", line->buf); + return 0; +} + +int main(int argc, const char **argv) +{ + struct strbuf buf = STRBUF_INIT, url_sb = STRBUF_INIT, + private_ref_sb = STRBUF_INIT, marksfilename_sb = STRBUF_INIT, + notes_ref_sb = STRBUF_INIT; + static struct remote *remote; + const char *url_in; + + git_extract_argv0_path(argv[0]); + setup_git_directory(); + if (argc < 2 || argc > 3) { + usage("git-remote-svn <remote-name> [<url>]"); + return 1; + } + + remote = remote_get(argv[1]); + url_in = (argc == 3) ? argv[2] : remote->url[0]; + + if (!prefixcmp(url_in, "file://")) { + dump_from_file = 1; + url = url_decode(url_in + sizeof("file://")-1); + } else { + dump_from_file = 0; + end_url_with_slash(&url_sb, url_in); + url = url_sb.buf; + } + + strbuf_addf(&private_ref_sb, "refs/svn/%s/master", remote->name); + private_ref = private_ref_sb.buf; + + strbuf_addf(¬es_ref_sb, "refs/notes/%s/revs", remote->name); + notes_ref = notes_ref_sb.buf; + + strbuf_addf(&marksfilename_sb, "%s/info/fast-import/remote-svn/%s.marks", + get_git_dir(), remote->name); + marksfilename = marksfilename_sb.buf; + + while (1) { + if (strbuf_getline(&buf, stdin, '\n') == EOF) { + if (ferror(stdin)) + die("Error reading command stream"); + else + die("Unexpected end of command stream"); + } + if (do_command(&buf)) + break; + strbuf_reset(&buf); + } + + strbuf_release(&buf); + strbuf_release(&url_sb); + strbuf_release(&private_ref_sb); + strbuf_release(¬es_ref_sb); + strbuf_release(&marksfilename_sb); + return 0; +} diff --git a/revision.c b/revision.c index a09e60bedb..d7d621cdbf 100644 --- a/revision.c +++ b/revision.c @@ -1048,9 +1048,9 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format = CMIT_FMT_DEFAULT; + init_grep_defaults(); + grep_init(&revs->grep_filter, prefix); revs->grep_filter.status_only = 1; - revs->grep_filter.pattern_tail = &(revs->grep_filter.pattern_list); - revs->grep_filter.header_tail = &(revs->grep_filter.header_list); revs->grep_filter.regflags = REG_NEWLINE; diff_setup(&revs->diffopt); @@ -1603,13 +1603,17 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg return argcount; } else if (!strcmp(arg, "--grep-debug")) { revs->grep_filter.debug = 1; + } else if (!strcmp(arg, "--basic-regexp")) { + grep_set_pattern_type_option(GREP_PATTERN_TYPE_BRE, &revs->grep_filter); } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) { - revs->grep_filter.regflags |= REG_EXTENDED; + grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, &revs->grep_filter); } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) { revs->grep_filter.regflags |= REG_ICASE; DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE); } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) { - revs->grep_filter.fixed = 1; + grep_set_pattern_type_option(GREP_PATTERN_TYPE_FIXED, &revs->grep_filter); + } else if (!strcmp(arg, "--perl-regexp")) { + grep_set_pattern_type_option(GREP_PATTERN_TYPE_PCRE, &revs->grep_filter); } else if (!strcmp(arg, "--all-match")) { revs->grep_filter.all_match = 1; } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) { @@ -1893,6 +1897,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s revs->diffopt.abbrev = revs->abbrev; diff_setup_done(&revs->diffopt); + grep_commit_pattern_type(GREP_PATTERN_TYPE_UNSPECIFIED, + &revs->grep_filter); compile_grep_patterns(&revs->grep_filter); if (revs->reverse && revs->reflog_info) diff --git a/run-command.c b/run-command.c index 1101ef7237..3b982e4d55 100644 --- a/run-command.c +++ b/run-command.c @@ -397,16 +397,6 @@ fail_pipe: unsetenv(*cmd->env); } } - if (cmd->preexec_cb) { - /* - * We cannot predict what the pre-exec callback does. - * Forgo parent notification. - */ - close(child_notifier); - child_notifier = -1; - - cmd->preexec_cb(); - } if (cmd->git_cmd) { execv_git_cmd(cmd->argv); } else if (cmd->use_shell) { diff --git a/run-command.h b/run-command.h index 44f7d2bd42..850c638f19 100644 --- a/run-command.h +++ b/run-command.h @@ -39,7 +39,6 @@ struct child_process { unsigned stdout_to_stderr:1; unsigned use_shell:1; unsigned clean_on_exit:1; - void (*preexec_cb)(void); }; int start_command(struct child_process *); @@ -44,7 +44,9 @@ void strbuf_release(struct strbuf *sb) char *strbuf_detach(struct strbuf *sb, size_t *sz) { - char *res = sb->alloc ? sb->buf : NULL; + char *res; + strbuf_grow(sb, 0); + res = sb->buf; if (sz) *sz = sb->len; strbuf_init(sb, 0); diff --git a/submodule.c b/submodule.c index 50f213e926..e3e0b455ea 100644 --- a/submodule.c +++ b/submodule.c @@ -759,6 +759,86 @@ unsigned is_submodule_modified(const char *path, int ignore_untracked) return dirty_submodule; } +int submodule_uses_gitfile(const char *path) +{ + struct child_process cp; + const char *argv[] = { + "submodule", + "foreach", + "--quiet", + "--recursive", + "test -f .git", + NULL, + }; + struct strbuf buf = STRBUF_INIT; + const char *git_dir; + + strbuf_addf(&buf, "%s/.git", path); + git_dir = read_gitfile(buf.buf); + if (!git_dir) { + strbuf_release(&buf); + return 0; + } + strbuf_release(&buf); + + /* Now test that all nested submodules use a gitfile too */ + memset(&cp, 0, sizeof(cp)); + cp.argv = argv; + cp.env = local_repo_env; + cp.git_cmd = 1; + cp.no_stdin = 1; + cp.no_stderr = 1; + cp.no_stdout = 1; + cp.dir = path; + if (run_command(&cp)) + return 0; + + return 1; +} + +int ok_to_remove_submodule(const char *path) +{ + struct stat st; + ssize_t len; + struct child_process cp; + const char *argv[] = { + "status", + "--porcelain", + "-u", + "--ignore-submodules=none", + NULL, + }; + struct strbuf buf = STRBUF_INIT; + int ok_to_remove = 1; + + if ((lstat(path, &st) < 0) || is_empty_dir(path)) + return 1; + + if (!submodule_uses_gitfile(path)) + return 0; + + memset(&cp, 0, sizeof(cp)); + cp.argv = argv; + cp.env = local_repo_env; + cp.git_cmd = 1; + cp.no_stdin = 1; + cp.out = -1; + cp.dir = path; + if (start_command(&cp)) + die("Could not run 'git status --porcelain -uall --ignore-submodules=none' in submodule %s", path); + + len = strbuf_read(&buf, cp.out, 1024); + if (len > 2) + ok_to_remove = 0; + close(cp.out); + + if (finish_command(&cp)) + die("'git status --porcelain -uall --ignore-submodules=none' failed in submodule %s", path); + + strbuf_release(&buf); + return ok_to_remove; +} + static int find_first_merges(struct object_array *result, const char *path, struct commit *a, struct commit *b) { diff --git a/submodule.h b/submodule.h index 594b50d510..f2e8271fc6 100644 --- a/submodule.h +++ b/submodule.h @@ -28,6 +28,8 @@ int fetch_populated_submodules(const struct argv_array *options, const char *prefix, int command_line_option, int quiet); unsigned is_submodule_modified(const char *path, int ignore_untracked); +int submodule_uses_gitfile(const char *path); +int ok_to_remove_submodule(const char *path); int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20], const unsigned char a[20], const unsigned char b[20], int search); int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name, diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index febc45c9cc..807b8b88e2 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -196,6 +196,16 @@ test_expect_success 'root subdir attribute test' ' attr_check subdir/a/i unspecified ' +test_expect_success 'negative patterns' ' + echo "!f test=bar" >.gitattributes && + test_must_fail git check-attr test -- f +' + +test_expect_success 'patterns starting with exclamation' ' + echo "\!f test=foo" >.gitattributes && + attr_check "!f" foo +' + test_expect_success 'setup bare' ' git clone --bare . bare.git && cd bare.git diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index bf7a2cd6fb..08aa24ca15 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -177,9 +177,7 @@ test_expect_success 'tag pointing to something else than its type' ' test_when_finished "remove_object $tag" && echo $tag >.git/refs/tags/wrong && test_when_finished "git update-ref -d refs/tags/wrong" && - test_must_fail git fsck --tags 2>out && - cat out && - grep "error in tag.*broken links" out + test_must_fail git fsck --tags ' test_expect_success 'cleaned up' ' diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index c8fe978267..dc2f0458fd 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -214,4 +214,10 @@ test_expect_success 'subdirectory ignore (l1)' ' test_cmp expect actual ' +test_expect_success 'pattern matches prefix completely' ' + : >expect && + git ls-files -i -o --exclude "/three/a.3[abc]" >actual && + test_cmp expect actual +' + test_done diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 79c8d0142e..80e6be39d7 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -262,6 +262,25 @@ test_expect_success 'config information was renamed, too' \ "test $(git config branch.s.dummy) = Hello && test_must_fail git config branch.s/s/dummy" +test_expect_success 'deleting a symref' ' + git branch target && + git symbolic-ref refs/heads/symref refs/heads/target && + echo "Deleted branch symref (was refs/heads/target)." >expect && + git branch -d symref >actual && + test_path_is_file .git/refs/heads/target && + test_path_is_missing .git/refs/heads/symref && + test_i18ncmp expect actual +' + +test_expect_success 'deleting a dangling symref' ' + git symbolic-ref refs/heads/dangling-symref nowhere && + test_path_is_file .git/refs/heads/dangling-symref && + echo "Deleted branch dangling-symref (was nowhere)." >expect && + git branch -d dangling-symref >actual && + test_path_is_missing .git/refs/heads/dangling-symref && + test_i18ncmp expect actual +' + test_expect_success 'renaming a symref is not allowed' \ ' git symbolic-ref refs/heads/master2 refs/heads/master && diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 9fd28bcf34..97254e8d33 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -262,4 +262,347 @@ test_expect_success 'rm removes subdirectories recursively' ' ! test -d dir ' +cat >expect <<EOF +D submod +EOF + +cat >expect.modified <<EOF + M submod +EOF + +test_expect_success 'rm removes empty submodules from work tree' ' + mkdir submod && + git update-index --add --cacheinfo 160000 $(git rev-parse HEAD) submod && + git config -f .gitmodules submodule.sub.url ./. && + git config -f .gitmodules submodule.sub.path submod && + git submodule init && + git add .gitmodules && + git commit -m "add submodule" && + git rm submod && + test ! -e submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm removes removed submodule from index' ' + git reset --hard && + git submodule update && + rm -rf submod && + git rm submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm removes work tree of unmodified submodules' ' + git reset --hard && + git submodule update && + git rm submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated submodule with different HEAD fails unless forced' ' + git reset --hard && + git submodule update && + (cd submod && + git checkout HEAD^ + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated submodule with modifications fails unless forced' ' + git reset --hard && + git submodule update && + (cd submod && + echo X >empty + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated submodule with untracked files fails unless forced' ' + git reset --hard && + git submodule update && + (cd submod && + echo X >untracked + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'setup submodule conflict' ' + git reset --hard && + git submodule update && + git checkout -b branch1 && + echo 1 >nitfol && + git add nitfol && + git commit -m "added nitfol 1" && + git checkout -b branch2 master && + echo 2 >nitfol && + git add nitfol && + git commit -m "added nitfol 2" && + git checkout -b conflict1 master && + (cd submod && + git fetch && + git checkout branch1 + ) && + git add submod && + git commit -m "submod 1" && + git checkout -b conflict2 master && + (cd submod && + git checkout branch2 + ) && + git add submod && + git commit -m "submod 2" +' + +cat >expect.conflict <<EOF +UU submod +EOF + +test_expect_success 'rm removes work tree of unmodified conflicted submodule' ' + git checkout conflict1 && + git reset --hard && + git submodule update && + test_must_fail git merge conflict2 && + git rm submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a conflicted populated submodule with different HEAD fails unless forced' ' + git checkout conflict1 && + git reset --hard && + git submodule update && + (cd submod && + git checkout HEAD^ + ) && + test_must_fail git merge conflict2 && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.conflict actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a conflicted populated submodule with modifications fails unless forced' ' + git checkout conflict1 && + git reset --hard && + git submodule update && + (cd submod && + echo X >empty + ) && + test_must_fail git merge conflict2 && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.conflict actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a conflicted populated submodule with untracked files fails unless forced' ' + git checkout conflict1 && + git reset --hard && + git submodule update && + (cd submod && + echo X >untracked + ) && + test_must_fail git merge conflict2 && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.conflict actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a conflicted populated submodule with a .git directory fails even when forced' ' + git checkout conflict1 && + git reset --hard && + git submodule update && + (cd submod && + rm .git && + cp -a ../.git/modules/sub .git && + GIT_WORK_TREE=. git config --unset core.worktree + ) && + test_must_fail git merge conflict2 && + test_must_fail git rm submod && + test -d submod && + test -d submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.conflict actual && + test_must_fail git rm -f submod && + test -d submod && + test -d submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.conflict actual && + git merge --abort && + rm -rf submod +' + +test_expect_success 'rm of a conflicted unpopulated submodule succeeds' ' + git checkout conflict1 && + git reset --hard && + test_must_fail git merge conflict2 && + git rm submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated submodule with a .git directory fails even when forced' ' + git checkout -f master && + git reset --hard && + git submodule update && + (cd submod && + rm .git && + cp -a ../.git/modules/sub .git && + GIT_WORK_TREE=. git config --unset core.worktree + ) && + test_must_fail git rm submod && + test -d submod && + test -d submod/.git && + git status -s -uno --ignore-submodules=none > actual && + ! test -s actual && + test_must_fail git rm -f submod && + test -d submod && + test -d submod/.git && + git status -s -uno --ignore-submodules=none > actual && + ! test -s actual && + rm -rf submod +' + +cat >expect.deepmodified <<EOF + M submod/subsubmod +EOF + +test_expect_success 'setup subsubmodule' ' + git reset --hard && + git submodule update && + (cd submod && + git update-index --add --cacheinfo 160000 $(git rev-parse HEAD) subsubmod && + git config -f .gitmodules submodule.sub.url ../. && + git config -f .gitmodules submodule.sub.path subsubmod && + git submodule init && + git add .gitmodules && + git commit -m "add subsubmodule" && + git submodule update subsubmod + ) && + git commit -a -m "added deep submodule" +' + +test_expect_success 'rm recursively removes work tree of unmodified submodules' ' + git rm submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated nested submodule with different nested HEAD fails unless forced' ' + git reset --hard && + git submodule update --recursive && + (cd submod/subsubmod && + git checkout HEAD^ + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated nested submodule with nested modifications fails unless forced' ' + git reset --hard && + git submodule update --recursive && + (cd submod/subsubmod && + echo X >empty + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated nested submodule with nested untracked files fails unless forced' ' + git reset --hard && + git submodule update --recursive && + (cd submod/subsubmod && + echo X >untracked + ) && + test_must_fail git rm submod && + test -d submod && + test -f submod/.git && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect.modified actual && + git rm -f submod && + test ! -d submod && + git status -s -uno --ignore-submodules=none > actual && + test_cmp expect actual +' + +test_expect_success 'rm of a populated nested submodule with a nested .git directory fails even when forced' ' + git reset --hard && + git submodule update --recursive && + (cd submod/subsubmod && + rm .git && + cp -a ../../.git/modules/sub/modules/sub .git && + GIT_WORK_TREE=. git config --unset core.worktree + ) && + test_must_fail git rm submod && + test -d submod && + test -d submod/subsubmod/.git && + git status -s -uno --ignore-submodules=none > actual && + ! test -s actual && + test_must_fail git rm -f submod && + test -d submod && + test -d submod/subsubmod/.git && + git status -s -uno --ignore-submodules=none > actual && + ! test -s actual && + rm -rf submod +' + test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 959aa26ef5..ad9f69e607 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -110,73 +110,107 @@ test_expect_success 'replay did not screw up the log message' ' test_expect_success 'extra headers' ' - git config format.headers "To: R. E. Cipient <rcipient@example.com> + git config format.headers "To: R E Cipient <rcipient@example.com> " && - git config --add format.headers "Cc: S. E. Cipient <scipient@example.com> + git config --add format.headers "Cc: S E Cipient <scipient@example.com> " && git format-patch --stdout master..side > patch2 && sed -e "/^\$/q" patch2 > hdrs2 && - grep "^To: R. E. Cipient <rcipient@example.com>\$" hdrs2 && - grep "^Cc: S. E. Cipient <scipient@example.com>\$" hdrs2 + grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 && + grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2 ' test_expect_success 'extra headers without newlines' ' - git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" && - git config --add format.headers "Cc: S. E. Cipient <scipient@example.com>" && + git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && + git config --add format.headers "Cc: S E Cipient <scipient@example.com>" && git format-patch --stdout master..side >patch3 && sed -e "/^\$/q" patch3 > hdrs3 && - grep "^To: R. E. Cipient <rcipient@example.com>\$" hdrs3 && - grep "^Cc: S. E. Cipient <scipient@example.com>\$" hdrs3 + grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 && + grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3 ' test_expect_success 'extra headers with multiple To:s' ' - git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" && - git config --add format.headers "To: S. E. Cipient <scipient@example.com>" && + git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && + git config --add format.headers "To: S E Cipient <scipient@example.com>" && git format-patch --stdout master..side > patch4 && sed -e "/^\$/q" patch4 > hdrs4 && - grep "^To: R. E. Cipient <rcipient@example.com>,\$" hdrs4 && - grep "^ *S. E. Cipient <scipient@example.com>\$" hdrs4 + grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 && + grep "^ *S E Cipient <scipient@example.com>\$" hdrs4 ' -test_expect_success 'additional command line cc' ' +test_expect_success 'additional command line cc (ascii)' ' - git config --replace-all format.headers "Cc: R. E. Cipient <rcipient@example.com>" && + git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && + git format-patch --cc="S E Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch5 && + grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch5 && + grep "^ *S E Cipient <scipient@example.com>\$" patch5 +' + +test_expect_failure 'additional command line cc (rfc822)' ' + + git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch5 && - grep "^Cc: R. E. Cipient <rcipient@example.com>,\$" patch5 && - grep "^ *S. E. Cipient <scipient@example.com>\$" patch5 + grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch5 && + grep "^ *"S. E. Cipient" <scipient@example.com>\$" patch5 ' test_expect_success 'command line headers' ' git config --unset-all format.headers && - git format-patch --add-header="Cc: R. E. Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch6 && - grep "^Cc: R. E. Cipient <rcipient@example.com>\$" patch6 + git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch6 && + grep "^Cc: R E Cipient <rcipient@example.com>\$" patch6 ' test_expect_success 'configuration headers and command line headers' ' - git config --replace-all format.headers "Cc: R. E. Cipient <rcipient@example.com>" && - git format-patch --add-header="Cc: S. E. Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch7 && - grep "^Cc: R. E. Cipient <rcipient@example.com>,\$" patch7 && - grep "^ *S. E. Cipient <scipient@example.com>\$" patch7 + git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && + git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch7 && + grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch7 && + grep "^ *S E Cipient <scipient@example.com>\$" patch7 ' -test_expect_success 'command line To: header' ' +test_expect_success 'command line To: header (ascii)' ' git config --unset-all format.headers && + git format-patch --to="R E Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 && + grep "^To: R E Cipient <rcipient@example.com>\$" patch8 +' + +test_expect_failure 'command line To: header (rfc822)' ' + git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 && - grep "^To: R. E. Cipient <rcipient@example.com>\$" patch8 + grep "^To: "R. E. Cipient" <rcipient@example.com>\$" patch8 ' -test_expect_success 'configuration To: header' ' +test_expect_failure 'command line To: header (rfc2047)' ' + + git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 && + grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" patch8 +' + +test_expect_success 'configuration To: header (ascii)' ' + + git config format.to "R E Cipient <rcipient@example.com>" && + git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && + grep "^To: R E Cipient <rcipient@example.com>\$" patch9 +' + +test_expect_failure 'configuration To: header (rfc822)' ' git config format.to "R. E. Cipient <rcipient@example.com>" && git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && - grep "^To: R. E. Cipient <rcipient@example.com>\$" patch9 + grep "^To: "R. E. Cipient" <rcipient@example.com>\$" patch9 +' + +test_expect_failure 'configuration To: header (rfc2047)' ' + + git config format.to "R Ä Cipient <rcipient@example.com>" && + git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && + grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" patch9 ' # check_patch <patch>: Verify that <patch> looks like a half-sane @@ -190,11 +224,11 @@ check_patch () { test_expect_success '--no-to overrides config.to' ' git config --replace-all format.to \ - "R. E. Cipient <rcipient@example.com>" && + "R E Cipient <rcipient@example.com>" && git format-patch --no-to --stdout master..side | sed -e "/^\$/q" >patch10 && check_patch patch10 && - ! grep "^To: R. E. Cipient <rcipient@example.com>\$" patch10 + ! grep "^To: R E Cipient <rcipient@example.com>\$" patch10 ' test_expect_success '--no-to and --to replaces config.to' ' @@ -212,21 +246,21 @@ test_expect_success '--no-to and --to replaces config.to' ' test_expect_success '--no-cc overrides config.cc' ' git config --replace-all format.cc \ - "C. E. Cipient <rcipient@example.com>" && + "C E Cipient <rcipient@example.com>" && git format-patch --no-cc --stdout master..side | sed -e "/^\$/q" >patch12 && check_patch patch12 && - ! grep "^Cc: C. E. Cipient <rcipient@example.com>\$" patch12 + ! grep "^Cc: C E Cipient <rcipient@example.com>\$" patch12 ' test_expect_success '--no-add-header overrides config.headers' ' git config --replace-all format.headers \ - "Header1: B. E. Cipient <rcipient@example.com>" && + "Header1: B E Cipient <rcipient@example.com>" && git format-patch --no-add-header --stdout master..side | sed -e "/^\$/q" >patch13 && check_patch patch13 && - ! grep "^Header1: B. E. Cipient <rcipient@example.com>\$" patch13 + ! grep "^Header1: B E Cipient <rcipient@example.com>\$" patch13 ' test_expect_success 'multiple files' ' @@ -752,16 +786,14 @@ M64=$M8$M8$M8$M8$M8$M8$M8$M8 M512=$M64$M64$M64$M64$M64$M64$M64$M64 cat >expect <<'EOF' Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar EOF -test_expect_success 'format-patch wraps extremely long headers (ascii)' ' +test_expect_success 'format-patch wraps extremely long subject (ascii)' ' echo content >>file && git add file && git commit -m "$M512" && @@ -774,30 +806,31 @@ M8="föö bar " M64=$M8$M8$M8$M8$M8$M8$M8$M8 M512=$M64$M64$M64$M64$M64$M64$M64$M64 cat >expect <<'EOF' -Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= +Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= EOF -test_expect_success 'format-patch wraps extremely long headers (rfc2047)' ' +test_expect_success 'format-patch wraps extremely long subject (rfc2047)' ' rm -rf patches/ && echo content >>file && git add file && @@ -807,52 +840,80 @@ test_expect_success 'format-patch wraps extremely long headers (rfc2047)' ' test_cmp expect subject ' -M8="foo_bar_" -M64=$M8$M8$M8$M8$M8$M8$M8$M8 -cat >expect <<EOF -From: $M64 - <foobar@foo.bar> -EOF -test_expect_success 'format-patch wraps non-quotable headers' ' - rm -rf patches/ && - echo content >>file && - git add file && - git commit -mfoo --author "$M64 <foobar@foo.bar>" && - git format-patch --stdout -1 >patch && - sed -n "/^From: /p; /^ /p; /^$/q" <patch >from && - test_cmp expect from -' - check_author() { echo content >>file && git add file && GIT_AUTHOR_NAME=$1 git commit -m author-check && git format-patch --stdout -1 >patch && - grep ^From: patch >actual && + sed -n "/^From: /p; /^ /p; /^$/q" <patch >actual && test_cmp expect actual } cat >expect <<'EOF' From: "Foo B. Bar" <author@example.com> EOF -test_expect_success 'format-patch quotes dot in headers' ' +test_expect_success 'format-patch quotes dot in from-headers' ' check_author "Foo B. Bar" ' cat >expect <<'EOF' From: "Foo \"The Baz\" Bar" <author@example.com> EOF -test_expect_success 'format-patch quotes double-quote in headers' ' +test_expect_success 'format-patch quotes double-quote in from-headers' ' check_author "Foo \"The Baz\" Bar" ' cat >expect <<'EOF' -From: =?UTF-8?q?"F=C3=B6o=20B.=20Bar"?= <author@example.com> +From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com> +EOF +test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' ' + check_author "Föo Bar" +' + +cat >expect <<'EOF' +From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com> EOF -test_expect_success 'rfc2047-encoded headers also double-quote 822 specials' ' +test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' ' check_author "Föo B. Bar" ' +cat >expect <<EOF +From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_ + <author@example.com> +EOF +test_expect_success 'format-patch wraps moderately long from-header (ascii)' ' + check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_" +' + +cat >expect <<'EOF' +From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo + Bar Foo Bar Foo Bar Foo Bar <author@example.com> +EOF +test_expect_success 'format-patch wraps extremely long from-header (ascii)' ' + check_author "Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + +cat >expect <<'EOF' +From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo + Bar Foo Bar Foo Bar Foo Bar" <author@example.com> +EOF +test_expect_success 'format-patch wraps extremely long from-header (rfc822)' ' + check_author "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + +cat >expect <<'EOF' +From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?= + =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?= + =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?= + =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?= + =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com> +EOF +test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' ' + check_author "Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + cat >expect <<'EOF' Subject: header with . in it EOF diff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh new file mode 100755 index 0000000000..97172b46b2 --- /dev/null +++ b/t/t4055-diff-context.sh @@ -0,0 +1,92 @@ +#!/bin/sh +# +# Copyright (c) 2012 Mozilla Foundation +# + +test_description='diff.context configuration' + +. ./test-lib.sh + +test_expect_success 'setup' ' + cat >template <<-\EOF && + firstline + b + c + d + e + f + preline + TARGET + postline + i + j + k + l + m + n + EOF + sed "/TARGET/d" >x <template && + git update-index --add x && + git commit -m initial && + + sed "s/TARGET/ADDED/" >x <template && + git update-index --add x && + git commit -m next && + + sed "s/TARGET/MODIFIED/" >x <template +' + +test_expect_success 'the default number of context lines is 3' ' + git diff >output && + ! grep "^ d" output && + grep "^ e" output && + grep "^ j" output && + ! grep "^ k" output +' + +test_expect_success 'diff.context honored by "log"' ' + git log -1 -p >output && + ! grep firstline output && + git config diff.context 8 && + git log -1 -p >output && + grep "^ firstline" output +' + +test_expect_success 'The -U option overrides diff.context' ' + git config diff.context 8 && + git log -U4 -1 >output && + ! grep "^ firstline" output +' + +test_expect_success 'diff.context honored by "diff"' ' + git config diff.context 8 && + git diff >output && + grep "^ firstline" output +' + +test_expect_success 'plumbing not affected' ' + git config diff.context 8 && + git diff-files -p >output && + ! grep "^ firstline" output +' + +test_expect_success 'non-integer config parsing' ' + git config diff.context no && + test_must_fail git diff 2>output && + test_i18ngrep "bad config value" output +' + +test_expect_success 'negative integer config parsing' ' + git config diff.context -1 && + test_must_fail git diff 2>output && + test_i18ngrep "bad config file" output +' + +test_expect_success '-U0 is valid, so is diff.context=0' ' + git config diff.context 0 && + git diff >output && + grep "^-ADDED" output && + grep "^+MODIFIED" output +' + +test_done diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 924ba536ca..a343bf6c62 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -72,9 +72,9 @@ cat > expect << EOF commit. EOF -test_expect_success 'format %w(12,1,2)' ' +test_expect_success 'format %w(11,1,2)' ' - git log -2 --format="%w(12,1,2)This is the %s commit." > actual && + git log -2 --format="%w(11,1,2)This is the %s commit." > actual && test_cmp expect actual ' @@ -230,6 +230,12 @@ test_expect_success 'log --grep -i' ' test_cmp expect actual ' +test_expect_success 'log -F -E --grep=<ere> uses ere' ' + echo second >expect && + git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual && + test_cmp expect actual +' + cat > expect <<EOF * Second * sixth diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index 78ab177938..129fc88bd2 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -159,7 +159,7 @@ test_expect_success 'receive-pack runs auto-gc in remote repo' ' git commit -a -m "Second commit" && git repack ) && - cp -a parent child && + cp -R parent child && ( # Set the child to auto-pack if more than one pack exists cd child && diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh index 16ef0419e9..80d20c876b 100755 --- a/t/t5550-http-fetch.sh +++ b/t/t5550-http-fetch.sh @@ -22,7 +22,7 @@ test_expect_success 'setup repository' ' ' test_expect_success 'create http-accessible bare repository with loose objects' ' - cp -a .git "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + cp -R .git "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && git config core.bare true && mkdir -p hooks && diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh index 5702334510..e7dc668cef 100755 --- a/t/t5800-remote-helpers.sh +++ b/t/t5800-remote-helpers.sh @@ -76,7 +76,7 @@ test_expect_success 'pushing to local repo' ' # git-remote-testgit, but is too slow to leave in for general use. : test_expect_success 'racily pushing to local repo' ' test_when_finished "rm -rf server2 localclone2" && - cp -a server server2 && + cp -R server server2 && git clone "testgit::${PWD}/server2" localclone2 && (cd localclone2 && echo content >>file && diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 4d13e10de1..1e7a209efa 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -167,10 +167,11 @@ test_expect_success 'author information is preserved' ' test_tick && GIT_AUTHOR_NAME="B V Uips" git commit -m bvuips && git branch preserved-author && - git filter-branch -f --msg-filter "cat; \ + (sane_unset GIT_AUTHOR_NAME && + git filter-branch -f --msg-filter "cat; \ test \$GIT_COMMIT != $(git rev-parse master) || \ echo Hallo" \ - preserved-author && + preserved-author) && test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l) ' diff --git a/t/t7008-grep-binary.sh b/t/t7008-grep-binary.sh index fd6410fc71..26f831984d 100755 --- a/t/t7008-grep-binary.sh +++ b/t/t7008-grep-binary.sh @@ -111,6 +111,28 @@ test_expect_success 'grep respects binary diff attribute' ' test_cmp expect actual ' +test_expect_success 'grep --cached respects binary diff attribute' ' + git grep --cached text t >actual && + test_cmp expect actual +' + +test_expect_success 'grep --cached respects binary diff attribute (2)' ' + git add .gitattributes && + rm .gitattributes && + git grep --cached text t >actual && + test_when_finished "git rm --cached .gitattributes" && + test_when_finished "git checkout .gitattributes" && + test_cmp expect actual +' + +test_expect_success 'grep revision respects binary diff attribute' ' + git commit -m new && + echo "Binary file HEAD:t matches" >expect && + git grep text HEAD -- t >actual && + test_when_finished "git reset HEAD^" && + test_cmp expect actual +' + test_expect_success 'grep respects not-binary diff attribute' ' echo binQary | q_to_nul >b && git add b && diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 5397037491..de7d45352e 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -681,4 +681,79 @@ test_expect_success 'moving the superproject does not break submodules' ' ) ' +test_expect_success 'submodule add --name allows to replace a submodule with another at the same path' ' + ( + cd addtest2 && + ( + cd repo && + echo "$submodurl/repo" >expect && + git config remote.origin.url >actual && + test_cmp expect actual && + echo "gitdir: ../.git/modules/repo" >expect && + test_cmp expect .git + ) && + rm -rf repo && + git rm repo && + git submodule add -q --name repo_new "$submodurl/bare.git" repo >actual && + test ! -s actual && + echo "gitdir: ../.git/modules/submod" >expect && + test_cmp expect submod/.git && + ( + cd repo && + echo "$submodurl/bare.git" >expect && + git config remote.origin.url >actual && + test_cmp expect actual && + echo "gitdir: ../.git/modules/repo_new" >expect && + test_cmp expect .git + ) && + echo "repo" >expect && + git config -f .gitmodules submodule.repo.path >actual && + test_cmp expect actual && + git config -f .gitmodules submodule.repo_new.path >actual && + test_cmp expect actual&& + echo "$submodurl/repo" >expect && + git config -f .gitmodules submodule.repo.url >actual && + test_cmp expect actual && + echo "$submodurl/bare.git" >expect && + git config -f .gitmodules submodule.repo_new.url >actual && + test_cmp expect actual && + echo "$submodurl/repo" >expect && + git config submodule.repo.url >actual && + test_cmp expect actual && + echo "$submodurl/bare.git" >expect && + git config submodule.repo_new.url >actual && + test_cmp expect actual + ) +' + +test_expect_success 'submodule add with an existing name fails unless forced' ' + ( + cd addtest2 && + rm -rf repo && + git rm repo && + test_must_fail git submodule add -q --name repo_new "$submodurl/repo.git" repo && + test ! -d repo && + echo "repo" >expect && + git config -f .gitmodules submodule.repo_new.path >actual && + test_cmp expect actual&& + echo "$submodurl/bare.git" >expect && + git config -f .gitmodules submodule.repo_new.url >actual && + test_cmp expect actual && + echo "$submodurl/bare.git" >expect && + git config submodule.repo_new.url >actual && + test_cmp expect actual && + git submodule add -f -q --name repo_new "$submodurl/repo.git" repo && + test -d repo && + echo "repo" >expect && + git config -f .gitmodules submodule.repo_new.path >actual && + test_cmp expect actual&& + echo "$submodurl/repo.git" >expect && + git config -f .gitmodules submodule.repo_new.url >actual && + test_cmp expect actual && + echo "$submodurl/repo.git" >expect && + git config submodule.repo_new.url >actual && + test_cmp expect actual + ) +' + test_done diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index 15426530e4..feaec6cdf4 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -627,7 +627,7 @@ test_expect_success 'submodule add properly re-creates deeper level submodules' (cd super && git reset --hard master && rm -rf deeper/ && - git submodule add ../submodule deeper/submodule + git submodule add --force ../submodule deeper/submodule ) ' diff --git a/t/t9020-remote-svn.sh b/t/t9020-remote-svn.sh new file mode 100755 index 0000000000..4f2dfe0e3d --- /dev/null +++ b/t/t9020-remote-svn.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +test_description='tests remote-svn' + +. ./test-lib.sh + +MARKSPATH=.git/info/fast-import/remote-svn + +if ! test_have_prereq PYTHON +then + skip_all='skipping remote-svn tests, python not available' + test_done +fi + +# We override svnrdump by placing a symlink to the svnrdump-emulator in . +export PATH="$HOME:$PATH" +ln -sf $GIT_BUILD_DIR/contrib/svn-fe/svnrdump_sim.py "$HOME/svnrdump" + +init_git () { + rm -fr .git && + git init && + #git remote add svnsim testsvn::sim:///$TEST_DIRECTORY/t9020/example.svnrdump + # let's reuse an exisiting dump file!? + git remote add svnsim testsvn::sim://$TEST_DIRECTORY/t9154/svn.dump + git remote add svnfile testsvn::file://$TEST_DIRECTORY/t9154/svn.dump +} + +if test -e "$GIT_BUILD_DIR/git-remote-testsvn" +then + test_set_prereq REMOTE_SVN +fi + +test_debug ' + git --version + which git + which svnrdump +' + +test_expect_success REMOTE_SVN 'simple fetch' ' + init_git && + git fetch svnsim && + test_cmp .git/refs/svn/svnsim/master .git/refs/remotes/svnsim/master && + cp .git/refs/remotes/svnsim/master master.good +' + +test_debug ' + cat .git/refs/svn/svnsim/master + cat .git/refs/remotes/svnsim/master +' + +test_expect_success REMOTE_SVN 'repeated fetch, nothing shall change' ' + git fetch svnsim && + test_cmp master.good .git/refs/remotes/svnsim/master +' + +test_expect_success REMOTE_SVN 'fetch from a file:// url gives the same result' ' + git fetch svnfile +' + +test_expect_failure REMOTE_SVN 'the sha1 differ because the git-svn-id line in the commit msg contains the url' ' + test_cmp .git/refs/remotes/svnfile/master .git/refs/remotes/svnsim/master +' + +test_expect_success REMOTE_SVN 'mark-file regeneration' ' + # filter out any other marks, that can not be regenerated. Only up to 3 digit revisions are allowed here + grep ":[0-9]\{1,3\} " $MARKSPATH/svnsim.marks > $MARKSPATH/svnsim.marks.old && + rm $MARKSPATH/svnsim.marks && + git fetch svnsim && + test_cmp $MARKSPATH/svnsim.marks.old $MARKSPATH/svnsim.marks +' + +test_expect_success REMOTE_SVN 'incremental imports must lead to the same head' ' + export SVNRMAX=3 && + init_git && + git fetch svnsim && + test_cmp .git/refs/svn/svnsim/master .git/refs/remotes/svnsim/master && + unset SVNRMAX && + git fetch svnsim && + test_cmp master.good .git/refs/remotes/svnsim/master +' + +test_debug 'git branch -a' + +test_done diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh index 193d3cabdd..15f93b4c28 100755 --- a/t/t9118-git-svn-funky-branch-names.sh +++ b/t/t9118-git-svn-funky-branch-names.sh @@ -28,7 +28,7 @@ test_expect_success 'setup svnrepo' ' svn_cmd cp -m "trailing .lock" "$svnrepo/pr ject/trunk" \ "$svnrepo/pr ject/branches/trailing_dotlock.lock" && svn_cmd cp -m "reflog" "$svnrepo/pr ject/trunk" \ - "$svnrepo/pr ject/branches/not-a%40{0}reflog" && + "$svnrepo/pr ject/branches/not-a@{0}reflog@" && start_httpd ' diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh index b59be9a894..69934b2e77 100755 --- a/t/t9200-git-cvsexportcommit.sh +++ b/t/t9200-git-cvsexportcommit.sh @@ -19,7 +19,7 @@ then test_done fi -CVSROOT=$PWD/cvsroot +CVSROOT=$PWD/tmpcvsroot CVSWORK=$PWD/cvswork GIT_DIR=$PWD/.git export CVSROOT CVSWORK GIT_DIR diff --git a/t/test-lib.sh b/t/test-lib.sh index 514282cbdf..489bc80fc1 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -230,7 +230,7 @@ else say_color() { test -z "$1" && test -n "$quiet" && return shift - echo "$*" + printf "%s\n" "$*" } fi diff --git a/test-svn-fe.c b/test-svn-fe.c index 83633a21e5..0f2d9a4a3d 100644 --- a/test-svn-fe.c +++ b/test-svn-fe.c @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) if (argc == 2) { if (svndump_init(argv[1])) return 1; - svndump_read(NULL); + svndump_read(NULL, "refs/heads/master", "refs/notes/svn/revs"); svndump_deinit(); svndump_reset(); return 0; diff --git a/transport-helper.c b/transport-helper.c index cfe0988490..4713b69302 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -10,6 +10,7 @@ #include "string-list.h" #include "thread-utils.h" #include "sigchain.h" +#include "argv-array.h" static int debug; @@ -19,6 +20,7 @@ struct helper_data { FILE *out; unsigned fetch : 1, import : 1, + bidi_import : 1, export : 1, option : 1, push : 1, @@ -101,6 +103,7 @@ static void do_take_over(struct transport *transport) static struct child_process *get_helper(struct transport *transport) { struct helper_data *data = transport->data; + struct argv_array argv = ARGV_ARRAY_INIT; struct strbuf buf = STRBUF_INIT; struct child_process *helper; const char **refspecs = NULL; @@ -122,11 +125,10 @@ static struct child_process *get_helper(struct transport *transport) helper->in = -1; helper->out = -1; helper->err = 0; - helper->argv = xcalloc(4, sizeof(*helper->argv)); - strbuf_addf(&buf, "git-remote-%s", data->name); - helper->argv[0] = strbuf_detach(&buf, NULL); - helper->argv[1] = transport->remote->name; - helper->argv[2] = remove_ext_force(transport->url); + argv_array_pushf(&argv, "git-remote-%s", data->name); + argv_array_push(&argv, transport->remote->name); + argv_array_push(&argv, remove_ext_force(transport->url)); + helper->argv = argv_array_detach(&argv, NULL); helper->git_cmd = 0; helper->silent_exec_failure = 1; @@ -178,6 +180,8 @@ static struct child_process *get_helper(struct transport *transport) data->push = 1; else if (!strcmp(capname, "import")) data->import = 1; + else if (!strcmp(capname, "bidi-import")) + data->bidi_import = 1; else if (!strcmp(capname, "export")) data->export = 1; else if (!data->refspecs && !prefixcmp(capname, "refspec ")) { @@ -241,8 +245,7 @@ static int disconnect_helper(struct transport *transport) close(data->helper->out); fclose(data->out); res = finish_command(data->helper); - free((char *)data->helper->argv[0]); - free(data->helper->argv); + argv_array_free_detached(data->helper->argv); free(data->helper); data->helper = NULL; } @@ -376,14 +379,23 @@ static int fetch_with_fetch(struct transport *transport, static int get_importer(struct transport *transport, struct child_process *fastimport) { struct child_process *helper = get_helper(transport); + struct helper_data *data = transport->data; + struct argv_array argv = ARGV_ARRAY_INIT; + int cat_blob_fd, code; memset(fastimport, 0, sizeof(*fastimport)); fastimport->in = helper->out; - fastimport->argv = xcalloc(5, sizeof(*fastimport->argv)); - fastimport->argv[0] = "fast-import"; - fastimport->argv[1] = "--quiet"; + argv_array_push(&argv, "fast-import"); + argv_array_push(&argv, debug ? "--stats" : "--quiet"); + if (data->bidi_import) { + cat_blob_fd = xdup(helper->in); + argv_array_pushf(&argv, "--cat-blob-fd=%d", cat_blob_fd); + } + fastimport->argv = argv.argv; fastimport->git_cmd = 1; - return start_command(fastimport); + + code = start_command(fastimport); + return code; } static int get_exporter(struct transport *transport, @@ -438,11 +450,17 @@ static int fetch_with_import(struct transport *transport, } write_constant(data->helper->in, "\n"); + /* + * remote-helpers that advertise the bidi-import capability are required to + * buffer the complete batch of import commands until this newline before + * sending data to fast-import. + * These helpers read back data from fast-import on their stdin, which could + * be mixed with import commands, otherwise. + */ if (finish_command(&fastimport)) die("Error while running fast-import"); - free(fastimport.argv); - fastimport.argv = NULL; + argv_array_free_detached(fastimport.argv); /* * The fast-import stream of a remote helper that advertises diff --git a/upload-pack.c b/upload-pack.c index 2e90ccb74f..6142421ea1 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -727,12 +727,7 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo " include-tag multi_ack_detailed"; struct object *o = lookup_unknown_object(sha1); const char *refname_nons = strip_namespace(refname); - - if (o->type == OBJ_NONE) { - o->type = sha1_object_info(sha1, NULL); - if (o->type < 0) - die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1)); - } + unsigned char peeled[20]; if (capabilities) packet_write(1, "%s %s%c%s%s agent=%s\n", @@ -747,11 +742,8 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo o->flags |= OUR_REF; nr_our_refs++; } - if (o->type == OBJ_TAG) { - o = deref_tag_noverify(o); - if (o) - packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname_nons); - } + if (!peel_ref(refname, peeled)) + packet_write(1, "%s %s^{}\n", sha1_to_hex(peeled), refname_nons); return 0; } @@ -353,7 +353,7 @@ retry: c = *text; if (!c || isspace(c)) { - if (w < width || !space) { + if (w <= width || !space) { const char *start = bol; if (!c && text == start) return w; diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c index 1f04697866..f2b23c81de 100644 --- a/vcs-svn/fast_export.c +++ b/vcs-svn/fast_export.c @@ -3,8 +3,7 @@ * See LICENSE for details. */ -#include "git-compat-util.h" -#include "strbuf.h" +#include "cache.h" #include "quote.h" #include "fast_export.h" #include "repo_tree.h" @@ -68,11 +67,33 @@ void fast_export_modify(const char *path, uint32_t mode, const char *dataref) putchar('\n'); } +void fast_export_begin_note(uint32_t revision, const char *author, + const char *log, unsigned long timestamp, const char *note_ref) +{ + static int firstnote = 1; + size_t loglen = strlen(log); + printf("commit %s\n", note_ref); + printf("committer %s <%s@%s> %ld +0000\n", author, author, "local", timestamp); + printf("data %"PRIuMAX"\n", (uintmax_t)loglen); + fwrite(log, loglen, 1, stdout); + if (firstnote) { + if (revision > 1) + printf("from %s^0", note_ref); + firstnote = 0; + } + fputc('\n', stdout); +} + +void fast_export_note(const char *committish, const char *dataref) +{ + printf("N %s %s\n", dataref, committish); +} + static char gitsvnline[MAX_GITSVN_LINE_LEN]; void fast_export_begin_commit(uint32_t revision, const char *author, const struct strbuf *log, const char *uuid, const char *url, - unsigned long timestamp) + unsigned long timestamp, const char *local_ref) { static const struct strbuf empty = STRBUF_INIT; if (!log) @@ -84,7 +105,7 @@ void fast_export_begin_commit(uint32_t revision, const char *author, } else { *gitsvnline = '\0'; } - printf("commit refs/heads/master\n"); + printf("commit %s\n", local_ref); printf("mark :%"PRIu32"\n", revision); printf("committer %s <%s@%s> %ld +0000\n", *author ? author : "nobody", @@ -222,6 +243,13 @@ static long apply_delta(off_t len, struct line_buffer *input, return ret; } +void fast_export_buf_to_data(const struct strbuf *data) +{ + printf("data %"PRIuMAX"\n", (uintmax_t)data->len); + fwrite(data->buf, data->len, 1, stdout); + fputc('\n', stdout); +} + void fast_export_data(uint32_t mode, off_t len, struct line_buffer *input) { assert(len >= 0); diff --git a/vcs-svn/fast_export.h b/vcs-svn/fast_export.h index 8823aca15c..c8b5adb811 100644 --- a/vcs-svn/fast_export.h +++ b/vcs-svn/fast_export.h @@ -9,11 +9,15 @@ void fast_export_deinit(void); void fast_export_delete(const char *path); void fast_export_modify(const char *path, uint32_t mode, const char *dataref); +void fast_export_note(const char *committish, const char *dataref); +void fast_export_begin_note(uint32_t revision, const char *author, + const char *log, unsigned long timestamp, const char *note_ref); void fast_export_begin_commit(uint32_t revision, const char *author, - const struct strbuf *log, const char *uuid, - const char *url, unsigned long timestamp); + const struct strbuf *log, const char *uuid,const char *url, + unsigned long timestamp, const char *local_ref); void fast_export_end_commit(uint32_t revision); void fast_export_data(uint32_t mode, off_t len, struct line_buffer *input); +void fast_export_buf_to_data(const struct strbuf *data); void fast_export_blob_delta(uint32_t mode, uint32_t old_mode, const char *old_data, off_t len, struct line_buffer *input); diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index 2b168aee75..31d1d83d45 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -48,7 +48,7 @@ static struct { static struct { uint32_t revision; unsigned long timestamp; - struct strbuf log, author; + struct strbuf log, author, note; } rev_ctx; static struct { @@ -77,6 +77,7 @@ static void reset_rev_ctx(uint32_t revision) rev_ctx.timestamp = 0; strbuf_reset(&rev_ctx.log); strbuf_reset(&rev_ctx.author); + strbuf_reset(&rev_ctx.note); } static void reset_dump_ctx(const char *url) @@ -299,22 +300,29 @@ static void handle_node(void) node_ctx.text_length, &input); } -static void begin_revision(void) +static void begin_revision(const char *remote_ref) { if (!rev_ctx.revision) /* revision 0 gets no git commit. */ return; fast_export_begin_commit(rev_ctx.revision, rev_ctx.author.buf, &rev_ctx.log, dump_ctx.uuid.buf, dump_ctx.url.buf, - rev_ctx.timestamp); + rev_ctx.timestamp, remote_ref); } -static void end_revision(void) +static void end_revision(const char *note_ref) { - if (rev_ctx.revision) + struct strbuf mark = STRBUF_INIT; + if (rev_ctx.revision) { fast_export_end_commit(rev_ctx.revision); + fast_export_begin_note(rev_ctx.revision, "remote-svn", + "Note created by remote-svn.", rev_ctx.timestamp, note_ref); + strbuf_addf(&mark, ":%"PRIu32, rev_ctx.revision); + fast_export_note(mark.buf, "inline"); + fast_export_buf_to_data(&rev_ctx.note); + } } -void svndump_read(const char *url) +void svndump_read(const char *url, const char *local_ref, const char *notes_ref) { char *val; char *t; @@ -353,11 +361,12 @@ void svndump_read(const char *url) if (active_ctx == NODE_CTX) handle_node(); if (active_ctx == REV_CTX) - begin_revision(); + begin_revision(local_ref); if (active_ctx != DUMP_CTX) - end_revision(); + end_revision(notes_ref); active_ctx = REV_CTX; reset_rev_ctx(atoi(val)); + strbuf_addf(&rev_ctx.note, "%s\n", t); break; case sizeof("Node-path"): if (constcmp(t, "Node-")) @@ -366,13 +375,15 @@ void svndump_read(const char *url) if (active_ctx == NODE_CTX) handle_node(); if (active_ctx == REV_CTX) - begin_revision(); + begin_revision(local_ref); active_ctx = NODE_CTX; reset_node_ctx(val); + strbuf_addf(&rev_ctx.note, "%s\n", t); break; } if (constcmp(t + strlen("Node-"), "kind")) continue; + strbuf_addf(&rev_ctx.note, "%s\n", t); if (!strcmp(val, "dir")) node_ctx.type = REPO_MODE_DIR; else if (!strcmp(val, "file")) @@ -383,6 +394,7 @@ void svndump_read(const char *url) case sizeof("Node-action"): if (constcmp(t, "Node-action")) continue; + strbuf_addf(&rev_ctx.note, "%s\n", t); if (!strcmp(val, "delete")) { node_ctx.action = NODEACT_DELETE; } else if (!strcmp(val, "add")) { @@ -401,11 +413,13 @@ void svndump_read(const char *url) continue; strbuf_reset(&node_ctx.src); strbuf_addstr(&node_ctx.src, val); + strbuf_addf(&rev_ctx.note, "%s\n", t); break; case sizeof("Node-copyfrom-rev"): if (constcmp(t, "Node-copyfrom-rev")) continue; node_ctx.srcRev = atoi(val); + strbuf_addf(&rev_ctx.note, "%s\n", t); break; case sizeof("Text-content-length"): if (constcmp(t, "Text") && constcmp(t, "Prop")) @@ -463,25 +477,40 @@ void svndump_read(const char *url) if (active_ctx == NODE_CTX) handle_node(); if (active_ctx == REV_CTX) - begin_revision(); + begin_revision(local_ref); if (active_ctx != DUMP_CTX) - end_revision(); + end_revision(notes_ref); } -int svndump_init(const char *filename) +static void init(int report_fd) { - if (buffer_init(&input, filename)) - return error("cannot open %s: %s", filename, strerror(errno)); - fast_export_init(REPORT_FILENO); + fast_export_init(report_fd); strbuf_init(&dump_ctx.uuid, 4096); strbuf_init(&dump_ctx.url, 4096); strbuf_init(&rev_ctx.log, 4096); strbuf_init(&rev_ctx.author, 4096); + strbuf_init(&rev_ctx.note, 4096); strbuf_init(&node_ctx.src, 4096); strbuf_init(&node_ctx.dst, 4096); reset_dump_ctx(NULL); reset_rev_ctx(0); reset_node_ctx(NULL); + return; +} + +int svndump_init(const char *filename) +{ + if (buffer_init(&input, filename)) + return error("cannot open %s: %s", filename ? filename : "NULL", strerror(errno)); + init(REPORT_FILENO); + return 0; +} + +int svndump_init_fd(int in_fd, int back_fd) +{ + if(buffer_fdinit(&input, xdup(in_fd))) + return error("cannot open fd %d: %s", in_fd, strerror(errno)); + init(xdup(back_fd)); return 0; } @@ -492,6 +521,8 @@ void svndump_deinit(void) reset_rev_ctx(0); reset_node_ctx(NULL); strbuf_release(&rev_ctx.log); + strbuf_release(&rev_ctx.author); + strbuf_release(&rev_ctx.note); strbuf_release(&node_ctx.src); strbuf_release(&node_ctx.dst); if (buffer_deinit(&input)) diff --git a/vcs-svn/svndump.h b/vcs-svn/svndump.h index df9ceb0e8d..b8eb12954e 100644 --- a/vcs-svn/svndump.h +++ b/vcs-svn/svndump.h @@ -2,7 +2,8 @@ #define SVNDUMP_H_ int svndump_init(const char *filename); -void svndump_read(const char *url); +int svndump_init_fd(int in_fd, int back_fd); +void svndump_read(const char *url, const char *local_ref, const char *notes_ref); void svndump_deinit(void); void svndump_reset(void); diff --git a/write_or_die.c b/write_or_die.c index d45b536021..960f448cff 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -34,12 +34,7 @@ void maybe_flush_or_die(FILE *f, const char *desc) return; } if (fflush(f)) { - /* - * On Windows, EPIPE is returned only by the first write() - * after the reading end has closed its handle; subsequent - * write()s return EINVAL. - */ - if (errno == EPIPE || errno == EINVAL) + if (errno == EPIPE) exit(0); die_errno("write failure on '%s'", desc); } |