diff options
392 files changed, 27847 insertions, 7624 deletions
diff --git a/.gitignore b/.gitignore index 51294d6c3c..f702415c12 100644 --- a/.gitignore +++ b/.gitignore @@ -190,10 +190,12 @@ /test-mktemp /test-parse-options /test-path-utils +/test-regex /test-revision-walking /test-run-command /test-sha1 /test-sigchain +/test-string-list /test-subprocess /test-svn-fe /common-cmds.h @@ -18,6 +18,7 @@ David KÃ¥gedal <davidk@lysator.liu.se> David S. Miller <davem@davemloft.net> Deskin Miller <deskinm@umich.edu> Dirk Süsserott <newsletter@dirk.my1.cc> +Erik Faye-Lund <kusmabite@gmail.com> <kusmabite@googlemail.com> Fredrik Kuivinen <freku045@student.liu.se> H. Peter Anvin <hpa@bonde.sc.orionmulti.com> H. Peter Anvin <hpa@tazenda.sc.orionmulti.com> @@ -26,6 +27,9 @@ Horst H. von Brand <vonbrand@inf.utfsm.cl> Ä°smail Dönmez <ismail@pardus.org.tr> Jay Soffian <jaysoffian+git@gmail.com> Joachim Berdal Haga <cjhaga@fys.uio.no> +Johannes Sixt <j6t@kdbg.org> <johannes.sixt@telecom.at> +Johannes Sixt <j6t@kdbg.org> <j.sixt@viscovery.net> +Johannes Sixt <j6t@kdbg.org> <J.Sixt@eudaptics.com> Jon Loeliger <jdl@freescale.com> Jon Seymour <jon@blackcubes.dyndns.org> Jonathan Nieder <jrnieder@uchicago.edu> @@ -43,6 +47,7 @@ Lars Doelle <lars.doelle@on-line.de> Li Hong <leehong@pku.edu.cn> Lukas Sandström <lukass@etek.chalmers.se> Martin Langhoff <martin@laptop.org> +Martin von Zweigbergk <martinvonz@gmail.com> <martin.von.zweigbergk@gmail.com> Michael Coleman <tutufan@gmail.com> Michael J Gruber <git@drmicha.warpmail.net> <michaeljgruber+gmane@fastmail.fm> Michael W. Olson <mwolson@gnu.org> @@ -51,7 +56,10 @@ Nanako Shiraishi <nanako3@bluebottle.com> Nanako Shiraishi <nanako3@lavabit.com> Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com> <nico@fluxnic.net> <nico@cam.org> +Peter Krefting <peter@softwolves.pp.se> <peter@svarten.intern.softwolves.pp.se> +Peter Krefting <peter@softwolves.pp.se> <peter@softwolves.pp.se> Philippe Bruhat <book@cpan.org> +Ralf Thielow <ralf.thielow@gmail.com> <ralf.thielow@googlemail.com> Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk> René Scharfe <rene.scharfe@lsrfire.ath.cx> Robert Fitzsimons <robfitz@273k.net> @@ -61,6 +69,7 @@ Sean Estabrooks <seanlkml@sympatico.ca> Shawn O. Pearce <spearce@spearce.org> Steven Grimm <koreth@midwinter.com> Theodore Ts'o <tytso@mit.edu> +Thomas Rast <trast@inf.ethz.ch> <trast@student.ethz.ch> Tony Luck <tony.luck@intel.com> Uwe Kleine-König <Uwe_Zeisberger@digi.com> Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index 45577117c2..57da6aadeb 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -76,11 +76,19 @@ For shell scripts specifically (not exhaustive): - We do not use Process Substitution <(list) or >(list). + - Do not write control structures on a single line with semicolon. + "then" should be on the next line for if statements, and "do" + should be on the next line for "while" and "for". + - We prefer "test" over "[ ... ]". - We do not write the noiseword "function" in front of shell functions. + - We prefer a space between the function name and the parentheses. The + opening "{" should also be on the same line. + E.g.: my_function () { + - As to use of grep, stick to a subset of BRE (namely, no \{m,n\}, [::], [==], nor [..]) for portability. diff --git a/Documentation/Makefile b/Documentation/Makefile index 063fa696c9..267dfe135d 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -44,9 +44,10 @@ man5dir=$(mandir)/man5 man7dir=$(mandir)/man7 # DESTDIR= -ASCIIDOC=asciidoc +ASCIIDOC = asciidoc ASCIIDOC_EXTRA = MANPAGE_XSL = manpage-normal.xsl +XMLTO = xmlto XMLTO_EXTRA = INSTALL?=install RM ?= rm -f @@ -245,7 +246,7 @@ manpage-base-url.xsl: manpage-base-url.xsl.in %.1 %.5 %.7 : %.xml manpage-base-url.xsl $(QUIET_XMLTO)$(RM) $@ && \ - xmlto -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $< + $(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $< %.xml : %.txt $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ @@ -344,4 +345,7 @@ require-htmlrepo:: quick-install-html: require-htmlrepo '$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(HTML_REPO) $(DESTDIR)$(htmldir) +print-man1: + @for i in $(MAN1_TXT); do echo $$i; done + .PHONY: FORCE 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.11.6.txt b/Documentation/RelNotes/1.7.11.6.txt new file mode 100644 index 0000000000..ba7d3c3966 --- /dev/null +++ b/Documentation/RelNotes/1.7.11.6.txt @@ -0,0 +1,84 @@ +Git v1.7.11.6 Release Notes +=========================== + +Fixes since v1.7.11.5 +--------------------- + + * "ciabot" script (in contrib/) has been updated with extensive + documentation. + + * "git foo" errored out with "Not a directory" when the user had a + non-directory on $PATH, and worse yet it masked an alias "foo" from + running. + + * When the user exports a non-default IFS without HT, scripts that + rely on being able to parse "ls-files -s | while read a b c..." + started to fail. Protect them from such a misconfiguration. + + * When the user gives an argument that can be taken as both a + revision name and a pathname without disambiguating with "--", we + used to give a help message "Use '--' to separate". The message + has been clarified to show where that '--' goes on the command + line. + + * Documentation for the configuration file format had a confusing + example. + + * Older parts of the documentation described as if having a regular + file in .git/refs/ hierarchy were the only way to have branches and + tags, which is not true for quite some time. + + * It was generally understood that "--long-option"s to many of our + subcommands can be abbreviated to the unique prefix, but it was not + easy to find it described for new readers of the documentation set. + + * The "--topo-order", "--date-order" (and the lack of either means + the default order) options to "rev-list" and "log" family of + commands were poorly described in the documentation. + + * "git commit --amend" let the user edit the log message and then + died when the human-readable committer name was given + insufficiently by getpwent(3). + + * The exit status code from "git config" was way overspecified while + being incorrect. The implementation has been updated to give the + documented status for a case that was documented, and introduce a + new code for "all other errors". + + * The output from "git diff -B" for a file that ends with an + incomplete line did not put "\ No newline..." on a line of its own. + + * "git diff" had a confusion between taking data from a path in the + working tree and taking data from an object that happens to have + name 0{40} recorded in a tree. + + * The "--rebase" option to "git pull" can be abbreviated to "-r", + but we didn't document it. + + * When "git push" triggered the automatic gc on the receiving end, a + message from "git prune" that said it was removing cruft leaked to + the standard output, breaking the communication protocol. + + * The reflog entries left by "git rebase" and "git rebase -i" were + inconsistent (the interactive one gave an abbreviated object name). + + * "git send-email" did not unquote encoded words that appear on the + header correctly, and lost "_" from strings. + + * "git stash apply/pop" did not trigger "rerere" upon conflicts + unlike other mergy operations. + + * "git submodule <cmd> path" did not error out when the path to the + submodule was misspelt. + + * "git submodule update -f" did not update paths in the working tree + that has local changes. + (merge 01d4721 sz/submodule-force-update later to maint). + + * "gitweb" when used with PATH_INFO failed to notice directories with + SP (and other characters that need URL-style quoting) in them. + + * Fallback 'getpass' implementation made unportable use of stdio API. + + * A utility shell function test_seq has been added as a replacement + for the 'seq' utility found on some platforms. diff --git a/Documentation/RelNotes/1.7.11.7.txt b/Documentation/RelNotes/1.7.11.7.txt new file mode 100644 index 0000000000..e7e79d999b --- /dev/null +++ b/Documentation/RelNotes/1.7.11.7.txt @@ -0,0 +1,46 @@ +Git v1.7.11.7 Release Notes +=========================== + +Fixes since v1.7.11.6 +--------------------- + + * The synopsis said "checkout [-B branch]" to make it clear the + branch name is a parameter to the option, but the heading for the + option description was "-B::", not "-B branch::", making the + documentation misleading. + + * Git ships with a fall-back regexp implementation for platforms with + buggy regexp library, but it was easy for people to keep using their + platform regexp. A new test has been added to check this. + + * "git apply -p0" did not parse pathnames on "diff --git" line + correctly. This caused patches that had pathnames in no other + places to be mistakenly rejected (most notably, binary patch that + does not rename nor change mode). Textual patches, renames or mode + changes have preimage and postimage pathnames in different places + in a form that can be parsed unambiguously and did not suffer from + this problem. + + * After "gitk" showed the contents of a tag, neither "Reread + references" nor "Reload" did not update what is shown as the + contents of it, when the user overwrote the tag with "git tag -f". + + * "git for-each-ref" did not currectly support more than one --sort + option. + + * "git log .." errored out saying it is both rev range and a path + when there is no disambiguating "--" is on the command line. + Update the command line parser to interpret ".." as a path in such + a case. + + * Pushing to smart HTTP server with recent Git fails without having + the username in the URL to force authentication, if the server is + configured to allow GET anonymously, while requiring authentication + for POST. + + * "git show --format='%ci'" did not give timestamp correctly for + commits created without human readable name on "committer" line. + (merge e27ddb6 jc/maint-ident-missing-human-name later to maint). + + * "git show --quiet" ought to be a synonym for "git show -s", but + wasn't. diff --git a/Documentation/RelNotes/1.7.12.1.txt b/Documentation/RelNotes/1.7.12.1.txt new file mode 100644 index 0000000000..b8f04af19f --- /dev/null +++ b/Documentation/RelNotes/1.7.12.1.txt @@ -0,0 +1,134 @@ +Git 1.7.12.1 Release Notes +========================== + +Fixes since v1.7.12 +------------------- + + * "git apply -p0" did not parse pathnames on "diff --git" line + correctly. This caused patches that had pathnames in no other + places to be mistakenly rejected (most notably, binary patch that + does not rename nor change mode). Textual patches, renames or mode + changes have preimage and postimage pathnames in different places + in a form that can be parsed unambiguously and did not suffer from + this problem. + + * "git cherry-pick A C B" used to replay changes in A and then B and + then C if these three commits had committer timestamps in that + order, which is not what the user who said "A C B" naturally + expects. + + * "git commit --amend" let the user edit the log message and then + died when the human-readable committer name was given + insufficiently by getpwent(3). + + * Some capabilities were asked by fetch-pack even when upload-pack + did not advertise that they are available. fetch-pack has been + fixed not to do so. + + * "git diff" had a confusion between taking data from a path in the + working tree and taking data from an object that happens to have + name 0{40} recorded in a tree. + + * "git for-each-ref" did not correctly support more than one --sort + option. + + * "git log .." errored out saying it is both rev range and a path + when there is no disambiguating "--" is on the command line. + Update the command line parser to interpret ".." as a path in such + a case. + + * The "--topo-order", "--date-order" (and the lack of either means + the default order) options to "rev-list" and "log" family of + commands were poorly described in the documentation. + + * "git prune" without "-v" used to warn about leftover temporary + files (which is an indication of an earlier aborted operation). + + * Pushing to smart HTTP server with recent Git fails without having + the username in the URL to force authentication, if the server is + configured to allow GET anonymously, while requiring authentication + for POST. + + * The reflog entries left by "git rebase" and "git rebase -i" were + inconsistent (the interactive one gave an abbreviated object name). + + * When "git push" triggered the automatic gc on the receiving end, a + message from "git prune" that said it was removing cruft leaked to + the standard output, breaking the communication protocol. + + * "git show --quiet" ought to be a synonym for "git show -s", but + wasn't. + + * "git show --format='%ci'" did not give timestamp correctly for + commits created without human readable name on "committer" line. + + * "git send-email" did not unquote encoded words that appear on the + header correctly, and lost "_" from strings. + + * The interactive prompt "git send-email" gives was error prone. It + asked "What e-mail address do you want to use?" with the address it + guessed (correctly) the user would want to use in its prompt, + tempting the user to say "y". But the response was taken as "No, + please use 'y' as the e-mail address instead", which is most + certainly not what the user meant. + + * "gitweb" when used with PATH_INFO failed to notice directories with + SP (and other characters that need URL-style quoting) in them. + + * When the user gives an argument that can be taken as both a + revision name and a pathname without disambiguating with "--", we + used to give a help message "Use '--' to separate". The message + has been clarified to show where that '--' goes on the command + line. + + * When the user exports a non-default IFS without HT, scripts that + rely on being able to parse "ls-files -s | while read a b c..." + started to fail. Protect them from such a misconfiguration. + + * The attribute system may be asked for a path that itself or its + leading directories no longer exists in the working tree, and it is + fine if we cannot open .gitattribute file in such a case. Failure + to open per-directory .gitattributes with error status other than + ENOENT and ENOTDIR should be diagnosed, but it wasn't. + + * After "gitk" showed the contents of a tag, neither "Reread + references" nor "Reload" did not update what is shown as the + contents of it, when the user overwrote the tag with "git tag -f". + + * "ciabot" script (in contrib/) has been updated with extensive + documentation. + + * "git-jump" script (in contrib/) did not work well when + diff.noprefix or diff.mnemonicprefix is in effect. + + * Older parts of the documentation described as if having a regular + file in .git/refs/ hierarchy were the only way to have branches and + tags, which is not true for quite some time. + + * A utility shell function test_seq has been added as a replacement + for the 'seq' utility found on some platforms. + + * Compatibility wrapper to learn the maximum number of file + descriptors we can open around sysconf(_SC_OPEN_MAX) and + getrlimit(RLIMIT_NO_FILE) has been introduced for portability. + + * We used curl_easy_strerror() without checking version of cURL, + breaking the build for versions before curl 7.12.0. + + * Code to work around MacOS X UTF-8 gotcha has been cleaned up. + + * Fallback 'getpass' implementation made unportable use of stdio API. + + * The "--rebase" option to "git pull" can be abbreviated to "-r", + but we didn't document it. + + * It was generally understood that "--long-option"s to many of our + subcommands can be abbreviated to the unique prefix, but it was not + easy to find it described for new readers of the documentation set. + + * The synopsis said "checkout [-B branch]" to make it clear the + branch name is a parameter to the option, but the heading for the + option description was "-B::", not "-B branch::", making the + documentation misleading. + +Also contains numerous documentation updates. diff --git a/Documentation/RelNotes/1.7.12.2.txt b/Documentation/RelNotes/1.7.12.2.txt new file mode 100644 index 0000000000..69255745e6 --- /dev/null +++ b/Documentation/RelNotes/1.7.12.2.txt @@ -0,0 +1,40 @@ +Git 1.7.12.2 Release Notes +========================== + +Fixes since v1.7.12.1 +--------------------- + + * When "git am" is fed an input that has multiple "Content-type: ..." + header, it did not grok charset= attribute correctly. + + * Even during a conflicted merge, "git blame $path" always meant to + blame uncommitted changes to the "working tree" version; make it + more useful by showing cleanly merged parts as coming from the other + branch that is being merged. + + * "git blame MAKEFILE" run in a history that has "Makefile" but not + "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got + confused on a case insensitive filesystem and failed to do so. + + * "git fetch --all", when passed "--no-tags", did not honor the + "--no-tags" option while fetching from individual remotes (the same + issue existed with "--tags", but combination "--all --tags" makes + much less sense than "--all --no-tags"). + + * "git log/diff/format-patch --stat" showed the "N line(s) added" + comment in user's locale and caused careless submitters to send + patches with such a line in them to projects whose project language + is not their language, mildly irritating others. Localization to + the line has been disabled for now. + + * "git log --all-match --grep=A --grep=B" ought to show commits that + mention both A and B, but when these three options are used with + --author or --committer, it showed commits that mention either A or + B (or both) instead. + + * The subcommand to remove the definition of a remote in "git remote" + was named "rm" even though all other subcommands were spelled out. + Introduce "git remote remove" to remove confusion, and keep "rm" as + a backward compatible synonym. + +Also contains a handful of documentation updates. diff --git a/Documentation/RelNotes/1.7.12.3.txt b/Documentation/RelNotes/1.7.12.3.txt new file mode 100644 index 0000000000..ecda427a35 --- /dev/null +++ b/Documentation/RelNotes/1.7.12.3.txt @@ -0,0 +1,34 @@ +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. + + * "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. + + * "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. + +Also contains a handful of documentation updates. 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 new file mode 100644 index 0000000000..43883c14f0 --- /dev/null +++ b/Documentation/RelNotes/1.8.0.txt @@ -0,0 +1,267 @@ +Git v1.8.0 Release Notes +======================== + +Backward compatibility notes +---------------------------- + +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 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 +been introduced with a saner order of arguments. + + +Updates since v1.7.12 +--------------------- + +UI, Workflows & Features + + * A credential helper for Win32 to allow access to the keychain of + the logged-in user has been added. + + * An initial port to HP NonStop. + + * A credential helper to allow access to the Gnome keyring has been + added. + + * 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. 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 + integrate with the currently checked out branch, which is highly + unlikely what the user meant. The option is deprecated; use the + new "--set-upstream-to" (with a short-and-sweet "-u") option + instead. + + * "git cherry-pick" learned the "--allow-empty-message" option to + allow it to replay a commit without any log message. + + * After "git cherry-pick -s" gave control back to the user asking + help to resolve conflicts, concluding "git commit" used to need to + be run with "-s" if the user wants to sign it off; now the command + leaves the sign-off line in the log template. + + * "git daemon" learned the "--access-hook" option to allow an + external command to decline service based on the client address, + repository path, etc. + + * "git difftool --dir-diff" learned to use symbolic links to prepare + a temporary copy of the working tree when available. + + * "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. + + * "git merge-base" learned the "--is-ancestor A B" option to tell if A is + an ancestor of B. The result is indicated by its exit status code. + + * "git mergetool" now allows users to override the actual command used + with the mergetool.$name.cmd configuration variable even for built-in + mergetool backends. + + * "git rebase -i" learned the "--edit-todo" option to open an editor + to edit the instruction sheet. + + +Foreign Interface + + * "git svn" has been updated to work with SVN 1.7. + + * "git p4" learned the "--conflicts" option to specify what to do when + encountering a conflict during "p4 submit". + + +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 + platform regexp by mistake. A new test has been added to check this. + + * The "check-docs" build target has been updated and greatly + simplified. + + * The test suite is run under MALLOC_CHECK_ when running with a glibc + that supports the feature. + + * The documentation in the TeXinfo format was using indented output + for materials meant to be examples that are better typeset in + monospace. + + * Compatibility wrapper around some mkdir(2) implementations that + reject parameters with trailing slash has been introduced. + + * Compatibility wrapper for systems that lack usable setitimer() has + been added. + + * The option parsing of "git checkout" had error checking, dwim and + defaulting missing options, all mixed in the code, and issuing an + appropriate error message with useful context was getting harder. + The code has been reorganized to allow giving a proper diagnosis + when the user says "git checkout -b -t foo bar" (e.g. "-t" is not a + good name for a branch). + + * Many internal uses of a "git merge-base" equivalent were only to see + if one commit fast-forwards to the other, which did not need the + full set of merge bases to be computed. They have been updated to + use less expensive checks. + + * The heuristics to detect and silently convert latin1 to utf8 when + we were told to use utf-8 in the log message has been transplanted + from "mailinfo" to "commit" and "commit-tree". + + * Messages given by "git <subcommand> -h" from many subcommands have + been marked for translation. + + +Also contains minor documentation updates and code clean-ups. + + +Fixes since v1.7.12 +------------------- + +Unless otherwise noted, all the fixes since v1.7.12 in the +maintenance track are contained in this release (see release notes +to them for details). + + * The attribute system may be asked for a path that itself or its + leading directories no longer exists in the working tree, and it is + fine if we cannot open .gitattribute file in such a case. Failure + to open per-directory .gitattributes with error status other than + ENOENT and ENOTDIR should be diagnosed, but it wasn't. + + * When looking for $HOME/.gitconfig etc., it is OK if we cannot read + them because they do not exist, but we did not diagnose existing + files that we cannot read. + + * When "git am" is fed an input that has multiple "Content-type: ..." + header, it did not grok charset= attribute correctly. + + * "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 + confused on a case insensitive filesystem and failed to do so. + + * Even during a conflicted merge, "git blame $path" always meant to + blame uncommitted changes to the "working tree" version; make it + more useful by showing cleanly merged parts as coming from the other + branch that is being merged. + + * It was unclear in the documentation for "git blame" that it is + unnecessary for users to use the "--follow" option. + + * Output from "git branch -v" contains "(no branch)" that could be + localized, but the code to align it along with the names of + branches was counting in bytes, not in display columns. + + * "git cherry-pick A C B" used to replay changes in A and then B and + then C if these three commits had committer timestamps in that + order, which is not what the user who said "A C B" naturally + expects. + + * 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". + + * Documentation talked about "first line of commit log" when it meant + the title of the commit. The description was clarified by defining + how the title is decided and rewording the casual mention of "first + line" to "title". + + * "git cvsimport" did not thoroughly cleanse tag names that it + inferred from the names of the tags it obtained from CVS, which + caused "git tag" to barf and stop the import in the middle. + + * Earlier we made the diffstat summary line that shows the number of + lines added/deleted localizable, but it was found irritating having + to see them in various languages on a list whose discussion language + is English, and this change has been reverted. + + * "git fetch --all", when passed "--no-tags", did not honor the + "--no-tags" option while fetching from individual remotes (the same + issue existed with "--tags", but the combination "--all --tags" makes + much less sense than "--all --no-tags"). + + * "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. + + * "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. + + * "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. + + * After "gitk" showed the contents of a tag, neither "Reread + references" nor "Reload" updated what is shown as the + contents of it when the user overwrote the tag with "git tag -f". + + * "git log --all-match --grep=A --grep=B" ought to show commits that + mention both A and B, but when these three options are used with + --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. + + * 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 + git subcommand from "git rebase --continue". + + * The subcommand in "git remote" to remove a defined remote was + "rm" and the command did not take a fully-spelled "remove". + + * The interactive prompt that "git send-email" gives was error prone. It + asked "What e-mail address do you want to use?" with the address it + guessed (correctly) the user would want to use in its prompt, + tempting the user to say "y". But the response was taken as "No, + please use 'y' as the e-mail address instead", which is most + certainly not what the user meant. + + * "git show --format='%ci'" did not give the timestamp correctly for + commits created without human readable name on the "committer" line. + + * "git show --quiet" ought to be a synonym for "git show -s", but + wasn't. + + * "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". + + * "git status" honored the ignore=dirty settings in .gitmodules but + "git commit" didn't. + + * "gitweb" did not give the correct committer timezone in its feed + output due to a typo. diff --git a/Documentation/asciidoc.conf b/Documentation/asciidoc.conf index a26d245ab4..1273a85c8a 100644 --- a/Documentation/asciidoc.conf +++ b/Documentation/asciidoc.conf @@ -36,7 +36,7 @@ ifndef::git-asciidoc-no-roff[] # v1.72 breaks with this because it replaces dots not in roff requests. [listingblock] <example><title>{title}</title> -<literallayout> +<literallayout class="monospaced"> ifdef::doctype-manpage[] .ft C endif::doctype-manpage[] @@ -53,7 +53,7 @@ ifdef::doctype-manpage[] # The following two small workarounds insert a simple paragraph after screen [listingblock] <example><title>{title}</title> -<literallayout> +<literallayout class="monospaced"> | </literallayout><simpara></simpara> {title#}</example> diff --git a/Documentation/config.txt b/Documentation/config.txt index a95e5a4ac9..11f320b962 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -559,8 +559,9 @@ core.whitespace:: * `space-before-tab` treats a space character that appears immediately before a tab character in the initial indent part of the line as an error (enabled by default). -* `indent-with-non-tab` treats a line that is indented with 8 or more - space characters as an error (not enabled by default). +* `indent-with-non-tab` treats a line that is indented with space + characters instead of the equivalent tabs as an error (not enabled by + default). * `tab-in-indent` treats a tab character in the initial indent part of the line as an error (not enabled by default). * `blank-at-eof` treats blank lines added at the end of file as an error @@ -1210,8 +1211,16 @@ gitweb.snapshot:: grep.lineNumber:: If set to true, enable '-n' option by default. +grep.patternType:: + Set the default matching behavior. Using a value of 'basic', 'extended', + 'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp', + '--fixed-strings', or '--perl-regexp' option accordingly, while the + value 'default' will return to the default matching behavior. + grep.extendedRegexp:: - If set to true, enable '--extended-regexp' option by default. + If set to true, enable '--extended-regexp' option by default. This + option is ignored when the 'grep.patternType' option is set to a value + other than 'default'. gpg.program:: Use this custom program instead of "gpg" found on $PATH when 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/fetch-options.txt b/Documentation/fetch-options.txt index 39d326abc6..b4d6476ac8 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -10,7 +10,8 @@ --depth=<depth>:: Deepen the history of a 'shallow' repository created by `git clone` with `--depth=<depth>` option (see linkgit:git-clone[1]) - by the specified number of commits. + to the specified number of commits from the tip of each remote + branch history. Tags for the deepened commits are not fetched. ifndef::git-pull[] --dry-run:: diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 9c1d395722..fd9e36b99f 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -155,7 +155,7 @@ Configuration The optional configuration variable `core.excludesfile` indicates a path to a file containing patterns of file names to exclude from git-add, similar to $GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to -those in info/exclude. See linkgit:gitrepository-layout[5]. +those in info/exclude. See linkgit:gitignore[5]. EXAMPLES diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index 7ee923629e..e44173f66a 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -20,6 +20,12 @@ last modified the line. Optionally, start annotating from the given revision. The command can also limit the range of lines annotated. +The origin of lines is automatically followed across whole-file +renames (currently there is no option to turn the rename-following +off). To follow lines moved from one file to another, or to follow +lines that were copied and pasted from another file, etc., see the +`-C` and `-M` options. + The report does not tell you anything about lines which have been deleted or replaced; you need to use a tool such as 'git diff' or the "pickaxe" interface briefly mentioned in the following paragraph. diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 47235bea04..45a225e0aa 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -13,6 +13,8 @@ SYNOPSIS [--column[=<options>] | --no-column] [(--merged | --no-merged | --contains) [<commit>]] [<pattern>...] 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] +'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>] +'git branch' --unset-upstream [<branchname>] 'git branch' (-m | -M) [<oldbranch>] <newbranch> 'git branch' (-d | -D) [-r] <branchname>... 'git branch' --edit-description [<branchname>] @@ -48,7 +50,7 @@ branch so that 'git pull' will appropriately merge from the remote-tracking branch. This behavior may be changed via the global `branch.autosetupmerge` configuration flag. That setting can be overridden by using the `--track` and `--no-track` options, and -changed later using `git branch --set-upstream`. +changed later using `git branch --set-upstream-to`. With a `-m` or `-M` option, <oldbranch> will be renamed to <newbranch>. If <oldbranch> had a corresponding reflog, it is renamed to match @@ -129,11 +131,13 @@ This option is only applicable in non-verbose mode. use `git branch --list <pattern>` to list matching branches. -v:: +-vv:: --verbose:: When in list mode, show sha1 and commit subject line for each head, along with relationship to upstream branch (if any). If given twice, print - the name of the upstream branch, as well. + the name of the upstream branch, as well (see also `git remote + show <remote>`). -q:: --quiet:: @@ -173,6 +177,16 @@ start-point is either a local or remote-tracking branch. like `--track` would when creating the branch, except that where branch points to is not changed. +-u <upstream>:: +--set-upstream-to=<upstream>:: + Set up <branchname>'s tracking information so <upstream> is + considered <branchname>'s upstream branch. If no <branchname> + is specified, then it defaults to the current branch. + +--unset-upstream:: + Remove the upstream information for <branchname>. If no branch + is specified it defaults to the current branch. + --edit-description:: Open an editor and edit the text to explain what the branch is for, to be used by various other commands (e.g. `request-pull`). diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 63a251612a..7958a47006 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -84,11 +84,11 @@ entries; instead, unmerged entries are ignored. When checking out paths from the index, check out stage #2 ('ours') or #3 ('theirs') for unmerged paths. --b:: +-b <new_branch>:: Create a new branch named <new_branch> and start it at <start_point>; see linkgit:git-branch[1] for details. --B:: +-B <new_branch>:: Creates the branch <new_branch> and start it at <start_point>; if it already exists, then reset it to <start_point>. This is equivalent to running "git branch" with "-f"; see @@ -124,7 +124,7 @@ explicitly give a name with '-b' in such a case. <commit> is not a branch name. See the "DETACHED HEAD" section below for details. ---orphan:: +--orphan <new_branch>:: Create a new 'orphan' branch, named <new_branch>, started from <start_point> and switch to it. The first commit made on this new branch will have no parents and it will be the root of a new @@ -367,6 +367,18 @@ $ git checkout hello.c <3> <2> take a file out of another commit <3> restore hello.c from the index + +If you want to check out _all_ C source files out of the index, +you can say ++ +------------ +$ git checkout -- '*.c' +------------ ++ +Note the quotes around `*.c`. The file `hello.c` will also be +checked out, even though it is no longer in the working tree, +because the file globbing is used to match entries in the index +(not in the working tree by the shell). ++ If you have an unfortunate branch that is named `hello.c`, this step would be confused as an instruction to switch to that branch. You should instead write: diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 0e170a51ca..c205d2363e 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -118,6 +118,11 @@ effect to your index in a row. previous commit are dropped. To force the inclusion of those commits use `--keep-redundant-commits`. +--allow-empty-message:: + By default, cherry-picking a commit with an empty message will fail. + This option overrides that behaviour, allowing commits with empty + messages to be cherry picked. + --keep-redundant-commits:: If a commit being cherry picked duplicates a commit already in the current history, it will become empty. By default these diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index 79fb984144..9f42c0d0e6 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -63,6 +63,10 @@ OPTIONS Remove only files ignored by git. This may be useful to rebuild everything from scratch, but keep manually created files. +SEE ALSO +-------- +linkgit:gitignore[5] + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index c1ddd4c2cc..6d98ef3d2a 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -29,7 +29,8 @@ currently active branch. After the clone, a plain `git fetch` without arguments will update all the remote-tracking branches, and a `git pull` without arguments will in addition merge the remote master branch into the -current master branch, if any. +current master branch, if any (this is untrue when "--single-branch" +is given; see below). This default configuration is achieved by creating references to the remote branch heads under `refs/remotes/origin` and @@ -152,9 +153,10 @@ objects from the source repository into a pack in the cloned repository. -b <name>:: Instead of pointing the newly created HEAD to the branch pointed to by the cloned repository's HEAD, point to `<name>` branch - instead. `--branch` can also take tags and treat them like - detached HEAD. In a non-bare repository, this is the branch - that will be checked out. + instead. In a non-bare repository, this is the branch that will + be checked out. + `--branch` can also take tags and detaches the HEAD at that commit + in the resulting repository. --upload-pack <upload-pack>:: -u <upload-pack>:: @@ -193,6 +195,11 @@ objects from the source repository into a pack in the cloned repository. clone with the `--depth` option, this is the default, unless `--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 + initial cloning. If the HEAD at the remote did not point at any + branch when `--single-branch` clone was made, no remote tracking + branch is created. --recursive:: --recurse-submodules:: diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 4622297ec9..9594ac8e9d 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -389,8 +389,10 @@ DISCUSSION Though not required, it's a good idea to begin the commit message with a single short (less than 50 character) line summarizing the change, followed by a blank line and then a more thorough description. -Tools that turn commits into email, for example, use the first line -on the Subject: line and the rest of the commit in the body. +The text up to the first blank line in a commit message is treated +as the commit title, and that title is used throughout git. +For example, linkgit:git-format-patch[1] turns a commit into email, and it uses +the title on the Subject line and the rest of the commit in the body. include::i18n.txt[] diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 2d6ef32a08..eaea079165 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -54,16 +54,16 @@ configuration file by default, and options '--system', '--global', '--file <filename>' can be used to tell the command to write to that location (you can say '--local' but that is the default). -This command will fail (with exit code ret) if: +This command will fail with non-zero status upon error. Some exit +codes are: . The config file is invalid (ret=3), . can not write to the config file (ret=4), . no section or name was provided (ret=2), . the section or key is invalid (ret=1), . you try to unset an option which does not exist (ret=5), -. you try to unset/set an option for which multiple lines match (ret=5), -. you try to use an invalid regexp (ret=6), or -. you use '--global' option without $HOME being properly set (ret=128). +. you try to unset/set an option for which multiple lines match (ret=5), or +. you try to use an invalid regexp (ret=6). On success, the command returns the exit code 0. @@ -267,7 +267,7 @@ Given a .git/config like this: ; Proxy settings [core] - gitproxy="proxy-command" for kernel.org + gitproxy=proxy-command for kernel.org gitproxy=default-proxy ; for all the rest you can set the filemode to true with @@ -342,7 +342,7 @@ To actually match only values with an exclamation mark, you have to To add a new proxy, without altering any of the existing ones, use ------------ -% git config core.gitproxy '"proxy-command" for example.com' +% git config --add core.gitproxy '"proxy-command" for example.com' ------------ An example to use customized color from the configuration in your diff --git a/Documentation/git-credential-cache--daemon.txt b/Documentation/git-credential-cache--daemon.txt index 11edc5a173..d15db42d43 100644 --- a/Documentation/git-credential-cache--daemon.txt +++ b/Documentation/git-credential-cache--daemon.txt @@ -3,7 +3,7 @@ git-credential-cache--daemon(1) NAME ---- -git-credential-cache--daemon - temporarily store user credentials in memory +git-credential-cache--daemon - Temporarily store user credentials in memory SYNOPSIS -------- diff --git a/Documentation/git-credential-cache.txt b/Documentation/git-credential-cache.txt index f3d09c5d51..eeff5fa989 100644 --- a/Documentation/git-credential-cache.txt +++ b/Documentation/git-credential-cache.txt @@ -3,7 +3,7 @@ git-credential-cache(1) NAME ---- -git-credential-cache - helper to temporarily store passwords in memory +git-credential-cache - Helper to temporarily store passwords in memory SYNOPSIS -------- diff --git a/Documentation/git-credential-store.txt b/Documentation/git-credential-store.txt index 31093467d1..b27c03c361 100644 --- a/Documentation/git-credential-store.txt +++ b/Documentation/git-credential-store.txt @@ -3,7 +3,7 @@ git-credential-store(1) NAME ---- -git-credential-store - helper to store credentials on disk +git-credential-store - Helper to store credentials on disk SYNOPSIS -------- diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt index e8f757704c..7e5098a95e 100644 --- a/Documentation/git-daemon.txt +++ b/Documentation/git-daemon.txt @@ -16,6 +16,7 @@ SYNOPSIS [--reuseaddr] [--detach] [--pid-file=<file>] [--enable=<service>] [--disable=<service>] [--allow-override=<service>] [--forbid-override=<service>] + [--access-hook=<path>] [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>] [--user=<user> [--group=<group>]] [<directory>...] @@ -171,6 +172,21 @@ the facility of inet daemon to achieve the same before spawning errors are not enabled, all errors report "access denied" to the client. The default is --no-informative-errors. +--access-hook=<path>:: + Every time a client connects, first run an external command + specified by the <path> with service name (e.g. "upload-pack"), + path to the repository, hostname (%H), canonical hostname + (%CH), ip address (%IP), and tcp port (%P) as its command line + arguments. The external command can decide to decline the + service by exiting with a non-zero status (or to allow it by + exiting with a zero status). It can also look at the $REMOTE_ADDR + and $REMOTE_PORT environment variables to learn about the + requestor when making this decision. ++ +The external command can optionally write a single line to its +standard output to be sent to the requestor as an error message when +it declines the service. + <directory>:: A directory to add to the whitelist of allowed directories. Unless --strict-paths is specified this will also include subdirectories diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt index 039cce2e98..72d6bb612b 100644 --- a/Documentation/git-describe.txt +++ b/Documentation/git-describe.txt @@ -36,12 +36,12 @@ OPTIONS --all:: Instead of using only the annotated tags, use any ref - found in `.git/refs/`. This option enables matching + found in `refs/` namespace. This option enables matching any known branch, remote-tracking branch, or lightweight tag. --tags:: Instead of using only the annotated tags, use any tag - found in `.git/refs/tags`. This option enables matching + found in `refs/tags` namespace. This option enables matching a lightweight (non-annotated) tag. --contains:: diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt index 31fc2e3aed..73ca7025a3 100644 --- a/Documentation/git-difftool.txt +++ b/Documentation/git-difftool.txt @@ -69,6 +69,14 @@ with custom merge tool commands and has the same value as `$MERGED`. --tool-help:: Print a list of diff tools that may be used with `--tool`. +--symlinks:: +--no-symlinks:: + 'git difftool''s default behavior is create symlinks to the + working tree when run in `--dir-diff` mode. ++ + Specifying `--no-symlinks` instructs 'git difftool' to create + copies instead. `--no-symlinks` is the default on Windows. + -x <command>:: --extcmd=<command>:: Specify a custom command for viewing diffs. diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index 2620d28b4b..6603a7ab73 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -39,6 +39,10 @@ OPTIONS See ``Date Formats'' below for details about which formats are supported, and their syntax. +-- done:: + Terminate with error if there is no 'done' command at the + end of the stream. + --force:: Force updating modified existing branches, even if doing so would cause commits to be lost (as the new commit does @@ -1047,7 +1051,9 @@ done:: Error out if the stream ends without a 'done' command. Without this feature, errors causing the frontend to end abruptly at a convenient point in the stream can go - undetected. + undetected. This may occur, for example, if an import + front end dies in mid-operation without emitting SIGTERM + or SIGKILL at its subordinate git fast-import instance. `option` ~~~~~~~~ diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt index 81f58234a7..e2301f5c01 100644 --- a/Documentation/git-filter-branch.txt +++ b/Documentation/git-filter-branch.txt @@ -32,7 +32,8 @@ changes, which would normally have no effect. Nevertheless, this may be useful in the future for compensating for some git bugs or such, therefore such a usage is permitted. -*NOTE*: This command honors `.git/info/grafts` and `.git/refs/replace/`. +*NOTE*: This command honors `.git/info/grafts` file and refs in +the `refs/replace/` namespace. If you have any grafts or replacement refs defined, running this command will make them permanent. @@ -303,6 +304,11 @@ committed a merge between P1 and P2, it will be propagated properly and all children of the merge will become merge commits with P1,P2 as their parents instead of the merge commit. +*NOTE* the changes introduced by the commits, and which are not reverted +by subsequent commits, will still be in the rewritten branch. If you want +to throw out _changes_ together with the commits, you should use the +interactive mode of 'git rebase'. + You can rewrite the commit log messages using `--msg-filter`. For example, 'git svn-id' strings in a repository created by 'git svn' can be removed this way: @@ -313,11 +319,6 @@ git filter-branch --msg-filter ' ' ------------------------------------------------------- -To restrict rewriting to only part of the history, specify a revision -range in addition to the new branch name. The new branch name will -point to the top-most revision that a 'git rev-list' of this range -will print. - If you need to add 'Acked-by' lines to, say, the last 10 commits (none of which is a merge), use this command: @@ -328,11 +329,10 @@ git filter-branch --msg-filter ' ' HEAD~10..HEAD -------------------------------------------------------- -*NOTE* the changes introduced by the commits, and which are not reverted -by subsequent commits, will still be in the rewritten branch. If you want -to throw out _changes_ together with the commits, you should use the -interactive mode of 'git rebase'. - +To restrict rewriting to only part of the history, specify a revision +range in addition to the new branch name. The new branch name will +point to the top-most revision that a 'git rev-list' of this range +will print. Consider this history: diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index c872b883ba..db55a4e0bb 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -102,9 +102,10 @@ Fields that have name-email-date tuple as its value (`author`, and `date` to extract the named component. The complete message in a commit and tag object is `contents`. -Its first line is `contents:subject`, the remaining lines -are `contents:body` and the optional GPG signature -is `contents:signature`. +Its first line is `contents:subject`, where subject is the concatenation +of all lines of the commit message up to the first blank line. The next +line is 'contents:body', where body is all of the lines after the first +blank line. Finally, the optional GPG signature is `contents:signature`. For sorting purposes, fields with numeric values sort in numeric order (`objectsize`, `authordate`, `committerdate`, `taggerdate`). diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 04c7346e3e..6d43f56279 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -58,10 +58,13 @@ output, unless the `--stdout` option is specified. If `-o` is specified, output files are created in <dir>. Otherwise they are created in the current working directory. -By default, the subject of a single patch is "[PATCH] First Line" and -the subject when multiple patches are output is "[PATCH n/m] First -Line". To force 1/1 to be added for a single patch, use `-n`. To omit -patch numbers from the subject, use `-N`. +By default, the subject of a single patch is "[PATCH] " followed by +the concatenation of lines from the commit message up to the first blank +line (see the DISCUSSION section of linkgit:git-commit[1]). + +When multiple patches are output, the subject prefix will instead be +"[PATCH n/m] ". To force 1/1 to be added for a single patch, use `-n`. +To omit patch numbers from the subject, use `-N`. If given `--thread`, `git-format-patch` will generate `In-Reply-To` and `References` headers to make the second and subsequent patch mails appear diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt index bbb25da2dd..da348fc942 100644 --- a/Documentation/git-fsck.txt +++ b/Documentation/git-fsck.txt @@ -23,8 +23,8 @@ OPTIONS An object to treat as the head of an unreachability trace. + If no objects are given, 'git fsck' defaults to using the -index file, all SHA1 references in .git/refs/*, and all reflogs (unless ---no-reflogs is given) as heads. +index file, all SHA1 references in `refs` namespace, and all reflogs +(unless --no-reflogs is given) as heads. --unreachable:: Print out objects that exist but that aren't reachable from any diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 3bec036883..cfecf848fb 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -42,8 +42,16 @@ CONFIGURATION grep.lineNumber:: If set to true, enable '-n' option by default. +grep.patternType:: + Set the default matching behavior. Using a value of 'basic', 'extended', + 'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp', + '--fixed-strings', or '--perl-regexp' option accordingly, while the + value 'default' will return to the default matching behavior. + grep.extendedRegexp:: - If set to true, enable '--extended-regexp' option by default. + If set to true, enable '--extended-regexp' option by default. This + option is ignored when the 'grep.patternType' option is set to a value + other than 'default'. OPTIONS diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 1f906208f9..585dac40ba 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -24,10 +24,6 @@ each commit introduces are shown. OPTIONS ------- --<n>:: - Limits the number of commits to show. - Note that this is a commit limiting option, see below. - <since>..<until>:: Show only commits between the named two commits. When either <since> or <until> is omitted, it defaults to @@ -137,6 +133,8 @@ Examples This makes sense only when following a strict policy of merging all topic branches when staying on a single integration branch. +`git log -3`:: + Limits the number of commits to show to 3. Discussion ---------- diff --git a/Documentation/git-lost-found.txt b/Documentation/git-lost-found.txt index c406a11001..d54932889f 100644 --- a/Documentation/git-lost-found.txt +++ b/Documentation/git-lost-found.txt @@ -48,7 +48,8 @@ $ gitk $(cd .git/lost-found/commit && echo ??*) ------------ After making sure you know which the object is the tag you are looking -for, you can reconnect it to your regular .git/refs hierarchy. +for, you can reconnect it to your regular `refs` hierarchy by using +the `update-ref` command. ------------ $ git cat-file -t 1ef2b196 diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt index 7a9b86a58a..774de5e9d9 100644 --- a/Documentation/git-ls-remote.txt +++ b/Documentation/git-ls-remote.txt @@ -42,6 +42,11 @@ OPTIONS it successfully talked with the remote repository, whether it found any matching refs. +--get-url:: + Expand the URL of the given remote repository taking into account any + "url.<base>.insteadOf" config setting (See linkgit:git-config[1]) and + exit without talking to the remote. + <repository>:: Location of the repository. The shorthand defined in $GIT_DIR/branches/ can be used. Use "." (dot) to list references in diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt index b295bf8330..87842e33f8 100644 --- a/Documentation/git-merge-base.txt +++ b/Documentation/git-merge-base.txt @@ -11,6 +11,7 @@ SYNOPSIS [verse] 'git merge-base' [-a|--all] <commit> <commit>... 'git merge-base' [-a|--all] --octopus <commit>... +'git merge-base' --is-ancestor <commit> <commit> 'git merge-base' --independent <commit>... DESCRIPTION @@ -50,6 +51,12 @@ from linkgit:git-show-branch[1] when used with the `--merge-base` option. from any other. This mimics the behavior of 'git show-branch --independent'. +--is-ancestor:: + Check if the first <commit> is an ancestor of the second <commit>, + and exit with status 0 if true, or with status 1 if not. + Errors are signaled by a non-zero status that is not 1. + + OPTIONS ------- -a:: @@ -110,6 +117,27 @@ both '1' and '2' are merge-bases of A and B. Neither one is better than the other (both are 'best' merge bases). When the `--all` option is not given, it is unspecified which best one is output. +A common idiom to check "fast-forward-ness" between two commits A +and B is (or at least used to be) to compute the merge base between +A and B, and check if it is the same as A, in which case, A is an +ancestor of B. You will see this idiom used often in older scripts. + + A=$(git rev-parse --verify A) + if test "$A" = "$(git merge-base A B)" + then + ... A is an ancestor of B ... + fi + +In modern git, you can say this in a more direct way: + + if git merge-base --is-ancestor A B + then + ... A is an ancestor of B ... + fi + +instead. + + See also -------- linkgit:git-rev-list[1], diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt index d7207bd9b9..6b563c500f 100644 --- a/Documentation/git-mergetool.txt +++ b/Documentation/git-mergetool.txt @@ -64,6 +64,9 @@ variable `mergetool.<tool>.trustExitCode` can be set to `true`. Otherwise, 'git mergetool' will prompt the user to indicate the success of the resolution after the custom tool has exited. +--tool-help:: + Print a list of merge tools that may be used with `--tool`. + -y:: --no-prompt:: Don't prompt before each invocation of the merge resolution diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 8228f33e3f..beff6229c8 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -163,7 +163,7 @@ All commands except clone accept these options. --git-dir <dir>:: Set the 'GIT_DIR' environment variable. See linkgit:git[1]. ---verbose:: +--verbose, -v:: Provide more progress information. Sync options @@ -269,6 +269,24 @@ These options can be used to modify 'git p4 submit' behavior. Export tags from git as p4 labels. Tags found in git are applied to the perforce working directory. +--dry-run, -n:: + Show just what commits would be submitted to p4; do not change + state in git or p4. + +--prepare-p4-only:: + Apply a commit to the p4 workspace, opening, adding and deleting + files in p4 as for a normal submit operation. Do not issue the + final "p4 submit", but instead print a message about how to + submit manually or revert. This option always stops after the + first (oldest) commit. Git tags are not exported to p4. + +--conflict=(ask|skip|quit):: + Conflicts can occur when applying a commit to p4. When this + happens, the default behavior ("ask") is to prompt whether to + skip this commit and continue, or quit. This option can be used + to bypass the prompt, causing conflicting commits to be automatically + skipped, or to quit trying to apply commits, without prompting. + Rebase options ~~~~~~~~~~~~~~ These options can be used to modify 'git p4 rebase' behavior. @@ -519,6 +537,10 @@ git-p4.labelExportRegexp:: Only p4 labels matching this regular expression will be exported. The default value is '[a-zA-Z0-9_\-.]+$'. +git-p4.conflict:: + Specify submit behavior when a conflict with p4 is found, as per + --conflict. The default behavior is 'ask'. + IMPLEMENTATION DETAILS ---------------------- * Changesets from p4 are imported using git fast-import. diff --git a/Documentation/git-pack-refs.txt b/Documentation/git-pack-refs.txt index 10afd4edfe..f131677478 100644 --- a/Documentation/git-pack-refs.txt +++ b/Documentation/git-pack-refs.txt @@ -14,7 +14,8 @@ DESCRIPTION ----------- Traditionally, tips of branches and tags (collectively known as -'refs') were stored one file per ref under `$GIT_DIR/refs` +'refs') were stored one file per ref in a (sub)directory +under `$GIT_DIR/refs` directory. While many branch tips tend to be updated often, most tags and some branch tips are never updated. When a repository has hundreds or thousands of tags, this @@ -22,13 +23,14 @@ one-file-per-ref format both wastes storage and hurts performance. This command is used to solve the storage and performance -problem by stashing the refs in a single file, +problem by storing the refs in a single file, `$GIT_DIR/packed-refs`. When a ref is missing from the -traditional `$GIT_DIR/refs` hierarchy, it is looked up in this +traditional `$GIT_DIR/refs` directory hierarchy, it is looked +up in this file and used if found. Subsequent updates to branches always create new files under -`$GIT_DIR/refs` hierarchy. +`$GIT_DIR/refs` directory hierarchy. A recommended practice to deal with a repository with too many refs is to pack its refs with `--all --prune` once, and @@ -57,6 +59,15 @@ a repository with many branches of historical interests. The command usually removes loose refs under `$GIT_DIR/refs` hierarchy after packing them. This option tells it not to. + +BUGS +---- + +Older documentation written before the packed-refs mechanism was +introduced may still say things like ".git/refs/heads/<branch> file +exists" when it means "branch <branch> exists". + + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index defb544ed0..67fa5ee195 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -101,6 +101,7 @@ include::merge-options.txt[] :git-pull: 1 +-r:: --rebase:: Rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index cb97cc1c3b..22d2580129 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -37,7 +37,9 @@ OPTIONS[[OPTIONS]] `+`, followed by the source ref <src>, followed by a colon `:`, followed by the destination ref <dst>. It is used to specify with what <src> object the <dst> ref - in the remote repository is to be updated. + in the remote repository is to be updated. If not specified, + the behavior of the command is controlled by the `push.default` + configuration variable. + The <src> is often the name of the branch you would want to push, but it can be any arbitrary "SHA-1 expression", such as `master~4` or @@ -65,7 +67,8 @@ directs git to push "matching" branches: for every branch that exists on the local side, the remote side is updated if a branch of the same name already exists on the remote side. This is the default operation mode if no explicit refspec is found (that is neither on the command line -nor in any Push line of the corresponding remotes file---see below). +nor in any Push line of the corresponding remotes file---see below) and +no `push.default` configuration variable is set. --all:: Instead of naming each ref to push, specifies that all @@ -357,7 +360,8 @@ Examples `git push origin :`. + The default behavior of this command when no <refspec> is given can be -configured by setting the `push` option of the remote. +configured by setting the `push` option of the remote, or the `push.default` +configuration variable. + For example, to default to pushing only the current branch to `origin` use `git config remote.origin.push HEAD`. Any valid <refspec> (like diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index fd535b06ab..da067ecafa 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -12,7 +12,7 @@ SYNOPSIS [<upstream>] [<branch>] 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>] -'git rebase' --continue | --skip | --abort +'git rebase' --continue | --skip | --abort | --edit-todo DESCRIPTION ----------- @@ -245,6 +245,9 @@ leave out at most one of A and B, in which case it defaults to HEAD. --skip:: Restart the rebasing process by skipping the current patch. +--edit-todo:: + Edit the todo list during an interactive rebase. + -m:: --merge:: Use merging strategies to rebase. When the recursive (default) merge diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt index a308f4c79f..e8c396b5f9 100644 --- a/Documentation/git-remote.txt +++ b/Documentation/git-remote.txt @@ -12,7 +12,7 @@ SYNOPSIS 'git remote' [-v | --verbose] 'git remote add' [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url> 'git remote rename' <old> <new> -'git remote rm' <name> +'git remote remove' <name> 'git remote set-head' <name> (-a | -d | <branch>) 'git remote set-branches' [--add] <name> <branch>... 'git remote set-url' [--push] <name> <newurl> [<oldurl>] @@ -85,6 +85,7 @@ In case <old> and <new> are the same, and <old> is a file under `$GIT_DIR/remotes` or `$GIT_DIR/branches`, the remote is converted to the configuration file format. +'remove':: 'rm':: Remove the remote named <name>. All remote-tracking branches and diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt index 17df525275..51131d0858 100644 --- a/Documentation/git-replace.txt +++ b/Documentation/git-replace.txt @@ -14,14 +14,13 @@ SYNOPSIS DESCRIPTION ----------- -Adds a 'replace' reference in `.git/refs/replace/` +Adds a 'replace' reference in `refs/replace/` namespace. The name of the 'replace' reference is the SHA1 of the object that is replaced. The content of the 'replace' reference is the SHA1 of the replacement object. -Unless `-f` is given, the 'replace' reference must not yet exist in -`.git/refs/replace/` directory. +Unless `-f` is given, the 'replace' reference must not yet exist. Replacement references will be used by default by all git commands except those doing reachability traversal (prune, pack transfer and diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt index 01d8417316..afeb4cdf16 100644 --- a/Documentation/git-shortlog.txt +++ b/Documentation/git-shortlog.txt @@ -14,8 +14,7 @@ git log --pretty=short | 'git shortlog' [-h] [-n] [-s] [-e] [-w] DESCRIPTION ----------- Summarizes 'git log' output in a format suitable for inclusion -in release announcements. Each commit will be grouped by author and -the first line of the commit message will be shown. +in release announcements. Each commit will be grouped by author and title. Additionally, "[PATCH]" will be stripped from the commit description. diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index fbbbcb282c..b4683bba1b 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -112,7 +112,6 @@ status:: initialized, `+` if the currently checked out submodule commit does not match the SHA-1 found in the index of the containing repository and `U` if the submodule has merge conflicts. - This command is the default command for 'git submodule'. + If `--recursive` is specified, this command will recurse into nested submodules, and show their status as well. @@ -149,6 +148,11 @@ submodule with the `--init` option. + If `--recursive` is specified, this command will recurse into the registered submodules, and update any nested submodules within. ++ +If `--force` is specified, the submodule will be checked out (using +`git checkout --force` if appropriate), even if the commit specified in the +index of the containing repository already matches the commit checked out in +the submodule. summary:: Show commit summary between the given commit (defaults to HEAD) and @@ -210,7 +214,9 @@ OPTIONS This option is only valid for add and update commands. When running add, allow adding an otherwise ignored submodule path. When running update, throw away local changes in submodules when - switching to a different commit. + switching to a different commit; and always run a checkout operation + in the submodule, even if the commit listed in the index of the + containing repository matches the commit checked out in the submodule. --cached:: This option is only valid for status and summary commands. These diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index e36a7c3d1e..247534e908 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -20,11 +20,10 @@ SYNOPSIS DESCRIPTION ----------- -Add a tag reference in `.git/refs/tags/`, unless `-d/-l/-v` is given +Add a tag reference in `refs/tags/`, unless `-d/-l/-v` is given to delete, list or verify tags. -Unless `-f` is given, the tag to be created must not yet exist in the -`.git/refs/tags/` directory. +Unless `-f` is given, the named tag must not yet exist. If one of `-a`, `-s`, or `-u <key-id>` is passed, the command creates a 'tag' object, and requires a tag message. Unless diff --git a/Documentation/git.txt b/Documentation/git.txt index eb6b2c0117..4a89a12513 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -22,18 +22,17 @@ unusually rich command set that provides both high-level operations and full access to internals. See linkgit:gittutorial[7] to get started, then see -link:everyday.html[Everyday Git] for a useful minimum set of commands, and -"man git-commandname" for documentation of each command. CVS users may -also want to read linkgit:gitcvs-migration[7]. See -the link:user-manual.html[Git User's Manual] for a more in-depth -introduction. +link:everyday.html[Everyday Git] for a useful minimum set of +commands. The link:user-manual.html[Git User's Manual] has a more +in-depth introduction. -The '<command>' is either a name of a Git command (see below) or an alias -as defined in the configuration file (see linkgit:git-config[1]). +After you mastered the basic concepts, you can come back to this +page to learn what commands git offers. You can learn more about +individual git commands with "git help command". linkgit:gitcli[7] +manual page gives you an overview of the command line command syntax. -Formatted and hyperlinked version of the latest git -documentation can be viewed at -`http://git-htmldocs.googlecode.com/git/git.html`. +Formatted and hyperlinked version of the latest git documentation +can be viewed at `http://git-htmldocs.googlecode.com/git/git.html`. ifdef::stalenotes[] [NOTE] @@ -44,9 +43,25 @@ 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.11.5/git.html[documentation for release 1.7.11.5] +* 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]. + +* link:v1.7.11.7/git.html[documentation for release 1.7.11.7] + +* release notes for + link:RelNotes/1.7.11.7.txt[1.7.11.7], + link:RelNotes/1.7.11.6.txt[1.7.11.6], link:RelNotes/1.7.11.5.txt[1.7.11.5], link:RelNotes/1.7.11.4.txt[1.7.11.4], link:RelNotes/1.7.11.3.txt[1.7.11.3], @@ -406,24 +421,6 @@ help ...`. linkgit:git-replace[1] for more information. -FURTHER DOCUMENTATION ---------------------- - -See the references above to get started using git. The following is -probably more detail than necessary for a first-time user. - -The link:user-manual.html#git-concepts[git concepts chapter of the -user-manual] and linkgit:gitcore-tutorial[7] both provide -introductions to the underlying git architecture. - -See linkgit:gitworkflows[7] for an overview of recommended workflows. - -See also the link:howto-index.html[howto] documents for some useful -examples. - -The internals are documented in the -link:technical/api-index.html[GIT API documentation]. - GIT COMMANDS ------------ @@ -843,6 +840,29 @@ The index is also capable of storing multiple entries (called "stages") for a given pathname. These stages are used to hold the various unmerged version of a file when a merge is in progress. +FURTHER DOCUMENTATION +--------------------- + +See the references in the "description" section to get started +using git. The following is probably more detail than necessary +for a first-time user. + +The link:user-manual.html#git-concepts[git concepts chapter of the +user-manual] and linkgit:gitcore-tutorial[7] both provide +introductions to the underlying git architecture. + +See linkgit:gitworkflows[7] for an overview of recommended workflows. + +See also the link:howto-index.html[howto] documents for some useful +examples. + +The internals are documented in the +link:technical/api-index.html[GIT API documentation]. + +Users migrating from CVS may also want to +read linkgit:gitcvs-migration[7]. + + Authors ------- Git was started by Linus Torvalds, and is currently maintained by Junio diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index e16f3e175b..ba02d4de59 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -66,6 +66,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 @@ -511,6 +516,8 @@ configuration file (you still need to enable this with the attribute mechanism, via `.gitattributes`). The following built in patterns are available: +- `ada` suitable for source code in the Ada language. + - `bibtex` suitable for files with BibTeX coded references. - `cpp` suitable for source code in the C and C++ languages. @@ -927,7 +934,7 @@ file at the toplevel (i.e. not in any subdirectory). The built-in macro attribute "binary" is equivalent to: ------------ -[attr]binary -diff -text +[attr]binary -diff -merge -text ------------ diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt index ea17f7a53b..3bc1500eda 100644 --- a/Documentation/gitcli.txt +++ b/Documentation/gitcli.txt @@ -37,11 +37,28 @@ arguments. Here are the rules: file called HEAD in your work tree, `git diff HEAD` is ambiguous, and you have to say either `git diff HEAD --` or `git diff -- HEAD` to disambiguate. - ++ When writing a script that is expected to handle random user-input, it is a good practice to make it explicit which arguments are which by placing disambiguating `--` at appropriate places. + * Many commands allow wildcards in paths, but you need to protect + them from getting globbed by the shell. These two mean different + things: ++ +-------------------------------- +$ git checkout -- *.c +$ git checkout -- \*.c +-------------------------------- ++ +The former lets your shell expand the fileglob, and you are asking +the dot-C files in your working tree to be overwritten with the version +in the index. The latter passes the `*.c` to Git, and you are asking +the paths in the index that match the pattern to be checked out to your +working tree. After running `git add hello.c; rm hello.c`, you will _not_ +see `hello.c` in your working tree with the former, but with the latter +you will. + Here are the rules regarding the "flags" that you should follow when you are scripting git: @@ -62,13 +79,21 @@ scripting git: `git log -1 HEAD` but write `git log -1 HEAD --`; the former will not work if you happen to have a file called `HEAD` in the work tree. + * many commands allow a long option "--option" to be abbreviated + only to their unique prefix (e.g. if there is no other option + whose name begins with "opt", you may be able to spell "--opt" to + invoke the "--option" flag), but you should fully spell them out + when writing your scripts; later versions of Git may introduce a + new option whose name shares the same prefix, e.g. "--optimize", + to make a short prefix that used to be unique no longer unique. + 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 @@ -112,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/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index 9d893369a0..5325c5a7d5 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -956,12 +956,11 @@ $ git show-branch --topo-order --more=1 master mybranch ------------------------------------------------ The first two lines indicate that it is showing the two branches -and the first line of the commit log message from their -top-of-the-tree commits, you are currently on `master` branch -(notice the asterisk `*` character), and the first column for -the later output lines is used to show commits contained in the +with the titles of their top-of-the-tree commits, you are currently on +`master` branch (notice the asterisk `*` character), and the first +column for the later output lines is used to show commits contained in the `master` branch, and the second column for the `mybranch` -branch. Three commits are shown along with their log messages. +branch. Three commits are shown along with their titles. All of them have non blank characters in the first column (`*` shows an ordinary commit on the current branch, `-` is a merge commit), which means they are now part of the `master` branch. Only the "Some diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index c1f692a71e..1b82fe1969 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -41,18 +41,24 @@ precedence, the last matching pattern decides the outcome): variable 'core.excludesfile'. Which file to place a pattern in depends on how the pattern is meant to -be used. Patterns which should be version-controlled and distributed to -other repositories via clone (i.e., files that all developers will want -to ignore) should go into a `.gitignore` file. Patterns which are -specific to a particular repository but which do not need to be shared -with other related repositories (e.g., auxiliary files that live inside -the repository but are specific to one user's workflow) should go into -the `$GIT_DIR/info/exclude` file. Patterns which a user wants git to -ignore in all situations (e.g., backup or temporary files generated by -the user's editor of choice) generally go into a file specified by -`core.excludesfile` in the user's `~/.gitconfig`. Its default value is -$XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, -$HOME/.config/git/ignore is used instead. +be used. + + * Patterns which should be version-controlled and distributed to + other repositories via clone (i.e., files that all developers will want + to ignore) should go into a `.gitignore` file. + + * Patterns which are + specific to a particular repository but which do not need to be shared + with other related repositories (e.g., auxiliary files that live inside + the repository but are specific to one user's workflow) should go into + the `$GIT_DIR/info/exclude` file. + + * Patterns which a user wants git to + ignore in all situations (e.g., backup or temporary files generated by + the user's editor of choice) generally go into a file specified by + `core.excludesfile` in the user's `~/.gitconfig`. Its default value is + $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or + empty, $HOME/.config/git/ignore is used instead. The underlying git plumbing tools, such as 'git ls-files' and 'git read-tree', read @@ -68,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/gittutorial.txt b/Documentation/gittutorial.txt index dee050567e..f1cb6f3be6 100644 --- a/Documentation/gittutorial.txt +++ b/Documentation/gittutorial.txt @@ -139,9 +139,11 @@ them to the index, and commit, all in one step. A note on commit messages: Though not required, it's a good idea to begin the commit message with a single short (less than 50 character) line summarizing the change, followed by a blank line and then a more -thorough description. Tools that turn commits into email, for -example, use the first line on the Subject: line and the rest of the -commit in the body. +thorough description. The text up to the first blank line in a commit +message is treated as the commit title, and that title is used +throughout git. For example, linkgit:git-format-patch[1] turns a +commit into email, and it uses the title on the Subject line and the +rest of the commit in the body. Git tracks content not files ---------------------------- diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt index 595a3cf1a7..66db80296f 100644 --- a/Documentation/merge-strategies.txt +++ b/Documentation/merge-strategies.txt @@ -32,13 +32,14 @@ ours;; This option forces conflicting hunks to be auto-resolved cleanly by favoring 'our' version. Changes from the other tree that do not conflict with our side are reflected to the merge result. + For a binary file, the entire contents are taken from our side. + This should not be confused with the 'ours' merge strategy, which does not even look at what the other tree contains at all. It discards everything the other tree did, declaring 'our' history contains all that happened in it. theirs;; - This is opposite of 'ours'. + This is the opposite of 'ours'. patience;; With this option, 'merge-recursive' spends a little extra time diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index e3d8a83b23..d9eddedc72 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -130,6 +130,9 @@ The placeholders are: - '%b': body - '%B': raw body (unwrapped subject and body) - '%N': commit notes +- '%GG': raw verification message from GPG for a signed commit +- '%G?': show either "G" for Good or "B" for Bad for a signed commit +- '%GS': show the name of the signer for a signed commit - '%gD': reflog selector, e.g., `refs/stash@{1}` - '%gd': shortened reflog selector, e.g., `stash@{1}` - '%gn': reflog identity name diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt index 2a3dc8664f..5e499421a4 100644 --- a/Documentation/pretty-options.txt +++ b/Documentation/pretty-options.txt @@ -66,3 +66,7 @@ being displayed. Examples: "--notes=foo" will show only notes from --[no-]standard-notes:: These options are deprecated. Use the above --notes/--no-notes options instead. + +--show-signature:: + Check the validity of a signed commit object by passing the signature + to `gpg --verify` and show the output. diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index d9b2b5b2e0..ee497430cb 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -3,12 +3,20 @@ Commit Limiting Besides specifying a range of commits that should be listed using the special notations explained in the description, additional commit -limiting may be applied. Note that they are applied before commit -ordering and formatting options, such as '--reverse'. +limiting may be applied. + +Using more options generally further limits the output (e.g. +`--since=<date1>` limits to commits newer than `<date1>`, and using it +with `--grep=<pattern>` further limits to commits whose log message +has a line that matches `<pattern>`), unless otherwise noted. + +Note that these are applied before commit +ordering and formatting options, such as `--reverse`. -- --n 'number':: +-<number>:: +-n <number>:: --max-count=<number>:: Limit the number of commits to output. @@ -38,16 +46,33 @@ endif::git-rev-list[] --committer=<pattern>:: Limit the commits output to ones with author/committer - header lines that match the specified pattern (regular expression). + header lines that match the specified pattern (regular + expression). With more than one `--author=<pattern>`, + commits whose author matches any of the given patterns are + chosen (similarly for multiple `--committer=<pattern>`). + +--grep-reflog=<pattern>:: + + Limit the commits output to ones with reflog entries that + match the specified pattern (regular expression). With + more than one `--grep-reflog`, commits whose reflog message + matches any of the given patterns are chosen. It is an + error to use this option unless `--walk-reflogs` is in use. --grep=<pattern>:: Limit the commits output to ones with log message that - matches the specified pattern (regular expression). + matches the specified pattern (regular expression). With + more than one `--grep=<pattern>`, commits whose message + matches any of the given patterns are chosen (but see + `--all-match`). ++ +When `--show-notes` is in effect, the message from the notes as +if it is part of the log message. --all-match:: Limit the commits output to ones that match all given --grep, - --author and --committer instead of ones that match at least one. + instead of ones that match at least one. -i:: --regexp-ignore-case:: @@ -578,16 +603,33 @@ Commit Ordering By default, the commits are shown in reverse chronological order. ---topo-order:: +--date-order:: + Show no parents before all of its children are shown, but + otherwise show commits in the commit timestamp order. - This option makes them appear in topological order (i.e. - descendant commits are shown before their parents). +--topo-order:: + Show no parents before all of its children are shown, and + avoid showing commits on multiple lines of history + intermixed. ++ +For example, in a commit history like this: ++ +---------------------------------------------------------------- ---date-order:: + ---1----2----4----7 + \ \ + 3----5----6----8--- - This option is similar to '--topo-order' in the sense that no - parent comes before all of its children, but otherwise things - are still ordered in the commit timestamp order. +---------------------------------------------------------------- ++ +where the numbers denote the order of commit timestamps, `git +rev-list` and friends with `--date-order` show the commits in the +timestamp order: 8 7 6 5 4 3 2 1. ++ +With `--topo-order`, they would show 8 6 5 3 7 4 2 1 (or 8 7 4 2 6 5 +3 1); some older commits are shown before newer ones in order to +avoid showing the commits from two parallel development track mixed +together. --reverse:: @@ -619,10 +661,14 @@ These options are mostly targeted for packing of git repositories. Only useful with '--objects'; print the object IDs that are not in packs. ---no-walk:: +--no-walk[=(sorted|unsorted)]:: - Only show the given revs, but do not traverse their ancestors. - This has no effect if a range is specified. + Only show the given commits, but do not traverse their ancestors. + This has no effect if a range is specified. If the argument + "unsorted" is given, the commits are show in the order they were + given on the command line. Otherwise (if "sorted" or no argument + was given), the commits are show in reverse chronological order + by commit time. --do-walk:: diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index dc0070bcb7..991fcd8f3f 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -55,6 +55,8 @@ when you run `git cherry-pick`. + Note that any of the 'refs/*' cases above may come either from the '$GIT_DIR/refs' directory or from the '$GIT_DIR/packed-refs' file. +While the ref name encoding is unspecified, UTF-8 is prefered as +some output processing may assume ref names in UTF-8. '<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}':: A ref followed by the suffix '@' with a date specification @@ -213,6 +215,13 @@ of 'r1' and 'r2' and is defined as It is the set of commits that are reachable from either one of 'r1' or 'r2' but not from both. +In these two shorthands, you can omit one end and let it default to HEAD. +For example, 'origin..' is a shorthand for 'origin..HEAD' and asks "What +did I do since I forked from the origin branch?" Similarly, '..origin' +is a shorthand for 'HEAD..origin' and asks "What did the origin do since +I forked from them?" Note that '..' would mean 'HEAD..HEAD' which is an +empty range that is both reachable and unreachable from HEAD. + Two other shorthands for naming a set that is formed by a commit and its parent commits exist. The 'r1{caret}@' notation means all parents of 'r1'. 'r1{caret}!' includes commit 'r1' but excludes diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt index 6b97d6db74..a959517b23 100644 --- a/Documentation/technical/api-argv-array.txt +++ b/Documentation/technical/api-argv-array.txt @@ -46,6 +46,10 @@ Functions Format a string and push it onto the end of the array. This is a convenience wrapper combining `strbuf_addf` and `argv_array_push`. +`argv_array_pop`:: + Remove the final element from the array. If there are no + elements in the array, do nothing. + `argv_array_clear`:: Free all memory associated with the array and return it to the initial, empty state. diff --git a/Documentation/technical/api-sha1-array.txt b/Documentation/technical/api-sha1-array.txt index 4a4bae8109..45d1c517cd 100644 --- a/Documentation/technical/api-sha1-array.txt +++ b/Documentation/technical/api-sha1-array.txt @@ -25,9 +25,6 @@ Functions the array (but note that some operations below may lose this ordering). -`sha1_array_sort`:: - Sort the elements in the array. - `sha1_array_lookup`:: Perform a binary search of the array for a specific sha1. If found, returns the offset (in number of elements) of the diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt index 5a0c14fceb..94d7a2bd99 100644 --- a/Documentation/technical/api-string-list.txt +++ b/Documentation/technical/api-string-list.txt @@ -1,8 +1,9 @@ string-list API =============== -The string_list API offers a data structure and functions to handle sorted -and unsorted string lists. +The string_list API offers a data structure and functions to handle +sorted and unsorted string lists. A "sorted" list is one whose +entries are sorted by string value in `strcmp()` order. The 'string_list' struct used to be called 'path_list', but was renamed because it is not specific to paths. @@ -20,8 +21,9 @@ If you need something advanced, you can manually malloc() the `items` member (you need this if you add things later) and you should set the `nr` and `alloc` members in that case, too. -. Adds new items to the list, using `string_list_append` or - `string_list_insert`. +. Adds new items to the list, using `string_list_append`, + `string_list_append_nodup`, `string_list_insert`, + `string_list_split`, and/or `string_list_split_in_place`. . Can check if a string is in the list using `string_list_has_string` or `unsorted_string_list_has_string` and get it from the list using @@ -29,18 +31,23 @@ member (you need this if you add things later) and you should set the . Can sort an unsorted list using `sort_string_list`. +. Can remove duplicate items from a sorted list using + `string_list_remove_duplicates`. + . Can remove individual items of an unsorted list using `unsorted_string_list_delete_item`. +. Can remove items not matching a criterion from a sorted or unsorted + list using `filter_string_list`. + . Finally it should free the list using `string_list_clear`. Example: ---- -struct string_list list; +struct string_list list = STRING_LIST_INIT_NODUP; int i; -memset(&list, 0, sizeof(struct string_list)); string_list_append(&list, "foo"); string_list_append(&list, "bar"); for (i = 0; i < list.nr; i++) @@ -60,6 +67,22 @@ Functions * General ones (works with sorted and unsorted lists as well) +`filter_string_list`:: + + Apply a function to each item in a list, retaining only the + items for which the function returns true. If free_util is + true, call free() on the util members of any items that have + to be deleted. Preserve the order of the items that are + retained. + +`string_list_longest_prefix`:: + + Return the longest string within a string_list that is a + prefix (in the sense of prefixcmp()) of the specified string, + or NULL if no such prefix exists. This function does not + require the string_list to be sorted (it does a linear + search). + `print_string_list`:: Dump a string_list to stdout, useful mainly for debugging purposes. It @@ -96,15 +119,32 @@ write `string_list_insert(...)->util = ...;`. Look up a given string in the string_list, returning the containing string_list_item. If the string is not found, NULL is returned. +`string_list_remove_duplicates`:: + + Remove all but the first of consecutive entries that have the + same string value. If free_util is true, call free() on the + util members of any items that have to be deleted. + * Functions for unsorted lists only `string_list_append`:: - Append a new string to the end of the string_list. + Append a new string to the end of the string_list. If + `strdup_string` is set, then the string argument is copied; + otherwise the new `string_list_entry` refers to the input + string. + +`string_list_append_nodup`:: + + Append a new string to the end of the string_list. The new + `string_list_entry` always refers to the input string, even if + `strdup_string` is set. This function can be used to hand + ownership of a malloc()ed string to a `string_list` that has + `strdup_string` set. `sort_string_list`:: - Make an unsorted list sorted. + Sort the list's entries by string value in `strcmp()` order. `unsorted_string_list_has_string`:: @@ -124,6 +164,25 @@ counterpart for sorted lists, which performs a binary search. is set. The third parameter controls if the `util` pointer of the items should be freed or not. +`string_list_split`:: +`string_list_split_in_place`:: + + Split a string into substrings on a delimiter character and + append the substrings to a `string_list`. If `maxsplit` is + non-negative, then split at most `maxsplit` times. Return the + number of substrings appended to the list. ++ +`string_list_split` requires a `string_list` that has `strdup_strings` +set to true; it leaves the input string untouched and makes copies of +the substrings in newly-allocated memory. +`string_list_split_in_place` requires a `string_list` that has +`strdup_strings` set to false; it splits the input string in place, +overwriting the delimiter characters with NULs and creating new +string_list_items that point into the original string (the original +string must therefore not be modified or freed while the `string_list` +is in use). + + Data structures --------------- diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt index 49cdc571cd..d51e20f352 100644 --- a/Documentation/technical/pack-protocol.txt +++ b/Documentation/technical/pack-protocol.txt @@ -259,8 +259,10 @@ a positive depth, this step is skipped. ---- If the client has requested a positive depth, the server will compute -the set of commits which are no deeper than the desired depth, starting -at the client's wants. The server writes 'shallow' lines for each +the set of commits which are no deeper than the desired depth. The set +of commits start at the client's wants. + +The server writes 'shallow' lines for each commit whose parents will not be sent as a result. The server writes an 'unshallow' line for each commit which the client has indicated is shallow, but is no longer shallow at the currently requested depth 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/Documentation/user-manual.conf b/Documentation/user-manual.conf index 339b30919e..d87294de2f 100644 --- a/Documentation/user-manual.conf +++ b/Documentation/user-manual.conf @@ -14,7 +14,7 @@ ifdef::backend-docbook[] # "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this. [listingblock] <example><title>{title}</title> -<literallayout> +<literallayout class="monospaced"> | </literallayout> {title#}</example> diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 03d95dc290..85651b57ae 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1136,9 +1136,12 @@ Creating good commit messages Though not required, it's a good idea to begin the commit message with a single short (less than 50 character) line summarizing the change, followed by a blank line and then a more thorough -description. Tools that turn commits into email, for example, use -the first line on the Subject line and the rest of the commit in the -body. +description. The text up to the first blank line in a commit +message is treated as the commit title, and that title is used +throughout git. For example, linkgit:git-format-patch[1] turns a +commit into email, and it uses the title on the Subject line and the +rest of the commit in the body. + [[ignoring-files]] Ignoring files diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index d7ad6444db..b09d264a86 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.7.12-rc3 +DEF_VER=v1.8.0 LF=' ' @@ -90,6 +90,8 @@ all:: # # Define NO_MKDTEMP if you don't have mkdtemp in the C library. # +# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash. +# # Define NO_MKSTEMPS if you don't have mkstemps in the C library. # # Define NO_STRTOK_R if you don't have strtok_r in the C library. @@ -143,6 +145,12 @@ all:: # # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin). # +# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv. +# +# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t. +# +# Define NO_UINTMAX_T if you don't have uintmax_t. +# # Define NEEDS_SOCKET if linking with libc is not enough (SunOS, # Patrick Mauritz). # @@ -152,11 +160,21 @@ all:: # # Define NO_MMAP if you want to avoid mmap. # +# Define NO_SYS_POLL_H if you don't have sys/poll.h. +# +# Define NO_POLL if you do not have or don't want to use poll(). +# This also implies NO_SYS_POLL_H. +# # Define NO_PTHREADS if you do not have or do not want to use Pthreads. # # Define NO_PREAD if you have a problem with pread() system call (e.g. # cygwin1.dll before v1.5.22). # +# Define NO_SETITIMER if you don't have setitimer() +# +# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval +# This also implies NO_SETITIMER +# # Define NO_THREAD_SAFE_PREAD if your pread() implementation is not # thread-safe. (e.g. compat/pread.c or cygwin) # @@ -497,11 +515,13 @@ TEST_PROGRAMS_NEED_X += test-mergesort TEST_PROGRAMS_NEED_X += test-mktemp TEST_PROGRAMS_NEED_X += test-parse-options TEST_PROGRAMS_NEED_X += test-path-utils +TEST_PROGRAMS_NEED_X += test-regex TEST_PROGRAMS_NEED_X += test-revision-walking TEST_PROGRAMS_NEED_X += test-run-command TEST_PROGRAMS_NEED_X += test-scrap-cache-tree TEST_PROGRAMS_NEED_X += test-sha1 TEST_PROGRAMS_NEED_X += test-sigchain +TEST_PROGRAMS_NEED_X += test-string-list TEST_PROGRAMS_NEED_X += test-subprocess TEST_PROGRAMS_NEED_X += test-svn-fe @@ -596,10 +616,10 @@ LIB_H += compat/bswap.h LIB_H += compat/cygwin.h LIB_H += compat/mingw.h LIB_H += compat/obstack.h +LIB_H += compat/poll/poll.h LIB_H += compat/precompose_utf8.h LIB_H += compat/terminal.h LIB_H += compat/win32/dirent.h -LIB_H += compat/win32/poll.h LIB_H += compat/win32/pthread.h LIB_H += compat/win32/syslog.h LIB_H += connected.h @@ -1217,7 +1237,7 @@ ifeq ($(uname_S),Windows) NO_PREAD = YesPlease NEEDS_CRYPTO_WITH_SSL = YesPlease NO_LIBGEN_H = YesPlease - NO_SYS_POLL_H = YesPlease + NO_POLL = YesPlease NO_SYMLINK_HEAD = YesPlease NO_IPV6 = YesPlease NO_UNIX_SOCKETS = YesPlease @@ -1258,7 +1278,7 @@ ifeq ($(uname_S),Windows) BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE COMPAT_OBJS = compat/msvc.o compat/winansi.o \ compat/win32/pthread.o compat/win32/syslog.o \ - compat/win32/poll.o compat/win32/dirent.o + compat/win32/dirent.o COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\" BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib @@ -1308,12 +1328,67 @@ ifeq ($(uname_S),Minix) NO_CURL = NO_EXPAT = endif +ifeq ($(uname_S),NONSTOP_KERNEL) + # Needs some C99 features, "inline" is just one of them. + # INLINE='' would just replace one set of warnings with another and + # still not compile in c89 mode, due to non-const array initializations. + CC = cc -c99 + # Disable all optimization, seems to result in bad code, with -O or -O2 + # or even -O1 (default), /usr/local/libexec/git-core/git-pack-objects + # abends on "git push". Needs more investigation. + CFLAGS = -g -O0 + # We'd want it to be here. + prefix = /usr/local + # Our's are in ${prefix}/bin (perl might also be in /usr/bin/perl). + PERL_PATH = ${prefix}/bin/perl + PYTHON_PATH = ${prefix}/bin/python + + # As detected by './configure'. + # Missdetected, hence commented out, see below. + #NO_CURL = YesPlease + # Added manually, see above. + NEEDS_SSL_WITH_CURL = YesPlease + HAVE_LIBCHARSET_H = YesPlease + NEEDS_LIBICONV = YesPlease + NEEDS_LIBINTL_BEFORE_LIBICONV = YesPlease + NO_SYS_SELECT_H = UnfortunatelyYes + NO_D_TYPE_IN_DIRENT = YesPlease + NO_HSTRERROR = YesPlease + NO_STRCASESTR = YesPlease + NO_FNMATCH_CASEFOLD = YesPlease + NO_MEMMEM = YesPlease + NO_STRLCPY = YesPlease + NO_SETENV = YesPlease + NO_UNSETENV = YesPlease + NO_MKDTEMP = YesPlease + NO_MKSTEMPS = YesPlease + # Currently libiconv-1.9.1. + OLD_ICONV = UnfortunatelyYes + NO_REGEX = YesPlease + NO_PTHREADS = UnfortunatelyYes + + # Not detected (nor checked for) by './configure'. + # We don't have SA_RESTART on NonStop, unfortunalety. + COMPAT_CFLAGS += -DSA_RESTART=0 + # Apparently needed in compat/fnmatch/fnmatch.c. + COMPAT_CFLAGS += -DHAVE_STRING_H=1 + NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease + NO_NSEC = YesPlease + NO_PREAD = YesPlease + NO_MMAP = YesPlease + NO_POLL = YesPlease + NO_INTPTR_T = UnfortunatelyYes + # Bug report 10-120822-4477 submitted to HP NonStop development. + MKDIR_WO_TRAILING_SLASH = YesPlease + # RFE 10-120912-4693 submitted to HP NonStop development. + NO_SETITIMER = UnfortunatelyYes +endif ifneq (,$(findstring MINGW,$(uname_S))) pathsep = ; NO_PREAD = YesPlease NEEDS_CRYPTO_WITH_SSL = YesPlease NO_LIBGEN_H = YesPlease - NO_SYS_POLL_H = YesPlease + NO_POLL = YesPlease NO_SYMLINK_HEAD = YesPlease NO_UNIX_SOCKETS = YesPlease NO_SETENV = YesPlease @@ -1348,7 +1423,7 @@ ifneq (,$(findstring MINGW,$(uname_S))) COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" COMPAT_OBJS += compat/mingw.o compat/winansi.o \ compat/win32/pthread.o compat/win32/syslog.o \ - compat/win32/poll.o compat/win32/dirent.o + compat/win32/dirent.o EXTLIBS += -lws2_32 PTHREAD_LIBS = X = .exe @@ -1544,6 +1619,9 @@ ifdef NEEDS_LIBICONV else ICONV_LINK = endif + ifdef NEEDS_LIBINTL_BEFORE_LIBICONV + ICONV_LINK += -lintl + endif EXTLIBS += $(ICONV_LINK) -liconv endif ifdef NEEDS_LIBGEN @@ -1602,6 +1680,11 @@ ifdef NO_GETTEXT BASIC_CFLAGS += -DNO_GETTEXT USE_GETTEXT_SCHEME ?= fallthrough endif +ifdef NO_POLL + NO_SYS_POLL_H = YesPlease + COMPAT_CFLAGS += -DNO_POLL -Icompat/poll + COMPAT_OBJS += compat/poll/poll.o +endif ifdef NO_STRCASESTR COMPAT_CFLAGS += -DNO_STRCASESTR COMPAT_OBJS += compat/strcasestr.o @@ -1640,6 +1723,10 @@ ifdef NO_MKDTEMP COMPAT_CFLAGS += -DNO_MKDTEMP COMPAT_OBJS += compat/mkdtemp.o endif +ifdef MKDIR_WO_TRAILING_SLASH + COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH + COMPAT_OBJS += compat/mkdir.o +endif ifdef NO_MKSTEMPS COMPAT_CFLAGS += -DNO_MKSTEMPS endif @@ -1671,6 +1758,13 @@ endif ifdef OBJECT_CREATION_USES_RENAMES COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1 endif +ifdef NO_STRUCT_ITIMERVAL + COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL + NO_SETITIMER=YesPlease +endif +ifdef NO_SETITIMER + COMPAT_CFLAGS += -DNO_SETITIMER +endif ifdef NO_PREAD COMPAT_CFLAGS += -DNO_PREAD COMPAT_OBJS += compat/pread.o @@ -1688,6 +1782,9 @@ endif ifdef NO_IPV6 BASIC_CFLAGS += -DNO_IPV6 endif +ifdef NO_INTPTR_T + COMPAT_CFLAGS += -DNO_INTPTR_T +endif ifdef NO_UINTMAX_T BASIC_CFLAGS += -Duintmax_t=uint32_t endif @@ -2544,6 +2641,7 @@ bin-wrappers/%: wrap-for-bin.sh # with that. export NO_SVN_TESTS +export TEST_NO_MALLOC_CHECK ### Testing rules @@ -2810,8 +2908,13 @@ endif ### Check documentation # +ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) +ALL_COMMANDS += git +ALL_COMMANDS += gitk +ALL_COMMANDS += gitweb +ALL_COMMANDS += git-gui git-citool check-docs:: - @(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \ + @(for v in $(ALL_COMMANDS); \ do \ case "$$v" in \ git-merge-octopus | git-merge-ours | git-merge-recursive | \ @@ -2833,35 +2936,13 @@ check-docs:: sed -e '/^#/d' \ -e 's/[ ].*//' \ -e 's/^/listed /' command-list.txt; \ - ls -1 Documentation/git*txt | \ + $(MAKE) -C Documentation print-man1 | \ + grep '\.txt$$' | \ sed -e 's|Documentation/|documented |' \ -e 's/\.txt//'; \ ) | while read how cmd; \ do \ - case "$$how,$$cmd" in \ - *,git-citool | \ - *,git-gui | \ - *,git-help | \ - documented,gitattributes | \ - documented,gitignore | \ - documented,gitmodules | \ - documented,gitcli | \ - documented,git-tools | \ - documented,gitcore-tutorial | \ - documented,gitcvs-migration | \ - documented,gitdiffcore | \ - documented,gitglossary | \ - documented,githooks | \ - documented,gitrepository-layout | \ - documented,gitrevisions | \ - documented,gittutorial | \ - documented,gittutorial-2 | \ - documented,git-bisect-lk2009 | \ - documented,git-remote-helpers | \ - documented,gitworkflows | \ - sentinel,not,matching,is,ok ) continue ;; \ - esac; \ - case " $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk " in \ + case " $(ALL_COMMANDS) " in \ *" $$cmd "*) ;; \ *) echo "removed but $$how: $$cmd" ;; \ esac; \ @@ -1 +1 @@ -Documentation/RelNotes/1.7.12.txt
\ No newline at end of file +Documentation/RelNotes/1.8.0.txt
\ No newline at end of file @@ -35,6 +35,9 @@ const char *real_path(const char *path) if (path == buf || path == next_buf) return path; + if (!*path) + die("The empty string is not a valid path"); + if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) die ("Too long path: %.*s", 60, path); @@ -42,8 +45,8 @@ const char *real_path(const char *path) if (!is_directory(buf)) { char *last_slash = find_last_dir_sep(buf); if (last_slash) { - *last_slash = '\0'; last_elem = xstrdup(last_slash + 1); + last_slash[1] = '\0'; } else { last_elem = xstrdup(buf); *buf = '\0'; @@ -123,7 +126,9 @@ const char *absolute_path(const char *path) { static char buf[PATH_MAX + 1]; - if (is_absolute_path(path)) { + if (!*path) { + die("The empty string is not a valid path"); + } else if (is_absolute_path(path)) { if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) die("Too long path: %.*s", 60, path); } else { diff --git a/archive-zip.c b/archive-zip.c index f5af81f904..55f66b4060 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -4,6 +4,7 @@ #include "cache.h" #include "archive.h" #include "streaming.h" +#include "utf8.h" static int zip_date; static int zip_time; @@ -16,7 +17,8 @@ static unsigned int zip_dir_offset; static unsigned int zip_dir_entries; #define ZIP_DIRECTORY_MIN_SIZE (1024 * 1024) -#define ZIP_STREAM (8) +#define ZIP_STREAM (1 << 3) +#define ZIP_UTF8 (1 << 11) struct zip_local_header { unsigned char magic[4]; @@ -74,6 +76,14 @@ struct zip_dir_trailer { unsigned char _end[1]; }; +struct zip_extra_mtime { + unsigned char magic[2]; + unsigned char extra_size[2]; + unsigned char flags[1]; + unsigned char mtime[4]; + unsigned char _end[1]; +}; + /* * On ARM, padding is added at the end of the struct, so a simple * sizeof(struct ...) reports two bytes more than the payload size @@ -83,6 +93,9 @@ struct zip_dir_trailer { #define ZIP_DATA_DESC_SIZE offsetof(struct zip_data_desc, _end) #define ZIP_DIR_HEADER_SIZE offsetof(struct zip_dir_header, _end) #define ZIP_DIR_TRAILER_SIZE offsetof(struct zip_dir_trailer, _end) +#define ZIP_EXTRA_MTIME_SIZE offsetof(struct zip_extra_mtime, _end) +#define ZIP_EXTRA_MTIME_PAYLOAD_SIZE \ + (ZIP_EXTRA_MTIME_SIZE - offsetof(struct zip_extra_mtime, flags)) static void copy_le16(unsigned char *dest, unsigned int n) { @@ -164,6 +177,17 @@ static void set_zip_header_data_desc(struct zip_local_header *header, copy_le32(header->size, size); } +static int has_only_ascii(const char *s) +{ + for (;;) { + int c = *s++; + if (c == '\0') + return 1; + if (!isascii(c)) + return 0; + } +} + #define STREAM_BUFFER_SIZE (1024 * 16) static int write_zip_entry(struct archiver_args *args, @@ -173,6 +197,7 @@ static int write_zip_entry(struct archiver_args *args, { struct zip_local_header header; struct zip_dir_header dirent; + struct zip_extra_mtime extra; unsigned long attr2; unsigned long compressed_size; unsigned long crc; @@ -187,6 +212,13 @@ static int write_zip_entry(struct archiver_args *args, crc = crc32(0, NULL, 0); + if (!has_only_ascii(path)) { + if (is_utf8(path)) + flags |= ZIP_UTF8; + else + warning("Path is not valid UTF-8: %s", path); + } + if (pathlen > 0xffff) { return error("path too long (%d chars, SHA1: %s): %s", (int)pathlen, sha1_to_hex(sha1), path); @@ -246,8 +278,13 @@ static int write_zip_entry(struct archiver_args *args, } } + copy_le16(extra.magic, 0x5455); + copy_le16(extra.extra_size, ZIP_EXTRA_MTIME_PAYLOAD_SIZE); + extra.flags[0] = 1; /* just mtime */ + copy_le32(extra.mtime, args->time); + /* make sure we have enough free space in the dictionary */ - direntsize = ZIP_DIR_HEADER_SIZE + pathlen; + direntsize = ZIP_DIR_HEADER_SIZE + pathlen + ZIP_EXTRA_MTIME_SIZE; while (zip_dir_size < zip_dir_offset + direntsize) { zip_dir_size += ZIP_DIRECTORY_MIN_SIZE; zip_dir = xrealloc(zip_dir, zip_dir_size); @@ -263,7 +300,7 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.mdate, zip_date); set_zip_dir_data_desc(&dirent, size, compressed_size, crc); copy_le16(dirent.filename_length, pathlen); - copy_le16(dirent.extra_length, 0); + copy_le16(dirent.extra_length, ZIP_EXTRA_MTIME_SIZE); copy_le16(dirent.comment_length, 0); copy_le16(dirent.disk, 0); copy_le16(dirent.attr1, 0); @@ -281,11 +318,13 @@ static int write_zip_entry(struct archiver_args *args, else set_zip_header_data_desc(&header, size, compressed_size, crc); copy_le16(header.filename_length, pathlen); - copy_le16(header.extra_length, 0); + copy_le16(header.extra_length, ZIP_EXTRA_MTIME_SIZE); write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE); zip_offset += ZIP_LOCAL_HEADER_SIZE; write_or_die(1, path, pathlen); zip_offset += pathlen; + write_or_die(1, &extra, ZIP_EXTRA_MTIME_SIZE); + zip_offset += ZIP_EXTRA_MTIME_SIZE; if (stream && method == 0) { unsigned char buf[STREAM_BUFFER_SIZE]; ssize_t readlen; @@ -382,6 +421,8 @@ static int write_zip_entry(struct archiver_args *args, zip_dir_offset += ZIP_DIR_HEADER_SIZE; memcpy(zip_dir + zip_dir_offset, path, pathlen); zip_dir_offset += pathlen; + memcpy(zip_dir + zip_dir_offset, &extra, ZIP_EXTRA_MTIME_SIZE); + zip_dir_offset += ZIP_EXTRA_MTIME_SIZE; zip_dir_entries++; return 0; @@ -7,10 +7,10 @@ #include "unpack-trees.h" static char const * const archive_usage[] = { - "git archive [options] <tree-ish> [<path>...]", - "git archive --list", - "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]", - "git archive --remote <repo> [--exec <cmd>] --list", + N_("git archive [options] <tree-ish> [<path>...]"), + N_("git archive --list"), + N_("git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"), + N_("git archive --remote <repo> [--exec <cmd>] --list"), NULL }; @@ -319,16 +319,16 @@ static int parse_archive_args(int argc, const char **argv, int worktree_attributes = 0; struct option opts[] = { OPT_GROUP(""), - OPT_STRING(0, "format", &format, "fmt", "archive format"), - OPT_STRING(0, "prefix", &base, "prefix", - "prepend prefix to each pathname in the archive"), - OPT_STRING('o', "output", &output, "file", - "write the archive to this file"), + OPT_STRING(0, "format", &format, N_("fmt"), N_("archive format")), + OPT_STRING(0, "prefix", &base, N_("prefix"), + N_("prepend prefix to each pathname in the archive")), + OPT_STRING('o', "output", &output, N_("file"), + N_("write the archive to this file")), OPT_BOOL(0, "worktree-attributes", &worktree_attributes, - "read .gitattributes in working directory"), - OPT__VERBOSE(&verbose, "report archived files on stderr"), - OPT__COMPR('0', &compression_level, "store only", 0), - OPT__COMPR('1', &compression_level, "compress faster", 1), + N_("read .gitattributes in working directory")), + OPT__VERBOSE(&verbose, N_("report archived files on stderr")), + OPT__COMPR('0', &compression_level, N_("store only"), 0), + OPT__COMPR('1', &compression_level, N_("compress faster"), 1), OPT__COMPR_HIDDEN('2', &compression_level, 2), OPT__COMPR_HIDDEN('3', &compression_level, 3), OPT__COMPR_HIDDEN('4', &compression_level, 4), @@ -336,15 +336,15 @@ static int parse_archive_args(int argc, const char **argv, OPT__COMPR_HIDDEN('6', &compression_level, 6), OPT__COMPR_HIDDEN('7', &compression_level, 7), OPT__COMPR_HIDDEN('8', &compression_level, 8), - OPT__COMPR('9', &compression_level, "compress better", 9), + OPT__COMPR('9', &compression_level, N_("compress better"), 9), OPT_GROUP(""), OPT_BOOL('l', "list", &list, - "list supported archive formats"), + N_("list supported archive formats")), OPT_GROUP(""), - OPT_STRING(0, "remote", &remote, "repo", - "retrieve the archive from remote repository <repo>"), - OPT_STRING(0, "exec", &exec, "cmd", - "path to the remote git-upload-archive command"), + OPT_STRING(0, "remote", &remote, N_("repo"), + N_("retrieve the archive from remote repository <repo>")), + OPT_STRING(0, "exec", &exec, N_("command"), + N_("path to the remote git-upload-archive command")), OPT_END() }; diff --git a/argv-array.c b/argv-array.c index aab50d6a97..9e960d549c 100644 --- a/argv-array.c +++ b/argv-array.c @@ -49,12 +49,21 @@ void argv_array_pushl(struct argv_array *array, ...) va_end(ap); } +void argv_array_pop(struct argv_array *array) +{ + if (!array->argc) + return; + free((char *)array->argv[array->argc - 1]); + array->argv[array->argc - 1] = NULL; + array->argc--; +} + void argv_array_clear(struct argv_array *array) { if (array->argv != empty_argv) { int i; for (i = 0; i < array->argc; i++) - free((char **)array->argv[i]); + free((char *)array->argv[i]); free(array->argv); } argv_array_init(array); diff --git a/argv-array.h b/argv-array.h index b3ef351b44..40248d424c 100644 --- a/argv-array.h +++ b/argv-array.h @@ -16,6 +16,7 @@ void argv_array_push(struct argv_array *, const char *); __attribute__((format (printf,2,3))) 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); @@ -306,7 +306,7 @@ static void free_attr_elem(struct attr_stack *e) } static const char *builtin_attr[] = { - "[attr]binary -diff -text", + "[attr]binary -diff -merge -text", NULL, }; @@ -352,8 +352,11 @@ static struct attr_stack *read_attr_from_file(const char *path, int macro_ok) char buf[2048]; int lineno = 0; - if (!fp) + if (!fp) { + if (errno != ENOENT && errno != ENOTDIR) + warn_on_inaccessible(path); return NULL; + } res = xcalloc(1, sizeof(*res)); while (fgets(buf, sizeof(buf), fp)) handle_attr_line(res, buf, path, ++lineno, macro_ok); @@ -833,7 +833,7 @@ static int check_ancestors(const char *prefix) */ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout) { - char *filename = xstrdup(git_path("BISECT_ANCESTORS_OK")); + char *filename = git_pathdup("BISECT_ANCESTORS_OK"); struct stat st; int fd; @@ -21,7 +21,6 @@ struct fmt_merge_msg_opts { extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out, struct fmt_merge_msg_opts *); -extern void commit_notes(struct notes_tree *t, const char *msg); struct notes_rewrite_cfg { struct notes_tree **trees; @@ -33,7 +32,6 @@ struct notes_rewrite_cfg { int mode_from_env; }; -combine_notes_fn parse_combine_notes_fn(const char *v); struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd); int copy_note_for_rewrite(struct notes_rewrite_cfg *c, const unsigned char *from_obj, const unsigned char *to_obj); @@ -43,7 +41,7 @@ extern int check_pager_config(const char *cmd); struct diff_options; extern void setup_diff_pager(struct diff_options *); -extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, char **buf, unsigned long *buf_size); +extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, int sha1_valid, char **buf, unsigned long *buf_size); extern int cmd_add(int argc, const char **argv, const char *prefix); extern int cmd_annotate(int argc, const char **argv, const char *prefix); diff --git a/builtin/add.c b/builtin/add.c index 89dce56a24..e664100c71 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -16,7 +16,7 @@ #include "bulk-checkin.h" static const char * const builtin_add_usage[] = { - "git add [options] [--] <filepattern>...", + N_("git add [options] [--] <filepattern>..."), NULL }; static int patch_interactive, add_interactive, edit_interactive; @@ -260,7 +260,7 @@ int interactive_add(int argc, const char **argv, const char *prefix, int patch) static int edit_patch(int argc, const char **argv, const char *prefix) { - char *file = xstrdup(git_path("ADD_EDIT.patch")); + char *file = git_pathdup("ADD_EDIT.patch"); const char *apply_argv[] = { "apply", "--recount", "--cached", NULL, NULL }; struct child_process child; @@ -303,6 +303,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix) die (_("Could not apply '%s'"), file); unlink(file); + free(file); return 0; } @@ -315,19 +316,19 @@ static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0; static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0; static struct option builtin_add_options[] = { - OPT__DRY_RUN(&show_only, "dry run"), - OPT__VERBOSE(&verbose, "be verbose"), + OPT__DRY_RUN(&show_only, N_("dry run")), + OPT__VERBOSE(&verbose, N_("be verbose")), OPT_GROUP(""), - OPT_BOOLEAN('i', "interactive", &add_interactive, "interactive picking"), - OPT_BOOLEAN('p', "patch", &patch_interactive, "select hunks interactively"), - OPT_BOOLEAN('e', "edit", &edit_interactive, "edit current diff and apply"), - OPT__FORCE(&ignored_too, "allow adding otherwise ignored files"), - OPT_BOOLEAN('u', "update", &take_worktree_changes, "update tracked files"), - OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, "record only the fact that the path will be added later"), - OPT_BOOLEAN('A', "all", &addremove, "add changes from all tracked and untracked files"), - OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"), - OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"), - OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, "check if - even missing - files are ignored in dry run"), + OPT_BOOLEAN('i', "interactive", &add_interactive, N_("interactive picking")), + OPT_BOOLEAN('p', "patch", &patch_interactive, N_("select hunks interactively")), + OPT_BOOLEAN('e', "edit", &edit_interactive, N_("edit current diff and apply")), + OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files")), + OPT_BOOLEAN('u', "update", &take_worktree_changes, N_("update tracked files")), + OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")), + OPT_BOOLEAN('A', "all", &addremove, N_("add changes from all tracked and untracked files")), + OPT_BOOLEAN( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")), + OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")), + OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")), OPT_END(), }; diff --git a/builtin/apply.c b/builtin/apply.c index d453c83378..156b3ce3b7 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -188,7 +188,6 @@ struct patch { int is_new, is_delete; /* -1 = unknown, 0 = false, 1 = true */ int rejected; unsigned ws_rule; - unsigned long deflate_origlen; int lines_added, lines_deleted; int score; unsigned int is_toplevel_relative:1; @@ -1096,15 +1095,23 @@ static int gitdiff_unrecognized(const char *line, struct patch *patch) return -1; } -static const char *stop_at_slash(const char *line, int llen) +/* + * Skip p_value leading components from "line"; as we do not accept + * absolute paths, return NULL in that case. + */ +static const char *skip_tree_prefix(const char *line, int llen) { - int nslash = p_value; + int nslash; int i; + if (!p_value) + return (llen && line[0] == '/') ? NULL : line; + + nslash = p_value; for (i = 0; i < llen; i++) { int ch = line[i]; if (ch == '/' && --nslash <= 0) - return &line[i]; + return (i == 0) ? NULL : &line[i + 1]; } return NULL; } @@ -1134,12 +1141,11 @@ static char *git_header_name(const char *line, int llen) if (unquote_c_style(&first, line, &second)) goto free_and_fail1; - /* advance to the first slash */ - cp = stop_at_slash(first.buf, first.len); - /* we do not accept absolute paths */ - if (!cp || cp == first.buf) + /* strip the a/b prefix including trailing slash */ + cp = skip_tree_prefix(first.buf, first.len); + if (!cp) goto free_and_fail1; - strbuf_remove(&first, 0, cp + 1 - first.buf); + strbuf_remove(&first, 0, cp - first.buf); /* * second points at one past closing dq of name. @@ -1153,22 +1159,21 @@ static char *git_header_name(const char *line, int llen) if (*second == '"') { if (unquote_c_style(&sp, second, NULL)) goto free_and_fail1; - cp = stop_at_slash(sp.buf, sp.len); - if (!cp || cp == sp.buf) + cp = skip_tree_prefix(sp.buf, sp.len); + if (!cp) goto free_and_fail1; /* They must match, otherwise ignore */ - if (strcmp(cp + 1, first.buf)) + if (strcmp(cp, first.buf)) goto free_and_fail1; strbuf_release(&sp); return strbuf_detach(&first, NULL); } /* unquoted second */ - cp = stop_at_slash(second, line + llen - second); - if (!cp || cp == second) + cp = skip_tree_prefix(second, line + llen - second); + if (!cp) goto free_and_fail1; - cp++; - if (line + llen - cp != first.len + 1 || + if (line + llen - cp != first.len || memcmp(first.buf, cp, first.len)) goto free_and_fail1; return strbuf_detach(&first, NULL); @@ -1180,10 +1185,9 @@ static char *git_header_name(const char *line, int llen) } /* unquoted first name */ - name = stop_at_slash(line, llen); - if (!name || name == line) + name = skip_tree_prefix(line, llen); + if (!name) return NULL; - name++; /* * since the first name is unquoted, a dq if exists must be @@ -1197,10 +1201,9 @@ static char *git_header_name(const char *line, int llen) if (unquote_c_style(&sp, second, NULL)) goto free_and_fail2; - np = stop_at_slash(sp.buf, sp.len); - if (!np || np == sp.buf) + np = skip_tree_prefix(sp.buf, sp.len); + if (!np) goto free_and_fail2; - np++; len = sp.buf + sp.len - np; if (len < second - name && @@ -1232,13 +1235,27 @@ static char *git_header_name(const char *line, int llen) case '\n': return NULL; case '\t': case ' ': - second = stop_at_slash(name + len, line_len - len); + /* + * Is this the separator between the preimage + * and the postimage pathname? Again, we are + * only interested in the case where there is + * no rename, as this is only to set def_name + * and a rename patch has the names elsewhere + * in an unambiguous form. + */ + if (!name[len + 1]) + return NULL; /* no postimage name */ + second = skip_tree_prefix(name + len + 1, + line_len - (len + 1)); if (!second) return NULL; - second++; - if (second[len] == '\n' && !strncmp(name, second, len)) { + /* + * Does len bytes starting at "name" and "second" + * (that are separated by one HT or SP we just + * found) exactly match? + */ + if (second[len] == '\n' && !strncmp(name, second, len)) return xmemdupz(name, len); - } } } } @@ -4297,7 +4314,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) OPT_NOOP_NOARG(0, "allow-binary-replacement"), OPT_NOOP_NOARG(0, "binary"), OPT_BOOLEAN(0, "numstat", &numstat, - N_("shows number of added and deleted lines in decimal notation")), + N_("show number of added and deleted lines in decimal notation")), OPT_BOOLEAN(0, "summary", &summary, N_("instead of applying the patch, output a summary for the input")), OPT_BOOLEAN(0, "check", &check, diff --git a/builtin/archive.c b/builtin/archive.c index 931956def9..9a1cfd3dac 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -88,12 +88,12 @@ int cmd_archive(int argc, const char **argv, const char *prefix) const char *output = NULL; const char *remote = NULL; struct option local_opts[] = { - OPT_STRING('o', "output", &output, "file", - "write the archive to this file"), - OPT_STRING(0, "remote", &remote, "repo", - "retrieve the archive from remote repository <repo>"), - OPT_STRING(0, "exec", &exec, "cmd", - "path to the remote git-upload-archive command"), + OPT_STRING('o', "output", &output, N_("file"), + N_("write the archive to this file")), + OPT_STRING(0, "remote", &remote, N_("repo"), + N_("retrieve the archive from remote repository <repo>")), + OPT_STRING(0, "exec", &exec, N_("command"), + N_("path to the remote git-upload-archive command")), OPT_END() }; diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index 8d325a5179..e3884e3bb6 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -4,7 +4,7 @@ #include "bisect.h" static const char * const git_bisect_helper_usage[] = { - "git bisect--helper --next-all [--no-checkout]", + N_("git bisect--helper --next-all [--no-checkout]"), NULL }; @@ -14,9 +14,9 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) int no_checkout = 0; struct option options[] = { OPT_BOOLEAN(0, "next-all", &next_all, - "perform 'git bisect next'"), + N_("perform 'git bisect next'")), OPT_BOOLEAN(0, "no-checkout", &no_checkout, - "update BISECT_HEAD instead of checking out the current commit"), + N_("update BISECT_HEAD instead of checking out the current commit")), OPT_END() }; diff --git a/builtin/blame.c b/builtin/blame.c index 0d50273ce9..c27ef21c23 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -22,12 +22,12 @@ #include "utf8.h" #include "userdiff.h" -static char blame_usage[] = "git blame [options] [rev-opts] [rev] [--] file"; +static char blame_usage[] = N_("git blame [options] [rev-opts] [rev] [--] file"); static const char *blame_opt_usage[] = { blame_usage, "", - "[rev-opts] are documented in git-rev-list(1)", + N_("[rev-opts] are documented in git-rev-list(1)"), NULL }; @@ -110,6 +110,7 @@ static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen, int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, + int sha1_valid, char **buf, unsigned long *buf_size) { @@ -117,7 +118,7 @@ int textconv_object(const char *path, struct userdiff_driver *textconv; df = alloc_filespec(path); - fill_filespec(df, sha1, mode); + fill_filespec(df, sha1, sha1_valid, mode); textconv = get_textconv(df); if (!textconv) { free_filespec(df); @@ -142,7 +143,7 @@ static void fill_origin_blob(struct diff_options *opt, num_read_blob++; if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) && - textconv_object(o->path, o->mode, o->blob_sha1, &file->ptr, &file_size)) + textconv_object(o->path, o->mode, o->blob_sha1, 1, &file->ptr, &file_size)) ; else file->ptr = read_sha1_file(o->blob_sha1, &type, &file_size); @@ -406,8 +407,7 @@ static struct origin *find_origin(struct scoreboard *sb, paths[1] = NULL; diff_tree_setup_paths(paths, &diff_opts); - if (diff_setup_done(&diff_opts) < 0) - die("diff-setup"); + diff_setup_done(&diff_opts); if (is_null_sha1(origin->commit->object.sha1)) do_diff_cache(parent->tree->object.sha1, &diff_opts); @@ -493,8 +493,7 @@ static struct origin *find_rename(struct scoreboard *sb, diff_opts.single_follow = origin->path; paths[0] = NULL; diff_tree_setup_paths(paths, &diff_opts); - if (diff_setup_done(&diff_opts) < 0) - die("diff-setup"); + diff_setup_done(&diff_opts); if (is_null_sha1(origin->commit->object.sha1)) do_diff_cache(parent->tree->object.sha1, &diff_opts); @@ -1074,8 +1073,7 @@ static int find_copy_in_parent(struct scoreboard *sb, paths[0] = NULL; diff_tree_setup_paths(paths, &diff_opts); - if (diff_setup_done(&diff_opts) < 0) - die("diff-setup"); + diff_setup_done(&diff_opts); /* Try "find copies harder" on new path if requested; * we do not want to use diffcore_rename() actually to @@ -2071,6 +2069,55 @@ static int git_blame_config(const char *var, const char *value, void *cb) return git_default_config(var, value, cb); } +static void verify_working_tree_path(struct commit *work_tree, const char *path) +{ + struct commit_list *parents; + + for (parents = work_tree->parents; parents; parents = parents->next) { + const unsigned char *commit_sha1 = parents->item->object.sha1; + unsigned char blob_sha1[20]; + unsigned mode; + + if (!get_tree_entry(commit_sha1, path, blob_sha1, &mode) && + sha1_object_info(blob_sha1, NULL) == OBJ_BLOB) + return; + } + die("no such path '%s' in HEAD", path); +} + +static struct commit_list **append_parent(struct commit_list **tail, const unsigned char *sha1) +{ + struct commit *parent; + + parent = lookup_commit_reference(sha1); + if (!parent) + die("no such commit %s", sha1_to_hex(sha1)); + return &commit_list_insert(parent, tail)->next; +} + +static void append_merge_parents(struct commit_list **tail) +{ + int merge_head; + const char *merge_head_file = git_path("MERGE_HEAD"); + struct strbuf line = STRBUF_INIT; + + merge_head = open(merge_head_file, O_RDONLY); + if (merge_head < 0) { + if (errno == ENOENT) + return; + die("cannot open '%s' for reading", merge_head_file); + } + + while (!strbuf_getwholeline_fd(&line, merge_head, '\n')) { + unsigned char sha1[20]; + if (line.len < 40 || get_sha1_hex(line.buf, sha1)) + die("unknown line in '%s': %s", merge_head_file, line.buf); + tail = append_parent(tail, sha1); + } + close(merge_head); + strbuf_release(&line); +} + /* * Prepare a dummy commit that represents the work tree (or staged) item. * Note that annotating work tree item never works in the reverse. @@ -2081,6 +2128,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, { struct commit *commit; struct origin *origin; + struct commit_list **parent_tail, *parent; unsigned char head_sha1[20]; struct strbuf buf = STRBUF_INIT; const char *ident; @@ -2088,20 +2136,38 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, int size, len; struct cache_entry *ce; unsigned mode; - - if (get_sha1("HEAD", head_sha1)) - die("No such ref: HEAD"); + struct strbuf msg = STRBUF_INIT; time(&now); commit = xcalloc(1, sizeof(*commit)); - commit->parents = xcalloc(1, sizeof(*commit->parents)); - commit->parents->item = lookup_commit_reference(head_sha1); commit->object.parsed = 1; commit->date = now; commit->object.type = OBJ_COMMIT; + parent_tail = &commit->parents; + + if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL)) + die("no such ref: HEAD"); + + parent_tail = append_parent(parent_tail, head_sha1); + append_merge_parents(parent_tail); + verify_working_tree_path(commit, path); origin = make_origin(commit, path); + ident = fmt_ident("Not Committed Yet", "not.committed.yet", NULL, 0); + strbuf_addstr(&msg, "tree 0000000000000000000000000000000000000000\n"); + for (parent = commit->parents; parent; parent = parent->next) + strbuf_addf(&msg, "parent %s\n", + sha1_to_hex(parent->item->object.sha1)); + strbuf_addf(&msg, + "author %s\n" + "committer %s\n\n" + "Version of %s from %s\n", + ident, ident, path, + (!contents_from ? path : + (!strcmp(contents_from, "-") ? "standard input" : contents_from))); + commit->buffer = strbuf_detach(&msg, NULL); + if (!contents_from || strcmp("-", contents_from)) { struct stat st; const char *read_from; @@ -2123,7 +2189,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, switch (st.st_mode & S_IFMT) { case S_IFREG: if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) && - textconv_object(read_from, mode, null_sha1, &buf_ptr, &buf_len)) + textconv_object(read_from, mode, null_sha1, 0, &buf_ptr, &buf_len)) strbuf_attach(&buf, buf_ptr, buf_len, buf_len + 1); else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size) die_errno("cannot open or read '%s'", read_from); @@ -2138,7 +2204,6 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, } else { /* Reading from stdin */ - contents_from = "standard input"; mode = 0; if (strbuf_read(&buf, 0, 0) < 0) die_errno("failed to read from stdin"); @@ -2183,16 +2248,6 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, */ cache_tree_invalidate_path(active_cache_tree, path); - commit->buffer = xmalloc(400); - ident = fmt_ident("Not Committed Yet", "not.committed.yet", NULL, 0); - snprintf(commit->buffer, 400, - "tree 0000000000000000000000000000000000000000\n" - "parent %s\n" - "author %s\n" - "committer %s\n\n" - "Version of %s from %s\n", - sha1_to_hex(head_sha1), - ident, ident, path, contents_from ? contents_from : path); return commit; } @@ -2315,27 +2370,27 @@ int cmd_blame(int argc, const char **argv, const char *prefix) static const char *revs_file = NULL; static const char *contents_from = NULL; static const struct option options[] = { - OPT_BOOLEAN(0, "incremental", &incremental, "Show blame entries as we find them, incrementally"), - OPT_BOOLEAN('b', NULL, &blank_boundary, "Show blank SHA-1 for boundary commits (Default: off)"), - OPT_BOOLEAN(0, "root", &show_root, "Do not treat root commits as boundaries (Default: off)"), - OPT_BOOLEAN(0, "show-stats", &show_stats, "Show work cost statistics"), - OPT_BIT(0, "score-debug", &output_option, "Show output score for blame entries", OUTPUT_SHOW_SCORE), - OPT_BIT('f', "show-name", &output_option, "Show original filename (Default: auto)", OUTPUT_SHOW_NAME), - OPT_BIT('n', "show-number", &output_option, "Show original linenumber (Default: off)", OUTPUT_SHOW_NUMBER), - OPT_BIT('p', "porcelain", &output_option, "Show in a format designed for machine consumption", OUTPUT_PORCELAIN), - OPT_BIT(0, "line-porcelain", &output_option, "Show porcelain format with per-line commit information", OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN), - OPT_BIT('c', NULL, &output_option, "Use the same output mode as git-annotate (Default: off)", OUTPUT_ANNOTATE_COMPAT), - OPT_BIT('t', NULL, &output_option, "Show raw timestamp (Default: off)", OUTPUT_RAW_TIMESTAMP), - OPT_BIT('l', NULL, &output_option, "Show long commit SHA1 (Default: off)", OUTPUT_LONG_OBJECT_NAME), - OPT_BIT('s', NULL, &output_option, "Suppress author name and timestamp (Default: off)", OUTPUT_NO_AUTHOR), - OPT_BIT('e', "show-email", &output_option, "Show author email instead of name (Default: off)", OUTPUT_SHOW_EMAIL), - OPT_BIT('w', NULL, &xdl_opts, "Ignore whitespace differences", XDF_IGNORE_WHITESPACE), - OPT_BIT(0, "minimal", &xdl_opts, "Spend extra cycles to find better match", XDF_NEED_MINIMAL), - OPT_STRING('S', NULL, &revs_file, "file", "Use revisions from <file> instead of calling git-rev-list"), - OPT_STRING(0, "contents", &contents_from, "file", "Use <file>'s contents as the final image"), - { OPTION_CALLBACK, 'C', NULL, &opt, "score", "Find line copies within and across files", PARSE_OPT_OPTARG, blame_copy_callback }, - { OPTION_CALLBACK, 'M', NULL, &opt, "score", "Find line movements within and across files", PARSE_OPT_OPTARG, blame_move_callback }, - OPT_CALLBACK('L', NULL, &bottomtop, "n,m", "Process only line range n,m, counting from 1", blame_bottomtop_callback), + OPT_BOOLEAN(0, "incremental", &incremental, N_("Show blame entries as we find them, incrementally")), + OPT_BOOLEAN('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")), + OPT_BOOLEAN(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")), + OPT_BOOLEAN(0, "show-stats", &show_stats, N_("Show work cost statistics")), + OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE), + OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME), + OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER), + OPT_BIT('p', "porcelain", &output_option, N_("Show in a format designed for machine consumption"), OUTPUT_PORCELAIN), + OPT_BIT(0, "line-porcelain", &output_option, N_("Show porcelain format with per-line commit information"), OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN), + OPT_BIT('c', NULL, &output_option, N_("Use the same output mode as git-annotate (Default: off)"), OUTPUT_ANNOTATE_COMPAT), + OPT_BIT('t', NULL, &output_option, N_("Show raw timestamp (Default: off)"), OUTPUT_RAW_TIMESTAMP), + OPT_BIT('l', NULL, &output_option, N_("Show long commit SHA1 (Default: off)"), OUTPUT_LONG_OBJECT_NAME), + OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR), + OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL), + OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE), + OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL), + OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")), + OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")), + { OPTION_CALLBACK, 'C', NULL, &opt, N_("score"), N_("Find line copies within and across files"), PARSE_OPT_OPTARG, blame_copy_callback }, + { OPTION_CALLBACK, 'M', NULL, &opt, N_("score"), N_("Find line movements within and across files"), PARSE_OPT_OPTARG, blame_move_callback }, + OPT_CALLBACK('L', NULL, &bottomtop, N_("n,m"), N_("Process only line range n,m, counting from 1"), blame_bottomtop_callback), OPT__ABBREV(&abbrev), OPT_END() }; @@ -2516,7 +2571,7 @@ parse_done: die("no such path %s in %s", path, final_commit_name); if (DIFF_OPT_TST(&sb.revs->diffopt, ALLOW_TEXTCONV) && - textconv_object(path, o->mode, o->blob_sha1, (char **) &sb.final_buf, + textconv_object(path, o->mode, o->blob_sha1, 1, (char **) &sb.final_buf, &sb.final_buf_size)) ; else diff --git a/builtin/branch.c b/builtin/branch.c index 0e060f2e4a..ffd26849c7 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -17,12 +17,13 @@ #include "revision.h" #include "string-list.h" #include "column.h" +#include "utf8.h" static const char * const builtin_branch_usage[] = { - "git branch [options] [-r | -a] [--merged | --no-merged]", - "git branch [options] [-l] [-f] <branchname> [<start-point>]", - "git branch [options] [-r] (-d | -D) <branchname>...", - "git branch [options] (-m | -M) [<oldbranch>] <newbranch>", + N_("git branch [options] [-r | -a] [--merged | --no-merged]"), + N_("git branch [options] [-l] [-f] <branchname> [<start-point>]"), + N_("git branch [options] [-r] (-d | -D) <branchname>..."), + N_("git branch [options] (-m | -M) [<oldbranch>] <newbranch>"), NULL }; @@ -129,7 +130,7 @@ static int branch_merged(int kind, const char *name, if (!reference_rev) reference_rev = head_rev; - merged = in_merge_bases(rev, &reference_rev, 1); + merged = in_merge_bases(rev, reference_rev); /* * After the safety valve is fully redefined to "check with @@ -139,7 +140,7 @@ static int branch_merged(int kind, const char *name, * a gentle reminder is in order. */ if ((head_rev != reference_rev) && - in_merge_bases(rev, &head_rev, 1) != merged) { + in_merge_bases(rev, head_rev) != merged) { if (merged) warning(_("deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD."), @@ -196,7 +197,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, free(name); - name = xstrdup(mkpath(fmt, bname.buf)); + name = mkpathdup(fmt, bname.buf); if (read_ref(name, sha1)) { error(remote_branch ? _("remote branch '%s' not found.") @@ -249,7 +250,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, struct ref_item { char *name; char *dest; - unsigned int kind, len; + unsigned int kind, width; struct commit *commit; }; @@ -354,14 +355,14 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags, newitem->name = xstrdup(refname); newitem->kind = kind; newitem->commit = commit; - newitem->len = strlen(refname); + newitem->width = utf8_strwidth(refname); newitem->dest = resolve_symref(orig_refname, prefix); /* adjust for "remotes/" */ if (newitem->kind == REF_REMOTE_BRANCH && ref_list->kinds != REF_REMOTE_BRANCH) - newitem->len += 8; - if (newitem->len > ref_list->maxwidth) - ref_list->maxwidth = newitem->len; + newitem->width += 8; + if (newitem->width > ref_list->maxwidth) + ref_list->maxwidth = newitem->width; return 0; } @@ -490,11 +491,12 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, } strbuf_addf(&name, "%s%s", prefix, item->name); - if (verbose) + if (verbose) { + int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf); strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color), - maxwidth, name.buf, + maxwidth + utf8_compensation, name.buf, branch_get_color(BRANCH_COLOR_RESET)); - else + } else strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color), name.buf, branch_get_color(BRANCH_COLOR_RESET)); @@ -519,8 +521,8 @@ static int calc_maxwidth(struct ref_list *refs) for (i = 0; i < refs->index; i++) { if (!matches_merge_filter(refs->list[i].commit)) continue; - if (refs->list[i].len > w) - w = refs->list[i].len; + if (refs->list[i].width > w) + w = refs->list[i].width; } return w; } @@ -533,12 +535,12 @@ static void show_detached(struct ref_list *ref_list) if (head_commit && is_descendant_of(head_commit, ref_list->with_commit)) { struct ref_item item; item.name = xstrdup(_("(no branch)")); - item.len = strlen(item.name); + item.width = utf8_strwidth(item.name); item.kind = REF_LOCAL_BRANCH; item.dest = NULL; item.commit = head_commit; - if (item.len > ref_list->maxwidth) - ref_list->maxwidth = item.len; + if (item.width > ref_list->maxwidth) + ref_list->maxwidth = item.width; print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, ""); free(item.name); } @@ -712,62 +714,65 @@ int cmd_branch(int argc, const char **argv, const char *prefix) int delete = 0, rename = 0, force_create = 0, list = 0; int verbose = 0, abbrev = -1, detached = 0; int reflog = 0, edit_description = 0; - int quiet = 0; + int quiet = 0, unset_upstream = 0; + const char *new_upstream = NULL; enum branch_track track; int kinds = REF_LOCAL_BRANCH; struct commit_list *with_commit = NULL; struct option options[] = { - OPT_GROUP("Generic options"), + OPT_GROUP(N_("Generic options")), OPT__VERBOSE(&verbose, - "show hash and subject, give twice for upstream branch"), - OPT__QUIET(&quiet, "suppress informational messages"), - OPT_SET_INT('t', "track", &track, "set up tracking mode (see git-pull(1))", + N_("show hash and subject, give twice for upstream branch")), + OPT__QUIET(&quiet, N_("suppress informational messages")), + OPT_SET_INT('t', "track", &track, N_("set up tracking mode (see git-pull(1))"), BRANCH_TRACK_EXPLICIT), - OPT_SET_INT( 0, "set-upstream", &track, "change upstream info", + OPT_SET_INT( 0, "set-upstream", &track, N_("change upstream info"), BRANCH_TRACK_OVERRIDE), - OPT__COLOR(&branch_use_color, "use colored output"), - OPT_SET_INT('r', "remotes", &kinds, "act on remote-tracking branches", + OPT_STRING('u', "set-upstream-to", &new_upstream, "upstream", "change the upstream info"), + OPT_BOOLEAN(0, "unset-upstream", &unset_upstream, "Unset the upstream info"), + OPT__COLOR(&branch_use_color, N_("use colored output")), + OPT_SET_INT('r', "remotes", &kinds, N_("act on remote-tracking branches"), REF_REMOTE_BRANCH), { - OPTION_CALLBACK, 0, "contains", &with_commit, "commit", - "print only branches that contain the commit", + OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"), + N_("print only branches that contain the commit"), PARSE_OPT_LASTARG_DEFAULT, parse_opt_with_commit, (intptr_t)"HEAD", }, { - OPTION_CALLBACK, 0, "with", &with_commit, "commit", - "print only branches that contain the commit", + OPTION_CALLBACK, 0, "with", &with_commit, N_("commit"), + N_("print only branches that contain the commit"), PARSE_OPT_HIDDEN | PARSE_OPT_LASTARG_DEFAULT, parse_opt_with_commit, (intptr_t) "HEAD", }, OPT__ABBREV(&abbrev), - OPT_GROUP("Specific git-branch actions:"), - OPT_SET_INT('a', "all", &kinds, "list both remote-tracking and local branches", + OPT_GROUP(N_("Specific git-branch actions:")), + OPT_SET_INT('a', "all", &kinds, N_("list both remote-tracking and local branches"), REF_REMOTE_BRANCH | REF_LOCAL_BRANCH), - OPT_BIT('d', "delete", &delete, "delete fully merged branch", 1), - OPT_BIT('D', NULL, &delete, "delete branch (even if not merged)", 2), - OPT_BIT('m', "move", &rename, "move/rename a branch and its reflog", 1), - OPT_BIT('M', NULL, &rename, "move/rename a branch, even if target exists", 2), - OPT_BOOLEAN(0, "list", &list, "list branch names"), - OPT_BOOLEAN('l', "create-reflog", &reflog, "create the branch's reflog"), + OPT_BIT('d', "delete", &delete, N_("delete fully merged branch"), 1), + OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2), + OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1), + OPT_BIT('M', NULL, &rename, N_("move/rename a branch, even if target exists"), 2), + OPT_BOOLEAN(0, "list", &list, N_("list branch names")), + OPT_BOOLEAN('l', "create-reflog", &reflog, N_("create the branch's reflog")), OPT_BOOLEAN(0, "edit-description", &edit_description, - "edit the description for the branch"), - OPT__FORCE(&force_create, "force creation (when already exists)"), + N_("edit the description for the branch")), + OPT__FORCE(&force_create, N_("force creation (when already exists)")), { OPTION_CALLBACK, 0, "no-merged", &merge_filter_ref, - "commit", "print only not merged branches", + N_("commit"), N_("print only not merged branches"), PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, opt_parse_merge_filter, (intptr_t) "HEAD", }, { OPTION_CALLBACK, 0, "merged", &merge_filter_ref, - "commit", "print only merged branches", + N_("commit"), N_("print only merged branches"), PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, opt_parse_merge_filter, (intptr_t) "HEAD", }, - OPT_COLUMN(0, "column", &colopts, "list branches in columns"), + OPT_COLUMN(0, "column", &colopts, N_("list branches in columns")), OPT_END(), }; @@ -794,10 +799,10 @@ int cmd_branch(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, builtin_branch_usage, 0); - if (!delete && !rename && !edit_description && argc == 0) + if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0) list = 1; - if (!!delete + !!rename + !!force_create + !!list > 1) + if (!!delete + !!rename + !!force_create + !!list + !!new_upstream + !!unset_upstream > 1) usage_with_options(builtin_branch_usage, options); if (abbrev == -1) @@ -852,11 +857,62 @@ int cmd_branch(int argc, const char **argv, const char *prefix) rename_branch(argv[0], argv[1], rename > 1); else usage_with_options(builtin_branch_usage, options); + } else if (new_upstream) { + struct branch *branch = branch_get(argv[0]); + + if (!ref_exists(branch->refname)) + die(_("branch '%s' does not exist"), branch->name); + + /* + * create_branch takes care of setting up the tracking + * info and making sure new_upstream is correct + */ + create_branch(head, branch->name, new_upstream, 0, 0, 0, quiet, BRANCH_TRACK_OVERRIDE); + } else if (unset_upstream) { + struct branch *branch = branch_get(argv[0]); + struct strbuf buf = STRBUF_INIT; + + if (!branch_has_merge_config(branch)) { + die(_("Branch '%s' has no upstream information"), branch->name); + } + + strbuf_addf(&buf, "branch.%s.remote", branch->name); + git_config_set_multivar(buf.buf, NULL, NULL, 1); + strbuf_reset(&buf); + strbuf_addf(&buf, "branch.%s.merge", branch->name); + git_config_set_multivar(buf.buf, NULL, NULL, 1); + strbuf_release(&buf); } else if (argc > 0 && argc <= 2) { + struct branch *branch = branch_get(argv[0]); + int branch_existed = 0, remote_tracking = 0; + struct strbuf buf = STRBUF_INIT; + if (kinds != REF_LOCAL_BRANCH) die(_("-a and -r options to 'git branch' do not make sense with a branch name")); + + if (track == BRANCH_TRACK_OVERRIDE) + fprintf(stderr, _("The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to\n")); + + strbuf_addf(&buf, "refs/remotes/%s", branch->name); + remote_tracking = ref_exists(buf.buf); + strbuf_release(&buf); + + branch_existed = ref_exists(branch->refname); create_branch(head, argv[0], (argc == 2) ? argv[1] : head, force_create, reflog, 0, quiet, track); + + /* + * We only show the instructions if the user gave us + * one branch which doesn't exist locally, but is the + * name of a remote-tracking branch. + */ + if (argc == 1 && track == BRANCH_TRACK_OVERRIDE && + !branch_existed && remote_tracking) { + fprintf(stderr, _("\nIf you wanted to make '%s' track '%s', do this:\n\n"), head, branch->name); + fprintf(stderr, _(" git branch -d %s\n"), branch->name); + fprintf(stderr, _(" git branch --set-upstream-to %s\n"), branch->name); + } + } else usage_with_options(builtin_branch_usage, options); diff --git a/builtin/cat-file.c b/builtin/cat-file.c index af74e775a1..00528ddc38 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -146,7 +146,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) die("git cat-file --textconv %s: <object> must be <sha1:path>", obj_name); - if (!textconv_object(obj_context.path, obj_context.mode, sha1, &buf, &size)) + if (!textconv_object(obj_context.path, obj_context.mode, sha1, 1, &buf, &size)) die("git cat-file --textconv: unable to run textconv on %s", obj_name); break; @@ -244,8 +244,8 @@ static int batch_objects(int print_contents) } static const char * const cat_file_usage[] = { - "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>", - "git cat-file (--batch|--batch-check) < <list_of_objects>", + N_("git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"), + N_("git cat-file (--batch|--batch-check) < <list_of_objects>"), NULL }; @@ -263,19 +263,19 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix) const char *exp_type = NULL, *obj_name = NULL; const struct option options[] = { - OPT_GROUP("<type> can be one of: blob, tree, commit, tag"), - OPT_SET_INT('t', NULL, &opt, "show object type", 't'), - OPT_SET_INT('s', NULL, &opt, "show object size", 's'), + OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")), + OPT_SET_INT('t', NULL, &opt, N_("show object type"), 't'), + OPT_SET_INT('s', NULL, &opt, N_("show object size"), 's'), OPT_SET_INT('e', NULL, &opt, - "exit with zero when there's no error", 'e'), - OPT_SET_INT('p', NULL, &opt, "pretty-print object's content", 'p'), + N_("exit with zero when there's no error"), 'e'), + OPT_SET_INT('p', NULL, &opt, N_("pretty-print object's content"), 'p'), OPT_SET_INT(0, "textconv", &opt, - "for blob objects, run textconv on object's content", 'c'), + N_("for blob objects, run textconv on object's content"), 'c'), OPT_SET_INT(0, "batch", &batch, - "show info and content of objects fed from the standard input", + N_("show info and content of objects fed from the standard input"), BATCH), OPT_SET_INT(0, "batch-check", &batch, - "show info about objects fed from the standard input", + N_("show info about objects fed from the standard input"), BATCH_CHECK), OPT_END() }; diff --git a/builtin/check-attr.c b/builtin/check-attr.c index 44c421eb0f..075d01d30c 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -8,19 +8,19 @@ static int all_attrs; static int cached_attrs; static int stdin_paths; static const char * const check_attr_usage[] = { -"git check-attr [-a | --all | attr...] [--] pathname...", -"git check-attr --stdin [-a | --all | attr...] < <list-of-paths>", +N_("git check-attr [-a | --all | attr...] [--] pathname..."), +N_("git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"), NULL }; static int null_term_line; static const struct option check_attr_options[] = { - OPT_BOOLEAN('a', "all", &all_attrs, "report all attributes set on file"), - OPT_BOOLEAN(0, "cached", &cached_attrs, "use .gitattributes only from the index"), - OPT_BOOLEAN(0 , "stdin", &stdin_paths, "read file names from stdin"), + OPT_BOOLEAN('a', "all", &all_attrs, N_("report all attributes set on file")), + OPT_BOOLEAN(0, "cached", &cached_attrs, N_("use .gitattributes only from the index")), + OPT_BOOLEAN(0 , "stdin", &stdin_paths, N_("read file names from stdin")), OPT_BOOLEAN('z', NULL, &null_term_line, - "input paths are terminated by a null character"), + N_("input paths are terminated by a null character")), OPT_END() }; diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index c16d82b7de..b1feda7d5e 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -123,7 +123,7 @@ static void checkout_all(const char *prefix, int prefix_length) } static const char * const builtin_checkout_index_usage[] = { - "git checkout-index [options] [--] [<file>...]", + N_("git checkout-index [options] [--] [<file>...]"), NULL }; @@ -184,27 +184,27 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) int force = 0, quiet = 0, not_new = 0; struct option builtin_checkout_index_options[] = { OPT_BOOLEAN('a', "all", &all, - "checks out all files in the index"), - OPT__FORCE(&force, "forces overwrite of existing files"), + N_("check out all files in the index")), + OPT__FORCE(&force, N_("force overwrite of existing files")), OPT__QUIET(&quiet, - "no warning for existing files and files not in index"), + N_("no warning for existing files and files not in index")), OPT_BOOLEAN('n', "no-create", ¬_new, - "don't checkout new files"), + N_("don't checkout new files")), { OPTION_CALLBACK, 'u', "index", &newfd, NULL, - "update stat information in the index file", + N_("update stat information in the index file"), PARSE_OPT_NOARG, option_parse_u }, { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - "paths are separated with NUL character", + N_("paths are separated with NUL character"), PARSE_OPT_NOARG, option_parse_z }, OPT_BOOLEAN(0, "stdin", &read_from_stdin, - "read list of paths from the standard input"), + N_("read list of paths from the standard input")), OPT_BOOLEAN(0, "temp", &to_tempfile, - "write the content to temporary files"), - OPT_CALLBACK(0, "prefix", NULL, "string", - "when creating files, prepend <string>", + N_("write the content to temporary files")), + OPT_CALLBACK(0, "prefix", NULL, N_("string"), + N_("when creating files, prepend <string>"), option_parse_prefix), OPT_CALLBACK(0, "stage", NULL, NULL, - "copy out the files from named stage", + N_("copy out the files from named stage"), option_parse_stage), OPT_END() }; diff --git a/builtin/checkout.c b/builtin/checkout.c index d812219b30..781295b2c9 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -22,29 +22,31 @@ #include "argv-array.h" static const char * const checkout_usage[] = { - "git checkout [options] <branch>", - "git checkout [options] [<branch>] -- <file>...", + N_("git checkout [options] <branch>"), + N_("git checkout [options] [<branch>] -- <file>..."), NULL, }; struct checkout_opts { + int patch_mode; int quiet; int merge; int force; int force_detach; int writeout_stage; - int writeout_error; int overwrite_ignore; - /* not set by parse_options */ - int branch_exists; - const char *new_branch; const char *new_branch_force; const char *new_orphan_branch; int new_branch_log; enum branch_track track; struct diff_options diff_options; + + int branch_exists; + const char *prefix; + const char **pathspec; + struct tree *source_tree; }; static int post_checkout_hook(struct commit *old, struct commit *new, @@ -215,8 +217,8 @@ static int checkout_merged(int pos, struct checkout *state) return status; } -static int checkout_paths(struct tree *source_tree, const char **pathspec, - const char *prefix, struct checkout_opts *opts) +static int checkout_paths(const struct checkout_opts *opts, + const char *revision) { int pos; struct checkout state; @@ -228,37 +230,65 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, int stage = opts->writeout_stage; int merge = opts->merge; int newfd; - struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); + struct lock_file *lock_file; + + if (opts->track != BRANCH_TRACK_UNSPECIFIED) + die(_("'%s' cannot be used with updating paths"), "--track"); + + if (opts->new_branch_log) + die(_("'%s' cannot be used with updating paths"), "-l"); + + if (opts->force && opts->patch_mode) + die(_("'%s' cannot be used with updating paths"), "-f"); + + if (opts->force_detach) + die(_("'%s' cannot be used with updating paths"), "--detach"); + + if (opts->merge && opts->patch_mode) + die(_("'%s' cannot be used with %s"), "--merge", "--patch"); + + if (opts->force && opts->merge) + die(_("'%s' cannot be used with %s"), "-f", "-m"); + + if (opts->new_branch) + die(_("Cannot update paths and switch to branch '%s' at the same time."), + opts->new_branch); + + if (opts->patch_mode) + return run_add_interactive(revision, "--patch=checkout", + opts->pathspec); + + lock_file = xcalloc(1, sizeof(struct lock_file)); newfd = hold_locked_index(lock_file, 1); - if (read_cache_preload(pathspec) < 0) + if (read_cache_preload(opts->pathspec) < 0) return error(_("corrupt index file")); - if (source_tree) - read_tree_some(source_tree, pathspec); + if (opts->source_tree) + read_tree_some(opts->source_tree, opts->pathspec); - for (pos = 0; pathspec[pos]; pos++) + for (pos = 0; opts->pathspec[pos]; pos++) ; ps_matched = xcalloc(1, pos); for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; - if (source_tree && !(ce->ce_flags & CE_UPDATE)) + if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; - match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched); + match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched); } - if (report_path_error(ps_matched, pathspec, prefix)) + if (report_path_error(ps_matched, opts->pathspec, opts->prefix)) return 1; /* "checkout -m path" to recreate conflicted state */ if (opts->merge) - unmerge_cache(pathspec); + unmerge_cache(opts->pathspec); /* Any unmerged paths? */ for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; - if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) { + if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) { if (!ce_stage(ce)) continue; if (opts->force) { @@ -283,9 +313,9 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, state.refresh_cache = 1; for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; - if (source_tree && !(ce->ce_flags & CE_UPDATE)) + if (opts->source_tree && !(ce->ce_flags & CE_UPDATE)) continue; - if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) { + if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) { if (!ce_stage(ce)) { errs |= checkout_entry(ce, &state, NULL); continue; @@ -309,15 +339,15 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, return errs; } -static void show_local_changes(struct object *head, struct diff_options *opts) +static void show_local_changes(struct object *head, + const struct diff_options *opts) { struct rev_info rev; /* I think we want full paths, even if we're in a subdirectory. */ init_revisions(&rev, NULL); rev.diffopt.flags = opts->flags; rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS; - if (diff_setup_done(&rev.diffopt) < 0) - die(_("diff_setup_done failed")); + diff_setup_done(&rev.diffopt); add_pending_object(&rev, head, NULL); run_diff_index(&rev, 0); } @@ -332,7 +362,8 @@ static void describe_detached_head(const char *msg, struct commit *commit) strbuf_release(&sb); } -static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree) +static int reset_tree(struct tree *tree, const struct checkout_opts *o, + int worktree, int *writeout_error) { struct unpack_trees_options opts; struct tree_desc tree_desc; @@ -351,7 +382,7 @@ static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree) init_tree_desc(&tree_desc, tree->buffer, tree->size); switch (unpack_trees(1, &tree_desc, &opts)) { case -2: - o->writeout_error = 1; + *writeout_error = 1; /* * We return 0 nevertheless, as the index is all right * and more importantly we have made best efforts to @@ -382,8 +413,10 @@ static void setup_branch_path(struct branch_info *branch) branch->path = strbuf_detach(&buf, NULL); } -static int merge_working_tree(struct checkout_opts *opts, - struct branch_info *old, struct branch_info *new) +static int merge_working_tree(const struct checkout_opts *opts, + struct branch_info *old, + struct branch_info *new, + int *writeout_error) { int ret; struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); @@ -394,7 +427,7 @@ static int merge_working_tree(struct checkout_opts *opts, resolve_undo_clear(); if (opts->force) { - ret = reset_tree(new->commit->tree, opts, 1); + ret = reset_tree(new->commit->tree, opts, 1, writeout_error); if (ret) return ret; } else { @@ -480,7 +513,8 @@ static int merge_working_tree(struct checkout_opts *opts, o.verbosity = 0; work = write_tree_from_memory(&o); - ret = reset_tree(new->commit->tree, opts, 1); + ret = reset_tree(new->commit->tree, opts, 1, + writeout_error); if (ret) return ret; o.ancestor = old->name; @@ -488,7 +522,8 @@ static int merge_working_tree(struct checkout_opts *opts, o.branch2 = "local"; merge_trees(&o, new->commit->tree, work, old->commit->tree, &result); - ret = reset_tree(new->commit->tree, opts, 0); + ret = reset_tree(new->commit->tree, opts, 0, + writeout_error); if (ret) return ret; } @@ -515,7 +550,7 @@ static void report_tracking(struct branch_info *new) strbuf_release(&sb); } -static void update_refs_for_switch(struct checkout_opts *opts, +static void update_refs_for_switch(const struct checkout_opts *opts, struct branch_info *old, struct branch_info *new) { @@ -702,13 +737,14 @@ static void orphaned_commit_warning(struct commit *old, struct commit *new) free(refs.objects); } -static int switch_branches(struct checkout_opts *opts, struct branch_info *new) +static int switch_branches(const struct checkout_opts *opts, + struct branch_info *new) { int ret = 0; struct branch_info old; void *path_to_free; unsigned char rev[20]; - int flag; + int flag, writeout_error = 0; memset(&old, 0, sizeof(old)); old.path = path_to_free = resolve_refdup("HEAD", rev, 0, &flag); old.commit = lookup_commit_reference_gently(rev, 1); @@ -726,7 +762,7 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new) parse_commit(new->commit); } - ret = merge_working_tree(opts, &old, new); + ret = merge_working_tree(opts, &old, new, &writeout_error); if (ret) { free(path_to_free); return ret; @@ -739,7 +775,7 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new) ret = post_checkout_hook(old.commit, new->commit, 1); free(path_to_free); - return ret || opts->writeout_error; + return ret || writeout_error; } static int git_checkout_config(const char *var, const char *value, void *cb) @@ -756,12 +792,6 @@ static int git_checkout_config(const char *var, const char *value, void *cb) return git_xmerge_config(var, value, NULL); } -static int interactive_checkout(const char *revision, const char **pathspec, - struct checkout_opts *opts) -{ - return run_add_interactive(revision, "--patch=checkout", pathspec); -} - struct tracking_name_data { const char *name; char *remote; @@ -911,7 +941,7 @@ static int parse_branchname_arg(int argc, const char **argv, return argcount; } -static int switch_unborn_to_new_branch(struct checkout_opts *opts) +static int switch_unborn_to_new_branch(const struct checkout_opts *opts) { int status; struct strbuf branch_ref = STRBUF_INIT; @@ -924,38 +954,80 @@ static int switch_unborn_to_new_branch(struct checkout_opts *opts) return status; } +static int checkout_branch(struct checkout_opts *opts, + struct branch_info *new) +{ + if (opts->pathspec) + die(_("paths cannot be used with switching branches")); + + if (opts->patch_mode) + die(_("'%s' cannot be used with switching branches"), + "--patch"); + + if (opts->writeout_stage) + die(_("'%s' cannot be used with switching branches"), + "--ours/--theirs"); + + if (opts->force && opts->merge) + die(_("'%s' cannot be used with '%s'"), "-f", "-m"); + + if (opts->force_detach && opts->new_branch) + die(_("'%s' cannot be used with '%s'"), + "--detach", "-b/-B/--orphan"); + + if (opts->new_orphan_branch) { + if (opts->track != BRANCH_TRACK_UNSPECIFIED) + die(_("'%s' cannot be used with '%s'"), "--orphan", "-t"); + } else if (opts->force_detach) { + if (opts->track != BRANCH_TRACK_UNSPECIFIED) + die(_("'%s' cannot be used with '%s'"), "--detach", "-t"); + } else if (opts->track == BRANCH_TRACK_UNSPECIFIED) + opts->track = git_branch_track; + + if (new->name && !new->commit) + die(_("Cannot switch branch to a non-commit '%s'"), + new->name); + + if (!new->commit && opts->new_branch) { + unsigned char rev[20]; + int flag; + + if (!read_ref_full("HEAD", rev, 0, &flag) && + (flag & REF_ISSYMREF) && is_null_sha1(rev)) + return switch_unborn_to_new_branch(opts); + } + return switch_branches(opts, new); +} + int cmd_checkout(int argc, const char **argv, const char *prefix) { struct checkout_opts opts; - unsigned char rev[20]; struct branch_info new; - struct tree *source_tree = NULL; char *conflict_style = NULL; - int patch_mode = 0; int dwim_new_local_branch = 1; struct option options[] = { - OPT__QUIET(&opts.quiet, "suppress progress reporting"), - OPT_STRING('b', NULL, &opts.new_branch, "branch", - "create and checkout a new branch"), - OPT_STRING('B', NULL, &opts.new_branch_force, "branch", - "create/reset and checkout a branch"), - OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"), - OPT_BOOLEAN(0, "detach", &opts.force_detach, "detach the HEAD at named commit"), - OPT_SET_INT('t', "track", &opts.track, "set upstream info for new branch", + OPT__QUIET(&opts.quiet, N_("suppress progress reporting")), + OPT_STRING('b', NULL, &opts.new_branch, N_("branch"), + N_("create and checkout a new branch")), + OPT_STRING('B', NULL, &opts.new_branch_force, N_("branch"), + N_("create/reset and checkout a branch")), + OPT_BOOLEAN('l', NULL, &opts.new_branch_log, N_("create reflog for new branch")), + OPT_BOOLEAN(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")), + OPT_SET_INT('t', "track", &opts.track, N_("set upstream info for new branch"), BRANCH_TRACK_EXPLICIT), - OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"), - OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files", + OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new branch"), N_("new unparented branch")), + OPT_SET_INT('2', "ours", &opts.writeout_stage, N_("checkout our version for unmerged files"), 2), - OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files", + OPT_SET_INT('3', "theirs", &opts.writeout_stage, N_("checkout their version for unmerged files"), 3), - OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"), - OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"), - OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, "update ignored files (default)"), - OPT_STRING(0, "conflict", &conflict_style, "style", - "conflict style (merge or diff3)"), - OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"), + OPT__FORCE(&opts.force, N_("force checkout (throw away local modifications)")), + OPT_BOOLEAN('m', "merge", &opts.merge, N_("perform a 3-way merge with the new branch")), + OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, N_("update ignored files (default)")), + OPT_STRING(0, "conflict", &conflict_style, N_("style"), + N_("conflict style (merge or diff3)")), + OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")), { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, - "second guess 'git checkout no-such-branch'", + N_("second guess 'git checkout no-such-branch'"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, OPT_END(), }; @@ -963,6 +1035,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) memset(&opts, 0, sizeof(opts)); memset(&new, 0, sizeof(new)); opts.overwrite_ignore = 1; + opts.prefix = prefix; gitmodules_config(); git_config(git_checkout_config, &opts); @@ -972,26 +1045,27 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, checkout_usage, PARSE_OPT_KEEP_DASHDASH); - /* we can assume from now on new_branch = !new_branch_force */ - if (opts.new_branch && opts.new_branch_force) - die(_("-B cannot be used with -b")); + if (conflict_style) { + opts.merge = 1; /* implied */ + git_xmerge_config("merge.conflictstyle", conflict_style, NULL); + } + + if ((!!opts.new_branch + !!opts.new_branch_force + !!opts.new_orphan_branch) > 1) + die(_("-b, -B and --orphan are mutually exclusive")); - /* copy -B over to -b, so that we can just check the latter */ + /* + * From here on, new_branch will contain the branch to be checked out, + * and new_branch_force and new_orphan_branch will tell us which one of + * -b/-B/--orphan is being used. + */ if (opts.new_branch_force) opts.new_branch = opts.new_branch_force; - if (patch_mode && (opts.track > 0 || opts.new_branch - || opts.new_branch_log || opts.merge || opts.force - || opts.force_detach)) - die (_("--patch is incompatible with all other options")); - - if (opts.force_detach && (opts.new_branch || opts.new_orphan_branch)) - die(_("--detach cannot be used with -b/-B/--orphan")); - if (opts.force_detach && 0 < opts.track) - die(_("--detach cannot be used with -t")); + if (opts.new_orphan_branch) + opts.new_branch = opts.new_orphan_branch; - /* --track without -b should DWIM */ - if (0 < opts.track && !opts.new_branch) { + /* --track without -b/-B/--orphan should DWIM */ + if (opts.track != BRANCH_TRACK_UNSPECIFIED && !opts.new_branch) { const char *argv0 = argv[0]; if (!argc || !strcmp(argv0, "--")) die (_("--track needs a branch name")); @@ -1005,22 +1079,6 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) opts.new_branch = argv0 + 1; } - if (opts.new_orphan_branch) { - if (opts.new_branch) - die(_("--orphan and -b|-B are mutually exclusive")); - if (opts.track > 0) - die(_("--orphan cannot be used with -t")); - opts.new_branch = opts.new_orphan_branch; - } - - if (conflict_style) { - opts.merge = 1; /* implied */ - git_xmerge_config("merge.conflictstyle", conflict_style, NULL); - } - - if (opts.force && opts.merge) - die(_("git checkout: -f and -m are incompatible")); - /* * Extract branch name from command line arguments, so * all that is left is pathspecs. @@ -1035,73 +1093,56 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) * remote branches, erroring out for invalid or ambiguous cases. */ if (argc) { + unsigned char rev[20]; int dwim_ok = - !patch_mode && + !opts.patch_mode && dwim_new_local_branch && opts.track == BRANCH_TRACK_UNSPECIFIED && !opts.new_branch; int n = parse_branchname_arg(argc, argv, dwim_ok, - &new, &source_tree, rev, &opts.new_branch); + &new, &opts.source_tree, + rev, &opts.new_branch); argv += n; argc -= n; } - if (opts.track == BRANCH_TRACK_UNSPECIFIED) - opts.track = git_branch_track; - if (argc) { - const char **pathspec = get_pathspec(prefix, argv); + opts.pathspec = get_pathspec(prefix, argv); - if (!pathspec) + if (!opts.pathspec) die(_("invalid path specification")); - if (patch_mode) - return interactive_checkout(new.name, pathspec, &opts); - - /* Checkout paths */ - if (opts.new_branch) { - if (argc == 1) { - die(_("git checkout: updating paths is incompatible with switching branches.\nDid you intend to checkout '%s' which can not be resolved as commit?"), argv[0]); - } else { - die(_("git checkout: updating paths is incompatible with switching branches.")); - } - } + /* + * Try to give more helpful suggestion. + * new_branch && argc > 1 will be caught later. + */ + if (opts.new_branch && argc == 1) + die(_("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?"), + opts.new_branch, argv[0]); if (opts.force_detach) - die(_("git checkout: --detach does not take a path argument")); + die(_("git checkout: --detach does not take a path argument '%s'"), + argv[0]); if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge) - die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.")); - - return checkout_paths(source_tree, pathspec, prefix, &opts); + die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\n" + "checking out of the index.")); } - if (patch_mode) - return interactive_checkout(new.name, NULL, &opts); - if (opts.new_branch) { struct strbuf buf = STRBUF_INIT; - opts.branch_exists = validate_new_branchname(opts.new_branch, &buf, - !!opts.new_branch_force, - !!opts.new_branch_force); + opts.branch_exists = + validate_new_branchname(opts.new_branch, &buf, + !!opts.new_branch_force, + !!opts.new_branch_force); strbuf_release(&buf); } - if (new.name && !new.commit) { - die(_("Cannot switch branch to a non-commit.")); - } - if (opts.writeout_stage) - die(_("--ours/--theirs is incompatible with switching branches.")); - - if (!new.commit && opts.new_branch) { - unsigned char rev[20]; - int flag; - - if (!read_ref_full("HEAD", rev, 0, &flag) && - (flag & REF_ISSYMREF) && is_null_sha1(rev)) - return switch_unborn_to_new_branch(&opts); - } - return switch_branches(&opts, &new); + if (opts.patch_mode || opts.pathspec) + return checkout_paths(&opts, new.name); + else + return checkout_branch(&opts, &new); } diff --git a/builtin/clean.c b/builtin/clean.c index 0c7b3d0f4c..69c1cda906 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -16,7 +16,7 @@ static int force = -1; /* unset */ static const char *const builtin_clean_usage[] = { - "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>...", + N_("git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."), NULL }; @@ -48,16 +48,16 @@ int cmd_clean(int argc, const char **argv, const char *prefix) const char *qname; char *seen = NULL; struct option options[] = { - OPT__QUIET(&quiet, "do not print names of files removed"), - OPT__DRY_RUN(&show_only, "dry run"), - OPT__FORCE(&force, "force"), + OPT__QUIET(&quiet, N_("do not print names of files removed")), + OPT__DRY_RUN(&show_only, N_("dry run")), + OPT__FORCE(&force, N_("force")), OPT_BOOLEAN('d', NULL, &remove_directories, - "remove whole directories"), - { OPTION_CALLBACK, 'e', "exclude", &exclude_list, "pattern", - "add <pattern> to ignore rules", PARSE_OPT_NONEG, exclude_cb }, - OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"), + N_("remove whole directories")), + { OPTION_CALLBACK, 'e', "exclude", &exclude_list, N_("pattern"), + N_("add <pattern> to ignore rules"), PARSE_OPT_NONEG, exclude_cb }, + OPT_BOOLEAN('x', NULL, &ignored, N_("remove ignored files, too")), OPT_BOOLEAN('X', NULL, &ignored_only, - "remove only ignored files"), + N_("remove only ignored files")), OPT_END() }; diff --git a/builtin/clone.c b/builtin/clone.c index e314b0b6d2..ec2f75b4f3 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -33,7 +33,7 @@ * */ static const char * const builtin_clone_usage[] = { - "git clone [options] [--] <repo> [<dir>]", + N_("git clone [options] [--] <repo> [<dir>]"), NULL }; @@ -61,43 +61,43 @@ static int opt_parse_reference(const struct option *opt, const char *arg, int un static struct option builtin_clone_options[] = { OPT__VERBOSITY(&option_verbosity), OPT_BOOL(0, "progress", &option_progress, - "force progress reporting"), + N_("force progress reporting")), OPT_BOOLEAN('n', "no-checkout", &option_no_checkout, - "don't create a checkout"), - OPT_BOOLEAN(0, "bare", &option_bare, "create a bare repository"), + N_("don't create a checkout")), + OPT_BOOLEAN(0, "bare", &option_bare, N_("create a bare repository")), { OPTION_BOOLEAN, 0, "naked", &option_bare, NULL, - "create a bare repository", + N_("create a bare repository"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, OPT_BOOLEAN(0, "mirror", &option_mirror, - "create a mirror repository (implies bare)"), + N_("create a mirror repository (implies bare)")), OPT_BOOL('l', "local", &option_local, - "to clone from a local repository"), + N_("to clone from a local repository")), OPT_BOOLEAN(0, "no-hardlinks", &option_no_hardlinks, - "don't use local hardlinks, always copy"), + N_("don't use local hardlinks, always copy")), OPT_BOOLEAN('s', "shared", &option_shared, - "setup as shared repository"), + N_("setup as shared repository")), OPT_BOOLEAN(0, "recursive", &option_recursive, - "initialize submodules in the clone"), + N_("initialize submodules in the clone")), OPT_BOOLEAN(0, "recurse-submodules", &option_recursive, - "initialize submodules in the clone"), - OPT_STRING(0, "template", &option_template, "template-directory", - "directory from which templates will be used"), - OPT_CALLBACK(0 , "reference", &option_reference, "repo", - "reference repository", &opt_parse_reference), - OPT_STRING('o', "origin", &option_origin, "name", - "use <name> instead of 'origin' to track upstream"), - OPT_STRING('b', "branch", &option_branch, "branch", - "checkout <branch> instead of the remote's HEAD"), - OPT_STRING('u', "upload-pack", &option_upload_pack, "path", - "path to git-upload-pack on the remote"), - OPT_STRING(0, "depth", &option_depth, "depth", - "create a shallow clone of that depth"), + N_("initialize submodules in the clone")), + OPT_STRING(0, "template", &option_template, N_("template-directory"), + N_("directory from which templates will be used")), + OPT_CALLBACK(0 , "reference", &option_reference, N_("repo"), + N_("reference repository"), &opt_parse_reference), + OPT_STRING('o', "origin", &option_origin, N_("name"), + N_("use <name> instead of 'origin' to track upstream")), + OPT_STRING('b', "branch", &option_branch, N_("branch"), + N_("checkout <branch> instead of the remote's HEAD")), + OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"), + N_("path to git-upload-pack on the remote")), + OPT_STRING(0, "depth", &option_depth, N_("depth"), + N_("create a shallow clone of that depth")), OPT_BOOL(0, "single-branch", &option_single_branch, - "clone only one branch, HEAD or --branch"), - OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir", - "separate git dir from working tree"), - OPT_STRING_LIST('c', "config", &option_config, "key=value", - "set config inside the new repository"), + N_("clone only one branch, HEAD or --branch")), + OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"), + N_("separate git dir from working tree")), + OPT_STRING_LIST('c', "config", &option_config, N_("key=value"), + N_("set config inside the new repository")), OPT_END() }; @@ -236,7 +236,7 @@ static int add_one_reference(struct string_list_item *item, void *cb_data) /* Beware: real_path() and mkpath() return static buffer */ ref_git = xstrdup(real_path(item->string)); if (is_directory(mkpath("%s/.git/objects", ref_git))) { - char *ref_git_git = xstrdup(mkpath("%s/.git", ref_git)); + char *ref_git_git = mkpathdup("%s/.git", ref_git); free(ref_git); ref_git = ref_git_git; } else if (!is_directory(mkpath("%s/objects", ref_git))) @@ -610,6 +610,54 @@ static void write_config(struct string_list *config) } } +static void write_refspec_config(const char* src_ref_prefix, + const struct ref* our_head_points_at, + const struct ref* remote_head_points_at, struct strbuf* branch_top) +{ + struct strbuf key = STRBUF_INIT; + struct strbuf value = STRBUF_INIT; + + if (option_mirror || !option_bare) { + if (option_single_branch && !option_mirror) { + if (option_branch) { + if (strstr(our_head_points_at->name, "refs/tags/")) + strbuf_addf(&value, "+%s:%s", our_head_points_at->name, + our_head_points_at->name); + else + strbuf_addf(&value, "+%s:%s%s", our_head_points_at->name, + branch_top->buf, option_branch); + } else if (remote_head_points_at) { + strbuf_addf(&value, "+%s:%s%s", remote_head_points_at->name, + branch_top->buf, + skip_prefix(remote_head_points_at->name, "refs/heads/")); + } + /* + * otherwise, the next "git fetch" will + * simply fetch from HEAD without updating + * any remote tracking branch, which is what + * we want. + */ + } else { + strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top->buf); + } + /* Configure the remote */ + if (value.len) { + strbuf_addf(&key, "remote.%s.fetch", option_origin); + git_config_set_multivar(key.buf, value.buf, "^$", 0); + strbuf_reset(&key); + + if (option_mirror) { + strbuf_addf(&key, "remote.%s.mirror", option_origin); + git_config_set(key.buf, "true"); + strbuf_reset(&key); + } + } + } + + strbuf_release(&key); + strbuf_release(&value); +} + int cmd_clone(int argc, const char **argv, const char *prefix) { int is_bundle = 0, is_local; @@ -700,7 +748,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) git_dir = xstrdup(dir); else { work_tree = dir; - git_dir = xstrdup(mkpath("%s/.git", dir)); + git_dir = mkpathdup("%s/.git", dir); } if (!option_bare) { @@ -755,20 +803,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf); - - if (option_mirror || !option_bare) { - /* Configure the remote */ - strbuf_addf(&key, "remote.%s.fetch", option_origin); - git_config_set_multivar(key.buf, value.buf, "^$", 0); - strbuf_reset(&key); - - if (option_mirror) { - strbuf_addf(&key, "remote.%s.mirror", option_origin); - git_config_set(key.buf, "true"); - strbuf_reset(&key); - } - } - strbuf_addf(&key, "remote.%s.url", option_origin); git_config_set(key.buf, repo); strbuf_reset(&key); @@ -853,6 +887,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) "refs/heads/master"); } + write_refspec_config(src_ref_prefix, our_head_points_at, + remote_head_points_at, &branch_top); + if (is_local) clone_local(path, git_dir); else if (refs && complete_refs_before_fetch) diff --git a/builtin/column.c b/builtin/column.c index 5ea798a7ca..e125a55fc9 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -6,7 +6,7 @@ #include "column.h" static const char * const builtin_column_usage[] = { - "git column [options]", + N_("git column [options]"), NULL }; static unsigned int colopts; @@ -23,13 +23,13 @@ int cmd_column(int argc, const char **argv, const char *prefix) struct column_options copts; const char *command = NULL, *real_command = NULL; struct option options[] = { - OPT_STRING(0, "command", &real_command, "name", "lookup config vars"), - OPT_COLUMN(0, "mode", &colopts, "layout to use"), - OPT_INTEGER(0, "raw-mode", &colopts, "layout to use"), - OPT_INTEGER(0, "width", &copts.width, "Maximum width"), - OPT_STRING(0, "indent", &copts.indent, "string", "Padding space on left border"), - OPT_INTEGER(0, "nl", &copts.nl, "Padding space on right border"), - OPT_INTEGER(0, "padding", &copts.padding, "Padding space between columns"), + OPT_STRING(0, "command", &real_command, N_("name"), N_("lookup config vars")), + OPT_COLUMN(0, "mode", &colopts, N_("layout to use")), + OPT_INTEGER(0, "raw-mode", &colopts, N_("layout to use")), + OPT_INTEGER(0, "width", &copts.width, N_("Maximum width")), + OPT_STRING(0, "indent", &copts.indent, N_("string"), N_("Padding space on left border")), + OPT_INTEGER(0, "nl", &copts.nl, N_("Padding space on right border")), + OPT_INTEGER(0, "padding", &copts.padding, N_("Padding space between columns")), OPT_END() }; diff --git a/builtin/commit.c b/builtin/commit.c index 20cef95d60..a17a5df449 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -28,14 +28,15 @@ #include "submodule.h" #include "gpg-interface.h" #include "column.h" +#include "sequencer.h" static const char * const builtin_commit_usage[] = { - "git commit [options] [--] <filepattern>...", + N_("git commit [options] [--] <filepattern>..."), NULL }; static const char * const builtin_status_usage[] = { - "git status [options] [--] <filepattern>...", + N_("git status [options] [--] <filepattern>..."), NULL }; @@ -466,8 +467,6 @@ static int is_a_merge(const struct commit *current_head) return !!(current_head->parents && current_head->parents->next); } -static const char sign_off_header[] = "Signed-off-by: "; - static void export_one(const char *var, const char *s, const char *e, int hack) { struct strbuf buf = STRBUF_INIT; @@ -478,6 +477,20 @@ static void export_one(const char *var, const char *s, const char *e, int hack) strbuf_release(&buf); } +static int sane_ident_split(struct ident_split *person) +{ + if (!person->name_begin || !person->name_end || + person->name_begin == person->name_end) + return 0; /* no human readable name */ + if (!person->mail_begin || !person->mail_end || + person->mail_begin == person->mail_end) + return 0; /* no usable mail */ + if (!person->date_begin || !person->date_end || + !person->tz_begin || !person->tz_end) + return 0; + return 1; +} + static void determine_author_info(struct strbuf *author_ident) { char *name, *email, *date; @@ -530,54 +543,14 @@ static void determine_author_info(struct strbuf *author_ident) if (force_date) date = force_date; strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT)); - if (!split_ident_line(&author, author_ident->buf, author_ident->len)) { + if (!split_ident_line(&author, author_ident->buf, author_ident->len) && + sane_ident_split(&author)) { export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@'); } } -static int ends_rfc2822_footer(struct strbuf *sb) -{ - int ch; - int hit = 0; - int i, j, k; - int len = sb->len; - int first = 1; - const char *buf = sb->buf; - - for (i = len - 1; i > 0; i--) { - if (hit && buf[i] == '\n') - break; - hit = (buf[i] == '\n'); - } - - while (i < len - 1 && buf[i] == '\n') - i++; - - for (; i < len; i = k) { - for (k = i; k < len && buf[k] != '\n'; k++) - ; /* do nothing */ - k++; - - if ((buf[k] == ' ' || buf[k] == '\t') && !first) - continue; - - first = 0; - - for (j = 0; i + j < len; j++) { - ch = buf[i + j]; - if (ch == ':') - break; - if (isalnum(ch) || - (ch == '-')) - continue; - return 0; - } - } - return 1; -} - static char *cut_ident_timestamp_part(char *string) { char *ket = strrchr(string, '>'); @@ -702,21 +675,30 @@ static int prepare_to_commit(const char *index_file, const char *prefix, stripspace(&sb, 0); if (signoff) { - struct strbuf sob = STRBUF_INIT; - int i; - - strbuf_addstr(&sob, sign_off_header); - strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"), - getenv("GIT_COMMITTER_EMAIL"))); - strbuf_addch(&sob, '\n'); - for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--) - ; /* do nothing */ - if (prefixcmp(sb.buf + i, sob.buf)) { - if (!i || !ends_rfc2822_footer(&sb)) - strbuf_addch(&sb, '\n'); - strbuf_addbuf(&sb, &sob); + /* + * See if we have a Conflicts: block at the end. If yes, count + * its size, so we can ignore it. + */ + int ignore_footer = 0; + int i, eol, previous = 0; + const char *nl; + + for (i = 0; i < sb.len; i++) { + nl = memchr(sb.buf + i, '\n', sb.len - i); + if (nl) + eol = nl - sb.buf; + else + eol = sb.len; + if (!prefixcmp(sb.buf + previous, "\nConflicts:\n")) { + ignore_footer = sb.len - previous; + break; + } + while (i < eol) + i++; + previous = eol; } - strbuf_release(&sob); + + append_signoff(&sb, ignore_footer); } if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len) @@ -1169,26 +1151,26 @@ int cmd_status(int argc, const char **argv, const char *prefix) int fd; unsigned char sha1[20]; static struct option builtin_status_options[] = { - OPT__VERBOSE(&verbose, "be verbose"), + OPT__VERBOSE(&verbose, N_("be verbose")), OPT_SET_INT('s', "short", &status_format, - "show status concisely", STATUS_FORMAT_SHORT), + N_("show status concisely"), STATUS_FORMAT_SHORT), OPT_BOOLEAN('b', "branch", &s.show_branch, - "show branch information"), + N_("show branch information")), OPT_SET_INT(0, "porcelain", &status_format, - "machine-readable output", + N_("machine-readable output"), STATUS_FORMAT_PORCELAIN), OPT_BOOLEAN('z', "null", &s.null_termination, - "terminate entries with NUL"), + N_("terminate entries with NUL")), { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, - "mode", - "show untracked files, optional modes: all, normal, no. (Default: all)", + N_("mode"), + N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, OPT_BOOLEAN(0, "ignored", &show_ignored_in_status, - "show ignored files"), - { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when", - "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)", + N_("show ignored files")), + { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"), + N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, - OPT_COLUMN(0, "column", &s.colopts, "list untracked files in columns"), + OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")), OPT_END(), }; @@ -1369,53 +1351,53 @@ int cmd_commit(int argc, const char **argv, const char *prefix) { static struct wt_status s; static struct option builtin_commit_options[] = { - OPT__QUIET(&quiet, "suppress summary after successful commit"), - OPT__VERBOSE(&verbose, "show diff in commit message template"), - - OPT_GROUP("Commit message options"), - OPT_FILENAME('F', "file", &logfile, "read message from file"), - OPT_STRING(0, "author", &force_author, "author", "override author for commit"), - OPT_STRING(0, "date", &force_date, "date", "override date for commit"), - OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m), - OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"), - OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"), - OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"), - OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"), - OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"), - OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"), - OPT_FILENAME('t', "template", &template_file, "use specified template file"), - OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"), - OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"), - OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"), - { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id", - "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, + OPT__QUIET(&quiet, N_("suppress summary after successful commit")), + OPT__VERBOSE(&verbose, N_("show diff in commit message template")), + + OPT_GROUP(N_("Commit message options")), + OPT_FILENAME('F', "file", &logfile, N_("read message from file")), + OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")), + OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")), + OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m), + OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")), + OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")), + OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")), + OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")), + OPT_BOOLEAN(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")), + OPT_BOOLEAN('s', "signoff", &signoff, N_("add Signed-off-by:")), + OPT_FILENAME('t', "template", &template_file, N_("use specified template file")), + OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")), + OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")), + OPT_BOOLEAN(0, "status", &include_status, N_("include status in commit message template")), + { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"), + N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, /* end commit message options */ - OPT_GROUP("Commit contents options"), - OPT_BOOLEAN('a', "all", &all, "commit all changed files"), - OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"), - OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"), - OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"), - OPT_BOOLEAN('o', "only", &only, "commit only specified files"), - OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"), - OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"), - OPT_SET_INT(0, "short", &status_format, "show status concisely", + OPT_GROUP(N_("Commit contents options")), + OPT_BOOLEAN('a', "all", &all, N_("commit all changed files")), + OPT_BOOLEAN('i', "include", &also, N_("add specified files to index for commit")), + OPT_BOOLEAN(0, "interactive", &interactive, N_("interactively add files")), + OPT_BOOLEAN('p', "patch", &patch_interactive, N_("interactively add changes")), + OPT_BOOLEAN('o', "only", &only, N_("commit only specified files")), + OPT_BOOLEAN('n', "no-verify", &no_verify, N_("bypass pre-commit hook")), + OPT_BOOLEAN(0, "dry-run", &dry_run, N_("show what would be committed")), + OPT_SET_INT(0, "short", &status_format, N_("show status concisely"), STATUS_FORMAT_SHORT), - OPT_BOOLEAN(0, "branch", &s.show_branch, "show branch information"), + OPT_BOOLEAN(0, "branch", &s.show_branch, N_("show branch information")), OPT_SET_INT(0, "porcelain", &status_format, - "machine-readable output", STATUS_FORMAT_PORCELAIN), + N_("machine-readable output"), STATUS_FORMAT_PORCELAIN), OPT_BOOLEAN('z', "null", &s.null_termination, - "terminate entries with NUL"), - OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"), - OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"), - { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + N_("terminate entries with NUL")), + OPT_BOOLEAN(0, "amend", &amend, N_("amend previous commit")), + OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")), + { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, /* end commit contents options */ { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL, - "ok to record an empty change", + N_("ok to record an empty change"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL, - "ok to record a change with an empty message", + N_("ok to record a change with an empty message"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, OPT_END() @@ -1437,6 +1419,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) usage_with_options(builtin_commit_usage, builtin_commit_options); wt_status_prepare(&s); + gitmodules_config(); git_config(git_commit_config, &s); determine_whence(&s); s.colopts = 0; diff --git a/builtin/config.c b/builtin/config.c index 8cd08da991..e1c33e0691 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -4,7 +4,7 @@ #include "parse-options.h" static const char *const builtin_config_usage[] = { - "git config [options]", + N_("git config [options]"), NULL }; @@ -49,33 +49,33 @@ static int respect_includes = -1; #define TYPE_PATH (1<<3) static struct option builtin_config_options[] = { - OPT_GROUP("Config file location"), - OPT_BOOLEAN(0, "global", &use_global_config, "use global config file"), - OPT_BOOLEAN(0, "system", &use_system_config, "use system config file"), - OPT_BOOLEAN(0, "local", &use_local_config, "use repository config file"), - OPT_STRING('f', "file", &given_config_file, "file", "use given config file"), - OPT_GROUP("Action"), - OPT_BIT(0, "get", &actions, "get value: name [value-regex]", ACTION_GET), - OPT_BIT(0, "get-all", &actions, "get all values: key [value-regex]", ACTION_GET_ALL), - OPT_BIT(0, "get-regexp", &actions, "get values for regexp: name-regex [value-regex]", ACTION_GET_REGEXP), - OPT_BIT(0, "replace-all", &actions, "replace all matching variables: name value [value_regex]", ACTION_REPLACE_ALL), - OPT_BIT(0, "add", &actions, "adds a new variable: name value", ACTION_ADD), - OPT_BIT(0, "unset", &actions, "removes a variable: name [value-regex]", ACTION_UNSET), - OPT_BIT(0, "unset-all", &actions, "removes all matches: name [value-regex]", ACTION_UNSET_ALL), - OPT_BIT(0, "rename-section", &actions, "rename section: old-name new-name", ACTION_RENAME_SECTION), - OPT_BIT(0, "remove-section", &actions, "remove a section: name", ACTION_REMOVE_SECTION), - OPT_BIT('l', "list", &actions, "list all", ACTION_LIST), - OPT_BIT('e', "edit", &actions, "opens an editor", ACTION_EDIT), - OPT_STRING(0, "get-color", &get_color_slot, "slot", "find the color configured: [default]"), - OPT_STRING(0, "get-colorbool", &get_colorbool_slot, "slot", "find the color setting: [stdout-is-tty]"), - OPT_GROUP("Type"), - OPT_BIT(0, "bool", &types, "value is \"true\" or \"false\"", TYPE_BOOL), - OPT_BIT(0, "int", &types, "value is decimal number", TYPE_INT), - OPT_BIT(0, "bool-or-int", &types, "value is --bool or --int", TYPE_BOOL_OR_INT), - OPT_BIT(0, "path", &types, "value is a path (file or directory name)", TYPE_PATH), - OPT_GROUP("Other"), - OPT_BOOLEAN('z', "null", &end_null, "terminate values with NUL byte"), - OPT_BOOL(0, "includes", &respect_includes, "respect include directives on lookup"), + OPT_GROUP(N_("Config file location")), + OPT_BOOLEAN(0, "global", &use_global_config, N_("use global config file")), + OPT_BOOLEAN(0, "system", &use_system_config, N_("use system config file")), + OPT_BOOLEAN(0, "local", &use_local_config, N_("use repository config file")), + OPT_STRING('f', "file", &given_config_file, N_("file"), N_("use given config file")), + OPT_GROUP(N_("Action")), + OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), ACTION_GET), + OPT_BIT(0, "get-all", &actions, N_("get all values: key [value-regex]"), ACTION_GET_ALL), + OPT_BIT(0, "get-regexp", &actions, N_("get values for regexp: name-regex [value-regex]"), ACTION_GET_REGEXP), + OPT_BIT(0, "replace-all", &actions, N_("replace all matching variables: name value [value_regex]"), ACTION_REPLACE_ALL), + OPT_BIT(0, "add", &actions, N_("add a new variable: name value"), ACTION_ADD), + OPT_BIT(0, "unset", &actions, N_("remove a variable: name [value-regex]"), ACTION_UNSET), + OPT_BIT(0, "unset-all", &actions, N_("remove all matches: name [value-regex]"), ACTION_UNSET_ALL), + OPT_BIT(0, "rename-section", &actions, N_("rename section: old-name new-name"), ACTION_RENAME_SECTION), + OPT_BIT(0, "remove-section", &actions, N_("remove a section: name"), ACTION_REMOVE_SECTION), + OPT_BIT('l', "list", &actions, N_("list all"), ACTION_LIST), + OPT_BIT('e', "edit", &actions, N_("open an editor"), ACTION_EDIT), + OPT_STRING(0, "get-color", &get_color_slot, N_("slot"), N_("find the color configured: [default]")), + OPT_STRING(0, "get-colorbool", &get_colorbool_slot, N_("slot"), N_("find the color setting: [stdout-is-tty]")), + OPT_GROUP(N_("Type")), + OPT_BIT(0, "bool", &types, N_("value is \"true\" or \"false\""), TYPE_BOOL), + OPT_BIT(0, "int", &types, N_("value is decimal number"), TYPE_INT), + OPT_BIT(0, "bool-or-int", &types, N_("value is --bool or --int"), TYPE_BOOL_OR_INT), + OPT_BIT(0, "path", &types, N_("value is a path (file or directory name)"), TYPE_PATH), + OPT_GROUP(N_("Other")), + OPT_BOOLEAN('z', "null", &end_null, N_("terminate values with NUL byte")), + OPT_BOOL(0, "includes", &respect_includes, N_("respect include directives on lookup")), OPT_END(), }; @@ -160,7 +160,7 @@ static int show_config(const char *key_, const char *value_, void *cb) static int get_value(const char *key_, const char *regex_) { - int ret = -1; + int ret = CONFIG_GENERIC_ERROR; char *global = NULL, *xdg = NULL, *repo_config = NULL; const char *system_wide = NULL, *local; struct config_include_data inc = CONFIG_INCLUDE_INIT; @@ -196,11 +196,14 @@ static int get_value(const char *key_, const char *regex_) if (regcomp(key_regexp, key, REG_EXTENDED)) { fprintf(stderr, "Invalid key pattern: %s\n", key_); free(key); + ret = CONFIG_INVALID_PATTERN; goto free_strings; } } else { - if (git_config_parse_key(key_, &key, NULL)) + if (git_config_parse_key(key_, &key, NULL)) { + ret = CONFIG_INVALID_KEY; goto free_strings; + } } if (regex_) { @@ -212,6 +215,7 @@ static int get_value(const char *key_, const char *regex_) regexp = (regex_t*)xmalloc(sizeof(regex_t)); if (regcomp(regexp, regex_, REG_EXTENDED)) { fprintf(stderr, "Invalid pattern: %s\n", regex_); + ret = CONFIG_INVALID_PATTERN; goto free_strings; } } @@ -396,8 +400,8 @@ int cmd_config(int argc, const char **argv, const char *prefix) */ die("$HOME not set"); - if (access(user_config, R_OK) && - xdg_config && !access(xdg_config, R_OK)) + if (access_or_warn(user_config, R_OK) && + xdg_config && !access_or_warn(xdg_config, R_OK)) given_config_file = xdg_config; else given_config_file = user_config; diff --git a/builtin/count-objects.c b/builtin/count-objects.c index c37cb98c31..9afaa88f77 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -66,7 +66,7 @@ static void count_objects(DIR *d, char *path, int len, int verbose, } static char const * const count_objects_usage[] = { - "git count-objects [-v]", + N_("git count-objects [-v]"), NULL }; @@ -79,7 +79,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix) unsigned long loose = 0, packed = 0, packed_loose = 0, garbage = 0; off_t loose_size = 0; struct option opts[] = { - OPT__VERBOSE(&verbose, "be verbose"), + OPT__VERBOSE(&verbose, N_("be verbose")), OPT_END(), }; diff --git a/builtin/describe.c b/builtin/describe.c index 9f63067f50..9fe11ed9de 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -12,8 +12,8 @@ #define MAX_TAGS (FLAG_BITS - 1) static const char * const describe_usage[] = { - "git describe [options] <committish>*", - "git describe [options] --dirty", + N_("git describe [options] <committish>*"), + N_("git describe [options] --dirty"), NULL }; @@ -400,22 +400,22 @@ int cmd_describe(int argc, const char **argv, const char *prefix) { int contains = 0; struct option options[] = { - OPT_BOOLEAN(0, "contains", &contains, "find the tag that comes after the commit"), - OPT_BOOLEAN(0, "debug", &debug, "debug search strategy on stderr"), - OPT_BOOLEAN(0, "all", &all, "use any ref in .git/refs"), - OPT_BOOLEAN(0, "tags", &tags, "use any tag in .git/refs/tags"), - OPT_BOOLEAN(0, "long", &longformat, "always use long format"), + OPT_BOOLEAN(0, "contains", &contains, N_("find the tag that comes after the commit")), + OPT_BOOLEAN(0, "debug", &debug, N_("debug search strategy on stderr")), + OPT_BOOLEAN(0, "all", &all, N_("use any ref in .git/refs")), + OPT_BOOLEAN(0, "tags", &tags, N_("use any tag in .git/refs/tags")), + OPT_BOOLEAN(0, "long", &longformat, N_("always use long format")), OPT__ABBREV(&abbrev), OPT_SET_INT(0, "exact-match", &max_candidates, - "only output exact matches", 0), + N_("only output exact matches"), 0), OPT_INTEGER(0, "candidates", &max_candidates, - "consider <n> most recent tags (default: 10)"), - OPT_STRING(0, "match", &pattern, "pattern", - "only consider tags matching <pattern>"), + N_("consider <n> most recent tags (default: 10)")), + OPT_STRING(0, "match", &pattern, N_("pattern"), + N_("only consider tags matching <pattern>")), OPT_BOOLEAN(0, "always", &always, - "show abbreviated commit object as fallback"), - {OPTION_STRING, 0, "dirty", &dirty, "mark", - "append <mark> on dirty working tree (default: \"-dirty\")", + N_("show abbreviated commit object as fallback")), + {OPTION_STRING, 0, "dirty", &dirty, N_("mark"), + N_("append <mark> on dirty working tree (default: \"-dirty\")"), PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"}, OPT_END(), }; diff --git a/builtin/diff.c b/builtin/diff.c index da8f6aac2b..9650be2c50 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -29,6 +29,8 @@ static void stuff_change(struct diff_options *opt, unsigned old_mode, unsigned new_mode, const unsigned char *old_sha1, const unsigned char *new_sha1, + int old_sha1_valid, + int new_sha1_valid, const char *old_name, const char *new_name) { @@ -54,8 +56,8 @@ static void stuff_change(struct diff_options *opt, one = alloc_filespec(old_name); two = alloc_filespec(new_name); - fill_filespec(one, old_sha1, old_mode); - fill_filespec(two, new_sha1, new_mode); + fill_filespec(one, old_sha1, old_sha1_valid, old_mode); + fill_filespec(two, new_sha1, new_sha1_valid, new_mode); diff_queue(&diff_queued_diff, one, two); } @@ -84,6 +86,7 @@ static int builtin_diff_b_f(struct rev_info *revs, stuff_change(&revs->diffopt, blob[0].mode, canon_mode(st.st_mode), blob[0].sha1, null_sha1, + 1, 0, path, path); diffcore_std(&revs->diffopt); diff_flush(&revs->diffopt); @@ -108,6 +111,7 @@ static int builtin_diff_blobs(struct rev_info *revs, stuff_change(&revs->diffopt, blob[0].mode, blob[1].mode, blob[0].sha1, blob[1].sha1, + 1, 1, blob[0].name, blob[1].name); diffcore_std(&revs->diffopt); diff_flush(&revs->diffopt); @@ -298,8 +302,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) argc = setup_revisions(argc, argv, &rev, NULL); if (!rev.diffopt.output_format) { rev.diffopt.output_format = DIFF_FORMAT_PATCH; - if (diff_setup_done(&rev.diffopt) < 0) - die(_("diff_setup_done failed")); + diff_setup_done(&rev.diffopt); } DIFF_OPT_SET(&rev.diffopt, RECURSIVE); diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 9ab6db3fb0..12220ad8da 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -19,7 +19,7 @@ #include "quote.h" static const char *fast_export_usage[] = { - "git fast-export [rev-list-opts]", + N_("git fast-export [rev-list-opts]"), NULL }; @@ -632,24 +632,24 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) char *export_filename = NULL, *import_filename = NULL; struct option options[] = { OPT_INTEGER(0, "progress", &progress, - "show progress after <n> objects"), - OPT_CALLBACK(0, "signed-tags", &signed_tag_mode, "mode", - "select handling of signed tags", + N_("show progress after <n> objects")), + OPT_CALLBACK(0, "signed-tags", &signed_tag_mode, N_("mode"), + N_("select handling of signed tags"), parse_opt_signed_tag_mode), - OPT_CALLBACK(0, "tag-of-filtered-object", &tag_of_filtered_mode, "mode", - "select handling of tags that tag filtered objects", + OPT_CALLBACK(0, "tag-of-filtered-object", &tag_of_filtered_mode, N_("mode"), + N_("select handling of tags that tag filtered objects"), parse_opt_tag_of_filtered_mode), - OPT_STRING(0, "export-marks", &export_filename, "file", - "Dump marks to this file"), - OPT_STRING(0, "import-marks", &import_filename, "file", - "Import marks from this file"), + OPT_STRING(0, "export-marks", &export_filename, N_("file"), + N_("Dump marks to this file")), + OPT_STRING(0, "import-marks", &import_filename, N_("file"), + N_("Import marks from this file")), OPT_BOOLEAN(0, "fake-missing-tagger", &fake_missing_tagger, - "Fake a tagger when tags lack one"), + N_("Fake a tagger when tags lack one")), OPT_BOOLEAN(0, "full-tree", &full_tree, - "Output full tree for each commit"), + N_("Output full tree for each commit")), OPT_BOOLEAN(0, "use-done-feature", &use_done_feature, - "Use the done feature to terminate the stream"), - OPT_BOOL(0, "no-data", &no_data, "Skip output of blob data"), + N_("Use the done feature to terminate the stream")), + OPT_BOOL(0, "no-data", &no_data, N_("Skip output of blob data")), OPT_END() }; diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index 149db88726..e6443986b8 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -10,6 +10,7 @@ #include "remote.h" #include "run-command.h" #include "transport.h" +#include "version.h" static int transfer_unpack_limit = -1; static int fetch_unpack_limit = -1; @@ -18,6 +19,7 @@ static int prefer_ofs_delta = 1; static int no_done; static int fetch_fsck_objects = -1; static int transfer_fsck_objects = -1; +static int agent_supported; static struct fetch_pack_args args = { /* .uploadpack = */ "git-upload-pack", }; @@ -327,6 +329,8 @@ static int find_common(int fd[2], unsigned char *result_sha1, if (args.no_progress) strbuf_addstr(&c, " no-progress"); if (args.include_tag) strbuf_addstr(&c, " include-tag"); if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta"); + if (agent_supported) strbuf_addf(&c, " agent=%s", + git_user_agent_sanitized()); packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf); strbuf_release(&c); } else @@ -521,72 +525,59 @@ static void mark_recent_complete_commits(unsigned long cutoff) } } -static void filter_refs(struct ref **refs, int nr_match, char **match) +static int non_matching_ref(struct string_list_item *item, void *unused) +{ + if (item->util) { + item->util = NULL; + return 0; + } + else + return 1; +} + +static void filter_refs(struct ref **refs, struct string_list *sought) { - struct ref **return_refs; struct ref *newlist = NULL; struct ref **newtail = &newlist; struct ref *ref, *next; - struct ref *fastarray[32]; - int match_pos; - - if (nr_match && !args.fetch_all) { - if (ARRAY_SIZE(fastarray) < nr_match) - return_refs = xcalloc(nr_match, sizeof(struct ref *)); - else { - return_refs = fastarray; - memset(return_refs, 0, sizeof(struct ref *) * nr_match); - } - } - else - return_refs = NULL; + int sought_pos; - match_pos = 0; + sought_pos = 0; for (ref = *refs; ref; ref = next) { + int keep = 0; next = ref->next; if (!memcmp(ref->name, "refs/", 5) && check_refname_format(ref->name + 5, 0)) ; /* trash */ - else if (args.fetch_all && - (!args.depth || prefixcmp(ref->name, "refs/tags/") )) { - *newtail = ref; - ref->next = NULL; - newtail = &ref->next; - continue; - } else { - int cmp = -1; - while (match_pos < nr_match) { - cmp = strcmp(ref->name, match[match_pos]); - if (cmp < 0) /* definitely do not have it */ - break; - else if (cmp == 0) { /* definitely have it */ - match[match_pos][0] = '\0'; - return_refs[match_pos] = ref; + while (sought_pos < sought->nr) { + int cmp = strcmp(ref->name, sought->items[sought_pos].string); + if (cmp < 0) + break; /* definitely do not have it */ + else if (cmp == 0) { + keep = 1; /* definitely have it */ + sought->items[sought_pos++].util = "matched"; break; } - else /* might have it; keep looking */ - match_pos++; + else + sought_pos++; /* might have it; keep looking */ } - if (!cmp) - continue; /* we will link it later */ } - free(ref); - } - if (!args.fetch_all) { - int i; - for (i = 0; i < nr_match; i++) { - ref = return_refs[i]; - if (ref) { - *newtail = ref; - ref->next = NULL; - newtail = &ref->next; - } + if (! keep && args.fetch_all && + (!args.depth || prefixcmp(ref->name, "refs/tags/"))) + keep = 1; + + if (keep) { + *newtail = ref; + ref->next = NULL; + newtail = &ref->next; + } else { + free(ref); } - if (return_refs != fastarray) - free(return_refs); } + + filter_string_list(sought, 0, non_matching_ref, NULL); *refs = newlist; } @@ -595,7 +586,7 @@ static void mark_alternate_complete(const struct ref *ref, void *unused) mark_complete(NULL, ref->old_sha1, 0, NULL); } -static int everything_local(struct ref **refs, int nr_match, char **match) +static int everything_local(struct ref **refs, struct string_list *sought) { struct ref *ref; int retval; @@ -646,7 +637,7 @@ static int everything_local(struct ref **refs, int nr_match, char **match) } } - filter_refs(refs, nr_match, match); + filter_refs(refs, sought); for (retval = 1, ref = *refs; ref ; ref = ref->next) { const unsigned char *remote = ref->old_sha1; @@ -777,12 +768,13 @@ static int get_pack(int xd[2], char **pack_lockfile) static struct ref *do_fetch_pack(int fd[2], const struct ref *orig_ref, - int nr_match, - char **match, + struct string_list *sought, char **pack_lockfile) { struct ref *ref = copy_ref_list(orig_ref); unsigned char sha1[20]; + const char *agent_feature; + int agent_len; sort_ref_list(&ref, ref_compare_name); @@ -814,12 +806,26 @@ static struct ref *do_fetch_pack(int fd[2], fprintf(stderr, "Server supports side-band\n"); use_sideband = 1; } + if (!server_supports("thin-pack")) + args.use_thin_pack = 0; + if (!server_supports("no-progress")) + args.no_progress = 0; + if (!server_supports("include-tag")) + args.include_tag = 0; if (server_supports("ofs-delta")) { if (args.verbose) fprintf(stderr, "Server supports ofs-delta\n"); } else prefer_ofs_delta = 0; - if (everything_local(&ref, nr_match, match)) { + + if ((agent_feature = server_feature_value("agent", &agent_len))) { + agent_supported = 1; + if (args.verbose && agent_len) + fprintf(stderr, "Server version is %.*s\n", + agent_len, agent_feature); + } + + if (everything_local(&ref, sought)) { packet_flush(fd[1]); goto all_done; } @@ -839,19 +845,6 @@ static struct ref *do_fetch_pack(int fd[2], return ref; } -static int remove_duplicates(int nr_heads, char **heads) -{ - int src, dst; - - if (!nr_heads) - return 0; - - for (src = dst = 1; src < nr_heads; src++) - if (strcmp(heads[src], heads[dst-1])) - heads[dst++] = heads[src]; - return dst; -} - static int fetch_pack_config(const char *var, const char *value, void *cb) { if (strcmp(var, "fetch.unpacklimit") == 0) { @@ -902,8 +895,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) int i, ret; struct ref *ref = NULL; const char *dest = NULL; - int alloc_heads = 0, nr_heads = 0; - char **heads = NULL; + struct string_list sought = STRING_LIST_INIT_DUP; int fd[2]; char *pack_lockfile = NULL; char **pack_lockfile_ptr = NULL; @@ -980,9 +972,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) * Copy refs from cmdline to growable list, then append any * refs from the standard input: */ - ALLOC_GROW(heads, argc - i, alloc_heads); for (; i < argc; i++) - heads[nr_heads++] = xstrdup(argv[i]); + string_list_append(&sought, xstrdup(argv[i])); if (args.stdin_refs) { if (args.stateless_rpc) { /* in stateless RPC mode we use pkt-line to read @@ -995,17 +986,14 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) break; if (line[n-1] == '\n') n--; - ALLOC_GROW(heads, nr_heads + 1, alloc_heads); - heads[nr_heads++] = xmemdupz(line, n); + string_list_append(&sought, xmemdupz(line, n)); } } else { /* read from stdin one ref per line, until EOF */ struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) { - ALLOC_GROW(heads, nr_heads + 1, alloc_heads); - heads[nr_heads++] = strbuf_detach(&line, NULL); - } + while (strbuf_getline(&line, stdin, '\n') != EOF) + string_list_append(&sought, strbuf_detach(&line, NULL)); strbuf_release(&line); } } @@ -1022,7 +1010,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) get_remote_heads(fd[0], &ref, 0, NULL); ref = fetch_pack(&args, fd, conn, ref, dest, - nr_heads, heads, pack_lockfile_ptr); + &sought, pack_lockfile_ptr); if (pack_lockfile) { printf("lock %s\n", pack_lockfile); fflush(stdout); @@ -1030,21 +1018,18 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) close(fd[0]); close(fd[1]); if (finish_connect(conn)) - ref = NULL; - ret = !ref; - - if (!ret && nr_heads) { - /* If the heads to pull were given, we should have - * consumed all of them by matching the remote. - * Otherwise, 'git fetch remote no-such-ref' would - * silently succeed without issuing an error. - */ - for (i = 0; i < nr_heads; i++) - if (heads[i] && heads[i][0]) { - error("no such remote ref %s", heads[i]); - ret = 1; - } - } + return 1; + + ret = !ref || sought.nr; + + /* + * If the heads to pull were given, we should have consumed + * all of them by matching the remote. Otherwise, 'git fetch + * remote no-such-ref' would silently succeed without issuing + * an error. + */ + for (i = 0; i < sought.nr; i++) + error("no such remote ref %s", sought.items[i].string); while (ref) { printf("%s %s\n", sha1_to_hex(ref->old_sha1), ref->name); @@ -1054,18 +1039,12 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) return ret; } -static int compare_heads(const void *a, const void *b) -{ - return strcmp(*(const char **)a, *(const char **)b); -} - struct ref *fetch_pack(struct fetch_pack_args *my_args, int fd[], struct child_process *conn, const struct ref *ref, - const char *dest, - int nr_heads, - char **heads, - char **pack_lockfile) + const char *dest, + struct string_list *sought, + char **pack_lockfile) { struct stat st; struct ref *ref_cpy; @@ -1078,16 +1057,16 @@ struct ref *fetch_pack(struct fetch_pack_args *my_args, st.st_mtime = 0; } - if (heads && nr_heads) { - qsort(heads, nr_heads, sizeof(*heads), compare_heads); - nr_heads = remove_duplicates(nr_heads, heads); + if (sought->nr) { + sort_string_list(sought); + string_list_remove_duplicates(sought, 0); } if (!ref) { packet_flush(fd[1]); die("no matching remote head"); } - ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile); + ref_cpy = do_fetch_pack(fd, ref, sought, pack_lockfile); if (args.depth > 0) { struct cache_time mtime; diff --git a/builtin/fetch.c b/builtin/fetch.c index bb9a0743ff..4b5a89839b 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -14,12 +14,13 @@ #include "transport.h" #include "submodule.h" #include "connected.h" +#include "argv-array.h" static const char * const builtin_fetch_usage[] = { - "git fetch [<options>] [<repository> [<refspec>...]]", - "git fetch [<options>] <group>", - "git fetch --multiple [<options>] [(<repository> | <group>)...]", - "git fetch --all [<options>]", + N_("git fetch [<options>] [<repository> [<refspec>...]]"), + N_("git fetch [<options>] <group>"), + N_("git fetch --multiple [<options>] [(<repository> | <group>)...]"), + N_("git fetch --all [<options>]"), NULL }; @@ -56,36 +57,36 @@ static int option_parse_recurse_submodules(const struct option *opt, static struct option builtin_fetch_options[] = { OPT__VERBOSITY(&verbosity), OPT_BOOLEAN(0, "all", &all, - "fetch from all remotes"), + N_("fetch from all remotes")), OPT_BOOLEAN('a', "append", &append, - "append to .git/FETCH_HEAD instead of overwriting"), - OPT_STRING(0, "upload-pack", &upload_pack, "path", - "path to upload pack on remote end"), - OPT__FORCE(&force, "force overwrite of local branch"), + N_("append to .git/FETCH_HEAD instead of overwriting")), + OPT_STRING(0, "upload-pack", &upload_pack, N_("path"), + N_("path to upload pack on remote end")), + OPT__FORCE(&force, N_("force overwrite of local branch")), OPT_BOOLEAN('m', "multiple", &multiple, - "fetch from multiple remotes"), + N_("fetch from multiple remotes")), OPT_SET_INT('t', "tags", &tags, - "fetch all tags and associated objects", TAGS_SET), + N_("fetch all tags and associated objects"), TAGS_SET), OPT_SET_INT('n', NULL, &tags, - "do not fetch all tags (--no-tags)", TAGS_UNSET), + N_("do not fetch all tags (--no-tags)"), TAGS_UNSET), OPT_BOOLEAN('p', "prune", &prune, - "prune remote-tracking branches no longer on remote"), - { OPTION_CALLBACK, 0, "recurse-submodules", NULL, "on-demand", - "control recursive fetching of submodules", + N_("prune remote-tracking branches no longer on remote")), + { OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"), + N_("control recursive fetching of submodules"), PARSE_OPT_OPTARG, option_parse_recurse_submodules }, OPT_BOOLEAN(0, "dry-run", &dry_run, - "dry run"), - OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"), + N_("dry run")), + OPT_BOOLEAN('k', "keep", &keep, N_("keep downloaded pack")), OPT_BOOLEAN('u', "update-head-ok", &update_head_ok, - "allow updating of HEAD ref"), - OPT_BOOL(0, "progress", &progress, "force progress reporting"), - OPT_STRING(0, "depth", &depth, "depth", - "deepen history of shallow clone"), - { OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, "dir", - "prepend this to submodule path output", PARSE_OPT_HIDDEN }, + N_("allow updating of HEAD ref")), + OPT_BOOL(0, "progress", &progress, N_("force progress reporting")), + OPT_STRING(0, "depth", &depth, N_("depth"), + N_("deepen history of shallow clone")), + { OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, N_("dir"), + N_("prepend this to submodule path output"), PARSE_OPT_HIDDEN }, { OPTION_STRING, 0, "recurse-submodules-default", &recurse_submodules_default, NULL, - "default mode for recursion", PARSE_OPT_HIDDEN }, + N_("default mode for recursion"), PARSE_OPT_HIDDEN }, OPT_END() }; @@ -255,9 +256,8 @@ static int update_local_ref(struct ref *ref, if (!hashcmp(ref->old_sha1, ref->new_sha1)) { if (verbosity > 0) strbuf_addf(display, "= %-*s %-*s -> %s", - TRANSPORT_SUMMARY_WIDTH, - _("[up to date]"), REFCOL_WIDTH, - remote, pretty_ref); + TRANSPORT_SUMMARY(_("[up to date]")), + REFCOL_WIDTH, remote, pretty_ref); return 0; } @@ -271,7 +271,7 @@ static int update_local_ref(struct ref *ref, */ strbuf_addf(display, _("! %-*s %-*s -> %s (can't fetch in current branch)"), - TRANSPORT_SUMMARY_WIDTH, _("[rejected]"), + TRANSPORT_SUMMARY(_("[rejected]")), REFCOL_WIDTH, remote, pretty_ref); return 1; } @@ -282,7 +282,7 @@ static int update_local_ref(struct ref *ref, r = s_update_ref("updating tag", ref, 0); strbuf_addf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '-', - TRANSPORT_SUMMARY_WIDTH, _("[tag update]"), + TRANSPORT_SUMMARY(_("[tag update]")), REFCOL_WIDTH, remote, pretty_ref, r ? _(" (unable to update local ref)") : ""); return r; @@ -317,13 +317,13 @@ static int update_local_ref(struct ref *ref, r = s_update_ref(msg, ref, 0); strbuf_addf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '*', - TRANSPORT_SUMMARY_WIDTH, what, + TRANSPORT_SUMMARY(what), REFCOL_WIDTH, remote, pretty_ref, r ? _(" (unable to update local ref)") : ""); return r; } - if (in_merge_bases(current, &updated, 1)) { + if (in_merge_bases(current, updated)) { char quickref[83]; int r; strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV)); @@ -357,7 +357,7 @@ static int update_local_ref(struct ref *ref, return r; } else { strbuf_addf(display, "! %-*s %-*s -> %s %s", - TRANSPORT_SUMMARY_WIDTH, _("[rejected]"), + TRANSPORT_SUMMARY(_("[rejected]")), REFCOL_WIDTH, remote, pretty_ref, _("(non-fast-forward)")); return 1; @@ -554,7 +554,7 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map) result |= delete_ref(ref->name, NULL, 0); if (verbosity >= 0) { fprintf(stderr, " x %-*s %-*s -> %s\n", - TRANSPORT_SUMMARY_WIDTH, _("[deleted]"), + TRANSPORT_SUMMARY(_("[deleted]")), REFCOL_WIDTH, _("(none)"), prettify_refname(ref->name)); warn_dangling_symref(stderr, dangling_msg, ref->name); } @@ -841,38 +841,39 @@ static int add_remote_or_group(const char *name, struct string_list *list) return 1; } -static void add_options_to_argv(int *argc, const char **argv) +static void add_options_to_argv(struct argv_array *argv) { if (dry_run) - argv[(*argc)++] = "--dry-run"; + argv_array_push(argv, "--dry-run"); if (prune) - argv[(*argc)++] = "--prune"; + argv_array_push(argv, "--prune"); if (update_head_ok) - argv[(*argc)++] = "--update-head-ok"; + argv_array_push(argv, "--update-head-ok"); if (force) - argv[(*argc)++] = "--force"; + argv_array_push(argv, "--force"); if (keep) - argv[(*argc)++] = "--keep"; + argv_array_push(argv, "--keep"); if (recurse_submodules == RECURSE_SUBMODULES_ON) - argv[(*argc)++] = "--recurse-submodules"; + argv_array_push(argv, "--recurse-submodules"); else if (recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) - argv[(*argc)++] = "--recurse-submodules=on-demand"; + argv_array_push(argv, "--recurse-submodules=on-demand"); + if (tags == TAGS_SET) + argv_array_push(argv, "--tags"); + else if (tags == TAGS_UNSET) + argv_array_push(argv, "--no-tags"); if (verbosity >= 2) - argv[(*argc)++] = "-v"; + argv_array_push(argv, "-v"); if (verbosity >= 1) - argv[(*argc)++] = "-v"; + argv_array_push(argv, "-v"); else if (verbosity < 0) - argv[(*argc)++] = "-q"; + argv_array_push(argv, "-q"); } static int fetch_multiple(struct string_list *list) { int i, result = 0; - const char *argv[12] = { "fetch", "--append" }; - int argc = 2; - - add_options_to_argv(&argc, argv); + struct argv_array argv = ARGV_ARRAY_INIT; if (!append && !dry_run) { int errcode = truncate_fetch_head(); @@ -880,18 +881,22 @@ static int fetch_multiple(struct string_list *list) return errcode; } + argv_array_pushl(&argv, "fetch", "--append", NULL); + add_options_to_argv(&argv); + for (i = 0; i < list->nr; i++) { const char *name = list->items[i].string; - argv[argc] = name; - argv[argc + 1] = NULL; + argv_array_push(&argv, name); if (verbosity >= 0) printf(_("Fetching %s\n"), name); - if (run_command_v_opt(argv, RUN_GIT_CMD)) { + if (run_command_v_opt(argv.argv, RUN_GIT_CMD)) { error(_("Could not fetch %s"), name); result = 1; } + argv_array_pop(&argv); } + argv_array_clear(&argv); return result; } @@ -1007,13 +1012,14 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) } if (!result && (recurse_submodules != RECURSE_SUBMODULES_OFF)) { - const char *options[10]; - int num_options = 0; - add_options_to_argv(&num_options, options); - result = fetch_populated_submodules(num_options, options, + struct argv_array options = ARGV_ARRAY_INIT; + + add_options_to_argv(&options); + result = fetch_populated_submodules(&options, submodule_prefix, recurse_submodules, verbosity < 0); + argv_array_clear(&options); } /* All names were strdup()ed or strndup()ed */ diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index 2c4d435da1..e2e27b2c40 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -10,7 +10,7 @@ #include "gpg-interface.h" static const char * const fmt_merge_msg_usage[] = { - "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]", + N_("git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"), NULL }; @@ -650,16 +650,16 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix) const char *message = NULL; int shortlog_len = -1; struct option options[] = { - { OPTION_INTEGER, 0, "log", &shortlog_len, "n", - "populate log with at most <n> entries from shortlog", + { OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"), + N_("populate log with at most <n> entries from shortlog"), PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN }, - { OPTION_INTEGER, 0, "summary", &shortlog_len, "n", - "alias for --log (deprecated)", + { OPTION_INTEGER, 0, "summary", &shortlog_len, N_("n"), + N_("alias for --log (deprecated)"), PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, NULL, DEFAULT_MERGE_LOG_LEN }, - OPT_STRING('m', "message", &message, "text", - "use <text> as start of message"), - OPT_FILENAME('F', "file", &inpath, "file to read from"), + OPT_STRING('m', "message", &message, N_("text"), + N_("use <text> as start of message")), + OPT_FILENAME('F', "file", &inpath, N_("file to read from")), OPT_END() }; diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index b01d76a243..7f059c31df 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -962,7 +962,9 @@ static int opt_parse_sort(const struct option *opt, const char *arg, int unset) if (!arg) /* should --no-sort void the list ? */ return -1; - *sort_tail = s = xcalloc(1, sizeof(*s)); + s = xcalloc(1, sizeof(*s)); + s->next = *sort_tail; + *sort_tail = s; if (*arg == '-') { s->reverse = 1; @@ -974,7 +976,7 @@ static int opt_parse_sort(const struct option *opt, const char *arg, int unset) } static char const * const for_each_ref_usage[] = { - "git for-each-ref [options] [<pattern>]", + N_("git for-each-ref [options] [<pattern>]"), NULL }; @@ -989,19 +991,19 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) struct option opts[] = { OPT_BIT('s', "shell", "e_style, - "quote placeholders suitably for shells", QUOTE_SHELL), + N_("quote placeholders suitably for shells"), QUOTE_SHELL), OPT_BIT('p', "perl", "e_style, - "quote placeholders suitably for perl", QUOTE_PERL), + N_("quote placeholders suitably for perl"), QUOTE_PERL), OPT_BIT(0 , "python", "e_style, - "quote placeholders suitably for python", QUOTE_PYTHON), + N_("quote placeholders suitably for python"), QUOTE_PYTHON), OPT_BIT(0 , "tcl", "e_style, - "quote placeholders suitably for tcl", QUOTE_TCL), + N_("quote placeholders suitably for tcl"), QUOTE_TCL), OPT_GROUP(""), - OPT_INTEGER( 0 , "count", &maxcount, "show only <n> matched refs"), - OPT_STRING( 0 , "format", &format, "format", "format to use for the output"), - OPT_CALLBACK(0 , "sort", sort_tail, "key", - "field name to sort on", &opt_parse_sort), + OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")), + OPT_STRING( 0 , "format", &format, N_("format"), N_("format to use for the output")), + OPT_CALLBACK(0 , "sort", sort_tail, N_("key"), + N_("field name to sort on"), &opt_parse_sort), OPT_END(), }; diff --git a/builtin/fsck.c b/builtin/fsck.c index a710227a64..bb9a2cd447 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -605,23 +605,23 @@ static int fsck_cache_tree(struct cache_tree *it) } static char const * const fsck_usage[] = { - "git fsck [options] [<object>...]", + N_("git fsck [options] [<object>...]"), NULL }; static struct option fsck_opts[] = { - OPT__VERBOSE(&verbose, "be verbose"), - OPT_BOOLEAN(0, "unreachable", &show_unreachable, "show unreachable objects"), - OPT_BOOL(0, "dangling", &show_dangling, "show dangling objects"), - OPT_BOOLEAN(0, "tags", &show_tags, "report tags"), - OPT_BOOLEAN(0, "root", &show_root, "report root nodes"), - OPT_BOOLEAN(0, "cache", &keep_cache_objects, "make index objects head nodes"), - OPT_BOOLEAN(0, "reflogs", &include_reflogs, "make reflogs head nodes (default)"), - OPT_BOOLEAN(0, "full", &check_full, "also consider packs and alternate objects"), - OPT_BOOLEAN(0, "strict", &check_strict, "enable more strict checking"), + OPT__VERBOSE(&verbose, N_("be verbose")), + OPT_BOOLEAN(0, "unreachable", &show_unreachable, N_("show unreachable objects")), + OPT_BOOL(0, "dangling", &show_dangling, N_("show dangling objects")), + OPT_BOOLEAN(0, "tags", &show_tags, N_("report tags")), + OPT_BOOLEAN(0, "root", &show_root, N_("report root nodes")), + OPT_BOOLEAN(0, "cache", &keep_cache_objects, N_("make index objects head nodes")), + OPT_BOOLEAN(0, "reflogs", &include_reflogs, N_("make reflogs head nodes (default)")), + OPT_BOOLEAN(0, "full", &check_full, N_("also consider packs and alternate objects")), + OPT_BOOLEAN(0, "strict", &check_strict, N_("enable more strict checking")), OPT_BOOLEAN(0, "lost-found", &write_lost_and_found, - "write dangling objects in .git/lost-found"), - OPT_BOOL(0, "progress", &show_progress, "show progress"), + N_("write dangling objects in .git/lost-found")), + OPT_BOOL(0, "progress", &show_progress, N_("show progress")), OPT_END(), }; diff --git a/builtin/gc.c b/builtin/gc.c index 9b4232c8f3..6be6c8d65b 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -19,7 +19,7 @@ #define FAILED_RUN "failed to run %s" static const char * const builtin_gc_usage[] = { - "git gc [options]", + N_("git gc [options]"), NULL }; @@ -174,12 +174,12 @@ int cmd_gc(int argc, const char **argv, const char *prefix) int quiet = 0; struct option builtin_gc_options[] = { - OPT__QUIET(&quiet, "suppress progress reporting"), - { OPTION_STRING, 0, "prune", &prune_expire, "date", - "prune unreferenced objects", + OPT__QUIET(&quiet, N_("suppress progress reporting")), + { OPTION_STRING, 0, "prune", &prune_expire, N_("date"), + N_("prune unreferenced objects"), PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire }, - OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"), - OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"), + OPT_BOOLEAN(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")), + OPT_BOOLEAN(0, "auto", &auto_gc, N_("enable auto-gc mode")), OPT_END() }; @@ -217,9 +217,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix) */ if (!need_to_gc()) return 0; - if (quiet) - fprintf(stderr, _("Auto packing the repository for optimum performance.\n")); - else + if (!quiet) fprintf(stderr, _("Auto packing the repository for optimum performance. You may also\n" "run \"git gc\" manually. See " diff --git a/builtin/grep.c b/builtin/grep.c index 29adb0ac93..82530a61b4 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -19,7 +19,7 @@ #include "dir.h" static char const * const grep_usage[] = { - "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]", + N_("git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"), NULL }; @@ -209,6 +209,7 @@ static void start_threads(struct grep_opt *opt) int err; struct grep_opt *o = grep_opt_dup(opt); o->output = strbuf_out; + o->debug = 0; compile_grep_patterns(o); err = pthread_create(&threads[i], NULL, run, o); @@ -260,6 +261,53 @@ static int wait_all(void) } #endif +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); +} + +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; @@ -270,12 +318,17 @@ static int grep_config(const char *var, const char *value, void *cb) if (!strcmp(var, "grep.extendedregexp")) { if (git_config_bool(var, value)) - opt->regflags |= REG_EXTENDED; + opt->extended_regexp_option = 1; else - opt->regflags &= ~REG_EXTENDED; + 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; @@ -669,95 +722,88 @@ int cmd_grep(int argc, const char **argv, const char *prefix) int i; int dummy; int use_index = 1; - enum { - pattern_type_unspecified = 0, - pattern_type_bre, - pattern_type_ere, - pattern_type_fixed, - pattern_type_pcre, - }; - int pattern_type = pattern_type_unspecified; + int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED; struct option options[] = { OPT_BOOLEAN(0, "cached", &cached, - "search in index instead of in the work tree"), + N_("search in index instead of in the work tree")), OPT_NEGBIT(0, "no-index", &use_index, - "finds in contents not managed by git", 1), + N_("find in contents not managed by git"), 1), OPT_BOOLEAN(0, "untracked", &untracked, - "search in both tracked and untracked files"), + N_("search in both tracked and untracked files")), OPT_SET_INT(0, "exclude-standard", &opt_exclude, - "search also in ignored files", 1), + N_("search also in ignored files"), 1), OPT_GROUP(""), OPT_BOOLEAN('v', "invert-match", &opt.invert, - "show non-matching lines"), + N_("show non-matching lines")), OPT_BOOLEAN('i', "ignore-case", &opt.ignore_case, - "case insensitive matching"), + N_("case insensitive matching")), OPT_BOOLEAN('w', "word-regexp", &opt.word_regexp, - "match patterns only at word boundaries"), + N_("match patterns only at word boundaries")), OPT_SET_INT('a', "text", &opt.binary, - "process binary files as text", GREP_BINARY_TEXT), + N_("process binary files as text"), GREP_BINARY_TEXT), OPT_SET_INT('I', NULL, &opt.binary, - "don't match patterns in binary files", + N_("don't match patterns in binary files"), GREP_BINARY_NOMATCH), - { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, "depth", - "descend at most <depth> levels", PARSE_OPT_NONEG, + { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, N_("depth"), + N_("descend at most <depth> levels"), PARSE_OPT_NONEG, NULL, 1 }, OPT_GROUP(""), - OPT_SET_INT('E', "extended-regexp", &pattern_type, - "use extended POSIX regular expressions", - pattern_type_ere), - OPT_SET_INT('G', "basic-regexp", &pattern_type, - "use basic POSIX regular expressions (default)", - pattern_type_bre), - OPT_SET_INT('F', "fixed-strings", &pattern_type, - "interpret patterns as fixed strings", - pattern_type_fixed), - OPT_SET_INT('P', "perl-regexp", &pattern_type, - "use Perl-compatible regular expressions", - pattern_type_pcre), + OPT_SET_INT('E', "extended-regexp", &pattern_type_arg, + N_("use extended POSIX regular expressions"), + GREP_PATTERN_TYPE_ERE), + OPT_SET_INT('G', "basic-regexp", &pattern_type_arg, + N_("use basic POSIX regular expressions (default)"), + GREP_PATTERN_TYPE_BRE), + OPT_SET_INT('F', "fixed-strings", &pattern_type_arg, + N_("interpret patterns as fixed strings"), + GREP_PATTERN_TYPE_FIXED), + OPT_SET_INT('P', "perl-regexp", &pattern_type_arg, + N_("use Perl-compatible regular expressions"), + GREP_PATTERN_TYPE_PCRE), OPT_GROUP(""), - OPT_BOOLEAN('n', "line-number", &opt.linenum, "show line numbers"), - OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1), - OPT_BIT('H', NULL, &opt.pathname, "show filenames", 1), + OPT_BOOLEAN('n', "line-number", &opt.linenum, N_("show line numbers")), + OPT_NEGBIT('h', NULL, &opt.pathname, N_("don't show filenames"), 1), + OPT_BIT('H', NULL, &opt.pathname, N_("show filenames"), 1), OPT_NEGBIT(0, "full-name", &opt.relative, - "show filenames relative to top directory", 1), + N_("show filenames relative to top directory"), 1), OPT_BOOLEAN('l', "files-with-matches", &opt.name_only, - "show only filenames instead of matching lines"), + N_("show only filenames instead of matching lines")), OPT_BOOLEAN(0, "name-only", &opt.name_only, - "synonym for --files-with-matches"), + N_("synonym for --files-with-matches")), OPT_BOOLEAN('L', "files-without-match", &opt.unmatch_name_only, - "show only the names of files without match"), + N_("show only the names of files without match")), OPT_BOOLEAN('z', "null", &opt.null_following_name, - "print NUL after filenames"), + N_("print NUL after filenames")), OPT_BOOLEAN('c', "count", &opt.count, - "show the number of matches instead of matching lines"), - OPT__COLOR(&opt.color, "highlight matches"), + N_("show the number of matches instead of matching lines")), + OPT__COLOR(&opt.color, N_("highlight matches")), OPT_BOOLEAN(0, "break", &opt.file_break, - "print empty line between matches from different files"), + N_("print empty line between matches from different files")), OPT_BOOLEAN(0, "heading", &opt.heading, - "show filename only once above matches from same file"), + N_("show filename only once above matches from same file")), OPT_GROUP(""), - OPT_CALLBACK('C', "context", &opt, "n", - "show <n> context lines before and after matches", + OPT_CALLBACK('C', "context", &opt, N_("n"), + N_("show <n> context lines before and after matches"), context_callback), OPT_INTEGER('B', "before-context", &opt.pre_context, - "show <n> context lines before matches"), + N_("show <n> context lines before matches")), OPT_INTEGER('A', "after-context", &opt.post_context, - "show <n> context lines after matches"), - OPT_NUMBER_CALLBACK(&opt, "shortcut for -C NUM", + N_("show <n> context lines after matches")), + OPT_NUMBER_CALLBACK(&opt, N_("shortcut for -C NUM"), context_callback), OPT_BOOLEAN('p', "show-function", &opt.funcname, - "show a line with the function name before matches"), + N_("show a line with the function name before matches")), OPT_BOOLEAN('W', "function-context", &opt.funcbody, - "show the surrounding function"), + N_("show the surrounding function")), OPT_GROUP(""), - OPT_CALLBACK('f', NULL, &opt, "file", - "read patterns from file", file_callback), - { OPTION_CALLBACK, 'e', NULL, &opt, "pattern", - "match <pattern>", PARSE_OPT_NONEG, pattern_callback }, + OPT_CALLBACK('f', NULL, &opt, N_("file"), + N_("read patterns from file"), file_callback), + { OPTION_CALLBACK, 'e', NULL, &opt, N_("pattern"), + N_("match <pattern>"), PARSE_OPT_NONEG, pattern_callback }, { OPTION_CALLBACK, 0, "and", &opt, NULL, - "combine patterns specified with -e", + N_("combine patterns specified with -e"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, and_callback }, OPT_BOOLEAN(0, "or", &dummy, ""), { OPTION_CALLBACK, 0, "not", &opt, NULL, "", @@ -769,16 +815,19 @@ int cmd_grep(int argc, const char **argv, const char *prefix) PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH, close_callback }, OPT__QUIET(&opt.status_only, - "indicate hit with exit status without output"), + N_("indicate hit with exit status without output")), OPT_BOOLEAN(0, "all-match", &opt.all_match, - "show only matches from files that match all patterns"), + N_("show only matches from files that match all patterns")), + { OPTION_SET_INT, 0, "debug", &opt.debug, NULL, + N_("show parse tree for grep expression"), + PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1 }, OPT_GROUP(""), { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager, - "pager", "show matching files in the pager", + N_("pager"), N_("show matching files in the pager"), PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager }, OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored, - "allow calling of grep(1) (ignored by this build)"), - { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage", + N_("allow calling of grep(1) (ignored by this build)")), + { OPTION_CALLBACK, 0, "help-all", &options, NULL, N_("show usage"), PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback }, OPT_END() }; @@ -799,6 +848,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) 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, ""); @@ -824,28 +875,13 @@ 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); - switch (pattern_type) { - case pattern_type_fixed: - opt.fixed = 1; - opt.pcre = 0; - break; - case pattern_type_bre: - opt.fixed = 0; - opt.pcre = 0; - opt.regflags &= ~REG_EXTENDED; - break; - case pattern_type_ere: - opt.fixed = 0; - opt.pcre = 0; - opt.regflags |= REG_EXTENDED; - break; - case pattern_type_pcre: - opt.fixed = 0; - opt.pcre = 1; - break; - default: - break; /* nothing */ - } + + 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); if (use_index && !startup_info->have_repository) /* die the same way as if we did it at the beginning */ diff --git a/builtin/hash-object.c b/builtin/hash-object.c index 33911fd5e9..8d184f1a99 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -57,8 +57,8 @@ static void hash_stdin_paths(const char *type, int write_objects) } static const char * const hash_object_usage[] = { - "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>...", - "git hash-object --stdin-paths < <list-of-paths>", + N_("git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>..."), + N_("git hash-object --stdin-paths < <list-of-paths>"), NULL }; @@ -69,12 +69,12 @@ static int stdin_paths; static const char *vpath; static const struct option hash_object_options[] = { - OPT_STRING('t', NULL, &type, "type", "object type"), - OPT_BOOLEAN('w', NULL, &write_object, "write the object into the object database"), - OPT_BOOLEAN( 0 , "stdin", &hashstdin, "read the object from stdin"), - OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, "read file names from stdin"), - OPT_BOOLEAN( 0 , "no-filters", &no_filters, "store file as is without filters"), - OPT_STRING( 0 , "path", &vpath, "file", "process file as it were from this path"), + OPT_STRING('t', NULL, &type, N_("type"), N_("object type")), + OPT_BOOLEAN('w', NULL, &write_object, N_("write the object into the object database")), + OPT_BOOLEAN( 0 , "stdin", &hashstdin, N_("read the object from stdin")), + OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, N_("read file names from stdin")), + OPT_BOOLEAN( 0 , "no-filters", &no_filters, N_("store file as is without filters")), + OPT_STRING( 0 , "path", &vpath, N_("file"), N_("process file as it were from this path")), OPT_END() }; diff --git a/builtin/help.c b/builtin/help.c index efea4f55e1..bd86253d83 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -40,17 +40,17 @@ static int show_all = 0; static unsigned int colopts; static enum help_format help_format = HELP_FORMAT_NONE; static struct option builtin_help_options[] = { - OPT_BOOLEAN('a', "all", &show_all, "print all available commands"), - OPT_SET_INT('m', "man", &help_format, "show man page", HELP_FORMAT_MAN), - OPT_SET_INT('w', "web", &help_format, "show manual in web browser", + OPT_BOOLEAN('a', "all", &show_all, N_("print all available commands")), + OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN), + OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"), HELP_FORMAT_WEB), - OPT_SET_INT('i', "info", &help_format, "show info page", + OPT_SET_INT('i', "info", &help_format, N_("show info page"), HELP_FORMAT_INFO), OPT_END(), }; static const char * const builtin_help_usage[] = { - "git help [--all] [--man|--web|--info] [command]", + N_("git help [--all] [--man|--web|--info] [command]"), NULL }; diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 953dd3004e..43d364b8d5 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -291,7 +291,7 @@ static void parse_pack_header(void) if (hdr->hdr_signature != htonl(PACK_SIGNATURE)) die(_("pack signature mismatch")); if (!pack_version_ok(hdr->hdr_version)) - die("pack version %"PRIu32" unsupported", + die(_("pack version %"PRIu32" unsupported"), ntohl(hdr->hdr_version)); nr_objects = ntohl(hdr->hdr_entries); @@ -1061,7 +1061,8 @@ static void resolve_deltas(void) int ret = pthread_create(&thread_data[i].thread, NULL, threaded_second_pass, thread_data + i); if (ret) - die("unable to create thread: %s", strerror(ret)); + die(_("unable to create thread: %s"), + strerror(ret)); } for (i = 0; i < nr_threads; i++) pthread_join(thread_data[i].thread, NULL); @@ -1108,7 +1109,7 @@ static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned cha * sizeof(*objects)); f = sha1fd(output_fd, curr_pack); fix_unresolved_deltas(f, nr_unresolved); - sprintf(msg, "completed with %d local objects", + sprintf(msg, _("completed with %d local objects"), nr_objects - nr_objects_initial); stop_progress_msg(&progress, msg); sha1close(f, tail_sha1, 0); @@ -1117,8 +1118,8 @@ static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned cha curr_pack, nr_objects, read_sha1, consumed_bytes-20); if (hashcmp(read_sha1, tail_sha1) != 0) - die("Unexpected tail checksum for %s " - "(disk corruption?)", curr_pack); + die(_("Unexpected tail checksum for %s " + "(disk corruption?)"), curr_pack); } if (nr_deltas != nr_resolved_deltas) die(Q_("pack has %d unresolved delta", @@ -1327,17 +1328,17 @@ static int git_index_pack_config(const char *k, const char *v, void *cb) if (!strcmp(k, "pack.indexversion")) { opts->version = git_config_int(k, v); if (opts->version > 2) - die("bad pack.indexversion=%"PRIu32, opts->version); + die(_("bad pack.indexversion=%"PRIu32), opts->version); return 0; } if (!strcmp(k, "pack.threads")) { nr_threads = git_config_int(k, v); if (nr_threads < 0) - die("invalid number of threads specified (%d)", + die(_("invalid number of threads specified (%d)"), nr_threads); #ifdef NO_PTHREADS if (nr_threads != 1) - warning("no threads support, ignoring %s", k); + warning(_("no threads support, ignoring %s"), k); nr_threads = 1; #endif return 0; @@ -1510,8 +1511,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) usage(index_pack_usage); #ifdef NO_PTHREADS if (nr_threads != 1) - warning("no threads support, " - "ignoring %s", arg); + warning(_("no threads support, " + "ignoring %s"), arg); nr_threads = 1; #endif } else if (!prefixcmp(arg, "--pack_header=")) { diff --git a/builtin/init-db.c b/builtin/init-db.c index 244fb7fc32..78aa3872dd 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -464,7 +464,7 @@ static int shared_callback(const struct option *opt, const char *arg, int unset) } static const char *const init_db_usage[] = { - "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [directory]", + N_("git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [directory]"), NULL }; @@ -482,17 +482,17 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) const char *template_dir = NULL; unsigned int flags = 0; const struct option init_db_options[] = { - OPT_STRING(0, "template", &template_dir, "template-directory", - "directory from which templates will be used"), + OPT_STRING(0, "template", &template_dir, N_("template-directory"), + N_("directory from which templates will be used")), OPT_SET_INT(0, "bare", &is_bare_repository_cfg, - "create a bare repository", 1), + N_("create a bare repository"), 1), { OPTION_CALLBACK, 0, "shared", &init_shared_repository, - "permissions", - "specify that the git repository is to be shared amongst several users", + N_("permissions"), + N_("specify that the git repository is to be shared amongst several users"), PARSE_OPT_OPTARG | PARSE_OPT_NONEG, shared_callback, 0}, - OPT_BIT('q', "quiet", &flags, "be quiet", INIT_DB_QUIET), - OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir", - "separate git dir from working tree"), + OPT_BIT('q', "quiet", &flags, N_("be quiet"), INIT_DB_QUIET), + OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"), + N_("separate git dir from working tree")), OPT_END() }; diff --git a/builtin/log.c b/builtin/log.c index ecc2793690..09cf43e6d4 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -34,8 +34,8 @@ static const char *fmt_patch_subject_prefix = "PATCH"; static const char *fmt_pretty; static const char * const builtin_log_usage[] = { - "git log [<options>] [<since>..<until>] [[--] <path>...]\n" - " or: git show [options] <object>...", + N_("git log [<options>] [<since>..<until>] [[--] <path>...]\n") + N_(" or: git show [options] <object>..."), NULL }; @@ -97,9 +97,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix, int quiet = 0, source = 0; const struct option builtin_log_options[] = { - OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"), - OPT_BOOLEAN(0, "source", &source, "show source"), - { OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options", + OPT_BOOLEAN(0, "quiet", &quiet, N_("suppress diff output")), + OPT_BOOLEAN(0, "source", &source, N_("show source")), + { OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"), PARSE_OPT_OPTARG, decorate_callback}, OPT_END() }; @@ -109,9 +109,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix, PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH); - argc = setup_revisions(argc, argv, rev, opt); if (quiet) rev->diffopt.output_format |= DIFF_FORMAT_NO_OUTPUT; + argc = setup_revisions(argc, argv, rev, opt); /* Any arguments at this point are not recognized */ if (argc > 1) @@ -456,7 +456,7 @@ int cmd_show(int argc, const char **argv, const char *prefix) init_revisions(&rev, prefix); rev.diff = 1; rev.always_show_header = 1; - rev.no_walk = 1; + rev.no_walk = REVISION_WALK_NO_WALK_SORTED; rev.diffopt.stat_width = -1; /* Scale to real terminal size */ memset(&opt, 0, sizeof(opt)); @@ -696,7 +696,7 @@ static int reopen_stdout(struct commit *commit, const char *subject, return 0; } -static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const char *prefix) +static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids) { struct rev_info check_rev; struct commit *commit; @@ -717,7 +717,8 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha init_patch_ids(ids); /* given a range a..b get all patch ids for b..a */ - init_revisions(&check_rev, prefix); + init_revisions(&check_rev, rev->prefix); + check_rev.max_parents = 1; o1->flags ^= UNINTERESTING; o2->flags ^= UNINTERESTING; add_pending_object(&check_rev, o1, "o1"); @@ -726,10 +727,6 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha die(_("revision walk setup failed")); while ((commit = get_revision(&check_rev)) != NULL) { - /* ignore merges */ - if (commit->parents && commit->parents->next) - continue; - add_commit_patch_id(commit, ids); } @@ -890,7 +887,7 @@ static const char *set_outdir(const char *prefix, const char *output_directory) } static const char * const builtin_format_patch_usage[] = { - "git format-patch [options] [<since> | <revision range>]", + N_("git format-patch [options] [<since> | <revision range>]"), NULL }; @@ -1063,61 +1060,61 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) char *branch_name = NULL; const struct option builtin_format_patch_options[] = { { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL, - "use [PATCH n/m] even with a single patch", + N_("use [PATCH n/m] even with a single patch"), PARSE_OPT_NOARG, numbered_callback }, { OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL, - "use [PATCH] even with multiple patches", + N_("use [PATCH] even with multiple patches"), PARSE_OPT_NOARG, no_numbered_callback }, - OPT_BOOLEAN('s', "signoff", &do_signoff, "add Signed-off-by:"), + OPT_BOOLEAN('s', "signoff", &do_signoff, N_("add Signed-off-by:")), OPT_BOOLEAN(0, "stdout", &use_stdout, - "print patches to standard out"), + N_("print patches to standard out")), OPT_BOOLEAN(0, "cover-letter", &cover_letter, - "generate a cover letter"), + N_("generate a cover letter")), OPT_BOOLEAN(0, "numbered-files", &numbered_files, - "use simple number sequence for output file names"), - OPT_STRING(0, "suffix", &fmt_patch_suffix, "sfx", - "use <sfx> instead of '.patch'"), + N_("use simple number sequence for output file names")), + OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"), + N_("use <sfx> instead of '.patch'")), OPT_INTEGER(0, "start-number", &start_number, - "start numbering patches at <n> instead of 1"), - { OPTION_CALLBACK, 0, "subject-prefix", &rev, "prefix", - "Use [<prefix>] instead of [PATCH]", + N_("start numbering patches at <n> instead of 1")), + { OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"), + N_("Use [<prefix>] instead of [PATCH]"), PARSE_OPT_NONEG, subject_prefix_callback }, { OPTION_CALLBACK, 'o', "output-directory", &output_directory, - "dir", "store resulting files in <dir>", + N_("dir"), N_("store resulting files in <dir>"), PARSE_OPT_NONEG, output_directory_callback }, { OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL, - "don't strip/add [PATCH]", + N_("don't strip/add [PATCH]"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback }, OPT_BOOLEAN(0, "no-binary", &no_binary_diff, - "don't output binary diffs"), + N_("don't output binary diffs")), OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream, - "don't include a patch matching a commit upstream"), + N_("don't include a patch matching a commit upstream")), { OPTION_BOOLEAN, 'p', "no-stat", &use_patch_format, NULL, - "show patch format instead of default (patch + stat)", + N_("show patch format instead of default (patch + stat)"), PARSE_OPT_NONEG | PARSE_OPT_NOARG }, - OPT_GROUP("Messaging"), - { OPTION_CALLBACK, 0, "add-header", NULL, "header", - "add email header", 0, header_callback }, - { OPTION_CALLBACK, 0, "to", NULL, "email", "add To: header", + OPT_GROUP(N_("Messaging")), + { OPTION_CALLBACK, 0, "add-header", NULL, N_("header"), + N_("add email header"), 0, header_callback }, + { OPTION_CALLBACK, 0, "to", NULL, N_("email"), N_("add To: header"), 0, to_callback }, - { OPTION_CALLBACK, 0, "cc", NULL, "email", "add Cc: header", + { OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"), 0, cc_callback }, - OPT_STRING(0, "in-reply-to", &in_reply_to, "message-id", - "make first mail a reply to <message-id>"), - { OPTION_CALLBACK, 0, "attach", &rev, "boundary", - "attach the patch", PARSE_OPT_OPTARG, + OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"), + N_("make first mail a reply to <message-id>")), + { OPTION_CALLBACK, 0, "attach", &rev, N_("boundary"), + N_("attach the patch"), PARSE_OPT_OPTARG, attach_callback }, - { OPTION_CALLBACK, 0, "inline", &rev, "boundary", - "inline the patch", + { OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"), + N_("inline the patch"), PARSE_OPT_OPTARG | PARSE_OPT_NONEG, inline_callback }, - { OPTION_CALLBACK, 0, "thread", &thread, "style", - "enable message threading, styles: shallow, deep", + { OPTION_CALLBACK, 0, "thread", &thread, N_("style"), + N_("enable message threading, styles: shallow, deep"), PARSE_OPT_OPTARG, thread_callback }, - OPT_STRING(0, "signature", &signature, "signature", - "add a signature"), + OPT_STRING(0, "signature", &signature, N_("signature"), + N_("add a signature")), OPT_BOOLEAN(0, "quiet", &quiet, - "don't print the patch filenames"), + N_("don't print the patch filenames")), OPT_END() }; @@ -1306,7 +1303,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0) return 0; } - get_patch_ids(&rev, &ids, prefix); + get_patch_ids(&rev, &ids); } if (!use_stdout) @@ -1443,7 +1440,7 @@ static int add_pending_commit(const char *arg, struct rev_info *revs, int flags) } static const char * const cherry_usage[] = { - "git cherry [-v] [<upstream> [<head> [<limit>]]]", + N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"), NULL }; @@ -1477,7 +1474,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) struct option options[] = { OPT__ABBREV(&abbrev), - OPT__VERBOSE(&verbose, "be verbose"), + OPT__VERBOSE(&verbose, N_("be verbose")), OPT_END() }; @@ -1508,10 +1505,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) } init_revisions(&revs, prefix); - revs.diff = 1; - revs.combine_merges = 0; - revs.ignore_merges = 1; - DIFF_OPT_SET(&revs.diffopt, RECURSIVE); + revs.max_parents = 1; if (add_pending_commit(head, &revs, 0)) die(_("Unknown commit %s"), head); @@ -1525,7 +1519,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) return 0; } - get_patch_ids(&revs, &ids, prefix); + get_patch_ids(&revs, &ids); if (limit && add_pending_commit(limit, &revs, UNINTERESTING)) die(_("Unknown commit %s"), limit); @@ -1534,10 +1528,6 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) if (prepare_revision_walk(&revs)) die(_("revision walk setup failed")); while ((commit = get_revision(&revs)) != NULL) { - /* ignore merges */ - if (commit->parents && commit->parents->next) - continue; - commit_list_insert(commit, &list); } diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 31b3f2d900..b5434af0c8 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -405,7 +405,7 @@ int report_path_error(const char *ps_matched, const char **pathspec, const char } static const char * const ls_files_usage[] = { - "git ls-files [options] [<file>...]", + N_("git ls-files [options] [<file>...]"), NULL }; @@ -457,57 +457,57 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) struct dir_struct dir; struct option builtin_ls_files_options[] = { { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - "paths are separated with NUL character", + N_("paths are separated with NUL character"), PARSE_OPT_NOARG, option_parse_z }, OPT_BOOLEAN('t', NULL, &show_tag, - "identify the file status with tags"), + N_("identify the file status with tags")), OPT_BOOLEAN('v', NULL, &show_valid_bit, - "use lowercase letters for 'assume unchanged' files"), + N_("use lowercase letters for 'assume unchanged' files")), OPT_BOOLEAN('c', "cached", &show_cached, - "show cached files in the output (default)"), + N_("show cached files in the output (default)")), OPT_BOOLEAN('d', "deleted", &show_deleted, - "show deleted files in the output"), + N_("show deleted files in the output")), OPT_BOOLEAN('m', "modified", &show_modified, - "show modified files in the output"), + N_("show modified files in the output")), OPT_BOOLEAN('o', "others", &show_others, - "show other files in the output"), + N_("show other files in the output")), OPT_BIT('i', "ignored", &dir.flags, - "show ignored files in the output", + N_("show ignored files in the output"), DIR_SHOW_IGNORED), OPT_BOOLEAN('s', "stage", &show_stage, - "show staged contents' object name in the output"), + N_("show staged contents' object name in the output")), OPT_BOOLEAN('k', "killed", &show_killed, - "show files on the filesystem that need to be removed"), + N_("show files on the filesystem that need to be removed")), OPT_BIT(0, "directory", &dir.flags, - "show 'other' directories' name only", + N_("show 'other' directories' name only"), DIR_SHOW_OTHER_DIRECTORIES), OPT_NEGBIT(0, "empty-directory", &dir.flags, - "don't show empty directories", + N_("don't show empty directories"), DIR_HIDE_EMPTY_DIRECTORIES), OPT_BOOLEAN('u', "unmerged", &show_unmerged, - "show unmerged files in the output"), + N_("show unmerged files in the output")), OPT_BOOLEAN(0, "resolve-undo", &show_resolve_undo, - "show resolve-undo information"), - { OPTION_CALLBACK, 'x', "exclude", &dir.exclude_list[EXC_CMDL], "pattern", - "skip files matching pattern", + N_("show resolve-undo information")), + { OPTION_CALLBACK, 'x', "exclude", &dir.exclude_list[EXC_CMDL], N_("pattern"), + N_("skip files matching pattern"), 0, option_parse_exclude }, - { OPTION_CALLBACK, 'X', "exclude-from", &dir, "file", - "exclude patterns are read from <file>", + { OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"), + N_("exclude patterns are read from <file>"), 0, option_parse_exclude_from }, - OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, "file", - "read additional per-directory exclude patterns in <file>"), + OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"), + N_("read additional per-directory exclude patterns in <file>")), { OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL, - "add the standard git exclusions", + N_("add the standard git exclusions"), PARSE_OPT_NOARG, option_parse_exclude_standard }, { OPTION_SET_INT, 0, "full-name", &prefix_len, NULL, - "make the output relative to the project top directory", + N_("make the output relative to the project top directory"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL }, OPT_BOOLEAN(0, "error-unmatch", &error_unmatch, - "if any <file> is not in the index, treat this as an error"), - OPT_STRING(0, "with-tree", &with_tree, "tree-ish", - "pretend that paths removed since <tree-ish> are still present"), + N_("if any <file> is not in the index, treat this as an error")), + OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"), + N_("pretend that paths removed since <tree-ish> are still present")), OPT__ABBREV(&abbrev), - OPT_BOOLEAN(0, "debug", &debug_mode, "show debugging data"), + OPT_BOOLEAN(0, "debug", &debug_mode, N_("show debugging data")), OPT_END() }; diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index 41c88a98a2..25e83cfe9d 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -5,7 +5,7 @@ static const char ls_remote_usage[] = "git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>]\n" -" [-q|--quiet] [--exit-code] [<repository> [<refs>...]]"; +" [-q|--quiet] [--exit-code] [--get-url] [<repository> [<refs>...]]"; /* * Is there one among the list of patterns that match the tail part diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index 6b666e1e87..235c17cc01 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -24,7 +24,7 @@ static int chomp_prefix; static const char *ls_tree_prefix; static const char * const ls_tree_usage[] = { - "git ls-tree [<options>] <tree-ish> [<path>...]", + N_("git ls-tree [<options>] <tree-ish> [<path>...]"), NULL }; @@ -122,25 +122,25 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) struct tree *tree; int i, full_tree = 0; const struct option ls_tree_options[] = { - OPT_BIT('d', NULL, &ls_options, "only show trees", + OPT_BIT('d', NULL, &ls_options, N_("only show trees"), LS_TREE_ONLY), - OPT_BIT('r', NULL, &ls_options, "recurse into subtrees", + OPT_BIT('r', NULL, &ls_options, N_("recurse into subtrees"), LS_RECURSIVE), - OPT_BIT('t', NULL, &ls_options, "show trees when recursing", + OPT_BIT('t', NULL, &ls_options, N_("show trees when recursing"), LS_SHOW_TREES), OPT_SET_INT('z', NULL, &line_termination, - "terminate entries with NUL byte", 0), - OPT_BIT('l', "long", &ls_options, "include object size", + N_("terminate entries with NUL byte"), 0), + OPT_BIT('l', "long", &ls_options, N_("include object size"), LS_SHOW_SIZE), - OPT_BIT(0, "name-only", &ls_options, "list only filenames", + OPT_BIT(0, "name-only", &ls_options, N_("list only filenames"), LS_NAME_ONLY), - OPT_BIT(0, "name-status", &ls_options, "list only filenames", + OPT_BIT(0, "name-status", &ls_options, N_("list only filenames"), LS_NAME_ONLY), OPT_SET_INT(0, "full-name", &chomp_prefix, - "use full path names", 0), + N_("use full path names"), 0), OPT_BOOLEAN(0, "full-tree", &full_tree, - "list entire tree; not just current directory " - "(implies --full-name)"), + N_("list entire tree; not just current directory " + "(implies --full-name)")), OPT__ABBREV(&abbrev), OPT_END() }; diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index eaf9e157a3..da231400b3 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -19,9 +19,6 @@ static struct strbuf email = STRBUF_INIT; static enum { TE_DONTCARE, TE_QP, TE_BASE64 } transfer_encoding; -static enum { - TYPE_TEXT, TYPE_OTHER -} message_type; static struct strbuf charset = STRBUF_INIT; static int patch_lines; @@ -160,10 +157,9 @@ static int slurp_attr(const char *line, const char *name, struct strbuf *attr) const char *ends, *ap = strcasestr(line, name); size_t sz; - if (!ap) { - strbuf_setlen(attr, 0); + strbuf_setlen(attr, 0); + if (!ap) return 0; - } ap += strlen(name); if (*ap == '"') { ap++; @@ -185,8 +181,6 @@ static void handle_content_type(struct strbuf *line) struct strbuf *boundary = xmalloc(sizeof(struct strbuf)); strbuf_init(boundary, line->len); - if (!strcasestr(line->buf, "text/")) - message_type = TYPE_OTHER; if (slurp_attr(line->buf, "boundary=", boundary)) { strbuf_insert(boundary, 0, "--", 2); if (++content_top > &content[MAX_BOUNDARIES]) { @@ -232,7 +226,9 @@ static void cleanup_subject(struct strbuf *subject) case 'r': case 'R': if (subject->len <= at + 3) break; - if (!memcmp(subject->buf + at + 1, "e:", 2)) { + if ((subject->buf[at + 1] == 'e' || + subject->buf[at + 1] == 'E') && + subject->buf[at + 2] == ':') { strbuf_remove(subject, at, 3); continue; } @@ -481,36 +477,12 @@ static struct strbuf *decode_b_segment(const struct strbuf *b_seg) return out; } -/* - * When there is no known charset, guess. - * - * Right now we assume that if the target is UTF-8 (the default), - * and it already looks like UTF-8 (which includes US-ASCII as its - * subset, of course) then that is what it is and there is nothing - * to do. - * - * Otherwise, we default to assuming it is Latin1 for historical - * reasons. - */ -static const char *guess_charset(const struct strbuf *line, const char *target_charset) -{ - if (is_encoding_utf8(target_charset)) { - if (is_utf8(line->buf)) - return NULL; - } - return "ISO8859-1"; -} - static void convert_to_utf8(struct strbuf *line, const char *charset) { char *out; - if (!charset || !*charset) { - charset = guess_charset(line, metainfo_charset); - if (!charset) - return; - } - + if (!charset || !*charset) + return; if (!strcasecmp(metainfo_charset, charset)) return; out = reencode_string(line->buf, metainfo_charset, charset); @@ -680,7 +652,6 @@ again: /* set some defaults */ transfer_encoding = TE_DONTCARE; strbuf_reset(&charset); - message_type = TYPE_TEXT; /* slurp in this section's info */ while (read_one_header_line(&line, fin)) @@ -894,11 +865,6 @@ static void handle_body(void) strbuf_insert(&line, 0, prev.buf, prev.len); strbuf_reset(&prev); - /* binary data most likely doesn't have newlines */ - if (message_type != TYPE_TEXT) { - handle_filter(&line); - break; - } /* * This is a decoded line that may contain * multiple new lines. Pass only one chunk diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 4f30f1b0c8..1bc7991048 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -23,9 +23,10 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all) } static const char * const merge_base_usage[] = { - "git merge-base [-a|--all] <commit> <commit>...", - "git merge-base [-a|--all] --octopus <commit>...", - "git merge-base --independent <commit>...", + N_("git merge-base [-a|--all] <commit> <commit>..."), + N_("git merge-base [-a|--all] --octopus <commit>..."), + N_("git merge-base --independent <commit>..."), + N_("git merge-base --is-ancestor <commit> <commit>"), NULL }; @@ -70,6 +71,20 @@ static int handle_octopus(int count, const char **args, int reduce, int show_all return 0; } +static int handle_is_ancestor(int argc, const char **argv) +{ + struct commit *one, *two; + + if (argc != 2) + die("--is-ancestor takes exactly two commits"); + one = get_commit_reference(argv[0]); + two = get_commit_reference(argv[1]); + if (in_merge_bases(one, two)) + return 0; + else + return 1; +} + int cmd_merge_base(int argc, const char **argv, const char *prefix) { struct commit **rev; @@ -77,11 +92,14 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) int show_all = 0; int octopus = 0; int reduce = 0; + int is_ancestor = 0; struct option options[] = { - OPT_BOOLEAN('a', "all", &show_all, "output all common ancestors"), - OPT_BOOLEAN(0, "octopus", &octopus, "find ancestors for a single n-way merge"), - OPT_BOOLEAN(0, "independent", &reduce, "list revs not reachable from others"), + OPT_BOOLEAN('a', "all", &show_all, N_("output all common ancestors")), + OPT_BOOLEAN(0, "octopus", &octopus, N_("find ancestors for a single n-way merge")), + OPT_BOOLEAN(0, "independent", &reduce, N_("list revs not reachable from others")), + OPT_BOOLEAN(0, "is-ancestor", &is_ancestor, + N_("is the first one ancestor of the other?")), OPT_END() }; @@ -89,6 +107,10 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0); if (!octopus && !reduce && argc < 2) usage_with_options(merge_base_usage, options); + if (is_ancestor && (show_all | octopus | reduce)) + die("--is-ancestor cannot be used with other options"); + if (is_ancestor) + return handle_is_ancestor(argc, argv); if (reduce && (show_all || octopus)) die("--independent cannot be used with other options"); diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 6f0efef43c..c0570f2407 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -5,7 +5,7 @@ #include "parse-options.h" static const char *const merge_file_usage[] = { - "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file file2", + N_("git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file file2"), NULL }; @@ -30,19 +30,19 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) int quiet = 0; int prefixlen = 0; struct option options[] = { - OPT_BOOLEAN('p', "stdout", &to_stdout, "send results to standard output"), - OPT_SET_INT(0, "diff3", &xmp.style, "use a diff3 based merge", XDL_MERGE_DIFF3), - OPT_SET_INT(0, "ours", &xmp.favor, "for conflicts, use our version", + OPT_BOOLEAN('p', "stdout", &to_stdout, N_("send results to standard output")), + OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based merge"), XDL_MERGE_DIFF3), + OPT_SET_INT(0, "ours", &xmp.favor, N_("for conflicts, use our version"), XDL_MERGE_FAVOR_OURS), - OPT_SET_INT(0, "theirs", &xmp.favor, "for conflicts, use their version", + OPT_SET_INT(0, "theirs", &xmp.favor, N_("for conflicts, use their version"), XDL_MERGE_FAVOR_THEIRS), - OPT_SET_INT(0, "union", &xmp.favor, "for conflicts, use a union version", + OPT_SET_INT(0, "union", &xmp.favor, N_("for conflicts, use a union version"), XDL_MERGE_FAVOR_UNION), OPT_INTEGER(0, "marker-size", &xmp.marker_size, - "for conflicts, use this marker size"), - OPT__QUIET(&quiet, "do not warn about conflicts"), - OPT_CALLBACK('L', NULL, names, "name", - "set labels for file1/orig_file/file2", &label_cb), + N_("for conflicts, use this marker size")), + OPT__QUIET(&quiet, N_("do not warn about conflicts")), + OPT_CALLBACK('L', NULL, names, N_("name"), + N_("set labels for file1/orig_file/file2"), &label_cb), OPT_END(), }; diff --git a/builtin/merge.c b/builtin/merge.c index dd50a0c57b..0ec8f0d449 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -40,9 +40,9 @@ struct strategy { }; static const char * const builtin_merge_usage[] = { - "git merge [options] [<commit>...]", - "git merge [options] <msg> HEAD <commit>", - "git merge --abort", + N_("git merge [options] [<commit>...]"), + N_("git merge [options] <msg> HEAD <commit>"), + N_("git merge --abort"), NULL }; @@ -180,39 +180,39 @@ static int option_parse_n(const struct option *opt, static struct option builtin_merge_options[] = { { OPTION_CALLBACK, 'n', NULL, NULL, NULL, - "do not show a diffstat at the end of the merge", + N_("do not show a diffstat at the end of the merge"), PARSE_OPT_NOARG, option_parse_n }, OPT_BOOLEAN(0, "stat", &show_diffstat, - "show a diffstat at the end of the merge"), - OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"), - { OPTION_INTEGER, 0, "log", &shortlog_len, "n", - "add (at most <n>) entries from shortlog to merge commit message", + N_("show a diffstat at the end of the merge")), + OPT_BOOLEAN(0, "summary", &show_diffstat, N_("(synonym to --stat)")), + { OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"), + N_("add (at most <n>) entries from shortlog to merge commit message"), PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN }, OPT_BOOLEAN(0, "squash", &squash, - "create a single commit instead of doing a merge"), + N_("create a single commit instead of doing a merge")), OPT_BOOLEAN(0, "commit", &option_commit, - "perform a commit if the merge succeeds (default)"), + N_("perform a commit if the merge succeeds (default)")), OPT_BOOL('e', "edit", &option_edit, - "edit message before committing"), + N_("edit message before committing")), OPT_BOOLEAN(0, "ff", &allow_fast_forward, - "allow fast-forward (default)"), + N_("allow fast-forward (default)")), OPT_BOOLEAN(0, "ff-only", &fast_forward_only, - "abort if fast-forward is not possible"), + N_("abort if fast-forward is not possible")), OPT_RERERE_AUTOUPDATE(&allow_rerere_auto), - OPT_CALLBACK('s', "strategy", &use_strategies, "strategy", - "merge strategy to use", option_parse_strategy), - OPT_CALLBACK('X', "strategy-option", &xopts, "option=value", - "option for selected merge strategy", option_parse_x), - OPT_CALLBACK('m', "message", &merge_msg, "message", - "merge commit message (for a non-fast-forward merge)", + OPT_CALLBACK('s', "strategy", &use_strategies, N_("strategy"), + N_("merge strategy to use"), option_parse_strategy), + OPT_CALLBACK('X', "strategy-option", &xopts, N_("option=value"), + N_("option for selected merge strategy"), option_parse_x), + OPT_CALLBACK('m', "message", &merge_msg, N_("message"), + N_("merge commit message (for a non-fast-forward merge)"), option_parse_message), OPT__VERBOSITY(&verbosity), OPT_BOOLEAN(0, "abort", &abort_current_merge, - "abort the current in-progress merge"), - OPT_SET_INT(0, "progress", &show_progress, "force progress reporting", 1), - { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id", - "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, - OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, "update ignored files (default)"), + N_("abort the current in-progress merge")), + OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1), + { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"), + N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, + OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")), OPT_END() }; @@ -404,8 +404,7 @@ static void finish(struct commit *head_commit, opts.output_format |= DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT; opts.detect_rename = DIFF_DETECT_RENAME; - if (diff_setup_done(&opts) < 0) - die(_("diff_setup_done failed")); + diff_setup_done(&opts); diff_tree_sha1(head, new_head, "", &opts); diffcore_std(&opts); diff_flush(&opts); diff --git a/builtin/mktree.c b/builtin/mktree.c index 4ae1c412d4..f92ba404ab 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -64,7 +64,7 @@ static void write_tree(unsigned char *sha1) } static const char *mktree_usage[] = { - "git mktree [-z] [--missing] [--batch]", + N_("git mktree [-z] [--missing] [--batch]"), NULL }; @@ -150,9 +150,9 @@ int cmd_mktree(int ac, const char **av, const char *prefix) int got_eof = 0; const struct option option[] = { - OPT_SET_INT('z', NULL, &line_termination, "input is NUL terminated", '\0'), - OPT_SET_INT( 0 , "missing", &allow_missing, "allow missing objects", 1), - OPT_SET_INT( 0 , "batch", &is_batch_mode, "allow creation of more than one tree", 1), + OPT_SET_INT('z', NULL, &line_termination, N_("input is NUL terminated"), '\0'), + OPT_SET_INT( 0 , "missing", &allow_missing, N_("allow missing objects"), 1), + OPT_SET_INT( 0 , "batch", &is_batch_mode, N_("allow creation of more than one tree"), 1), OPT_END() }; diff --git a/builtin/mv.c b/builtin/mv.c index 2a144b011c..034fec92a1 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -11,7 +11,7 @@ #include "parse-options.h" static const char * const builtin_mv_usage[] = { - "git mv [options] <source>... <destination>", + N_("git mv [options] <source>... <destination>"), NULL }; @@ -59,10 +59,10 @@ int cmd_mv(int argc, const char **argv, const char *prefix) int i, newfd; int verbose = 0, show_only = 0, force = 0, ignore_errors = 0; struct option builtin_mv_options[] = { - OPT__VERBOSE(&verbose, "be verbose"), - OPT__DRY_RUN(&show_only, "dry run"), - OPT__FORCE(&force, "force move/rename even if target exists"), - OPT_BOOLEAN('k', NULL, &ignore_errors, "skip move/rename errors"), + OPT__VERBOSE(&verbose, N_("be verbose")), + OPT__DRY_RUN(&show_only, N_("dry run")), + OPT__FORCE(&force, N_("force move/rename even if target exists")), + OPT_BOOLEAN('k', NULL, &ignore_errors, N_("skip move/rename errors")), OPT_END(), }; const char **source, **destination, **dest_path; diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 1b374583c2..6238247974 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -172,9 +172,9 @@ static void show_name(const struct object *obj, } static char const * const name_rev_usage[] = { - "git name-rev [options] <commit>...", - "git name-rev [options] --all", - "git name-rev [options] --stdin", + N_("git name-rev [options] <commit>..."), + N_("git name-rev [options] --all"), + N_("git name-rev [options] --stdin"), NULL }; @@ -226,16 +226,16 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix) int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0; struct name_ref_data data = { 0, 0, NULL }; struct option opts[] = { - OPT_BOOLEAN(0, "name-only", &data.name_only, "print only names (no SHA-1)"), - OPT_BOOLEAN(0, "tags", &data.tags_only, "only use tags to name the commits"), - OPT_STRING(0, "refs", &data.ref_filter, "pattern", - "only use refs matching <pattern>"), + OPT_BOOLEAN(0, "name-only", &data.name_only, N_("print only names (no SHA-1)")), + OPT_BOOLEAN(0, "tags", &data.tags_only, N_("only use tags to name the commits")), + OPT_STRING(0, "refs", &data.ref_filter, N_("pattern"), + N_("only use refs matching <pattern>")), OPT_GROUP(""), - OPT_BOOLEAN(0, "all", &all, "list all commits reachable from all refs"), - OPT_BOOLEAN(0, "stdin", &transform_stdin, "read from stdin"), - OPT_BOOLEAN(0, "undefined", &allow_undefined, "allow to print `undefined` names"), + OPT_BOOLEAN(0, "all", &all, N_("list all commits reachable from all refs")), + OPT_BOOLEAN(0, "stdin", &transform_stdin, N_("read from stdin")), + OPT_BOOLEAN(0, "undefined", &allow_undefined, N_("allow to print `undefined` names")), OPT_BOOLEAN(0, "always", &always, - "show abbreviated commit object as fallback"), + N_("show abbreviated commit object as fallback")), OPT_END(), }; diff --git a/builtin/notes.c b/builtin/notes.c index 3644d140ec..453457adb9 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -19,72 +19,75 @@ #include "string-list.h" #include "notes-merge.h" +static void commit_notes(struct notes_tree *t, const char *msg); +static combine_notes_fn parse_combine_notes_fn(const char *v); + static const char * const git_notes_usage[] = { - "git notes [--ref <notes_ref>] [list [<object>]]", - "git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]", - "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>", - "git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]", - "git notes [--ref <notes_ref>] edit [<object>]", - "git notes [--ref <notes_ref>] show [<object>]", - "git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>", - "git notes merge --commit [-v | -q]", - "git notes merge --abort [-v | -q]", - "git notes [--ref <notes_ref>] remove [<object>...]", - "git notes [--ref <notes_ref>] prune [-n | -v]", - "git notes [--ref <notes_ref>] get-ref", + N_("git notes [--ref <notes_ref>] [list [<object>]]"), + N_("git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), + N_("git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"), + N_("git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), + N_("git notes [--ref <notes_ref>] edit [<object>]"), + N_("git notes [--ref <notes_ref>] show [<object>]"), + N_("git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"), + N_("git notes merge --commit [-v | -q]"), + N_("git notes merge --abort [-v | -q]"), + N_("git notes [--ref <notes_ref>] remove [<object>...]"), + N_("git notes [--ref <notes_ref>] prune [-n | -v]"), + N_("git notes [--ref <notes_ref>] get-ref"), NULL }; static const char * const git_notes_list_usage[] = { - "git notes [list [<object>]]", + N_("git notes [list [<object>]]"), NULL }; static const char * const git_notes_add_usage[] = { - "git notes add [<options>] [<object>]", + N_("git notes add [<options>] [<object>]"), NULL }; static const char * const git_notes_copy_usage[] = { - "git notes copy [<options>] <from-object> <to-object>", - "git notes copy --stdin [<from-object> <to-object>]...", + N_("git notes copy [<options>] <from-object> <to-object>"), + N_("git notes copy --stdin [<from-object> <to-object>]..."), NULL }; static const char * const git_notes_append_usage[] = { - "git notes append [<options>] [<object>]", + N_("git notes append [<options>] [<object>]"), NULL }; static const char * const git_notes_edit_usage[] = { - "git notes edit [<object>]", + N_("git notes edit [<object>]"), NULL }; static const char * const git_notes_show_usage[] = { - "git notes show [<object>]", + N_("git notes show [<object>]"), NULL }; static const char * const git_notes_merge_usage[] = { - "git notes merge [<options>] <notes_ref>", - "git notes merge --commit [<options>]", - "git notes merge --abort [<options>]", + N_("git notes merge [<options>] <notes_ref>"), + N_("git notes merge --commit [<options>]"), + N_("git notes merge --abort [<options>]"), NULL }; static const char * const git_notes_remove_usage[] = { - "git notes remove [<object>]", + N_("git notes remove [<object>]"), NULL }; static const char * const git_notes_prune_usage[] = { - "git notes prune [<options>]", + N_("git notes prune [<options>]"), NULL }; static const char * const git_notes_get_ref_usage[] = { - "git notes get-ref", + N_("git notes get-ref"), NULL }; @@ -288,7 +291,7 @@ static int parse_reedit_arg(const struct option *opt, const char *arg, int unset return parse_reuse_arg(opt, arg, unset); } -void commit_notes(struct notes_tree *t, const char *msg) +static void commit_notes(struct notes_tree *t, const char *msg) { struct strbuf buf = STRBUF_INIT; unsigned char commit_sha1[20]; @@ -312,7 +315,7 @@ void commit_notes(struct notes_tree *t, const char *msg) strbuf_release(&buf); } -combine_notes_fn parse_combine_notes_fn(const char *v) +static combine_notes_fn parse_combine_notes_fn(const char *v) { if (!strcasecmp(v, "overwrite")) return combine_notes_overwrite; @@ -531,19 +534,19 @@ static int add(int argc, const char **argv, const char *prefix) const unsigned char *note; struct msg_arg msg = { 0, 0, STRBUF_INIT }; struct option options[] = { - { OPTION_CALLBACK, 'm', "message", &msg, "msg", - "note contents as a string", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'm', "message", &msg, N_("message"), + N_("note contents as a string"), PARSE_OPT_NONEG, parse_msg_arg}, - { OPTION_CALLBACK, 'F', "file", &msg, "file", - "note contents in a file", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'F', "file", &msg, N_("file"), + N_("note contents in a file"), PARSE_OPT_NONEG, parse_file_arg}, - { OPTION_CALLBACK, 'c', "reedit-message", &msg, "object", - "reuse and edit specified note object", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'c', "reedit-message", &msg, N_("object"), + N_("reuse and edit specified note object"), PARSE_OPT_NONEG, parse_reedit_arg}, - { OPTION_CALLBACK, 'C', "reuse-message", &msg, "object", - "reuse specified note object", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'C', "reuse-message", &msg, N_("object"), + N_("reuse specified note object"), PARSE_OPT_NONEG, parse_reuse_arg}, - OPT__FORCE(&force, "replace existing notes"), + OPT__FORCE(&force, N_("replace existing notes")), OPT_END() }; @@ -611,11 +614,11 @@ static int copy(int argc, const char **argv, const char *prefix) struct notes_tree *t; const char *rewrite_cmd = NULL; struct option options[] = { - OPT__FORCE(&force, "replace existing notes"), - OPT_BOOLEAN(0, "stdin", &from_stdin, "read objects from stdin"), - OPT_STRING(0, "for-rewrite", &rewrite_cmd, "command", - "load rewriting config for <command> (implies " - "--stdin)"), + OPT__FORCE(&force, N_("replace existing notes")), + OPT_BOOLEAN(0, "stdin", &from_stdin, N_("read objects from stdin")), + OPT_STRING(0, "for-rewrite", &rewrite_cmd, N_("command"), + N_("load rewriting config for <command> (implies " + "--stdin)")), OPT_END() }; @@ -688,17 +691,17 @@ static int append_edit(int argc, const char **argv, const char *prefix) const char * const *usage; struct msg_arg msg = { 0, 0, STRBUF_INIT }; struct option options[] = { - { OPTION_CALLBACK, 'm', "message", &msg, "msg", - "note contents as a string", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'm', "message", &msg, N_("message"), + N_("note contents as a string"), PARSE_OPT_NONEG, parse_msg_arg}, - { OPTION_CALLBACK, 'F', "file", &msg, "file", - "note contents in a file", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'F', "file", &msg, N_("file"), + N_("note contents in a file"), PARSE_OPT_NONEG, parse_file_arg}, - { OPTION_CALLBACK, 'c', "reedit-message", &msg, "object", - "reuse and edit specified note object", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'c', "reedit-message", &msg, N_("object"), + N_("reuse and edit specified note object"), PARSE_OPT_NONEG, parse_reedit_arg}, - { OPTION_CALLBACK, 'C', "reuse-message", &msg, "object", - "reuse specified note object", PARSE_OPT_NONEG, + { OPTION_CALLBACK, 'C', "reuse-message", &msg, N_("object"), + N_("reuse specified note object"), PARSE_OPT_NONEG, parse_reuse_arg}, OPT_END() }; @@ -861,19 +864,19 @@ static int merge(int argc, const char **argv, const char *prefix) int verbosity = 0, result; const char *strategy = NULL; struct option options[] = { - OPT_GROUP("General options"), + OPT_GROUP(N_("General options")), OPT__VERBOSITY(&verbosity), - OPT_GROUP("Merge options"), - OPT_STRING('s', "strategy", &strategy, "strategy", - "resolve notes conflicts using the given strategy " - "(manual/ours/theirs/union/cat_sort_uniq)"), - OPT_GROUP("Committing unmerged notes"), + OPT_GROUP(N_("Merge options")), + OPT_STRING('s', "strategy", &strategy, N_("strategy"), + N_("resolve notes conflicts using the given strategy " + "(manual/ours/theirs/union/cat_sort_uniq)")), + OPT_GROUP(N_("Committing unmerged notes")), { OPTION_BOOLEAN, 0, "commit", &do_commit, NULL, - "finalize notes merge by committing unmerged notes", + N_("finalize notes merge by committing unmerged notes"), PARSE_OPT_NOARG | PARSE_OPT_NONEG }, - OPT_GROUP("Aborting notes merge resolution"), + OPT_GROUP(N_("Aborting notes merge resolution")), { OPTION_BOOLEAN, 0, "abort", &do_abort, NULL, - "abort notes merge", + N_("abort notes merge"), PARSE_OPT_NOARG | PARSE_OPT_NONEG }, OPT_END() }; @@ -980,10 +983,10 @@ static int remove_cmd(int argc, const char **argv, const char *prefix) int from_stdin = 0; struct option options[] = { OPT_BIT(0, "ignore-missing", &flag, - "attempt to remove non-existent note is not an error", + N_("attempt to remove non-existent note is not an error"), IGNORE_MISSING), OPT_BOOLEAN(0, "stdin", &from_stdin, - "read object names from the standard input"), + N_("read object names from the standard input")), OPT_END() }; struct notes_tree *t; @@ -1064,8 +1067,8 @@ int cmd_notes(int argc, const char **argv, const char *prefix) int result; const char *override_notes_ref = NULL; struct option options[] = { - OPT_STRING(0, "ref", &override_notes_ref, "notes_ref", - "use notes from <notes_ref>"), + OPT_STRING(0, "ref", &override_notes_ref, N_("notes_ref"), + N_("use notes from <notes_ref>")), OPT_END() }; diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 782e7d0c38..5e14064094 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -20,8 +20,8 @@ #include "thread-utils.h" static const char *pack_usage[] = { - "git pack-objects --stdout [options...] [< ref-list | < object-list]", - "git pack-objects [options...] base-name [< ref-list | < object-list]", + N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"), + N_("git pack-objects [options...] base-name [< ref-list | < object-list]"), NULL }; @@ -2445,67 +2445,67 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0; struct option pack_objects_options[] = { OPT_SET_INT('q', "quiet", &progress, - "do not show progress meter", 0), + N_("do not show progress meter"), 0), OPT_SET_INT(0, "progress", &progress, - "show progress meter", 1), + N_("show progress meter"), 1), OPT_SET_INT(0, "all-progress", &progress, - "show progress meter during object writing phase", 2), + N_("show progress meter during object writing phase"), 2), OPT_BOOL(0, "all-progress-implied", &all_progress_implied, - "similar to --all-progress when progress meter is shown"), - { OPTION_CALLBACK, 0, "index-version", NULL, "version[,offset]", - "write the pack index file in the specified idx format version", + N_("similar to --all-progress when progress meter is shown")), + { OPTION_CALLBACK, 0, "index-version", NULL, N_("version[,offset]"), + N_("write the pack index file in the specified idx format version"), 0, option_parse_index_version }, OPT_ULONG(0, "max-pack-size", &pack_size_limit, - "maximum size of each output pack file"), + N_("maximum size of each output pack file")), OPT_BOOL(0, "local", &local, - "ignore borrowed objects from alternate object store"), + N_("ignore borrowed objects from alternate object store")), OPT_BOOL(0, "incremental", &incremental, - "ignore packed objects"), + N_("ignore packed objects")), OPT_INTEGER(0, "window", &window, - "limit pack window by objects"), + N_("limit pack window by objects")), OPT_ULONG(0, "window-memory", &window_memory_limit, - "limit pack window by memory in addition to object limit"), + N_("limit pack window by memory in addition to object limit")), OPT_INTEGER(0, "depth", &depth, - "maximum length of delta chain allowed in the resulting pack"), + N_("maximum length of delta chain allowed in the resulting pack")), OPT_BOOL(0, "reuse-delta", &reuse_delta, - "reuse existing deltas"), + N_("reuse existing deltas")), OPT_BOOL(0, "reuse-object", &reuse_object, - "reuse existing objects"), + N_("reuse existing objects")), OPT_BOOL(0, "delta-base-offset", &allow_ofs_delta, - "use OFS_DELTA objects"), + N_("use OFS_DELTA objects")), OPT_INTEGER(0, "threads", &delta_search_threads, - "use threads when searching for best delta matches"), + N_("use threads when searching for best delta matches")), OPT_BOOL(0, "non-empty", &non_empty, - "do not create an empty pack output"), + N_("do not create an empty pack output")), OPT_BOOL(0, "revs", &use_internal_rev_list, - "read revision arguments from standard input"), + N_("read revision arguments from standard input")), { OPTION_SET_INT, 0, "unpacked", &rev_list_unpacked, NULL, - "limit the objects to those that are not yet packed", + N_("limit the objects to those that are not yet packed"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 }, { OPTION_SET_INT, 0, "all", &rev_list_all, NULL, - "include objects reachable from any reference", + N_("include objects reachable from any reference"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 }, { OPTION_SET_INT, 0, "reflog", &rev_list_reflog, NULL, - "include objects referred by reflog entries", + N_("include objects referred by reflog entries"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 }, OPT_BOOL(0, "stdout", &pack_to_stdout, - "output pack to stdout"), + N_("output pack to stdout")), OPT_BOOL(0, "include-tag", &include_tag, - "include tag objects that refer to objects to be packed"), + N_("include tag objects that refer to objects to be packed")), OPT_BOOL(0, "keep-unreachable", &keep_unreachable, - "keep unreachable objects"), - { OPTION_CALLBACK, 0, "unpack-unreachable", NULL, "time", - "unpack unreachable objects newer than <time>", + N_("keep unreachable objects")), + { OPTION_CALLBACK, 0, "unpack-unreachable", NULL, N_("time"), + N_("unpack unreachable objects newer than <time>"), PARSE_OPT_OPTARG, option_parse_unpack_unreachable }, OPT_BOOL(0, "thin", &thin, - "create thin packs"), + N_("create thin packs")), OPT_BOOL(0, "honor-pack-keep", &ignore_packed_keep, - "ignore packs that have companion .keep file"), + N_("ignore packs that have companion .keep file")), OPT_INTEGER(0, "compression", &pack_compression_level, - "pack compression level"), + N_("pack compression level")), OPT_SET_INT(0, "keep-true-parents", &grafts_replace_parents, - "do not hide commits by grafts", 0), + N_("do not hide commits by grafts"), 0), OPT_END(), }; diff --git a/builtin/pack-refs.c b/builtin/pack-refs.c index 39a9d89fbd..b5a0f88eb8 100644 --- a/builtin/pack-refs.c +++ b/builtin/pack-refs.c @@ -3,7 +3,7 @@ #include "pack-refs.h" static char const * const pack_refs_usage[] = { - "git pack-refs [options]", + N_("git pack-refs [options]"), NULL }; @@ -11,8 +11,8 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix) { unsigned int flags = PACK_REFS_PRUNE; struct option opts[] = { - OPT_BIT(0, "all", &flags, "pack everything", PACK_REFS_ALL), - OPT_BIT(0, "prune", &flags, "prune loose refs (default)", PACK_REFS_PRUNE), + OPT_BIT(0, "all", &flags, N_("pack everything"), PACK_REFS_ALL), + OPT_BIT(0, "prune", &flags, N_("prune loose refs (default)"), PACK_REFS_PRUNE), OPT_END(), }; if (parse_options(argc, argv, prefix, opts, pack_refs_usage, 0)) diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c index b58a2e1eb2..83382c1fe1 100644 --- a/builtin/prune-packed.c +++ b/builtin/prune-packed.c @@ -4,7 +4,7 @@ #include "parse-options.h" static const char * const prune_packed_usage[] = { - "git prune-packed [-n|--dry-run] [-q|--quiet]", + N_("git prune-packed [-n|--dry-run] [-q|--quiet]"), NULL }; @@ -73,8 +73,8 @@ int cmd_prune_packed(int argc, const char **argv, const char *prefix) { int opts = isatty(2) ? VERBOSE : 0; const struct option prune_packed_options[] = { - OPT_BIT('n', "dry-run", &opts, "dry run", DRY_RUN), - OPT_NEGBIT('q', "quiet", &opts, "be quiet", VERBOSE), + OPT_BIT('n', "dry-run", &opts, N_("dry run"), DRY_RUN), + OPT_NEGBIT('q', "quiet", &opts, N_("be quiet"), VERBOSE), OPT_END() }; diff --git a/builtin/prune.c b/builtin/prune.c index b99b635e44..8cb8b9186a 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -9,7 +9,7 @@ #include "dir.h" static const char * const prune_usage[] = { - "git prune [-n] [-v] [--expire <time>] [--] [<head>...]", + N_("git prune [-n] [-v] [--expire <time>] [--] [<head>...]"), NULL }; static int show_only; @@ -25,7 +25,8 @@ static int prune_tmp_object(const char *path, const char *filename) return error("Could not stat '%s'", fullpath); if (st.st_mtime > expire) return 0; - printf("Removing stale temporary file %s\n", fullpath); + if (show_only || verbose) + printf("Removing stale temporary file %s\n", fullpath); if (!show_only) unlink_or_warn(fullpath); return 0; @@ -128,11 +129,11 @@ int cmd_prune(int argc, const char **argv, const char *prefix) struct rev_info revs; struct progress *progress = NULL; const struct option options[] = { - OPT__DRY_RUN(&show_only, "do not remove, show only"), - OPT__VERBOSE(&verbose, "report pruned objects"), - OPT_BOOL(0, "progress", &show_progress, "show progress"), + OPT__DRY_RUN(&show_only, N_("do not remove, show only")), + OPT__VERBOSE(&verbose, N_("report pruned objects")), + OPT_BOOL(0, "progress", &show_progress, N_("show progress")), OPT_DATE(0, "expire", &expire, - "expire objects older than <time>"), + N_("expire objects older than <time>")), OPT_END() }; char *s; @@ -168,7 +169,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) prune_packed_objects(show_only); remove_temporary_files(get_object_directory()); - s = xstrdup(mkpath("%s/pack", get_object_directory())); + s = mkpathdup("%s/pack", get_object_directory()); remove_temporary_files(s); free(s); return 0; diff --git a/builtin/push.c b/builtin/push.c index fdfcc6c716..db9ba30b08 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -11,7 +11,7 @@ #include "submodule.h" static const char * const push_usage[] = { - "git push [<options>] [<repository> [<refspec>...]]", + N_("git push [<options>] [<repository> [<refspec>...]]"), NULL, }; @@ -147,12 +147,37 @@ static void setup_push_upstream(struct remote *remote, int simple) add_refspec(refspec.buf); } +static char warn_unspecified_push_default_msg[] = +N_("push.default is unset; its implicit value is changing in\n" + "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" + "and maintain the current behavior after the default changes, use:\n" + "\n" + " git config --global push.default matching\n" + "\n" + "To squelch this message and adopt the new behavior now, use:\n" + "\n" + " git config --global push.default simple\n" + "\n" + "See 'git help config' and search for 'push.default' for further information.\n" + "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" + "'current' instead of 'simple' if you sometimes use older versions of Git)"); + +static void warn_unspecified_push_default_configuration(void) +{ + static int warn_once; + + if (warn_once++) + return; + warning("%s\n", _(warn_unspecified_push_default_msg)); +} + static void setup_default_push_refspecs(struct remote *remote) { switch (push_default) { default: case PUSH_DEFAULT_UNSPECIFIED: default_matching_used = 1; + warn_unspecified_push_default_configuration(); /* fallthru */ case PUSH_DEFAULT_MATCHING: add_refspec(":"); @@ -186,8 +211,8 @@ static const char message_advice_pull_before_push[] = static const char message_advice_use_upstream[] = N_("Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" - "specify branches to push or set the 'push.default' configuration\n" - "variable to 'current' or 'upstream' to push only the current branch."); + "specify branches to push or set the 'push.default' configuration variable\n" + "to 'simple', 'current' or 'upstream' to push only the current branch."); static const char message_advice_checkout_pull_push[] = N_("Updates were rejected because a pushed branch tip is behind its remote\n" @@ -354,25 +379,25 @@ int cmd_push(int argc, const char **argv, const char *prefix) const char *repo = NULL; /* default repository */ struct option options[] = { OPT__VERBOSITY(&verbosity), - OPT_STRING( 0 , "repo", &repo, "repository", "repository"), - OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL), - OPT_BIT( 0 , "mirror", &flags, "mirror all refs", + OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")), + OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL), + OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"), (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)), - OPT_BOOLEAN( 0, "delete", &deleterefs, "delete refs"), - OPT_BOOLEAN( 0 , "tags", &tags, "push tags (can't be used with --all or --mirror)"), - OPT_BIT('n' , "dry-run", &flags, "dry run", TRANSPORT_PUSH_DRY_RUN), - OPT_BIT( 0, "porcelain", &flags, "machine-readable output", TRANSPORT_PUSH_PORCELAIN), - OPT_BIT('f', "force", &flags, "force updates", TRANSPORT_PUSH_FORCE), - { OPTION_CALLBACK, 0, "recurse-submodules", &flags, "check", - "controls recursive pushing of submodules", + OPT_BOOLEAN( 0, "delete", &deleterefs, N_("delete refs")), + OPT_BOOLEAN( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")), + OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN), + OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN), + OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE), + { OPTION_CALLBACK, 0, "recurse-submodules", &flags, N_("check"), + N_("control recursive pushing of submodules"), PARSE_OPT_OPTARG, option_parse_recurse_submodules }, - OPT_BOOLEAN( 0 , "thin", &thin, "use thin pack"), - OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", "receive pack program"), - OPT_STRING( 0 , "exec", &receivepack, "receive-pack", "receive pack program"), - OPT_BIT('u', "set-upstream", &flags, "set upstream for git pull/status", + OPT_BOOLEAN( 0 , "thin", &thin, N_("use thin pack")), + OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")), + OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")), + OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"), TRANSPORT_PUSH_SET_UPSTREAM), - OPT_BOOL(0, "progress", &progress, "force progress reporting"), - OPT_BIT(0, "prune", &flags, "prune locally removed refs", + OPT_BOOL(0, "progress", &progress, N_("force progress reporting")), + OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"), TRANSPORT_PUSH_PRUNE), OPT_END() }; diff --git a/builtin/read-tree.c b/builtin/read-tree.c index df6c4c8819..042ac1b84f 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -33,7 +33,7 @@ static int list_tree(unsigned char *sha1) } static const char * const read_tree_usage[] = { - "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>]])", + N_("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>]])"), NULL }; @@ -104,37 +104,37 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) struct unpack_trees_options opts; int prefix_set = 0; const struct option read_tree_options[] = { - { OPTION_CALLBACK, 0, "index-output", NULL, "file", - "write resulting index to <file>", + { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"), + N_("write resulting index to <file>"), PARSE_OPT_NONEG, index_output_cb }, OPT_SET_INT(0, "empty", &read_empty, - "only empty the index", 1), - OPT__VERBOSE(&opts.verbose_update, "be verbose"), - OPT_GROUP("Merging"), + N_("only empty the index"), 1), + OPT__VERBOSE(&opts.verbose_update, N_("be verbose")), + OPT_GROUP(N_("Merging")), OPT_SET_INT('m', NULL, &opts.merge, - "perform a merge in addition to a read", 1), + N_("perform a merge in addition to a read"), 1), OPT_SET_INT(0, "trivial", &opts.trivial_merges_only, - "3-way merge if no file level merging required", 1), + N_("3-way merge if no file level merging required"), 1), OPT_SET_INT(0, "aggressive", &opts.aggressive, - "3-way merge in presence of adds and removes", 1), + N_("3-way merge in presence of adds and removes"), 1), OPT_SET_INT(0, "reset", &opts.reset, - "same as -m, but discard unmerged entries", 1), - { OPTION_STRING, 0, "prefix", &opts.prefix, "<subdirectory>/", - "read the tree into the index under <subdirectory>/", + N_("same as -m, but discard unmerged entries"), 1), + { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"), + N_("read the tree into the index under <subdirectory>/"), PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP }, OPT_SET_INT('u', NULL, &opts.update, - "update working tree with merge result", 1), + N_("update working tree with merge result"), 1), { OPTION_CALLBACK, 0, "exclude-per-directory", &opts, - "gitignore", - "allow explicitly ignored files to be overwritten", + N_("gitignore"), + N_("allow explicitly ignored files to be overwritten"), PARSE_OPT_NONEG, exclude_per_directory_cb }, OPT_SET_INT('i', NULL, &opts.index_only, - "don't check the working tree after merging", 1), - OPT__DRY_RUN(&opts.dry_run, "don't update the index or the work tree"), + N_("don't check the working tree after merging"), 1), + OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")), OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout, - "skip applying sparse checkout filter", 1), + N_("skip applying sparse checkout filter"), 1), OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack, - "debug unpack-trees", 1), + N_("debug unpack-trees"), 1), OPT_END() }; diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 0afb8b2896..ff781febca 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -12,6 +12,7 @@ #include "string-list.h" #include "sha1-array.h" #include "connected.h" +#include "version.h" static const char receive_pack_usage[] = "git receive-pack <git-dir>"; @@ -121,10 +122,11 @@ static void show_ref(const char *path, const unsigned char *sha1) if (sent_capabilities) packet_write(1, "%s %s\n", sha1_to_hex(sha1), path); else - packet_write(1, "%s %s%c%s%s\n", + packet_write(1, "%s %s%c%s%s agent=%s\n", sha1_to_hex(sha1), path, 0, " report-status delete-refs side-band-64k quiet", - prefer_ofs_delta ? " ofs-delta" : ""); + prefer_ofs_delta ? " ofs-delta" : "", + git_user_agent_sanitized()); sent_capabilities = 1; } @@ -478,7 +480,6 @@ static const char *update(struct command *cmd) !prefixcmp(name, "refs/heads/")) { struct object *old_object, *new_object; struct commit *old_commit, *new_commit; - struct commit_list *bases, *ent; old_object = parse_object(old_sha1); new_object = parse_object(new_sha1); @@ -491,12 +492,7 @@ static const char *update(struct command *cmd) } old_commit = (struct commit *)old_object; new_commit = (struct commit *)new_object; - bases = get_merge_bases(old_commit, new_commit, 1); - for (ent = bases; ent; ent = ent->next) - if (!hashcmp(old_sha1, ent->item->object.sha1)) - break; - free_commit_list(bases); - if (!ent) { + if (!in_merge_bases(old_commit, new_commit)) { rp_error("denying non-fast-forward %s" " (you should pull first)", name); return "non-fast-forward"; @@ -699,7 +695,7 @@ static void execute_commands(struct command *commands, const char *unpacker_erro if (unpacker_error) { for (cmd = commands; cmd; cmd = cmd->next) - cmd->error_string = "n/a (unpacker error)"; + cmd->error_string = "unpacker error"; return; } @@ -799,7 +795,7 @@ static const char *parse_pack_header(struct pack_header *hdr) static const char *pack_lockfile; -static const char *unpack(void) +static const char *unpack(int err_fd) { struct pack_header hdr; const char *hdr_err; @@ -819,6 +815,7 @@ static const char *unpack(void) if (ntohl(hdr.hdr_entries) < unpack_limit) { int code, i = 0; + struct child_process child; const char *unpacker[5]; unpacker[i++] = "unpack-objects"; if (quiet) @@ -827,7 +824,12 @@ static const char *unpack(void) unpacker[i++] = "--strict"; unpacker[i++] = hdr_arg; unpacker[i++] = NULL; - code = run_command_v_opt(unpacker, RUN_GIT_CMD); + memset(&child, 0, sizeof(child)); + child.argv = unpacker; + child.no_stdout = 1; + child.err = err_fd; + child.git_cmd = 1; + code = run_command(&child); if (!code) return NULL; return "unpack-objects abnormal exit"; @@ -852,6 +854,7 @@ static const char *unpack(void) memset(&ip, 0, sizeof(ip)); ip.argv = keeper; ip.out = -1; + ip.err = err_fd; ip.git_cmd = 1; status = start_command(&ip); if (status) { @@ -868,6 +871,26 @@ static const char *unpack(void) } } +static const char *unpack_with_sideband(void) +{ + struct async muxer; + const char *ret; + + if (!use_sideband) + return unpack(0); + + memset(&muxer, 0, sizeof(muxer)); + muxer.proc = copy_to_sideband; + muxer.in = -1; + if (start_async(&muxer)) + return NULL; + + ret = unpack(muxer.in); + + finish_async(&muxer); + return ret; +} + static void report(struct command *commands, const char *unpack_status) { struct command *cmd; @@ -965,7 +988,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) const char *unpack_status = NULL; if (!delete_only(commands)) - unpack_status = unpack(); + unpack_status = unpack_with_sideband(); execute_commands(commands, unpack_status); if (pack_lockfile) unlink_or_warn(pack_lockfile); @@ -977,7 +1000,8 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) const char *argv_gc_auto[] = { "gc", "--auto", "--quiet", NULL, }; - run_command_v_opt(argv_gc_auto, RUN_GIT_CMD); + int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR; + run_command_v_opt(argv_gc_auto, opt); } if (auto_update_server_info) update_server_info(0); diff --git a/builtin/remote.c b/builtin/remote.c index 920262d76e..a5a4b23231 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -8,66 +8,66 @@ #include "refs.h" static const char * const builtin_remote_usage[] = { - "git remote [-v | --verbose]", - "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>", - "git remote rename <old> <new>", - "git remote rm <name>", - "git remote set-head <name> (-a | -d | <branch>)", - "git remote [-v | --verbose] show [-n] <name>", - "git remote prune [-n | --dry-run] <name>", - "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]", - "git remote set-branches [--add] <name> <branch>...", - "git remote set-url [--push] <name> <newurl> [<oldurl>]", - "git remote set-url --add <name> <newurl>", - "git remote set-url --delete <name> <url>", + N_("git remote [-v | --verbose]"), + N_("git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>"), + N_("git remote rename <old> <new>"), + N_("git remote remove <name>"), + N_("git remote set-head <name> (-a | -d | <branch>)"), + N_("git remote [-v | --verbose] show [-n] <name>"), + N_("git remote prune [-n | --dry-run] <name>"), + N_("git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"), + N_("git remote set-branches [--add] <name> <branch>..."), + N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"), + N_("git remote set-url --add <name> <newurl>"), + N_("git remote set-url --delete <name> <url>"), NULL }; static const char * const builtin_remote_add_usage[] = { - "git remote add [<options>] <name> <url>", + N_("git remote add [<options>] <name> <url>"), NULL }; static const char * const builtin_remote_rename_usage[] = { - "git remote rename <old> <new>", + N_("git remote rename <old> <new>"), NULL }; static const char * const builtin_remote_rm_usage[] = { - "git remote rm <name>", + N_("git remote remove <name>"), NULL }; static const char * const builtin_remote_sethead_usage[] = { - "git remote set-head <name> (-a | -d | <branch>])", + N_("git remote set-head <name> (-a | -d | <branch>])"), NULL }; static const char * const builtin_remote_setbranches_usage[] = { - "git remote set-branches <name> <branch>...", - "git remote set-branches --add <name> <branch>...", + N_("git remote set-branches <name> <branch>..."), + N_("git remote set-branches --add <name> <branch>..."), NULL }; static const char * const builtin_remote_show_usage[] = { - "git remote show [<options>] <name>", + N_("git remote show [<options>] <name>"), NULL }; static const char * const builtin_remote_prune_usage[] = { - "git remote prune [<options>] <name>", + N_("git remote prune [<options>] <name>"), NULL }; static const char * const builtin_remote_update_usage[] = { - "git remote update [<options>] [<group> | <remote>]...", + N_("git remote update [<options>] [<group> | <remote>]..."), NULL }; static const char * const builtin_remote_seturl_usage[] = { - "git remote set-url [--push] <name> <newurl> [<oldurl>]", - "git remote set-url --add <name> <newurl>", - "git remote set-url --delete <name> <url>", + N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"), + N_("git remote set-url --add <name> <newurl>"), + N_("git remote set-url --delete <name> <url>"), NULL }; @@ -160,17 +160,17 @@ static int add(int argc, const char **argv) int i; struct option options[] = { - OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"), + OPT_BOOLEAN('f', "fetch", &fetch, N_("fetch the remote branches")), OPT_SET_INT(0, "tags", &fetch_tags, - "import all tags and associated objects when fetching", + N_("import all tags and associated objects when fetching"), TAGS_SET), OPT_SET_INT(0, NULL, &fetch_tags, - "or do not fetch any tag at all (--no-tags)", TAGS_UNSET), - OPT_STRING_LIST('t', "track", &track, "branch", - "branch(es) to track"), - OPT_STRING('m', "master", &master, "branch", "master branch"), - { OPTION_CALLBACK, 0, "mirror", &mirror, "push|fetch", - "set up remote as a mirror to push to or fetch from", + N_("or do not fetch any tag at all (--no-tags)"), TAGS_UNSET), + OPT_STRING_LIST('t', "track", &track, N_("branch"), + N_("branch(es) to track")), + OPT_STRING('m', "master", &master, N_("branch"), N_("master branch")), + { OPTION_CALLBACK, 0, "mirror", &mirror, N_("push|fetch"), + N_("set up remote as a mirror to push to or fetch from"), PARSE_OPT_OPTARG, parse_mirror_opt }, OPT_END() }; @@ -1088,7 +1088,7 @@ static int show(int argc, const char **argv) { int no_query = 0, result = 0, query_flag = 0; struct option options[] = { - OPT_BOOLEAN('n', NULL, &no_query, "do not query remotes"), + OPT_BOOLEAN('n', NULL, &no_query, N_("do not query remotes")), OPT_END() }; struct ref_states states; @@ -1196,9 +1196,9 @@ static int set_head(int argc, const char **argv) struct option options[] = { OPT_BOOLEAN('a', "auto", &opt_a, - "set refs/remotes/<name>/HEAD according to remote"), + N_("set refs/remotes/<name>/HEAD according to remote")), OPT_BOOLEAN('d', "delete", &opt_d, - "delete refs/remotes/<name>/HEAD"), + N_("delete refs/remotes/<name>/HEAD")), OPT_END() }; argc = parse_options(argc, argv, NULL, options, builtin_remote_sethead_usage, @@ -1250,7 +1250,7 @@ static int prune(int argc, const char **argv) { int dry_run = 0, result = 0; struct option options[] = { - OPT__DRY_RUN(&dry_run, "dry run"), + OPT__DRY_RUN(&dry_run, N_("dry run")), OPT_END() }; @@ -1318,7 +1318,7 @@ static int update(int argc, const char **argv) int i, prune = 0; struct option options[] = { OPT_BOOLEAN('p', "prune", &prune, - "prune remotes after fetching"), + N_("prune remotes after fetching")), OPT_END() }; const char **fetch_argv; @@ -1404,7 +1404,7 @@ static int set_branches(int argc, const char **argv) { int add_mode = 0; struct option options[] = { - OPT_BOOLEAN('\0', "add", &add_mode, "add branch"), + OPT_BOOLEAN('\0', "add", &add_mode, N_("add branch")), OPT_END() }; @@ -1433,11 +1433,11 @@ static int set_url(int argc, const char **argv) struct strbuf name_buf = STRBUF_INIT; struct option options[] = { OPT_BOOLEAN('\0', "push", &push_mode, - "manipulate push URLs"), + N_("manipulate push URLs")), OPT_BOOLEAN('\0', "add", &add_mode, - "add URL"), + N_("add URL")), OPT_BOOLEAN('\0', "delete", &delete_mode, - "delete URLs"), + N_("delete URLs")), OPT_END() }; argc = parse_options(argc, argv, NULL, options, builtin_remote_seturl_usage, @@ -1566,7 +1566,7 @@ static int show_all(void) int cmd_remote(int argc, const char **argv, const char *prefix) { struct option options[] = { - OPT__VERBOSE(&verbose, "be verbose; must be placed before a subcommand"), + OPT__VERBOSE(&verbose, N_("be verbose; must be placed before a subcommand")), OPT_END() }; int result; @@ -1580,7 +1580,7 @@ int cmd_remote(int argc, const char **argv, const char *prefix) result = add(argc, argv); else if (!strcmp(argv[0], "rename")) result = mv(argc, argv); - else if (!strcmp(argv[0], "rm")) + else if (!strcmp(argv[0], "rm") || !strcmp(argv[0], "remove")) result = rm(argc, argv); else if (!strcmp(argv[0], "set-head")) result = set_head(argc, argv); diff --git a/builtin/replace.c b/builtin/replace.c index 4a8970e9c9..e3aaf70203 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -14,9 +14,9 @@ #include "parse-options.h" static const char * const git_replace_usage[] = { - "git replace [-f] <object> <replacement>", - "git replace -d <object>...", - "git replace -l [<pattern>]", + N_("git replace [-f] <object> <replacement>"), + N_("git replace -d <object>..."), + N_("git replace -l [<pattern>]"), NULL }; @@ -115,9 +115,9 @@ int cmd_replace(int argc, const char **argv, const char *prefix) { int list = 0, delete = 0, force = 0; struct option options[] = { - OPT_BOOLEAN('l', NULL, &list, "list replace refs"), - OPT_BOOLEAN('d', NULL, &delete, "delete replace refs"), - OPT_BOOLEAN('f', NULL, &force, "replace the ref if it exists"), + OPT_BOOLEAN('l', NULL, &list, N_("list replace refs")), + OPT_BOOLEAN('d', NULL, &delete, N_("delete replace refs")), + OPT_BOOLEAN('f', NULL, &force, N_("replace the ref if it exists")), OPT_END() }; diff --git a/builtin/rerere.c b/builtin/rerere.c index 08213c7c0b..dc1708e6d6 100644 --- a/builtin/rerere.c +++ b/builtin/rerere.c @@ -8,7 +8,7 @@ #include "xdiff-interface.h" static const char * const rerere_usage[] = { - "git rerere [clear | forget path... | status | remaining | diff | gc]", + N_("git rerere [clear | forget path... | status | remaining | diff | gc]"), NULL, }; @@ -53,7 +53,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix) struct option options[] = { OPT_SET_INT(0, "rerere-autoupdate", &autoupdate, - "register clean resolutions in index", 1), + N_("register clean resolutions in index"), 1), OPT_END(), }; diff --git a/builtin/reset.c b/builtin/reset.c index 74442bd766..915cc9f86f 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -22,9 +22,9 @@ #include "cache-tree.h" static const char * const git_reset_usage[] = { - "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]", - "git reset [-q] <commit> [--] <paths>...", - "git reset --patch [<commit>] [--] [<paths>...]", + N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"), + N_("git reset [-q] <commit> [--] <paths>..."), + N_("git reset --patch [<commit>] [--] [<paths>...]"), NULL }; @@ -235,17 +235,17 @@ int cmd_reset(int argc, const char **argv, const char *prefix) struct commit *commit; struct strbuf msg = STRBUF_INIT; const struct option options[] = { - OPT__QUIET(&quiet, "be quiet, only report errors"), + OPT__QUIET(&quiet, N_("be quiet, only report errors")), OPT_SET_INT(0, "mixed", &reset_type, - "reset HEAD and index", MIXED), - OPT_SET_INT(0, "soft", &reset_type, "reset only HEAD", SOFT), + N_("reset HEAD and index"), MIXED), + OPT_SET_INT(0, "soft", &reset_type, N_("reset only HEAD"), SOFT), OPT_SET_INT(0, "hard", &reset_type, - "reset HEAD, index and working tree", HARD), + N_("reset HEAD, index and working tree"), HARD), OPT_SET_INT(0, "merge", &reset_type, - "reset HEAD, index and working tree", MERGE), + N_("reset HEAD, index and working tree"), MERGE), OPT_SET_INT(0, "keep", &reset_type, - "reset HEAD but keep local changes", KEEP), - OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"), + N_("reset HEAD but keep local changes"), KEEP), + OPT_BOOLEAN('p', "patch", &patch_mode, N_("select hunks interactively")), OPT_END() }; diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 32788a9f86..f267a1d3b5 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -230,6 +230,7 @@ static int try_difference(const char *arg) const char *next; const char *this; int symmetric; + static const char head_by_default[] = "HEAD"; if (!(dotdot = strstr(arg, ".."))) return 0; @@ -241,9 +242,20 @@ static int try_difference(const char *arg) next += symmetric; if (!*next) - next = "HEAD"; + next = head_by_default; if (dotdot == arg) - this = "HEAD"; + this = head_by_default; + + if (this == head_by_default && next == head_by_default && + !symmetric) { + /* + * Just ".."? That is not a range but the + * pathspec for the parent directory. + */ + *dotdot = '.'; + return 0; + } + if (!get_sha1_committish(this, sha1) && !get_sha1_committish(next, end)) { show_rev(NORMAL, end, next); show_rev(symmetric ? NORMAL : REVERSED, sha1, this); @@ -324,15 +336,15 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) { static int keep_dashdash = 0, stop_at_non_option = 0; static char const * const parseopt_usage[] = { - "git rev-parse --parseopt [options] -- [<args>...]", + N_("git rev-parse --parseopt [options] -- [<args>...]"), NULL }; static struct option parseopt_opts[] = { OPT_BOOLEAN(0, "keep-dashdash", &keep_dashdash, - "keep the `--` passed as an arg"), + N_("keep the `--` passed as an arg")), OPT_BOOLEAN(0, "stop-at-non-option", &stop_at_non_option, - "stop parsing after the " - "first non-option argument"), + N_("stop parsing after the " + "first non-option argument")), OPT_END(), }; @@ -449,11 +461,11 @@ static void die_no_single_rev(int quiet) } static const char builtin_rev_parse_usage[] = -"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."; +N_("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."); int cmd_rev_parse(int argc, const char **argv, const char *prefix) { diff --git a/builtin/revert.c b/builtin/revert.c index 82d1bf844b..c5e36b94c0 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -19,14 +19,14 @@ */ static const char * const revert_usage[] = { - "git revert [options] <commit-ish>", - "git revert <subcommand>", + N_("git revert [options] <commit-ish>"), + N_("git revert <subcommand>"), NULL }; static const char * const cherry_pick_usage[] = { - "git cherry-pick [options] <commit-ish>", - "git cherry-pick <subcommand>", + N_("git cherry-pick [options] <commit-ish>"), + N_("git cherry-pick <subcommand>"), NULL }; @@ -100,18 +100,19 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) int contin = 0; int rollback = 0; struct option options[] = { - OPT_BOOLEAN(0, "quit", &remove_state, "end revert or cherry-pick sequence"), - OPT_BOOLEAN(0, "continue", &contin, "resume revert or cherry-pick sequence"), - OPT_BOOLEAN(0, "abort", &rollback, "cancel revert or cherry-pick sequence"), - OPT_BOOLEAN('n', "no-commit", &opts->no_commit, "don't automatically commit"), - OPT_BOOLEAN('e', "edit", &opts->edit, "edit the commit message"), + OPT_BOOLEAN(0, "quit", &remove_state, N_("end revert or cherry-pick sequence")), + OPT_BOOLEAN(0, "continue", &contin, N_("resume revert or cherry-pick sequence")), + OPT_BOOLEAN(0, "abort", &rollback, N_("cancel revert or cherry-pick sequence")), + OPT_BOOLEAN('n', "no-commit", &opts->no_commit, N_("don't automatically commit")), + OPT_BOOLEAN('e', "edit", &opts->edit, N_("edit the commit message")), OPT_NOOP_NOARG('r', NULL), - OPT_BOOLEAN('s', "signoff", &opts->signoff, "add Signed-off-by:"), - OPT_INTEGER('m', "mainline", &opts->mainline, "parent number"), + OPT_BOOLEAN('s', "signoff", &opts->signoff, N_("add Signed-off-by:")), + OPT_INTEGER('m', "mainline", &opts->mainline, N_("parent number")), OPT_RERERE_AUTOUPDATE(&opts->allow_rerere_auto), - OPT_STRING(0, "strategy", &opts->strategy, "strategy", "merge strategy"), - OPT_CALLBACK('X', "strategy-option", &opts, "option", - "option for merge strategy", option_parse_x), + OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")), + OPT_CALLBACK('X', "strategy-option", &opts, N_("option"), + N_("option for merge strategy"), option_parse_x), + OPT_END(), OPT_END(), OPT_END(), OPT_END(), @@ -121,10 +122,11 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) if (opts->action == REPLAY_PICK) { struct option cp_extra[] = { - OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"), - OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"), - OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, "preserve initially empty commits"), - OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, "keep redundant, empty commits"), + OPT_BOOLEAN('x', NULL, &opts->record_origin, N_("append commit name")), + OPT_BOOLEAN(0, "ff", &opts->allow_ff, N_("allow fast-forward")), + OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, N_("preserve initially empty commits")), + OPT_BOOLEAN(0, "allow-empty-message", &opts->allow_empty_message, N_("allow commits with empty messages")), + OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, N_("keep redundant, empty commits")), OPT_END(), }; if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra)) @@ -193,7 +195,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) struct setup_revision_opt s_r_opt; opts->revs = xmalloc(sizeof(*opts->revs)); init_revisions(opts->revs, NULL); - opts->revs->no_walk = 1; + opts->revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED; if (argc < 2) usage_with_options(usage_str, options); memset(&s_r_opt, 0, sizeof(s_r_opt)); diff --git a/builtin/rm.c b/builtin/rm.c index 90c8a5047c..b384c4c3cf 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -11,7 +11,7 @@ #include "parse-options.h" static const char * const builtin_rm_usage[] = { - "git rm [options] [--] <file>...", + N_("git rm [options] [--] <file>..."), NULL }; @@ -130,13 +130,13 @@ static int show_only = 0, force = 0, index_only = 0, recursive = 0, quiet = 0; static int ignore_unmatch = 0; static struct option builtin_rm_options[] = { - OPT__DRY_RUN(&show_only, "dry run"), - OPT__QUIET(&quiet, "do not list removed files"), - OPT_BOOLEAN( 0 , "cached", &index_only, "only remove from the index"), - OPT__FORCE(&force, "override the up-to-date check"), - OPT_BOOLEAN('r', NULL, &recursive, "allow recursive removal"), + OPT__DRY_RUN(&show_only, N_("dry run")), + OPT__QUIET(&quiet, N_("do not list removed files")), + OPT_BOOLEAN( 0 , "cached", &index_only, N_("only remove from the index")), + OPT__FORCE(&force, N_("override the up-to-date check")), + OPT_BOOLEAN('r', NULL, &recursive, N_("allow recursive removal")), OPT_BOOLEAN( 0 , "ignore-unmatch", &ignore_unmatch, - "exit with a zero status even if nothing matched"), + N_("exit with a zero status even if nothing matched")), OPT_END(), }; diff --git a/builtin/send-pack.c b/builtin/send-pack.c index d5d7105ba2..7d05064218 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -8,6 +8,7 @@ #include "send-pack.h" #include "quote.h" #include "transport.h" +#include "version.h" static const char send_pack_usage[] = "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n" @@ -251,6 +252,7 @@ int send_pack(struct send_pack_args *args, int status_report = 0; int use_sideband = 0; int quiet_supported = 0; + int agent_supported = 0; unsigned cmds_sent = 0; int ret; struct async demux; @@ -266,6 +268,8 @@ int send_pack(struct send_pack_args *args, use_sideband = 1; if (server_supports("quiet")) quiet_supported = 1; + if (server_supports("agent")) + agent_supported = 1; if (!remote_refs) { fprintf(stderr, "No refs in common and none specified; doing nothing.\n" @@ -305,12 +309,17 @@ int send_pack(struct send_pack_args *args, char *new_hex = sha1_to_hex(ref->new_sha1); int quiet = quiet_supported && (args->quiet || !args->progress); - if (!cmds_sent && (status_report || use_sideband || args->quiet)) { - packet_buf_write(&req_buf, "%s %s %s%c%s%s%s", + if (!cmds_sent && (status_report || use_sideband || + quiet || agent_supported)) { + packet_buf_write(&req_buf, + "%s %s %s%c%s%s%s%s%s", old_hex, new_hex, ref->name, 0, status_report ? " report-status" : "", use_sideband ? " side-band-64k" : "", - quiet ? " quiet" : ""); + quiet ? " quiet" : "", + agent_supported ? " agent=" : "", + agent_supported ? git_user_agent_sanitized() : "" + ); } else packet_buf_write(&req_buf, "%s %s %s", diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 37f3193a33..b316cf37ca 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -10,9 +10,9 @@ #include "parse-options.h" static char const * const shortlog_usage[] = { - "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]", + N_("git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"), "", - "[rev-opts] are documented in git-rev-list(1)", + N_("[rev-opts] are documented in git-rev-list(1)"), NULL }; @@ -250,13 +250,13 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix) static const struct option options[] = { OPT_BOOLEAN('n', "numbered", &log.sort_by_number, - "sort output according to the number of commits per author"), + N_("sort output according to the number of commits per author")), OPT_BOOLEAN('s', "summary", &log.summary, - "Suppress commit descriptions, only provides commit count"), + N_("Suppress commit descriptions, only provides commit count")), OPT_BOOLEAN('e', "email", &log.email, - "Show the email address of each author"), - { OPTION_CALLBACK, 'w', NULL, &log, "w[,i1[,i2]]", - "Linewrap output", PARSE_OPT_OPTARG, &parse_wrap_args }, + N_("Show the email address of each author")), + { OPTION_CALLBACK, 'w', NULL, &log, N_("w[,i1[,i2]]"), + N_("Linewrap output"), PARSE_OPT_OPTARG, &parse_wrap_args }, OPT_END(), }; diff --git a/builtin/show-branch.c b/builtin/show-branch.c index a59e088cf5..d208fd6c68 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -6,8 +6,8 @@ #include "parse-options.h" static const char* show_branch_usage[] = { - "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>)...]", - "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]", + N_("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>)...]"), + N_("git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"), NULL }; @@ -648,36 +648,36 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) const char *reflog_base = NULL; struct option builtin_show_branch_options[] = { OPT_BOOLEAN('a', "all", &all_heads, - "show remote-tracking and local branches"), + N_("show remote-tracking and local branches")), OPT_BOOLEAN('r', "remotes", &all_remotes, - "show remote-tracking branches"), + N_("show remote-tracking branches")), OPT__COLOR(&showbranch_use_color, - "color '*!+-' corresponding to the branch"), - { OPTION_INTEGER, 0, "more", &extra, "n", - "show <n> more commits after the common ancestor", + N_("color '*!+-' corresponding to the branch")), + { OPTION_INTEGER, 0, "more", &extra, N_("n"), + N_("show <n> more commits after the common ancestor"), PARSE_OPT_OPTARG, NULL, (intptr_t)1 }, - OPT_SET_INT(0, "list", &extra, "synonym to more=-1", -1), - OPT_BOOLEAN(0, "no-name", &no_name, "suppress naming strings"), + OPT_SET_INT(0, "list", &extra, N_("synonym to more=-1"), -1), + OPT_BOOLEAN(0, "no-name", &no_name, N_("suppress naming strings")), OPT_BOOLEAN(0, "current", &with_current_branch, - "include the current branch"), + N_("include the current branch")), OPT_BOOLEAN(0, "sha1-name", &sha1_name, - "name commits with their object names"), + N_("name commits with their object names")), OPT_BOOLEAN(0, "merge-base", &merge_base, - "show possible merge bases"), + N_("show possible merge bases")), OPT_BOOLEAN(0, "independent", &independent, - "show refs unreachable from any other ref"), + N_("show refs unreachable from any other ref")), OPT_BOOLEAN(0, "topo-order", &lifo, - "show commits in topological order"), + N_("show commits in topological order")), OPT_BOOLEAN(0, "topics", &topics, - "show only commits not on the first branch"), + N_("show only commits not on the first branch")), OPT_SET_INT(0, "sparse", &dense, - "show merges reachable from only one tip", 0), + N_("show merges reachable from only one tip"), 0), OPT_SET_INT(0, "date-order", &lifo, - "show commits where no parent comes before its " - "children", 0), - { OPTION_CALLBACK, 'g', "reflog", &reflog_base, "<n>[,<base>]", - "show <n> most recent ref-log entries starting at " - "base", + N_("show commits where no parent comes before its " + "children"), 0), + { OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("<n>[,<base>]"), + N_("show <n> most recent ref-log entries starting at " + "base"), PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP, parse_reflog_param }, OPT_END() diff --git a/builtin/show-ref.c b/builtin/show-ref.c index 3911661900..4eb016d6e5 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -7,8 +7,8 @@ #include "parse-options.h" static const char * const show_ref_usage[] = { - "git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] ", - "git show-ref --exclude-existing[=pattern] < ref-list", + N_("git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "), + N_("git show-ref --exclude-existing[=pattern] < ref-list"), NULL }; @@ -179,26 +179,26 @@ static int help_callback(const struct option *opt, const char *arg, int unset) } static const struct option show_ref_options[] = { - OPT_BOOLEAN(0, "tags", &tags_only, "only show tags (can be combined with heads)"), - OPT_BOOLEAN(0, "heads", &heads_only, "only show heads (can be combined with tags)"), - OPT_BOOLEAN(0, "verify", &verify, "stricter reference checking, " - "requires exact ref path"), + OPT_BOOLEAN(0, "tags", &tags_only, N_("only show tags (can be combined with heads)")), + OPT_BOOLEAN(0, "heads", &heads_only, N_("only show heads (can be combined with tags)")), + OPT_BOOLEAN(0, "verify", &verify, N_("stricter reference checking, " + "requires exact ref path")), { OPTION_BOOLEAN, 'h', NULL, &show_head, NULL, - "show the HEAD reference", + N_("show the HEAD reference"), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, - OPT_BOOLEAN(0, "head", &show_head, "show the HEAD reference"), + OPT_BOOLEAN(0, "head", &show_head, N_("show the HEAD reference")), OPT_BOOLEAN('d', "dereference", &deref_tags, - "dereference tags into object IDs"), - { OPTION_CALLBACK, 's', "hash", &abbrev, "n", - "only show SHA1 hash using <n> digits", + N_("dereference tags into object IDs")), + { OPTION_CALLBACK, 's', "hash", &abbrev, N_("n"), + N_("only show SHA1 hash using <n> digits"), PARSE_OPT_OPTARG, &hash_callback }, OPT__ABBREV(&abbrev), OPT__QUIET(&quiet, - "do not print results to stdout (useful with --verify)"), + N_("do not print results to stdout (useful with --verify)")), { OPTION_CALLBACK, 0, "exclude-existing", &exclude_existing_arg, - "pattern", "show refs from stdin that aren't in local repository", + N_("pattern"), N_("show refs from stdin that aren't in local repository"), PARSE_OPT_OPTARG | PARSE_OPT_NONEG, exclude_existing_callback }, - { OPTION_CALLBACK, 0, "help-all", NULL, NULL, "show usage", + { OPTION_CALLBACK, 0, "help-all", NULL, NULL, N_("show usage"), PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback }, OPT_END() }; diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index 801d62ece5..9e92828b3a 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -4,7 +4,7 @@ #include "parse-options.h" static const char * const git_symbolic_ref_usage[] = { - "git symbolic-ref [options] name [ref]", + N_("git symbolic-ref [options] name [ref]"), NULL }; @@ -35,9 +35,9 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) const char *msg = NULL; struct option options[] = { OPT__QUIET(&quiet, - "suppress error message for non-symbolic (detached) refs"), - OPT_BOOL(0, "short", &shorten, "shorten ref output"), - OPT_STRING('m', NULL, &msg, "reason", "reason of the update"), + N_("suppress error message for non-symbolic (detached) refs")), + OPT_BOOL(0, "short", &shorten, N_("shorten ref output")), + OPT_STRING('m', NULL, &msg, N_("reason"), N_("reason of the update")), OPT_END(), }; diff --git a/builtin/tag.c b/builtin/tag.c index 7b1be85e48..9c3e0673d5 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -19,11 +19,11 @@ #include "column.h" static const char * const git_tag_usage[] = { - "git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]", - "git tag -d <tagname>...", - "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] " - "\n\t\t[<pattern>...]", - "git tag -v <tagname>...", + N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"), + N_("git tag -d <tagname>..."), + N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] " + "\n\t\t[<pattern>...]"), + N_("git tag -v <tagname>..."), NULL }; @@ -444,37 +444,37 @@ int cmd_tag(int argc, const char **argv, const char *prefix) struct msg_arg msg = { 0, STRBUF_INIT }; struct commit_list *with_commit = NULL; struct option options[] = { - OPT_BOOLEAN('l', "list", &list, "list tag names"), - { OPTION_INTEGER, 'n', NULL, &lines, "n", - "print <n> lines of each tag message", + OPT_BOOLEAN('l', "list", &list, N_("list tag names")), + { OPTION_INTEGER, 'n', NULL, &lines, N_("n"), + N_("print <n> lines of each tag message"), PARSE_OPT_OPTARG, NULL, 1 }, - OPT_BOOLEAN('d', "delete", &delete, "delete tags"), - OPT_BOOLEAN('v', "verify", &verify, "verify tags"), + OPT_BOOLEAN('d', "delete", &delete, N_("delete tags")), + OPT_BOOLEAN('v', "verify", &verify, N_("verify tags")), - OPT_GROUP("Tag creation options"), + OPT_GROUP(N_("Tag creation options")), OPT_BOOLEAN('a', "annotate", &annotate, - "annotated tag, needs a message"), - OPT_CALLBACK('m', "message", &msg, "message", - "tag message", parse_msg_arg), - OPT_FILENAME('F', "file", &msgfile, "read message from file"), - OPT_BOOLEAN('s', "sign", &opt.sign, "annotated and GPG-signed tag"), - OPT_STRING(0, "cleanup", &cleanup_arg, "mode", - "how to strip spaces and #comments from message"), - OPT_STRING('u', "local-user", &keyid, "key-id", - "use another key to sign the tag"), - OPT__FORCE(&force, "replace the tag if exists"), - OPT_COLUMN(0, "column", &colopts, "show tag list in columns"), - - OPT_GROUP("Tag listing options"), + N_("annotated tag, needs a message")), + OPT_CALLBACK('m', "message", &msg, N_("message"), + N_("tag message"), parse_msg_arg), + OPT_FILENAME('F', "file", &msgfile, N_("read message from file")), + OPT_BOOLEAN('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")), + OPT_STRING(0, "cleanup", &cleanup_arg, N_("mode"), + N_("how to strip spaces and #comments from message")), + OPT_STRING('u', "local-user", &keyid, N_("key id"), + N_("use another key to sign the tag")), + OPT__FORCE(&force, N_("replace the tag if exists")), + OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")), + + OPT_GROUP(N_("Tag listing options")), { - OPTION_CALLBACK, 0, "contains", &with_commit, "commit", - "print only tags that contain the commit", + OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"), + N_("print only tags that contain the commit"), PARSE_OPT_LASTARG_DEFAULT, parse_opt_with_commit, (intptr_t)"HEAD", }, { - OPTION_CALLBACK, 0, "points-at", NULL, "object", - "print only tags of the object", 0, parse_opt_points_at + OPTION_CALLBACK, 0, "points-at", NULL, N_("object"), + N_("print only tags of the object"), 0, parse_opt_points_at }, OPT_END() }; diff --git a/builtin/update-index.c b/builtin/update-index.c index 4ce341ceeb..74986bf163 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -398,7 +398,7 @@ static void read_index_info(int line_termination) } static const char * const update_index_usage[] = { - "git update-index [options] [--] [<file>...]", + N_("git update-index [options] [--] [<file>...]"), NULL }; @@ -714,83 +714,83 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) int parseopt_state = PARSE_OPT_UNKNOWN; struct option options[] = { OPT_BIT('q', NULL, &refresh_args.flags, - "continue refresh even when index needs update", + N_("continue refresh even when index needs update"), REFRESH_QUIET), OPT_BIT(0, "ignore-submodules", &refresh_args.flags, - "refresh: ignore submodules", + N_("refresh: ignore submodules"), REFRESH_IGNORE_SUBMODULES), OPT_SET_INT(0, "add", &allow_add, - "do not ignore new files", 1), + N_("do not ignore new files"), 1), OPT_SET_INT(0, "replace", &allow_replace, - "let files replace directories and vice-versa", 1), + N_("let files replace directories and vice-versa"), 1), OPT_SET_INT(0, "remove", &allow_remove, - "notice files missing from worktree", 1), + N_("notice files missing from worktree"), 1), OPT_BIT(0, "unmerged", &refresh_args.flags, - "refresh even if index contains unmerged entries", + N_("refresh even if index contains unmerged entries"), REFRESH_UNMERGED), {OPTION_CALLBACK, 0, "refresh", &refresh_args, NULL, - "refresh stat information", + N_("refresh stat information"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, refresh_callback}, {OPTION_CALLBACK, 0, "really-refresh", &refresh_args, NULL, - "like --refresh, but ignore assume-unchanged setting", + N_("like --refresh, but ignore assume-unchanged setting"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, really_refresh_callback}, {OPTION_LOWLEVEL_CALLBACK, 0, "cacheinfo", NULL, - "<mode> <object> <path>", - "add the specified entry to the index", + N_("<mode> <object> <path>"), + N_("add the specified entry to the index"), PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */ PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP, (parse_opt_cb *) cacheinfo_callback}, - {OPTION_CALLBACK, 0, "chmod", &set_executable_bit, "(+/-)x", - "override the executable bit of the listed files", + {OPTION_CALLBACK, 0, "chmod", &set_executable_bit, N_("(+/-)x"), + N_("override the executable bit of the listed files"), PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP, chmod_callback}, {OPTION_SET_INT, 0, "assume-unchanged", &mark_valid_only, NULL, - "mark files as \"not changing\"", + N_("mark files as \"not changing\""), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG}, {OPTION_SET_INT, 0, "no-assume-unchanged", &mark_valid_only, NULL, - "clear assumed-unchanged bit", + N_("clear assumed-unchanged bit"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG}, {OPTION_SET_INT, 0, "skip-worktree", &mark_skip_worktree_only, NULL, - "mark files as \"index-only\"", + N_("mark files as \"index-only\""), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG}, {OPTION_SET_INT, 0, "no-skip-worktree", &mark_skip_worktree_only, NULL, - "clear skip-worktree bit", + N_("clear skip-worktree bit"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG}, OPT_SET_INT(0, "info-only", &info_only, - "add to index only; do not add content to object database", 1), + N_("add to index only; do not add content to object database"), 1), OPT_SET_INT(0, "force-remove", &force_remove, - "remove named paths even if present in worktree", 1), + N_("remove named paths even if present in worktree"), 1), OPT_SET_INT('z', NULL, &line_termination, - "with --stdin: input lines are terminated by null bytes", '\0'), + N_("with --stdin: input lines are terminated by null bytes"), '\0'), {OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL, - "read list of paths to be updated from standard input", + N_("read list of paths to be updated from standard input"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_callback}, {OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &line_termination, NULL, - "add entries from standard input to the index", + N_("add entries from standard input to the index"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_cacheinfo_callback}, {OPTION_LOWLEVEL_CALLBACK, 0, "unresolve", &has_errors, NULL, - "repopulate stages #2 and #3 for the listed paths", + N_("repopulate stages #2 and #3 for the listed paths"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) unresolve_callback}, {OPTION_LOWLEVEL_CALLBACK, 'g', "again", &has_errors, NULL, - "only update entries that differ from HEAD", + N_("only update entries that differ from HEAD"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) reupdate_callback}, OPT_BIT(0, "ignore-missing", &refresh_args.flags, - "ignore files missing from worktree", + N_("ignore files missing from worktree"), REFRESH_IGNORE_MISSING), OPT_SET_INT(0, "verbose", &verbose, - "report actions to standard output", 1), + N_("report actions to standard output"), 1), {OPTION_CALLBACK, 0, "clear-resolve-undo", NULL, NULL, - "(for porcelains) forget saved unresolved conflicts", + N_("(for porcelains) forget saved unresolved conflicts"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, resolve_undo_clear_callback}, OPT_INTEGER(0, "index-version", &preferred_index_format, - "write index in this format"), + N_("write index in this format")), OPT_END() }; diff --git a/builtin/update-ref.c b/builtin/update-ref.c index 835c62ab15..51d2684859 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -4,8 +4,8 @@ #include "parse-options.h" static const char * const git_update_ref_usage[] = { - "git update-ref [options] -d <refname> [<oldval>]", - "git update-ref [options] <refname> <newval> [<oldval>]", + N_("git update-ref [options] -d <refname> [<oldval>]"), + N_("git update-ref [options] <refname> <newval> [<oldval>]"), NULL }; @@ -15,10 +15,10 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix) unsigned char sha1[20], oldsha1[20]; int delete = 0, no_deref = 0, flags = 0; struct option options[] = { - OPT_STRING( 'm', NULL, &msg, "reason", "reason of the update"), - OPT_BOOLEAN('d', NULL, &delete, "deletes the reference"), + OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")), + OPT_BOOLEAN('d', NULL, &delete, N_("delete the reference")), OPT_BOOLEAN( 0 , "no-deref", &no_deref, - "update <refname> not the one it points to"), + N_("update <refname> not the one it points to")), OPT_END(), }; diff --git a/builtin/update-server-info.c b/builtin/update-server-info.c index 0d63c4498c..6c8cc3edc1 100644 --- a/builtin/update-server-info.c +++ b/builtin/update-server-info.c @@ -3,7 +3,7 @@ #include "parse-options.h" static const char * const update_server_info_usage[] = { - "git update-server-info [--force]", + N_("git update-server-info [--force]"), NULL }; @@ -11,7 +11,7 @@ int cmd_update_server_info(int argc, const char **argv, const char *prefix) { int force = 0; struct option options[] = { - OPT__FORCE(&force, "update the info files from scratch"), + OPT__FORCE(&force, N_("update the info files from scratch")), OPT_END() }; diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c index e841b4a38d..66cd2df0f8 100644 --- a/builtin/verify-pack.c +++ b/builtin/verify-pack.c @@ -53,7 +53,7 @@ static int verify_one_pack(const char *path, unsigned int flags) } static const char * const verify_pack_usage[] = { - "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>...", + N_("git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."), NULL }; @@ -63,9 +63,9 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix) unsigned int flags = 0; int i; const struct option verify_pack_options[] = { - OPT_BIT('v', "verbose", &flags, "verbose", + OPT_BIT('v', "verbose", &flags, N_("verbose"), VERIFY_PACK_VERBOSE), - OPT_BIT('s', "stat-only", &flags, "show statistics only", + OPT_BIT('s', "stat-only", &flags, N_("show statistics only"), VERIFY_PACK_STAT_ONLY), OPT_END() }; diff --git a/builtin/verify-tag.c b/builtin/verify-tag.c index 986789f706..a8eee886a5 100644 --- a/builtin/verify-tag.c +++ b/builtin/verify-tag.c @@ -14,7 +14,7 @@ #include "gpg-interface.h" static const char * const verify_tag_usage[] = { - "git verify-tag [-v|--verbose] <tag>...", + N_("git verify-tag [-v|--verbose] <tag>..."), NULL }; @@ -70,7 +70,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix) { int i = 1, verbose = 0, had_error = 0; const struct option verify_tag_options[] = { - OPT__VERBOSE(&verbose, "print tag contents"), + OPT__VERBOSE(&verbose, N_("print tag contents")), OPT_END() }; diff --git a/builtin/write-tree.c b/builtin/write-tree.c index b223af416f..084c0df783 100644 --- a/builtin/write-tree.c +++ b/builtin/write-tree.c @@ -10,7 +10,7 @@ #include "parse-options.h" static const char * const write_tree_usage[] = { - "git write-tree [--missing-ok] [--prefix=<prefix>/]", + N_("git write-tree [--missing-ok] [--prefix=<prefix>/]"), NULL }; @@ -21,13 +21,13 @@ int cmd_write_tree(int argc, const char **argv, const char *unused_prefix) unsigned char sha1[20]; const char *me = "git-write-tree"; struct option write_tree_options[] = { - OPT_BIT(0, "missing-ok", &flags, "allow missing objects", + OPT_BIT(0, "missing-ok", &flags, N_("allow missing objects"), WRITE_TREE_MISSING_OK), - { OPTION_STRING, 0, "prefix", &prefix, "<prefix>/", - "write tree object for a subdirectory <prefix>" , + { OPTION_STRING, 0, "prefix", &prefix, N_("<prefix>/"), + N_("write tree object for a subdirectory <prefix>") , PARSE_OPT_LITERAL_ARGHELP }, { OPTION_BIT, 0, "ignore-cache-tree", &flags, NULL, - "only useful for debugging", + N_("only useful for debugging"), PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, NULL, WRITE_TREE_IGNORE_CACHE_TREE }, OPT_END() @@ -442,7 +442,6 @@ extern int discard_index(struct index_state *); extern int unmerged_index(const struct index_state *); extern int verify_path(const char *path); extern struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int igncase); -extern int index_name_stage_pos(const struct index_state *, const char *name, int namelen, int stage); extern int index_name_pos(const struct index_state *, const char *name, int namelen); #define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */ #define ADD_CACHE_OK_TO_REPLACE 2 /* Ok to replace file/directory */ @@ -902,9 +901,7 @@ extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); extern const char *fmt_name(const char *name, const char *email); -extern const char *ident_default_name(void); extern const char *ident_default_email(void); -extern const char *ident_default_date(void); extern const char *git_editor(void); extern const char *git_pager(int stdout_is_tty); extern int git_ident_config(const char *, const char *, void *); @@ -947,9 +944,7 @@ struct cache_def { extern int has_symlink_leading_path(const char *name, int len); extern int threaded_has_symlink_leading_path(struct cache_def *, const char *, int); extern int check_leading_path(const char *name, int len); -extern int threaded_check_leading_path(struct cache_def *cache, const char *name, int len); extern int has_dirs_only_path(const char *name, int len, int prefix_len); -extern int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len); extern void schedule_dir_for_removal(const char *name, int len); extern void remove_scheduled_dirs(void); @@ -1038,7 +1033,9 @@ struct extra_have_objects { }; extern struct ref **get_remote_heads(int in, struct ref **list, unsigned int flags, struct extra_have_objects *); extern int server_supports(const char *feature); -extern const char *parse_feature_request(const char *features, const char *feature); +extern int parse_feature_request(const char *features, const char *feature); +extern const char *server_feature_value(const char *feature, int *len_ret); +extern const char *parse_feature_value(const char *feature_list, const char *feature, int *len_ret); extern struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path); @@ -1108,6 +1105,7 @@ extern int update_server_info(int); #define CONFIG_NO_WRITE 4 #define CONFIG_NOTHING_SET 5 #define CONFIG_INVALID_PATTERN 6 +#define CONFIG_GENERIC_ERROR 7 typedef int (*config_fn_t)(const char *, const char *, void *); extern int git_default_config(const char *, const char *, void *); @@ -1205,7 +1203,6 @@ extern void alloc_report(void); /* trace.c */ __attribute__((format (printf, 1, 2))) extern void trace_printf(const char *format, ...); -extern void trace_vprintf(const char *key, const char *format, va_list ap); __attribute__((format (printf, 2, 3))) extern void trace_argv_printf(const char **argv, const char *format, ...); extern void trace_repo_setup(const char *prefix); diff --git a/combine-diff.c b/combine-diff.c index 9786680368..bb1cc96c4e 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -111,7 +111,7 @@ static char *grab_blob(const unsigned char *sha1, unsigned int mode, return xcalloc(1, 1); } else if (textconv) { struct diff_filespec *df = alloc_filespec(path); - fill_filespec(df, sha1, mode); + fill_filespec(df, sha1, 1, mode); *size = fill_textconv(textconv, df, &blob); free_filespec(df); } else { @@ -823,7 +823,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, &result_size, NULL, NULL); } else if (textconv) { struct diff_filespec *df = alloc_filespec(elem->path); - fill_filespec(df, null_sha1, st.st_mode); + fill_filespec(df, null_sha1, 0, st.st_mode); result_size = fill_textconv(textconv, df, &result); free_filespec(df); } else if (0 <= (fd = open(elem->path, O_RDONLY))) { diff --git a/command-list.txt b/command-list.txt index ec64cacf06..7e8cfec29d 100644 --- a/command-list.txt +++ b/command-list.txt @@ -26,6 +26,8 @@ git-commit-tree plumbingmanipulators git-config ancillarymanipulators git-count-objects ancillaryinterrogators git-credential purehelpers +git-credential-cache purehelpers +git-credential-store purehelpers git-cvsexportcommit foreignscminterface git-cvsimport foreignscminterface git-cvsserver foreignscminterface @@ -114,6 +116,7 @@ git-show mainporcelain common git-show-branch ancillaryinterrogators git-show-index plumbinginterrogators git-show-ref plumbinginterrogators +git-sh-i18n purehelpers git-sh-setup purehelpers git-stash mainporcelain git-status mainporcelain common @@ -9,6 +9,8 @@ #include "gpg-interface.h" #include "mergesort.h" +static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); + int save_commit_buffer = 1; const char *commit_type = "commit"; @@ -607,30 +609,17 @@ static struct commit *interesting(struct commit_list *list) return NULL; } -static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos) +/* 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; struct commit_list *result = NULL; int i; - for (i = 0; i < n; i++) { - if (one == twos[i]) - /* - * We do not mark this even with RESULT so we do not - * have to clean it up. - */ - return commit_list_insert(one, &result); - } - - if (parse_commit(one)) - return NULL; - for (i = 0; i < n; i++) { - if (parse_commit(twos[i])) - return NULL; - } - 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); @@ -669,9 +658,34 @@ static struct commit_list *merge_bases_many(struct commit *one, int n, struct co } } - /* Clean up the result to remove stale ones */ free_commit_list(list); - list = result; result = NULL; + return result; +} + +static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos) +{ + struct commit_list *list = NULL; + struct commit_list *result = NULL; + int i; + + for (i = 0; i < n; i++) { + if (one == twos[i]) + /* + * We do not mark this even with RESULT so we do not + * have to clean it up. + */ + return commit_list_insert(one, &result); + } + + if (parse_commit(one)) + return NULL; + for (i = 0; i < n; i++) { + if (parse_commit(twos[i])) + return NULL; + } + + list = paint_down_to_common(one, n, twos); + while (list) { struct commit_list *next = list->next; if (!(list->item->object.flags & STALE)) @@ -709,6 +723,62 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in) return ret; } +static int remove_redundant(struct commit **array, int cnt) +{ + /* + * Some commit in the array may be an ancestor of + * another commit. Move such commit to the end of + * the array, and return the number of commits that + * are independent from each other. + */ + struct commit **work; + unsigned char *redundant; + int *filled_index; + int i, j, filled; + + work = xcalloc(cnt, sizeof(*work)); + 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; + + if (redundant[i]) + continue; + for (j = filled = 0; j < cnt; j++) { + if (i == j || redundant[j]) + continue; + filled_index[filled] = j; + work[filled++] = array[j]; + } + common = paint_down_to_common(array[i], filled, work); + if (array[i]->object.flags & PARENT2) + redundant[i] = 1; + for (j = 0; j < filled; j++) + if (work[j]->object.flags & PARENT1) + redundant[filled_index[j]] = 1; + clear_commit_marks(array[i], all_flags); + for (j = 0; j < filled; j++) + clear_commit_marks(work[j], all_flags); + free_commit_list(common); + } + + /* Now collect the result */ + memcpy(work, array, sizeof(*array) * cnt); + for (i = filled = 0; i < cnt; i++) + if (!redundant[i]) + array[filled++] = work[i]; + for (j = filled, i = 0; i < cnt; i++) + if (redundant[i]) + array[j++] = work[i]; + free(work); + free(redundant); + free(filled_index); + return filled; +} + struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, @@ -717,7 +787,7 @@ struct commit_list *get_merge_bases_many(struct commit *one, struct commit_list *list; struct commit **rslt; struct commit_list *result; - int cnt, i, j; + int cnt, i; result = merge_bases_many(one, n, twos); for (i = 0; i < n; i++) { @@ -748,28 +818,11 @@ struct commit_list *get_merge_bases_many(struct commit *one, clear_commit_marks(one, all_flags); for (i = 0; i < n; i++) clear_commit_marks(twos[i], all_flags); - for (i = 0; i < cnt - 1; i++) { - for (j = i+1; j < cnt; j++) { - if (!rslt[i] || !rslt[j]) - continue; - result = merge_bases_many(rslt[i], 1, &rslt[j]); - clear_commit_marks(rslt[i], all_flags); - clear_commit_marks(rslt[j], all_flags); - for (list = result; list; list = list->next) { - if (rslt[i] == list->item) - rslt[i] = NULL; - if (rslt[j] == list->item) - rslt[j] = NULL; - } - } - } - /* Surviving ones in rslt[] are the independent results */ + cnt = remove_redundant(rslt, cnt); result = NULL; - for (i = 0; i < cnt; i++) { - if (rslt[i]) - commit_list_insert_by_date(rslt[i], &result); - } + for (i = 0; i < cnt; i++) + commit_list_insert_by_date(rslt[i], &result); free(rslt); return result; } @@ -780,6 +833,9 @@ struct commit_list *get_merge_bases(struct commit *one, struct commit *two, return get_merge_bases_many(one, 1, &two, cleanup); } +/* + * Is "commit" a decendant of one of the elements on the "with_commit" list? + */ int is_descendant_of(struct commit *commit, struct commit_list *with_commit) { if (!with_commit) @@ -789,28 +845,28 @@ int is_descendant_of(struct commit *commit, struct commit_list *with_commit) other = with_commit->item; with_commit = with_commit->next; - if (in_merge_bases(other, &commit, 1)) + if (in_merge_bases(other, commit)) return 1; } return 0; } -int in_merge_bases(struct commit *commit, struct commit **reference, int num) +/* + * Is "commit" an ancestor of (i.e. reachable from) the "reference"? + */ +int in_merge_bases(struct commit *commit, struct commit *reference) { - struct commit_list *bases, *b; + struct commit_list *bases; int ret = 0; - if (num == 1) - bases = get_merge_bases(commit, *reference, 1); - else - die("not yet"); - for (b = bases; b; b = b->next) { - if (!hashcmp(commit->object.sha1, b->item->object.sha1)) { - ret = 1; - break; - } - } + if (parse_commit(commit) || parse_commit(reference)) + return ret; + bases = paint_down_to_common(commit, 1, &reference); + if (commit->object.flags & PARENT2) + ret = 1; + clear_commit_marks(commit, all_flags); + clear_commit_marks(reference, all_flags); free_commit_list(bases); return ret; } @@ -819,51 +875,31 @@ struct commit_list *reduce_heads(struct commit_list *heads) { struct commit_list *p; struct commit_list *result = NULL, **tail = &result; - struct commit **other; - size_t num_head, num_other; + struct commit **array; + int num_head, i; if (!heads) return NULL; - /* Avoid unnecessary reallocations */ - for (p = heads, num_head = 0; p; p = p->next) - num_head++; - other = xcalloc(sizeof(*other), num_head); - - /* For each commit, see if it can be reached by others */ - for (p = heads; p; p = p->next) { - struct commit_list *q, *base; - - /* Do we already have this in the result? */ - for (q = result; q; q = q->next) - if (p->item == q->item) - break; - if (q) + /* Uniquify */ + for (p = heads; p; p = p->next) + p->item->object.flags &= ~STALE; + for (p = heads, num_head = 0; p; p = p->next) { + if (p->item->object.flags & STALE) continue; - - num_other = 0; - for (q = heads; q; q = q->next) { - if (p->item == q->item) - continue; - other[num_other++] = q->item; + p->item->object.flags |= STALE; + num_head++; + } + array = xcalloc(sizeof(*array), num_head); + for (p = heads, i = 0; p; p = p->next) { + if (p->item->object.flags & STALE) { + array[i++] = p->item; + p->item->object.flags &= ~STALE; } - if (num_other) - base = get_merge_bases_many(p->item, num_other, other, 1); - else - base = NULL; - /* - * If p->item does not have anything common with other - * commits, there won't be any merge base. If it is - * reachable from some of the others, p->item will be - * the merge base. If its history is connected with - * others, but p->item is not reachable by others, we - * will get something other than p->item back. - */ - if (!base || (base->item != p->item)) - tail = &(commit_list_insert(p->item, tail)->next); - free_commit_list(base); } - free(other); + num_head = remove_redundant(array, num_head); + for (i = 0; i < num_head; i++) + tail = &commit_list_insert(array[i], tail)->next; return result; } @@ -1044,8 +1080,9 @@ static int excluded_header_field(const char *field, size_t len, const char **exc return 0; } -struct commit_extra_header *read_commit_extra_header_lines(const char *buffer, size_t size, - const char **exclude) +static struct commit_extra_header *read_commit_extra_header_lines( + const char *buffer, size_t size, + const char **exclude) { struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL; const char *line, *next, *eof, *eob; @@ -1112,8 +1149,92 @@ int commit_tree(const struct strbuf *msg, unsigned char *tree, return result; } +static int find_invalid_utf8(const char *buf, int len) +{ + int offset = 0; + + while (len) { + unsigned char c = *buf++; + int bytes, bad_offset; + + len--; + offset++; + + /* Simple US-ASCII? No worries. */ + if (c < 0x80) + continue; + + bad_offset = offset-1; + + /* + * Count how many more high bits set: that's how + * many more bytes this sequence should have. + */ + bytes = 0; + while (c & 0x40) { + c <<= 1; + bytes++; + } + + /* Must be between 1 and 5 more bytes */ + if (bytes < 1 || bytes > 5) + return bad_offset; + + /* Do we *have* that many bytes? */ + if (len < bytes) + return bad_offset; + + offset += bytes; + len -= bytes; + + /* And verify that they are good continuation bytes */ + do { + if ((*buf++ & 0xc0) != 0x80) + return bad_offset; + } while (--bytes); + + /* We could/should check the value and length here too */ + } + return -1; +} + +/* + * This verifies that the buffer is in proper utf8 format. + * + * If it isn't, it assumes any non-utf8 characters are Latin1, + * and does the conversion. + * + * Fixme: we should probably also disallow overlong forms and + * invalid characters. But we don't do that currently. + */ +static int verify_utf8(struct strbuf *buf) +{ + int ok = 1; + long pos = 0; + + for (;;) { + int bad; + unsigned char c; + unsigned char replace[2]; + + bad = find_invalid_utf8(buf->buf + pos, buf->len - pos); + if (bad < 0) + return ok; + pos += bad; + ok = 0; + c = buf->buf[pos]; + strbuf_remove(buf, pos, 1); + + /* We know 'c' must be in the range 128-255 */ + replace[0] = 0xc0 + (c >> 6); + replace[1] = 0x80 + (c & 0x3f); + strbuf_insert(buf, pos, replace, 2); + pos += 2; + } +} + static const char commit_utf8_warn[] = -"Warning: commit message does not conform to UTF-8.\n" +"Warning: commit message did not conform to UTF-8.\n" "You may want to amend it after fixing the message, or set the config\n" "variable i18n.commitencoding to the encoding your project uses.\n"; @@ -1170,7 +1291,7 @@ int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, strbuf_addbuf(&buffer, msg); /* And check the encoding */ - if (encoding_is_utf8 && !is_utf8(buffer.buf)) + if (encoding_is_utf8 && !verify_utf8(&buffer)) fprintf(stderr, commit_utf8_warn); if (sign_commit && do_sign_commit(&buffer, sign_commit)) @@ -171,7 +171,7 @@ extern struct commit_list *get_shallow_commits(struct object_array *heads, int depth, int shallow_flag, int not_shallow_flag); int is_descendant_of(struct commit *, struct commit_list *); -int in_merge_bases(struct commit *, struct commit **, int); +int in_merge_bases(struct commit *, struct commit *); extern int interactive_add(int argc, const char **argv, const char *prefix, int patch); extern int run_add_interactive(const char *revision, const char *patch_mode, @@ -204,7 +204,6 @@ extern int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, struct commit_extra_header *); extern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **); -extern struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); extern void free_commit_extra_headers(struct commit_extra_header *extra); diff --git a/compat/mkdir.c b/compat/mkdir.c new file mode 100644 index 0000000000..9e253fb72f --- /dev/null +++ b/compat/mkdir.c @@ -0,0 +1,24 @@ +#include "../git-compat-util.h" +#undef mkdir + +/* for platforms that can't deal with a trailing '/' */ +int compat_mkdir_wo_trailing_slash(const char *dir, mode_t mode) +{ + int retval; + char *tmp_dir = NULL; + size_t len = strlen(dir); + + if (len && dir[len-1] == '/') { + if ((tmp_dir = strdup(dir)) == NULL) + return -1; + tmp_dir[len-1] = '\0'; + } + else + tmp_dir = (char *)dir; + + retval = mkdir(tmp_dir, mode); + if (tmp_dir != dir) + free(tmp_dir); + + return retval; +} diff --git a/compat/win32/poll.c b/compat/poll/poll.c index 403eaa7a3c..7d226ecb29 100644 --- a/compat/win32/poll.c +++ b/compat/poll/poll.c @@ -24,7 +24,9 @@ # pragma GCC diagnostic ignored "-Wtype-limits" #endif -#include <malloc.h> +#if defined(WIN32) +# include <malloc.h> +#endif #include <sys/types.h> @@ -48,7 +50,9 @@ #else # include <sys/time.h> # include <sys/socket.h> -# include <sys/select.h> +# ifndef NO_SYS_SELECT_H +# include <sys/select.h> +# endif # include <unistd.h> #endif @@ -302,6 +306,10 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds) || socket_errno == ECONNABORTED || socket_errno == ENETRESET) happened |= POLLHUP; + /* some systems can't use recv() on non-socket, including HP NonStop */ + else if (/* (r == -1) && */ socket_errno == ENOTSOCK) + happened |= (POLLIN | POLLRDNORM) & sought; + else happened |= POLLERR; } @@ -349,7 +357,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout) /* EFAULT is not necessary to implement, but let's do it in the simplest case. */ - if (!pfd) + if (!pfd && nfd) { errno = EFAULT; return -1; diff --git a/compat/win32/poll.h b/compat/poll/poll.h index b7aa59d973..b7aa59d973 100644 --- a/compat/win32/poll.h +++ b/compat/poll/poll.h diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index d40d1b3807..8cf59558e1 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -1,8 +1,7 @@ /* * Converts filenames from decomposed unicode into precomposed unicode. * Used on MacOS X. -*/ - + */ #define PRECOMPOSE_UNICODE_C @@ -11,25 +10,23 @@ #include "precompose_utf8.h" typedef char *iconv_ibp; -const static char *repo_encoding = "UTF-8"; -const static char *path_encoding = "UTF-8-MAC"; - +static const char *repo_encoding = "UTF-8"; +static const char *path_encoding = "UTF-8-MAC"; -static size_t has_utf8(const char *s, size_t maxlen, size_t *strlen_c) +static size_t has_non_ascii(const char *s, size_t maxlen, size_t *strlen_c) { - const uint8_t *utf8p = (const uint8_t*) s; + const uint8_t *ptr = (const uint8_t *)s; size_t strlen_chars = 0; size_t ret = 0; - if ((!utf8p) || (!*utf8p)) { + if (!ptr || !*ptr) return 0; - } - while((*utf8p) && maxlen) { - if (*utf8p & 0x80) + while (*ptr && maxlen) { + if (*ptr & 0x80) ret++; strlen_chars++; - utf8p++; + ptr++; maxlen--; } if (strlen_c) @@ -41,26 +38,24 @@ static size_t has_utf8(const char *s, size_t maxlen, size_t *strlen_c) void probe_utf8_pathname_composition(char *path, int len) { - const static char *auml_nfc = "\xc3\xa4"; - const static char *auml_nfd = "\x61\xcc\x88"; + static const char *auml_nfc = "\xc3\xa4"; + static const char *auml_nfd = "\x61\xcc\x88"; int output_fd; if (precomposed_unicode != -1) return; /* We found it defined in the global config, respect it */ - path[len] = 0; strcpy(path + len, auml_nfc); output_fd = open(path, O_CREAT|O_EXCL|O_RDWR, 0600); - if (output_fd >=0) { + if (output_fd >= 0) { close(output_fd); - path[len] = 0; strcpy(path + len, auml_nfd); /* Indicate to the user, that we can configure it to true */ - if (0 == access(path, R_OK)) + if (!access(path, R_OK)) git_config_set("core.precomposeunicode", "false"); - /* To be backward compatible, set precomposed_unicode to 0 */ + /* To be backward compatible, set precomposed_unicode to 0 */ precomposed_unicode = 0; - path[len] = 0; strcpy(path + len, auml_nfc); - unlink(path); + if (unlink(path)) + die_errno(_("failed to unlink '%s'"), path); } } @@ -82,7 +77,7 @@ void precompose_argv(int argc, const char **argv) while (i < argc) { size_t namelen; oldarg = argv[i]; - if (has_utf8(oldarg, (size_t)-1, &namelen)) { + if (has_non_ascii(oldarg, (size_t)-1, &namelen)) { newarg = reencode_string_iconv(oldarg, namelen, ic_precompose); if (newarg) argv[i] = newarg; @@ -135,7 +130,7 @@ struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *prec_dir) prec_dir->dirent_nfc->d_ino = res->d_ino; prec_dir->dirent_nfc->d_type = res->d_type; - if ((precomposed_unicode == 1) && has_utf8(res->d_name, (size_t)-1, NULL)) { + if ((precomposed_unicode == 1) && has_non_ascii(res->d_name, (size_t)-1, NULL)) { if (prec_dir->ic_precompose == (iconv_t)-1) { die("iconv_open(%s,%s) failed, but needed:\n" " precomposed unicode is not supported.\n" @@ -160,8 +155,7 @@ struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *prec_dir) namelenz = 0; /* trigger strlcpy */ } } - } - else + } else namelenz = 0; if (!namelenz) @@ -60,7 +60,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc path = buf.buf; } - if (!access(path, R_OK)) { + if (!access_or_warn(path, R_OK)) { if (++inc->depth > MAX_INCLUDE_DEPTH) die(include_depth_advice, MAX_INCLUDE_DEPTH, path, cf && cf->name ? cf->name : "the command line"); @@ -939,23 +939,23 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config) home_config_paths(&user_config, &xdg_config, "config"); - if (git_config_system() && !access(git_etc_gitconfig(), R_OK)) { + if (git_config_system() && !access_or_warn(git_etc_gitconfig(), R_OK)) { ret += git_config_from_file(fn, git_etc_gitconfig(), data); found += 1; } - if (xdg_config && !access(xdg_config, R_OK)) { + if (xdg_config && !access_or_warn(xdg_config, R_OK)) { ret += git_config_from_file(fn, xdg_config, data); found += 1; } - if (user_config && !access(user_config, R_OK)) { + if (user_config && !access_or_warn(user_config, R_OK)) { ret += git_config_from_file(fn, user_config, data); found += 1; } - if (repo_config && !access(repo_config, R_OK)) { + if (repo_config && !access_or_warn(repo_config, R_OK)) { ret += git_config_from_file(fn, repo_config, data); found += 1; } diff --git a/config.mak.in b/config.mak.in index 802d34223a..69d48382fe 100644 --- a/config.mak.in +++ b/config.mak.in @@ -5,12 +5,10 @@ CC = @CC@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ -CC_LD_DYNPATH = @CC_LD_DYNPATH@ AR = @AR@ TAR = @TAR@ DIFF = @DIFF@ #INSTALL = @INSTALL@ # needs install-sh or install.sh in sources -TCLTK_PATH = @TCLTK_PATH@ prefix = @prefix@ exec_prefix = @exec_prefix@ @@ -27,50 +25,3 @@ VPATH = @srcdir@ export exec_prefix mandir export srcdir VPATH - -NEEDS_SSL_WITH_CRYPTO=@NEEDS_SSL_WITH_CRYPTO@ -NO_OPENSSL=@NO_OPENSSL@ -NO_CURL=@NO_CURL@ -NO_EXPAT=@NO_EXPAT@ -NO_LIBGEN_H=@NO_LIBGEN_H@ -HAVE_PATHS_H=@HAVE_PATHS_H@ -HAVE_LIBCHARSET_H=@HAVE_LIBCHARSET_H@ -NO_GETTEXT=@NO_GETTEXT@ -LIBC_CONTAINS_LIBINTL=@LIBC_CONTAINS_LIBINTL@ -NEEDS_LIBICONV=@NEEDS_LIBICONV@ -NEEDS_SOCKET=@NEEDS_SOCKET@ -NEEDS_RESOLV=@NEEDS_RESOLV@ -NEEDS_LIBGEN=@NEEDS_LIBGEN@ -NO_SYS_SELECT_H=@NO_SYS_SELECT_H@ -NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@ -NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@ -NO_SOCKADDR_STORAGE=@NO_SOCKADDR_STORAGE@ -NO_IPV6=@NO_IPV6@ -NO_HSTRERROR=@NO_HSTRERROR@ -NO_STRCASESTR=@NO_STRCASESTR@ -NO_STRTOK_R=@NO_STRTOK_R@ -NO_FNMATCH=@NO_FNMATCH@ -NO_FNMATCH_CASEFOLD=@NO_FNMATCH_CASEFOLD@ -NO_MEMMEM=@NO_MEMMEM@ -NO_STRLCPY=@NO_STRLCPY@ -NO_UINTMAX_T=@NO_UINTMAX_T@ -NO_STRTOUMAX=@NO_STRTOUMAX@ -NO_SETENV=@NO_SETENV@ -NO_UNSETENV=@NO_UNSETENV@ -NO_MKDTEMP=@NO_MKDTEMP@ -NO_MKSTEMPS=@NO_MKSTEMPS@ -NO_INET_NTOP=@NO_INET_NTOP@ -NO_INET_PTON=@NO_INET_PTON@ -NO_ICONV=@NO_ICONV@ -OLD_ICONV=@OLD_ICONV@ -NO_REGEX=@NO_REGEX@ -USE_LIBPCRE=@USE_LIBPCRE@ -NO_DEFLATE_BOUND=@NO_DEFLATE_BOUND@ -INLINE=@INLINE@ -SOCKLEN_T=@SOCKLEN_T@ -FREAD_READS_DIRECTORIES=@FREAD_READS_DIRECTORIES@ -SNPRINTF_RETURNS_BOGUS=@SNPRINTF_RETURNS_BOGUS@ -NO_PTHREADS=@NO_PTHREADS@ -PTHREAD_CFLAGS=@PTHREAD_CFLAGS@ -PTHREAD_LIBS=@PTHREAD_LIBS@ -CHARSET_LIB=@CHARSET_LIB@ diff --git a/configure.ac b/configure.ac index df7e376590..c85888c851 100644 --- a/configure.ac +++ b/configure.ac @@ -7,8 +7,9 @@ # ------------------------ # Cause the line "VAR=VAL" to be eventually appended to ${config_file}. AC_DEFUN([GIT_CONF_SUBST], - [AC_REQUIRE([GIT_CONF_SUBST_INIT]) - config_appended_defs="$config_appended_defs${newline}$1=$2"]) +[AC_REQUIRE([GIT_CONF_SUBST_INIT]) +config_appended_defs="$config_appended_defs${newline}dnl +$1=m4_if([$#],[1],[${$1}],[$2])"]) # GIT_CONF_SUBST_INIT # ------------------- @@ -179,7 +180,7 @@ AC_ARG_WITH([lib], else lib=$withval AC_MSG_NOTICE([Setting lib to '$lib']) - GIT_CONF_SUBST([lib], [$withval]) + GIT_CONF_SUBST([lib]) fi]) if test -z "$lib"; then @@ -215,7 +216,7 @@ AC_ARG_ENABLE([jsmin], [ JSMIN=$enableval; AC_MSG_NOTICE([Setting JSMIN to '$JSMIN' to enable JavaScript minifying]) - GIT_CONF_SUBST([JSMIN], [$enableval]) + GIT_CONF_SUBST([JSMIN]) ]) # Define option to enable CSS minification @@ -225,7 +226,7 @@ AC_ARG_ENABLE([cssmin], [ CSSMIN=$enableval; AC_MSG_NOTICE([Setting CSSMIN to '$CSSMIN' to enable CSS minifying]) - GIT_CONF_SUBST([CSSMIN], [$enableval]) + GIT_CONF_SUBST([CSSMIN]) ]) ## Site configuration (override autodetection) @@ -265,8 +266,10 @@ AS_HELP_STRING([], [ARG can be also prefix for libpcre library and hea else USE_LIBPCRE=YesPlease LIBPCREDIR=$withval - AC_MSG_NOTICE([Setting LIBPCREDIR to $withval]) - GIT_CONF_SUBST([LIBPCREDIR], [$withval]) + AC_MSG_NOTICE([Setting LIBPCREDIR to $LIBPCREDIR]) + dnl USE_LIBPCRE can still be modified below, so don't substitute + dnl it yet. + GIT_CONF_SUBST([LIBPCREDIR]) fi) # # Define NO_CURL if you do not have curl installed. git-http-pull and @@ -386,9 +389,10 @@ AC_MSG_NOTICE([CHECKS for programs]) AC_PROG_CC([cc gcc]) AC_C_INLINE case $ac_cv_c_inline in - inline | yes | no) ;; - *) AC_SUBST([INLINE], [$ac_cv_c_inline]) ;; + inline | yes | no) INLINE='';; + *) INLINE=$ac_cv_c_inline ;; esac +GIT_CONF_SUBST([INLINE]) # which switch to pass runtime path to dynamic libraries to the linker AC_CACHE_CHECK([if linker supports -R], git_cv_ld_dashr, [ @@ -398,7 +402,7 @@ AC_CACHE_CHECK([if linker supports -R], git_cv_ld_dashr, [ LDFLAGS="${SAVE_LDFLAGS}" ]) if test "$git_cv_ld_dashr" = "yes"; then - AC_SUBST(CC_LD_DYNPATH, [-R]) + CC_LD_DYNPATH=-R else AC_CACHE_CHECK([if linker supports -Wl,-rpath,], git_cv_ld_wl_rpath, [ SAVE_LDFLAGS="${LDFLAGS}" @@ -407,7 +411,7 @@ else LDFLAGS="${SAVE_LDFLAGS}" ]) if test "$git_cv_ld_wl_rpath" = "yes"; then - AC_SUBST(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}" @@ -416,32 +420,35 @@ else LDFLAGS="${SAVE_LDFLAGS}" ]) if test "$git_cv_ld_rpath" = "yes"; then - AC_SUBST(CC_LD_DYNPATH, [-rpath]) + CC_LD_DYNPATH=-rpath else + CC_LD_DYNPATH= AC_MSG_WARN([linker does not support runtime path to dynamic libraries]) fi fi fi +GIT_CONF_SUBST([CC_LD_DYNPATH]) #AC_PROG_INSTALL # needs install-sh or install.sh in sources AC_CHECK_TOOLS(AR, [gar ar], :) AC_CHECK_PROGS(TAR, [gtar tar]) AC_CHECK_PROGS(DIFF, [gnudiff gdiff diff]) # TCLTK_PATH will be set to some value if we want Tcl/Tk # or will be empty otherwise. -if test -z "$NO_TCLTK"; then +if test -n "$NO_TCLTK"; then + TCLTK_PATH= +else if test "$with_tcltk" = ""; then # No Tcl/Tk switches given. Do not check for Tcl/Tk, use bare 'wish'. TCLTK_PATH=wish - AC_SUBST(TCLTK_PATH) elif test "$with_tcltk" = "yes"; then # Tcl/Tk check requested. AC_CHECK_PROGS(TCLTK_PATH, [wish], ) else AC_MSG_RESULT([Using Tcl/Tk interpreter $with_tcltk]) TCLTK_PATH="$with_tcltk" - AC_SUBST(TCLTK_PATH) fi fi +GIT_CONF_SUBST([TCLTK_PATH]) AC_CHECK_PROGS(ASCIIDOC, [asciidoc]) if test -n "$ASCIIDOC"; then AC_MSG_CHECKING([for asciidoc version]) @@ -468,13 +475,13 @@ GIT_STASH_FLAGS($OPENSSLDIR) AC_CHECK_LIB([crypto], [SHA1_Init], [NEEDS_SSL_WITH_CRYPTO=], [AC_CHECK_LIB([ssl], [SHA1_Init], - [NEEDS_SSL_WITH_CRYPTO=YesPlease], - [NEEDS_SSL_WITH_CRYPTO= NO_OPENSSL=YesPlease])]) + [NEEDS_SSL_WITH_CRYPTO=YesPlease NO_OPENSSL=], + [NEEDS_SSL_WITH_CRYPTO= NO_OPENSSL=YesPlease])]) GIT_UNSTASH_FLAGS($OPENSSLDIR) -AC_SUBST(NEEDS_SSL_WITH_CRYPTO) -AC_SUBST(NO_OPENSSL) +GIT_CONF_SUBST([NEEDS_SSL_WITH_CRYPTO]) +GIT_CONF_SUBST([NO_OPENSSL]) # # Define USE_LIBPCRE if you have and want to use libpcre. git-grep will be @@ -491,7 +498,7 @@ AC_CHECK_LIB([pcre], [pcre_version], GIT_UNSTASH_FLAGS($LIBPCREDIR) -AC_SUBST(USE_LIBPCRE) +GIT_CONF_SUBST([USE_LIBPCRE]) fi @@ -508,7 +515,7 @@ AC_CHECK_LIB([curl], [curl_global_init], GIT_UNSTASH_FLAGS($CURLDIR) -AC_SUBST(NO_CURL) +GIT_CONF_SUBST([NO_CURL]) # # Define NO_EXPAT if you do not have expat installed. git-http-push is @@ -522,7 +529,7 @@ AC_CHECK_LIB([expat], [XML_ParserCreate], GIT_UNSTASH_FLAGS($EXPATDIR) -AC_SUBST(NO_EXPAT) +GIT_CONF_SUBST([NO_EXPAT]) # # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin and @@ -568,8 +575,8 @@ LIBS="$old_LIBS" GIT_UNSTASH_FLAGS($ICONVDIR) -AC_SUBST(NEEDS_LIBICONV) -AC_SUBST(NO_ICONV) +GIT_CONF_SUBST([NEEDS_LIBICONV]) +GIT_CONF_SUBST([NO_ICONV]) if test -n "$NO_ICONV"; then NEEDS_LIBICONV= @@ -596,7 +603,7 @@ LIBS="$old_LIBS" GIT_UNSTASH_FLAGS($ZLIB_PATH) -AC_SUBST(NO_DEFLATE_BOUND) +GIT_CONF_SUBST([NO_DEFLATE_BOUND]) # # Define NEEDS_SOCKET if linking with libc is not enough (SunOS, @@ -604,7 +611,7 @@ AC_SUBST(NO_DEFLATE_BOUND) AC_CHECK_LIB([c], [socket], [NEEDS_SOCKET=], [NEEDS_SOCKET=YesPlease]) -AC_SUBST(NEEDS_SOCKET) +GIT_CONF_SUBST([NEEDS_SOCKET]) test -n "$NEEDS_SOCKET" && LIBS="$LIBS -lsocket" # @@ -612,40 +619,43 @@ test -n "$NEEDS_SOCKET" && LIBS="$LIBS -lsocket" # libresolv provides some of the functions we would normally get # from libc. NEEDS_RESOLV= -AC_SUBST(NEEDS_RESOLV) # # Define NO_INET_NTOP if linking with -lresolv is not enough. # Solaris 2.7 in particular hos inet_ntop in -lresolv. NO_INET_NTOP= -AC_SUBST(NO_INET_NTOP) AC_CHECK_FUNC([inet_ntop], - [], + [], [AC_CHECK_LIB([resolv], [inet_ntop], - [NEEDS_RESOLV=YesPlease], + [NEEDS_RESOLV=YesPlease], [NO_INET_NTOP=YesPlease]) ]) +GIT_CONF_SUBST([NO_INET_NTOP]) # # Define NO_INET_PTON if linking with -lresolv is not enough. # Solaris 2.7 in particular hos inet_pton in -lresolv. NO_INET_PTON= -AC_SUBST(NO_INET_PTON) AC_CHECK_FUNC([inet_pton], - [], + [], [AC_CHECK_LIB([resolv], [inet_pton], - [NEEDS_RESOLV=YesPlease], + [NEEDS_RESOLV=YesPlease], [NO_INET_PTON=YesPlease]) ]) +GIT_CONF_SUBST([NO_INET_PTON]) # # Define NO_HSTRERROR if linking with -lresolv is not enough. # Solaris 2.6 in particular has no hstrerror, even in -lresolv. NO_HSTRERROR= AC_CHECK_FUNC([hstrerror], - [], + [], [AC_CHECK_LIB([resolv], [hstrerror], - [NEEDS_RESOLV=YesPlease], + [NEEDS_RESOLV=YesPlease], [NO_HSTRERROR=YesPlease]) ]) -AC_SUBST(NO_HSTRERROR) +GIT_CONF_SUBST([NO_HSTRERROR]) + +dnl This must go after all the possible places for its initialization, +dnl in the AC_CHECK_FUNC invocations above. +GIT_CONF_SUBST([NEEDS_RESOLV]) # # If any of the above tests determined that -lresolv is needed at # build-time, also set it here for remaining configure-time checks. @@ -654,13 +664,13 @@ test -n "$NEEDS_RESOLV" && LIBS="$LIBS -lresolv" AC_CHECK_LIB([c], [basename], [NEEDS_LIBGEN=], [NEEDS_LIBGEN=YesPlease]) -AC_SUBST(NEEDS_LIBGEN) +GIT_CONF_SUBST([NEEDS_LIBGEN]) test -n "$NEEDS_LIBGEN" && LIBS="$LIBS -lgen" AC_CHECK_LIB([c], [gettext], [LIBC_CONTAINS_LIBINTL=YesPlease], [LIBC_CONTAINS_LIBINTL=]) -AC_SUBST(LIBC_CONTAINS_LIBINTL) +GIT_CONF_SUBST([LIBC_CONTAINS_LIBINTL]) # # Define NO_GETTEXT if you don't want Git output to be translated. @@ -668,7 +678,7 @@ AC_SUBST(LIBC_CONTAINS_LIBINTL) AC_CHECK_HEADER([libintl.h], [NO_GETTEXT=], [NO_GETTEXT=YesPlease]) -AC_SUBST(NO_GETTEXT) +GIT_CONF_SUBST([NO_GETTEXT]) if test -z "$NO_GETTEXT"; then test -n "$LIBC_CONTAINS_LIBINTL" || LIBS="$LIBS -lintl" @@ -681,19 +691,19 @@ AC_MSG_NOTICE([CHECKS for header files]) AC_CHECK_HEADER([sys/select.h], [NO_SYS_SELECT_H=], [NO_SYS_SELECT_H=UnfortunatelyYes]) -AC_SUBST(NO_SYS_SELECT_H) +GIT_CONF_SUBST([NO_SYS_SELECT_H]) # # Define NO_SYS_POLL_H if you don't have sys/poll.h AC_CHECK_HEADER([sys/poll.h], [NO_SYS_POLL_H=], [NO_SYS_POLL_H=UnfortunatelyYes]) -AC_SUBST(NO_SYS_POLL_H) +GIT_CONF_SUBST([NO_SYS_POLL_H]) # # Define NO_INTTYPES_H if you don't have inttypes.h AC_CHECK_HEADER([inttypes.h], [NO_INTTYPES_H=], [NO_INTTYPES_H=UnfortunatelyYes]) -AC_SUBST(NO_INTTYPES_H) +GIT_CONF_SUBST([NO_INTTYPES_H]) # # Define OLD_ICONV if your library has an old iconv(), where the second # (input buffer pointer) parameter is declared with type (const char **). @@ -716,23 +726,24 @@ AC_COMPILE_IFELSE([OLDICONVTEST_SRC], GIT_UNSTASH_FLAGS($ICONVDIR) -AC_SUBST(OLD_ICONV) +GIT_CONF_SUBST([OLD_ICONV]) ## Checks for typedefs, structures, and compiler characteristics. AC_MSG_NOTICE([CHECKS for typedefs, structures, and compiler characteristics]) # TYPE_SOCKLEN_T case $ac_cv_type_socklen_t in - yes) ;; - *) AC_SUBST([SOCKLEN_T], [$git_cv_socklen_t_equiv]) ;; + yes) SOCKLEN_T='';; + *) SOCKLEN_T=$git_cv_socklen_t_equiv;; esac +GIT_CONF_SUBST([SOCKLEN_T]) # Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent. AC_CHECK_MEMBER(struct dirent.d_ino, [NO_D_INO_IN_DIRENT=], [NO_D_INO_IN_DIRENT=YesPlease], [#include <dirent.h>]) -AC_SUBST(NO_D_INO_IN_DIRENT) +GIT_CONF_SUBST([NO_D_INO_IN_DIRENT]) # # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks # d_type in struct dirent (latest Cygwin -- will be fixed soonish). @@ -740,7 +751,7 @@ AC_CHECK_MEMBER(struct dirent.d_type, [NO_D_TYPE_IN_DIRENT=], [NO_D_TYPE_IN_DIRENT=YesPlease], [#include <dirent.h>]) -AC_SUBST(NO_D_TYPE_IN_DIRENT) +GIT_CONF_SUBST([NO_D_TYPE_IN_DIRENT]) # # Define NO_SOCKADDR_STORAGE if your platform does not have struct # sockaddr_storage. @@ -750,7 +761,7 @@ AC_CHECK_TYPE(struct sockaddr_storage, #include <sys/types.h> #include <sys/socket.h> ]) -AC_SUBST(NO_SOCKADDR_STORAGE) +GIT_CONF_SUBST([NO_SOCKADDR_STORAGE]) # # Define NO_IPV6 if you lack IPv6 support and getaddrinfo(). AC_CHECK_TYPE([struct addrinfo],[ @@ -762,7 +773,7 @@ AC_CHECK_TYPE([struct addrinfo],[ #include <sys/socket.h> #include <netdb.h> ]) -AC_SUBST(NO_IPV6) +GIT_CONF_SUBST([NO_IPV6]) # # Define NO_REGEX if you have no or inferior regex support in your C library. AC_CACHE_CHECK([whether the platform regex can handle null bytes], @@ -783,7 +794,7 @@ if test $ac_cv_c_excellent_regex = yes; then else NO_REGEX=YesPlease fi -AC_SUBST(NO_REGEX) +GIT_CONF_SUBST([NO_REGEX]) # # Define FREAD_READS_DIRECTORIES if your are on a system which succeeds # when attempting to read from an fopen'ed directory. @@ -803,7 +814,7 @@ if test $ac_cv_fread_reads_directories = yes; then else FREAD_READS_DIRECTORIES= fi -AC_SUBST(FREAD_READS_DIRECTORIES) +GIT_CONF_SUBST([FREAD_READS_DIRECTORIES]) # # Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf() # or vsnprintf() return -1 instead of number of characters which would @@ -837,7 +848,7 @@ if test $ac_cv_snprintf_returns_bogus = yes; then else SNPRINTF_RETURNS_BOGUS= fi -AC_SUBST(SNPRINTF_RETURNS_BOGUS) +GIT_CONF_SUBST([SNPRINTF_RETURNS_BOGUS]) ## Checks for library functions. @@ -848,47 +859,45 @@ AC_MSG_NOTICE([CHECKS for library functions]) AC_CHECK_HEADER([libgen.h], [NO_LIBGEN_H=], [NO_LIBGEN_H=YesPlease]) -AC_SUBST(NO_LIBGEN_H) +GIT_CONF_SUBST([NO_LIBGEN_H]) # # Define HAVE_PATHS_H if you have paths.h. AC_CHECK_HEADER([paths.h], [HAVE_PATHS_H=YesPlease], [HAVE_PATHS_H=]) -AC_SUBST(HAVE_PATHS_H) +GIT_CONF_SUBST([HAVE_PATHS_H]) # # Define HAVE_LIBCHARSET_H if have libcharset.h AC_CHECK_HEADER([libcharset.h], [HAVE_LIBCHARSET_H=YesPlease], [HAVE_LIBCHARSET_H=]) -AC_SUBST(HAVE_LIBCHARSET_H) +GIT_CONF_SUBST([HAVE_LIBCHARSET_H]) # Define CHARSET_LIB if libiconv does not export the locale_charset symbol # and libcharset does CHARSET_LIB= AC_CHECK_LIB([iconv], [locale_charset], [], [AC_CHECK_LIB([charset], [locale_charset], - [CHARSET_LIB=-lcharset]) - ] -) -AC_SUBST(CHARSET_LIB) + [CHARSET_LIB=-lcharset])]) +GIT_CONF_SUBST([CHARSET_LIB]) # # Define NO_STRCASESTR if you don't have strcasestr. GIT_CHECK_FUNC(strcasestr, [NO_STRCASESTR=], [NO_STRCASESTR=YesPlease]) -AC_SUBST(NO_STRCASESTR) +GIT_CONF_SUBST([NO_STRCASESTR]) # # Define NO_STRTOK_R if you don't have strtok_r GIT_CHECK_FUNC(strtok_r, [NO_STRTOK_R=], [NO_STRTOK_R=YesPlease]) -AC_SUBST(NO_STRTOK_R) +GIT_CONF_SUBST([NO_STRTOK_R]) # # Define NO_FNMATCH if you don't have fnmatch GIT_CHECK_FUNC(fnmatch, [NO_FNMATCH=], [NO_FNMATCH=YesPlease]) -AC_SUBST(NO_FNMATCH) +GIT_CONF_SUBST([NO_FNMATCH]) # # Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the # FNM_CASEFOLD GNU extension. @@ -910,19 +919,19 @@ if test $ac_cv_c_excellent_fnmatch = yes; then else NO_FNMATCH_CASEFOLD=YesPlease fi -AC_SUBST(NO_FNMATCH_CASEFOLD) +GIT_CONF_SUBST([NO_FNMATCH_CASEFOLD]) # # Define NO_MEMMEM if you don't have memmem. GIT_CHECK_FUNC(memmem, [NO_MEMMEM=], [NO_MEMMEM=YesPlease]) -AC_SUBST(NO_MEMMEM) +GIT_CONF_SUBST([NO_MEMMEM]) # # Define NO_STRLCPY if you don't have strlcpy. GIT_CHECK_FUNC(strlcpy, [NO_STRLCPY=], [NO_STRLCPY=YesPlease]) -AC_SUBST(NO_STRLCPY) +GIT_CONF_SUBST([NO_STRLCPY]) # # Define NO_UINTMAX_T if your platform does not have uintmax_t AC_CHECK_TYPE(uintmax_t, @@ -930,43 +939,43 @@ AC_CHECK_TYPE(uintmax_t, [NO_UINTMAX_T=YesPlease],[ #include <inttypes.h> ]) -AC_SUBST(NO_UINTMAX_T) +GIT_CONF_SUBST([NO_UINTMAX_T]) # # Define NO_STRTOUMAX if you don't have strtoumax in the C library. GIT_CHECK_FUNC(strtoumax, [NO_STRTOUMAX=], [NO_STRTOUMAX=YesPlease]) -AC_SUBST(NO_STRTOUMAX) +GIT_CONF_SUBST([NO_STRTOUMAX]) # # Define NO_SETENV if you don't have setenv in the C library. GIT_CHECK_FUNC(setenv, [NO_SETENV=], [NO_SETENV=YesPlease]) -AC_SUBST(NO_SETENV) +GIT_CONF_SUBST([NO_SETENV]) # # Define NO_UNSETENV if you don't have unsetenv in the C library. GIT_CHECK_FUNC(unsetenv, [NO_UNSETENV=], [NO_UNSETENV=YesPlease]) -AC_SUBST(NO_UNSETENV) +GIT_CONF_SUBST([NO_UNSETENV]) # # Define NO_MKDTEMP if you don't have mkdtemp in the C library. GIT_CHECK_FUNC(mkdtemp, [NO_MKDTEMP=], [NO_MKDTEMP=YesPlease]) -AC_SUBST(NO_MKDTEMP) +GIT_CONF_SUBST([NO_MKDTEMP]) # # Define NO_MKSTEMPS if you don't have mkstemps in the C library. GIT_CHECK_FUNC(mkstemps, [NO_MKSTEMPS=], [NO_MKSTEMPS=YesPlease]) -AC_SUBST(NO_MKSTEMPS) +GIT_CONF_SUBST([NO_MKSTEMPS]) # # Define NO_INITGROUPS if you don't have initgroups in the C library. GIT_CHECK_FUNC(initgroups, [NO_INITGROUPS=], [NO_INITGROUPS=YesPlease]) -AC_SUBST(NO_INITGROUPS) +GIT_CONF_SUBST([NO_INITGROUPS]) # # # Define NO_MMAP if you want to avoid mmap. @@ -1048,9 +1057,9 @@ fi CFLAGS="$old_CFLAGS" -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(NO_PTHREADS) +GIT_CONF_SUBST([PTHREAD_CFLAGS]) +GIT_CONF_SUBST([PTHREAD_LIBS]) +GIT_CONF_SUBST([NO_PTHREADS]) ## Output files AC_CONFIG_FILES(["${config_file}":"${config_in}"]) @@ -115,12 +115,7 @@ struct ref **get_remote_heads(int in, struct ref **list, return list; } -int server_supports(const char *feature) -{ - return !!parse_feature_request(server_capabilities, feature); -} - -const char *parse_feature_request(const char *feature_list, const char *feature) +const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp) { int len; @@ -132,14 +127,46 @@ const char *parse_feature_request(const char *feature_list, const char *feature) const char *found = strstr(feature_list, feature); if (!found) return NULL; - if ((feature_list == found || isspace(found[-1])) && - (!found[len] || isspace(found[len]) || found[len] == '=')) - return found; + if (feature_list == found || isspace(found[-1])) { + const char *value = found + len; + /* feature with no value (e.g., "thin-pack") */ + if (!*value || isspace(*value)) { + if (lenp) + *lenp = 0; + return value; + } + /* feature with a value (e.g., "agent=git/1.2.3") */ + else if (*value == '=') { + value++; + if (lenp) + *lenp = strcspn(value, " \t\n"); + return value; + } + /* + * otherwise we matched a substring of another feature; + * keep looking + */ + } feature_list = found + 1; } return NULL; } +int parse_feature_request(const char *feature_list, const char *feature) +{ + return !!parse_feature_value(feature_list, feature, NULL); +} + +const char *server_feature_value(const char *feature, int *len) +{ + return parse_feature_value(server_capabilities, feature, len); +} + +int server_supports(const char *feature) +{ + return !!server_feature_value(feature, NULL); +} + enum protocol { PROTO_LOCAL = 1, PROTO_SSH, diff --git a/contrib/ciabot/INSTALL b/contrib/ciabot/INSTALL new file mode 100644 index 0000000000..7222961d35 --- /dev/null +++ b/contrib/ciabot/INSTALL @@ -0,0 +1,54 @@ += Installation instructions = + +Two scripts are included. The Python one (ciabot.py) is faster and +more capable; the shell one (ciabot.sh) is a fallback in case Python +gives your git hosting site indigestion. (I know of no such sites.) + +It is no longer necessary to modify the script in order to put it +in place; in fact, this is now discouraged. It is entirely +configurable with the following git config variables: + +ciabot.project = name of the project +ciabot.repo = name of the project repo for gitweb/cgit purposes +ciabot.xmlrpc = if true, ship notifications via XML-RPC +ciabot.revformat = format in which the revision is shown + +The revformat variable may have the following values +raw -> full hex ID of commit +short -> first 12 chars of hex ID +describe -> describe relative to last tag, falling back to short + +ciabot.project defaults to the directory name of the repository toplevel. +ciabot.repo defaults to ciabot.project lowercased. +ciabot.xmlrpc defaults to True +ciabot.revformat defaults to 'describe'. + +This means that in the normal case you need not do any configuration at all, +however setting ciabot.project will allow the hook to run slightly faster. + +Once you've set these variables, try your script with -n to see the +notification message dumped to stdout and verify that it looks sane. + +To live-test these scripts, your project needs to have been registered with +the CIA site. Here are the steps: + +1. Open an IRC window on irc://freenode/commits or your registered + project IRC channel. + +2. Run ciabot.py and/or ciabot.sh from any directory under git + control. + +You should see a notification on the channel for your most recent commit. + +After verifying correct function, install one of these scripts either +in a post-commit hook or in an update hook. + +In post-commit, run it without arguments. It will query for +current HEAD and the latest commit ID to get the information it +needs. + +In update, call it with a refname followed by a list of commits: +You want to reverse the order git rev-list emits because it lists +from most recent to oldest. + +/path/to/ciabot.py ${refname} $(git rev-list ${oldhead}..${newhead} | tac) diff --git a/contrib/ciabot/README b/contrib/ciabot/README index 3b916acece..2dfe1f91f5 100644 --- a/contrib/ciabot/README +++ b/contrib/ciabot/README @@ -8,5 +8,4 @@ You probably want the Python version; it's faster, more capable, and better documented. The shell version is maintained only as a fallback for use on hosting sites that don't permit Python hook scripts. -You will find installation instructions for each script in its comment -header. +See the file INSTALL for installation instructions. diff --git a/contrib/ciabot/ciabot.py b/contrib/ciabot/ciabot.py index 9775dffb5d..bd24395d4c 100755 --- a/contrib/ciabot/ciabot.py +++ b/contrib/ciabot/ciabot.py @@ -10,44 +10,45 @@ # usage: ciabot.py [-V] [-n] [-p projectname] [refname [commits...]] # # This script is meant to be run either in a post-commit hook or in an -# update hook. If there's nothing unusual about your hosting setup, -# you can specify the project name with a -p option and avoid having -# to modify this script. Try it with -n to see the notification mail -# dumped to stdout and verify that it looks sane. With -V it dumps its -# version and exits. +# update hook. Try it with -n to see the notification mail dumped to +# stdout and verify that it looks sane. With -V it dumps its version +# and exits. # -# In post-commit, run it without arguments (other than possibly a -p -# option). It will query for current HEAD and the latest commit ID to -# get the information it needs. +# In post-commit, run it without arguments. It will query for +# current HEAD and the latest commit ID to get the information it +# needs. # # In update, call it with a refname followed by a list of commits: -# You want to reverse the order git rev-list emits becxause it lists +# You want to reverse the order git rev-list emits because it lists # from most recent to oldest. # # /path/to/ciabot.py ${refname} $(git rev-list ${oldhead}..${newhead} | tac) # -# Note: this script uses mail, not XML-RPC, in order to avoid stalling -# until timeout when the CIA XML-RPC server is down. +# Configuration variables affecting this script: # - +# ciabot.project = name of the project +# ciabot.repo = name of the project repo for gitweb/cgit purposes +# ciabot.xmlrpc = if true (default), ship notifications via XML-RPC +# ciabot.revformat = format in which the revision is shown # -# The project as known to CIA. You will either want to change this -# or invoke the script with a -p option to set it. +# ciabot.project defaults to the directory name of the repository toplevel. +# ciabot.repo defaults to ciabot.project lowercased. # -project=None - +# This means that in the normal case you need not do any configuration at all, +# but setting the project name will speed it up slightly. # -# You may not need to change these: +# The revformat variable may have the following values +# raw -> full hex ID of commit +# short -> first 12 chars of hex ID +# describe = -> describe relative to last tag, falling back to short +# The default is 'describe'. +# +# Note: the CIA project now says only XML-RPC is reliable, so +# we default to that. # -import os, sys, commands, socket, urllib - -# Name of the repository. -# You can hardwire this to make the script faster. -repo = os.path.basename(os.getcwd()) -# Fully-qualified domain name of this host. -# You can hardwire this to make the script faster. -host = socket.getfqdn() +import os, sys, commands, socket, urllib +from xml.sax.saxutils import escape # Changeset URL prefix for your repo: when the commit ID is appended # to this, it should point at a CGI that will display the commit @@ -72,7 +73,7 @@ xml = '''\ <message> <generator> <name>CIA Python client for Git</name> - <version>%(gitver)s</version> + <version>%(version)s</version> <url>%(generator)s</url> </generator> <source> @@ -98,19 +99,18 @@ xml = '''\ # No user-serviceable parts below this line: # -# Addresses for the e-mail. The from address is a dummy, since CIA -# will never reply to this mail. -fromaddr = "CIABOT-NOREPLY@" + host -toaddr = "cia@cia.navi.cx" +# Where to ship e-mail notifications. +toaddr = "cia@cia.vc" # Identify the generator script. # Should only change when the script itself gets a new home and maintainer. -generator="http://www.catb.org/~esr/ciabot.py" +generator = "http://www.catb.org/~esr/ciabot.py" +version = "3.6" def do(command): return commands.getstatusoutput(command)[1] -def report(refname, merged): +def report(refname, merged, xmlrpc=True): "Generate a commit notification to be reported to CIA" # Try to tinyfy a reference to a web view for this commit. @@ -121,32 +121,27 @@ def report(refname, merged): branch = os.path.basename(refname) - # Compute a shortnane for the revision - rev = do("git describe '"+ merged +"' 2>/dev/null") or merged[:12] - - # Extract the neta-information for the commit - rawcommit = do("git cat-file commit " + merged) + # Compute a description for the revision + if revformat == 'raw': + rev = merged + elif revformat == 'short': + rev = '' + else: # revformat == 'describe' + rev = do("git describe %s 2>/dev/null" % merged) + if not rev: + rev = merged[:12] + + # Extract the meta-information for the commit files=do("git diff-tree -r --name-only '"+ merged +"' | sed -e '1d' -e 's-.*-<file>&</file>-'") - inheader = True - headers = {} - logmsg = "" - for line in rawcommit.split("\n"): - if inheader: - if line: - fields = line.split() - headers[fields[0]] = " ".join(fields[1:]) - else: - inheader = False - else: - logmsg = line - break - (author, ts) = headers["author"].split(">") + metainfo = do("git log -1 '--pretty=format:%an <%ae>%n%at%n%s' " + merged) + (author, ts, logmsg) = metainfo.split("\n") + logmsg = escape(logmsg) - # This discards the part of the authors addrsss after @. - # Might be bnicece to ship the full email address, if not + # This discards the part of the author's address after @. + # Might be be nice to ship the full email address, if not # for spammers' address harvesters - getting this wrong # would make the freenode #commits channel into harvester heaven. - author = author.replace("<", "").split("@")[0].split()[-1] + author = escape(author.replace("<", "").split("@")[0].split()[-1]) # This ignores the timezone. Not clear what to do with it... ts = ts.strip().split()[0] @@ -155,8 +150,7 @@ def report(refname, merged): context.update(globals()) out = xml % context - - message = '''\ + mail = '''\ Message-ID: <%(merged)s.%(author)s@%(project)s> From: %(fromaddr)s To: %(toaddr)s @@ -165,34 +159,56 @@ Subject: DeliverXML %(out)s''' % locals() - return message + if xmlrpc: + return out + else: + return mail if __name__ == "__main__": import getopt + # Get all config variables + revformat = do("git config --get ciabot.revformat") + project = do("git config --get ciabot.project") + repo = do("git config --get ciabot.repo") + xmlrpc = do("git config --get ciabot.xmlrpc") + xmlrpc = not (xmlrpc and xmlrpc == "false") + + host = socket.getfqdn() + fromaddr = "CIABOT-NOREPLY@" + host + try: - (options, arguments) = getopt.getopt(sys.argv[1:], "np:V") + (options, arguments) = getopt.getopt(sys.argv[1:], "np:xV") except getopt.GetoptError, msg: print "ciabot.py: " + str(msg) raise SystemExit, 1 - mailit = True + notify = True for (switch, val) in options: if switch == '-p': project = val elif switch == '-n': - mailit = False + notify = False + elif switch == '-x': + xmlrpc = True elif switch == '-V': - print "ciabot.py: version 3.2" + print "ciabot.py: version", version sys.exit(0) - # Cough and die if user has not specified a project + # The project variable defaults to the name of the repository toplevel. if not project: - sys.stderr.write("ciabot.py: no project specified, bailing out.\n") - sys.exit(1) - - # We'll need the git version number. - gitver = do("git --version").split()[0] + here = os.getcwd() + while True: + if os.path.exists(os.path.join(here, ".git")): + project = os.path.basename(here) + break + elif here == '/': + sys.stderr.write("ciabot.py: no .git below root!\n") + sys.exit(1) + here = os.path.dirname(here) + + if not repo: + repo = project.lower() urlprefix = urlprefix % globals() @@ -205,18 +221,29 @@ if __name__ == "__main__": refname = arguments[0] merges = arguments[1:] - if mailit: - import smtplib - server = smtplib.SMTP('localhost') + if notify: + if xmlrpc: + import xmlrpclib + server = xmlrpclib.Server('http://cia.vc/RPC2'); + else: + import smtplib + server = smtplib.SMTP('localhost') for merged in merges: - message = report(refname, merged) - if mailit: - server.sendmail(fromaddr, [toaddr], message) - else: + message = report(refname, merged, xmlrpc) + if not notify: print message + elif xmlrpc: + try: + # RPC server is flaky, this can fail due to timeout. + server.hub.deliver(message) + except socket.error, e: + sys.stderr.write("%s\n" % e) + else: + server.sendmail(fromaddr, [toaddr], message) - if mailit: - server.quit() + if notify: + if not xmlrpc: + server.quit() #End diff --git a/contrib/ciabot/ciabot.sh b/contrib/ciabot/ciabot.sh index eb87bba38e..3fbbc534ae 100755 --- a/contrib/ciabot/ciabot.sh +++ b/contrib/ciabot/ciabot.sh @@ -3,6 +3,8 @@ # Copyright (c) 2006 Fernando J. Pereda <ferdy@gentoo.org> # Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com> # Copyright (c) 2010 Eric S. Raymond <esr@thyrsus.com> +# Assistance and review by Petr Baudis, author of ciabot.pl, +# is gratefully acknowledged. # # This is a version 3.x of ciabot.sh; use -V to find the exact # version. Versions 1 and 2 were shipped in 2006 and 2008 and are not @@ -11,6 +13,7 @@ # Note: This script should be considered obsolete. # There is a faster, better-documented rewrite in Python: find it as ciabot.py # Use this only if your hosting site forbids Python hooks. +# It requires: git(1), hostname(1), cut(1), sendmail(1), and wget(1). # # Originally based on Git ciabot.pl by Petr Baudis. # This script contains porcelain and porcelain byproducts. @@ -18,15 +21,13 @@ # usage: ciabot.sh [-V] [-n] [-p projectname] [refname commit] # # This script is meant to be run either in a post-commit hook or in an -# update hook. If there's nothing unusual about your hosting setup, -# you can specify the project name with a -p option and avoid having -# to modify this script. Try it with -n first to see the notification -# mail dumped to stdout and verify that it looks sane. Use -V to dump -# the version and exit. +# update hook. Try it with -n to see the notification mail dumped to +# stdout and verify that it looks sane. With -V it dumps its version +# and exits. # -# In post-commit, run it without arguments (other than possibly a -p -# option). It will query for current HEAD and the latest commit ID to -# get the information it needs. +# In post-commit, run it without arguments. It will query for +# current HEAD and the latest commit ID to get the information it +# needs. # # In update, you have to call it once per merged commit: # @@ -34,33 +35,76 @@ # oldhead=$2 # newhead=$3 # for merged in $(git rev-list ${oldhead}..${newhead} | tac) ; do -# /path/to/ciabot.bash ${refname} ${merged} +# /path/to/ciabot.sh ${refname} ${merged} # done # -# The reason for the tac call ids that git rev-list emits commits from +# The reason for the tac call is that git rev-list emits commits from # most recent to least - better to ship notifactions from oldest to newest. # -# Note: this script uses mail, not XML-RPC, in order to avoid stalling -# until timeout when the CIA XML-RPC server is down. +# Configuration variables affecting this script: # - +# ciabot.project = name of the project +# ciabot.repo = name of the project repo for gitweb/cgit purposes +# ciabot.revformat = format in which the revision is shown # -# The project as known to CIA. You will either want to change this -# or set the project name with a -p option. +# ciabot.project defaults to the directory name of the repository toplevel. +# ciabot.repo defaults to ciabot.project lowercased. # -project= - +# This means that in the normal case you need not do any configuration at all, +# but setting the project name will speed it up slightly. # -# You may not need to change these: +# The revformat variable may have the following values +# raw -> full hex ID of commit +# short -> first 12 chars of hex ID +# describe = -> describe relative to last tag, falling back to short +# The default is 'describe'. # +# Note: the shell ancestors of this script used mail, not XML-RPC, in +# order to avoid stalling until timeout when the CIA XML-RPC server is +# down. It is unknown whether this is still an issue in 2010, but +# XML-RPC would be annoying to do from sh in any case. (XML-RPC does +# have the advantage that it guarantees notification of multiple commits +# shpped from an update in their actual order.) +# + +# The project as known to CIA. You can set this with a -p option, +# or let it default to the directory name of the repo toplevel. +project=$(git config --get ciabot.project) + +if [ -z $project ] +then + here=`pwd`; + while :; do + if [ -d $here/.git ] + then + project=`basename $here` + break + elif [ $here = '/' ] + then + echo "ciabot.sh: no .git below root!" + exit 1 + fi + here=`dirname $here` + done +fi -# Name of the repository. -# You can hardwire this to make the script faster. -repo="`basename ${PWD}`" +# Name of the repo for gitweb/cgit purposes +repo=$(git config --get ciabot.repo) +[ -z $repo] && repo=$(echo "${project}" | tr '[A-Z]' '[a-z]') -# Fully qualified domain name of the repo host. -# You can hardwire this to make the script faster. -host=`hostname --fqdn` +# What revision format do we want in the summary? +revformat=$(git config --get ciabot.revformat) + +# Fully qualified domain name of the repo host. You can hardwire this +# to make the script faster. The -f option works under Linux and FreeBSD, +# but not OpenBSD and NetBSD. But under OpenBSD and NetBSD, +# hostname without options gives the FQDN. +if hostname -f >/dev/null 2>&1 +then + hostname=`hostname -f` +else + hostname=`hostname` +fi # Changeset URL prefix for your repo: when the commit ID is appended # to this, it should point at a CGI that will display the commit @@ -73,13 +117,14 @@ urlprefix="http://${host}/cgi-bin/cgit.cgi/${repo}/commit/?id=" # You probably will not need to change the following: # -# Identify the script. Should change only when the script itself -# gets a new home and maintainer. +# Identify the script. The 'generator' variable should change only +# when the script itself gets a new home and maintainer. generator="http://www.catb.org/~esr/ciabot/ciabot.sh" +version=3.5 # Addresses for the e-mail -from="CIABOT-NOREPLY@${host}" -to="cia@cia.navi.cx" +from="CIABOT-NOREPLY@${hostname}" +to="cia@cia.vc" # SMTP client to use - may need to edit the absolute pathname for your system sendmail="sendmail -t -f ${from}" @@ -97,7 +142,7 @@ do case $opt in p) project=$2; shift ; shift ;; n) mode=dumpit; shift ;; - V) echo "ciabot.sh: version 3.2"; exit 0; shift ;; + V) echo "ciabot.sh: version $version"; exit 0; shift ;; esac done @@ -128,33 +173,29 @@ fi refname=${refname##refs/heads/} -gitver=$(git --version) -gitver=${gitver##* } - -rev=$(git describe ${merged} 2>/dev/null) -# ${merged:0:12} was the only bashism left in the 2008 version of this -# script, according to checkbashisms. Replace it with ${merged} here -# because it was just a fallback anyway, and it's worth accepting a -# longer fallback for faster execution and removing the bash -# dependency. -[ -z ${rev} ] && rev=${merged} +case $revformat in +raw) rev=$merged ;; +short) rev='' ;; +*) rev=$(git describe ${merged} 2>/dev/null) ;; +esac +[ -z ${rev} ] && rev=$(echo "$merged" | cut -c 1-12) -# This discards the part of the author's address after @. +# We discard the part of the author's address after @. # Might be nice to ship the full email address, if not # for spammers' address harvesters - getting this wrong # would make the freenode #commits channel into harvester heaven. -rawcommit=$(git cat-file commit ${merged}) -author=$(echo "$rawcommit" | sed -n -e '/^author .*<\([^@]*\).*$/s--\1-p') -logmessage=$(echo "$rawcommit" | sed -e '1,/^$/d' | head -n 1) -logmessage=$(echo "$logmessage" | sed 's/\&/&\;/g; s/</<\;/g; s/>/>\;/g') -ts=$(echo "$rawcommit" | sed -n -e '/^author .*> \([0-9]\+\).*$/s--\1-p') +author=$(git log -1 '--pretty=format:%an <%ae>' $merged) +author=$(echo "$author" | sed -n -e '/^.*<\([^@]*\).*$/s--\1-p') + +logmessage=$(git log -1 '--pretty=format:%s' $merged) +ts=$(git log -1 '--pretty=format:%at' $merged) files=$(git diff-tree -r --name-only ${merged} | sed -e '1d' -e 's-.*-<file>&</file>-') out=" <message> <generator> <name>CIA Shell client for Git</name> - <version>${gitver}</version> + <version>${version}</version> <url>${generator}</url> </generator> <source> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index ffedce751c..be800e09bd 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -875,11 +875,15 @@ _git_branch () done case "$cur" in + --set-upstream-to=*) + __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}" + ;; --*) __gitcomp " --color --no-color --verbose --abbrev= --no-abbrev --track --no-track --contains --merged --no-merged - --set-upstream --edit-description --list + --set-upstream-to= --edit-description --list + --unset-upstream " ;; *) @@ -1014,7 +1018,8 @@ _git_commit () --*) __gitcomp " --all --author= --signoff --verify --no-verify - --edit --amend --include --only --interactive + --edit --no-edit + --amend --include --only --interactive --dry-run --reuse-message= --reedit-message= --reset-author --file= --message= --template= --cleanup= --untracked-files --untracked-files= @@ -1071,7 +1076,7 @@ _git_diff () } __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff - tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 + tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare " _git_difftool () @@ -2032,7 +2037,7 @@ _git_config () _git_remote () { - local subcommands="add rename rm set-head set-branches set-url show prune update" + local subcommands="add rename remove set-head set-branches set-url show prune update" local subcommand="$(__git_find_on_cmdline "$subcommands")" if [ -z "$subcommand" ]; then __gitcomp "$subcommands" @@ -2040,7 +2045,7 @@ _git_remote () fi case "$subcommand" in - rename|rm|set-url|show|prune) + rename|remove|set-url|show|prune) __gitcomp_nl "$(__git_remotes)" ;; set-head|set-branches) diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index 29b1ec9eb1..bf20491ec3 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -34,9 +34,10 @@ # # If you would like to see the difference between HEAD and its upstream, # set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">" -# indicates you are ahead, and "<>" indicates you have diverged. You -# can further control behaviour by setting GIT_PS1_SHOWUPSTREAM to a -# space-separated list of values: +# indicates you are ahead, "<>" indicates you have diverged and "=" +# indicates that there is no difference. You can further control +# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list +# of values: # # verbose show number of commits ahead/behind (+/-) upstream # legacy don't use the '--count' option available in recent diff --git a/contrib/credential/gnome-keyring/.gitignore b/contrib/credential/gnome-keyring/.gitignore new file mode 100644 index 0000000000..88d8fcdbce --- /dev/null +++ b/contrib/credential/gnome-keyring/.gitignore @@ -0,0 +1 @@ +git-credential-gnome-keyring diff --git a/contrib/credential/gnome-keyring/Makefile b/contrib/credential/gnome-keyring/Makefile new file mode 100644 index 0000000000..e6561d8db6 --- /dev/null +++ b/contrib/credential/gnome-keyring/Makefile @@ -0,0 +1,24 @@ +MAIN:=git-credential-gnome-keyring +all:: $(MAIN) + +CC = gcc +RM = rm -f +CFLAGS = -g -O2 -Wall + +-include ../../../config.mak.autogen +-include ../../../config.mak + +INCS:=$(shell pkg-config --cflags gnome-keyring-1) +LIBS:=$(shell pkg-config --libs gnome-keyring-1) + +SRCS:=$(MAIN).c +OBJS:=$(SRCS:.c=.o) + +%.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $< + +$(MAIN): $(OBJS) + $(CC) -o $@ $(LDFLAGS) $^ $(LIBS) + +clean: + @$(RM) $(MAIN) $(OBJS) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c new file mode 100644 index 0000000000..41f61c5db3 --- /dev/null +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -0,0 +1,445 @@ +/* + * Copyright (C) 2011 John Szakmeister <john@szakmeister.net> + * 2012 Philipp A. Hartmann <pah@qo.cx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Credits: + * - GNOME Keyring API handling originally written by John Szakmeister + * - ported to credential helper API by Philipp A. Hartmann + */ + +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include <stdlib.h> +#include <errno.h> +#include <gnome-keyring.h> + +/* + * This credential struct and API is simplified from git's credential.{h,c} + */ +struct credential +{ + char *protocol; + char *host; + unsigned short port; + char *path; + char *username; + char *password; +}; + +#define CREDENTIAL_INIT \ + { NULL,NULL,0,NULL,NULL,NULL } + +void credential_init(struct credential *c); +void credential_clear(struct credential *c); +int credential_read(struct credential *c); +void credential_write(const struct credential *c); + +typedef int (*credential_op_cb)(struct credential*); + +struct credential_operation +{ + char *name; + credential_op_cb op; +}; + +#define CREDENTIAL_OP_END \ + { NULL,NULL } + +/* + * Table with operation callbacks is defined in concrete + * credential helper implementation and contains entries + * like { "get", function_to_get_credential } terminated + * by CREDENTIAL_OP_END. + */ +struct credential_operation const credential_helper_ops[]; + +/* ---------------- common helper functions ----------------- */ + +static inline void free_password(char *password) +{ + char *c = password; + if (!password) + return; + + while (*c) *c++ = '\0'; + free(password); +} + +static inline void warning(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + fprintf(stderr, "warning: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n" ); + va_end(ap); +} + +static inline void error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n" ); + va_end(ap); +} + +static inline void die(const char *fmt, ...) +{ + va_list ap; + + va_start(ap,fmt); + error(fmt, ap); + va_end(ap); + exit(EXIT_FAILURE); +} + +static inline void die_errno(int err) +{ + error("%s", strerror(err)); + exit(EXIT_FAILURE); +} + +static inline char *xstrdup(const char *str) +{ + char *ret = strdup(str); + if (!ret) + die_errno(errno); + + return ret; +} + +/* ----------------- GNOME Keyring functions ----------------- */ + +/* create a special keyring option string, if path is given */ +static char* keyring_object(struct credential *c) +{ + char* object = NULL; + + if (!c->path) + return object; + + object = (char*) malloc(strlen(c->host)+strlen(c->path)+8); + if(!object) + die_errno(errno); + + if(c->port) + sprintf(object,"%s:%hd/%s",c->host,c->port,c->path); + else + sprintf(object,"%s/%s",c->host,c->path); + + return object; +} + +int keyring_get(struct credential *c) +{ + char* object = NULL; + GList *entries; + GnomeKeyringNetworkPasswordData *password_data; + GnomeKeyringResult result; + + if (!c->protocol || !(c->host || c->path)) + return EXIT_FAILURE; + + object = keyring_object(c); + + result = gnome_keyring_find_network_password_sync( + c->username, + NULL /* domain */, + c->host, + object, + c->protocol, + NULL /* authtype */, + c->port, + &entries); + + free(object); + + if (result == GNOME_KEYRING_RESULT_NO_MATCH) + return EXIT_SUCCESS; + + if (result == GNOME_KEYRING_RESULT_CANCELLED) + return EXIT_SUCCESS; + + if (result != GNOME_KEYRING_RESULT_OK) { + error("%s",gnome_keyring_result_to_message(result)); + return EXIT_FAILURE; + } + + /* pick the first one from the list */ + password_data = (GnomeKeyringNetworkPasswordData *) entries->data; + + free_password(c->password); + c->password = xstrdup(password_data->password); + + if (!c->username) + c->username = xstrdup(password_data->user); + + gnome_keyring_network_password_list_free(entries); + + return EXIT_SUCCESS; +} + + +int keyring_store(struct credential *c) +{ + guint32 item_id; + char *object = NULL; + + /* + * Sanity check that what we are storing is actually sensible. + * In particular, we can't make a URL without a protocol field. + * Without either a host or pathname (depending on the scheme), + * we have no primary key. And without a username and password, + * we are not actually storing a credential. + */ + if (!c->protocol || !(c->host || c->path) || + !c->username || !c->password) + return EXIT_FAILURE; + + object = keyring_object(c); + + gnome_keyring_set_network_password_sync( + GNOME_KEYRING_DEFAULT, + c->username, + NULL /* domain */, + c->host, + object, + c->protocol, + NULL /* authtype */, + c->port, + c->password, + &item_id); + + free(object); + return EXIT_SUCCESS; +} + +int keyring_erase(struct credential *c) +{ + char *object = NULL; + GList *entries; + GnomeKeyringNetworkPasswordData *password_data; + GnomeKeyringResult result; + + /* + * Sanity check that we actually have something to match + * against. The input we get is a restrictive pattern, + * so technically a blank credential means "erase everything". + * But it is too easy to accidentally send this, since it is equivalent + * to empty input. So explicitly disallow it, and require that the + * pattern have some actual content to match. + */ + if (!c->protocol && !c->host && !c->path && !c->username) + return EXIT_FAILURE; + + object = keyring_object(c); + + result = gnome_keyring_find_network_password_sync( + c->username, + NULL /* domain */, + c->host, + object, + c->protocol, + NULL /* authtype */, + c->port, + &entries); + + free(object); + + if (result == GNOME_KEYRING_RESULT_NO_MATCH) + return EXIT_SUCCESS; + + if (result == GNOME_KEYRING_RESULT_CANCELLED) + return EXIT_SUCCESS; + + if (result != GNOME_KEYRING_RESULT_OK) + { + error("%s",gnome_keyring_result_to_message(result)); + return EXIT_FAILURE; + } + + /* pick the first one from the list (delete all matches?) */ + password_data = (GnomeKeyringNetworkPasswordData *) entries->data; + + result = gnome_keyring_item_delete_sync( + password_data->keyring, password_data->item_id); + + gnome_keyring_network_password_list_free(entries); + + if (result != GNOME_KEYRING_RESULT_OK) + { + error("%s",gnome_keyring_result_to_message(result)); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +/* + * Table with helper operation callbacks, used by generic + * credential helper main function. + */ +struct credential_operation const credential_helper_ops[] = +{ + { "get", keyring_get }, + { "store", keyring_store }, + { "erase", keyring_erase }, + CREDENTIAL_OP_END +}; + +/* ------------------ credential functions ------------------ */ + +void credential_init(struct credential *c) +{ + memset(c, 0, sizeof(*c)); +} + +void credential_clear(struct credential *c) +{ + free(c->protocol); + free(c->host); + free(c->path); + free(c->username); + free_password(c->password); + + credential_init(c); +} + +int credential_read(struct credential *c) +{ + char buf[1024]; + ssize_t line_len = 0; + char *key = buf; + char *value; + + while (fgets(buf, sizeof(buf), stdin)) + { + line_len = strlen(buf); + + if(buf[line_len-1]=='\n') + buf[--line_len]='\0'; + + if(!line_len) + break; + + value = strchr(buf,'='); + if(!value) { + warning("invalid credential line: %s", key); + return -1; + } + *value++ = '\0'; + + if (!strcmp(key, "protocol")) { + free(c->protocol); + c->protocol = xstrdup(value); + } else if (!strcmp(key, "host")) { + free(c->host); + c->host = xstrdup(value); + value = strrchr(c->host,':'); + if (value) { + *value++ = '\0'; + c->port = atoi(value); + } + } else if (!strcmp(key, "path")) { + free(c->path); + c->path = xstrdup(value); + } else if (!strcmp(key, "username")) { + free(c->username); + c->username = xstrdup(value); + } else if (!strcmp(key, "password")) { + free_password(c->password); + c->password = xstrdup(value); + while (*value) *value++ = '\0'; + } + /* + * Ignore other lines; we don't know what they mean, but + * this future-proofs us when later versions of git do + * learn new lines, and the helpers are updated to match. + */ + } + return 0; +} + +void credential_write_item(FILE *fp, const char *key, const char *value) +{ + if (!value) + return; + fprintf(fp, "%s=%s\n", key, value); +} + +void credential_write(const struct credential *c) +{ + /* only write username/password, if set */ + credential_write_item(stdout, "username", c->username); + credential_write_item(stdout, "password", c->password); +} + +static void usage(const char *name) +{ + struct credential_operation const *try_op = credential_helper_ops; + const char *basename = strrchr(name,'/'); + + basename = (basename) ? basename + 1 : name; + fprintf(stderr, "Usage: %s <", basename); + while(try_op->name) { + fprintf(stderr,"%s",(try_op++)->name); + if(try_op->name) + fprintf(stderr,"%s","|"); + } + fprintf(stderr,"%s",">\n"); +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_SUCCESS; + + struct credential_operation const *try_op = credential_helper_ops; + struct credential cred = CREDENTIAL_INIT; + + if (!argv[1]) { + usage(argv[0]); + goto out; + } + + /* lookup operation callback */ + while(try_op->name && strcmp(argv[1], try_op->name)) + try_op++; + + /* unsupported operation given -- ignore silently */ + if(!try_op->name || !try_op->op) + goto out; + + ret = credential_read(&cred); + if(ret) + goto out; + + /* perform credential operation */ + ret = (*try_op->op)(&cred); + + credential_write(&cred); + +out: + credential_clear(&cred); + return ret; +} diff --git a/contrib/credential/wincred/Makefile b/contrib/credential/wincred/Makefile new file mode 100644 index 0000000000..bad45ca47a --- /dev/null +++ b/contrib/credential/wincred/Makefile @@ -0,0 +1,14 @@ +all: git-credential-wincred.exe + +CC = gcc +RM = rm -f +CFLAGS = -O2 -Wall + +-include ../../../config.mak.autogen +-include ../../../config.mak + +git-credential-wincred.exe : git-credential-wincred.c + $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ + +clean: + $(RM) git-credential-wincred.exe diff --git a/contrib/credential/wincred/git-credential-wincred.c b/contrib/credential/wincred/git-credential-wincred.c new file mode 100644 index 0000000000..cbaec5f24b --- /dev/null +++ b/contrib/credential/wincred/git-credential-wincred.c @@ -0,0 +1,357 @@ +/* + * A git credential helper that interface with Windows' Credential Manager + * + */ +#include <windows.h> +#include <stdio.h> +#include <io.h> +#include <fcntl.h> + +/* common helpers */ + +static void die(const char *err, ...) +{ + char msg[4096]; + va_list params; + va_start(params, err); + vsnprintf(msg, sizeof(msg), err, params); + fprintf(stderr, "%s\n", msg); + va_end(params); + exit(1); +} + +static void *xmalloc(size_t size) +{ + void *ret = malloc(size); + if (!ret && !size) + ret = malloc(1); + if (!ret) + die("Out of memory"); + return ret; +} + +static char *xstrdup(const char *str) +{ + char *ret = strdup(str); + if (!ret) + die("Out of memory"); + return ret; +} + +/* MinGW doesn't have wincred.h, so we need to define stuff */ + +typedef struct _CREDENTIAL_ATTRIBUTEW { + LPWSTR Keyword; + DWORD Flags; + DWORD ValueSize; + LPBYTE Value; +} CREDENTIAL_ATTRIBUTEW, *PCREDENTIAL_ATTRIBUTEW; + +typedef struct _CREDENTIALW { + DWORD Flags; + DWORD Type; + LPWSTR TargetName; + LPWSTR Comment; + FILETIME LastWritten; + DWORD CredentialBlobSize; + LPBYTE CredentialBlob; + DWORD Persist; + DWORD AttributeCount; + PCREDENTIAL_ATTRIBUTEW Attributes; + LPWSTR TargetAlias; + LPWSTR UserName; +} CREDENTIALW, *PCREDENTIALW; + +#define CRED_TYPE_GENERIC 1 +#define CRED_PERSIST_LOCAL_MACHINE 2 +#define CRED_MAX_ATTRIBUTES 64 + +typedef BOOL (WINAPI *CredWriteWT)(PCREDENTIALW, DWORD); +typedef BOOL (WINAPI *CredUnPackAuthenticationBufferWT)(DWORD, PVOID, DWORD, + LPWSTR, DWORD *, LPWSTR, DWORD *, LPWSTR, DWORD *); +typedef BOOL (WINAPI *CredEnumerateWT)(LPCWSTR, DWORD, DWORD *, + PCREDENTIALW **); +typedef BOOL (WINAPI *CredPackAuthenticationBufferWT)(DWORD, LPWSTR, LPWSTR, + PBYTE, DWORD *); +typedef VOID (WINAPI *CredFreeT)(PVOID); +typedef BOOL (WINAPI *CredDeleteWT)(LPCWSTR, DWORD, DWORD); + +static HMODULE advapi, credui; +static CredWriteWT CredWriteW; +static CredUnPackAuthenticationBufferWT CredUnPackAuthenticationBufferW; +static CredEnumerateWT CredEnumerateW; +static CredPackAuthenticationBufferWT CredPackAuthenticationBufferW; +static CredFreeT CredFree; +static CredDeleteWT CredDeleteW; + +static void load_cred_funcs(void) +{ + /* load DLLs */ + advapi = LoadLibrary("advapi32.dll"); + credui = LoadLibrary("credui.dll"); + if (!advapi || !credui) + die("failed to load DLLs"); + + /* get function pointers */ + CredWriteW = (CredWriteWT)GetProcAddress(advapi, "CredWriteW"); + CredUnPackAuthenticationBufferW = (CredUnPackAuthenticationBufferWT) + GetProcAddress(credui, "CredUnPackAuthenticationBufferW"); + CredEnumerateW = (CredEnumerateWT)GetProcAddress(advapi, + "CredEnumerateW"); + CredPackAuthenticationBufferW = (CredPackAuthenticationBufferWT) + GetProcAddress(credui, "CredPackAuthenticationBufferW"); + CredFree = (CredFreeT)GetProcAddress(advapi, "CredFree"); + CredDeleteW = (CredDeleteWT)GetProcAddress(advapi, "CredDeleteW"); + if (!CredWriteW || !CredUnPackAuthenticationBufferW || + !CredEnumerateW || !CredPackAuthenticationBufferW || !CredFree || + !CredDeleteW) + die("failed to load functions"); +} + +static char target_buf[1024]; +static char *protocol, *host, *path, *username; +static WCHAR *wusername, *password, *target; + +static void write_item(const char *what, WCHAR *wbuf) +{ + char *buf; + int len = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, NULL, 0, NULL, + FALSE); + buf = xmalloc(len); + + if (!WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, buf, len, NULL, FALSE)) + die("WideCharToMultiByte failed!"); + + printf("%s=", what); + fwrite(buf, 1, len - 1, stdout); + putchar('\n'); + free(buf); +} + +static int match_attr(const CREDENTIALW *cred, const WCHAR *keyword, + const char *want) +{ + int i; + if (!want) + return 1; + + for (i = 0; i < cred->AttributeCount; ++i) + if (!wcscmp(cred->Attributes[i].Keyword, keyword)) + return !strcmp((const char *)cred->Attributes[i].Value, + want); + + return 0; /* not found */ +} + +static int match_cred(const CREDENTIALW *cred) +{ + return (!wusername || !wcscmp(wusername, cred->UserName)) && + match_attr(cred, L"git_protocol", protocol) && + match_attr(cred, L"git_host", host) && + match_attr(cred, L"git_path", path); +} + +static void get_credential(void) +{ + WCHAR *user_buf, *pass_buf; + DWORD user_buf_size = 0, pass_buf_size = 0; + CREDENTIALW **creds, *cred = NULL; + DWORD num_creds; + int i; + + if (!CredEnumerateW(L"git:*", 0, &num_creds, &creds)) + return; + + /* search for the first credential that matches username */ + for (i = 0; i < num_creds; ++i) + if (match_cred(creds[i])) { + cred = creds[i]; + break; + } + if (!cred) + return; + + CredUnPackAuthenticationBufferW(0, cred->CredentialBlob, + cred->CredentialBlobSize, NULL, &user_buf_size, NULL, NULL, + NULL, &pass_buf_size); + + user_buf = xmalloc(user_buf_size * sizeof(WCHAR)); + pass_buf = xmalloc(pass_buf_size * sizeof(WCHAR)); + + if (!CredUnPackAuthenticationBufferW(0, cred->CredentialBlob, + cred->CredentialBlobSize, user_buf, &user_buf_size, NULL, NULL, + pass_buf, &pass_buf_size)) + die("CredUnPackAuthenticationBuffer failed"); + + CredFree(creds); + + /* zero-terminate (sizes include zero-termination) */ + user_buf[user_buf_size - 1] = L'\0'; + pass_buf[pass_buf_size - 1] = L'\0'; + + write_item("username", user_buf); + write_item("password", pass_buf); + + free(user_buf); + free(pass_buf); +} + +static void write_attr(CREDENTIAL_ATTRIBUTEW *attr, const WCHAR *keyword, + const char *value) +{ + attr->Keyword = (LPWSTR)keyword; + attr->Flags = 0; + attr->ValueSize = strlen(value) + 1; /* store zero-termination */ + attr->Value = (LPBYTE)value; +} + +static void store_credential(void) +{ + CREDENTIALW cred; + BYTE *auth_buf; + DWORD auth_buf_size = 0; + CREDENTIAL_ATTRIBUTEW attrs[CRED_MAX_ATTRIBUTES]; + + if (!wusername || !password) + return; + + /* query buffer size */ + CredPackAuthenticationBufferW(0, wusername, password, + NULL, &auth_buf_size); + + auth_buf = xmalloc(auth_buf_size); + + if (!CredPackAuthenticationBufferW(0, wusername, password, + auth_buf, &auth_buf_size)) + die("CredPackAuthenticationBuffer failed"); + + cred.Flags = 0; + cred.Type = CRED_TYPE_GENERIC; + cred.TargetName = target; + cred.Comment = L"saved by git-credential-wincred"; + cred.CredentialBlobSize = auth_buf_size; + cred.CredentialBlob = auth_buf; + cred.Persist = CRED_PERSIST_LOCAL_MACHINE; + cred.AttributeCount = 1; + cred.Attributes = attrs; + cred.TargetAlias = NULL; + cred.UserName = wusername; + + write_attr(attrs, L"git_protocol", protocol); + + if (host) { + write_attr(attrs + cred.AttributeCount, L"git_host", host); + cred.AttributeCount++; + } + + if (path) { + write_attr(attrs + cred.AttributeCount, L"git_path", path); + cred.AttributeCount++; + } + + if (!CredWriteW(&cred, 0)) + die("CredWrite failed"); +} + +static void erase_credential(void) +{ + CREDENTIALW **creds; + DWORD num_creds; + int i; + + if (!CredEnumerateW(L"git:*", 0, &num_creds, &creds)) + return; + + for (i = 0; i < num_creds; ++i) { + if (match_cred(creds[i])) + CredDeleteW(creds[i]->TargetName, creds[i]->Type, 0); + } + + CredFree(creds); +} + +static WCHAR *utf8_to_utf16_dup(const char *str) +{ + int wlen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); + WCHAR *wstr = xmalloc(sizeof(WCHAR) * wlen); + MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, wlen); + return wstr; +} + +static void read_credential(void) +{ + char buf[1024]; + + while (fgets(buf, sizeof(buf), stdin)) { + char *v; + + if (!strcmp(buf, "\n")) + break; + buf[strlen(buf)-1] = '\0'; + + v = strchr(buf, '='); + if (!v) + die("bad input: %s", buf); + *v++ = '\0'; + + if (!strcmp(buf, "protocol")) + protocol = xstrdup(v); + else if (!strcmp(buf, "host")) + host = xstrdup(v); + else if (!strcmp(buf, "path")) + path = xstrdup(v); + else if (!strcmp(buf, "username")) { + username = xstrdup(v); + wusername = utf8_to_utf16_dup(v); + } else if (!strcmp(buf, "password")) + password = utf8_to_utf16_dup(v); + else + die("unrecognized input"); + } +} + +int main(int argc, char *argv[]) +{ + const char *usage = + "Usage: git credential-wincred <get|store|erase>\n"; + + if (!argv[1]) + die(usage); + + /* git use binary pipes to avoid CRLF-issues */ + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); + + read_credential(); + + load_cred_funcs(); + + if (!protocol || !(host || path)) + return 0; + + /* prepare 'target', the unique key for the credential */ + strncat(target_buf, "git:", sizeof(target_buf)); + strncat(target_buf, protocol, sizeof(target_buf)); + strncat(target_buf, "://", sizeof(target_buf)); + if (username) { + strncat(target_buf, username, sizeof(target_buf)); + strncat(target_buf, "@", sizeof(target_buf)); + } + if (host) + strncat(target_buf, host, sizeof(target_buf)); + if (path) { + strncat(target_buf, "/", sizeof(target_buf)); + strncat(target_buf, path, sizeof(target_buf)); + } + + target = utf8_to_utf16_dup(target_buf); + + if (!strcmp(argv[1], "get")) + get_credential(); + else if (!strcmp(argv[1], "store")) + store_credential(); + else if (!strcmp(argv[1], "erase")) + erase_credential(); + /* otherwise, ignore unknown action */ + return 0; +} diff --git a/contrib/examples/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c index 0d54aa7061..8bc8c7533a 100644 --- a/contrib/examples/builtin-fetch--tool.c +++ b/contrib/examples/builtin-fetch--tool.c @@ -96,7 +96,7 @@ static int update_local_ref(const char *name, strcpy(oldh, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV)); strcpy(newh, find_unique_abbrev(sha1_new, DEFAULT_ABBREV)); - if (in_merge_bases(current, &updated, 1)) { + if (in_merge_bases(current, updated)) { fprintf(stderr, "* %s: fast-forward to %s\n", name, note); fprintf(stderr, " old..new: %s..%s\n", oldh, newh); diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump index a33674e47a..dc90cd6379 100755 --- a/contrib/git-jump/git-jump +++ b/contrib/git-jump/git-jump @@ -21,9 +21,9 @@ open_editor() { } mode_diff() { - git diff --relative "$@" | + git diff --no-prefix --relative "$@" | perl -ne ' - if (m{^\+\+\+ b/(.*)}) { $file = $1; next } + if (m{^\+\+\+ (.*)}) { $file = $1; next } defined($file) or next; if (m/^@@ .*\+(\d+)/) { $line = $1; next } defined($line) or next; 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 @@ -30,6 +30,7 @@ static const char daemon_usage[] = " [--interpolated-path=<path>]\n" " [--reuseaddr] [--pid-file=<file>]\n" " [--(enable|disable|allow-override|forbid-override)=<service>]\n" +" [--access-hook=<path>]\n" " [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n" " [--detach] [--user=<user> [--group=<group>]]\n" " [<directory>...]"; @@ -256,6 +257,71 @@ static int daemon_error(const char *dir, const char *msg) return -1; } +static char *access_hook; + +static int run_access_hook(struct daemon_service *service, const char *dir, const char *path) +{ + struct child_process child; + struct strbuf buf = STRBUF_INIT; + const char *argv[8]; + const char **arg = argv; + char *eol; + int seen_errors = 0; + +#define STRARG(x) ((x) ? (x) : "") + *arg++ = access_hook; + *arg++ = service->name; + *arg++ = path; + *arg++ = STRARG(hostname); + *arg++ = STRARG(canon_hostname); + *arg++ = STRARG(ip_address); + *arg++ = STRARG(tcp_port); + *arg = NULL; +#undef STRARG + + memset(&child, 0, sizeof(child)); + child.use_shell = 1; + child.argv = argv; + child.no_stdin = 1; + child.no_stderr = 1; + child.out = -1; + if (start_command(&child)) { + logerror("daemon access hook '%s' failed to start", + access_hook); + goto error_return; + } + if (strbuf_read(&buf, child.out, 0) < 0) { + logerror("failed to read from pipe to daemon access hook '%s'", + access_hook); + strbuf_reset(&buf); + seen_errors = 1; + } + if (close(child.out) < 0) { + logerror("failed to close pipe to daemon access hook '%s'", + access_hook); + seen_errors = 1; + } + if (finish_command(&child)) + seen_errors = 1; + + if (!seen_errors) { + strbuf_release(&buf); + return 0; + } + +error_return: + strbuf_ltrim(&buf); + if (!buf.len) + strbuf_addstr(&buf, "service rejected"); + eol = strchr(buf.buf, '\n'); + if (eol) + *eol = '\0'; + errno = EACCES; + daemon_error(dir, buf.buf); + strbuf_release(&buf); + return -1; +} + static int run_service(char *dir, struct daemon_service *service) { const char *path; @@ -304,6 +370,13 @@ static int run_service(char *dir, struct daemon_service *service) } /* + * Optionally, a hook can choose to deny access to the + * repository depending on the phase of the moon. + */ + if (access_hook && run_access_hook(service, dir, path)) + return -1; + + /* * We'll ignore SIGTERM from now on, we have a * good client. */ @@ -1142,6 +1215,10 @@ int main(int argc, char **argv) export_all_trees = 1; continue; } + if (!prefixcmp(arg, "--access-hook=")) { + access_hook = arg + 14; + continue; + } if (!prefixcmp(arg, "--timeout=")) { timeout = atoi(arg+10); continue; diff --git a/diff-lib.c b/diff-lib.c index fc0dff31b5..f35de0ffa0 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -206,7 +206,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option) if (silent_on_removed) continue; diff_addremove(&revs->diffopt, '-', ce->ce_mode, - ce->sha1, ce->name, 0); + ce->sha1, !is_null_sha1(ce->sha1), + ce->name, 0); continue; } changed = match_stat_with_submodule(&revs->diffopt, ce, &st, @@ -220,6 +221,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) newmode = ce_mode_from_stat(ce, st.st_mode); diff_change(&revs->diffopt, oldmode, newmode, ce->sha1, (changed ? null_sha1 : ce->sha1), + !is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)), ce->name, 0, dirty_submodule); } @@ -236,11 +238,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option) static void diff_index_show_file(struct rev_info *revs, const char *prefix, struct cache_entry *ce, - const unsigned char *sha1, unsigned int mode, + const unsigned char *sha1, int sha1_valid, + unsigned int mode, unsigned dirty_submodule) { diff_addremove(&revs->diffopt, prefix[0], mode, - sha1, ce->name, dirty_submodule); + sha1, sha1_valid, ce->name, dirty_submodule); } static int get_stat_data(struct cache_entry *ce, @@ -295,7 +298,7 @@ static void show_new_file(struct rev_info *revs, &dirty_submodule, &revs->diffopt) < 0) return; - diff_index_show_file(revs, "+", new, sha1, mode, dirty_submodule); + diff_index_show_file(revs, "+", new, sha1, !is_null_sha1(sha1), mode, dirty_submodule); } static int show_modified(struct rev_info *revs, @@ -312,7 +315,7 @@ static int show_modified(struct rev_info *revs, &dirty_submodule, &revs->diffopt) < 0) { if (report_missing) diff_index_show_file(revs, "-", old, - old->sha1, old->ce_mode, 0); + old->sha1, 1, old->ce_mode, 0); return -1; } @@ -347,7 +350,8 @@ static int show_modified(struct rev_info *revs, return 0; diff_change(&revs->diffopt, oldmode, mode, - old->sha1, sha1, old->name, 0, dirty_submodule); + old->sha1, sha1, 1, !is_null_sha1(sha1), + old->name, 0, dirty_submodule); return 0; } @@ -380,7 +384,7 @@ static void do_oneway_diff(struct unpack_trees_options *o, struct diff_filepair *pair; pair = diff_unmerge(&revs->diffopt, idx->name); if (tree) - fill_filespec(pair->one, tree->sha1, tree->ce_mode); + fill_filespec(pair->one, tree->sha1, 1, tree->ce_mode); return; } @@ -396,7 +400,7 @@ static void do_oneway_diff(struct unpack_trees_options *o, * Something removed from the tree? */ if (!idx) { - diff_index_show_file(revs, "-", tree, tree->sha1, tree->ce_mode, 0); + diff_index_show_file(revs, "-", tree, tree->sha1, 1, tree->ce_mode, 0); return; } diff --git a/diff-no-index.c b/diff-no-index.c index 7d805a06af..74da659368 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -82,7 +82,7 @@ static struct diff_filespec *noindex_filespec(const char *name, int mode) if (!name) name = "/dev/null"; s = alloc_filespec(name); - fill_filespec(s, null_sha1, mode); + fill_filespec(s, null_sha1, 0, mode); if (name == file_from_standard_input) populate_from_stdin(s); return s; @@ -258,8 +258,7 @@ void diff_no_index(struct rev_info *revs, DIFF_OPT_SET(&revs->diffopt, NO_INDEX); revs->max_count = -2; - if (diff_setup_done(&revs->diffopt) < 0) - die("diff_setup_done failed"); + diff_setup_done(&revs->diffopt); setup_diff_pager(&revs->diffopt); DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS); @@ -25,7 +25,8 @@ static int diff_detect_rename_default; static int diff_rename_limit_default = 400; static int diff_suppress_blank_empty; -int diff_use_color_default = -1; +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; @@ -141,6 +142,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; @@ -574,6 +581,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb, if (!endp) { const char *plain = diff_get_color(ecb->color_diff, DIFF_PLAIN); + putc('\n', ecb->opt->file); emit_line_0(ecb->opt, plain, reset, '\\', nneof, strlen(nneof)); } @@ -1397,11 +1405,11 @@ int print_stat_summary(FILE *fp, int files, int insertions, int deletions) if (!files) { assert(insertions == 0 && deletions == 0); - return fprintf(fp, "%s\n", _(" 0 files changed")); + return fprintf(fp, "%s\n", " 0 files changed"); } strbuf_addf(&sb, - Q_(" %d file changed", " %d files changed", files), + (files == 1) ? " %d file changed" : " %d files changed", files); /* @@ -1418,8 +1426,7 @@ int print_stat_summary(FILE *fp, int files, int insertions, int deletions) * do not translate it. */ strbuf_addf(&sb, - Q_(", %d insertion(+)", ", %d insertions(+)", - insertions), + (insertions == 1) ? ", %d insertion(+)" : ", %d insertions(+)", insertions); } @@ -1429,8 +1436,7 @@ int print_stat_summary(FILE *fp, int files, int insertions, int deletions) * do not translate it. */ strbuf_addf(&sb, - Q_(", %d deletion(-)", ", %d deletions(-)", - deletions), + (deletions == 1) ? ", %d deletion(-)" : ", %d deletions(-)", deletions); } strbuf_addch(&sb, '\n'); @@ -2541,12 +2547,12 @@ void free_filespec(struct diff_filespec *spec) } void fill_filespec(struct diff_filespec *spec, const unsigned char *sha1, - unsigned short mode) + int sha1_valid, unsigned short mode) { if (mode) { spec->mode = canon_mode(mode); hashcpy(spec->sha1, sha1); - spec->sha1_valid = !is_null_sha1(sha1); + spec->sha1_valid = sha1_valid; } } @@ -3171,7 +3177,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; @@ -3187,7 +3193,7 @@ void diff_setup(struct diff_options *options) } } -int diff_setup_done(struct diff_options *options) +void diff_setup_done(struct diff_options *options) { int count = 0; @@ -3286,8 +3292,6 @@ int diff_setup_done(struct diff_options *options) options->output_format = DIFF_FORMAT_NO_OUTPUT; DIFF_OPT_SET(options, EXIT_WITH_STATUS); } - - return 0; } static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val) @@ -4693,6 +4697,7 @@ static int is_submodule_ignored(const char *path, struct diff_options *options) void diff_addremove(struct diff_options *options, int addremove, unsigned mode, const unsigned char *sha1, + int sha1_valid, const char *concatpath, unsigned dirty_submodule) { struct diff_filespec *one, *two; @@ -4724,9 +4729,9 @@ void diff_addremove(struct diff_options *options, two = alloc_filespec(concatpath); if (addremove != '+') - fill_filespec(one, sha1, mode); + fill_filespec(one, sha1, sha1_valid, mode); if (addremove != '-') { - fill_filespec(two, sha1, mode); + fill_filespec(two, sha1, sha1_valid, mode); two->dirty_submodule = dirty_submodule; } @@ -4739,6 +4744,7 @@ void diff_change(struct diff_options *options, unsigned old_mode, unsigned new_mode, const unsigned char *old_sha1, const unsigned char *new_sha1, + int old_sha1_valid, int new_sha1_valid, const char *concatpath, unsigned old_dirty_submodule, unsigned new_dirty_submodule) { @@ -4753,6 +4759,8 @@ void diff_change(struct diff_options *options, const unsigned char *tmp_c; tmp = old_mode; old_mode = new_mode; new_mode = tmp; tmp_c = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_c; + tmp = old_sha1_valid; old_sha1_valid = new_sha1_valid; + new_sha1_valid = tmp; tmp = old_dirty_submodule; old_dirty_submodule = new_dirty_submodule; new_dirty_submodule = tmp; } @@ -4763,8 +4771,8 @@ void diff_change(struct diff_options *options, one = alloc_filespec(concatpath); two = alloc_filespec(concatpath); - fill_filespec(one, old_sha1, old_mode); - fill_filespec(two, new_sha1, new_mode); + fill_filespec(one, old_sha1, old_sha1_valid, old_mode); + fill_filespec(two, new_sha1, new_sha1_valid, new_mode); one->dirty_submodule = old_dirty_submodule; two->dirty_submodule = new_dirty_submodule; @@ -19,12 +19,14 @@ typedef void (*change_fn_t)(struct diff_options *options, unsigned old_mode, unsigned new_mode, const unsigned char *old_sha1, const unsigned char *new_sha1, + int old_sha1_valid, int new_sha1_valid, const char *fullpath, unsigned old_dirty_submodule, unsigned new_dirty_submodule); typedef void (*add_remove_fn_t)(struct diff_options *options, int addremove, unsigned mode, const unsigned char *sha1, + int sha1_valid, const char *fullpath, unsigned dirty_submodule); typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, @@ -214,12 +216,15 @@ extern void diff_addremove(struct diff_options *, int addremove, unsigned mode, const unsigned char *sha1, + int sha1_valid, const char *fullpath, unsigned dirty_submodule); extern void diff_change(struct diff_options *, unsigned mode1, unsigned mode2, const unsigned char *sha1, const unsigned char *sha2, + int sha1_valid, + int sha2_valid, const char *fullpath, unsigned dirty_submodule1, unsigned dirty_submodule2); @@ -238,10 +243,9 @@ extern int parse_long_opt(const char *opt, const char **argv, extern int git_diff_basic_config(const char *var, const char *value, void *cb); extern int git_diff_ui_config(const char *var, const char *value, void *cb); -extern int diff_use_color_default; extern void diff_setup(struct diff_options *); extern int diff_opt_parse(struct diff_options *, const char **, int); -extern int diff_setup_done(struct diff_options *); +extern void diff_setup_done(struct diff_options *); #define DIFF_DETECT_RENAME 1 #define DIFF_DETECT_COPY 2 diff --git a/diffcore-rename.c b/diffcore-rename.c index 216a7a4bbc..512d0ac5fd 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -48,7 +48,7 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two, memmove(rename_dst + first + 1, rename_dst + first, (rename_dst_nr - first - 1) * sizeof(*rename_dst)); rename_dst[first].two = alloc_filespec(two->path); - fill_filespec(rename_dst[first].two, two->sha1, two->mode); + fill_filespec(rename_dst[first].two, two->sha1, two->sha1_valid, two->mode); rename_dst[first].pair = NULL; return &(rename_dst[first]); } diff --git a/diffcore.h b/diffcore.h index be0739c5c4..1c16c8595b 100644 --- a/diffcore.h +++ b/diffcore.h @@ -55,7 +55,7 @@ struct diff_filespec { extern struct diff_filespec *alloc_filespec(const char *); extern void free_filespec(struct diff_filespec *); extern void fill_filespec(struct diff_filespec *, const unsigned char *, - unsigned short); + int, unsigned short); extern int diff_populate_filespec(struct diff_filespec *, int); extern void diff_free_filespec_data(struct diff_filespec *); @@ -397,6 +397,8 @@ int add_excludes_from_file_to_list(const char *fname, fd = open(fname, O_RDONLY); if (fd < 0 || fstat(fd, &st) < 0) { + if (errno != ENOENT) + warn_on_inaccessible(fname); if (0 <= fd) close(fd); if (!check_index || @@ -1311,9 +1313,9 @@ void setup_standard_excludes(struct dir_struct *dir) home_config_paths(NULL, &xdg_path, "ignore"); excludes_file = xdg_path; } - if (!access(path, R_OK)) + if (!access_or_warn(path, R_OK)) add_excludes_from_file(dir, path); - if (excludes_file && !access(excludes_file, R_OK)) + if (excludes_file && !access_or_warn(excludes_file, R_OK)) add_excludes_from_file(dir, excludes_file); } diff --git a/fast-import.c b/fast-import.c index eed97c8fa9..c2a814ec66 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1691,7 +1691,7 @@ static int update_branch(struct branch *b) return error("Branch %s is missing commits.", b->name); } - if (!in_merge_bases(old_cmit, &new_cmit, 1)) { + if (!in_merge_bases(old_cmit, new_cmit)) { unlock_ref(lock); warning("Not updating %s" " (new tip %s does not contain %s)", diff --git a/fetch-pack.h b/fetch-pack.h index 7c2069c972..cb148719bf 100644 --- a/fetch-pack.h +++ b/fetch-pack.h @@ -1,6 +1,8 @@ #ifndef FETCH_PACK_H #define FETCH_PACK_H +#include "string-list.h" + struct fetch_pack_args { const char *uploadpack; int unpacklimit; @@ -17,12 +19,18 @@ struct fetch_pack_args { stateless_rpc:1; }; +/* + * sought contains the full names of remote references that should be + * updated from. On return, the names that were found on the remote + * will have been removed from the list. The util members of the + * string_list_items are used internally; they must be NULL on entry + * (and will be NULL on exit). + */ struct ref *fetch_pack(struct fetch_pack_args *args, - int fd[], struct child_process *conn, - const struct ref *ref, - const char *dest, - int nr_heads, - char **heads, - char **pack_lockfile); + int fd[], struct child_process *conn, + const struct ref *ref, + const char *dest, + struct string_list *sought, + char **pack_lockfile); #endif @@ -139,6 +139,7 @@ static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, con static int fsck_tree(struct tree *item, int strict, fsck_error error_func) { int retval; + int has_null_sha1 = 0; int has_full_path = 0; int has_empty_name = 0; int has_zero_pad = 0; @@ -157,9 +158,12 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func) while (desc.size) { unsigned mode; const char *name; + const unsigned char *sha1; - tree_entry_extract(&desc, &name, &mode); + sha1 = tree_entry_extract(&desc, &name, &mode); + if (is_null_sha1(sha1)) + has_null_sha1 = 1; if (strchr(name, '/')) has_full_path = 1; if (!*name) @@ -207,6 +211,8 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func) } retval = 0; + if (has_null_sha1) + retval += error_func(&item->object, FSCK_WARN, "contains entries pointing to null sha1"); if (has_full_path) retval += error_func(&item->object, FSCK_WARN, "contains full pathnames"); if (has_empty_name) @@ -4,6 +4,8 @@ #include "git-compat-util.h" #include "gettext.h" +#include "strbuf.h" +#include "utf8.h" #ifndef NO_GETTEXT # include <locale.h> @@ -27,10 +29,9 @@ int use_gettext_poison(void) #endif #ifndef NO_GETTEXT +static const char *charset; static void init_gettext_charset(const char *domain) { - const char *charset; - /* This trick arranges for messages to be emitted in the user's requested encoding, but avoids setting LC_CTYPE from the @@ -128,4 +129,14 @@ void git_setup_gettext(void) init_gettext_charset("git"); textdomain("git"); } + +/* return the number of columns of string 's' in current locale */ +int gettext_width(const char *s) +{ + static int is_utf8 = -1; + if (is_utf8 == -1) + is_utf8 = !strcmp(charset, "UTF-8"); + + return is_utf8 ? utf8_strwidth(s) : strlen(s); +} #endif @@ -30,10 +30,15 @@ #ifndef NO_GETTEXT extern void git_setup_gettext(void); +extern int gettext_width(const char *s); #else static inline void git_setup_gettext(void) { } +static inline int gettext_width(const char *s) +{ + return strlen(s); +} #endif #ifdef GETTEXT_POISON @@ -44,6 +49,8 @@ extern int use_gettext_poison(void); static inline FORMAT_PRESERVING(1) const char *_(const char *msgid) { + if (!*msgid) + return ""; return use_gettext_poison() ? "# GETTEXT POISON #" : gettext(msgid); } @@ -855,8 +855,8 @@ did you forget to use 'git add'?" eval_gettextln 'Patch failed at $msgnum $FIRSTLINE' if test "$(git config --bool advice.amworkdir)" != false then - eval_gettextln "The copy of the patch that failed is found in: - $dotest/patch" + eval_gettextln 'The copy of the patch that failed is found in: + $dotest/patch' fi stop_here_user_resolve $this fi diff --git a/git-compat-util.h b/git-compat-util.h index 35b095e8ae..2fbf1fd8b1 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -74,7 +74,8 @@ # define _XOPEN_SOURCE 500 # endif #elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \ - !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) + !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \ + !defined(__TANDEM) #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ #endif @@ -98,6 +99,9 @@ #include <stdlib.h> #include <stdarg.h> #include <string.h> +#ifdef __TANDEM /* or HAVE_STRINGS_H or !NO_STRINGS_H? */ +#include <strings.h> /* for strcasecmp() */ +#endif #include <errno.h> #include <limits.h> #include <sys/param.h> @@ -141,6 +145,17 @@ #else #include <stdint.h> #endif +#ifdef NO_INTPTR_T +/* + * On I16LP32, ILP32 and LP64 "long" is the save bet, however + * on LLP86, IL33LLP64 and P64 it needs to be "long long", + * while on IP16 and IP16L32 it is "int" (resp. "short") + * Size needs to match (or exceed) 'sizeof(void *)'. + * We can't take "long long" here as not everybody has it. + */ +typedef long intptr_t; +typedef unsigned long uintptr_t; +#endif #if defined(__CYGWIN__) #undef _XOPEN_SOURCE #include <grp.h> @@ -162,6 +177,22 @@ #define probe_utf8_pathname_composition(a,b) #endif +#ifdef MKDIR_WO_TRAILING_SLASH +#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b)) +extern int compat_mkdir_wo_trailing_slash(const char*, mode_t); +#endif + +#ifdef NO_STRUCT_ITIMERVAL +struct itimerval { + struct timeval it_interval; + struct timeval it_value; +} +#endif + +#ifdef NO_SETITIMER +#define setitimer(which,value,ovalue) +#endif + #ifndef NO_LIBGEN_H #include <libgen.h> #else @@ -604,6 +635,12 @@ int rmdir_or_warn(const char *path); */ int remove_or_warn(unsigned int mode, const char *path); +/* Call access(2), but warn for any error besides ENOENT. */ +int access_or_warn(const char *path, int mode); + +/* Warn on an inaccessible file that ought to be accessible */ +void warn_on_inaccessible(const char *path); + /* Get the passwd entry for the UID of the current process. */ struct passwd *xgetpwuid_self(void); diff --git a/git-cvsimport.perl b/git-cvsimport.perl index 8d41610bcf..8032f23202 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -889,10 +889,37 @@ sub commit { $xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY ** $xtag =~ tr/_/\./ if ( $opt_u ); $xtag =~ s/[\/]/$opt_s/g; - $xtag =~ s/\[//g; - system('git' , 'tag', '-f', $xtag, $cid) == 0 - or die "Cannot create tag $xtag: $!\n"; + # See refs.c for these rules. + # Tag cannot contain bad chars. (See bad_ref_char in refs.c.) + $xtag =~ s/[ ~\^:\\\*\?\[]//g; + # Other bad strings for tags: + # (See check_refname_component in refs.c.) + 1 while $xtag =~ s/ + (?: \.\. # Tag cannot contain '..'. + | \@{ # Tag cannot contain '@{'. + | ^ - # Tag cannot begin with '-'. + | \.lock $ # Tag cannot end with '.lock'. + | ^ \. # Tag cannot begin... + | \. $ # ...or end with '.' + )//xg; + # Tag cannot be empty. + if ($xtag eq '') { + warn("warning: ignoring tag '$tag'", + " with invalid tagname\n"); + return; + } + + if (system('git' , 'tag', '-f', $xtag, $cid) != 0) { + # We did our best to sanitize the tag, but still failed + # for whatever reason. Bail out, and give the user + # enough information to understand if/how we should + # improve the translation in the future. + if ($tag ne $xtag) { + print "Translated '$tag' tag to '$xtag'\n"; + } + die "Cannot create tag $xtag: $!\n"; + } print "Created tag '$xtag' on '$branch'\n" if $opt_v; } diff --git a/git-difftool.perl b/git-difftool.perl index c0798540ad..edd0493a08 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -18,17 +18,11 @@ use File::Copy; use File::Compare; use File::Find; use File::stat; -use File::Path qw(mkpath); +use File::Path qw(mkpath rmtree); use File::Temp qw(tempdir); use Getopt::Long qw(:config pass_through); use Git; -my @tools; -my @working_tree; -my $rc; -my $repo = Git->repository(); -my $repo_path = $repo->repo_path(); - sub usage { my $exitcode = shift; @@ -45,6 +39,8 @@ USAGE sub find_worktree { + my ($repo) = @_; + # Git->repository->wc_path() does not honor changes to the working # tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree' # config variable. @@ -63,10 +59,9 @@ sub find_worktree return $worktree; } -my $workdir = find_worktree(); - sub filter_tool_scripts { + my ($tools) = @_; if (-d $_) { if ($_ ne ".") { # Ignore files in subdirectories @@ -74,17 +69,17 @@ sub filter_tool_scripts } } else { if ((-f $_) && ($_ ne "defaults")) { - push(@tools, $_); + push(@$tools, $_); } } } sub print_tool_help { - my ($cmd, @found, @notfound); + my ($cmd, @found, @notfound, @tools); my $gitpath = Git::exec_path(); - find(\&filter_tool_scripts, "$gitpath/mergetools"); + find(sub { filter_tool_scripts(\@tools) }, "$gitpath/mergetools"); foreach my $tool (@tools) { $cmd = "TOOL_MODE=diff"; @@ -98,34 +93,52 @@ sub print_tool_help } } - print "'git difftool --tool=<tool>' may be set to one of the following:\n"; + print << 'EOF'; +'git difftool --tool=<tool>' may be set to one of the following: +EOF print "\t$_\n" for (sort(@found)); - print "\nThe following tools are valid, but not currently available:\n"; + print << 'EOF'; + +The following tools are valid, but not currently available: +EOF print "\t$_\n" for (sort(@notfound)); - print "\nNOTE: Some of the tools listed above only work in a windowed\n"; - print "environment. If run in a terminal-only session, they will fail.\n"; + print << 'EOF'; +NOTE: Some of the tools listed above only work in a windowed +environment. If run in a terminal-only session, they will fail. +EOF exit(0); } +sub exit_cleanup +{ + my ($tmpdir, $status) = @_; + my $errno = $!; + rmtree($tmpdir); + if ($status and $errno) { + my ($package, $file, $line) = caller(); + warn "$file line $line: $errno\n"; + } + exit($status | ($status >> 8)); +} + sub setup_dir_diff { + my ($repo, $workdir, $symlinks) = @_; + # Run the diff; exit immediately if no diff found # 'Repository' and 'WorkingCopy' must be explicitly set to insure that # if $GIT_DIR and $GIT_WORK_TREE are set in ENV, they are actually used # by Git->repository->command*. - my $diffrepo = Git->repository(Repository => $repo_path, WorkingCopy => $workdir); - my $diffrtn = $diffrepo->command_oneline('diff', '--raw', '--no-abbrev', '-z', @ARGV); - exit(0) if (length($diffrtn) == 0); + my $repo_path = $repo->repo_path(); + my %repo_args = (Repository => $repo_path, WorkingCopy => $workdir); + my $diffrepo = Git->repository(%repo_args); - # Setup temp directories - my $tmpdir = tempdir('git-diffall.XXXXX', CLEANUP => 1, TMPDIR => 1); - my $ldir = "$tmpdir/left"; - my $rdir = "$tmpdir/right"; - mkpath($ldir) or die $!; - mkpath($rdir) or die $!; + my @gitargs = ('diff', '--raw', '--no-abbrev', '-z', @ARGV); + my $diffrtn = $diffrepo->command_oneline(@gitargs); + exit(0) unless defined($diffrtn); # Build index info for left and right sides of the diff my $submodule_mode = '160000'; @@ -136,16 +149,21 @@ sub setup_dir_diff my $rindex = ''; my %submodule; my %symlink; + my @working_tree = (); my @rawdiff = split('\0', $diffrtn); my $i = 0; while ($i < $#rawdiff) { if ($rawdiff[$i] =~ /^::/) { - print "Combined diff formats ('-c' and '--cc') are not supported in directory diff mode.\n"; + warn << 'EOF'; +Combined diff formats ('-c' and '--cc') are not supported in +directory diff mode ('-d' and '--dir-diff'). +EOF exit(1); } - my ($lmode, $rmode, $lsha1, $rsha1, $status) = split(' ', substr($rawdiff[$i], 1)); + my ($lmode, $rmode, $lsha1, $rsha1, $status) = + split(' ', substr($rawdiff[$i], 1)); my $src_path = $rawdiff[$i + 1]; my $dst_path; @@ -157,7 +175,7 @@ sub setup_dir_diff $i += 2; } - if (($lmode eq $submodule_mode) or ($rmode eq $submodule_mode)) { + if ($lmode eq $submodule_mode or $rmode eq $submodule_mode) { $submodule{$src_path}{left} = $lsha1; if ($lsha1 ne $rsha1) { $submodule{$dst_path}{right} = $rsha1; @@ -168,14 +186,16 @@ sub setup_dir_diff } if ($lmode eq $symlink_mode) { - $symlink{$src_path}{left} = $diffrepo->command_oneline('show', "$lsha1"); + $symlink{$src_path}{left} = + $diffrepo->command_oneline('show', "$lsha1"); } if ($rmode eq $symlink_mode) { - $symlink{$dst_path}{right} = $diffrepo->command_oneline('show', "$rsha1"); + $symlink{$dst_path}{right} = + $diffrepo->command_oneline('show', "$rsha1"); } - if (($lmode ne $null_mode) and ($status !~ /^C/)) { + if ($lmode ne $null_mode and $status !~ /^C/) { $lindex .= "$lmode $lsha1\t$src_path\0"; } @@ -188,6 +208,13 @@ sub setup_dir_diff } } + # Setup temp directories + my $tmpdir = tempdir('git-difftool.XXXXX', CLEANUP => 0, TMPDIR => 1); + my $ldir = "$tmpdir/left"; + my $rdir = "$tmpdir/right"; + mkpath($ldir) or exit_cleanup($tmpdir, 1); + mkpath($rdir) or exit_cleanup($tmpdir, 1); + # If $GIT_DIR is not set prior to calling 'git update-index' and # 'git checkout-index', then those commands will fail if difftool # is called from a directory other than the repo root. @@ -200,18 +227,22 @@ sub setup_dir_diff # Populate the left and right directories based on each index file my ($inpipe, $ctx); $ENV{GIT_INDEX_FILE} = "$tmpdir/lindex"; - ($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/); + ($inpipe, $ctx) = + $repo->command_input_pipe(qw(update-index -z --index-info)); print($inpipe $lindex); $repo->command_close_pipe($inpipe, $ctx); - $rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/"); - exit($rc | ($rc >> 8)) if ($rc != 0); + + my $rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/"); + exit_cleanup($tmpdir, $rc) if $rc != 0; $ENV{GIT_INDEX_FILE} = "$tmpdir/rindex"; - ($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/); + ($inpipe, $ctx) = + $repo->command_input_pipe(qw(update-index -z --index-info)); print($inpipe $rindex); $repo->command_close_pipe($inpipe, $ctx); + $rc = system('git', 'checkout-index', '--all', "--prefix=$rdir/"); - exit($rc | ($rc >> 8)) if ($rc != 0); + exit_cleanup($tmpdir, $rc) if $rc != 0; # If $GIT_DIR was explicitly set just for the update/checkout # commands, then it should be unset before continuing. @@ -223,37 +254,55 @@ sub setup_dir_diff for my $file (@working_tree) { my $dir = dirname($file); unless (-d "$rdir/$dir") { - mkpath("$rdir/$dir") or die $!; + mkpath("$rdir/$dir") or + exit_cleanup($tmpdir, 1); + } + if ($symlinks) { + symlink("$workdir/$file", "$rdir/$file") or + exit_cleanup($tmpdir, 1); + } else { + copy("$workdir/$file", "$rdir/$file") or + exit_cleanup($tmpdir, 1); + + my $mode = stat("$workdir/$file")->mode; + chmod($mode, "$rdir/$file") or + exit_cleanup($tmpdir, 1); } - copy("$workdir/$file", "$rdir/$file") or die $!; - chmod(stat("$workdir/$file")->mode, "$rdir/$file") or die $!; } # Changes to submodules require special treatment. This loop writes a # temporary file to both the left and right directories to show the # change in the recorded SHA1 for the submodule. for my $path (keys %submodule) { + my $ok; if (defined($submodule{$path}{left})) { - write_to_file("$ldir/$path", "Subproject commit $submodule{$path}{left}"); + $ok = write_to_file("$ldir/$path", + "Subproject commit $submodule{$path}{left}"); } if (defined($submodule{$path}{right})) { - write_to_file("$rdir/$path", "Subproject commit $submodule{$path}{right}"); + $ok = write_to_file("$rdir/$path", + "Subproject commit $submodule{$path}{right}"); } + exit_cleanup($tmpdir, 1) if not $ok; } # Symbolic links require special treatment. The standard "git diff" # shows only the link itself, not the contents of the link target. # This loop replicates that behavior. for my $path (keys %symlink) { + my $ok; if (defined($symlink{$path}{left})) { - write_to_file("$ldir/$path", $symlink{$path}{left}); + $ok = write_to_file("$ldir/$path", + $symlink{$path}{left}); } if (defined($symlink{$path}{right})) { - write_to_file("$rdir/$path", $symlink{$path}{right}); + $ok = write_to_file("$rdir/$path", + $symlink{$path}{right}); } + exit_cleanup($tmpdir, 1) if not $ok; } - return ($ldir, $rdir); + return ($ldir, $rdir, $tmpdir, @working_tree); } sub write_to_file @@ -264,85 +313,141 @@ sub write_to_file # Make sure the path to the file exists my $dir = dirname($path); unless (-d "$dir") { - mkpath("$dir") or die $!; + mkpath("$dir") or return 0; } # If the file already exists in that location, delete it. This # is required in the case of symbolic links. - unlink("$path"); + unlink($path); - open(my $fh, '>', "$path") or die $!; + open(my $fh, '>', $path) or return 0; print($fh $value); close($fh); -} -# parse command-line options. all unrecognized options and arguments -# are passed through to the 'git diff' command. -my ($difftool_cmd, $dirdiff, $extcmd, $gui, $help, $prompt, $tool_help); -GetOptions('g|gui!' => \$gui, - 'd|dir-diff' => \$dirdiff, - 'h' => \$help, - 'prompt!' => \$prompt, - 'y' => sub { $prompt = 0; }, - 't|tool:s' => \$difftool_cmd, - 'tool-help' => \$tool_help, - 'x|extcmd:s' => \$extcmd); - -if (defined($help)) { - usage(0); -} -if (defined($tool_help)) { - print_tool_help(); + return 1; } -if (defined($difftool_cmd)) { - if (length($difftool_cmd) > 0) { - $ENV{GIT_DIFF_TOOL} = $difftool_cmd; - } else { - print "No <tool> given for --tool=<tool>\n"; - usage(1); + +sub main +{ + # parse command-line options. all unrecognized options and arguments + # are passed through to the 'git diff' command. + my %opts = ( + difftool_cmd => undef, + dirdiff => undef, + extcmd => undef, + gui => undef, + help => undef, + prompt => undef, + symlinks => $^O ne 'cygwin' && + $^O ne 'MSWin32' && $^O ne 'msys', + tool_help => undef, + ); + GetOptions('g|gui!' => \$opts{gui}, + 'd|dir-diff' => \$opts{dirdiff}, + 'h' => \$opts{help}, + 'prompt!' => \$opts{prompt}, + 'y' => sub { $opts{prompt} = 0; }, + 'symlinks' => \$opts{symlinks}, + 'no-symlinks' => sub { $opts{symlinks} = 0; }, + 't|tool:s' => \$opts{difftool_cmd}, + 'tool-help' => \$opts{tool_help}, + 'x|extcmd:s' => \$opts{extcmd}); + + if (defined($opts{help})) { + usage(0); } -} -if (defined($extcmd)) { - if (length($extcmd) > 0) { - $ENV{GIT_DIFFTOOL_EXTCMD} = $extcmd; - } else { - print "No <cmd> given for --extcmd=<cmd>\n"; - usage(1); + if (defined($opts{tool_help})) { + print_tool_help(); } -} -if ($gui) { - my $guitool = ''; - $guitool = Git::config('diff.guitool'); - if (length($guitool) > 0) { - $ENV{GIT_DIFF_TOOL} = $guitool; + if (defined($opts{difftool_cmd})) { + if (length($opts{difftool_cmd}) > 0) { + $ENV{GIT_DIFF_TOOL} = $opts{difftool_cmd}; + } else { + print "No <tool> given for --tool=<tool>\n"; + usage(1); + } + } + if (defined($opts{extcmd})) { + if (length($opts{extcmd}) > 0) { + $ENV{GIT_DIFFTOOL_EXTCMD} = $opts{extcmd}; + } else { + print "No <cmd> given for --extcmd=<cmd>\n"; + usage(1); + } + } + if ($opts{gui}) { + my $guitool = Git::config('diff.guitool'); + if (length($guitool) > 0) { + $ENV{GIT_DIFF_TOOL} = $guitool; + } + } + + # In directory diff mode, 'git-difftool--helper' is called once + # to compare the a/b directories. In file diff mode, 'git diff' + # will invoke a separate instance of 'git-difftool--helper' for + # each file that changed. + if (defined($opts{dirdiff})) { + dir_diff($opts{extcmd}, $opts{symlinks}); + } else { + file_diff($opts{prompt}); } } -# In directory diff mode, 'git-difftool--helper' is called once -# to compare the a/b directories. In file diff mode, 'git diff' -# will invoke a separate instance of 'git-difftool--helper' for -# each file that changed. -if (defined($dirdiff)) { - my ($a, $b) = setup_dir_diff(); +sub dir_diff +{ + my ($extcmd, $symlinks) = @_; + my $rc; + my $error = 0; + my $repo = Git->repository(); + my $workdir = find_worktree($repo); + my ($a, $b, $tmpdir, @worktree) = + setup_dir_diff($repo, $workdir, $symlinks); + if (defined($extcmd)) { $rc = system($extcmd, $a, $b); } else { $ENV{GIT_DIFFTOOL_DIRDIFF} = 'true'; $rc = system('git', 'difftool--helper', $a, $b); } - - exit($rc | ($rc >> 8)) if ($rc != 0); - # If the diff including working copy files and those # files were modified during the diff, then the changes - # should be copied back to the working tree - for my $file (@working_tree) { - if (-e "$b/$file" && compare("$b/$file", "$workdir/$file")) { - copy("$b/$file", "$workdir/$file") or die $!; - chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!; + # should be copied back to the working tree. + # Do not copy back files when symlinks are used and the + # external tool did not replace the original link with a file. + for my $file (@worktree) { + next if $symlinks && -l "$b/$file"; + next if ! -f "$b/$file"; + + my $diff = compare("$b/$file", "$workdir/$file"); + if ($diff == 0) { + next; + } elsif ($diff == -1) { + my $errmsg = "warning: Could not compare "; + $errmsg += "'$b/$file' with '$workdir/$file'\n"; + warn $errmsg; + $error = 1; + } elsif ($diff == 1) { + my $mode = stat("$b/$file")->mode; + copy("$b/$file", "$workdir/$file") or + exit_cleanup($tmpdir, 1); + + chmod($mode, "$workdir/$file") or + exit_cleanup($tmpdir, 1); } } -} else { + if ($error) { + warn "warning: Temporary files exist in '$tmpdir'.\n"; + warn "warning: You may want to cleanup or recover these.\n"; + exit(1); + } else { + exit_cleanup($tmpdir, $rc); + } +} + +sub file_diff +{ + my ($prompt) = @_; + if (defined($prompt)) { if ($prompt) { $ENV{GIT_DIFFTOOL_PROMPT} = 'true'; @@ -362,3 +467,5 @@ if (defined($dirdiff)) { my $rc = system('git', 'diff', @ARGV); exit($rc | ($rc >> 8)); } + +main(); 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-mergetool--lib.sh b/git-mergetool--lib.sh index f730253c0e..f013a03506 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -104,13 +104,49 @@ run_merge_tool () { if merge_mode then - merge_cmd "$1" + run_merge_cmd "$1" else - diff_cmd "$1" + run_diff_cmd "$1" fi return $status } +# Run a either a configured or built-in diff tool +run_diff_cmd () { + merge_tool_cmd="$(get_merge_tool_cmd "$1")" + if test -n "$merge_tool_cmd" + then + ( eval $merge_tool_cmd ) + status=$? + return $status + else + diff_cmd "$1" + fi +} + +# Run a either a configured or built-in merge tool +run_merge_cmd () { + merge_tool_cmd="$(get_merge_tool_cmd "$1")" + if test -n "$merge_tool_cmd" + then + trust_exit_code="$(git config --bool \ + mergetool."$1".trustExitCode || echo false)" + if test "$trust_exit_code" = "false" + then + touch "$BACKUP" + ( eval $merge_tool_cmd ) + status=$? + check_unchanged + else + ( eval $merge_tool_cmd ) + status=$? + fi + return $status + else + merge_cmd "$1" + fi +} + list_merge_tool_candidates () { if merge_mode then @@ -126,7 +162,7 @@ list_merge_tool_candidates () { else tools="opendiff kdiff3 tkdiff xxdiff meld $tools" fi - tools="$tools gvimdiff diffuse ecmerge p4merge araxis bc3" + tools="$tools gvimdiff diffuse ecmerge p4merge araxis bc3 codecompare" fi case "${VISUAL:-$EDITOR}" in *vim*) diff --git a/git-mergetool.sh b/git-mergetool.sh index 0db0c44845..c50e18a899 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -18,270 +18,301 @@ require_work_tree # Returns true if the mode reflects a symlink is_symlink () { - test "$1" = 120000 + test "$1" = 120000 } is_submodule () { - test "$1" = 160000 + test "$1" = 160000 } local_present () { - test -n "$local_mode" + test -n "$local_mode" } remote_present () { - test -n "$remote_mode" + test -n "$remote_mode" } base_present () { - test -n "$base_mode" + test -n "$base_mode" } cleanup_temp_files () { - if test "$1" = --save-backup ; then - rm -rf -- "$MERGED.orig" - test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig" - rm -f -- "$LOCAL" "$REMOTE" "$BASE" - else - rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP" - fi + if test "$1" = --save-backup + then + rm -rf -- "$MERGED.orig" + test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig" + rm -f -- "$LOCAL" "$REMOTE" "$BASE" + else + rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP" + fi } describe_file () { - mode="$1" - branch="$2" - file="$3" - - printf " {%s}: " "$branch" - if test -z "$mode"; then - echo "deleted" - elif is_symlink "$mode" ; then - echo "a symbolic link -> '$(cat "$file")'" - elif is_submodule "$mode" ; then - echo "submodule commit $file" - else - if base_present; then - echo "modified file" + mode="$1" + branch="$2" + file="$3" + + printf " {%s}: " "$branch" + if test -z "$mode" + then + echo "deleted" + elif is_symlink "$mode" + then + echo "a symbolic link -> '$(cat "$file")'" + elif is_submodule "$mode" + then + echo "submodule commit $file" + elif base_present + then + echo "modified file" else - echo "created file" + echo "created file" fi - fi } - resolve_symlink_merge () { - while true; do - printf "Use (l)ocal or (r)emote, or (a)bort? " - read ans || return 1 - case "$ans" in - [lL]*) - git checkout-index -f --stage=2 -- "$MERGED" - git add -- "$MERGED" - cleanup_temp_files --save-backup - return 0 - ;; - [rR]*) - git checkout-index -f --stage=3 -- "$MERGED" - git add -- "$MERGED" - cleanup_temp_files --save-backup - return 0 - ;; - [aA]*) - return 1 - ;; - esac + while true + do + printf "Use (l)ocal or (r)emote, or (a)bort? " + read ans || return 1 + case "$ans" in + [lL]*) + git checkout-index -f --stage=2 -- "$MERGED" + git add -- "$MERGED" + cleanup_temp_files --save-backup + return 0 + ;; + [rR]*) + git checkout-index -f --stage=3 -- "$MERGED" + git add -- "$MERGED" + cleanup_temp_files --save-backup + return 0 + ;; + [aA]*) + return 1 + ;; + esac done } resolve_deleted_merge () { - while true; do - if base_present; then - printf "Use (m)odified or (d)eleted file, or (a)bort? " - else - printf "Use (c)reated or (d)eleted file, or (a)bort? " - fi - read ans || return 1 - case "$ans" in - [mMcC]*) - git add -- "$MERGED" - cleanup_temp_files --save-backup - return 0 - ;; - [dD]*) - git rm -- "$MERGED" > /dev/null - cleanup_temp_files - return 0 - ;; - [aA]*) - return 1 - ;; - esac + while true + do + if base_present + then + printf "Use (m)odified or (d)eleted file, or (a)bort? " + else + printf "Use (c)reated or (d)eleted file, or (a)bort? " + fi + read ans || return 1 + case "$ans" in + [mMcC]*) + git add -- "$MERGED" + cleanup_temp_files --save-backup + return 0 + ;; + [dD]*) + git rm -- "$MERGED" > /dev/null + cleanup_temp_files + return 0 + ;; + [aA]*) + return 1 + ;; + esac done } resolve_submodule_merge () { - while true; do - printf "Use (l)ocal or (r)emote, or (a)bort? " - read ans || return 1 - case "$ans" in - [lL]*) - if ! local_present; then - if test -n "$(git ls-tree HEAD -- "$MERGED")"; then - # Local isn't present, but it's a subdirectory - git ls-tree --full-name -r HEAD -- "$MERGED" | git update-index --index-info || exit $? - else - test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" - git update-index --force-remove "$MERGED" + while true + do + printf "Use (l)ocal or (r)emote, or (a)bort? " + read ans || return 1 + case "$ans" in + [lL]*) + if ! local_present + then + if test -n "$(git ls-tree HEAD -- "$MERGED")" + then + # Local isn't present, but it's a subdirectory + git ls-tree --full-name -r HEAD -- "$MERGED" | + git update-index --index-info || exit $? + else + test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" + git update-index --force-remove "$MERGED" + cleanup_temp_files --save-backup + fi + elif is_submodule "$local_mode" + then + stage_submodule "$MERGED" "$local_sha1" + else + git checkout-index -f --stage=2 -- "$MERGED" + git add -- "$MERGED" + fi + return 0 + ;; + [rR]*) + if ! remote_present + then + if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")" + then + # Remote isn't present, but it's a subdirectory + git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" | + git update-index --index-info || exit $? + else + test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" + git update-index --force-remove "$MERGED" + fi + elif is_submodule "$remote_mode" + then + ! is_submodule "$local_mode" && + test -e "$MERGED" && + mv -- "$MERGED" "$BACKUP" + stage_submodule "$MERGED" "$remote_sha1" + else + test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" + git checkout-index -f --stage=3 -- "$MERGED" + git add -- "$MERGED" + fi cleanup_temp_files --save-backup - fi - elif is_submodule "$local_mode"; then - stage_submodule "$MERGED" "$local_sha1" - else - git checkout-index -f --stage=2 -- "$MERGED" - git add -- "$MERGED" - fi - return 0 - ;; - [rR]*) - if ! remote_present; then - if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")"; then - # Remote isn't present, but it's a subdirectory - git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" | git update-index --index-info || exit $? - else - test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" - git update-index --force-remove "$MERGED" - fi - elif is_submodule "$remote_mode"; then - ! is_submodule "$local_mode" && test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" - stage_submodule "$MERGED" "$remote_sha1" - else - test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" - git checkout-index -f --stage=3 -- "$MERGED" - git add -- "$MERGED" - fi - cleanup_temp_files --save-backup - return 0 - ;; - [aA]*) - return 1 - ;; - esac + return 0 + ;; + [aA]*) + return 1 + ;; + esac done } stage_submodule () { - path="$1" - submodule_sha1="$2" - mkdir -p "$path" || die "fatal: unable to create directory for module at $path" - # Find $path relative to work tree - work_tree_root=$(cd_to_toplevel && pwd) - work_rel_path=$(cd "$path" && GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix) - test -n "$work_rel_path" || die "fatal: unable to get path of module $path relative to work tree" - git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die + path="$1" + submodule_sha1="$2" + mkdir -p "$path" || + die "fatal: unable to create directory for module at $path" + # Find $path relative to work tree + work_tree_root=$(cd_to_toplevel && pwd) + work_rel_path=$(cd "$path" && + GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix + ) + test -n "$work_rel_path" || + die "fatal: unable to get path of module $path relative to work tree" + git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die } checkout_staged_file () { - tmpfile=$(expr \ - "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \ - : '\([^ ]*\) ') - - if test $? -eq 0 -a -n "$tmpfile" ; then - mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3" - else - >"$3" - fi + tmpfile=$(expr \ + "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \ + : '\([^ ]*\) ') + + if test $? -eq 0 -a -n "$tmpfile" + then + mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3" + else + >"$3" + fi } merge_file () { - MERGED="$1" + MERGED="$1" - f=$(git ls-files -u -- "$MERGED") - if test -z "$f" ; then - if test ! -f "$MERGED" ; then - echo "$MERGED: file not found" - else - echo "$MERGED: file does not need merging" + f=$(git ls-files -u -- "$MERGED") + if test -z "$f" + then + if test ! -f "$MERGED" + then + echo "$MERGED: file not found" + else + echo "$MERGED: file does not need merging" + fi + return 1 fi - return 1 - fi - - ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')" - BACKUP="./$MERGED.BACKUP.$ext" - LOCAL="./$MERGED.LOCAL.$ext" - REMOTE="./$MERGED.REMOTE.$ext" - BASE="./$MERGED.BASE.$ext" - - base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}') - local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}') - remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}') - - if is_submodule "$local_mode" || is_submodule "$remote_mode"; then - echo "Submodule merge conflict for '$MERGED':" - local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}') - remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}') - describe_file "$local_mode" "local" "$local_sha1" - describe_file "$remote_mode" "remote" "$remote_sha1" - resolve_submodule_merge - return - fi - - mv -- "$MERGED" "$BACKUP" - cp -- "$BACKUP" "$MERGED" - - checkout_staged_file 1 "$MERGED" "$BASE" - checkout_staged_file 2 "$MERGED" "$LOCAL" - checkout_staged_file 3 "$MERGED" "$REMOTE" - - if test -z "$local_mode" -o -z "$remote_mode"; then - echo "Deleted merge conflict for '$MERGED':" - describe_file "$local_mode" "local" "$LOCAL" - describe_file "$remote_mode" "remote" "$REMOTE" - resolve_deleted_merge - return - fi - if is_symlink "$local_mode" || is_symlink "$remote_mode"; then - echo "Symbolic link merge conflict for '$MERGED':" + ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')" + BACKUP="./$MERGED.BACKUP.$ext" + LOCAL="./$MERGED.LOCAL.$ext" + REMOTE="./$MERGED.REMOTE.$ext" + BASE="./$MERGED.BASE.$ext" + + base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}') + local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}') + remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}') + + if is_submodule "$local_mode" || is_submodule "$remote_mode" + then + echo "Submodule merge conflict for '$MERGED':" + local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}') + remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}') + describe_file "$local_mode" "local" "$local_sha1" + describe_file "$remote_mode" "remote" "$remote_sha1" + resolve_submodule_merge + return + fi + + mv -- "$MERGED" "$BACKUP" + cp -- "$BACKUP" "$MERGED" + + checkout_staged_file 1 "$MERGED" "$BASE" + checkout_staged_file 2 "$MERGED" "$LOCAL" + checkout_staged_file 3 "$MERGED" "$REMOTE" + + if test -z "$local_mode" -o -z "$remote_mode" + then + echo "Deleted merge conflict for '$MERGED':" + describe_file "$local_mode" "local" "$LOCAL" + describe_file "$remote_mode" "remote" "$REMOTE" + resolve_deleted_merge + return + fi + + if is_symlink "$local_mode" || is_symlink "$remote_mode" + then + echo "Symbolic link merge conflict for '$MERGED':" + describe_file "$local_mode" "local" "$LOCAL" + describe_file "$remote_mode" "remote" "$REMOTE" + resolve_symlink_merge + return + fi + + echo "Normal merge conflict for '$MERGED':" describe_file "$local_mode" "local" "$LOCAL" describe_file "$remote_mode" "remote" "$REMOTE" - resolve_symlink_merge - return - fi - - echo "Normal merge conflict for '$MERGED':" - describe_file "$local_mode" "local" "$LOCAL" - describe_file "$remote_mode" "remote" "$REMOTE" - if "$prompt" = true; then - printf "Hit return to start merge resolution tool (%s): " "$merge_tool" - read ans || return 1 - fi - - if base_present; then - present=true - else - present=false - fi - - if ! run_merge_tool "$merge_tool" "$present"; then - echo "merge of $MERGED failed" 1>&2 - mv -- "$BACKUP" "$MERGED" - - if test "$merge_keep_temporaries" = "false"; then - cleanup_temp_files + if "$prompt" = true + then + printf "Hit return to start merge resolution tool (%s): " "$merge_tool" + read ans || return 1 fi - return 1 - fi + if base_present + then + present=true + else + present=false + fi + + if ! run_merge_tool "$merge_tool" "$present" + then + echo "merge of $MERGED failed" 1>&2 + mv -- "$BACKUP" "$MERGED" + + if test "$merge_keep_temporaries" = "false" + then + cleanup_temp_files + fi - if test "$merge_keep_backup" = "true"; then - mv -- "$BACKUP" "$MERGED.orig" - else - rm -- "$BACKUP" - fi + return 1 + fi - git add -- "$MERGED" - cleanup_temp_files - return 0 + if test "$merge_keep_backup" = "true" + then + mv -- "$BACKUP" "$MERGED.orig" + else + rm -- "$BACKUP" + fi + + git add -- "$MERGED" + cleanup_temp_files + return 0 } show_tool_help () { @@ -325,61 +356,61 @@ prompt=$(git config --bool mergetool.prompt || echo true) while test $# != 0 do - case "$1" in + case "$1" in --tool-help) show_tool_help ;; -t|--tool*) - case "$#,$1" in + case "$#,$1" in *,*=*) - merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)') - ;; + merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)') + ;; 1,*) - usage ;; + usage ;; *) - merge_tool="$2" - shift ;; - esac - ;; + merge_tool="$2" + shift ;; + esac + ;; -y|--no-prompt) - prompt=false - ;; + prompt=false + ;; --prompt) - prompt=true - ;; + prompt=true + ;; --) - shift - break - ;; + shift + break + ;; -*) - usage - ;; - *) - break - ;; - esac - shift -done - -prompt_after_failed_merge() { - while true; do - printf "Continue merging other unresolved paths (y/n) ? " - read ans || return 1 - case "$ans" in - - [yY]*) - return 0 + usage ;; - - [nN]*) - return 1 + *) + break ;; esac - done + shift +done + +prompt_after_failed_merge () { + while true + do + printf "Continue merging other unresolved paths (y/n) ? " + read ans || return 1 + case "$ans" in + [yY]*) + return 0 + ;; + [nN]*) + return 1 + ;; + esac + done } -if test -z "$merge_tool"; then - merge_tool=$(get_merge_tool "$merge_tool") || exit +if test -z "$merge_tool" +then + merge_tool=$(get_merge_tool "$merge_tool") || exit fi merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)" merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" @@ -388,22 +419,24 @@ last_status=0 rollup_status=0 files= -if test $# -eq 0 ; then - cd_to_toplevel +if test $# -eq 0 +then + cd_to_toplevel - if test -e "$GIT_DIR/MERGE_RR" - then - files=$(git rerere remaining) - else - files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u) - fi + if test -e "$GIT_DIR/MERGE_RR" + then + files=$(git rerere remaining) + else + files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u) + fi else - files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u) + files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u) fi -if test -z "$files" ; then - echo "No files need merging" - exit 0 +if test -z "$files" +then + echo "No files need merging" + exit 0 fi printf "Merging:\n" @@ -413,15 +446,17 @@ IFS=' ' for i in $files do - if test $last_status -ne 0; then - prompt_after_failed_merge || exit 1 - fi - printf "\n" - merge_file "$i" - last_status=$? - if test $last_status -ne 0; then - rollup_status=1 - fi + if test $last_status -ne 0 + then + prompt_after_failed_merge || exit 1 + fi + printf "\n" + merge_file "$i" + last_status=$? + if test $last_status -ne 0 + then + rollup_status=1 + fi done exit $rollup_status @@ -844,6 +844,9 @@ class P4RollBack(Command): return True class P4Submit(Command, P4UserMap): + + conflict_behavior_choices = ("ask", "skip", "quit") + def __init__(self): Command.__init__(self) P4UserMap.__init__(self) @@ -853,12 +856,19 @@ class P4Submit(Command, P4UserMap): # preserve the user, requires relevant p4 permissions optparse.make_option("--preserve-user", dest="preserveUser", action="store_true"), optparse.make_option("--export-labels", dest="exportLabels", action="store_true"), + optparse.make_option("--dry-run", "-n", dest="dry_run", action="store_true"), + optparse.make_option("--prepare-p4-only", dest="prepare_p4_only", action="store_true"), + optparse.make_option("--conflict", dest="conflict_behavior", + choices=self.conflict_behavior_choices) ] self.description = "Submit changes from git to the perforce depot." self.usage += " [name of git branch to submit into perforce depot]" self.origin = "" self.detectRenames = False self.preserveUser = gitConfig("git-p4.preserveUser").lower() == "true" + self.dry_run = False + self.prepare_p4_only = False + self.conflict_behavior = None self.isWindows = (platform.system() == "Windows") self.exportLabels = False self.p4HasMoveCommand = p4_has_command("move") @@ -1088,7 +1098,10 @@ class P4Submit(Command, P4UserMap): return False def applyCommit(self, id): - print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id)) + """Apply one commit, return True if it succeeded.""" + + print "Applying", read_pipe(["git", "show", "-s", + "--format=format:%h %s", id]) (p4User, gitEmail) = self.p4UserForCommit(id) @@ -1195,34 +1208,13 @@ class P4Submit(Command, P4UserMap): patch_succeeded = True if not patch_succeeded: - print "What do you want to do?" - response = "x" - while response != "s" and response != "a" and response != "w": - response = raw_input("[s]kip this patch / [a]pply the patch forcibly " - "and with .rej files / [w]rite the patch to a file (patch.txt) ") - if response == "s": - print "Skipping! Good luck with the next patches..." - for f in editedFiles: - p4_revert(f) - for f in filesToAdd: - os.remove(f) - return - elif response == "a": - os.system(applyPatchCmd) - if len(filesToAdd) > 0: - print "You may also want to call p4 add on the following files:" - print " ".join(filesToAdd) - if len(filesToDelete): - print "The following files should be scheduled for deletion with p4 delete:" - print " ".join(filesToDelete) - die("Please resolve and submit the conflict manually and " - + "continue afterwards with git p4 submit --continue") - elif response == "w": - system(diffcmd + " > patch.txt") - print "Patch saved to patch.txt in %s !" % self.clientPath - die("Please resolve and submit the conflict manually and " - "continue afterwards with git p4 submit --continue") + for f in editedFiles: + p4_revert(f) + return False + # + # Apply the patch for real, and do add/delete/+x handling. + # system(applyPatchCmd) for f in filesToAdd: @@ -1236,6 +1228,10 @@ class P4Submit(Command, P4UserMap): mode = filesToChangeExecBit[f] setP4ExecBit(f, mode) + # + # Build p4 change description, starting with the contents + # of the git commit message. + # logMessage = extractLogMessageFromGitCommit(id) logMessage = logMessage.strip() (logMessage, jobs) = self.separate_jobs_from_description(logMessage) @@ -1244,8 +1240,16 @@ class P4Submit(Command, P4UserMap): submitTemplate = self.prepareLogMessage(template, logMessage, jobs) if self.preserveUser: - submitTemplate = submitTemplate + ("\n######## Actual user %s, modified after commit\n" % p4User) + submitTemplate += "\n######## Actual user %s, modified after commit\n" % p4User + + if self.checkAuthorship and not self.p4UserIsMe(p4User): + submitTemplate += "######## git author %s does not match your p4 account.\n" % gitEmail + submitTemplate += "######## Use option --preserve-user to modify authorship.\n" + submitTemplate += "######## Variable git-p4.skipUserNameCheck hides this message.\n" + separatorLine = "######## everything below this line is just the diff #######\n" + + # diff if os.environ.has_key("P4DIFF"): del(os.environ["P4DIFF"]) diff = "" @@ -1253,6 +1257,7 @@ class P4Submit(Command, P4UserMap): diff += p4_read_pipe(['diff', '-du', wildcard_encode(editedFile)]) + # new file diff newdiff = "" for newFile in filesToAdd: newdiff += "==== new file ====\n" @@ -1263,13 +1268,7 @@ class P4Submit(Command, P4UserMap): newdiff += "+" + line f.close() - if self.checkAuthorship and not self.p4UserIsMe(p4User): - submitTemplate += "######## git author %s does not match your p4 account.\n" % gitEmail - submitTemplate += "######## Use option --preserve-user to modify authorship.\n" - submitTemplate += "######## Variable git-p4.skipUserNameCheck hides this message.\n" - - separatorLine = "######## everything below this line is just the diff #######\n" - + # change description file: submitTemplate, separatorLine, diff, newdiff (handle, fileName) = tempfile.mkstemp() tmpFile = os.fdopen(handle, "w+") if self.isWindows: @@ -1279,8 +1278,47 @@ class P4Submit(Command, P4UserMap): tmpFile.write(submitTemplate + separatorLine + diff + newdiff) tmpFile.close() + if self.prepare_p4_only: + # + # Leave the p4 tree prepared, and the submit template around + # and let the user decide what to do next + # + print + print "P4 workspace prepared for submission." + print "To submit or revert, go to client workspace" + print " " + self.clientPath + print + print "To submit, use \"p4 submit\" to write a new description," + print "or \"p4 submit -i %s\" to use the one prepared by" \ + " \"git p4\"." % fileName + print "You can delete the file \"%s\" when finished." % fileName + + if self.preserveUser and p4User and not self.p4UserIsMe(p4User): + print "To preserve change ownership by user %s, you must\n" \ + "do \"p4 change -f <change>\" after submitting and\n" \ + "edit the User field." + if pureRenameCopy: + print "After submitting, renamed files must be re-synced." + print "Invoke \"p4 sync -f\" on each of these files:" + for f in pureRenameCopy: + print " " + f + + print + print "To revert the changes, use \"p4 revert ...\", and delete" + print "the submit template file \"%s\"" % fileName + if filesToAdd: + print "Since the commit adds new files, they must be deleted:" + for f in filesToAdd: + print " " + f + print + return True + + # + # Let the user edit the change description, then submit it. + # if self.edit_template(fileName): # read the edited message and submit + ret = True tmpFile = open(fileName, "rb") message = tmpFile.read() tmpFile.close() @@ -1304,14 +1342,18 @@ class P4Submit(Command, P4UserMap): else: # skip this patch + ret = False print "Submission cancelled, undoing p4 changes." for f in editedFiles: p4_revert(f) for f in filesToAdd: p4_revert(f) os.remove(f) + for f in filesToDelete: + p4_revert(f) os.remove(fileName) + return ret # Export git tags as p4 labels. Create a p4 label and then tag # with that. @@ -1369,14 +1411,20 @@ class P4Submit(Command, P4UserMap): for mapping in clientSpec.mappings: labelTemplate += "\t%s\n" % mapping.depot_side.path - p4_write_pipe(["label", "-i"], labelTemplate) + if self.dry_run: + print "Would create p4 label %s for tag" % name + elif self.prepare_p4_only: + print "Not creating p4 label %s for tag due to option" \ + " --prepare-p4-only" % name + else: + p4_write_pipe(["label", "-i"], labelTemplate) - # Use the label - p4_system(["tag", "-l", name] + - ["%s@%s" % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings]) + # Use the label + p4_system(["tag", "-l", name] + + ["%s@%s" % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings]) - if verbose: - print "created p4 label for tag %s" % name + if verbose: + print "created p4 label for tag %s" % name def run(self, args): if len(args) == 0: @@ -1403,6 +1451,16 @@ class P4Submit(Command, P4UserMap): if not self.canChangeChangelists(): die("Cannot preserve user names without p4 super-user or admin permissions") + # if not set from the command line, try the config file + if self.conflict_behavior is None: + val = gitConfig("git-p4.conflict") + if val: + if val not in self.conflict_behavior_choices: + die("Invalid value '%s' for config git-p4.conflict" % val) + else: + val = "ask" + self.conflict_behavior = val + if self.verbose: print "Origin branch is " + self.origin @@ -1435,12 +1493,15 @@ class P4Submit(Command, P4UserMap): os.makedirs(self.clientPath) chdir(self.clientPath) - print "Synchronizing p4 checkout..." - if new_client_dir: - # old one was destroyed, and maybe nobody told p4 - p4_sync("...", "-f") + if self.dry_run: + print "Would synchronize p4 checkout in %s" % self.clientPath else: - p4_sync("...") + print "Synchronizing p4 checkout..." + if new_client_dir: + # old one was destroyed, and maybe nobody told p4 + p4_sync("...", "-f") + else: + p4_sync("...") self.check() commits = [] @@ -1487,14 +1548,64 @@ class P4Submit(Command, P4UserMap): if gitConfig("git-p4.detectCopiesHarder", "--bool") == "true": self.diffOpts += " --find-copies-harder" - while len(commits) > 0: - commit = commits[0] - commits = commits[1:] - self.applyCommit(commit) + # + # Apply the commits, one at a time. On failure, ask if should + # continue to try the rest of the patches, or quit. + # + if self.dry_run: + print "Would apply" + applied = [] + last = len(commits) - 1 + for i, commit in enumerate(commits): + if self.dry_run: + print " ", read_pipe(["git", "show", "-s", + "--format=format:%h %s", commit]) + ok = True + else: + ok = self.applyCommit(commit) + if ok: + applied.append(commit) + else: + if self.prepare_p4_only and i < last: + print "Processing only the first commit due to option" \ + " --prepare-p4-only" + break + if i < last: + quit = False + while True: + # prompt for what to do, or use the option/variable + if self.conflict_behavior == "ask": + print "What do you want to do?" + response = raw_input("[s]kip this commit but apply" + " the rest, or [q]uit? ") + if not response: + continue + elif self.conflict_behavior == "skip": + response = "s" + elif self.conflict_behavior == "quit": + response = "q" + else: + die("Unknown conflict_behavior '%s'" % + self.conflict_behavior) + + if response[0] == "s": + print "Skipping this commit, but applying the rest" + break + if response[0] == "q": + print "Quitting" + quit = True + break + if quit: + break + + chdir(self.oldWorkingDirectory) - if len(commits) == 0: - print "All changes applied!" - chdir(self.oldWorkingDirectory) + if self.dry_run: + pass + elif self.prepare_p4_only: + pass + elif len(commits) == len(applied): + print "All commits applied!" sync = P4Sync() sync.run([]) @@ -1502,6 +1613,20 @@ class P4Submit(Command, P4UserMap): rebase = P4Rebase() rebase.rebase() + else: + if len(applied) == 0: + print "No commits applied." + else: + print "Applied only the commits marked with '*':" + for c in commits: + if c in applied: + star = "*" + else: + star = " " + print star, read_pipe(["git", "show", "-s", + "--format=format:%h %s", c]) + print "You will have to do 'git p4 sync' and rebase." + if gitConfig("git-p4.exportLabels", "--bool") == "true": self.exportLabels = True @@ -1512,6 +1637,10 @@ class P4Submit(Command, P4UserMap): missingGitTags = gitTags - p4Labels self.exportGitTags(missingGitTags) + # exit with error unless everything applied perfecly + if len(commits) != len(applied): + sys.exit(1) + return True class View(object): @@ -1818,19 +1947,41 @@ class P4Sync(Command, P4UserMap): return files def stripRepoPath(self, path, prefixes): - if self.useClientSpec: - return self.clientSpecDirs.map_in_client(path) + """When streaming files, this is called to map a p4 depot path + to where it should go in git. The prefixes are either + self.depotPaths, or self.branchPrefixes in the case of + branch detection.""" - if self.keepRepoPath: - prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])] + if self.useClientSpec: + # branch detection moves files up a level (the branch name) + # from what client spec interpretation gives + path = self.clientSpecDirs.map_in_client(path) + if self.detectBranches: + for b in self.knownBranches: + if path.startswith(b + "/"): + path = path[len(b)+1:] + + elif self.keepRepoPath: + # Preserve everything in relative path name except leading + # //depot/; just look at first prefix as they all should + # be in the same depot. + depot = re.sub("^(//[^/]+/).*", r'\1', prefixes[0]) + if p4PathStartsWith(path, depot): + path = path[len(depot):] - for p in prefixes: - if p4PathStartsWith(path, p): - path = path[len(p):] + else: + for p in prefixes: + if p4PathStartsWith(path, p): + path = path[len(p):] + break + path = wildcard_decode(path) return path def splitFilesIntoBranches(self, commit): + """Look at each depotFile in the commit to figure out to what + branch it belongs.""" + branches = {} fnum = 0 while commit.has_key("depotFile%s" % fnum): @@ -1848,12 +1999,16 @@ class P4Sync(Command, P4UserMap): file["type"] = commit["type%s" % fnum] fnum = fnum + 1 - relPath = self.stripRepoPath(path, self.depotPaths) - relPath = wildcard_decode(relPath) + # start with the full relative path where this file would + # go in a p4 client + if self.useClientSpec: + relPath = self.clientSpecDirs.map_in_client(path) + else: + relPath = self.stripRepoPath(path, self.depotPaths) for branch in self.knownBranches.keys(): - - # add a trailing slash so that a commit into qt/4.2foo doesn't end up in qt/4.2 + # add a trailing slash so that a commit into qt/4.2foo + # doesn't end up in qt/4.2, e.g. if relPath.startswith(branch + "/"): if branch not in branches: branches[branch] = [] @@ -1867,7 +2022,6 @@ class P4Sync(Command, P4UserMap): def streamOneP4File(self, file, contents): relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes) - relPath = wildcard_decode(relPath) if verbose: sys.stderr.write("%s\n" % relPath) @@ -1936,7 +2090,6 @@ class P4Sync(Command, P4UserMap): def streamOneP4Deletion(self, file): relPath = self.stripRepoPath(file['path'], self.branchPrefixes) - relPath = wildcard_decode(relPath) if verbose: sys.stderr.write("delete %s\n" % relPath) self.gitStream.write("D %s\n" % relPath) @@ -2041,10 +2194,9 @@ class P4Sync(Command, P4UserMap): gitStream.write(description) gitStream.write("\n") - def commit(self, details, files, branch, branchPrefixes, parent = ""): + def commit(self, details, files, branch, parent = ""): epoch = details["time"] author = details["user"] - self.branchPrefixes = branchPrefixes if self.verbose: print "commit into %s" % branch @@ -2053,7 +2205,7 @@ class P4Sync(Command, P4UserMap): # create a commit. new_files = [] for f in files: - if [p for p in branchPrefixes if p4PathStartsWith(f['path'], p)]: + if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]: new_files.append (f) else: sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path']) @@ -2070,8 +2222,8 @@ class P4Sync(Command, P4UserMap): self.gitStream.write("data <<EOT\n") self.gitStream.write(details["desc"]) - self.gitStream.write("\n[git-p4: depot-paths = \"%s\": change = %s" - % (','.join (branchPrefixes), details["change"])) + self.gitStream.write("\n[git-p4: depot-paths = \"%s\": change = %s" % + (','.join(self.branchPrefixes), details["change"])) if len(details['options']) > 0: self.gitStream.write(": options = %s" % details['options']) self.gitStream.write("]\nEOT\n\n") @@ -2094,7 +2246,7 @@ class P4Sync(Command, P4UserMap): print "Change %s is labelled %s" % (change, labelDetails) files = p4CmdList(["files"] + ["%s...@%s" % (p, change) - for p in branchPrefixes]) + for p in self.branchPrefixes]) if len(files) == len(labelRevisions): @@ -2405,6 +2557,7 @@ class P4Sync(Command, P4UserMap): for branch in branches.keys(): ## HACK --hwn branchPrefix = self.depotPaths[0] + branch + "/" + self.branchPrefixes = [ branchPrefix ] parent = "" @@ -2449,19 +2602,19 @@ class P4Sync(Command, P4UserMap): tempBranch = os.path.join(self.tempBranchLocation, "%d" % (change)) if self.verbose: print "Creating temporary branch: " + tempBranch - self.commit(description, filesForCommit, tempBranch, [branchPrefix]) + self.commit(description, filesForCommit, tempBranch) self.tempBranches.append(tempBranch) self.checkpoint() blob = self.searchParent(parent, branch, tempBranch) if blob: - self.commit(description, filesForCommit, branch, [branchPrefix], blob) + self.commit(description, filesForCommit, branch, blob) else: if self.verbose: print "Parent of %s not found. Committing into head of %s" % (branch, parent) - self.commit(description, filesForCommit, branch, [branchPrefix], parent) + self.commit(description, filesForCommit, branch, parent) else: files = self.extractFilesFromCommit(description) - self.commit(description, files, self.branch, self.depotPaths, + self.commit(description, files, self.branch, self.initialParent) self.initialParent = "" except IOError: @@ -2525,7 +2678,7 @@ class P4Sync(Command, P4UserMap): self.updateOptionDict(details) try: - self.commit(details, self.extractFilesFromCommit(details), self.branch, self.depotPaths) + self.commit(details, self.extractFilesFromCommit(details), self.branch) except IOError: print "IO error with git fast-import. Is your git version recent enough?" print self.gitError.read() @@ -2683,6 +2836,9 @@ class P4Sync(Command, P4UserMap): self.depotPaths = newPaths + # --detect-branches may change this for each branch + self.branchPrefixes = self.depotPaths + self.loadUserMapFromCache() self.labels = {} if self.detectLabels: @@ -2988,7 +3144,7 @@ def main(): args = sys.argv[2:] - options.append(optparse.make_option("--verbose", dest="verbose", action="store_true")) + options.append(optparse.make_option("--verbose", "-v", dest="verbose", action="store_true")) if cmd.needsGit: options.append(optparse.make_option("--git-dir", dest="gitdir")) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 0d2056f027..44901d53c4 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -115,6 +115,23 @@ mark_action_done () { fi } +append_todo_help () { + cat >> "$todo" << EOF +# +# Commands: +# p, pick = use commit +# r, reword = use commit, but edit the commit message +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit +# f, fixup = like "squash", but discard this commit's log message +# x, exec = run command (the rest of the line) using shell +# +# These lines can be re-ordered; they are executed from top to bottom. +# +# If you remove a line here THAT COMMIT WILL BE LOST. +EOF +} + make_patch () { sha1_and_parents="$(git rev-list --parents -1 "$1")" case "$sha1_and_parents" in @@ -544,6 +561,10 @@ do_next () { warn warn " git rebase --continue" warn + if test $status -eq 127 # command not found + then + status=1 + fi exit "$status" elif test "$dirty" = t then @@ -558,22 +579,22 @@ do_next () { ;; *) warn "Unknown command: $command $sha1 $rest" + fixtodo="Please fix this using 'git rebase --edit-todo'." if git rev-parse --verify -q "$sha1" >/dev/null then - die_with_patch $sha1 "Please fix this in the file $todo." + die_with_patch $sha1 "$fixtodo" else - die "Please fix this in the file $todo." + die "$fixtodo" fi ;; esac test -s "$todo" && return comment_for_reflog finish && - shortonto=$(git rev-parse --short $onto) && newhead=$(git rev-parse HEAD) && case $head_name in refs/*) - message="$GIT_REFLOG_ACTION: $head_name onto $shortonto" && + message="$GIT_REFLOG_ACTION: $head_name onto $onto" && git update-ref -m "$message" $head_name $newhead $orig_head && git symbolic-ref \ -m "$GIT_REFLOG_ACTION: returning to $head_name" \ @@ -776,6 +797,23 @@ skip) do_rest ;; +edit-todo) + sed -e '/^#/d' < "$todo" > "$todo".new + mv -f "$todo".new "$todo" + append_todo_help + cat >> "$todo" << EOF +# +# You are editing the todo file of an ongoing interactive rebase. +# To continue rebase after editing, run: +# git rebase --continue +# +EOF + + git_sequence_editor "$todo" || + die "Could not execute editor" + + exit + ;; esac git var GIT_COMMITTER_IDENT >/dev/null || @@ -902,18 +940,10 @@ test -n "$cmd" && add_exec_commands "$todo" cat >> "$todo" << EOF # Rebase $shortrevisions onto $shortonto +EOF +append_todo_help +cat >> "$todo" << EOF # -# Commands: -# p, pick = use commit -# r, reword = use commit, but edit the commit message -# e, edit = use commit, but stop for amending -# s, squash = use commit, but meld into previous commit -# f, fixup = like "squash", but discard this commit's log message -# x, exec = run command (the rest of the line) using shell -# -# These lines can be re-ordered; they are executed from top to bottom. -# -# If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # EOF diff --git a/git-rebase.sh b/git-rebase.sh index 15da926ce0..b2f1c76dc3 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -8,7 +8,7 @@ OPTIONS_KEEPDASHDASH= OPTIONS_SPEC="\ git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>] git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>] -git-rebase [-i] --continue | --abort | --skip +git-rebase --continue | --abort | --skip | --edit-todo -- Available options are v,verbose! display a diffstat of what changed upstream @@ -38,6 +38,7 @@ C=! passed to 'git apply' continue! continue abort! abort and check out the original branch skip! skip current patch and continue +edit-todo! edit the todo list during an interactive rebase " . git-sh-setup . git-sh-i18n @@ -190,7 +191,7 @@ do --verify) ok_to_skip_pre_rebase= ;; - --continue|--skip|--abort) + --continue|--skip|--abort|--edit-todo) test $total_argc -eq 2 || usage action=${1##--} ;; @@ -306,6 +307,11 @@ then fi fi +if test "$action" = "edit-todo" && test "$type" != "interactive" +then + die "$(gettext "The --edit-todo action can only be used during interactive rebase.")" +fi + case "$action" in continue) # Sanity check @@ -338,6 +344,9 @@ abort) rm -r "$state_dir" exit ;; +edit-todo) + run_specific_rebase + ;; esac # Make sure no rebase is in progress diff --git a/git-send-email.perl b/git-send-email.perl index ef30c557c7..aea66a0d47 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -681,6 +681,7 @@ sub ask { my ($prompt, %arg) = @_; my $valid_re = $arg{valid_re}; my $default = $arg{default}; + my $confirm_only = $arg{confirm_only}; my $resp; my $i = 0; return defined $default ? $default : undef @@ -698,6 +699,12 @@ sub ask { if (!defined $valid_re or $resp =~ /$valid_re/) { return $resp; } + if ($confirm_only) { + my $yesno = $term->readline("Are you sure you want to use <$resp> [y/N]? "); + if (defined $yesno && $yesno =~ /y/i) { + return $resp; + } + } } return undef; } @@ -745,13 +752,16 @@ my $prompting = 0; if (!defined $sender) { $sender = $repoauthor || $repocommitter || ''; $sender = ask("Who should the emails appear to be from? [$sender] ", - default => $sender); + default => $sender, + valid_re => qr/\@.*\./, confirm_only => 1); print "Emails will be sent from: ", $sender, "\n"; $prompting++; } if (!@initial_to && !defined $to_cmd) { - my $to = ask("Who should the emails be sent to? "); + my $to = ask("Who should the emails be sent to (if any)? ", + default => "", + valid_re => qr/\@.*\./, confirm_only => 1); push @initial_to, parse_address_line($to) if defined $to; # sanitized/validated later $prompting++; } @@ -777,7 +787,9 @@ sub expand_one_alias { if ($thread && !defined $initial_reply_to && $prompting) { $initial_reply_to = ask( - "Message-ID to be used as In-Reply-To for the first email? "); + "Message-ID to be used as In-Reply-To for the first email (if any)? ", + default => "", + valid_re => qr/\@.*\./, confirm_only => 1); } if (defined $initial_reply_to) { $initial_reply_to =~ s/^\s*<?//; @@ -862,11 +874,13 @@ $time = time - scalar $#files; sub unquote_rfc2047 { local ($_) = @_; my $encoding; - if (s/=\?([^?]+)\?q\?(.*)\?=/$2/g) { + s{=\?([^?]+)\?q\?(.*?)\?=}{ $encoding = $1; - s/_/ /g; - s/=([0-9A-F]{2})/chr(hex($1))/eg; - } + my $e = $2; + $e =~ s/_/ /g; + $e =~ s/=([0-9A-F]{2})/chr(hex($1))/eg; + $e; + }eg; return wantarray ? ($_, $encoding) : $_; } diff --git a/git-sh-setup.sh b/git-sh-setup.sh index 770a86e2b7..ee0e0bc045 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -9,8 +9,12 @@ # you would cause "cd" to be taken to unexpected places. If you # like CDPATH, define it for your interactive shell sessions without # exporting it. +# But we protect ourselves from such a user mistake nevertheless. unset CDPATH +# Similarly for IFS +unset IFS + git_broken_path_fix () { case ":$PATH:" in *:$1:*) : ok ;; diff --git a/git-stash.sh b/git-stash.sh index 4e2c7f8331..bbefdf6424 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -469,6 +469,7 @@ apply_stash () { else # Merge conflict; keep the exit status from merge-recursive status=$? + git rerere if test -n "$INDEX_OPTION" then gettextln "Index was not unstashed." >&2 diff --git a/git-submodule.sh b/git-submodule.sh index aac575e74f..ab6b1107b6 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -109,26 +109,48 @@ resolve_relative_url () # module_list() { - git ls-files --error-unmatch --stage -- "$@" | + ( + git ls-files --error-unmatch --stage -- "$@" || + echo "unmatched pathspec exists" + ) | perl -e ' my %unmerged = (); my ($null_sha1) = ("0" x 40); + my @out = (); + my $unmatched = 0; while (<STDIN>) { + if (/^unmatched pathspec/) { + $unmatched = 1; + next; + } chomp; my ($mode, $sha1, $stage, $path) = /^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/; next unless $mode eq "160000"; if ($stage ne "0") { if (!$unmerged{$path}++) { - print "$mode $null_sha1 U\t$path\n"; + push @out, "$mode $null_sha1 U\t$path\n"; } next; } - print "$_\n"; + push @out, "$_\n"; + } + if ($unmatched) { + print "#unmatched\n"; + } else { + print for (@out); } ' } +die_if_unmatched () +{ + if test "$1" = "#unmatched" + then + exit 1 + fi +} + # # Map submodule path to submodule name # @@ -385,6 +407,7 @@ cmd_foreach() module_list | while read mode sha1 stage sm_path do + die_if_unmatched "$mode" if test -e "$sm_path"/.git then say "$(eval_gettext "Entering '\$prefix\$sm_path'")" @@ -437,6 +460,7 @@ cmd_init() module_list "$@" | while read mode sha1 stage sm_path do + die_if_unmatched "$mode" name=$(module_name "$sm_path") || exit # Copy url setting when it is not set yet @@ -537,6 +561,7 @@ cmd_update() err= while read mode sha1 stage sm_path do + die_if_unmatched "$mode" if test "$stage" = U then echo >&2 "Skipping unmerged submodule $sm_path" @@ -578,7 +603,7 @@ Maybe you want to use 'update --init'?")" die "$(eval_gettext "Unable to find current revision in submodule path '\$sm_path'")" fi - if test "$subsha1" != "$sha1" + if test "$subsha1" != "$sha1" -o -n "$force" then subforce=$force # If we don't already have a -f flag and the submodule has never been checked out @@ -932,6 +957,7 @@ cmd_status() module_list "$@" | while read mode sha1 stage sm_path do + die_if_unmatched "$mode" name=$(module_name "$sm_path") || exit url=$(git config submodule."$name".url) displaypath="$prefix$sm_path" @@ -1000,6 +1026,7 @@ cmd_sync() module_list "$@" | while read mode sha1 stage sm_path do + die_if_unmatched "$mode" name=$(module_name "$sm_path") url=$(git config -f .gitmodules --get submodule."$name".url) @@ -1080,7 +1107,15 @@ do done # No command word defaults to "status" -test -n "$command" || command=status +if test -z "$command" +then + if test $# = 0 + then + command=status + else + usage + fi +fi # "-b branch" is accepted only by "add" if test -n "$branch" && test "$command" != add diff --git a/git-svn.perl b/git-svn.perl index 828b8f0c8e..bd5266c86b 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -29,7 +29,16 @@ use Git::SVN::Prompt; use Git::SVN::Log; use Git::SVN::Migration; -use Git::SVN::Utils qw(fatal can_compress); +use Git::SVN::Utils qw( + fatal + can_compress + canonicalize_path + canonicalize_url + join_paths + add_path_to_url + join_paths +); + use Git qw( git_cmd_try command @@ -1231,7 +1240,7 @@ sub cmd_show_ignore { my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); $gs ||= Git::SVN->new; my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum); - $gs->prop_walk($gs->{path}, $r, sub { + $gs->prop_walk($gs->path, $r, sub { my ($gs, $path, $props) = @_; print STDOUT "\n# $path\n"; my $s = $props->{'svn:ignore'} or return; @@ -1247,7 +1256,7 @@ sub cmd_show_externals { my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); $gs ||= Git::SVN->new; my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum); - $gs->prop_walk($gs->{path}, $r, sub { + $gs->prop_walk($gs->path, $r, sub { my ($gs, $path, $props) = @_; print STDOUT "\n# $path\n"; my $s = $props->{'svn:externals'} or return; @@ -1262,7 +1271,7 @@ sub cmd_create_ignore { my ($url, $rev, $uuid, $gs) = working_head_info('HEAD'); $gs ||= Git::SVN->new; my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum); - $gs->prop_walk($gs->{path}, $r, sub { + $gs->prop_walk($gs->path, $r, sub { my ($gs, $path, $props) = @_; # $path is of the form /path/to/dir/ $path = '.' . $path; @@ -1292,31 +1301,6 @@ sub cmd_mkdirs { $gs->mkemptydirs($_revision); } -sub canonicalize_path { - my ($path) = @_; - my $dot_slash_added = 0; - if (substr($path, 0, 1) ne "/") { - $path = "./" . $path; - $dot_slash_added = 1; - } - # File::Spec->canonpath doesn't collapse x/../y into y (for a - # good reason), so let's do this manually. - $path =~ s#/+#/#g; - $path =~ s#/\.(?:/|$)#/#g; - $path =~ s#/[^/]+/\.\.##g; - $path =~ s#/$##g; - $path =~ s#^\./## if $dot_slash_added; - $path =~ s#^/##; - $path =~ s#^\.$##; - return $path; -} - -sub canonicalize_url { - my ($url) = @_; - $url =~ s#^([^:]+://[^/]*/)(.*)$#$1 . canonicalize_path($2)#e; - return $url; -} - # get_svnprops(PATH) # ------------------ # Helper for cmd_propget and cmd_proplist below. @@ -1330,7 +1314,7 @@ sub get_svnprops { $path = $cmd_dir_prefix . $path; fatal("No such file or directory: $path") unless -e $path; my $is_dir = -d $path ? 1 : 0; - $path = $gs->{path} . '/' . $path; + $path = join_paths($gs->path, $path); # canonicalize the path (otherwise libsvn will abort or fail to # find the file) @@ -1431,8 +1415,8 @@ sub cmd_commit_diff { fatal("Needed URL or usable git-svn --id in ", "the command-line\n", $usage); } - $url = $gs->{url}; - $svn_path = $gs->{path}; + $url = $gs->url; + $svn_path = $gs->path; } unless (defined $_revision) { fatal("-r|--revision is a required argument\n", $usage); @@ -1466,24 +1450,6 @@ sub cmd_commit_diff { } } -sub escape_uri_only { - my ($uri) = @_; - my @tmp; - foreach (split m{/}, $uri) { - s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg; - push @tmp, $_; - } - join('/', @tmp); -} - -sub escape_url { - my ($url) = @_; - if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) { - my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3)); - $url = "$scheme://$domain$uri"; - } - $url; -} sub cmd_info { my $path = canonicalize_path(defined($_[0]) ? $_[0] : "."); @@ -1508,21 +1474,21 @@ sub cmd_info { # canonicalize_path() will return "" to make libsvn 1.5.x happy, $path = "." if $path eq ""; - my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath"); + my $full_url = canonicalize_url( add_path_to_url( $url, $fullpath ) ); if ($_url) { - print escape_url($full_url), "\n"; + print "$full_url\n"; return; } my $result = "Path: $path\n"; $result .= "Name: " . basename($path) . "\n" if $file_type ne "dir"; - $result .= "URL: " . escape_url($full_url) . "\n"; + $result .= "URL: $full_url\n"; eval { my $repos_root = $gs->repos_root; Git::SVN::remove_username($repos_root); - $result .= "Repository Root: " . escape_url($repos_root) . "\n"; + $result .= "Repository Root: " . canonicalize_url($repos_root) . "\n"; }; if ($@) { $result .= "Repository Root: (offline)\n"; @@ -1669,7 +1635,9 @@ sub post_fetch_checkout { sub complete_svn_url { my ($url, $path) = @_; - $path =~ s#/+$##; + $path = canonicalize_path($path); + + # If the path is not a URL... if ($path !~ m#^[a-z\+]+://#) { if (!defined $url || $url !~ m#^[a-z\+]+://#) { fatal("E: '$path' is not a complete URL ", @@ -1686,7 +1654,7 @@ sub complete_url_ls_init { print STDERR "W: $switch not specified\n"; return; } - $repo_path =~ s#/+$##; + $repo_path = canonicalize_path($repo_path); if ($repo_path =~ m#^[a-z\+]+://#) { $ra = Git::SVN::Ra->new($repo_path); $repo_path = ''; @@ -1697,18 +1665,18 @@ sub complete_url_ls_init { "and a separate URL is not specified"); } } - my $url = $ra->{url}; + my $url = $ra->url; my $gs = Git::SVN->init($url, undef, undef, undef, 1); my $k = "svn-remote.$gs->{repo_id}.url"; my $orig_url = eval { command_oneline(qw/config --get/, $k) }; - if ($orig_url && ($orig_url ne $gs->{url})) { + if ($orig_url && ($orig_url ne $gs->url)) { die "$k already set: $orig_url\n", - "wanted to set to: $gs->{url}\n"; + "wanted to set to: $gs->url\n"; } - command_oneline('config', $k, $gs->{url}) unless $orig_url; - my $remote_path = "$gs->{path}/$repo_path"; + command_oneline('config', $k, $gs->url) unless $orig_url; + + my $remote_path = join_paths( $gs->path, $repo_path ); $remote_path =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg; - $remote_path =~ s#/+#/#g; $remote_path =~ s#^/##g; $remote_path .= "/*" if $remote_path !~ /\*/; my ($n) = ($switch =~ /^--(\w+)/); diff --git a/gitk-git/gitk b/gitk-git/gitk index 22270ce46b..d93bd990a9 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -2038,7 +2038,7 @@ proc makewindow {} { set file { mc "File" cascade { {mc "Update" command updatecommits -accelerator F5} - {mc "Reload" command reloadcommits -accelerator Meta1-F5} + {mc "Reload" command reloadcommits -accelerator Shift-F5} {mc "Reread references" command rereadrefs} {mc "List references" command showrefs -accelerator F2} {xx "" separator} @@ -2495,7 +2495,7 @@ proc makewindow {} { bindkey ? {dofind -1 1} bindkey f nextfile bind . <F5> updatecommits - bind . <$M1B-F5> reloadcommits + bind . <Shift-F5> reloadcommits bind . <F2> showrefs bind . <Shift-F4> {newview 0} catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } @@ -10599,7 +10599,7 @@ proc movedhead {hid head} { } proc changedrefs {} { - global cached_dheads cached_dtags cached_atags + global cached_dheads cached_dtags cached_atags cached_tagcontent global arctags archeads arcnos arcout idheads idtags foreach id [concat [array names idheads] [array names idtags]] { @@ -10611,6 +10611,7 @@ proc changedrefs {} { } } } + catch {unset cached_tagcontent} catch {unset cached_dtags} catch {unset cached_atags} catch {unset cached_dheads} @@ -10663,7 +10664,7 @@ proc listrefs {id} { } proc showtag {tag isnew} { - global ctext tagcontents tagids linknum tagobjid + global ctext cached_tagcontent tagids linknum tagobjid if {$isnew} { addtohistory [list showtag $tag 0] savectextpos @@ -10672,13 +10673,13 @@ proc showtag {tag isnew} { clear_ctext settabs 0 set linknum 0 - if {![info exists tagcontents($tag)]} { + if {![info exists cached_tagcontent($tag)]} { catch { - set tagcontents($tag) [exec git cat-file tag $tag] + set cached_tagcontent($tag) [exec git cat-file tag $tag] } } - if {[info exists tagcontents($tag)]} { - set text $tagcontents($tag) + if {[info exists cached_tagcontent($tag)]} { + set text $cached_tagcontent($tag) } else { set text "[mc "Tag"]: $tag\n[mc "Id"]: $tagids($tag)" } @@ -11532,6 +11533,11 @@ if {[catch {package require Tk 8.4} err]} { exit 1 } +# Unset GIT_TRACE var if set +if { [info exists ::env(GIT_TRACE)] } { + unset ::env(GIT_TRACE) +} + # defaults... set wrcomcmd "git diff-tree --stdin -p --pretty" diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 3d6a705388..10ed9e51a5 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -54,6 +54,11 @@ sub evaluate_uri { # to build the base URL ourselves: our $path_info = decode_utf8($ENV{"PATH_INFO"}); if ($path_info) { + # $path_info has already been URL-decoded by the web server, but + # $my_url and $my_uri have not. URL-decode them so we can properly + # strip $path_info. + $my_url = unescape($my_url); + $my_uri = unescape($my_uri); if ($my_url =~ s,\Q$path_info\E$,, && $my_uri =~ s,\Q$path_info\E$,, && defined $ENV{'SCRIPT_NAME'}) { @@ -8023,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, @@ -8,6 +8,34 @@ /* Internal API */ /* + * Output the next line for a graph. + * This formats the next graph line into the specified strbuf. It is not + * terminated with a newline. + * + * Returns 1 if the line includes the current commit, and 0 otherwise. + * graph_next_line() will return 1 exactly once for each time + * graph_update() is called. + */ +static int graph_next_line(struct git_graph *graph, struct strbuf *sb); + +/* + * Set up a custom scheme for column colors. + * + * The default column color scheme inserts ANSI color escapes to colorize + * the graph. The various color escapes are stored in an array of strings + * where each entry corresponds to a color, except for the last entry, + * which denotes the escape for resetting the color back to the default. + * When generating the graph, strings from this array are inserted before + * and after the various column characters. + * + * This function allows you to enable a custom array of color escapes. + * The 'colors_max' argument is the index of the last "reset" entry. + * + * This functions must be called BEFORE graph_init() is called. + */ +static void graph_set_column_colors(const char **colors, unsigned short colors_max); + +/* * Output a padding line in the graph. * This is similar to graph_next_line(). However, it is guaranteed to * never print the current commit line. Instead, if the commit line is @@ -62,7 +90,7 @@ enum graph_state { static const char **column_colors; static unsigned short column_colors_max; -void graph_set_column_colors(const char **colors, unsigned short colors_max) +static void graph_set_column_colors(const char **colors, unsigned short colors_max) { column_colors = colors; column_colors_max = colors_max; @@ -1116,7 +1144,7 @@ static void graph_output_collapsing_line(struct git_graph *graph, struct strbuf graph_update_state(graph, GRAPH_PADDING); } -int graph_next_line(struct git_graph *graph, struct strbuf *sb) +static int graph_next_line(struct git_graph *graph, struct strbuf *sb) { switch (graph->state) { case GRAPH_PADDING: @@ -4,22 +4,6 @@ /* A graph is a pointer to this opaque structure */ struct git_graph; -/* - * Set up a custom scheme for column colors. - * - * The default column color scheme inserts ANSI color escapes to colorize - * the graph. The various color escapes are stored in an array of strings - * where each entry corresponds to a color, except for the last entry, - * which denotes the escape for resetting the color back to the default. - * When generating the graph, strings from this array are inserted before - * and after the various column characters. - * - * This function allows you to enable a custom array of color escapes. - * The 'colors_max' argument is the index of the last "reset" entry. - * - * This functions must be called BEFORE graph_init() is called. - */ -void graph_set_column_colors(const char **colors, unsigned short colors_max); /* * Create a new struct git_graph. @@ -49,17 +33,6 @@ void graph_update(struct git_graph *graph, struct commit *commit); */ int graph_is_commit_finished(struct git_graph const *graph); -/* - * Output the next line for a graph. - * This formats the next graph line into the specified strbuf. It is not - * terminated with a newline. - * - * Returns 1 if the line includes the current commit, and 0 otherwise. - * graph_next_line() will return 1 exactly once for each time - * graph_update() is called. - */ -int graph_next_line(struct git_graph *graph, struct strbuf *sb); - /* * graph_show_*: helper functions for printing to stdout @@ -3,6 +3,10 @@ #include "userdiff.h" #include "xdiff-interface.h" +static int grep_source_load(struct grep_source *gs); +static int grep_source_is_binary(struct grep_source *gs); + + static struct grep_pat *create_grep_pat(const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t, @@ -60,6 +64,8 @@ void append_header_grep_pattern(struct grep_opt *opt, { struct grep_pat *p = create_grep_pat(pat, strlen(pat), "header", 0, GREP_PATTERN_HEAD, field); + if (field == GREP_HEADER_REFLOG) + opt->use_reflog_filter = 1; do_append_grep_pat(&opt->header_tail, p); } @@ -332,6 +338,87 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list) return compile_pattern_or(list); } +static void indent(int in) +{ + while (in-- > 0) + fputc(' ', stderr); +} + +static void dump_grep_pat(struct grep_pat *p) +{ + switch (p->token) { + case GREP_AND: fprintf(stderr, "*and*"); break; + case GREP_OPEN_PAREN: fprintf(stderr, "*(*"); break; + case GREP_CLOSE_PAREN: fprintf(stderr, "*)*"); break; + case GREP_NOT: fprintf(stderr, "*not*"); break; + case GREP_OR: fprintf(stderr, "*or*"); break; + + case GREP_PATTERN: fprintf(stderr, "pattern"); break; + case GREP_PATTERN_HEAD: fprintf(stderr, "pattern_head"); break; + case GREP_PATTERN_BODY: fprintf(stderr, "pattern_body"); break; + } + + switch (p->token) { + default: break; + case GREP_PATTERN_HEAD: + fprintf(stderr, "<head %d>", p->field); break; + case GREP_PATTERN_BODY: + fprintf(stderr, "<body>"); break; + } + switch (p->token) { + default: break; + case GREP_PATTERN_HEAD: + case GREP_PATTERN_BODY: + case GREP_PATTERN: + fprintf(stderr, "%.*s", (int)p->patternlen, p->pattern); + break; + } + fputc('\n', stderr); +} + +static void dump_grep_expression_1(struct grep_expr *x, int in) +{ + indent(in); + switch (x->node) { + case GREP_NODE_TRUE: + fprintf(stderr, "true\n"); + break; + case GREP_NODE_ATOM: + dump_grep_pat(x->u.atom); + break; + case GREP_NODE_NOT: + fprintf(stderr, "(not\n"); + dump_grep_expression_1(x->u.unary, in+1); + indent(in); + fprintf(stderr, ")\n"); + break; + case GREP_NODE_AND: + fprintf(stderr, "(and\n"); + dump_grep_expression_1(x->u.binary.left, in+1); + dump_grep_expression_1(x->u.binary.right, in+1); + indent(in); + fprintf(stderr, ")\n"); + break; + case GREP_NODE_OR: + fprintf(stderr, "(or\n"); + dump_grep_expression_1(x->u.binary.left, in+1); + dump_grep_expression_1(x->u.binary.right, in+1); + indent(in); + fprintf(stderr, ")\n"); + break; + } +} + +static void dump_grep_expression(struct grep_opt *opt) +{ + struct grep_expr *x = opt->pattern_expression; + + if (opt->all_match) + fprintf(stderr, "[all-match]\n"); + dump_grep_expression_1(x, 0); + fflush(NULL); +} + static struct grep_expr *grep_true_expr(void) { struct grep_expr *z = xcalloc(1, sizeof(*z)); @@ -395,7 +482,23 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt) return header_expr; } -void compile_grep_patterns(struct grep_opt *opt) +static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y) +{ + struct grep_expr *z = x; + + while (x) { + assert(x->node == GREP_NODE_OR); + if (x->u.binary.right && + x->u.binary.right->node == GREP_NODE_TRUE) { + x->u.binary.right = y; + break; + } + x = x->u.binary.right; + } + return z; +} + +static void compile_grep_patterns_real(struct grep_opt *opt) { struct grep_pat *p; struct grep_expr *header_expr = prep_header_patterns(opt); @@ -415,7 +518,7 @@ void compile_grep_patterns(struct grep_opt *opt) if (opt->all_match || header_expr) opt->extended = 1; - else if (!opt->extended) + else if (!opt->extended && !opt->debug) return; p = opt->pattern_list; @@ -429,12 +532,22 @@ void compile_grep_patterns(struct grep_opt *opt) if (!opt->pattern_expression) opt->pattern_expression = header_expr; + else if (opt->all_match) + opt->pattern_expression = grep_splice_or(header_expr, + opt->pattern_expression); else opt->pattern_expression = grep_or_expr(opt->pattern_expression, header_expr); opt->all_match = 1; } +void compile_grep_patterns(struct grep_opt *opt) +{ + compile_grep_patterns_real(opt); + if (opt->debug) + dump_grep_expression(opt); +} + static void free_pattern_expr(struct grep_expr *x) { switch (x->node) { @@ -586,6 +699,7 @@ static struct { } header_field[] = { { "author ", 7 }, { "committer ", 10 }, + { "reflog ", 7 }, }; static int match_one_pattern(struct grep_pat *p, char *bol, char *eol, @@ -609,7 +723,14 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol, if (strncmp(bol, field, len)) return 0; bol += len; - saved_ch = strip_timestamp(bol, &eol); + switch (p->field) { + case GREP_HEADER_AUTHOR: + case GREP_HEADER_COMMITTER: + saved_ch = strip_timestamp(bol, &eol); + break; + default: + break; + } } again: @@ -1358,7 +1479,7 @@ static int grep_source_load_file(struct grep_source *gs) return 0; } -int grep_source_load(struct grep_source *gs) +static int grep_source_load(struct grep_source *gs) { if (gs->buf) return 0; @@ -1386,7 +1507,7 @@ void grep_source_load_driver(struct grep_source *gs) grep_attr_unlock(); } -int grep_source_is_binary(struct grep_source *gs) +static int grep_source_is_binary(struct grep_source *gs) { grep_source_load_driver(gs); if (gs->driver->binary != -1) @@ -29,9 +29,12 @@ enum grep_context { enum grep_header_field { GREP_HEADER_AUTHOR = 0, - GREP_HEADER_COMMITTER + GREP_HEADER_COMMITTER, + GREP_HEADER_REFLOG, + + /* Must be at the end of the enum */ + GREP_HEADER_FIELD_MAX }; -#define GREP_HEADER_FIELD_MAX (GREP_HEADER_COMMITTER + 1) struct grep_pat { struct grep_pat *next; @@ -58,6 +61,14 @@ enum grep_expr_node { GREP_NODE_OR }; +enum grep_pattern_type { + GREP_PATTERN_TYPE_UNSPECIFIED = 0, + GREP_PATTERN_TYPE_BRE, + GREP_PATTERN_TYPE_ERE, + GREP_PATTERN_TYPE_FIXED, + GREP_PATTERN_TYPE_PCRE +}; + struct grep_expr { enum grep_expr_node node; unsigned hit; @@ -90,11 +101,13 @@ struct grep_opt { int word_regexp; int fixed; int all_match; + int debug; #define GREP_BINARY_DEFAULT 0 #define GREP_BINARY_NOMATCH 1 #define GREP_BINARY_TEXT 2 int binary; int extended; + int use_reflog_filter; int pcre; int relative; int pathname; @@ -103,6 +116,8 @@ struct grep_opt { int max_depth; int funcname; int funcbody; + int extended_regexp_option; + int pattern_type_option; char color_context[COLOR_MAXLEN]; char color_filename[COLOR_MAXLEN]; char color_function[COLOR_MAXLEN]; @@ -148,11 +163,10 @@ struct grep_source { void grep_source_init(struct grep_source *gs, enum grep_source_type type, const char *name, const void *identifier); -int grep_source_load(struct grep_source *gs); 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); -int grep_source_is_binary(struct grep_source *gs); + int grep_source(struct grep_opt *opt, struct grep_source *gs); diff --git a/http-push.c b/http-push.c index a832ca77a3..8701c1215d 100644 --- a/http-push.c +++ b/http-push.c @@ -1610,9 +1610,8 @@ static int verify_merge_base(unsigned char *head_sha1, struct ref *remote) { struct commit *head = lookup_commit_or_die(head_sha1, "HEAD"); struct commit *branch = lookup_commit_or_die(remote->old_sha1, remote->name); - struct commit_list *merge_bases = get_merge_bases(head, branch, 1); - return (merge_bases && !merge_bases->next && merge_bases->item == branch); + return in_merge_bases(branch, head); } static int delete_remote_branch(const char *pattern, int force) diff --git a/http-walker.c b/http-walker.c index 51a906e9e3..1516c5eb29 100644 --- a/http-walker.c +++ b/http-walker.c @@ -396,7 +396,7 @@ static int fetch_indices(struct walker *walker, struct alt_base *repo) return ret; } -static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1) +static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1) { struct packed_git *target; int ret; @@ -524,7 +524,7 @@ static int fetch(struct walker *walker, unsigned char *sha1) if (!fetch_object(walker, altbase, sha1)) return 0; while (altbase) { - if (!fetch_pack(walker, altbase, sha1)) + if (!http_fetch_pack(walker, altbase, sha1)) return 0; fetch_alternates(walker, data->alt->base); altbase = altbase->next; @@ -745,6 +745,34 @@ 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, + struct slot_results *results) +{ + if (results->curl_result == CURLE_OK) { + credential_approve(&http_auth); + return HTTP_OK; + } else if (missing_target(results)) + return HTTP_MISSING_TARGET; + else if (results->http_code == 401) { + if (http_auth.username && http_auth.password) { + credential_reject(&http_auth); + return HTTP_NOAUTH; + } else { + credential_fill(&http_auth); + init_curl_http_auth(slot->curl); + return HTTP_REAUTH; + } + } else { +#if LIBCURL_VERSION_NUM >= 0x070c00 + if (!curl_errorstr[0]) + strlcpy(curl_errorstr, + curl_easy_strerror(results->curl_result), + sizeof(curl_errorstr)); +#endif + return HTTP_ERROR; + } +} + /* http_request() targets */ #define HTTP_REQUEST_STRBUF 0 #define HTTP_REQUEST_FILE 1 @@ -789,29 +817,11 @@ static int http_request(const char *url, void *result, int target, int options) curl_easy_setopt(slot->curl, CURLOPT_URL, url); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip"); if (start_active_slot(slot)) { run_active_slot(slot); - if (results.curl_result == CURLE_OK) - ret = HTTP_OK; - else if (missing_target(&results)) - ret = HTTP_MISSING_TARGET; - else if (results.http_code == 401) { - if (http_auth.username && http_auth.password) { - credential_reject(&http_auth); - ret = HTTP_NOAUTH; - } else { - credential_fill(&http_auth); - init_curl_http_auth(slot->curl); - ret = HTTP_REAUTH; - } - } else { - if (!curl_errorstr[0]) - strlcpy(curl_errorstr, - curl_easy_strerror(results.curl_result), - sizeof(curl_errorstr)); - ret = HTTP_ERROR; - } + ret = handle_curl_result(slot, &results); } else { error("Unable to start HTTP request for %s", url); ret = HTTP_START_FAILED; @@ -820,9 +830,6 @@ static int http_request(const char *url, void *result, int target, int options) curl_slist_free_all(headers); strbuf_release(&buf); - if (ret == HTTP_OK) - credential_approve(&http_auth); - return ret; } @@ -78,6 +78,8 @@ 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, + struct slot_results *results); #ifdef USE_CURL_MULTI extern void fill_active_slots(void); @@ -93,7 +93,7 @@ static void copy_email(const struct passwd *pw, struct strbuf *email) add_domainname(email); } -const char *ident_default_name(void) +static const char *ident_default_name(void) { if (!git_default_name.len) { copy_gecos(xgetpwuid_self(), &git_default_name); @@ -117,7 +117,7 @@ const char *ident_default_email(void) return git_default_email.buf; } -const char *ident_default_date(void) +static const char *ident_default_date(void) { if (!git_default_date[0]) datestamp(git_default_date, sizeof(git_default_date)); @@ -210,8 +210,10 @@ int split_ident_line(struct ident_split *split, const char *line, int len) split->name_end = cp + 1; break; } - if (!split->name_end) - return status; + if (!split->name_end) { + /* no human readable name */ + split->name_end = split->name_begin; + } for (cp = split->mail_begin; cp < line + len; cp++) if (*cp == '>') { diff --git a/ll-merge.c b/ll-merge.c index f3f7692158..acea33bf1b 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -35,7 +35,7 @@ struct ll_merge_driver { */ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, mmbuffer_t *result, - const char *path_unused, + const char *path, mmfile_t *orig, const char *orig_name, mmfile_t *src1, const char *name1, mmfile_t *src2, const char *name2, @@ -46,16 +46,34 @@ static int ll_binary_merge(const struct ll_merge_driver *drv_unused, assert(opts); /* - * The tentative merge result is "ours" for the final round, - * or common ancestor for an internal merge. Still return - * "conflicted merge" status. + * The tentative merge result is the or common ancestor for an internal merge. */ - stolen = opts->virtual_ancestor ? orig : src1; + if (opts->virtual_ancestor) { + stolen = orig; + } else { + switch (opts->variant) { + default: + warning("Cannot merge binary files: %s (%s vs. %s)", + path, name1, name2); + /* fallthru */ + case XDL_MERGE_FAVOR_OURS: + stolen = src1; + break; + case XDL_MERGE_FAVOR_THEIRS: + stolen = src2; + break; + } + } result->ptr = stolen->ptr; result->size = stolen->size; stolen->ptr = NULL; - return 1; + + /* + * With -Xtheirs or -Xours, we have cleanly merged; + * otherwise we got a conflict. + */ + return (opts->variant ? 0 : 1); } static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, @@ -73,8 +91,6 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, if (buffer_is_binary(orig->ptr, orig->size) || buffer_is_binary(src1->ptr, src1->size) || buffer_is_binary(src2->ptr, src2->size)) { - warning("Cannot merge binary files: %s (%s vs. %s)", - path, name1, name2); return ll_binary_merge(drv_unused, result, path, orig, orig_name, diff --git a/merge-recursive.c b/merge-recursive.c index 39b2e165e0..d8820604ca 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -493,8 +493,7 @@ static struct string_list *get_renames(struct merge_options *o, opts.rename_score = o->rename_score; opts.show_rename_progress = o->show_rename_progress; opts.output_format = DIFF_FORMAT_NO_OUTPUT; - if (diff_setup_done(&opts) < 0) - die(_("diff setup failed")); + diff_setup_done(&opts); diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts); diffcore_std(&opts); if (opts.needed_rename_limit > o->needed_rename_limit) @@ -614,23 +613,6 @@ static char *unique_path(struct merge_options *o, const char *path, const char * return newpath; } -static void flush_buffer(int fd, const char *buf, unsigned long size) -{ - while (size > 0) { - long ret = write_in_full(fd, buf, size); - if (ret < 0) { - /* Ignore epipe */ - if (errno == EPIPE) - break; - die_errno("merge-recursive"); - } else if (!ret) { - die(_("merge-recursive: disk full?")); - } - size -= ret; - buf += ret; - } -} - static int dir_in_way(const char *path, int check_working_copy) { int pos, pathlen = strlen(path); @@ -789,7 +771,7 @@ static void update_file_flags(struct merge_options *o, fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); if (fd < 0) die_errno(_("failed to open '%s'"), path); - flush_buffer(fd, buf, size); + write_in_full(fd, buf, size); close(fd); } else if (S_ISLNK(mode)) { char *lnk = xmemdupz(buf, size); @@ -862,14 +844,14 @@ static int merge_3way(struct merge_options *o, if (strcmp(a->path, b->path) || (o->ancestor != NULL && strcmp(a->path, one->path) != 0)) { base_name = o->ancestor == NULL ? NULL : - xstrdup(mkpath("%s:%s", o->ancestor, one->path)); - name1 = xstrdup(mkpath("%s:%s", branch1, a->path)); - name2 = xstrdup(mkpath("%s:%s", branch2, b->path)); + mkpathdup("%s:%s", o->ancestor, one->path); + name1 = mkpathdup("%s:%s", branch1, a->path); + name2 = mkpathdup("%s:%s", branch2, b->path); } else { base_name = o->ancestor == NULL ? NULL : - xstrdup(mkpath("%s", o->ancestor)); - name1 = xstrdup(mkpath("%s", branch1)); - name2 = xstrdup(mkpath("%s", branch2)); + mkpathdup("%s", o->ancestor); + name1 = mkpathdup("%s", branch1); + name2 = mkpathdup("%s", branch2); } read_mmblob(&orig, one->sha1); @@ -879,6 +861,7 @@ static int merge_3way(struct merge_options *o, merge_status = ll_merge(result_buf, a->path, &orig, base_name, &src1, name1, &src2, name2, &ll_opts); + free(base_name); free(name1); free(name2); free(orig.ptr); diff --git a/mergetools/codecompare b/mergetools/codecompare new file mode 100644 index 0000000000..3f0486bc80 --- /dev/null +++ b/mergetools/codecompare @@ -0,0 +1,25 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} + +merge_cmd () { + touch "$BACKUP" + if $base_present + then + "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" -BF="$BASE" \ + -RF="$MERGED" + else + "$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" \ + -RF="$MERGED" + fi + check_unchanged +} + +translate_merge_tool_path() { + if merge_mode + then + echo CodeMerge + else + echo CodeCompare + fi +} diff --git a/mergetools/defaults b/mergetools/defaults index 1d8f2a3dd3..21e63ecc3e 100644 --- a/mergetools/defaults +++ b/mergetools/defaults @@ -8,36 +8,12 @@ can_diff () { } diff_cmd () { - merge_tool_cmd="$(get_merge_tool_cmd "$1")" - if test -z "$merge_tool_cmd" - then - status=1 - break - fi - ( eval $merge_tool_cmd ) - status=$? + status=1 return $status } merge_cmd () { - merge_tool_cmd="$(get_merge_tool_cmd "$1")" - if test -z "$merge_tool_cmd" - then - status=1 - break - fi - trust_exit_code="$(git config --bool \ - mergetool."$1".trustExitCode || echo false)" - if test "$trust_exit_code" = "false" - then - touch "$BACKUP" - ( eval $merge_tool_cmd ) - status=$? - check_unchanged - else - ( eval $merge_tool_cmd ) - status=$? - fi + status=1 return $status } diff --git a/notes-merge.c b/notes-merge.c index 29c6411fc6..0f67bd3f96 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -126,8 +126,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o, diff_setup(&opt); DIFF_OPT_SET(&opt, RECURSIVE); opt.output_format = DIFF_FORMAT_NO_OUTPUT; - if (diff_setup_done(&opt) < 0) - die("diff_setup_done failed"); + diff_setup_done(&opt); diff_tree_sha1(base, remote, "", &opt); diffcore_std(&opt); @@ -190,8 +189,7 @@ static void diff_tree_local(struct notes_merge_options *o, diff_setup(&opt); DIFF_OPT_SET(&opt, RECURSIVE); opt.output_format = DIFF_FORMAT_NO_OUTPUT; - if (diff_setup_done(&opt) < 0) - die("diff_setup_done failed"); + diff_setup_done(&opt); diff_tree_sha1(base, local, "", &opt); diffcore_std(&opt); @@ -1196,8 +1196,18 @@ void free_notes(struct notes_tree *t) memset(t, 0, sizeof(struct notes_tree)); } -void format_note(struct notes_tree *t, const unsigned char *object_sha1, - struct strbuf *sb, const char *output_encoding, int flags) +/* + * Fill the given strbuf with the notes associated with the given object. + * + * If the given notes_tree structure is not initialized, it will be auto- + * initialized to the default value (see documentation for init_notes() above). + * If the given notes_tree is NULL, the internal/default notes_tree will be + * used instead. + * + * 'flags' is a bitwise combination of the flags for format_display_notes. + */ +static void format_note(struct notes_tree *t, const unsigned char *object_sha1, + struct strbuf *sb, const char *output_encoding, int flags) { static const char utf8[] = "utf-8"; const unsigned char *sha1; @@ -241,20 +241,6 @@ void free_notes(struct notes_tree *t); #define NOTES_SHOW_HEADER 1 #define NOTES_INDENT 2 -/* - * Fill the given strbuf with the notes associated with the given object. - * - * If the given notes_tree structure is not initialized, it will be auto- - * initialized to the default value (see documentation for init_notes() above). - * If the given notes_tree is NULL, the internal/default notes_tree will be - * used instead. - * - * 'flags' is a bitwise combination of the above formatting flags. - */ -void format_note(struct notes_tree *t, const unsigned char *object_sha1, - struct strbuf *sb, const char *output_encoding, int flags); - - struct string_list; struct display_notes_opt { @@ -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/parse-options.h b/parse-options.h index 77a4a8b2e6..71a39c60d9 100644 --- a/parse-options.h +++ b/parse-options.h @@ -238,6 +238,6 @@ extern int parse_opt_noop_cb(const struct option *, const char *, int); #define OPT__COLOR(var, h) \ OPT_COLOR_FLAG(0, "color", (var), (h)) #define OPT_COLUMN(s, l, v, h) \ - { OPTION_CALLBACK, (s), (l), (v), "style", (h), PARSE_OPT_OPTARG, parseopt_column_callback } + { OPTION_CALLBACK, (s), (l), (v), N_("style"), (h), PARSE_OPT_OPTARG, parseopt_column_callback } #endif diff --git a/patch-ids.c b/patch-ids.c index 5717257051..bc8a28fdd7 100644 --- a/patch-ids.c +++ b/patch-ids.c @@ -39,8 +39,7 @@ int init_patch_ids(struct patch_ids *ids) memset(ids, 0, sizeof(*ids)); diff_setup(&ids->diffopts); DIFF_OPT_SET(&ids->diffopts, RECURSIVE); - if (diff_setup_done(&ids->diffopts) < 0) - return error("diff_setup_done failed"); + diff_setup_done(&ids->diffopts); return 0; } @@ -48,7 +48,7 @@ char *mksnpath(char *buf, size_t n, const char *fmt, ...) return cleanup_path(buf); } -static char *git_vsnpath(char *buf, size_t n, const char *fmt, va_list args) +static char *vsnpath(char *buf, size_t n, const char *fmt, va_list args) { const char *git_dir = get_git_dir(); size_t len; @@ -70,21 +70,22 @@ bad: char *git_snpath(char *buf, size_t n, const char *fmt, ...) { + char *ret; va_list args; va_start(args, fmt); - (void)git_vsnpath(buf, n, fmt, args); + ret = vsnpath(buf, n, fmt, args); va_end(args); - return buf; + return ret; } char *git_pathdup(const char *fmt, ...) { - char path[PATH_MAX]; + char path[PATH_MAX], *ret; va_list args; va_start(args, fmt); - (void)git_vsnpath(path, sizeof(path), fmt, args); + ret = vsnpath(path, sizeof(path), fmt, args); va_end(args); - return xstrdup(path); + return xstrdup(ret); } char *mkpathdup(const char *fmt, ...) @@ -118,23 +119,14 @@ char *mkpath(const char *fmt, ...) char *git_path(const char *fmt, ...) { - const char *git_dir = get_git_dir(); char *pathname = get_pathname(); va_list args; - unsigned len; + char *ret; - len = strlen(git_dir); - if (len > PATH_MAX-100) - return bad_path; - memcpy(pathname, git_dir, len); - if (len && git_dir[len-1] != '/') - pathname[len++] = '/'; va_start(args, fmt); - len += vsnprintf(pathname + len, PATH_MAX - len, fmt, args); + ret = vsnpath(pathname, PATH_MAX, fmt, args); va_end(args); - if (len >= PATH_MAX) - return bad_path; - return cleanup_path(pathname); + return ret; } void home_config_paths(char **global, char **xdg, char *file) diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 8478d0c952..59215fa86e 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -23,7 +23,14 @@ use Git qw( command_output_pipe command_close_pipe ); -use Git::SVN::Utils qw(fatal can_compress); +use Git::SVN::Utils qw( + fatal + can_compress + join_paths + canonicalize_path + canonicalize_url + add_path_to_url +); my $can_use_yaml; BEGIN { @@ -195,9 +202,9 @@ sub read_all_remotes { } elsif (m!^(.+)\.usesvmprops=\s*(.*)\s*$!) { $r->{$1}->{svm} = {}; } elsif (m!^(.+)\.url=\s*(.*)\s*$!) { - $r->{$1}->{url} = $2; + $r->{$1}->{url} = canonicalize_url($2); } elsif (m!^(.+)\.pushurl=\s*(.*)\s*$!) { - $r->{$1}->{pushurl} = $2; + $r->{$1}->{pushurl} = canonicalize_url($2); } elsif (m!^(.+)\.ignore-refs=\s*(.*)\s*$!) { $r->{$1}->{ignore_refs_regex} = $2; } elsif (m!^(.+)\.(branches|tags)=$svn_refspec$!) { @@ -290,7 +297,7 @@ sub find_existing_remote { sub init_remote_config { my ($self, $url, $no_write) = @_; - $url =~ s!/+$!!; # strip trailing slash + $url = canonicalize_url($url); my $r = read_all_remotes(); my $existing = find_existing_remote($url, $r); if ($existing) { @@ -314,12 +321,10 @@ sub init_remote_config { print STDERR "Using higher level of URL: ", "$url => $min_url\n"; } - my $old_path = $self->{path}; - $self->{path} = $url; - $self->{path} =~ s!^\Q$min_url\E(/|$)!!; - if (length $old_path) { - $self->{path} .= "/$old_path"; - } + my $old_path = $self->path; + $url =~ s!^\Q$min_url\E(/|$)!!; + $url = join_paths($url, $old_path); + $self->path($url); $url = $min_url; } } @@ -343,18 +348,22 @@ sub init_remote_config { unless ($no_write) { command_noisy('config', "svn-remote.$self->{repo_id}.url", $url); - $self->{path} =~ s{^/}{}; - $self->{path} =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg; + my $path = $self->path; + $path =~ s{^/}{}; + $path =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg; + $self->path($path); command_noisy('config', '--add', "svn-remote.$self->{repo_id}.fetch", - "$self->{path}:".$self->refname); + $self->path.":".$self->refname); } - $self->{url} = $url; + $self->url($url); } sub find_by_url { # repos_root and, path are optional my ($class, $full_url, $repos_root, $path) = @_; + $full_url = canonicalize_url($full_url); + return undef unless defined $full_url; remove_username($full_url); remove_username($repos_root) if defined $repos_root; @@ -393,6 +402,11 @@ sub find_by_url { # repos_root and, path are optional } $p =~ s#^\Q$z\E(?:/|$)#$prefix# or next; } + + # remote fetch paths are not URI escaped. Decode ours + # so they match + $p = uri_decode($p); + foreach my $f (keys %$fetch) { next if $f ne $p; return Git::SVN->new($fetch->{$f}, $repo_id, $f); @@ -435,20 +449,25 @@ sub new { } } my $self = _new($class, $repo_id, $ref_id, $path); - if (!defined $self->{path} || !length $self->{path}) { + if (!defined $self->path || !length $self->path) { my $fetch = command_oneline('config', '--get', "svn-remote.$repo_id.fetch", ":$ref_id\$") or die "Failed to read \"svn-remote.$repo_id.fetch\" ", "\":$ref_id\$\" in config\n"; - ($self->{path}, undef) = split(/\s*:\s*/, $fetch); + my($path) = split(/\s*:\s*/, $fetch); + $self->path($path); } - $self->{path} =~ s{/+}{/}g; - $self->{path} =~ s{\A/}{}; - $self->{path} =~ s{/\z}{}; - $self->{url} = command_oneline('config', '--get', - "svn-remote.$repo_id.url") or + { + my $path = $self->path; + $path =~ s{\A/}{}; + $path =~ s{/\z}{}; + $self->path($path); + } + my $url = command_oneline('config', '--get', + "svn-remote.$repo_id.url") or die "Failed to read \"svn-remote.$repo_id.url\" in config\n"; + $self->url($url); $self->{pushurl} = eval { command_oneline('config', '--get', "svn-remote.$repo_id.pushurl") }; $self->rebuild; @@ -552,8 +571,7 @@ sub _set_svm_vars { # username is of no interest $src =~ s{(^[a-z\+]*://)[^/@]*@}{$1}; - my $replace = $ra->{url}; - $replace .= "/$path" if length $path; + my $replace = add_path_to_url($ra->url, $path); my $section = "svn-remote.$self->{repo_id}"; tmp_config("$section.svm-source", $src); @@ -567,20 +585,21 @@ sub _set_svm_vars { } my $r = $ra->get_latest_revnum; - my $path = $self->{path}; + my $path = $self->path; my %tried; while (length $path) { - unless ($tried{"$self->{url}/$path"}) { + my $try = add_path_to_url($self->url, $path); + unless ($tried{$try}) { return $ra if $self->read_svm_props($ra, $path, $r); - $tried{"$self->{url}/$path"} = 1; + $tried{$try} = 1; } $path =~ s#/?[^/]+$##; } die "Path: '$path' should be ''\n" if $path ne ''; return $ra if $self->read_svm_props($ra, $path, $r); - $tried{"$self->{url}/$path"} = 1; + $tried{ add_path_to_url($self->url, $path) } = 1; - if ($ra->{repos_root} eq $self->{url}) { + if ($ra->{repos_root} eq $self->url) { die @err, (map { " $_\n" } keys %tried), "\n"; } @@ -590,20 +609,21 @@ sub _set_svm_vars { $path = $ra->{svn_path}; $ra = Git::SVN::Ra->new($ra->{repos_root}); while (length $path) { - unless ($tried{"$ra->{url}/$path"}) { + my $try = add_path_to_url($ra->url, $path); + unless ($tried{$try}) { $ok = $self->read_svm_props($ra, $path, $r); last if $ok; - $tried{"$ra->{url}/$path"} = 1; + $tried{$try} = 1; } $path =~ s#/?[^/]+$##; } die "Path: '$path' should be ''\n" if $path ne ''; $ok ||= $self->read_svm_props($ra, $path, $r); - $tried{"$ra->{url}/$path"} = 1; + $tried{ add_path_to_url($ra->url, $path) } = 1; if (!$ok) { die @err, (map { " $_\n" } keys %tried), "\n"; } - Git::SVN::Ra->new($self->{url}); + Git::SVN::Ra->new($self->url); } sub svnsync { @@ -670,7 +690,7 @@ sub ra_uuid { if (!$@ && $uuid && $uuid =~ /^([a-f\d\-]{30,})$/i) { $self->{ra_uuid} = $uuid; } else { - die "ra_uuid called without URL\n" unless $self->{url}; + die "ra_uuid called without URL\n" unless $self->url; $self->{ra_uuid} = $self->ra->get_uuid; tmp_config('--add', $key, $self->{ra_uuid}); } @@ -694,7 +714,7 @@ sub repos_root { sub ra { my ($self) = shift; - my $ra = Git::SVN::Ra->new($self->{url}); + my $ra = Git::SVN::Ra->new($self->url); $self->_set_repos_root($ra->{repos_root}); if ($self->use_svm_props && !$self->{svm}) { if ($self->no_metadata) { @@ -728,7 +748,7 @@ sub prop_walk { $path =~ s#^/*#/#g; my $p = $path; # Strip the irrelevant part of the path. - $p =~ s#^/+\Q$self->{path}\E(/|$)#/#; + $p =~ s#^/+\Q@{[$self->path]}\E(/|$)#/#; # Ensure the path is terminated by a `/'. $p =~ s#/*$#/#; @@ -749,7 +769,7 @@ sub prop_walk { foreach (sort keys %$dirent) { next if $dirent->{$_}->{kind} != $SVN::Node::dir; - $self->prop_walk($self->{path} . $p . $_, $rev, $sub); + $self->prop_walk($self->path . $p . $_, $rev, $sub); } } @@ -919,20 +939,19 @@ sub rewrite_uuid { sub metadata_url { my ($self) = @_; - ($self->rewrite_root || $self->{url}) . - (length $self->{path} ? '/' . $self->{path} : ''); + my $url = $self->rewrite_root || $self->url; + return canonicalize_url( add_path_to_url( $url, $self->path ) ); } sub full_url { my ($self) = @_; - $self->{url} . (length $self->{path} ? '/' . $self->{path} : ''); + return canonicalize_url( add_path_to_url( $self->url, $self->path ) ); } sub full_pushurl { my ($self) = @_; if ($self->{pushurl}) { - return $self->{pushurl} . (length $self->{path} ? '/' . - $self->{path} : ''); + return canonicalize_url( add_path_to_url( $self->{pushurl}, $self->path ) ); } else { return $self->full_url; } @@ -1048,20 +1067,20 @@ sub do_git_commit { sub match_paths { my ($self, $paths, $r) = @_; - return 1 if $self->{path} eq ''; - if (my $path = $paths->{"/$self->{path}"}) { + return 1 if $self->path eq ''; + if (my $path = $paths->{"/".$self->path}) { return ($path->{action} eq 'D') ? 0 : 1; } - $self->{path_regex} ||= qr/^\/\Q$self->{path}\E\//; + $self->{path_regex} ||= qr{^/\Q@{[$self->path]}\E/}; if (grep /$self->{path_regex}/, keys %$paths) { return 1; } my $c = ''; - foreach (split m#/#, $self->{path}) { + foreach (split m#/#, $self->path) { $c .= "/$_"; next unless ($paths->{$c} && ($paths->{$c}->{action} =~ /^[AR]$/)); - if ($self->ra->check_path($self->{path}, $r) == + if ($self->ra->check_path($self->path, $r) == $SVN::Node::dir) { return 1; } @@ -1075,14 +1094,14 @@ sub find_parent_branch { unless (defined $paths) { my $err_handler = $SVN::Error::handler; $SVN::Error::handler = \&Git::SVN::Ra::skip_unknown_revs; - $self->ra->get_log([$self->{path}], $rev, $rev, 0, 1, 1, + $self->ra->get_log([$self->path], $rev, $rev, 0, 1, 1, sub { $paths = $_[0] }); $SVN::Error::handler = $err_handler; } return undef unless defined $paths; # look for a parent from another branch: - my @b_path_components = split m#/#, $self->{path}; + my @b_path_components = split m#/#, $self->path; my @a_path_components; my $i; while (@b_path_components) { @@ -1099,8 +1118,8 @@ sub find_parent_branch { } my $r = $i->{copyfrom_rev}; my $repos_root = $self->ra->{repos_root}; - my $url = $self->ra->{url}; - my $new_url = $url . $branch_from; + my $url = $self->ra->url; + my $new_url = canonicalize_url( add_path_to_url( $url, $branch_from ) ); print STDERR "Found possible branch point: ", "$new_url => ", $self->full_url, ", $r\n" unless $::_q > 1; @@ -1114,7 +1133,7 @@ sub find_parent_branch { ($base, $head) = parse_revision_argument(0, $r); } else { if ($r0 < $r) { - $gs->ra->get_log([$gs->{path}], $r0 + 1, $r, 1, + $gs->ra->get_log([$gs->path], $r0 + 1, $r, 1, 0, 1, sub { $base = $_[1] - 1 }); } } @@ -1136,7 +1155,7 @@ sub find_parent_branch { # at the moment), so we can't rely on it $self->{last_rev} = $r0; $self->{last_commit} = $parent; - $ed = Git::SVN::Fetcher->new($self, $gs->{path}); + $ed = Git::SVN::Fetcher->new($self, $gs->path); $gs->ra->gs_do_switch($r0, $rev, $gs, $self->full_url, $ed) or die "SVN connection failed somewhere...\n"; @@ -1235,7 +1254,7 @@ sub mkemptydirs { close $fh; } - my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/; + my $strip = qr/\A\Q@{[$self->path]}\E(?:\/|$)/; foreach my $d (sort keys %empty_dirs) { $d = uri_decode($d); $d =~ s/$strip//; @@ -1429,12 +1448,11 @@ sub find_extra_svk_parents { for my $ticket ( @tickets ) { my ($uuid, $path, $rev) = split /:/, $ticket; if ( $uuid eq $self->ra_uuid ) { - my $url = $self->{url}; - my $repos_root = $url; + my $repos_root = $self->url; my $branch_from = $path; $branch_from =~ s{^/}{}; - my $gs = $self->other_gs($repos_root."/".$branch_from, - $url, + my $gs = $self->other_gs(add_path_to_url( $repos_root, $branch_from ), + $repos_root, $branch_from, $rev, $self->{ref_id}); @@ -1661,7 +1679,6 @@ sub parents_exclude { if ( $commit eq $excluded ) { push @excluded, $commit; $found++; - last; } else { push @new, $commit; @@ -1693,16 +1710,16 @@ sub find_extra_svn_parents { # are now marked as merge, we can add the tip as a parent. my @merges = split "\n", $mergeinfo; my @merge_tips; - my $url = $self->{url}; + my $url = $self->url; my $uuid = $self->ra_uuid; - my %ranges; + my @all_ranges; for my $merge ( @merges ) { my ($tip_commit, @ranges) = lookup_svn_merge( $uuid, $url, $merge ); unless (!$tip_commit or grep { $_ eq $tip_commit } @$parents ) { push @merge_tips, $tip_commit; - $ranges{$tip_commit} = \@ranges; + push @all_ranges, @ranges; } else { push @merge_tips, undef; } @@ -1717,8 +1734,6 @@ sub find_extra_svn_parents { my $spec = shift @merges; next unless $merge_tip and $excluded{$merge_tip}; - my $ranges = $ranges{$merge_tip}; - # check out 'new' tips my $merge_base; eval { @@ -1740,7 +1755,7 @@ sub find_extra_svn_parents { my (@incomplete) = check_cherry_pick( $merge_base, $merge_tip, $parents, - @$ranges, + @all_ranges, ); if ( @incomplete ) { @@ -1875,8 +1890,9 @@ sub make_log_entry { $email ||= "$author\@$uuid"; $commit_email ||= "$author\@$uuid"; } elsif ($self->use_svnsync_props) { - my $full_url = $self->svnsync->{url}; - $full_url .= "/$self->{path}" if length $self->{path}; + my $full_url = canonicalize_url( + add_path_to_url( $self->svnsync->{url}, $self->path ) + ); remove_username($full_url); my $uuid = $self->svnsync->{uuid}; $log_entry{metadata} = "$full_url\@$rev $uuid"; @@ -1923,7 +1939,7 @@ sub set_tree { tree_b => $tree, editor_cb => sub { $self->set_tree_cb($log_entry, $tree, @_) }, - svn_path => $self->{path} ); + svn_path => $self->path ); if (!Git::SVN::Editor->new(\%ed_opts)->apply_diff) { print "No changes\nr$self->{last_rev} = $tree\n"; } @@ -2299,10 +2315,39 @@ sub _new { $_[3] = $path = '' unless (defined $path); mkpath([$dir]); - bless { + my $obj = bless { ref_id => $ref_id, dir => $dir, index => "$dir/index", - path => $path, config => "$ENV{GIT_DIR}/svn/config", + config => "$ENV{GIT_DIR}/svn/config", map_root => "$dir/.rev_map", repo_id => $repo_id }, $class; + + # Ensure it gets canonicalized + $obj->path($path); + + return $obj; +} + +sub path { + my $self = shift; + + if (@_) { + my $path = shift; + $self->{_path} = canonicalize_path($path); + return; + } + + return $self->{_path}; +} + +sub url { + my $self = shift; + + if (@_) { + my $url = shift; + $self->{url} = canonicalize_url($url); + return; + } + + return $self->{url}; } # for read-only access of old .rev_db formats 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) = @_; diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm index 76fae9bce0..046a7a2f31 100644 --- a/perl/Git/SVN/Fetcher.pm +++ b/perl/Git/SVN/Fetcher.pm @@ -83,7 +83,7 @@ sub _mark_empty_symlinks { chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`); my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt); local $/ = "\0"; - my $pfx = defined($switch_path) ? $switch_path : $git_svn->{path}; + my $pfx = defined($switch_path) ? $switch_path : $git_svn->path; $pfx .= '/' if length($pfx); while (<$ls>) { chomp; diff --git a/perl/Git/SVN/GlobSpec.pm b/perl/Git/SVN/GlobSpec.pm index 96cfd9896e..c95f5d76ca 100644 --- a/perl/Git/SVN/GlobSpec.pm +++ b/perl/Git/SVN/GlobSpec.pm @@ -44,7 +44,9 @@ sub new { my $right = join('/', @right); $re = join('/', @patterns); $re = join('\/', - grep(length, quotemeta($left), "($re)", quotemeta($right))); + grep(length, quotemeta($left), + "($re)(?=/|\$)", + quotemeta($right))); my $left_re = qr/^\/\Q$left\E(\/|$)/; bless { left => $left, right => $right, left_regex => $left_re, regex => qr/$re/, glob => $glob, depth => $depth }, $class; diff --git a/perl/Git/SVN/Migration.pm b/perl/Git/SVN/Migration.pm index 75d74298ea..30daf35465 100644 --- a/perl/Git/SVN/Migration.pm +++ b/perl/Git/SVN/Migration.pm @@ -177,14 +177,14 @@ sub minimize_connections { my $ra = Git::SVN::Ra->new($url); # skip existing cases where we already connect to the root - if (($ra->{url} eq $ra->{repos_root}) || + if (($ra->url eq $ra->{repos_root}) || ($ra->{repos_root} eq $repo_id)) { - $root_repos->{$ra->{url}} = $repo_id; + $root_repos->{$ra->url} = $repo_id; next; } my $root_ra = Git::SVN::Ra->new($ra->{repos_root}); - my $root_path = $ra->{url}; + my $root_path = $ra->url; $root_path =~ s#^\Q$ra->{repos_root}\E(/|$)##; foreach my $path (keys %$fetch) { my $ref_id = $fetch->{$path}; diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm index 23ff43e86b..049c97bfaf 100644 --- a/perl/Git/SVN/Ra.pm +++ b/perl/Git/SVN/Ra.pm @@ -3,6 +3,12 @@ use vars qw/@ISA $config_dir $_ignore_refs_regex $_log_window_size/; use strict; use warnings; use SVN::Client; +use Git::SVN::Utils qw( + canonicalize_url + canonicalize_path + add_path_to_url +); + use SVN::Ra; BEGIN { @ISA = qw(SVN::Ra); @@ -62,29 +68,11 @@ sub _auth_providers () { \@rv; } -sub escape_uri_only { - my ($uri) = @_; - my @tmp; - foreach (split m{/}, $uri) { - s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg; - push @tmp, $_; - } - join('/', @tmp); -} - -sub escape_url { - my ($url) = @_; - if ($url =~ m#^(https?)://([^/]+)(.*)$#) { - my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3)); - $url = "$scheme://$domain$uri"; - } - $url; -} sub new { my ($class, $url) = @_; - $url =~ s!/+$!!; - return $RA if ($RA && $RA->{url} eq $url); + $url = canonicalize_url($url); + return $RA if ($RA && $RA->url eq $url); ::_req_svn(); @@ -115,17 +103,34 @@ sub new { $Git::SVN::Prompt::_no_auth_cache = 1; } } # no warnings 'once' - my $self = SVN::Ra->new(url => escape_url($url), auth => $baton, + + my $self = SVN::Ra->new(url => $url, auth => $baton, config => $config, pool => SVN::Pool->new, auth_provider_callbacks => $callbacks); - $self->{url} = $url; + $RA = bless $self, $class; + + # Make sure its canonicalized + $self->url($url); $self->{svn_path} = $url; $self->{repos_root} = $self->get_repos_root; $self->{svn_path} =~ s#^\Q$self->{repos_root}\E(/|$)##; $self->{cache} = { check_path => { r => 0, data => {} }, get_dir => { r => 0, data => {} } }; - $RA = bless $self, $class; + + return $RA; +} + +sub url { + my $self = shift; + + if (@_) { + my $url = shift; + $self->{url} = canonicalize_url($url); + return; + } + + return $self->{url}; } sub check_path { @@ -195,6 +200,7 @@ sub get_log { qw/copyfrom_path copyfrom_rev action/; if ($s{'copyfrom_path'}) { $s{'copyfrom_path'} =~ s/$prefix_regex//; + $s{'copyfrom_path'} = canonicalize_path($s{'copyfrom_path'}); } $_[0]{$p} = \%s; } @@ -246,7 +252,7 @@ sub get_commit_editor { sub gs_do_update { my ($self, $rev_a, $rev_b, $gs, $editor) = @_; my $new = ($rev_a == $rev_b); - my $path = $gs->{path}; + my $path = $gs->path; if ($new && -e $gs->{index}) { unlink $gs->{index} or die @@ -282,30 +288,33 @@ sub gs_do_update { # svn_ra_reparent didn't work before 1.4) sub gs_do_switch { my ($self, $rev_a, $rev_b, $gs, $url_b, $editor) = @_; - my $path = $gs->{path}; + my $path = $gs->path; my $pool = SVN::Pool->new; - my $full_url = $self->{url}; - my $old_url = $full_url; - $full_url .= '/' . $path if length $path; + my $old_url = $self->url; + my $full_url = add_path_to_url( $self->url, $path ); my ($ra, $reparented); if ($old_url =~ m#^svn(\+ssh)?://# || ($full_url =~ m#^https?://# && - escape_url($full_url) ne $full_url)) { + canonicalize_url($full_url) ne $full_url)) { $_[0] = undef; $self = undef; $RA = undef; $ra = Git::SVN::Ra->new($full_url); $ra_invalid = 1; } elsif ($old_url ne $full_url) { - SVN::_Ra::svn_ra_reparent($self->{session}, $full_url, $pool); - $self->{url} = $full_url; + SVN::_Ra::svn_ra_reparent( + $self->{session}, + canonicalize_url($full_url), + $pool + ); + $self->url($full_url); $reparented = 1; } $ra ||= $self; - $url_b = escape_url($url_b); + $url_b = canonicalize_url($url_b); my $reporter = $ra->do_switch($rev_b, '', 1, $url_b, $editor, $pool); my @lock = (::compare_svn_version('1.2.0') >= 0) ? (undef) : (); $reporter->set_path('', $rev_a, 0, @lock, $pool); @@ -313,7 +322,7 @@ sub gs_do_switch { if ($reparented) { SVN::_Ra::svn_ra_reparent($self->{session}, $old_url, $pool); - $self->{url} = $old_url; + $self->url($old_url); } $pool->clear; @@ -326,7 +335,7 @@ sub longest_common_path { my $common_max = scalar @$gsv; foreach my $gs (@$gsv) { - my @tmp = split m#/#, $gs->{path}; + my @tmp = split m#/#, $gs->path; my $p = ''; foreach (@tmp) { $p .= length($p) ? "/$_" : $_; @@ -362,7 +371,7 @@ sub gs_fetch_loop_common { my $inc = $_log_window_size; my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc); my $longest_path = longest_common_path($gsv, $globs); - my $ra_url = $self->{url}; + my $ra_url = $self->url; my $find_trailing_edge; while (1) { my %revs; @@ -407,7 +416,7 @@ sub gs_fetch_loop_common { } $SVN::Error::handler = $err_handler; - my %exists = map { $_->{path} => $_ } @$gsv; + my %exists = map { $_->path => $_ } @$gsv; foreach my $r (sort {$a <=> $b} keys %revs) { my ($paths, $logged) = @{$revs{$r}}; @@ -508,7 +517,7 @@ sub match_globs { ($self->check_path($p, $r) != $SVN::Node::dir)); next unless $p =~ /$g->{path}->{regex}/; - $exists->{$p} = Git::SVN->init($self->{url}, $p, undef, + $exists->{$p} = Git::SVN->init($self->url, $p, undef, $g->{ref}->full_path($de), 1); } } @@ -532,7 +541,7 @@ sub match_globs { next if ($self->check_path($pathname, $r) != $SVN::Node::dir); $exists->{$pathname} = Git::SVN->init( - $self->{url}, $pathname, undef, + $self->url, $pathname, undef, $g->{ref}->full_path($p), 1); } my $c = ''; @@ -548,19 +557,20 @@ sub match_globs { sub minimize_url { my ($self) = @_; - return $self->{url} if ($self->{url} eq $self->{repos_root}); + return $self->url if ($self->url eq $self->{repos_root}); my $url = $self->{repos_root}; my @components = split(m!/!, $self->{svn_path}); my $c = ''; do { - $url .= "/$c" if length $c; + $url = add_path_to_url($url, $c); eval { my $ra = (ref $self)->new($url); my $latest = $ra->get_latest_revnum; $ra->get_log("", $latest, 0, 1, 0, 1, sub {}); }; } while ($@ && ($c = shift @components)); - $url; + + return canonicalize_url($url); } sub can_do_switch { @@ -568,7 +578,7 @@ sub can_do_switch { unless (defined $can_do_switch) { my $pool = SVN::Pool->new; my $rep = eval { - $self->do_switch(1, '', 0, $self->{url}, + $self->do_switch(1, '', 0, $self->url, SVN::Delta::Editor->new, $pool); }; if ($@) { diff --git a/perl/Git/SVN/Utils.pm b/perl/Git/SVN/Utils.pm index 496006bc7b..8b8cf3755c 100644 --- a/perl/Git/SVN/Utils.pm +++ b/perl/Git/SVN/Utils.pm @@ -3,9 +3,18 @@ package Git::SVN::Utils; use strict; use warnings; +use SVN::Core; + use base qw(Exporter); -our @EXPORT_OK = qw(fatal can_compress); +our @EXPORT_OK = qw( + fatal + can_compress + canonicalize_path + canonicalize_url + join_paths + add_path_to_url +); =head1 NAME @@ -56,4 +65,168 @@ sub can_compress { } +=head3 canonicalize_path + + my $canoncalized_path = canonicalize_path($path); + +Converts $path into a canonical form which is safe to pass to the SVN +API as a file path. + +=cut + +# Turn foo/../bar into bar +sub _collapse_dotdot { + my $path = shift; + + 1 while $path =~ s{/[^/]+/+\.\.}{}; + 1 while $path =~ s{[^/]+/+\.\./}{}; + 1 while $path =~ s{[^/]+/+\.\.}{}; + + return $path; +} + + +sub canonicalize_path { + my $path = shift; + my $rv; + + # The 1.7 way to do it + if ( defined &SVN::_Core::svn_dirent_canonicalize ) { + $path = _collapse_dotdot($path); + $rv = SVN::_Core::svn_dirent_canonicalize($path); + } + # The 1.6 way to do it + # This can return undef on subversion-perl-1.4.2-2.el5 (CentOS 5.2) + elsif ( defined &SVN::_Core::svn_path_canonicalize ) { + $path = _collapse_dotdot($path); + $rv = SVN::_Core::svn_path_canonicalize($path); + } + + return $rv if defined $rv; + + # No SVN API canonicalization is available, or the SVN API + # didn't return a successful result, do it ourselves + return _canonicalize_path_ourselves($path); +} + + +sub _canonicalize_path_ourselves { + my ($path) = @_; + my $dot_slash_added = 0; + if (substr($path, 0, 1) ne "/") { + $path = "./" . $path; + $dot_slash_added = 1; + } + $path =~ s#/+#/#g; + $path =~ s#/\.(?:/|$)#/#g; + $path = _collapse_dotdot($path); + $path =~ s#/$##g; + $path =~ s#^\./## if $dot_slash_added; + $path =~ s#^\.$##; + return $path; +} + + +=head3 canonicalize_url + + my $canonicalized_url = canonicalize_url($url); + +Converts $url into a canonical form which is safe to pass to the SVN +API as a URL. + +=cut + +sub canonicalize_url { + my $url = shift; + + # The 1.7 way to do it + if ( defined &SVN::_Core::svn_uri_canonicalize ) { + return SVN::_Core::svn_uri_canonicalize($url); + } + # There wasn't a 1.6 way to do it, so we do it ourself. + else { + return _canonicalize_url_ourselves($url); + } +} + + +sub _canonicalize_url_path { + my ($uri_path) = @_; + + my @parts; + foreach my $part (split m{/+}, $uri_path) { + $part =~ s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg; + push @parts, $part; + } + + return join('/', @parts); +} + +sub _canonicalize_url_ourselves { + my ($url) = @_; + if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) { + my ($scheme, $domain, $uri) = ($1, $2, _canonicalize_url_path(canonicalize_path($3))); + $url = "$scheme://$domain$uri"; + } + $url; +} + + +=head3 join_paths + + my $new_path = join_paths(@paths); + +Appends @paths together into a single path. Any empty paths are ignored. + +=cut + +sub join_paths { + my @paths = @_; + + @paths = grep { defined $_ && length $_ } @paths; + + return '' unless @paths; + return $paths[0] if @paths == 1; + + my $new_path = shift @paths; + $new_path =~ s{/+$}{}; + + my $last_path = pop @paths; + $last_path =~ s{^/+}{}; + + for my $path (@paths) { + $path =~ s{^/+}{}; + $path =~ s{/+$}{}; + $new_path .= "/$path"; + } + + return $new_path .= "/$last_path"; +} + + +=head3 add_path_to_url + + my $new_url = add_path_to_url($url, $path); + +Appends $path onto the $url. If $path is empty, $url is returned unchanged. + +=cut + +sub add_path_to_url { + my($url, $path) = @_; + + return $url if !defined $path or !length $path; + + # Strip trailing and leading slashes so we don't + # wind up with http://x.com///path + $url =~ s{/+$}{}; + $path =~ s{^/+}{}; + + # If a path has a % in it, URI escape it so it's not + # mistaken for a URI escape later. + $path =~ s{%}{%25}g; + + return join '/', $url, $path; +} + 1; @@ -33,8 +33,9 @@ Repository: https://github.com/nafmo/git-l10n-sv/ Leader: Peter Krefting <peter@softwolves.pp.se> Language: vi (Vietnamese) -Repository: https://github.com/vnwildman/git.git +Repository: https://github.com/vnwildman/git/ Leader: Trần Ngá»c Quân <vnwildman AT gmail.com> +Members: Nguyá»…n Thái Ngá»c Duy <pclouds AT gmail.com> Language: zh_CN (Simplified Chinese) Repository: https://github.com/gotgit/git-po-zh_CN/ @@ -7,7 +7,7 @@ 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-08-06 23:47+0800\n" +"POT-Creation-Date: 2012-09-05 06:20+0800\n" "PO-Revision-Date: 2012-03-28 18:46+0200\n" "Last-Translator: Ralf Thielow <ralf.thielow@googlemail.com>\n" "Language-Team: German\n" @@ -55,10 +55,10 @@ 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:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347 +#: 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" msgstr "Einrichtung des Revisionsgangs fehlgeschlagen" @@ -85,7 +85,7 @@ msgstr[1] "Das Paket benötigt diese %d Referenzen" msgid "rev-list died" msgstr "\"rev-list\" abgebrochen" -#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284 +#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284 #, c-format msgid "unrecognized argument: %s" msgstr "nicht erkanntes Argument: %s" @@ -231,32 +231,32 @@ msgstr "" "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n" "%s" -#: diff.c:1400 +#: diff.c:1401 msgid " 0 files changed" msgstr " 0 Dateien geändert" -#: diff.c:1404 +#: diff.c:1405 #, c-format msgid " %d file changed" msgid_plural " %d files changed" msgstr[0] " %d Datei geändert" msgstr[1] " %d Dateien geändert" -#: diff.c:1421 +#: diff.c:1422 #, c-format msgid ", %d insertion(+)" msgid_plural ", %d insertions(+)" msgstr[0] ", %d Zeile hinzugefügt(+)" msgstr[1] ", %d Zeilen hinzugefügt(+)" -#: diff.c:1432 +#: diff.c:1433 #, c-format msgid ", %d deletion(-)" msgid_plural ", %d deletions(-)" msgstr[0] ", %d Zeile entfernt(-)" msgstr[1] ", %d Zeilen entfernt(-)" -#: diff.c:3461 +#: diff.c:3460 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -361,74 +361,66 @@ msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen" msgid "error building trees" msgstr "Fehler beim Erstellen der Bäume" -#: merge-recursive.c:497 -msgid "diff setup failed" -msgstr "diff_setup_done fehlgeschlagen" - -#: merge-recursive.c:627 -msgid "merge-recursive: disk full?" -msgstr "merge-recursive: Festplatte voll?" - -#: merge-recursive.c:690 +#: merge-recursive.c:672 #, c-format msgid "failed to create path '%s'%s" msgstr "Fehler beim Erstellen des Pfades '%s'%s" -#: merge-recursive.c:701 +#: merge-recursive.c:683 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "Entferne %s um Platz für Unterverzeichnis zu schaffen\n" #. something else exists #. .. but not some other error (who really cares what?) -#: merge-recursive.c:715 merge-recursive.c:736 +#: merge-recursive.c:697 merge-recursive.c:718 msgid ": perhaps a D/F conflict?" msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?" -#: merge-recursive.c:726 +#: merge-recursive.c:708 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "verweigere, da unbeobachtete Dateien in '%s' verloren gehen würden" -#: merge-recursive.c:766 +#: merge-recursive.c:748 #, c-format msgid "cannot read object %s '%s'" msgstr "kann Objekt %s '%s' nicht lesen" -#: merge-recursive.c:768 +#: merge-recursive.c:750 #, c-format msgid "blob expected for %s '%s'" msgstr "Blob erwartet für %s '%s'" -#: merge-recursive.c:791 builtin/clone.c:302 +#: merge-recursive.c:773 builtin/clone.c:302 #, c-format msgid "failed to open '%s'" msgstr "Fehler beim Öffnen von '%s'" -#: merge-recursive.c:799 +#: merge-recursive.c:781 #, c-format msgid "failed to symlink '%s'" msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'" -#: merge-recursive.c:802 +#: merge-recursive.c:784 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "weiß nicht was mit %06o %s '%s' zu machen ist" -#: merge-recursive.c:939 +#: merge-recursive.c:921 msgid "Failed to execute internal merge" msgstr "Fehler bei Ausführung der internen Zusammenführung" -#: merge-recursive.c:943 +#: merge-recursive.c:925 #, c-format msgid "Unable to add %s to database" msgstr "Konnte %s nicht zur Datenbank hinzufügen" -#: merge-recursive.c:959 +#: merge-recursive.c:941 msgid "unsupported object type in the tree" msgstr "nicht unterstützter Objekttyp im Baum" -#: merge-recursive.c:1038 merge-recursive.c:1052 +#: merge-recursive.c:1020 merge-recursive.c:1034 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -437,7 +429,7 @@ msgstr "" "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde " "im Arbeitsbereich gelassen." -#: merge-recursive.c:1044 merge-recursive.c:1057 +#: merge-recursive.c:1026 merge-recursive.c:1039 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -446,20 +438,20 @@ msgstr "" "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde " "im Arbeitsbereich bei %s gelassen." -#: merge-recursive.c:1098 +#: merge-recursive.c:1080 msgid "rename" msgstr "umbenennen" -#: merge-recursive.c:1098 +#: merge-recursive.c:1080 msgid "renamed" msgstr "umbenannt" -#: merge-recursive.c:1154 +#: merge-recursive.c:1136 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu" -#: merge-recursive.c:1176 +#: merge-recursive.c:1158 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -468,148 +460,148 @@ msgstr "" "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Zweig \"%s\" " "und \"%s\"->\"%s\" in Zweig \"%s\"%s" -#: merge-recursive.c:1181 +#: merge-recursive.c:1163 msgid " (left unresolved)" msgstr " (bleibt unaufgelöst)" -#: merge-recursive.c:1235 +#: merge-recursive.c:1217 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" "KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s " "in %s" -#: merge-recursive.c:1265 +#: merge-recursive.c:1247 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "Benenne stattdessen %s nach %s und %s nach %s um" -#: merge-recursive.c:1464 +#: merge-recursive.c:1446 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "" "KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in " "%s" -#: merge-recursive.c:1474 +#: merge-recursive.c:1456 #, c-format msgid "Adding merged %s" msgstr "Füge zusammengeführte Datei %s hinzu" -#: merge-recursive.c:1479 merge-recursive.c:1677 +#: merge-recursive.c:1461 merge-recursive.c:1659 #, c-format msgid "Adding as %s instead" msgstr "Füge stattdessen als %s hinzu" -#: merge-recursive.c:1530 +#: merge-recursive.c:1512 #, c-format msgid "cannot read object %s" msgstr "kann Objekt %s nicht lesen" -#: merge-recursive.c:1533 +#: merge-recursive.c:1515 #, c-format msgid "object %s is not a blob" msgstr "Objekt %s ist kein Blob" -#: merge-recursive.c:1581 +#: merge-recursive.c:1563 msgid "modify" msgstr "ändern" -#: merge-recursive.c:1581 +#: merge-recursive.c:1563 msgid "modified" msgstr "geändert" -#: merge-recursive.c:1591 +#: merge-recursive.c:1573 msgid "content" msgstr "Inhalt" -#: merge-recursive.c:1598 +#: merge-recursive.c:1580 msgid "add/add" msgstr "hinzufügen/hinzufügen" -#: merge-recursive.c:1632 +#: merge-recursive.c:1614 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "%s ausgelassen (Ergebnis der Zusammenführung existiert bereits)" -#: merge-recursive.c:1646 +#: merge-recursive.c:1628 #, c-format msgid "Auto-merging %s" msgstr "automatische Zusammenführung von %s" -#: merge-recursive.c:1650 git-submodule.sh:844 +#: merge-recursive.c:1632 git-submodule.sh:869 msgid "submodule" msgstr "Unterprojekt" -#: merge-recursive.c:1651 +#: merge-recursive.c:1633 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "KONFLIKT (%s): Zusammenführungskonflikt in %s" -#: merge-recursive.c:1741 +#: merge-recursive.c:1723 #, c-format msgid "Removing %s" msgstr "Entferne %s" -#: merge-recursive.c:1766 +#: merge-recursive.c:1748 msgid "file/directory" msgstr "Datei/Verzeichnis" -#: merge-recursive.c:1772 +#: merge-recursive.c:1754 msgid "directory/file" msgstr "Verzeichnis/Datei" -#: merge-recursive.c:1777 +#: merge-recursive.c:1759 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "" "KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s " "hinzu." -#: merge-recursive.c:1787 +#: merge-recursive.c:1769 #, c-format msgid "Adding %s" msgstr "Füge %s hinzu" -#: merge-recursive.c:1804 +#: merge-recursive.c:1786 msgid "Fatal merge failure, shouldn't happen." msgstr "Fataler Fehler bei der Zusammenführung. Sollte nicht passieren." -#: merge-recursive.c:1823 +#: merge-recursive.c:1805 msgid "Already up-to-date!" msgstr "Bereits aktuell!" -#: merge-recursive.c:1832 +#: merge-recursive.c:1814 #, c-format msgid "merging of trees %s and %s failed" msgstr "Zusammenführen der Bäume %s und %s fehlgeschlagen" -#: merge-recursive.c:1862 +#: merge-recursive.c:1844 #, c-format msgid "Unprocessed path??? %s" msgstr "unverarbeiteter Pfad??? %s" -#: merge-recursive.c:1907 +#: merge-recursive.c:1889 msgid "Merging:" msgstr "Zusammenführung:" -#: merge-recursive.c:1920 +#: merge-recursive.c:1902 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "%u gemeinsamen Vorfahren gefunden" msgstr[1] "%u gemeinsame Vorfahren gefunden" -#: merge-recursive.c:1957 +#: merge-recursive.c:1939 msgid "merge returned no commit" msgstr "Zusammenführung hat keine Version zurückgegeben" -#: merge-recursive.c:2014 +#: merge-recursive.c:1996 #, c-format msgid "Could not parse object '%s'" msgstr "Konnte Objekt '%s' nicht parsen." -#: merge-recursive.c:2026 builtin/merge.c:697 +#: merge-recursive.c:2008 builtin/merge.c:696 msgid "Unable to write index." msgstr "Konnte Bereitstellung nicht schreiben." @@ -667,14 +659,14 @@ msgstr[1] "" "Dein Zweig und '%s' sind divergiert,\n" "und haben jeweils %d und %d unterschiedliche Versionen.\n" -#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 -#: builtin/merge.c:1088 builtin/merge.c:1098 +#: sequencer.c:121 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 "Konnte '%s' nicht zum Schreiben öffnen." -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 -#: builtin/merge.c:1090 builtin/merge.c:1103 +#: sequencer.c:123 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 "Konnte nicht nach '%s' schreiben." @@ -880,7 +872,7 @@ msgstr "kann Zweigspitze (HEAD) nicht auflösen" msgid "cannot abort from a branch yet to be born" msgstr "kann nicht abbrechen: bin auf einem Zweig, der noch geboren wird" -#: sequencer.c:805 builtin/apply.c:3988 +#: sequencer.c:805 builtin/apply.c:3987 #, c-format msgid "cannot open %s: %s" msgstr "Kann %s nicht öffnen: %s" @@ -1293,6 +1285,11 @@ msgstr "voraus " msgid ", behind " msgstr ", hinterher " +#: compat/precompose_utf8.c:58 builtin/clone.c:341 +#, c-format +msgid "failed to unlink '%s'" +msgstr "Konnte '%s' nicht entfernen" + #: builtin/add.c:62 #, c-format msgid "unexpected diff status %c" @@ -1397,7 +1394,7 @@ msgstr "Wolltest du vielleicht 'git add .' sagen?\n" msgid "index file corrupt" msgstr "Bereitstellungsdatei beschädigt" -#: builtin/add.c:480 builtin/apply.c:4433 builtin/mv.c:229 builtin/rm.c:260 +#: builtin/add.c:480 builtin/apply.c:4432 builtin/mv.c:229 builtin/rm.c:260 msgid "Unable to write new index file" msgstr "Konnte neue Bereitstellungsdatei nicht schreiben." @@ -1415,56 +1412,56 @@ msgstr "nicht erkannte Option für Leerzeichen: '%s'" msgid "unrecognized whitespace ignore option '%s'" msgstr "nicht erkannte Option zum Ignorieren von Leerzeichen: '%s'" -#: builtin/apply.c:824 +#: builtin/apply.c:823 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten" -#: builtin/apply.c:833 +#: builtin/apply.c:832 #, c-format msgid "regexec returned %d for input: %s" msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s" -#: builtin/apply.c:914 +#: builtin/apply.c:913 #, c-format msgid "unable to find filename in patch at line %d" msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden." -#: builtin/apply.c:946 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "" "git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile " "%d" -#: builtin/apply.c:950 +#: builtin/apply.c:949 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "" "git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d" -#: builtin/apply.c:951 +#: builtin/apply.c:950 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "" "git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d" -#: builtin/apply.c:958 +#: builtin/apply.c:957 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d" -#: builtin/apply.c:1403 +#: builtin/apply.c:1402 #, c-format msgid "recount: unexpected line: %.*s" msgstr "recount: unerwartete Zeile: %.*s" -#: builtin/apply.c:1460 +#: builtin/apply.c:1459 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s" -#: builtin/apply.c:1477 +#: builtin/apply.c:1476 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -1479,70 +1476,70 @@ msgstr[1] "" "Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn " "%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)" -#: builtin/apply.c:1637 +#: builtin/apply.c:1636 msgid "new file depends on old contents" msgstr "neue Datei hängt von alten Inhalten ab" -#: builtin/apply.c:1639 +#: builtin/apply.c:1638 msgid "deleted file still has contents" msgstr "entfernte Datei hat noch Inhalte" -#: builtin/apply.c:1665 +#: builtin/apply.c:1664 #, c-format msgid "corrupt patch at line %d" msgstr "fehlerhafter Patch bei Zeile %d" -#: builtin/apply.c:1701 +#: builtin/apply.c:1700 #, c-format msgid "new file %s depends on old contents" msgstr "neue Datei %s hängt von alten Inhalten ab" -#: builtin/apply.c:1703 +#: builtin/apply.c:1702 #, c-format msgid "deleted file %s still has contents" msgstr "entfernte Datei %s hat noch Inhalte" -#: builtin/apply.c:1706 +#: builtin/apply.c:1705 #, c-format msgid "** warning: file %s becomes empty but is not deleted" msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt." -#: builtin/apply.c:1852 +#: builtin/apply.c:1851 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s" #. there has to be one hunk (forward hunk) -#: builtin/apply.c:1881 +#: builtin/apply.c:1880 #, c-format msgid "unrecognized binary patch at line %d" msgstr "nicht erkannter Binär-Patch bei Zeile %d" -#: builtin/apply.c:1967 +#: builtin/apply.c:1966 #, c-format msgid "patch with only garbage at line %d" msgstr "Patch mit nutzlosen Informationen bei Zeile %d" -#: builtin/apply.c:2057 +#: builtin/apply.c:2056 #, c-format msgid "unable to read symlink %s" msgstr "konnte symbolische Verknüpfung %s nicht lesen" -#: builtin/apply.c:2061 +#: builtin/apply.c:2060 #, c-format msgid "unable to open or read %s" msgstr "konnte %s nicht öffnen oder lesen" -#: builtin/apply.c:2132 +#: builtin/apply.c:2131 msgid "oops" msgstr "Ups" -#: builtin/apply.c:2654 +#: builtin/apply.c:2653 #, c-format msgid "invalid start of line: '%c'" msgstr "Ungültiger Zeilenanfang: '%c'" -#: builtin/apply.c:2772 +#: builtin/apply.c:2771 #, c-format msgid "Hunk #%d succeeded at %d (offset %d line)." msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." @@ -1550,12 +1547,12 @@ msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)" msgstr[1] "" "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)" -#: builtin/apply.c:2784 +#: builtin/apply.c:2783 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "Kontext reduziert zu (%ld/%ld) um Patch-Bereich bei %d anzuwenden" -#: builtin/apply.c:2790 +#: builtin/apply.c:2789 #, c-format msgid "" "while searching for:\n" @@ -1564,339 +1561,339 @@ msgstr "" "bei der Suche nach:\n" "%.*s" -#: builtin/apply.c:2809 +#: builtin/apply.c:2808 #, c-format msgid "missing binary patch data for '%s'" msgstr "keine Daten in Binär-Patch für '%s'" -#: builtin/apply.c:2912 +#: builtin/apply.c:2911 #, c-format msgid "binary patch does not apply to '%s'" msgstr "Konnte Binär-Patch nicht auf '%s' anwenden" -#: builtin/apply.c:2918 +#: builtin/apply.c:2917 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" msgstr "" "Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)" -#: builtin/apply.c:2939 +#: builtin/apply.c:2938 #, c-format msgid "patch failed: %s:%ld" msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld" -#: builtin/apply.c:3061 +#: builtin/apply.c:3060 #, c-format msgid "cannot checkout %s" msgstr "kann %s nicht auschecken" -#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159 +#: builtin/apply.c:3105 builtin/apply.c:3114 builtin/apply.c:3158 #, c-format msgid "read of %s failed" msgstr "Konnte %s nicht lesen" -#: builtin/apply.c:3139 builtin/apply.c:3361 +#: builtin/apply.c:3138 builtin/apply.c:3360 #, c-format msgid "path %s has been renamed/deleted" msgstr "Pfad %s wurde umbenannt/gelöscht" -#: builtin/apply.c:3220 builtin/apply.c:3375 +#: builtin/apply.c:3219 builtin/apply.c:3374 #, c-format msgid "%s: does not exist in index" msgstr "%s ist nicht bereitgestellt" -#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389 +#: builtin/apply.c:3223 builtin/apply.c:3366 builtin/apply.c:3388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: builtin/apply.c:3229 builtin/apply.c:3383 +#: builtin/apply.c:3228 builtin/apply.c:3382 #, c-format msgid "%s: does not match index" msgstr "%s entspricht nicht der Bereitstellung" -#: builtin/apply.c:3331 +#: builtin/apply.c:3330 msgid "removal patch leaves file contents" msgstr "Lösch-Patch hinterlässt Dateiinhalte" -#: builtin/apply.c:3400 +#: builtin/apply.c:3399 #, c-format msgid "%s: wrong type" msgstr "%s: falscher Typ" -#: builtin/apply.c:3402 +#: builtin/apply.c:3401 #, c-format msgid "%s has type %o, expected %o" msgstr "%s ist vom Typ %o, erwartete %o" -#: builtin/apply.c:3503 +#: builtin/apply.c:3502 #, c-format msgid "%s: already exists in index" msgstr "%s ist bereits bereitgestellt" -#: builtin/apply.c:3506 +#: builtin/apply.c:3505 #, c-format msgid "%s: already exists in working directory" msgstr "%s existiert bereits im Arbeitsverzeichnis" -#: builtin/apply.c:3526 +#: builtin/apply.c:3525 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)" -#: builtin/apply.c:3531 +#: builtin/apply.c:3530 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s" -#: builtin/apply.c:3539 +#: builtin/apply.c:3538 #, c-format msgid "%s: patch does not apply" msgstr "%s: Patch konnte nicht angewendet werden" -#: builtin/apply.c:3552 +#: builtin/apply.c:3551 #, c-format msgid "Checking patch %s..." msgstr "Prüfe Patch %s..." -#: builtin/apply.c:3607 builtin/checkout.c:213 builtin/reset.c:158 +#: builtin/apply.c:3606 builtin/checkout.c:213 builtin/reset.c:158 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen" -#: builtin/apply.c:3750 +#: builtin/apply.c:3749 #, c-format msgid "unable to remove %s from index" msgstr "konnte %s nicht aus der Bereitstellung entfernen" -#: builtin/apply.c:3778 +#: builtin/apply.c:3777 #, c-format msgid "corrupt patch for subproject %s" msgstr "fehlerhafter Patch für Unterprojekt %s" -#: builtin/apply.c:3782 +#: builtin/apply.c:3781 #, c-format msgid "unable to stat newly created file '%s'" msgstr "konnte neu erstellte Datei '%s' nicht lesen" -#: builtin/apply.c:3787 +#: builtin/apply.c:3786 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen" -#: builtin/apply.c:3790 builtin/apply.c:3898 +#: builtin/apply.c:3789 builtin/apply.c:3897 #, c-format msgid "unable to add cache entry for %s" msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen" -#: builtin/apply.c:3823 +#: builtin/apply.c:3822 #, c-format msgid "closing file '%s'" msgstr "schließe Datei '%s'" -#: builtin/apply.c:3872 +#: builtin/apply.c:3871 #, c-format msgid "unable to write file '%s' mode %o" msgstr "konnte Datei '%s' mit Modus %o nicht schreiben" -#: builtin/apply.c:3959 +#: builtin/apply.c:3958 #, c-format msgid "Applied patch %s cleanly." msgstr "Patch %s sauber angewendet" -#: builtin/apply.c:3967 +#: builtin/apply.c:3966 msgid "internal error" msgstr "interner Fehler" #. Say this even without --verbose -#: builtin/apply.c:3970 +#: builtin/apply.c:3969 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..." msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..." -#: builtin/apply.c:3980 +#: builtin/apply.c:3979 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "Verkürze Name von .rej Datei zu %.*s.rej" -#: builtin/apply.c:4001 +#: builtin/apply.c:4000 #, c-format msgid "Hunk #%d applied cleanly." msgstr "Patch-Bereich #%d sauber angewendet." -#: builtin/apply.c:4004 +#: builtin/apply.c:4003 #, c-format msgid "Rejected hunk #%d." msgstr "Patch-Bereich #%d zurückgewiesen." -#: builtin/apply.c:4154 +#: builtin/apply.c:4153 msgid "unrecognized input" msgstr "nicht erkannte Eingabe" -#: builtin/apply.c:4165 +#: builtin/apply.c:4164 msgid "unable to read index file" msgstr "Konnte Bereitstellungsdatei nicht lesen" -#: builtin/apply.c:4284 builtin/apply.c:4287 +#: builtin/apply.c:4283 builtin/apply.c:4286 msgid "path" msgstr "Pfad" -#: builtin/apply.c:4285 +#: builtin/apply.c:4284 msgid "don't apply changes matching the given path" msgstr "wendet keine Änderungen im angegebenen Pfad an" -#: builtin/apply.c:4288 +#: builtin/apply.c:4287 msgid "apply changes matching the given path" msgstr "wendet Änderungen nur im angegebenen Pfad an" -#: builtin/apply.c:4290 +#: builtin/apply.c:4289 msgid "num" msgstr "Anzahl" -#: builtin/apply.c:4291 +#: 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:4294 +#: builtin/apply.c:4293 msgid "ignore additions made by the patch" msgstr "ignoriert hinzugefügte Zeilen des Patches" -#: builtin/apply.c:4296 +#: builtin/apply.c:4295 msgid "instead of applying the patch, output diffstat for the input" msgstr "" "anstatt der Anwendung des Patches, wird der \"diffstat\" für die Eingabe " "ausgegeben" -#: builtin/apply.c:4300 +#: builtin/apply.c:4299 msgid "shows number of added and deleted lines in decimal notation" msgstr "" "zeigt die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation" -#: builtin/apply.c:4302 +#: builtin/apply.c:4301 msgid "instead of applying the patch, output a summary for the input" msgstr "" "anstatt der Anwendung des Patches, wird eine Zusammenfassung für die Eingabe " "ausgegeben" -#: builtin/apply.c:4304 +#: builtin/apply.c:4303 msgid "instead of applying the patch, see if the patch is applicable" msgstr "" "anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann" -#: builtin/apply.c:4306 +#: builtin/apply.c:4305 msgid "make sure the patch is applicable to the current index" msgstr "" "stellt sicher, dass der Patch in der aktuellen Bereitstellung angewendet " "werden kann" -#: builtin/apply.c:4308 +#: builtin/apply.c:4307 msgid "apply a patch without touching the working tree" msgstr "wendet einen Patch an, ohne Änderungen im Arbeitszweig vorzunehmen" -#: builtin/apply.c:4310 +#: builtin/apply.c:4309 msgid "also apply the patch (use with --stat/--summary/--check)" msgstr "wendet den Patch an (Benutzung mit --stat/--summary/--check)" -#: builtin/apply.c:4312 +#: builtin/apply.c:4311 msgid "attempt three-way merge if a patch does not apply" msgstr "" "versucht 3-Wege-Zusammenführung, wenn der Patch nicht angewendet werden " "konnte" -#: builtin/apply.c:4314 +#: builtin/apply.c:4313 msgid "build a temporary index based on embedded index information" msgstr "" "erstellt eine temporäre Bereitstellung basierend auf den integrierten " "Bereitstellungsinformationen" -#: builtin/apply.c:4316 +#: builtin/apply.c:4315 msgid "paths are separated with NUL character" msgstr "Pfade sind getrennt durch NUL Zeichen" -#: builtin/apply.c:4319 +#: builtin/apply.c:4318 msgid "ensure at least <n> lines of context match" msgstr "" "stellt sicher, dass mindestens <Anzahl> Zeilen des Kontextes übereinstimmen" -#: builtin/apply.c:4320 +#: builtin/apply.c:4319 msgid "action" msgstr "Aktion" -#: builtin/apply.c:4321 +#: builtin/apply.c:4320 msgid "detect new or modified lines that have whitespace errors" msgstr "ermittelt neue oder geänderte Zeilen die Fehler in Leerzeichen haben" -#: builtin/apply.c:4324 builtin/apply.c:4327 +#: builtin/apply.c:4323 builtin/apply.c:4326 msgid "ignore changes in whitespace when finding context" msgstr "ignoriert Änderungen in Leerzeichen bei der Suche des Kontextes" -#: builtin/apply.c:4330 +#: builtin/apply.c:4329 msgid "apply the patch in reverse" msgstr "wendet den Patch in umgekehrter Reihenfolge an" -#: builtin/apply.c:4332 +#: builtin/apply.c:4331 msgid "don't expect at least one line of context" msgstr "erwartet keinen Kontext" -#: builtin/apply.c:4334 +#: builtin/apply.c:4333 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "" "hinterlässt zurückgewiesene Patch-Bereiche in den entsprechenden *.rej " "Dateien" -#: builtin/apply.c:4336 +#: builtin/apply.c:4335 msgid "allow overlapping hunks" msgstr "erlaubt sich überlappende Patch-Bereiche" -#: builtin/apply.c:4337 +#: builtin/apply.c:4336 msgid "be verbose" msgstr "erweiterte Ausgaben" -#: builtin/apply.c:4339 +#: builtin/apply.c:4338 msgid "tolerate incorrectly detected missing new-line at the end of file" msgstr "toleriert fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende" -#: builtin/apply.c:4342 +#: builtin/apply.c:4341 msgid "do not trust the line counts in the hunk headers" msgstr "vertraut nicht den Zeilennummern im Kopf des Patch-Bereiches" -#: builtin/apply.c:4344 +#: builtin/apply.c:4343 msgid "root" msgstr "Wurzelverzeichnis" -#: builtin/apply.c:4345 +#: builtin/apply.c:4344 msgid "prepend <root> to all filenames" msgstr "stellt <Wurzelverzeichnis> vor alle Dateinamen" -#: builtin/apply.c:4367 +#: builtin/apply.c:4366 msgid "--3way outside a repository" msgstr "--3way außerhalb eines Projektarchivs" -#: builtin/apply.c:4375 +#: builtin/apply.c:4374 msgid "--index outside a repository" msgstr "--index außerhalb eines Projektarchivs" -#: builtin/apply.c:4378 +#: builtin/apply.c:4377 msgid "--cached outside a repository" msgstr "--cached außerhalb eines Projektarchivs" -#: builtin/apply.c:4394 +#: builtin/apply.c:4393 #, c-format msgid "can't open patch '%s'" msgstr "kann Patch '%s' nicht öffnen" -#: builtin/apply.c:4408 +#: builtin/apply.c:4407 #, c-format msgid "squelched %d whitespace error" msgid_plural "squelched %d whitespace errors" msgstr[0] "unterdrückte %d Fehler in Leerzeichen" msgstr[1] "unterdrückte %d Fehler in Leerzeichen" -#: builtin/apply.c:4414 builtin/apply.c:4424 +#: builtin/apply.c:4413 builtin/apply.c:4423 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -2065,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 @@ -2163,7 +2160,7 @@ msgstr "Pfad '%s': kann nicht zusammenführen" msgid "Unable to add merge result for '%s'" msgstr "Konnte Ergebnis der Zusammenführung von '%s' nicht hinzufügen." -#: builtin/checkout.c:235 builtin/checkout.c:393 +#: builtin/checkout.c:235 builtin/checkout.c:392 msgid "corrupt index file" msgstr "beschädigte Bereitstellungsdatei" @@ -2172,60 +2169,56 @@ msgstr "beschädigte Bereitstellungsdatei" msgid "path '%s' is unmerged" msgstr "Pfad '%s' ist nicht zusammengeführt." -#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586 -#: builtin/merge.c:812 +#: builtin/checkout.c:303 builtin/checkout.c:498 builtin/clone.c:586 +#: builtin/merge.c:811 msgid "unable to write new index file" msgstr "Konnte neue Bereitstellungsdatei nicht schreiben." -#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "diff_setup_done fehlgeschlagen" - -#: builtin/checkout.c:415 +#: builtin/checkout.c:414 msgid "you need to resolve your current index first" msgstr "Du musst zuerst deine aktuelle Bereitstellung auflösen." -#: builtin/checkout.c:534 +#: builtin/checkout.c:533 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n" -#: builtin/checkout.c:567 +#: builtin/checkout.c:566 msgid "HEAD is now at" msgstr "Zweigspitze (HEAD) ist jetzt bei" -#: builtin/checkout.c:574 +#: builtin/checkout.c:573 #, c-format msgid "Reset branch '%s'\n" msgstr "Setze Zweig '%s' zurück\n" -#: builtin/checkout.c:577 +#: builtin/checkout.c:576 #, c-format msgid "Already on '%s'\n" msgstr "Bereits auf '%s'\n" -#: builtin/checkout.c:581 +#: builtin/checkout.c:580 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Gewechselt zu zurückgesetztem Zweig '%s'\n" -#: builtin/checkout.c:583 +#: builtin/checkout.c:582 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Gewechselt zu einem neuen Zweig '%s'\n" -#: builtin/checkout.c:585 +#: builtin/checkout.c:584 #, c-format msgid "Switched to branch '%s'\n" msgstr "Gewechselt zu Zweig '%s'\n" -#: builtin/checkout.c:641 +#: builtin/checkout.c:640 #, c-format msgid " ... and %d more.\n" msgstr " ... und %d weitere.\n" #. The singular version -#: builtin/checkout.c:647 +#: builtin/checkout.c:646 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2248,7 +2241,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:665 +#: builtin/checkout.c:664 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -2263,71 +2256,71 @@ msgstr "" " git branch neuer_zweig_name %s\n" "\n" -#: builtin/checkout.c:695 +#: builtin/checkout.c:694 msgid "internal error in revision walk" msgstr "interner Fehler im Revisionsgang" -#: builtin/checkout.c:699 +#: builtin/checkout.c:698 msgid "Previous HEAD position was" msgstr "Vorherige Position der Zweigspitze (HEAD) war" -#: builtin/checkout.c:725 builtin/checkout.c:920 +#: builtin/checkout.c:724 builtin/checkout.c:919 msgid "You are on a branch yet to be born" msgstr "du bist auf einem Zweig, der noch geboren wird" #. case (1) -#: builtin/checkout.c:856 +#: builtin/checkout.c:855 #, c-format msgid "invalid reference: %s" msgstr "Ungültige Referenz: %s" #. case (1): want a tree -#: builtin/checkout.c:895 +#: builtin/checkout.c:894 #, c-format msgid "reference is not a tree: %s" msgstr "Referenz ist kein Baum: %s" -#: builtin/checkout.c:977 +#: builtin/checkout.c:976 msgid "-B cannot be used with -b" msgstr "-B kann nicht mit -b benutzt werden" -#: builtin/checkout.c:986 +#: builtin/checkout.c:985 msgid "--patch is incompatible with all other options" msgstr "--patch ist inkompatibel mit allen anderen Optionen" -#: builtin/checkout.c:989 +#: builtin/checkout.c:988 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden" -#: builtin/checkout.c:991 +#: builtin/checkout.c:990 msgid "--detach cannot be used with -t" msgstr "--detach kann nicht mit -t benutzt werden" -#: builtin/checkout.c:997 +#: builtin/checkout.c:996 msgid "--track needs a branch name" msgstr "--track benötigt einen Zweignamen" -#: builtin/checkout.c:1004 +#: builtin/checkout.c:1003 msgid "Missing branch name; try -b" msgstr "Vermisse Zweignamen; versuche -b" -#: builtin/checkout.c:1010 +#: builtin/checkout.c:1009 msgid "--orphan and -b|-B are mutually exclusive" msgstr "--orphan und -b|-B sind gegenseitig exklusiv" -#: builtin/checkout.c:1012 +#: builtin/checkout.c:1011 msgid "--orphan cannot be used with -t" msgstr "--orphan kann nicht mit -t benutzt werden" -#: builtin/checkout.c:1022 +#: builtin/checkout.c:1021 msgid "git checkout: -f and -m are incompatible" msgstr "git checkout: -f und -m sind inkompatibel" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1055 msgid "invalid path specification" msgstr "ungültige Pfadspezifikation" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1063 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" @@ -2338,29 +2331,29 @@ msgstr "" "Hast du beabsichtigt '%s' auszuchecken, welcher nicht als Version aufgelöst " "werden kann?" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1065 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "" "git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem Wechsel " "von Zweigen." -#: builtin/checkout.c:1071 +#: builtin/checkout.c:1070 msgid "git checkout: --detach does not take a path argument" msgstr "git checkout: --detach nimmt kein Pfad-Argument" -#: builtin/checkout.c:1074 +#: builtin/checkout.c:1073 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:1093 +#: builtin/checkout.c:1092 msgid "Cannot switch branch to a non-commit." msgstr "Kann Zweig nur zu einer Version wechseln." -#: builtin/checkout.c:1096 +#: builtin/checkout.c:1095 msgid "--ours/--theirs is incompatible with switching branches." msgstr "--ours/--theirs ist inkompatibel mit den Wechseln von Zweigen." @@ -2418,7 +2411,7 @@ msgstr "Referenziertes Projektarchiv '%s' ist kein lokales Verzeichnis." msgid "failed to create directory '%s'" msgstr "Fehler beim Erstellen von Verzeichnis '%s'" -#: builtin/clone.c:308 builtin/diff.c:75 +#: builtin/clone.c:308 builtin/diff.c:77 #, c-format msgid "failed to stat '%s'" msgstr "Konnte '%s' nicht lesen" @@ -2433,11 +2426,6 @@ msgstr "%s existiert und ist kein Verzeichnis" msgid "failed to stat %s\n" msgstr "Konnte %s nicht lesen\n" -#: builtin/clone.c:341 -#, c-format -msgid "failed to unlink '%s'" -msgstr "Konnte '%s' nicht entfernen" - #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" @@ -2843,7 +2831,7 @@ msgstr " (Basis-Version)" msgid "could not parse HEAD commit" msgstr "Konnte Version der Zweigspitze (HEAD) nicht analysieren." -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1487 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "Konnte '%s' nicht zum Lesen öffnen." @@ -2872,7 +2860,7 @@ msgstr "Eintragung abgebrochen; du hast die Beschreibung nicht editiert.\n" msgid "Aborting commit due to empty commit message.\n" msgstr "Eintragung aufgrund leerer Versionsbeschreibung abgebrochen.\n" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1554 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "Fehler beim Schreiben des Versionsobjektes." @@ -2979,36 +2967,36 @@ msgstr "Keine Namen gefunden, kann nichts beschreiben." msgid "--dirty is incompatible with committishes" msgstr "--dirty ist inkompatibel mit Versionen" -#: builtin/diff.c:77 +#: builtin/diff.c:79 #, c-format msgid "'%s': not a regular file or symlink" msgstr "'%s': keine reguläre Datei oder symbolischer Link" -#: builtin/diff.c:220 +#: builtin/diff.c:224 #, c-format msgid "invalid option: %s" msgstr "Ungültige Option: %s" -#: builtin/diff.c:297 +#: builtin/diff.c:301 msgid "Not a git repository" msgstr "Kein Git-Projektarchiv" -#: builtin/diff.c:341 +#: builtin/diff.c:344 #, c-format msgid "invalid object '%s' given." msgstr "Objekt '%s' ist ungültig." -#: builtin/diff.c:346 +#: builtin/diff.c:349 #, c-format msgid "more than %d trees given: '%s'" msgstr "Mehr als %d Zweige angegeben: '%s'" -#: builtin/diff.c:356 +#: builtin/diff.c:359 #, c-format msgid "more than two blobs given: '%s'" msgstr "Mehr als zwei Blobs angegeben: '%s'" -#: builtin/diff.c:364 +#: builtin/diff.c:367 #, c-format msgid "unhandled object '%s' given." msgstr "unbehandeltes Objekt '%s' angegeben" @@ -3212,58 +3200,58 @@ msgstr "" msgid "grep: failed to create thread: %s" msgstr "grep: Fehler beim Erzeugen eines Thread: %s" -#: builtin/grep.c:402 +#: builtin/grep.c:454 #, c-format msgid "Failed to chdir: %s" msgstr "Fehler beim Verzeichniswechsel: %s" -#: builtin/grep.c:478 builtin/grep.c:512 +#: builtin/grep.c:530 builtin/grep.c:564 #, c-format msgid "unable to read tree (%s)" msgstr "konnte Zweig (%s) nicht lesen" -#: builtin/grep.c:526 +#: builtin/grep.c:578 #, c-format msgid "unable to grep from object of type %s" msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen" -#: builtin/grep.c:584 +#: builtin/grep.c:636 #, c-format msgid "switch `%c' expects a numerical value" msgstr "Schalter '%c' erwartet einen numerischen Wert" -#: builtin/grep.c:601 +#: builtin/grep.c:653 #, c-format msgid "cannot open '%s'" msgstr "kann '%s' nicht öffnen" -#: builtin/grep.c:885 +#: builtin/grep.c:917 msgid "no pattern given." msgstr "keine Muster angegeben" -#: builtin/grep.c:899 +#: builtin/grep.c:931 #, c-format msgid "bad object %s" msgstr "ungültiges Objekt %s" -#: builtin/grep.c:940 +#: builtin/grep.c:972 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager arbeitet nur innerhalb des Arbeitsbaums" -#: builtin/grep.c:963 +#: builtin/grep.c:995 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached oder --untracked kann nicht mit --no-index benutzt werden" -#: builtin/grep.c:968 +#: builtin/grep.c:1000 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index oder --untracked kann nicht mit Versionen benutzt werden" -#: builtin/grep.c:971 +#: builtin/grep.c:1003 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" "--[no-]exlude-standard kann nicht mit beobachteten Inhalten benutzt werden" -#: builtin/grep.c:979 +#: builtin/grep.c:1011 msgid "both --cached and trees are given." msgstr "sowohl --cached als auch Zweige gegeben" @@ -3666,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 @@ -3758,58 +3746,58 @@ msgstr "Brauche genau einen Versionsbereich." msgid "Not a range." msgstr "Kein Versionsbereich." -#: builtin/log.c:792 +#: builtin/log.c:789 msgid "Cover letter needs email format" msgstr "Anschreiben benötigt E-Mail-Format" -#: builtin/log.c:865 +#: builtin/log.c:862 #, c-format msgid "insane in-reply-to: %s" msgstr "ungültiges in-reply-to: %s" -#: builtin/log.c:938 +#: builtin/log.c:935 msgid "Two output directories?" msgstr "Zwei Ausgabeverzeichnisse?" -#: builtin/log.c:1160 +#: builtin/log.c:1157 #, c-format msgid "bogus committer info %s" msgstr "unechte Einreicher-Informationen %s" -#: builtin/log.c:1205 +#: 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:1207 +#: 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:1215 +#: builtin/log.c:1212 msgid "--name-only does not make sense" msgstr "--name-only macht keinen Sinn" -#: builtin/log.c:1217 +#: builtin/log.c:1214 msgid "--name-status does not make sense" msgstr "--name-status macht keinen Sinn" -#: builtin/log.c:1219 +#: builtin/log.c:1216 msgid "--check does not make sense" msgstr "--check macht keinen Sinn" -#: builtin/log.c:1242 +#: builtin/log.c:1239 msgid "standard output, or directory, which one?" msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?" -#: builtin/log.c:1244 +#: builtin/log.c:1241 #, c-format msgid "Could not create directory '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/log.c:1397 +#: builtin/log.c:1394 msgid "Failed to create output files" msgstr "Fehler beim Erstellen der Ausgabedateien." -#: builtin/log.c:1501 +#: builtin/log.c:1498 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" @@ -3817,7 +3805,7 @@ msgstr "" "Konnte gefolgten, externen Zweig nicht finden, bitte gebe <upstream> manuell " "an.\n" -#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531 +#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 #, c-format msgid "Unknown commit %s" msgstr "Unbekannte Version %s" @@ -3882,51 +3870,51 @@ msgstr "" "Keine Zusammenführungsbeschreibung -- Zweigspitze (HEAD) wird nicht " "aktualisiert\n" -#: builtin/merge.c:437 +#: builtin/merge.c:436 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' zeigt auf keine Version" -#: builtin/merge.c:536 +#: builtin/merge.c:535 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Ungültiger branch.%s.mergeoptions String: %s" -#: builtin/merge.c:629 +#: builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "\"git write-tree\" schlug beim Schreiben eines Baumes fehl" -#: builtin/merge.c:679 +#: builtin/merge.c:678 msgid "failed to read the cache" msgstr "Lesen des Zwischenspeichers fehlgeschlagen" -#: builtin/merge.c:710 +#: builtin/merge.c:709 msgid "Not handling anything other than two heads merge." msgstr "Es wird nur die Zusammenführung von zwei Zweigen behandelt." -#: builtin/merge.c:724 +#: builtin/merge.c:723 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Unbekannte Option für merge-recursive: -X%s" -#: builtin/merge.c:738 +#: builtin/merge.c:737 #, c-format msgid "unable to write %s" msgstr "konnte %s nicht schreiben" -#: builtin/merge.c:877 +#: builtin/merge.c:876 #, c-format msgid "Could not read from '%s'" msgstr "konnte nicht von '%s' lesen" -#: builtin/merge.c:886 +#: builtin/merge.c:885 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" "Zusammenführung wurde nicht eingetragen; benutze 'git commit' um die " "Zusammenführung abzuschließen.\n" -#: builtin/merge.c:892 +#: builtin/merge.c:891 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -3942,56 +3930,56 @@ msgstr "" "Zeilen beginnend mit '#' werden ignoriert, und eine leere Beschreibung " "bricht die Eintragung ab.\n" -#: builtin/merge.c:916 +#: builtin/merge.c:915 msgid "Empty commit message." msgstr "Leere Versionsbeschreibung" -#: builtin/merge.c:928 +#: builtin/merge.c:927 #, c-format msgid "Wonderful.\n" msgstr "Wunderbar.\n" -#: builtin/merge.c:993 +#: builtin/merge.c:992 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" "Automatische Zusammenführung fehlgeschlagen; behebe die Konflikte und trage " "dann das Ergebnis ein.\n" -#: builtin/merge.c:1009 +#: builtin/merge.c:1008 #, c-format msgid "'%s' is not a commit" msgstr "'%s' ist keine Version" -#: builtin/merge.c:1050 +#: builtin/merge.c:1049 msgid "No current branch." msgstr "Du befindest dich auf keinem Zweig." -#: builtin/merge.c:1052 +#: builtin/merge.c:1051 msgid "No remote for the current branch." msgstr "Kein externes Archiv für den aktuellen Zweig." -#: builtin/merge.c:1054 +#: builtin/merge.c:1053 msgid "No default upstream defined for the current branch." msgstr "" "Es ist kein externes Standard-Projektarchiv für den aktuellen Zweig " "definiert." -#: builtin/merge.c:1059 +#: builtin/merge.c:1058 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "Kein externer Ãœbernahmezweig für %s von %s" -#: builtin/merge.c:1146 builtin/merge.c:1303 +#: builtin/merge.c:1145 builtin/merge.c:1302 #, c-format msgid "%s - not something we can merge" msgstr "%s - nichts was wir zusammenführen können" -#: builtin/merge.c:1214 +#: builtin/merge.c:1213 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Es gibt keine Zusammenführung zum Abbrechen (vermisse MERGE_HEAD)" -#: builtin/merge.c:1230 git-pull.sh:31 +#: builtin/merge.c:1229 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3999,12 +3987,12 @@ msgstr "" "Du hast deine Zusammenführung nicht abgeschlossen (MERGE_HEAD existiert).\n" "Bitte trage deine Änderungen ein, bevor du zusammenführen kannst." -#: builtin/merge.c:1233 git-pull.sh:34 +#: builtin/merge.c:1232 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "" "Du hast deine Zusammenführung nicht abgeschlossen (MERGE_HEAD existiert)." -#: builtin/merge.c:1237 +#: builtin/merge.c:1236 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -4012,80 +4000,80 @@ msgstr "" "Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n" "Bitte trage deine Änderungen ein, bevor du zusammenführen kannst." -#: builtin/merge.c:1240 +#: builtin/merge.c:1239 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" "Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)." -#: builtin/merge.c:1249 +#: builtin/merge.c:1248 msgid "You cannot combine --squash with --no-ff." msgstr "Du kannst --squash nicht mit --no-ff kombinieren." -#: builtin/merge.c:1254 +#: builtin/merge.c:1253 msgid "You cannot combine --no-ff with --ff-only." msgstr "Du kannst --no-ff nicht mit --ff--only kombinieren." -#: builtin/merge.c:1261 +#: builtin/merge.c:1260 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Keine Version angegeben und merge.defaultToUpstream ist nicht gesetzt." -#: builtin/merge.c:1293 +#: builtin/merge.c:1292 msgid "Can merge only exactly one commit into empty head" msgstr "Kann nur exakt eine Version in einem leeren Zweig zusammenführen." -#: builtin/merge.c:1296 +#: builtin/merge.c:1295 msgid "Squash commit into empty head not supported yet" msgstr "Bin auf einem Zweig, der noch geboren wird; kann nicht quetschen." -#: builtin/merge.c:1298 +#: builtin/merge.c:1297 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "nicht vorzuspulende Version macht in einem leeren Zweig keinen Sinn" -#: builtin/merge.c:1413 +#: builtin/merge.c:1412 #, c-format msgid "Updating %s..%s\n" msgstr "Aktualisiere %s..%s\n" -#: builtin/merge.c:1451 +#: builtin/merge.c:1450 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Probiere wirklich triviale \"in-index\"-Zusammenführung...\n" -#: builtin/merge.c:1458 +#: builtin/merge.c:1457 #, c-format msgid "Nope.\n" msgstr "Nein.\n" -#: builtin/merge.c:1490 +#: builtin/merge.c:1489 msgid "Not possible to fast-forward, aborting." msgstr "Vorspulen nicht möglich, breche ab." -#: builtin/merge.c:1513 builtin/merge.c:1592 +#: builtin/merge.c:1512 builtin/merge.c:1591 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Rücklauf des Zweiges bis zum Ursprung...\n" -#: builtin/merge.c:1517 +#: builtin/merge.c:1516 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Probiere Zusammenführungsstrategie %s...\n" -#: builtin/merge.c:1583 +#: builtin/merge.c:1582 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Keine Zusammenführungsstrategie behandelt diese Zusammenführung.\n" -#: builtin/merge.c:1585 +#: builtin/merge.c:1584 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Zusammenführung mit Strategie %s fehlgeschlagen.\n" -#: builtin/merge.c:1594 +#: builtin/merge.c:1593 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Benutze \"%s\" um die Auflösung per Hand vorzubereiten.\n" -#: builtin/merge.c:1606 +#: builtin/merge.c:1605 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" @@ -4426,14 +4414,49 @@ msgstr "" "aktuellen Zweiges '%s' ist, ohne mir mitzuteilen, was ich versenden\n" "soll, um welchen externen Zweig zu aktualisieren." -#: builtin/push.c:174 +#: builtin/push.c:151 +msgid "" +"push.default is unset; its implicit value is changing in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the current behavior after the default changes, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" +"'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n" +"wird in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n" +"unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n" +"beizubehalten, benutze:" +"\n" +" git config --global push.default matching\n" +"\n" +"Um diese Meldung zu unterdrücken und das neue Verhalten jetzt zu übernehmen,\n" +"benutze:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"Führe 'git help config' aus und suche nach 'push.default' für weitere " +"Informationen.\n" +"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutze den ähnlichen" +" Modus 'current' anstatt 'simple', falls du gelegentlich ältere Versionen von" +" Git benutzt.)" + +#: builtin/push.c:199 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" "Du hast keine Referenzspezifikationen zum Versenden angegeben, und push." "default ist \"nothing\"." -#: builtin/push.c:181 +#: builtin/push.c:206 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -4446,22 +4469,22 @@ msgstr "" "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:187 +#: builtin/push.c:212 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" -"specify branches to push or set the 'push.default' configuration\n" -"variable to 'current' or 'upstream' to push only the current branch." +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." msgstr "" "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n" "Zweiges hinter seinem externen Gegenstück zurückgefallen ist. Wenn du nicht\n" "beabsichtigt hast, diesen Zweig zu versenden, kannst du auch den zu " "versendenden\n" "Zweig spezifizieren oder die Konfigurationsvariable 'push.default' zu " -"'current'\n" +"'simple', 'current'\n" "oder 'upstream' setzen, um nur den aktuellen Zweig zu versenden." -#: builtin/push.c:193 +#: builtin/push.c:218 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -4475,22 +4498,22 @@ msgstr "" "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:233 +#: builtin/push.c:258 #, c-format msgid "Pushing to %s\n" msgstr "Versende nach %s\n" -#: builtin/push.c:237 +#: builtin/push.c:262 #, c-format msgid "failed to push some refs to '%s'" msgstr "Fehler beim Versenden einiger Referenzen nach '%s'" -#: builtin/push.c:269 +#: builtin/push.c:294 #, c-format msgid "bad repository '%s'" msgstr "ungültiges Projektarchiv '%s'" -#: builtin/push.c:270 +#: builtin/push.c:295 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -4512,31 +4535,31 @@ msgstr "" "\n" " git push <Name>\n" -#: builtin/push.c:285 +#: builtin/push.c:310 msgid "--all and --tags are incompatible" msgstr "--all und --tags sind inkompatibel" -#: builtin/push.c:286 +#: builtin/push.c:311 msgid "--all can't be combined with refspecs" msgstr "--all kann nicht mit Referenzspezifikationen kombiniert werden" -#: builtin/push.c:291 +#: builtin/push.c:316 msgid "--mirror and --tags are incompatible" msgstr "--mirror und --tags sind inkompatibel" -#: builtin/push.c:292 +#: builtin/push.c:317 msgid "--mirror can't be combined with refspecs" msgstr "--mirror kann nicht mit Referenzspezifikationen kombiniert werden" -#: builtin/push.c:297 +#: builtin/push.c:322 msgid "--all and --mirror are incompatible" msgstr "--all und --mirror sind inkompatibel" -#: builtin/push.c:385 +#: builtin/push.c:410 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete ist inkompatibel mit --all, --mirror und --tags" -#: builtin/push.c:387 +#: builtin/push.c:412 msgid "--delete doesn't make sense without any refs" msgstr "--delete macht ohne irgendeine Referenz keinen Sinn" @@ -5750,14 +5773,14 @@ msgid "" "and run me again. I am stopping in case you still have something\n" "valuable there." msgstr "" -"Es scheint so, als gäbe es das Verzeichnis $state_dir_base bereits, und\n" -"es wäre verwunderlich, wenn ein Neuaufbau bereits im Gange ist. Wenn das\n" -"der Fall ist, probiere bitte\n" +"Es sieht so aus, als ob es das Verzeichnis $state_dir_base bereits gibt\n" +"und es könnte ein anderer Neuaufbau im Gange sein. Wenn das der Fall ist,\n" +"probiere bitte\n" "\t$cmd_live_rebase\n" "Wenn das nicht der Fall ist, probiere bitte\n" "\t$cmd_clear_stale_rebase\n" -"und führe dieses Kommando nochmal aus. Es wird angehalten, falls bereits\n" -"etwas Nützliches vorhanden ist." +"und führe dieses Kommando nochmal aus. Es wird angehalten, falls noch\n" +"etwas Schützenswertes vorhanden ist." #: git-rebase.sh:395 #, sh-format @@ -5952,34 +5975,34 @@ msgstr "(Zur Wiederherstellung gebe \"git stash apply\" ein)" msgid "cannot strip one component off url '$remoteurl'" msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren" -#: git-submodule.sh:145 +#: git-submodule.sh:167 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" msgstr "" "Keine Unterprojekt-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden" -#: git-submodule.sh:189 +#: git-submodule.sh:211 #, sh-format msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "Klonen von '$url' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen" -#: git-submodule.sh:201 +#: git-submodule.sh:223 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "" "Git-Verzeichnis '$a' ist Teil des Unterprojekt-Pfades '$b', oder umgekehrt" -#: git-submodule.sh:290 +#: git-submodule.sh:312 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen" -#: git-submodule.sh:307 +#: git-submodule.sh:329 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "'$sm_path' existiert bereits in der Bereitstellung" -#: git-submodule.sh:311 +#: git-submodule.sh:333 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" @@ -5990,65 +6013,65 @@ msgstr "" "$sm_path\n" "Benutze -f wenn du diesen wirklich hinzufügen möchtest." -#: git-submodule.sh:322 +#: git-submodule.sh:344 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "" "Füge existierendes Projektarchiv in '$sm_path' der Bereitstellung hinzu." -#: git-submodule.sh:324 +#: git-submodule.sh:346 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Projektarchiv" -#: git-submodule.sh:338 +#: git-submodule.sh:360 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "Unfähig Unterprojekt '$sm_path' auszuchecken" -#: git-submodule.sh:343 +#: git-submodule.sh:365 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "Hinzufügen von Unterprojekt '$sm_path' fehlgeschlagen" -#: git-submodule.sh:348 +#: git-submodule.sh:370 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "Registierung von Unterprojekt '$sm_path' fehlgeschlagen" -#: git-submodule.sh:390 +#: git-submodule.sh:413 #, sh-format msgid "Entering '$prefix$sm_path'" msgstr "Betrete '$prefix$sm_path'" -#: git-submodule.sh:404 +#: git-submodule.sh:427 #, sh-format msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "Stoppe bei '$sm_path'; Skript gab nicht-Null Status zurück." -#: git-submodule.sh:447 +#: git-submodule.sh:471 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "Keine URL für Unterprojekt-Pfad '$sm_path' in .gitmodules gefunden" -#: git-submodule.sh:456 +#: git-submodule.sh:480 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "Registrierung der URL für Unterprojekt-Pfad '$sm_path' fehlgeschlagen" -#: git-submodule.sh:458 +#: git-submodule.sh:482 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "Unterprojekt '$name' ($url) ist für Pfad '$sm_path' registriert" -#: git-submodule.sh:466 +#: git-submodule.sh:490 #, sh-format msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "" "Registrierung des Aktualisierungsmodus für Unterprojekt-Pfad '$sm_path' " "fehlgeschlagen" -#: git-submodule.sh:565 +#: git-submodule.sh:590 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" @@ -6057,95 +6080,104 @@ msgstr "" "Unterprojekt-Pfad '$sm_path' ist nicht initialisiert\n" "Vielleicht möchtest du 'update --init' benutzen?" -#: git-submodule.sh:578 +#: git-submodule.sh:603 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "Konnte aktuelle Version in Unterprojekt-Pfad '$sm_path' nicht finden" -#: git-submodule.sh:597 +#: git-submodule.sh:622 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Konnte in Unterprojekt-Pfad '$sm_path' nicht anfordern" -#: git-submodule.sh:611 +#: git-submodule.sh:636 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "Neuaufbau von '$sha1' in Unterprojekt-Pfad '$sm_path' nicht möglich" -#: git-submodule.sh:612 +#: git-submodule.sh:637 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "Unterprojekt-Pfad '$sm_path': neu aufgebaut in '$sha1'" -#: git-submodule.sh:617 +#: git-submodule.sh:642 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "" "Zusammenführung von '$sha1' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen" -#: git-submodule.sh:618 +#: git-submodule.sh:643 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "Unterprojekt-Pfad '$sm_path': zusammengeführt in '$sha1'" -#: git-submodule.sh:623 +#: git-submodule.sh:648 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "Konnte '$sha1' in Unterprojekt-Pfad '$sm_path' nicht auschecken." -#: git-submodule.sh:624 +#: git-submodule.sh:649 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "Unterprojekt-Pfad: '$sm_path': '$sha1' ausgecheckt" -#: git-submodule.sh:646 git-submodule.sh:969 +#: git-submodule.sh:671 git-submodule.sh:995 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Fehler bei Rekursion in Unterprojekt-Pfad '$sm_path'" -#: git-submodule.sh:754 +#: git-submodule.sh:779 msgid "The --cached option cannot be used with the --files option" msgstr "Die --cached Option kann nicht mit der --files Option benutzt werden" #. unexpected type -#: git-submodule.sh:794 +#: git-submodule.sh:819 #, sh-format msgid "unexpected mode $mod_dst" msgstr "unerwarteter Modus $mod_dst" -#: git-submodule.sh:812 +#: git-submodule.sh:837 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " Warnung: $name beinhaltet nicht Version $sha1_src" -#: git-submodule.sh:815 +#: git-submodule.sh:840 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " Warnung: $name beinhaltet nicht Version $sha1_dst" -#: git-submodule.sh:818 +#: git-submodule.sh:843 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" " Warnung: $name beinhaltet nicht die Versionen $sha1_src und $sha1_dst" -#: git-submodule.sh:843 +#: git-submodule.sh:868 msgid "blob" msgstr "Blob" -#: git-submodule.sh:881 +#: git-submodule.sh:906 msgid "# Submodules changed but not updated:" msgstr "# Unterprojekte geändert, aber nicht aktualisiert:" -#: git-submodule.sh:883 +#: git-submodule.sh:908 msgid "# Submodule changes to be committed:" msgstr "# Änderungen in Unterprojekt zum Eintragen:" -#: git-submodule.sh:1027 +#: git-submodule.sh:1054 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "Synchronisiere Unterprojekt-URL für '$name'" +#~ msgid "diff setup failed" +#~ msgstr "diff_setup_done fehlgeschlagen" + +#~ msgid "merge-recursive: disk full?" +#~ msgstr "merge-recursive: Festplatte voll?" + +#~ msgid "diff_setup_done failed" +#~ msgstr "diff_setup_done fehlgeschlagen" + #~ msgid "-d option is no longer supported. Do not use." #~ msgstr "-d Option wird nicht länger unterstützt. Nicht benutzen." diff --git a/po/git.pot b/po/git.pot index 5c586d6007..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-08-06 23:47+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" @@ -35,6 +35,91 @@ msgid "" "or use 'git commit -a'." msgstr "" +#: archive.c:10 +msgid "git archive [options] <tree-ish> [<path>...]" +msgstr "" + +#: archive.c:11 +msgid "git archive --list" +msgstr "" + +#: archive.c:12 +msgid "" +"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]" +msgstr "" + +#: archive.c:13 +msgid "git archive --remote <repo> [--exec <cmd>] --list" +msgstr "" + +#: archive.c:322 +msgid "fmt" +msgstr "" + +#: archive.c:322 +msgid "archive format" +msgstr "" + +#: archive.c:323 builtin/log.c:1079 +msgid "prefix" +msgstr "" + +#: archive.c:324 +msgid "prepend prefix to each pathname in the archive" +msgstr "" + +#: 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 "" + +#: archive.c:326 builtin/archive.c:92 +msgid "write the archive to this file" +msgstr "" + +#: archive.c:328 +msgid "read .gitattributes in working directory" +msgstr "" + +#: archive.c:329 +msgid "report archived files on stderr" +msgstr "" + +#: archive.c:330 +msgid "store only" +msgstr "" + +#: archive.c:331 +msgid "compress faster" +msgstr "" + +#: archive.c:339 +msgid "compress better" +msgstr "" + +#: archive.c:342 +msgid "list supported archive formats" +msgstr "" + +#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85 +msgid "repo" +msgstr "" + +#: archive.c:345 builtin/archive.c:94 +msgid "retrieve the archive from remote repository <repo>" +msgstr "" + +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 +msgid "command" +msgstr "" + +#: archive.c:347 builtin/archive.c:96 +msgid "path to the remote git-upload-archive command" +msgstr "" + #: bundle.c:36 #, c-format msgid "'%s' does not look like a v2 bundle file" @@ -45,7 +130,7 @@ msgstr "" msgid "unrecognized header: %s%s (%d)" msgstr "" -#: bundle.c:89 builtin/commit.c:699 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "" @@ -54,8 +139,8 @@ msgstr "" msgid "Repository lacks these prerequisite commits:" msgstr "" -#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290 -#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347 +#: 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" msgstr "" @@ -82,7 +167,7 @@ msgstr[1] "" msgid "rev-list died" msgstr "" -#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284 +#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284 #, c-format msgid "unrecognized argument: %s" msgstr "" @@ -113,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 "" @@ -225,32 +310,7 @@ msgid "" "%s" msgstr "" -#: diff.c:1400 -msgid " 0 files changed" -msgstr "" - -#: diff.c:1404 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1421 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1432 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:3461 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -269,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 "" @@ -345,243 +405,235 @@ msgstr "" msgid "error building trees" msgstr "" -#: merge-recursive.c:497 -msgid "diff setup failed" -msgstr "" - -#: merge-recursive.c:627 -msgid "merge-recursive: disk full?" -msgstr "" - -#: merge-recursive.c:690 +#: merge-recursive.c:672 #, c-format msgid "failed to create path '%s'%s" msgstr "" -#: merge-recursive.c:701 +#: merge-recursive.c:683 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "" #. something else exists #. .. but not some other error (who really cares what?) -#: merge-recursive.c:715 merge-recursive.c:736 +#: merge-recursive.c:697 merge-recursive.c:718 msgid ": perhaps a D/F conflict?" msgstr "" -#: merge-recursive.c:726 +#: merge-recursive.c:708 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "" -#: merge-recursive.c:766 +#: merge-recursive.c:748 #, c-format msgid "cannot read object %s '%s'" msgstr "" -#: merge-recursive.c:768 +#: merge-recursive.c:750 #, c-format msgid "blob expected for %s '%s'" msgstr "" -#: merge-recursive.c:791 builtin/clone.c:302 +#: merge-recursive.c:773 builtin/clone.c:302 #, c-format msgid "failed to open '%s'" msgstr "" -#: merge-recursive.c:799 +#: merge-recursive.c:781 #, c-format msgid "failed to symlink '%s'" msgstr "" -#: merge-recursive.c:802 +#: merge-recursive.c:784 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "" -#: merge-recursive.c:939 +#: merge-recursive.c:922 msgid "Failed to execute internal merge" msgstr "" -#: merge-recursive.c:943 +#: merge-recursive.c:926 #, c-format msgid "Unable to add %s to database" msgstr "" -#: merge-recursive.c:959 +#: merge-recursive.c:942 msgid "unsupported object type in the tree" msgstr "" -#: merge-recursive.c:1038 merge-recursive.c:1052 +#: 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 " "in tree." msgstr "" -#: merge-recursive.c:1044 merge-recursive.c:1057 +#: 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 " "in tree at %s." msgstr "" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "rename" msgstr "" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "renamed" msgstr "" -#: merge-recursive.c:1154 +#: merge-recursive.c:1137 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "" -#: merge-recursive.c:1176 +#: merge-recursive.c:1159 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" "\"->\"%s\" in \"%s\"%s" msgstr "" -#: merge-recursive.c:1181 +#: merge-recursive.c:1164 msgid " (left unresolved)" msgstr "" -#: merge-recursive.c:1235 +#: merge-recursive.c:1218 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" -#: merge-recursive.c:1265 +#: merge-recursive.c:1248 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "" -#: merge-recursive.c:1464 +#: merge-recursive.c:1447 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "" -#: merge-recursive.c:1474 +#: merge-recursive.c:1457 #, c-format msgid "Adding merged %s" msgstr "" -#: merge-recursive.c:1479 merge-recursive.c:1677 +#: merge-recursive.c:1462 merge-recursive.c:1660 #, c-format msgid "Adding as %s instead" msgstr "" -#: merge-recursive.c:1530 +#: merge-recursive.c:1513 #, c-format msgid "cannot read object %s" msgstr "" -#: merge-recursive.c:1533 +#: merge-recursive.c:1516 #, c-format msgid "object %s is not a blob" msgstr "" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modify" msgstr "" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modified" msgstr "" -#: merge-recursive.c:1591 +#: merge-recursive.c:1574 msgid "content" msgstr "" -#: merge-recursive.c:1598 +#: merge-recursive.c:1581 msgid "add/add" msgstr "" -#: merge-recursive.c:1632 +#: merge-recursive.c:1615 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "" -#: merge-recursive.c:1646 +#: merge-recursive.c:1629 #, c-format msgid "Auto-merging %s" msgstr "" -#: merge-recursive.c:1650 git-submodule.sh:844 +#: merge-recursive.c:1633 git-submodule.sh:869 msgid "submodule" msgstr "" -#: merge-recursive.c:1651 +#: merge-recursive.c:1634 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "" -#: merge-recursive.c:1741 +#: merge-recursive.c:1724 #, c-format msgid "Removing %s" msgstr "" -#: merge-recursive.c:1766 +#: merge-recursive.c:1749 msgid "file/directory" msgstr "" -#: merge-recursive.c:1772 +#: merge-recursive.c:1755 msgid "directory/file" msgstr "" -#: merge-recursive.c:1777 +#: merge-recursive.c:1760 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "" -#: merge-recursive.c:1787 +#: merge-recursive.c:1770 #, c-format msgid "Adding %s" msgstr "" -#: merge-recursive.c:1804 +#: merge-recursive.c:1787 msgid "Fatal merge failure, shouldn't happen." msgstr "" -#: merge-recursive.c:1823 +#: merge-recursive.c:1806 msgid "Already up-to-date!" msgstr "" -#: merge-recursive.c:1832 +#: merge-recursive.c:1815 #, c-format msgid "merging of trees %s and %s failed" msgstr "" -#: merge-recursive.c:1862 +#: merge-recursive.c:1845 #, c-format msgid "Unprocessed path??? %s" msgstr "" -#: merge-recursive.c:1907 +#: merge-recursive.c:1890 msgid "Merging:" msgstr "" -#: merge-recursive.c:1920 +#: merge-recursive.c:1903 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "" msgstr[1] "" -#: merge-recursive.c:1957 +#: merge-recursive.c:1940 msgid "merge returned no commit" msgstr "" -#: merge-recursive.c:2014 +#: merge-recursive.c:1997 #, c-format msgid "Could not parse object '%s'" msgstr "" -#: merge-recursive.c:2026 builtin/merge.c:697 +#: merge-recursive.c:2009 builtin/merge.c:696 msgid "Unable to write index." msgstr "" @@ -632,239 +684,239 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 -#: builtin/merge.c:1088 builtin/merge.c:1098 +#: 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:868 -#: builtin/merge.c:1090 builtin/merge.c:1103 +#: 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:758 sequencer.c:841 +#: 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:324 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "" -#: sequencer.c:329 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "" -#: sequencer.c:395 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "" -#: sequencer.c:398 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "" -#: sequencer.c:413 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -#: sequencer.c:421 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "" -#: sequencer.c:425 +#: 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:436 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "" -#: sequencer.c:440 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "" -#: sequencer.c:524 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "" -#: sequencer.c:525 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "" -#: sequencer.c:553 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "" -#: sequencer.c:561 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "" -#: sequencer.c:566 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "" -#: sequencer.c:624 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "" -#: sequencer.c:646 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "" -#: sequencer.c:651 +#: sequencer.c:663 msgid "No commits parsed." msgstr "" -#: sequencer.c:664 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "" -#: sequencer.c:668 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "" -#: sequencer.c:675 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "" -#: sequencer.c:703 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "" -#: sequencer.c:706 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "" -#: sequencer.c:718 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "" -#: sequencer.c:739 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "" -#: sequencer.c:740 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "" -#: sequencer.c:744 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "" -#: sequencer.c:760 sequencer.c:845 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "" -#: sequencer.c:779 sequencer.c:913 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "" -#: sequencer.c:781 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "" -#: sequencer.c:783 +#: sequencer.c:795 msgid "cannot abort from a branch yet to be born" msgstr "" -#: sequencer.c:805 builtin/apply.c:3988 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "" -#: sequencer.c:808 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "" -#: sequencer.c:809 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "" -#: sequencer.c:815 +#: sequencer.c:827 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" -#: sequencer.c:838 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "" -#: sequencer.c:1000 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "" -#: sequencer.c:1001 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "" @@ -887,12 +939,17 @@ msgstr "" msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "" -#: wrapper.c:413 +#: wrapper.c:408 +#, c-format +msgid "unable to access '%s': %s" +msgstr "" + +#: wrapper.c:426 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "" -#: wrapper.c:414 +#: wrapper.c:427 msgid "no such user" msgstr "" @@ -946,11 +1003,6 @@ msgstr "" msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" -#: wt-status.c:224 -#, c-format -msgid "%s files:" -msgstr "" - #: wt-status.c:227 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" @@ -1151,11 +1203,11 @@ msgid "Initial commit" msgstr "" #: wt-status.c:1011 -msgid "Untracked" +msgid "Untracked files" msgstr "" #: wt-status.c:1013 -msgid "Ignored" +msgid "Ignored files" msgstr "" #: wt-status.c:1015 @@ -1171,67 +1223,83 @@ msgstr "" msgid "No changes" msgstr "" -#: wt-status.c:1027 +#: wt-status.c:1028 #, c-format -msgid "no changes added to commit%s\n" +msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" -#: wt-status.c:1029 -msgid " (use \"git add\" and/or \"git commit -a\")" +#: wt-status.c:1031 +#, c-format +msgid "no changes added to commit\n" msgstr "" -#: wt-status.c:1031 +#: wt-status.c:1034 #, c-format -msgid "nothing added to commit but untracked files present%s\n" +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" msgstr "" -#: wt-status.c:1033 -msgid " (use \"git add\" to track)" +#: wt-status.c:1037 +#, c-format +msgid "nothing added to commit but untracked files present\n" msgstr "" -#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041 +#: wt-status.c:1040 #, c-format -msgid "nothing to commit%s\n" +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" -#: wt-status.c:1036 -msgid " (create/copy files and use \"git add\" to track)" +#: wt-status.c:1043 wt-status.c:1048 +#, c-format +msgid "nothing to commit\n" msgstr "" -#: wt-status.c:1039 -msgid " (use -u to show untracked files)" +#: wt-status.c:1046 +#, c-format +msgid "nothing to commit (use -u to show untracked files)\n" msgstr "" -#: wt-status.c:1042 -msgid " (working directory clean)" +#: wt-status.c:1050 +#, c-format +msgid "nothing to commit, working directory clean\n" msgstr "" -#: wt-status.c:1150 +#: wt-status.c:1158 msgid "HEAD (no branch)" msgstr "" -#: wt-status.c:1156 +#: wt-status.c:1164 msgid "Initial commit on " msgstr "" -#: wt-status.c:1171 +#: wt-status.c:1179 msgid "behind " msgstr "" -#: wt-status.c:1174 wt-status.c:1177 +#: wt-status.c:1182 wt-status.c:1185 msgid "ahead " msgstr "" -#: wt-status.c:1179 +#: wt-status.c:1187 msgid ", behind " msgstr "" +#: compat/precompose_utf8.c:58 builtin/clone.c:341 +#, c-format +msgid "failed to unlink '%s'" +msgstr "" + +#: builtin/add.c:19 +msgid "git add [options] [--] <filepattern>..." +msgstr "" + #: builtin/add.c:62 #, c-format 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 "" @@ -1249,7 +1317,7 @@ msgstr "" msgid "Unstaged changes after refreshing the index:" msgstr "" -#: 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 "" @@ -1286,47 +1354,99 @@ msgstr "" msgid "Could not apply '%s'" msgstr "" -#: builtin/add.c:312 +#: builtin/add.c:313 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" -#: 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 "" + +#: 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 "" + +#: builtin/add.c:322 +msgid "interactive picking" +msgstr "" + +#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248 +msgid "select hunks interactively" +msgstr "" + +#: builtin/add.c:324 +msgid "edit current diff and apply" +msgstr "" + +#: builtin/add.c:325 +msgid "allow adding otherwise ignored files" +msgstr "" + +#: builtin/add.c:326 +msgid "update tracked files" +msgstr "" + +#: builtin/add.c:327 +msgid "record only the fact that the path will be added later" +msgstr "" + +#: builtin/add.c:328 +msgid "add changes from all tracked and untracked files" +msgstr "" + +#: builtin/add.c:329 +msgid "don't add, only refresh the index" +msgstr "" + +#: builtin/add.c:330 +msgid "just skip files which cannot be added because of errors" +msgstr "" + +#: builtin/add.c:331 +msgid "check if - even missing - files are ignored in dry run" +msgstr "" + +#: builtin/add.c:353 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "" -#: builtin/add.c:353 +#: builtin/add.c:354 msgid "no files added" msgstr "" -#: builtin/add.c:359 +#: builtin/add.c:360 msgid "adding files failed" msgstr "" -#: builtin/add.c:391 +#: builtin/add.c:392 msgid "-A and -u are mutually incompatible" msgstr "" -#: builtin/add.c:393 +#: builtin/add.c:394 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "" -#: builtin/add.c:413 +#: builtin/add.c:414 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "" -#: builtin/add.c:414 +#: builtin/add.c:415 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "" -#: 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 "" -#: builtin/add.c:480 builtin/apply.c:4433 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 "" @@ -1344,52 +1464,52 @@ msgstr "" msgid "unrecognized whitespace ignore option '%s'" msgstr "" -#: builtin/apply.c:824 +#: builtin/apply.c:823 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "" -#: builtin/apply.c:833 +#: builtin/apply.c:832 #, c-format msgid "regexec returned %d for input: %s" msgstr "" -#: builtin/apply.c:914 +#: builtin/apply.c:913 #, c-format msgid "unable to find filename in patch at line %d" msgstr "" -#: builtin/apply.c:946 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "" -#: builtin/apply.c:950 +#: builtin/apply.c:949 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "" -#: builtin/apply.c:951 +#: builtin/apply.c:950 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "" -#: builtin/apply.c:958 +#: builtin/apply.c:957 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "" -#: builtin/apply.c:1403 +#: builtin/apply.c:1420 #, c-format msgid "recount: unexpected line: %.*s" msgstr "" -#: builtin/apply.c:1460 +#: builtin/apply.c:1477 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "" -#: builtin/apply.c:1477 +#: builtin/apply.c:1494 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -1400,403 +1520,400 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/apply.c:1637 +#: builtin/apply.c:1654 msgid "new file depends on old contents" msgstr "" -#: builtin/apply.c:1639 +#: builtin/apply.c:1656 msgid "deleted file still has contents" msgstr "" -#: builtin/apply.c:1665 +#: builtin/apply.c:1682 #, c-format msgid "corrupt patch at line %d" msgstr "" -#: builtin/apply.c:1701 +#: builtin/apply.c:1718 #, c-format msgid "new file %s depends on old contents" msgstr "" -#: builtin/apply.c:1703 +#: builtin/apply.c:1720 #, c-format msgid "deleted file %s still has contents" msgstr "" -#: builtin/apply.c:1706 +#: builtin/apply.c:1723 #, c-format msgid "** warning: file %s becomes empty but is not deleted" msgstr "" -#: builtin/apply.c:1852 +#: builtin/apply.c:1869 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "" #. there has to be one hunk (forward hunk) -#: builtin/apply.c:1881 +#: builtin/apply.c:1898 #, c-format msgid "unrecognized binary patch at line %d" msgstr "" -#: builtin/apply.c:1967 +#: builtin/apply.c:1984 #, c-format msgid "patch with only garbage at line %d" msgstr "" -#: builtin/apply.c:2057 +#: builtin/apply.c:2074 #, c-format msgid "unable to read symlink %s" msgstr "" -#: builtin/apply.c:2061 +#: builtin/apply.c:2078 #, c-format msgid "unable to open or read %s" msgstr "" -#: builtin/apply.c:2132 +#: builtin/apply.c:2149 msgid "oops" msgstr "" -#: builtin/apply.c:2654 +#: builtin/apply.c:2671 #, c-format msgid "invalid start of line: '%c'" msgstr "" -#: builtin/apply.c:2772 +#: 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] "" msgstr[1] "" -#: builtin/apply.c:2784 +#: builtin/apply.c:2801 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "" -#: builtin/apply.c:2790 +#: builtin/apply.c:2807 #, c-format msgid "" "while searching for:\n" "%.*s" msgstr "" -#: builtin/apply.c:2809 +#: builtin/apply.c:2826 #, c-format msgid "missing binary patch data for '%s'" msgstr "" -#: builtin/apply.c:2912 +#: builtin/apply.c:2929 #, c-format msgid "binary patch does not apply to '%s'" msgstr "" -#: builtin/apply.c:2918 +#: builtin/apply.c:2935 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" msgstr "" -#: builtin/apply.c:2939 +#: builtin/apply.c:2956 #, c-format msgid "patch failed: %s:%ld" msgstr "" -#: builtin/apply.c:3061 +#: builtin/apply.c:3078 #, c-format msgid "cannot checkout %s" msgstr "" -#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159 +#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176 #, c-format msgid "read of %s failed" msgstr "" -#: builtin/apply.c:3139 builtin/apply.c:3361 +#: builtin/apply.c:3156 builtin/apply.c:3378 #, c-format msgid "path %s has been renamed/deleted" msgstr "" -#: builtin/apply.c:3220 builtin/apply.c:3375 +#: builtin/apply.c:3237 builtin/apply.c:3392 #, c-format msgid "%s: does not exist in index" msgstr "" -#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389 +#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406 #, c-format msgid "%s: %s" msgstr "" -#: builtin/apply.c:3229 builtin/apply.c:3383 +#: builtin/apply.c:3246 builtin/apply.c:3400 #, c-format msgid "%s: does not match index" msgstr "" -#: builtin/apply.c:3331 +#: builtin/apply.c:3348 msgid "removal patch leaves file contents" msgstr "" -#: builtin/apply.c:3400 +#: builtin/apply.c:3417 #, c-format msgid "%s: wrong type" msgstr "" -#: builtin/apply.c:3402 +#: builtin/apply.c:3419 #, c-format msgid "%s has type %o, expected %o" msgstr "" -#: builtin/apply.c:3503 +#: builtin/apply.c:3520 #, c-format msgid "%s: already exists in index" msgstr "" -#: builtin/apply.c:3506 +#: builtin/apply.c:3523 #, c-format msgid "%s: already exists in working directory" msgstr "" -#: builtin/apply.c:3526 +#: builtin/apply.c:3543 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "" -#: builtin/apply.c:3531 +#: builtin/apply.c:3548 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "" -#: builtin/apply.c:3539 +#: builtin/apply.c:3556 #, c-format msgid "%s: patch does not apply" msgstr "" -#: builtin/apply.c:3552 +#: builtin/apply.c:3569 #, c-format msgid "Checking patch %s..." msgstr "" -#: builtin/apply.c:3607 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 "" -#: builtin/apply.c:3750 +#: builtin/apply.c:3767 #, c-format msgid "unable to remove %s from index" msgstr "" -#: builtin/apply.c:3778 +#: builtin/apply.c:3795 #, c-format msgid "corrupt patch for subproject %s" msgstr "" -#: builtin/apply.c:3782 +#: builtin/apply.c:3799 #, c-format msgid "unable to stat newly created file '%s'" msgstr "" -#: builtin/apply.c:3787 +#: builtin/apply.c:3804 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "" -#: builtin/apply.c:3790 builtin/apply.c:3898 +#: builtin/apply.c:3807 builtin/apply.c:3915 #, c-format msgid "unable to add cache entry for %s" msgstr "" -#: builtin/apply.c:3823 +#: builtin/apply.c:3840 #, c-format msgid "closing file '%s'" msgstr "" -#: builtin/apply.c:3872 +#: builtin/apply.c:3889 #, c-format msgid "unable to write file '%s' mode %o" msgstr "" -#: builtin/apply.c:3959 +#: builtin/apply.c:3976 #, c-format msgid "Applied patch %s cleanly." msgstr "" -#: builtin/apply.c:3967 +#: builtin/apply.c:3984 msgid "internal error" msgstr "" #. Say this even without --verbose -#: builtin/apply.c:3970 +#: builtin/apply.c:3987 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "" msgstr[1] "" -#: builtin/apply.c:3980 +#: builtin/apply.c:3997 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "" -#: builtin/apply.c:4001 +#: builtin/apply.c:4018 #, c-format msgid "Hunk #%d applied cleanly." msgstr "" -#: builtin/apply.c:4004 +#: builtin/apply.c:4021 #, c-format msgid "Rejected hunk #%d." msgstr "" -#: builtin/apply.c:4154 +#: builtin/apply.c:4171 msgid "unrecognized input" msgstr "" -#: builtin/apply.c:4165 +#: builtin/apply.c:4182 msgid "unable to read index file" msgstr "" -#: builtin/apply.c:4284 builtin/apply.c:4287 +#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91 +#: builtin/fetch.c:63 msgid "path" msgstr "" -#: builtin/apply.c:4285 +#: builtin/apply.c:4302 msgid "don't apply changes matching the given path" msgstr "" -#: builtin/apply.c:4288 +#: builtin/apply.c:4305 msgid "apply changes matching the given path" msgstr "" -#: builtin/apply.c:4290 +#: builtin/apply.c:4307 msgid "num" msgstr "" -#: builtin/apply.c:4291 +#: builtin/apply.c:4308 msgid "remove <num> leading slashes from traditional diff paths" msgstr "" -#: builtin/apply.c:4294 +#: builtin/apply.c:4311 msgid "ignore additions made by the patch" msgstr "" -#: builtin/apply.c:4296 +#: builtin/apply.c:4313 msgid "instead of applying the patch, output diffstat for the input" msgstr "" -#: builtin/apply.c:4300 -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 "" -#: builtin/apply.c:4302 +#: builtin/apply.c:4319 msgid "instead of applying the patch, output a summary for the input" msgstr "" -#: builtin/apply.c:4304 +#: builtin/apply.c:4321 msgid "instead of applying the patch, see if the patch is applicable" msgstr "" -#: builtin/apply.c:4306 +#: builtin/apply.c:4323 msgid "make sure the patch is applicable to the current index" msgstr "" -#: builtin/apply.c:4308 +#: builtin/apply.c:4325 msgid "apply a patch without touching the working tree" msgstr "" -#: builtin/apply.c:4310 +#: builtin/apply.c:4327 msgid "also apply the patch (use with --stat/--summary/--check)" msgstr "" -#: builtin/apply.c:4312 +#: builtin/apply.c:4329 msgid "attempt three-way merge if a patch does not apply" msgstr "" -#: builtin/apply.c:4314 +#: builtin/apply.c:4331 msgid "build a temporary index based on embedded index information" msgstr "" -#: builtin/apply.c:4316 +#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460 msgid "paths are separated with NUL character" msgstr "" -#: builtin/apply.c:4319 +#: builtin/apply.c:4336 msgid "ensure at least <n> lines of context match" msgstr "" -#: builtin/apply.c:4320 +#: builtin/apply.c:4337 msgid "action" msgstr "" -#: builtin/apply.c:4321 +#: builtin/apply.c:4338 msgid "detect new or modified lines that have whitespace errors" msgstr "" -#: builtin/apply.c:4324 builtin/apply.c:4327 +#: builtin/apply.c:4341 builtin/apply.c:4344 msgid "ignore changes in whitespace when finding context" msgstr "" -#: builtin/apply.c:4330 +#: builtin/apply.c:4347 msgid "apply the patch in reverse" msgstr "" -#: builtin/apply.c:4332 +#: builtin/apply.c:4349 msgid "don't expect at least one line of context" msgstr "" -#: builtin/apply.c:4334 +#: builtin/apply.c:4351 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "" -#: builtin/apply.c:4336 +#: builtin/apply.c:4353 msgid "allow overlapping hunks" msgstr "" -#: builtin/apply.c:4337 -msgid "be verbose" -msgstr "" - -#: builtin/apply.c:4339 +#: builtin/apply.c:4356 msgid "tolerate incorrectly detected missing new-line at the end of file" msgstr "" -#: builtin/apply.c:4342 +#: builtin/apply.c:4359 msgid "do not trust the line counts in the hunk headers" msgstr "" -#: builtin/apply.c:4344 +#: builtin/apply.c:4361 msgid "root" msgstr "" -#: builtin/apply.c:4345 +#: builtin/apply.c:4362 msgid "prepend <root> to all filenames" msgstr "" -#: builtin/apply.c:4367 +#: builtin/apply.c:4384 msgid "--3way outside a repository" msgstr "" -#: builtin/apply.c:4375 +#: builtin/apply.c:4392 msgid "--index outside a repository" msgstr "" -#: builtin/apply.c:4378 +#: builtin/apply.c:4395 msgid "--cached outside a repository" msgstr "" -#: builtin/apply.c:4394 +#: builtin/apply.c:4411 #, c-format msgid "can't open patch '%s'" msgstr "" -#: builtin/apply.c:4408 +#: builtin/apply.c:4425 #, c-format msgid "squelched %d whitespace error" msgid_plural "squelched %d whitespace errors" msgstr[0] "" msgstr[1] "" -#: builtin/apply.c:4414 builtin/apply.c:4424 +#: builtin/apply.c:4431 builtin/apply.c:4441 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -1838,175 +1955,428 @@ msgstr "" msgid "git archive: expected a flush" msgstr "" -#: builtin/branch.c:144 +#: builtin/bisect--helper.c:7 +msgid "git bisect--helper --next-all [--no-checkout]" +msgstr "" + +#: builtin/bisect--helper.c:17 +msgid "perform 'git bisect next'" +msgstr "" + +#: builtin/bisect--helper.c:19 +msgid "update BISECT_HEAD instead of checking out the current commit" +msgstr "" + +#: builtin/blame.c:25 +msgid "git blame [options] [rev-opts] [rev] [--] file" +msgstr "" + +#: builtin/blame.c:30 builtin/shortlog.c:15 +msgid "[rev-opts] are documented in git-rev-list(1)" +msgstr "" + +#: builtin/blame.c:2373 +msgid "Show blame entries as we find them, incrementally" +msgstr "" + +#: builtin/blame.c:2374 +msgid "Show blank SHA-1 for boundary commits (Default: off)" +msgstr "" + +#: builtin/blame.c:2375 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "" + +#: builtin/blame.c:2376 +msgid "Show work cost statistics" +msgstr "" + +#: builtin/blame.c:2377 +msgid "Show output score for blame entries" +msgstr "" + +#: builtin/blame.c:2378 +msgid "Show original filename (Default: auto)" +msgstr "" + +#: builtin/blame.c:2379 +msgid "Show original linenumber (Default: off)" +msgstr "" + +#: builtin/blame.c:2380 +msgid "Show in a format designed for machine consumption" +msgstr "" + +#: builtin/blame.c:2381 +msgid "Show porcelain format with per-line commit information" +msgstr "" + +#: builtin/blame.c:2382 +msgid "Use the same output mode as git-annotate (Default: off)" +msgstr "" + +#: builtin/blame.c:2383 +msgid "Show raw timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2384 +msgid "Show long commit SHA1 (Default: off)" +msgstr "" + +#: builtin/blame.c:2385 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2386 +msgid "Show author email instead of name (Default: off)" +msgstr "" + +#: builtin/blame.c:2387 +msgid "Ignore whitespace differences" +msgstr "" + +#: builtin/blame.c:2388 +msgid "Spend extra cycles to find better match" +msgstr "" + +#: builtin/blame.c:2389 +msgid "Use revisions from <file> instead of calling git-rev-list" +msgstr "" + +#: builtin/blame.c:2390 +msgid "Use <file>'s contents as the final image" +msgstr "" + +#: builtin/blame.c:2391 builtin/blame.c:2392 +msgid "score" +msgstr "" + +#: builtin/blame.c:2391 +msgid "Find line copies within and across files" +msgstr "" + +#: builtin/blame.c:2392 +msgid "Find line movements within and across files" +msgstr "" + +#: builtin/blame.c:2393 +msgid "n,m" +msgstr "" + +#: builtin/blame.c:2393 +msgid "Process only line range n,m, counting from 1" +msgstr "" + +#: builtin/branch.c:23 +msgid "git branch [options] [-r | -a] [--merged | --no-merged]" +msgstr "" + +#: builtin/branch.c:24 +msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]" +msgstr "" + +#: builtin/branch.c:25 +msgid "git branch [options] [-r] (-d | -D) <branchname>..." +msgstr "" + +#: builtin/branch.c:26 +msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>" +msgstr "" + +#: builtin/branch.c:145 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD." msgstr "" -#: 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 "" -#: builtin/branch.c:180 +#: builtin/branch.c:181 msgid "cannot use -a with -d" msgstr "" -#: builtin/branch.c:186 +#: builtin/branch.c:187 msgid "Couldn't look up commit object for HEAD" msgstr "" -#: builtin/branch.c:191 +#: builtin/branch.c:192 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "" -#: builtin/branch.c:202 +#: builtin/branch.c:203 #, c-format msgid "remote branch '%s' not found." msgstr "" -#: builtin/branch.c:203 +#: builtin/branch.c:204 #, c-format msgid "branch '%s' not found." msgstr "" -#: builtin/branch.c:210 +#: builtin/branch.c:211 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "" -#: 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 "" -#: builtin/branch.c:225 +#: builtin/branch.c:226 #, c-format msgid "Error deleting remote branch '%s'" msgstr "" -#: builtin/branch.c:226 +#: builtin/branch.c:227 #, c-format msgid "Error deleting branch '%s'" msgstr "" -#: builtin/branch.c:233 +#: builtin/branch.c:234 #, c-format msgid "Deleted remote branch %s (was %s).\n" msgstr "" -#: builtin/branch.c:234 +#: builtin/branch.c:235 #, c-format msgid "Deleted branch %s (was %s).\n" msgstr "" -#: builtin/branch.c:239 +#: builtin/branch.c:240 msgid "Update of config-file failed" msgstr "" -#: builtin/branch.c:337 +#: builtin/branch.c:338 #, c-format msgid "branch '%s' does not point at a commit" msgstr "" -#: builtin/branch.c:409 +#: builtin/branch.c:410 #, c-format msgid "[%s: behind %d]" msgstr "" -#: builtin/branch.c:411 +#: builtin/branch.c:412 #, c-format msgid "[behind %d]" msgstr "" -#: builtin/branch.c:415 +#: builtin/branch.c:416 #, c-format msgid "[%s: ahead %d]" msgstr "" -#: builtin/branch.c:417 +#: builtin/branch.c:418 #, c-format msgid "[ahead %d]" msgstr "" -#: builtin/branch.c:420 +#: builtin/branch.c:421 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "" -#: builtin/branch.c:423 +#: builtin/branch.c:424 #, c-format msgid "[ahead %d, behind %d]" msgstr "" -#: builtin/branch.c:535 +#: builtin/branch.c:537 msgid "(no branch)" msgstr "" -#: builtin/branch.c:600 +#: builtin/branch.c:602 msgid "some refs could not be read" msgstr "" -#: builtin/branch.c:613 +#: builtin/branch.c:615 msgid "cannot rename the current branch while not on any." msgstr "" -#: builtin/branch.c:623 +#: builtin/branch.c:625 #, c-format msgid "Invalid branch name: '%s'" msgstr "" -#: builtin/branch.c:638 +#: builtin/branch.c:640 msgid "Branch rename failed" msgstr "" -#: builtin/branch.c:642 +#: builtin/branch.c:644 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "" -#: builtin/branch.c:646 +#: builtin/branch.c:648 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "" -#: builtin/branch.c:653 +#: builtin/branch.c:655 msgid "Branch is renamed, but update of config-file failed" msgstr "" -#: builtin/branch.c:668 +#: builtin/branch.c:670 #, c-format msgid "malformed object name %s" msgstr "" -#: builtin/branch.c:692 +#: builtin/branch.c:694 #, c-format msgid "could not write branch description template: %s" msgstr "" -#: builtin/branch.c:783 +#: builtin/branch.c:724 +msgid "Generic options" +msgstr "" + +#: builtin/branch.c:726 +msgid "show hash and subject, give twice for upstream branch" +msgstr "" + +#: builtin/branch.c:727 +msgid "suppress informational messages" +msgstr "" + +#: builtin/branch.c:728 +msgid "set up tracking mode (see git-pull(1))" +msgstr "" + +#: builtin/branch.c:730 +msgid "change upstream info" +msgstr "" + +#: builtin/branch.c:734 +msgid "use colored output" +msgstr "" + +#: builtin/branch.c:735 +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:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 +msgid "commit" +msgstr "" + +#: builtin/branch.c:739 builtin/branch.c:745 +msgid "print only branches that contain the commit" +msgstr "" + +#: builtin/branch.c:751 +msgid "Specific git-branch actions:" +msgstr "" + +#: builtin/branch.c:752 +msgid "list both remote-tracking and local branches" +msgstr "" + +#: builtin/branch.c:754 +msgid "delete fully merged branch" +msgstr "" + +#: builtin/branch.c:755 +msgid "delete branch (even if not merged)" +msgstr "" + +#: builtin/branch.c:756 +msgid "move/rename a branch and its reflog" +msgstr "" + +#: builtin/branch.c:757 +msgid "move/rename a branch, even if target exists" +msgstr "" + +#: builtin/branch.c:758 +msgid "list branch names" +msgstr "" + +#: builtin/branch.c:759 +msgid "create the branch's reflog" +msgstr "" + +#: builtin/branch.c:761 +msgid "edit the description for the branch" +msgstr "" + +#: builtin/branch.c:762 +msgid "force creation (when already exists)" +msgstr "" + +#: builtin/branch.c:765 +msgid "print only not merged branches" +msgstr "" + +#: builtin/branch.c:771 +msgid "print only merged branches" +msgstr "" + +#: builtin/branch.c:775 +msgid "list branches in columns" +msgstr "" + +#: builtin/branch.c:788 msgid "Failed to resolve HEAD as a valid ref." msgstr "" -#: builtin/branch.c:788 builtin/clone.c:561 +#: builtin/branch.c:793 builtin/clone.c:561 msgid "HEAD not found below refs/heads!" msgstr "" -#: builtin/branch.c:808 +#: builtin/branch.c:813 msgid "--column and --verbose are incompatible" msgstr "" -#: builtin/branch.c:857 +#: builtin/branch.c:864 +#, c-format +msgid "branch '%s' does not exist" +msgstr "" + +#: builtin/branch.c:876 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "" + +#: builtin/branch.c:891 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" +#: 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 "" + +#: builtin/branch.c:911 +#, c-format +msgid "" +"\n" +"If you wanted to make '%s' track '%s', do this:\n" +"\n" +msgstr "" + +#: builtin/branch.c:912 +#, c-format +msgid " git branch -d %s\n" +msgstr "" + +#: builtin/branch.c:913 +#, c-format +msgid " git branch --set-upstream-to %s\n" +msgstr "" + #: builtin/bundle.c:47 #, c-format msgid "%s is okay\n" @@ -2020,99 +2390,227 @@ msgstr "" msgid "Need a repository to unbundle." msgstr "" -#: 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 "" + +#: builtin/cat-file.c:248 +msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" +msgstr "" + +#: builtin/cat-file.c:266 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "" + +#: builtin/cat-file.c:267 +msgid "show object type" +msgstr "" + +#: builtin/cat-file.c:268 +msgid "show object size" +msgstr "" + +#: builtin/cat-file.c:270 +msgid "exit with zero when there's no error" +msgstr "" + +#: builtin/cat-file.c:271 +msgid "pretty-print object's content" +msgstr "" + +#: builtin/cat-file.c:273 +msgid "for blob objects, run textconv on object's content" +msgstr "" + +#: builtin/cat-file.c:275 +msgid "show info and content of objects fed from the standard input" +msgstr "" + +#: builtin/cat-file.c:278 +msgid "show info about objects fed from the standard input" +msgstr "" + +#: builtin/check-attr.c:11 +msgid "git check-attr [-a | --all | attr...] [--] pathname..." +msgstr "" + +#: builtin/check-attr.c:12 +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>" +msgstr "" + +#: builtin/check-attr.c:19 +msgid "report all attributes set on file" +msgstr "" + +#: builtin/check-attr.c:20 +msgid "use .gitattributes only from the index" +msgstr "" + +#: builtin/check-attr.c:21 builtin/hash-object.c:75 +msgid "read file names from stdin" +msgstr "" + +#: builtin/check-attr.c:23 +msgid "input paths are terminated by a null character" +msgstr "" + +#: builtin/checkout-index.c:126 +msgid "git checkout-index [options] [--] [<file>...]" +msgstr "" + +#: builtin/checkout-index.c:187 +msgid "check out all files in the index" +msgstr "" + +#: builtin/checkout-index.c:188 +msgid "force overwrite of existing files" +msgstr "" + +#: builtin/checkout-index.c:190 +msgid "no warning for existing files and files not in index" +msgstr "" + +#: builtin/checkout-index.c:192 +msgid "don't checkout new files" +msgstr "" + +#: builtin/checkout-index.c:194 +msgid "update stat information in the index file" +msgstr "" + +#: builtin/checkout-index.c:200 +msgid "read list of paths from the standard input" +msgstr "" + +#: builtin/checkout-index.c:202 +msgid "write the content to temporary files" +msgstr "" + +#: builtin/checkout-index.c:203 builtin/column.c:30 +msgid "string" +msgstr "" + +#: builtin/checkout-index.c:204 +msgid "when creating files, prepend <string>" +msgstr "" + +#: builtin/checkout-index.c:207 +msgid "copy out the files from named stage" +msgstr "" + +#: builtin/checkout.c:25 +msgid "git checkout [options] <branch>" +msgstr "" + +#: builtin/checkout.c:26 +msgid "git checkout [options] [<branch>] -- <file>..." +msgstr "" + +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have our version" msgstr "" -#: 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 "" -#: builtin/checkout.c:132 +#: builtin/checkout.c:134 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "" -#: builtin/checkout.c:176 +#: builtin/checkout.c:178 #, c-format msgid "path '%s' does not have necessary versions" msgstr "" -#: builtin/checkout.c:193 +#: builtin/checkout.c:195 #, c-format msgid "path '%s': cannot merge" msgstr "" -#: builtin/checkout.c:210 +#: builtin/checkout.c:212 #, c-format msgid "Unable to add merge result for '%s'" msgstr "" -#: builtin/checkout.c:235 builtin/checkout.c:393 +#: 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 "" + +#: builtin/checkout.c:248 builtin/checkout.c:251 +#, c-format +msgid "'%s' cannot be used with %s" +msgstr "" + +#: builtin/checkout.c:254 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "" + +#: builtin/checkout.c:265 builtin/checkout.c:426 msgid "corrupt index file" msgstr "" -#: builtin/checkout.c:265 builtin/checkout.c:272 +#: builtin/checkout.c:295 builtin/checkout.c:302 #, c-format msgid "path '%s' is unmerged" msgstr "" -#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586 -#: builtin/merge.c:812 +#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586 +#: builtin/merge.c:811 msgid "unable to write new index file" msgstr "" -#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "" - -#: builtin/checkout.c:415 +#: builtin/checkout.c:448 msgid "you need to resolve your current index first" msgstr "" -#: builtin/checkout.c:534 +#: builtin/checkout.c:569 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "" -#: builtin/checkout.c:567 +#: builtin/checkout.c:602 msgid "HEAD is now at" msgstr "" -#: builtin/checkout.c:574 +#: builtin/checkout.c:609 #, c-format msgid "Reset branch '%s'\n" msgstr "" -#: builtin/checkout.c:577 +#: builtin/checkout.c:612 #, c-format msgid "Already on '%s'\n" msgstr "" -#: builtin/checkout.c:581 +#: builtin/checkout.c:616 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "" -#: builtin/checkout.c:583 +#: builtin/checkout.c:618 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "" -#: builtin/checkout.c:585 +#: builtin/checkout.c:620 #, c-format msgid "Switched to branch '%s'\n" msgstr "" -#: builtin/checkout.c:641 +#: builtin/checkout.c:676 #, c-format msgid " ... and %d more.\n" msgstr "" #. The singular version -#: builtin/checkout.c:647 +#: builtin/checkout.c:682 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2127,7 +2625,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/checkout.c:665 +#: 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" @@ -2137,97 +2635,184 @@ msgid "" "\n" msgstr "" -#: builtin/checkout.c:695 +#: builtin/checkout.c:730 msgid "internal error in revision walk" msgstr "" -#: builtin/checkout.c:699 +#: builtin/checkout.c:734 msgid "Previous HEAD position was" msgstr "" -#: builtin/checkout.c:725 builtin/checkout.c:920 +#: builtin/checkout.c:761 builtin/checkout.c:950 msgid "You are on a branch yet to be born" msgstr "" #. case (1) -#: builtin/checkout.c:856 +#: builtin/checkout.c:886 #, c-format msgid "invalid reference: %s" msgstr "" #. case (1): want a tree -#: builtin/checkout.c:895 +#: builtin/checkout.c:925 #, c-format msgid "reference is not a tree: %s" msgstr "" -#: builtin/checkout.c:977 -msgid "-B cannot be used with -b" +#: builtin/checkout.c:961 +msgid "paths cannot be used with switching branches" msgstr "" -#: builtin/checkout.c:986 -msgid "--patch is incompatible with all other options" +#: builtin/checkout.c:964 builtin/checkout.c:968 +#, c-format +msgid "'%s' cannot be used with switching branches" msgstr "" -#: builtin/checkout.c:989 -msgid "--detach cannot be used with -b/-B/--orphan" +#: 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 "" -#: builtin/checkout.c:991 -msgid "--detach cannot be used with -t" +#: builtin/checkout.c:988 +#, c-format +msgid "Cannot switch branch to a non-commit '%s'" msgstr "" -#: builtin/checkout.c:997 -msgid "--track needs a branch name" +#: builtin/checkout.c:1009 builtin/gc.c:177 +msgid "suppress progress reporting" msgstr "" -#: builtin/checkout.c:1004 -msgid "Missing branch name; try -b" +#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89 +#: builtin/remote.c:169 builtin/remote.c:171 +msgid "branch" +msgstr "" + +#: builtin/checkout.c:1011 +msgid "create and checkout a new branch" +msgstr "" + +#: builtin/checkout.c:1013 +msgid "create/reset and checkout a branch" +msgstr "" + +#: builtin/checkout.c:1014 +msgid "create reflog for new branch" +msgstr "" + +#: builtin/checkout.c:1015 +msgid "detach the HEAD at named commit" msgstr "" -#: builtin/checkout.c:1010 -msgid "--orphan and -b|-B are mutually exclusive" +#: builtin/checkout.c:1016 +msgid "set upstream info for new branch" msgstr "" -#: builtin/checkout.c:1012 -msgid "--orphan cannot be used with -t" +#: builtin/checkout.c:1018 +msgid "new branch" msgstr "" -#: builtin/checkout.c:1022 -msgid "git checkout: -f and -m are incompatible" +#: builtin/checkout.c:1018 +msgid "new unparented branch" msgstr "" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1019 +msgid "checkout our version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1021 +msgid "checkout their version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1023 +msgid "force checkout (throw away local modifications)" +msgstr "" + +#: builtin/checkout.c:1024 +msgid "perform a 3-way merge with the new branch" +msgstr "" + +#: builtin/checkout.c:1025 builtin/merge.c:215 +msgid "update ignored files (default)" +msgstr "" + +#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241 +msgid "style" +msgstr "" + +#: builtin/checkout.c:1027 +msgid "conflict style (merge or diff3)" +msgstr "" + +#: builtin/checkout.c:1030 +msgid "second guess 'git checkout no-such-branch'" +msgstr "" + +#: builtin/checkout.c:1054 +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "" + +#: builtin/checkout.c:1071 +msgid "--track needs a branch name" +msgstr "" + +#: builtin/checkout.c:1078 +msgid "Missing branch name; try -b" +msgstr "" + +#: builtin/checkout.c:1113 msgid "invalid path specification" msgstr "" -#: builtin/checkout.c:1064 +#: 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 "" -#: builtin/checkout.c:1066 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "" - -#: builtin/checkout.c:1071 -msgid "git checkout: --detach does not take a path argument" +#: builtin/checkout.c:1125 +#, c-format +msgid "git checkout: --detach does not take a path argument '%s'" msgstr "" -#: builtin/checkout.c:1074 +#: builtin/checkout.c:1129 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" -#: builtin/checkout.c:1093 -msgid "Cannot switch branch to a non-commit." +#: builtin/clean.c:19 +msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +msgstr "" + +#: builtin/clean.c:51 +msgid "do not print names of files removed" +msgstr "" + +#: builtin/clean.c:53 +msgid "force" +msgstr "" + +#: builtin/clean.c:55 +msgid "remove whole directories" msgstr "" -#: builtin/checkout.c:1096 -msgid "--ours/--theirs is incompatible with switching branches." +#: 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 "" + +#: builtin/clean.c:57 +msgid "add <pattern> to ignore rules" +msgstr "" + +#: builtin/clean.c:58 +msgid "remove ignored files, too" +msgstr "" + +#: builtin/clean.c:60 +msgid "remove only ignored files" msgstr "" #: builtin/clean.c:78 @@ -2270,6 +2855,99 @@ msgstr "" msgid "Not removing %s\n" msgstr "" +#: builtin/clone.c:36 +msgid "git clone [options] [--] <repo> [<dir>]" +msgstr "" + +#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212 +#: builtin/push.c:399 +msgid "force progress reporting" +msgstr "" + +#: builtin/clone.c:66 +msgid "don't create a checkout" +msgstr "" + +#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488 +msgid "create a bare repository" +msgstr "" + +#: builtin/clone.c:72 +msgid "create a mirror repository (implies bare)" +msgstr "" + +#: builtin/clone.c:74 +msgid "to clone from a local repository" +msgstr "" + +#: builtin/clone.c:76 +msgid "don't use local hardlinks, always copy" +msgstr "" + +#: builtin/clone.c:78 +msgid "setup as shared repository" +msgstr "" + +#: builtin/clone.c:80 builtin/clone.c:82 +msgid "initialize submodules in the clone" +msgstr "" + +#: builtin/clone.c:83 builtin/init-db.c:485 +msgid "template-directory" +msgstr "" + +#: builtin/clone.c:84 builtin/init-db.c:486 +msgid "directory from which templates will be used" +msgstr "" + +#: builtin/clone.c:86 +msgid "reference repository" +msgstr "" + +#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +msgid "name" +msgstr "" + +#: builtin/clone.c:88 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "" + +#: builtin/clone.c:90 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "" + +#: builtin/clone.c:92 +msgid "path to git-upload-pack on the remote" +msgstr "" + +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 +msgid "depth" +msgstr "" + +#: builtin/clone.c:94 +msgid "create a shallow clone of that depth" +msgstr "" + +#: builtin/clone.c:96 +msgid "clone only one branch, HEAD or --branch" +msgstr "" + +#: builtin/clone.c:97 builtin/init-db.c:494 +msgid "gitdir" +msgstr "" + +#: builtin/clone.c:98 builtin/init-db.c:495 +msgid "separate git dir from working tree" +msgstr "" + +#: builtin/clone.c:99 +msgid "key=value" +msgstr "" + +#: builtin/clone.c:100 +msgid "set config inside the new repository" +msgstr "" + #: builtin/clone.c:243 #, c-format msgid "reference repository '%s' is not a local directory." @@ -2280,7 +2958,7 @@ msgstr "" msgid "failed to create directory '%s'" msgstr "" -#: builtin/clone.c:308 builtin/diff.c:75 +#: builtin/clone.c:308 builtin/diff.c:77 #, c-format msgid "failed to stat '%s'" msgstr "" @@ -2295,11 +2973,6 @@ msgstr "" msgid "failed to stat %s\n" msgstr "" -#: builtin/clone.c:341 -#, c-format -msgid "failed to unlink '%s'" -msgstr "" - #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" @@ -2324,77 +2997,113 @@ 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 "" +#: builtin/column.c:9 +msgid "git column [options]" +msgstr "" + +#: builtin/column.c:26 +msgid "lookup config vars" +msgstr "" + +#: builtin/column.c:27 builtin/column.c:28 +msgid "layout to use" +msgstr "" + +#: builtin/column.c:29 +msgid "Maximum width" +msgstr "" + +#: builtin/column.c:30 +msgid "Padding space on left border" +msgstr "" + +#: builtin/column.c:31 +msgid "Padding space on right border" +msgstr "" + +#: builtin/column.c:32 +msgid "Padding space between columns" +msgstr "" + #: builtin/column.c:51 msgid "--command must be the first argument" msgstr "" -#: builtin/commit.c:43 +#: builtin/commit.c:34 +msgid "git commit [options] [--] <filepattern>..." +msgstr "" + +#: builtin/commit.c:39 +msgid "git status [options] [--] <filepattern>..." +msgstr "" + +#: 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" @@ -2408,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" @@ -2425,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:496 builtin/commit.c:502 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "" -#: builtin/commit.c:525 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "" -#: builtin/commit.c:585 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "" -#: 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 "" -#: 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 "" -#: builtin/commit.c:637 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "" -#: builtin/commit.c:641 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "" -#: builtin/commit.c:647 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "" -#: builtin/commit.c:663 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "" -#: builtin/commit.c:667 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "" -#: builtin/commit.c:671 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "" -#: builtin/commit.c:723 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "" -#: builtin/commit.c:734 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -2521,7 +3230,7 @@ msgid "" "and try again.\n" msgstr "" -#: builtin/commit.c:739 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -2531,177 +3240,490 @@ msgid "" "and try again.\n" msgstr "" -#: 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 "" -#: 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" "An empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:769 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "" -#: builtin/commit.c:776 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "" -#: builtin/commit.c:796 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "" -#: builtin/commit.c:833 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "" -#: 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 "" -#: builtin/commit.c:945 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "" -#: 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 "" -#: builtin/commit.c:1000 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "" -#: builtin/commit.c:1011 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "" -#: builtin/commit.c:1014 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "" -#: builtin/commit.c:1016 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" -#: builtin/commit.c:1019 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "" -#: builtin/commit.c:1029 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "" -#: builtin/commit.c:1031 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "" -#: builtin/commit.c:1039 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" -#: builtin/commit.c:1056 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" -#: builtin/commit.c:1058 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "" -#: builtin/commit.c:1060 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "" -#: builtin/commit.c:1062 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -#: builtin/commit.c:1072 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "" -#: builtin/commit.c:1077 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "" -#: builtin/commit.c:1260 +#: builtin/commit.c:1156 builtin/commit.c:1384 +msgid "show status concisely" +msgstr "" + +#: builtin/commit.c:1158 builtin/commit.c:1386 +msgid "show branch information" +msgstr "" + +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 +msgid "machine-readable output" +msgstr "" + +#: builtin/commit.c:1163 builtin/commit.c:1390 +msgid "terminate entries with NUL" +msgstr "" + +#: 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:1166 builtin/commit.c:1393 +msgid "show untracked files, optional modes: all, normal, no. (Default: all)" +msgstr "" + +#: builtin/commit.c:1169 +msgid "show ignored files" +msgstr "" + +#: builtin/commit.c:1170 parse-options.h:151 +msgid "when" +msgstr "" + +#: builtin/commit.c:1171 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "" + +#: builtin/commit.c:1173 +msgid "list untracked files in columns" +msgstr "" + +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "" -#: builtin/commit.c:1262 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "" -#: builtin/commit.c:1303 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "" -#: builtin/commit.c:1305 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr "" -#: builtin/commit.c:1449 +#: builtin/commit.c:1354 +msgid "suppress summary after successful commit" +msgstr "" + +#: builtin/commit.c:1355 +msgid "show diff in commit message template" +msgstr "" + +#: builtin/commit.c:1357 +msgid "Commit message options" +msgstr "" + +#: builtin/commit.c:1358 builtin/tag.c:459 +msgid "read message from file" +msgstr "" + +#: builtin/commit.c:1359 +msgid "author" +msgstr "" + +#: builtin/commit.c:1359 +msgid "override author for commit" +msgstr "" + +#: builtin/commit.c:1360 builtin/gc.c:178 +msgid "date" +msgstr "" + +#: builtin/commit.c:1360 +msgid "override date for commit" +msgstr "" + +#: 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:1361 +msgid "commit message" +msgstr "" + +#: builtin/commit.c:1362 +msgid "reuse and edit message from specified commit" +msgstr "" + +#: builtin/commit.c:1363 +msgid "reuse message from specified commit" +msgstr "" + +#: builtin/commit.c:1364 +msgid "use autosquash formatted message to fixup specified commit" +msgstr "" + +#: builtin/commit.c:1365 +msgid "use autosquash formatted message to squash specified commit" +msgstr "" + +#: builtin/commit.c:1366 +msgid "the commit is authored by me now (used with -C/-c/--amend)" +msgstr "" + +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 +msgid "add Signed-off-by:" +msgstr "" + +#: builtin/commit.c:1368 +msgid "use specified template file" +msgstr "" + +#: builtin/commit.c:1369 +msgid "force edit of commit" +msgstr "" + +#: builtin/commit.c:1370 +msgid "default" +msgstr "" + +#: builtin/commit.c:1370 builtin/tag.c:462 +msgid "how to strip spaces and #comments from message" +msgstr "" + +#: builtin/commit.c:1371 +msgid "include status in commit message template" +msgstr "" + +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 +msgid "key id" +msgstr "" + +#: builtin/commit.c:1373 builtin/merge.c:214 +msgid "GPG sign commit" +msgstr "" + +#. end commit message options +#: builtin/commit.c:1376 +msgid "Commit contents options" +msgstr "" + +#: builtin/commit.c:1377 +msgid "commit all changed files" +msgstr "" + +#: builtin/commit.c:1378 +msgid "add specified files to index for commit" +msgstr "" + +#: builtin/commit.c:1379 +msgid "interactively add files" +msgstr "" + +#: builtin/commit.c:1380 +msgid "interactively add changes" +msgstr "" + +#: builtin/commit.c:1381 +msgid "commit only specified files" +msgstr "" + +#: builtin/commit.c:1382 +msgid "bypass pre-commit hook" +msgstr "" + +#: builtin/commit.c:1383 +msgid "show what would be committed" +msgstr "" + +#: builtin/commit.c:1391 +msgid "amend previous commit" +msgstr "" + +#: builtin/commit.c:1392 +msgid "bypass post-rewrite hook" +msgstr "" + +#: builtin/commit.c:1397 +msgid "ok to record an empty change" +msgstr "" + +#: builtin/commit.c:1400 +msgid "ok to record a change with an empty message" +msgstr "" + +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "" -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "" -#: builtin/commit.c:1494 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "" -#: builtin/commit.c:1501 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "" -#: builtin/commit.c:1520 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "" -#: builtin/commit.c:1534 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" -#: builtin/commit.c:1539 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "" -#: builtin/commit.c:1575 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "" -#: builtin/commit.c:1579 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "" -#: 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" "not exceeded, and then \"git reset HEAD\" to recover." msgstr "" +#: builtin/config.c:7 +msgid "git config [options]" +msgstr "" + +#: builtin/config.c:52 +msgid "Config file location" +msgstr "" + +#: builtin/config.c:53 +msgid "use global config file" +msgstr "" + +#: builtin/config.c:54 +msgid "use system config file" +msgstr "" + +#: builtin/config.c:55 +msgid "use repository config file" +msgstr "" + +#: builtin/config.c:56 +msgid "use given config file" +msgstr "" + +#: builtin/config.c:57 +msgid "Action" +msgstr "" + +#: builtin/config.c:58 +msgid "get value: name [value-regex]" +msgstr "" + +#: builtin/config.c:59 +msgid "get all values: key [value-regex]" +msgstr "" + +#: builtin/config.c:60 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "" + +#: builtin/config.c:61 +msgid "replace all matching variables: name value [value_regex]" +msgstr "" + +#: builtin/config.c:62 +msgid "add a new variable: name value" +msgstr "" + +#: builtin/config.c:63 +msgid "remove a variable: name [value-regex]" +msgstr "" + +#: builtin/config.c:64 +msgid "remove all matches: name [value-regex]" +msgstr "" + +#: builtin/config.c:65 +msgid "rename section: old-name new-name" +msgstr "" + +#: builtin/config.c:66 +msgid "remove a section: name" +msgstr "" + +#: builtin/config.c:67 +msgid "list all" +msgstr "" + +#: builtin/config.c:68 +msgid "open an editor" +msgstr "" + +#: builtin/config.c:69 builtin/config.c:70 +msgid "slot" +msgstr "" + +#: builtin/config.c:69 +msgid "find the color configured: [default]" +msgstr "" + +#: builtin/config.c:70 +msgid "find the color setting: [stdout-is-tty]" +msgstr "" + +#: builtin/config.c:71 +msgid "Type" +msgstr "" + +#: builtin/config.c:72 +msgid "value is \"true\" or \"false\"" +msgstr "" + +#: builtin/config.c:73 +msgid "value is decimal number" +msgstr "" + +#: builtin/config.c:74 +msgid "value is --bool or --int" +msgstr "" + +#: builtin/config.c:75 +msgid "value is a path (file or directory name)" +msgstr "" + +#: builtin/config.c:76 +msgid "Other" +msgstr "" + +#: builtin/config.c:77 +msgid "terminate values with NUL byte" +msgstr "" + +#: builtin/config.c:78 +msgid "respect include directives on lookup" +msgstr "" + +#: builtin/count-objects.c:69 +msgid "git count-objects [-v]" +msgstr "" + +#: builtin/describe.c:15 +msgid "git describe [options] <committish>*" +msgstr "" + +#: builtin/describe.c:16 +msgid "git describe [options] --dirty" +msgstr "" + #: builtin/describe.c:234 #, c-format msgid "annotated tag %s not available" @@ -2768,6 +3790,50 @@ msgid "" "gave up search at %s\n" msgstr "" +#: builtin/describe.c:403 +msgid "find the tag that comes after the commit" +msgstr "" + +#: builtin/describe.c:404 +msgid "debug search strategy on stderr" +msgstr "" + +#: builtin/describe.c:405 +msgid "use any ref in .git/refs" +msgstr "" + +#: builtin/describe.c:406 +msgid "use any tag in .git/refs/tags" +msgstr "" + +#: builtin/describe.c:407 +msgid "always use long format" +msgstr "" + +#: builtin/describe.c:410 +msgid "only output exact matches" +msgstr "" + +#: builtin/describe.c:412 +msgid "consider <n> most recent tags (default: 10)" +msgstr "" + +#: builtin/describe.c:414 +msgid "only consider tags matching <pattern>" +msgstr "" + +#: builtin/describe.c:416 builtin/name-rev.c:238 +msgid "show abbreviated commit object as fallback" +msgstr "" + +#: builtin/describe.c:417 +msgid "mark" +msgstr "" + +#: builtin/describe.c:418 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "" + #: builtin/describe.c:436 msgid "--long is incompatible with --abbrev=0" msgstr "" @@ -2780,45 +3846,165 @@ msgstr "" msgid "--dirty is incompatible with committishes" msgstr "" -#: builtin/diff.c:77 +#: builtin/diff.c:79 #, c-format msgid "'%s': not a regular file or symlink" msgstr "" -#: builtin/diff.c:220 +#: builtin/diff.c:224 #, c-format msgid "invalid option: %s" msgstr "" -#: builtin/diff.c:297 +#: builtin/diff.c:301 msgid "Not a git repository" msgstr "" -#: builtin/diff.c:341 +#: builtin/diff.c:344 #, c-format msgid "invalid object '%s' given." msgstr "" -#: builtin/diff.c:346 +#: builtin/diff.c:349 #, c-format msgid "more than %d trees given: '%s'" msgstr "" -#: builtin/diff.c:356 +#: builtin/diff.c:359 #, c-format msgid "more than two blobs given: '%s'" msgstr "" -#: builtin/diff.c:364 +#: builtin/diff.c:367 #, c-format msgid "unhandled object '%s' given." msgstr "" -#: builtin/fetch.c:200 +#: builtin/fast-export.c:22 +msgid "git fast-export [rev-list-opts]" +msgstr "" + +#: builtin/fast-export.c:635 +msgid "show progress after <n> objects" +msgstr "" + +#: builtin/fast-export.c:637 +msgid "select handling of signed tags" +msgstr "" + +#: builtin/fast-export.c:640 +msgid "select handling of tags that tag filtered objects" +msgstr "" + +#: builtin/fast-export.c:643 +msgid "Dump marks to this file" +msgstr "" + +#: builtin/fast-export.c:645 +msgid "Import marks from this file" +msgstr "" + +#: builtin/fast-export.c:647 +msgid "Fake a tagger when tags lack one" +msgstr "" + +#: builtin/fast-export.c:649 +msgid "Output full tree for each commit" +msgstr "" + +#: builtin/fast-export.c:651 +msgid "Use the done feature to terminate the stream" +msgstr "" + +#: builtin/fast-export.c:652 +msgid "Skip output of blob data" +msgstr "" + +#: builtin/fetch.c:20 +msgid "git fetch [<options>] [<repository> [<refspec>...]]" +msgstr "" + +#: builtin/fetch.c:21 +msgid "git fetch [<options>] <group>" +msgstr "" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" +msgstr "" + +#: builtin/fetch.c:23 +msgid "git fetch --all [<options>]" +msgstr "" + +#: builtin/fetch.c:60 +msgid "fetch from all remotes" +msgstr "" + +#: builtin/fetch.c:62 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "" + +#: builtin/fetch.c:64 +msgid "path to upload pack on remote end" +msgstr "" + +#: builtin/fetch.c:65 +msgid "force overwrite of local branch" +msgstr "" + +#: builtin/fetch.c:67 +msgid "fetch from multiple remotes" +msgstr "" + +#: builtin/fetch.c:69 +msgid "fetch all tags and associated objects" +msgstr "" + +#: builtin/fetch.c:71 +msgid "do not fetch all tags (--no-tags)" +msgstr "" + +#: builtin/fetch.c:73 +msgid "prune remote-tracking branches no longer on remote" +msgstr "" + +#: builtin/fetch.c:74 +msgid "on-demand" +msgstr "" + +#: builtin/fetch.c:75 +msgid "control recursive fetching of submodules" +msgstr "" + +#: builtin/fetch.c:79 +msgid "keep downloaded pack" +msgstr "" + +#: builtin/fetch.c:81 +msgid "allow updating of HEAD ref" +msgstr "" + +#: builtin/fetch.c:84 +msgid "deepen history of shallow clone" +msgstr "" + +#: builtin/fetch.c:85 builtin/log.c:1083 +msgid "dir" +msgstr "" + +#: builtin/fetch.c:86 +msgid "prepend this to submodule path output" +msgstr "" + +#: builtin/fetch.c:89 +msgid "default mode for recursion" +msgstr "" + +#: builtin/fetch.c:201 msgid "Couldn't find remote ref HEAD" msgstr "" -#: builtin/fetch.c:253 +#: builtin/fetch.c:254 #, c-format msgid "object %s not found" msgstr "" @@ -2928,43 +4114,161 @@ msgstr "" msgid "Option \"%s\" is ignored for %s\n" msgstr "" -#: builtin/fetch.c:888 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "" -#: builtin/fetch.c:890 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "" -#: 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." msgstr "" -#: builtin/fetch.c:927 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "" -#: builtin/fetch.c:979 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "" -#: builtin/fetch.c:981 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "" -#: builtin/fetch.c:992 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "" -#: builtin/fetch.c:1000 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" +#: builtin/fmt-merge-msg.c:13 +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: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 "" + +#: builtin/fmt-merge-msg.c:654 +msgid "populate log with at most <n> entries from shortlog" +msgstr "" + +#: builtin/fmt-merge-msg.c:657 +msgid "alias for --log (deprecated)" +msgstr "" + +#: builtin/fmt-merge-msg.c:660 +msgid "text" +msgstr "" + +#: builtin/fmt-merge-msg.c:661 +msgid "use <text> as start of message" +msgstr "" + +#: builtin/fmt-merge-msg.c:662 +msgid "file to read from" +msgstr "" + +#: builtin/for-each-ref.c:979 +msgid "git for-each-ref [options] [<pattern>]" +msgstr "" + +#: builtin/for-each-ref.c:994 +msgid "quote placeholders suitably for shells" +msgstr "" + +#: builtin/for-each-ref.c:996 +msgid "quote placeholders suitably for perl" +msgstr "" + +#: builtin/for-each-ref.c:998 +msgid "quote placeholders suitably for python" +msgstr "" + +#: builtin/for-each-ref.c:1000 +msgid "quote placeholders suitably for tcl" +msgstr "" + +#: builtin/for-each-ref.c:1003 +msgid "show only <n> matched refs" +msgstr "" + +#: builtin/for-each-ref.c:1004 +msgid "format" +msgstr "" + +#: builtin/for-each-ref.c:1004 +msgid "format to use for the output" +msgstr "" + +#: builtin/for-each-ref.c:1005 +msgid "key" +msgstr "" + +#: builtin/for-each-ref.c:1006 +msgid "field name to sort on" +msgstr "" + +#: builtin/fsck.c:608 +msgid "git fsck [options] [<object>...]" +msgstr "" + +#: builtin/fsck.c:614 +msgid "show unreachable objects" +msgstr "" + +#: builtin/fsck.c:615 +msgid "show dangling objects" +msgstr "" + +#: builtin/fsck.c:616 +msgid "report tags" +msgstr "" + +#: builtin/fsck.c:617 +msgid "report root nodes" +msgstr "" + +#: builtin/fsck.c:618 +msgid "make index objects head nodes" +msgstr "" + +#: builtin/fsck.c:619 +msgid "make reflogs head nodes (default)" +msgstr "" + +#: builtin/fsck.c:620 +msgid "also consider packs and alternate objects" +msgstr "" + +#: builtin/fsck.c:621 +msgid "enable more strict checking" +msgstr "" + +#: builtin/fsck.c:623 +msgid "write dangling objects in .git/lost-found" +msgstr "" + +#: builtin/fsck.c:624 builtin/prune.c:134 +msgid "show progress" +msgstr "" + +#: builtin/gc.c:22 +msgid "git gc [options]" +msgstr "" + #: builtin/gc.c:63 #, c-format msgid "Invalid %s: '%s'" @@ -2975,82 +4279,315 @@ msgstr "" msgid "insanely long object directory %.*s" msgstr "" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" +#: builtin/gc.c:179 +msgid "prune unreferenced objects" msgstr "" -#: builtin/gc.c:224 +#: builtin/gc.c:181 +msgid "be more thorough (increased runtime)" +msgstr "" + +#: builtin/gc.c:182 +msgid "enable auto-gc mode" +msgstr "" + +#: 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 "" -#: builtin/grep.c:216 +#: builtin/grep.c:22 +msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "" + +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "" -#: builtin/grep.c:402 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "" -#: builtin/grep.c:478 builtin/grep.c:512 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "" -#: builtin/grep.c:526 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "" -#: builtin/grep.c:584 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "" -#: builtin/grep.c:601 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "" -#: builtin/grep.c:885 +#: builtin/grep.c:729 +msgid "search in index instead of in the work tree" +msgstr "" + +#: builtin/grep.c:731 +msgid "find in contents not managed by git" +msgstr "" + +#: builtin/grep.c:733 +msgid "search in both tracked and untracked files" +msgstr "" + +#: builtin/grep.c:735 +msgid "search also in ignored files" +msgstr "" + +#: builtin/grep.c:738 +msgid "show non-matching lines" +msgstr "" + +#: builtin/grep.c:740 +msgid "case insensitive matching" +msgstr "" + +#: builtin/grep.c:742 +msgid "match patterns only at word boundaries" +msgstr "" + +#: builtin/grep.c:744 +msgid "process binary files as text" +msgstr "" + +#: builtin/grep.c:746 +msgid "don't match patterns in binary files" +msgstr "" + +#: builtin/grep.c:749 +msgid "descend at most <depth> levels" +msgstr "" + +#: builtin/grep.c:753 +msgid "use extended POSIX regular expressions" +msgstr "" + +#: builtin/grep.c:756 +msgid "use basic POSIX regular expressions (default)" +msgstr "" + +#: builtin/grep.c:759 +msgid "interpret patterns as fixed strings" +msgstr "" + +#: builtin/grep.c:762 +msgid "use Perl-compatible regular expressions" +msgstr "" + +#: builtin/grep.c:765 +msgid "show line numbers" +msgstr "" + +#: builtin/grep.c:766 +msgid "don't show filenames" +msgstr "" + +#: builtin/grep.c:767 +msgid "show filenames" +msgstr "" + +#: builtin/grep.c:769 +msgid "show filenames relative to top directory" +msgstr "" + +#: builtin/grep.c:771 +msgid "show only filenames instead of matching lines" +msgstr "" + +#: builtin/grep.c:773 +msgid "synonym for --files-with-matches" +msgstr "" + +#: builtin/grep.c:776 +msgid "show only the names of files without match" +msgstr "" + +#: builtin/grep.c:778 +msgid "print NUL after filenames" +msgstr "" + +#: builtin/grep.c:780 +msgid "show the number of matches instead of matching lines" +msgstr "" + +#: builtin/grep.c:781 +msgid "highlight matches" +msgstr "" + +#: builtin/grep.c:783 +msgid "print empty line between matches from different files" +msgstr "" + +#: builtin/grep.c:785 +msgid "show filename only once above matches from same file" +msgstr "" + +#: builtin/grep.c:788 +msgid "show <n> context lines before and after matches" +msgstr "" + +#: builtin/grep.c:791 +msgid "show <n> context lines before matches" +msgstr "" + +#: builtin/grep.c:793 +msgid "show <n> context lines after matches" +msgstr "" + +#: builtin/grep.c:794 +msgid "shortcut for -C NUM" +msgstr "" + +#: builtin/grep.c:797 +msgid "show a line with the function name before matches" +msgstr "" + +#: builtin/grep.c:799 +msgid "show the surrounding function" +msgstr "" + +#: builtin/grep.c:802 +msgid "read patterns from file" +msgstr "" + +#: builtin/grep.c:804 +msgid "match <pattern>" +msgstr "" + +#: builtin/grep.c:806 +msgid "combine patterns specified with -e" +msgstr "" + +#: builtin/grep.c:818 +msgid "indicate hit with exit status without output" +msgstr "" + +#: 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:826 +msgid "show matching files in the pager" +msgstr "" + +#: builtin/grep.c:829 +msgid "allow calling of grep(1) (ignored by this build)" +msgstr "" + +#: builtin/grep.c:830 builtin/show-ref.c:201 +msgid "show usage" +msgstr "" + +#: builtin/grep.c:921 msgid "no pattern given." msgstr "" -#: builtin/grep.c:899 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "" -#: builtin/grep.c:940 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "" -#: builtin/grep.c:963 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "" -#: builtin/grep.c:968 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "" -#: builtin/grep.c:971 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" -#: builtin/grep.c:979 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "" +#: builtin/hash-object.c:60 +msgid "" +"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] " +"<file>..." +msgstr "" + +#: builtin/hash-object.c:61 +msgid "git hash-object --stdin-paths < <list-of-paths>" +msgstr "" + +#: builtin/hash-object.c:72 +msgid "type" +msgstr "" + +#: builtin/hash-object.c:72 +msgid "object type" +msgstr "" + +#: builtin/hash-object.c:73 +msgid "write the object into the object database" +msgstr "" + +#: builtin/hash-object.c:74 +msgid "read the object from stdin" +msgstr "" + +#: builtin/hash-object.c:76 +msgid "store file as is without filters" +msgstr "" + +#: builtin/hash-object.c:77 +msgid "process file as it were from this path" +msgstr "" + +#: builtin/help.c:43 +msgid "print all available commands" +msgstr "" + +#: builtin/help.c:44 +msgid "show man page" +msgstr "" + +#: builtin/help.c:45 +msgid "show manual in web browser" +msgstr "" + +#: builtin/help.c:47 +msgid "show info page" +msgstr "" + +#: builtin/help.c:53 +msgid "git help [--all] [--man|--web|--info] [command]" +msgstr "" + #: builtin/help.c:65 #, c-format msgid "unrecognized help format '%s'" @@ -3161,6 +4698,11 @@ msgstr "" msgid "pack signature mismatch" msgstr "" +#: builtin/index-pack.c:294 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "" + #: builtin/index-pack.c:312 #, c-format msgid "pack has bad object at offset %lu: %s" @@ -3267,93 +4809,123 @@ msgstr "" msgid "Resolving deltas" msgstr "" -#: builtin/index-pack.c:1105 +#: builtin/index-pack.c:1064 +#, c-format +msgid "unable to create thread: %s" +msgstr "" + +#: builtin/index-pack.c:1106 msgid "confusion beyond insanity" msgstr "" -#: builtin/index-pack.c:1124 +#: builtin/index-pack.c:1112 +#, c-format +msgid "completed with %d local objects" +msgstr "" + +#: builtin/index-pack.c:1121 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "" + +#: builtin/index-pack.c:1125 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "" msgstr[1] "" -#: builtin/index-pack.c:1149 +#: builtin/index-pack.c:1150 #, c-format msgid "unable to deflate appended object (%d)" msgstr "" -#: builtin/index-pack.c:1228 +#: builtin/index-pack.c:1229 #, c-format msgid "local object %s is corrupt" msgstr "" -#: builtin/index-pack.c:1252 +#: builtin/index-pack.c:1253 msgid "error while closing pack file" msgstr "" -#: builtin/index-pack.c:1265 +#: builtin/index-pack.c:1266 #, c-format msgid "cannot write keep file '%s'" msgstr "" -#: builtin/index-pack.c:1273 +#: builtin/index-pack.c:1274 #, c-format msgid "cannot close written keep file '%s'" msgstr "" -#: builtin/index-pack.c:1286 +#: builtin/index-pack.c:1287 msgid "cannot store pack file" msgstr "" -#: builtin/index-pack.c:1297 +#: builtin/index-pack.c:1298 msgid "cannot store index file" msgstr "" -#: builtin/index-pack.c:1398 +#: builtin/index-pack.c:1331 +#, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "" + +#: builtin/index-pack.c:1337 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "" + +#: builtin/index-pack.c:1341 builtin/index-pack.c:1514 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "" + +#: builtin/index-pack.c:1399 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "" -#: builtin/index-pack.c:1400 +#: builtin/index-pack.c:1401 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "" -#: 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] "" msgstr[1] "" -#: 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] "" msgstr[1] "" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 msgid "Cannot come back to cwd" msgstr "" -#: 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 "" -#: builtin/index-pack.c:1558 +#: builtin/index-pack.c:1559 msgid "--fix-thin cannot be used without --stdin" msgstr "" -#: 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 "" -#: builtin/index-pack.c:1581 +#: builtin/index-pack.c:1582 msgid "--verify with no packfile name given" msgstr "" @@ -3473,6 +5045,24 @@ msgstr "" msgid "cannot tell cwd" msgstr "" +#: builtin/init-db.c:467 +msgid "" +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared" +"[=<permissions>]] [directory]" +msgstr "" + +#: builtin/init-db.c:490 +msgid "permissions" +msgstr "" + +#: builtin/init-db.c:491 +msgid "specify that the git repository is to be shared amongst several users" +msgstr "" + +#: builtin/init-db.c:493 builtin/prune-packed.c:77 +msgid "be quiet" +msgstr "" + #: builtin/init-db.c:522 builtin/init-db.c:529 #, c-format msgid "cannot mkdir %s" @@ -3499,6 +5089,26 @@ msgstr "" msgid "Cannot access work tree '%s'" msgstr "" +#: builtin/log.c:37 +msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n" +msgstr "" + +#: builtin/log.c:38 +msgid " or: git show [options] <object>..." +msgstr "" + +#: builtin/log.c:100 +msgid "suppress diff output" +msgstr "" + +#: builtin/log.c:101 +msgid "show source" +msgstr "" + +#: builtin/log.c:102 +msgid "decorate options" +msgstr "" + #: builtin/log.c:189 #, c-format msgid "Final output: %d %s\n" @@ -3535,68 +5145,332 @@ msgstr "" msgid "Not a range." msgstr "" -#: builtin/log.c:792 +#: builtin/log.c:789 msgid "Cover letter needs email format" msgstr "" -#: builtin/log.c:865 +#: builtin/log.c:862 #, c-format msgid "insane in-reply-to: %s" msgstr "" -#: builtin/log.c:938 +#: builtin/log.c:890 +msgid "git format-patch [options] [<since> | <revision range>]" +msgstr "" + +#: builtin/log.c:935 msgid "Two output directories?" msgstr "" -#: builtin/log.c:1160 +#: builtin/log.c:1063 +msgid "use [PATCH n/m] even with a single patch" +msgstr "" + +#: builtin/log.c:1066 +msgid "use [PATCH] even with multiple patches" +msgstr "" + +#: builtin/log.c:1070 +msgid "print patches to standard out" +msgstr "" + +#: builtin/log.c:1072 +msgid "generate a cover letter" +msgstr "" + +#: builtin/log.c:1074 +msgid "use simple number sequence for output file names" +msgstr "" + +#: builtin/log.c:1075 +msgid "sfx" +msgstr "" + +#: builtin/log.c:1076 +msgid "use <sfx> instead of '.patch'" +msgstr "" + +#: builtin/log.c:1078 +msgid "start numbering patches at <n> instead of 1" +msgstr "" + +#: builtin/log.c:1080 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "" + +#: builtin/log.c:1083 +msgid "store resulting files in <dir>" +msgstr "" + +#: builtin/log.c:1086 +msgid "don't strip/add [PATCH]" +msgstr "" + +#: builtin/log.c:1089 +msgid "don't output binary diffs" +msgstr "" + +#: builtin/log.c:1091 +msgid "don't include a patch matching a commit upstream" +msgstr "" + +#: builtin/log.c:1093 +msgid "show patch format instead of default (patch + stat)" +msgstr "" + +#: builtin/log.c:1095 +msgid "Messaging" +msgstr "" + +#: builtin/log.c:1096 +msgid "header" +msgstr "" + +#: builtin/log.c:1097 +msgid "add email header" +msgstr "" + +#: builtin/log.c:1098 builtin/log.c:1100 +msgid "email" +msgstr "" + +#: builtin/log.c:1098 +msgid "add To: header" +msgstr "" + +#: builtin/log.c:1100 +msgid "add Cc: header" +msgstr "" + +#: builtin/log.c:1102 +msgid "message-id" +msgstr "" + +#: builtin/log.c:1103 +msgid "make first mail a reply to <message-id>" +msgstr "" + +#: builtin/log.c:1104 builtin/log.c:1107 +msgid "boundary" +msgstr "" + +#: builtin/log.c:1105 +msgid "attach the patch" +msgstr "" + +#: builtin/log.c:1108 +msgid "inline the patch" +msgstr "" + +#: builtin/log.c:1112 +msgid "enable message threading, styles: shallow, deep" +msgstr "" + +#: builtin/log.c:1114 +msgid "signature" +msgstr "" + +#: builtin/log.c:1115 +msgid "add a signature" +msgstr "" + +#: builtin/log.c:1117 +msgid "don't print the patch filenames" +msgstr "" + +#: builtin/log.c:1157 #, c-format msgid "bogus committer info %s" msgstr "" -#: builtin/log.c:1205 +#: builtin/log.c:1202 msgid "-n and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1207 +#: builtin/log.c:1204 msgid "--subject-prefix and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1215 +#: builtin/log.c:1212 msgid "--name-only does not make sense" msgstr "" -#: builtin/log.c:1217 +#: builtin/log.c:1214 msgid "--name-status does not make sense" msgstr "" -#: builtin/log.c:1219 +#: builtin/log.c:1216 msgid "--check does not make sense" msgstr "" -#: builtin/log.c:1242 +#: builtin/log.c:1239 msgid "standard output, or directory, which one?" msgstr "" -#: builtin/log.c:1244 +#: builtin/log.c:1241 #, c-format msgid "Could not create directory '%s'" msgstr "" -#: builtin/log.c:1397 +#: builtin/log.c:1394 msgid "Failed to create output files" msgstr "" -#: builtin/log.c:1501 +#: builtin/log.c:1443 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "" + +#: builtin/log.c:1498 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531 +#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 #, c-format msgid "Unknown commit %s" msgstr "" +#: builtin/ls-files.c:408 +msgid "git ls-files [options] [<file>...]" +msgstr "" + +#: builtin/ls-files.c:463 +msgid "identify the file status with tags" +msgstr "" + +#: builtin/ls-files.c:465 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "" + +#: builtin/ls-files.c:467 +msgid "show cached files in the output (default)" +msgstr "" + +#: builtin/ls-files.c:469 +msgid "show deleted files in the output" +msgstr "" + +#: builtin/ls-files.c:471 +msgid "show modified files in the output" +msgstr "" + +#: builtin/ls-files.c:473 +msgid "show other files in the output" +msgstr "" + +#: builtin/ls-files.c:475 +msgid "show ignored files in the output" +msgstr "" + +#: builtin/ls-files.c:478 +msgid "show staged contents' object name in the output" +msgstr "" + +#: builtin/ls-files.c:480 +msgid "show files on the filesystem that need to be removed" +msgstr "" + +#: builtin/ls-files.c:482 +msgid "show 'other' directories' name only" +msgstr "" + +#: builtin/ls-files.c:485 +msgid "don't show empty directories" +msgstr "" + +#: builtin/ls-files.c:488 +msgid "show unmerged files in the output" +msgstr "" + +#: builtin/ls-files.c:490 +msgid "show resolve-undo information" +msgstr "" + +#: builtin/ls-files.c:492 +msgid "skip files matching pattern" +msgstr "" + +#: builtin/ls-files.c:495 +msgid "exclude patterns are read from <file>" +msgstr "" + +#: builtin/ls-files.c:498 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "" + +#: builtin/ls-files.c:500 +msgid "add the standard git exclusions" +msgstr "" + +#: builtin/ls-files.c:503 +msgid "make the output relative to the project top directory" +msgstr "" + +#: builtin/ls-files.c:506 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "" + +#: builtin/ls-files.c:507 +msgid "tree-ish" +msgstr "" + +#: builtin/ls-files.c:508 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "" + +#: builtin/ls-files.c:510 +msgid "show debugging data" +msgstr "" + +#: builtin/ls-tree.c:27 +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "" + +#: builtin/ls-tree.c:125 +msgid "only show trees" +msgstr "" + +#: builtin/ls-tree.c:127 +msgid "recurse into subtrees" +msgstr "" + +#: builtin/ls-tree.c:129 +msgid "show trees when recursing" +msgstr "" + +#: builtin/ls-tree.c:132 +msgid "terminate entries with NUL byte" +msgstr "" + +#: builtin/ls-tree.c:133 +msgid "include object size" +msgstr "" + +#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +msgid "list only filenames" +msgstr "" + +#: builtin/ls-tree.c:140 +msgid "use full path names" +msgstr "" + +#: builtin/ls-tree.c:142 +msgid "list entire tree; not just current directory (implies --full-name)" +msgstr "" + +#: builtin/merge.c:43 +msgid "git merge [options] [<commit>...]" +msgstr "" + +#: builtin/merge.c:44 +msgid "git merge [options] <msg> HEAD <commit>" +msgstr "" + +#: builtin/merge.c:45 +msgid "git merge --abort" +msgstr "" + #: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "" @@ -3616,6 +5490,66 @@ msgstr "" msgid "Available custom strategies are:" msgstr "" +#: builtin/merge.c:183 +msgid "do not show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:186 +msgid "show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:187 +msgid "(synonym to --stat)" +msgstr "" + +#: builtin/merge.c:189 +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "" + +#: builtin/merge.c:192 +msgid "create a single commit instead of doing a merge" +msgstr "" + +#: builtin/merge.c:194 +msgid "perform a commit if the merge succeeds (default)" +msgstr "" + +#: builtin/merge.c:196 +msgid "edit message before committing" +msgstr "" + +#: builtin/merge.c:198 +msgid "allow fast-forward (default)" +msgstr "" + +#: builtin/merge.c:200 +msgid "abort if fast-forward is not possible" +msgstr "" + +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 +msgid "strategy" +msgstr "" + +#: builtin/merge.c:203 +msgid "merge strategy to use" +msgstr "" + +#: builtin/merge.c:204 +msgid "option=value" +msgstr "" + +#: builtin/merge.c:205 +msgid "option for selected merge strategy" +msgstr "" + +#: builtin/merge.c:207 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "" + +#: builtin/merge.c:211 +msgid "abort the current in-progress merge" +msgstr "" + #: builtin/merge.c:240 msgid "could not run stash." msgstr "" @@ -3655,49 +5589,49 @@ msgstr "" msgid "No merge message -- not updating HEAD\n" msgstr "" -#: builtin/merge.c:437 +#: builtin/merge.c:436 #, c-format msgid "'%s' does not point to a commit" msgstr "" -#: builtin/merge.c:536 +#: builtin/merge.c:535 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "" -#: builtin/merge.c:629 +#: builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "" -#: builtin/merge.c:679 +#: builtin/merge.c:678 msgid "failed to read the cache" msgstr "" -#: builtin/merge.c:710 +#: builtin/merge.c:709 msgid "Not handling anything other than two heads merge." msgstr "" -#: builtin/merge.c:724 +#: builtin/merge.c:723 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "" -#: builtin/merge.c:738 +#: builtin/merge.c:737 #, c-format msgid "unable to write %s" msgstr "" -#: builtin/merge.c:877 +#: builtin/merge.c:876 #, c-format msgid "Could not read from '%s'" msgstr "" -#: builtin/merge.c:886 +#: builtin/merge.c:885 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" -#: builtin/merge.c:892 +#: builtin/merge.c:891 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -3706,144 +5640,242 @@ msgid "" "the commit.\n" msgstr "" -#: builtin/merge.c:916 +#: builtin/merge.c:915 msgid "Empty commit message." msgstr "" -#: builtin/merge.c:928 +#: builtin/merge.c:927 #, c-format msgid "Wonderful.\n" msgstr "" -#: builtin/merge.c:993 +#: builtin/merge.c:992 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" -#: builtin/merge.c:1009 +#: builtin/merge.c:1008 #, c-format msgid "'%s' is not a commit" msgstr "" -#: builtin/merge.c:1050 +#: builtin/merge.c:1049 msgid "No current branch." msgstr "" -#: builtin/merge.c:1052 +#: builtin/merge.c:1051 msgid "No remote for the current branch." msgstr "" -#: builtin/merge.c:1054 +#: builtin/merge.c:1053 msgid "No default upstream defined for the current branch." msgstr "" -#: builtin/merge.c:1059 +#: builtin/merge.c:1058 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "" -#: builtin/merge.c:1146 builtin/merge.c:1303 +#: builtin/merge.c:1145 builtin/merge.c:1302 #, c-format msgid "%s - not something we can merge" msgstr "" -#: builtin/merge.c:1214 +#: builtin/merge.c:1213 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "" -#: builtin/merge.c:1230 git-pull.sh:31 +#: builtin/merge.c:1229 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." msgstr "" -#: builtin/merge.c:1233 git-pull.sh:34 +#: builtin/merge.c:1232 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "" -#: builtin/merge.c:1237 +#: builtin/merge.c:1236 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." msgstr "" -#: builtin/merge.c:1240 +#: builtin/merge.c:1239 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" -#: builtin/merge.c:1249 +#: builtin/merge.c:1248 msgid "You cannot combine --squash with --no-ff." msgstr "" -#: builtin/merge.c:1254 +#: builtin/merge.c:1253 msgid "You cannot combine --no-ff with --ff-only." msgstr "" -#: builtin/merge.c:1261 +#: builtin/merge.c:1260 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "" -#: builtin/merge.c:1293 +#: builtin/merge.c:1292 msgid "Can merge only exactly one commit into empty head" msgstr "" -#: builtin/merge.c:1296 +#: builtin/merge.c:1295 msgid "Squash commit into empty head not supported yet" msgstr "" -#: builtin/merge.c:1298 +#: builtin/merge.c:1297 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "" -#: builtin/merge.c:1413 +#: builtin/merge.c:1412 #, c-format msgid "Updating %s..%s\n" msgstr "" -#: builtin/merge.c:1451 +#: builtin/merge.c:1450 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "" -#: builtin/merge.c:1458 +#: builtin/merge.c:1457 #, c-format msgid "Nope.\n" msgstr "" -#: builtin/merge.c:1490 +#: builtin/merge.c:1489 msgid "Not possible to fast-forward, aborting." msgstr "" -#: builtin/merge.c:1513 builtin/merge.c:1592 +#: builtin/merge.c:1512 builtin/merge.c:1591 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "" -#: builtin/merge.c:1517 +#: builtin/merge.c:1516 #, c-format msgid "Trying merge strategy %s...\n" msgstr "" -#: builtin/merge.c:1583 +#: builtin/merge.c:1582 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "" -#: builtin/merge.c:1585 +#: builtin/merge.c:1584 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "" -#: builtin/merge.c:1594 +#: builtin/merge.c:1593 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "" -#: builtin/merge.c:1606 +#: builtin/merge.c:1605 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" +#: builtin/merge-base.c:26 +msgid "git merge-base [-a|--all] <commit> <commit>..." +msgstr "" + +#: builtin/merge-base.c:27 +msgid "git merge-base [-a|--all] --octopus <commit>..." +msgstr "" + +#: builtin/merge-base.c:28 +msgid "git merge-base --independent <commit>..." +msgstr "" + +#: builtin/merge-base.c:29 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "" + +#: builtin/merge-base.c:98 +msgid "output all common ancestors" +msgstr "" + +#: builtin/merge-base.c:99 +msgid "find ancestors for a single n-way merge" +msgstr "" + +#: builtin/merge-base.c:100 +msgid "list revs not reachable from others" +msgstr "" + +#: builtin/merge-base.c:102 +msgid "is the first one ancestor of the other?" +msgstr "" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " +"file2" +msgstr "" + +#: builtin/merge-file.c:33 +msgid "send results to standard output" +msgstr "" + +#: builtin/merge-file.c:34 +msgid "use a diff3 based merge" +msgstr "" + +#: builtin/merge-file.c:35 +msgid "for conflicts, use our version" +msgstr "" + +#: builtin/merge-file.c:37 +msgid "for conflicts, use their version" +msgstr "" + +#: builtin/merge-file.c:39 +msgid "for conflicts, use a union version" +msgstr "" + +#: builtin/merge-file.c:42 +msgid "for conflicts, use this marker size" +msgstr "" + +#: builtin/merge-file.c:43 +msgid "do not warn about conflicts" +msgstr "" + +#: builtin/merge-file.c:45 +msgid "set labels for file1/orig_file/file2" +msgstr "" + +#: builtin/mktree.c:67 +msgid "git mktree [-z] [--missing] [--batch]" +msgstr "" + +#: builtin/mktree.c:153 +msgid "input is NUL terminated" +msgstr "" + +#: builtin/mktree.c:154 builtin/write-tree.c:24 +msgid "allow missing objects" +msgstr "" + +#: builtin/mktree.c:155 +msgid "allow creation of more than one tree" +msgstr "" + +#: builtin/mv.c:14 +msgid "git mv [options] <source>... <destination>" +msgstr "" + +#: builtin/mv.c:64 +msgid "force move/rename even if target exists" +msgstr "" + +#: builtin/mv.c:65 +msgid "skip move/rename errors" +msgstr "" + #: builtin/mv.c:108 #, c-format msgid "Checking rename of '%s' to '%s'\n" @@ -3906,158 +5938,386 @@ msgstr "" msgid "renaming '%s' failed" msgstr "" -#: builtin/notes.c:139 +#: builtin/name-rev.c:175 +msgid "git name-rev [options] <commit>..." +msgstr "" + +#: builtin/name-rev.c:176 +msgid "git name-rev [options] --all" +msgstr "" + +#: builtin/name-rev.c:177 +msgid "git name-rev [options] --stdin" +msgstr "" + +#: builtin/name-rev.c:229 +msgid "print only names (no SHA-1)" +msgstr "" + +#: builtin/name-rev.c:230 +msgid "only use tags to name the commits" +msgstr "" + +#: builtin/name-rev.c:232 +msgid "only use refs matching <pattern>" +msgstr "" + +#: builtin/name-rev.c:234 +msgid "list all commits reachable from all refs" +msgstr "" + +#: builtin/name-rev.c:235 +msgid "read from stdin" +msgstr "" + +#: builtin/name-rev.c:236 +msgid "allow to print `undefined` names" +msgstr "" + +#: builtin/notes.c:26 +msgid "git notes [--ref <notes_ref>] [list [<object>]]" +msgstr "" + +#: builtin/notes.c:27 +msgid "" +"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:28 +msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:29 +msgid "" +"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:30 +msgid "git notes [--ref <notes_ref>] edit [<object>]" +msgstr "" + +#: builtin/notes.c:31 +msgid "git notes [--ref <notes_ref>] show [<object>]" +msgstr "" + +#: builtin/notes.c:32 +msgid "" +"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" +msgstr "" + +#: builtin/notes.c:33 +msgid "git notes merge --commit [-v | -q]" +msgstr "" + +#: builtin/notes.c:34 +msgid "git notes merge --abort [-v | -q]" +msgstr "" + +#: builtin/notes.c:35 +msgid "git notes [--ref <notes_ref>] remove [<object>...]" +msgstr "" + +#: builtin/notes.c:36 +msgid "git notes [--ref <notes_ref>] prune [-n | -v]" +msgstr "" + +#: builtin/notes.c:37 +msgid "git notes [--ref <notes_ref>] get-ref" +msgstr "" + +#: builtin/notes.c:42 +msgid "git notes [list [<object>]]" +msgstr "" + +#: builtin/notes.c:47 +msgid "git notes add [<options>] [<object>]" +msgstr "" + +#: builtin/notes.c:52 +msgid "git notes copy [<options>] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:53 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "" + +#: builtin/notes.c:58 +msgid "git notes append [<options>] [<object>]" +msgstr "" + +#: builtin/notes.c:63 +msgid "git notes edit [<object>]" +msgstr "" + +#: builtin/notes.c:68 +msgid "git notes show [<object>]" +msgstr "" + +#: builtin/notes.c:73 +msgid "git notes merge [<options>] <notes_ref>" +msgstr "" + +#: builtin/notes.c:74 +msgid "git notes merge --commit [<options>]" +msgstr "" + +#: builtin/notes.c:75 +msgid "git notes merge --abort [<options>]" +msgstr "" + +#: builtin/notes.c:80 +msgid "git notes remove [<object>]" +msgstr "" + +#: builtin/notes.c:85 +msgid "git notes prune [<options>]" +msgstr "" + +#: builtin/notes.c:90 +msgid "git notes get-ref" +msgstr "" + +#: 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:580 +#: builtin/notes.c:538 builtin/notes.c:695 +msgid "note contents as a string" +msgstr "" + +#: builtin/notes.c:541 builtin/notes.c:698 +msgid "note contents in a file" +msgstr "" + +#: 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:544 builtin/notes.c:701 +msgid "reuse and edit specified note object" +msgstr "" + +#: builtin/notes.c:547 builtin/notes.c:704 +msgid "reuse specified note object" +msgstr "" + +#: builtin/notes.c:549 builtin/notes.c:617 +msgid "replace existing notes" +msgstr "" + +#: 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:635 +#: builtin/notes.c:618 +msgid "read objects from stdin" +msgstr "" + +#: builtin/notes.c:620 +msgid "load rewriting config for <command> (implies --stdin)" +msgstr "" + +#: 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:971 +#: builtin/notes.c:867 +msgid "General options" +msgstr "" + +#: builtin/notes.c:869 +msgid "Merge options" +msgstr "" + +#: builtin/notes.c:871 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "" + +#: builtin/notes.c:873 +msgid "Committing unmerged notes" +msgstr "" + +#: builtin/notes.c:875 +msgid "finalize notes merge by committing unmerged notes" +msgstr "" + +#: builtin/notes.c:877 +msgid "Aborting notes merge resolution" +msgstr "" + +#: builtin/notes.c:879 +msgid "abort notes merge" +msgstr "" + +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "" -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:986 +msgid "attempt to remove non-existent note is not an error" +msgstr "" + +#: builtin/notes.c:989 +msgid "read object names from the standard input" +msgstr "" + +#: builtin/notes.c:1070 +msgid "notes_ref" +msgstr "" + +#: builtin/notes.c:1071 +msgid "use notes from <notes_ref>" +msgstr "" + +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "" +#: builtin/pack-objects.c:23 +msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]" +msgstr "" + +#: builtin/pack-objects.c:24 +msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" +msgstr "" + #: builtin/pack-objects.c:183 builtin/pack-objects.c:186 #, c-format msgid "deflate error (%d)" @@ -4083,6 +6343,162 @@ msgstr "" msgid "unable to parse value '%s' for option %s" msgstr "" +#: builtin/pack-objects.c:2448 +msgid "do not show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2450 +msgid "show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2452 +msgid "show progress meter during object writing phase" +msgstr "" + +#: builtin/pack-objects.c:2455 +msgid "similar to --all-progress when progress meter is shown" +msgstr "" + +#: builtin/pack-objects.c:2456 +msgid "version[,offset]" +msgstr "" + +#: builtin/pack-objects.c:2457 +msgid "write the pack index file in the specified idx format version" +msgstr "" + +#: builtin/pack-objects.c:2460 +msgid "maximum size of each output pack file" +msgstr "" + +#: builtin/pack-objects.c:2462 +msgid "ignore borrowed objects from alternate object store" +msgstr "" + +#: builtin/pack-objects.c:2464 +msgid "ignore packed objects" +msgstr "" + +#: builtin/pack-objects.c:2466 +msgid "limit pack window by objects" +msgstr "" + +#: builtin/pack-objects.c:2468 +msgid "limit pack window by memory in addition to object limit" +msgstr "" + +#: builtin/pack-objects.c:2470 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "" + +#: builtin/pack-objects.c:2472 +msgid "reuse existing deltas" +msgstr "" + +#: builtin/pack-objects.c:2474 +msgid "reuse existing objects" +msgstr "" + +#: builtin/pack-objects.c:2476 +msgid "use OFS_DELTA objects" +msgstr "" + +#: builtin/pack-objects.c:2478 +msgid "use threads when searching for best delta matches" +msgstr "" + +#: builtin/pack-objects.c:2480 +msgid "do not create an empty pack output" +msgstr "" + +#: builtin/pack-objects.c:2482 +msgid "read revision arguments from standard input" +msgstr "" + +#: builtin/pack-objects.c:2484 +msgid "limit the objects to those that are not yet packed" +msgstr "" + +#: builtin/pack-objects.c:2487 +msgid "include objects reachable from any reference" +msgstr "" + +#: builtin/pack-objects.c:2490 +msgid "include objects referred by reflog entries" +msgstr "" + +#: builtin/pack-objects.c:2493 +msgid "output pack to stdout" +msgstr "" + +#: builtin/pack-objects.c:2495 +msgid "include tag objects that refer to objects to be packed" +msgstr "" + +#: builtin/pack-objects.c:2497 +msgid "keep unreachable objects" +msgstr "" + +#: builtin/pack-objects.c:2498 parse-options.h:141 +msgid "time" +msgstr "" + +#: builtin/pack-objects.c:2499 +msgid "unpack unreachable objects newer than <time>" +msgstr "" + +#: builtin/pack-objects.c:2502 +msgid "create thin packs" +msgstr "" + +#: builtin/pack-objects.c:2504 +msgid "ignore packs that have companion .keep file" +msgstr "" + +#: builtin/pack-objects.c:2506 +msgid "pack compression level" +msgstr "" + +#: builtin/pack-objects.c:2508 +msgid "do not hide commits by grafts" +msgstr "" + +#: builtin/pack-refs.c:6 +msgid "git pack-refs [options]" +msgstr "" + +#: builtin/pack-refs.c:14 +msgid "pack everything" +msgstr "" + +#: builtin/pack-refs.c:15 +msgid "prune loose refs (default)" +msgstr "" + +#: builtin/prune-packed.c:7 +msgid "git prune-packed [-n|--dry-run] [-q|--quiet]" +msgstr "" + +#: builtin/prune.c:12 +msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" +msgstr "" + +#: builtin/prune.c:132 +msgid "do not remove, show only" +msgstr "" + +#: builtin/prune.c:133 +msgid "report pruned objects" +msgstr "" + +#: builtin/prune.c:136 +msgid "expire objects older than <time>" +msgstr "" + +#: builtin/push.c:14 +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "" + #: builtin/push.c:45 msgid "tag shorthand without <tag>" msgstr "" @@ -4144,12 +6560,30 @@ msgid "" "to update which remote branch." msgstr "" -#: builtin/push.c:174 +#: builtin/push.c:151 +msgid "" +"push.default is unset; its implicit value is changing in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the current behavior after the default changes, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" + +#: builtin/push.c:199 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" -#: builtin/push.c:181 +#: builtin/push.c:206 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -4157,15 +6591,15 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:187 +#: builtin/push.c:212 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" -"specify branches to push or set the 'push.default' configuration\n" -"variable to 'current' or 'upstream' to push only the current branch." +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." msgstr "" -#: builtin/push.c:193 +#: builtin/push.c:218 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -4173,22 +6607,22 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:233 +#: builtin/push.c:258 #, c-format msgid "Pushing to %s\n" msgstr "" -#: builtin/push.c:237 +#: builtin/push.c:262 #, c-format msgid "failed to push some refs to '%s'" msgstr "" -#: builtin/push.c:269 +#: builtin/push.c:294 #, c-format msgid "bad repository '%s'" msgstr "" -#: builtin/push.c:270 +#: builtin/push.c:295 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -4201,34 +6635,232 @@ msgid "" " git push <name>\n" msgstr "" -#: builtin/push.c:285 +#: builtin/push.c:310 msgid "--all and --tags are incompatible" msgstr "" -#: builtin/push.c:286 +#: builtin/push.c:311 msgid "--all can't be combined with refspecs" msgstr "" -#: builtin/push.c:291 +#: builtin/push.c:316 msgid "--mirror and --tags are incompatible" msgstr "" -#: builtin/push.c:292 +#: builtin/push.c:317 msgid "--mirror can't be combined with refspecs" msgstr "" -#: builtin/push.c:297 +#: builtin/push.c:322 msgid "--all and --mirror are incompatible" msgstr "" -#: builtin/push.c:385 -msgid "--delete is incompatible with --all, --mirror and --tags" +#: builtin/push.c:382 +msgid "repository" +msgstr "" + +#: builtin/push.c:383 +msgid "push all refs" +msgstr "" + +#: builtin/push.c:384 +msgid "mirror all refs" +msgstr "" + +#: builtin/push.c:386 +msgid "delete refs" msgstr "" #: builtin/push.c:387 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "" + +#: builtin/push.c:390 +msgid "force updates" +msgstr "" + +#: builtin/push.c:391 +msgid "check" +msgstr "" + +#: builtin/push.c:392 +msgid "control recursive pushing of submodules" +msgstr "" + +#: builtin/push.c:394 +msgid "use thin pack" +msgstr "" + +#: builtin/push.c:395 builtin/push.c:396 +msgid "receive pack program" +msgstr "" + +#: builtin/push.c:397 +msgid "set upstream for git pull/status" +msgstr "" + +#: builtin/push.c:400 +msgid "prune locally removed refs" +msgstr "" + +#: builtin/push.c:410 +msgid "--delete is incompatible with --all, --mirror and --tags" +msgstr "" + +#: builtin/push.c:412 msgid "--delete doesn't make sense without any refs" msgstr "" +#: 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 "" + +#: builtin/read-tree.c:108 +msgid "write resulting index to <file>" +msgstr "" + +#: builtin/read-tree.c:111 +msgid "only empty the index" +msgstr "" + +#: builtin/read-tree.c:113 +msgid "Merging" +msgstr "" + +#: builtin/read-tree.c:115 +msgid "perform a merge in addition to a read" +msgstr "" + +#: builtin/read-tree.c:117 +msgid "3-way merge if no file level merging required" +msgstr "" + +#: builtin/read-tree.c:119 +msgid "3-way merge in presence of adds and removes" +msgstr "" + +#: builtin/read-tree.c:121 +msgid "same as -m, but discard unmerged entries" +msgstr "" + +#: builtin/read-tree.c:122 +msgid "<subdirectory>/" +msgstr "" + +#: builtin/read-tree.c:123 +msgid "read the tree into the index under <subdirectory>/" +msgstr "" + +#: builtin/read-tree.c:126 +msgid "update working tree with merge result" +msgstr "" + +#: builtin/read-tree.c:128 +msgid "gitignore" +msgstr "" + +#: builtin/read-tree.c:129 +msgid "allow explicitly ignored files to be overwritten" +msgstr "" + +#: builtin/read-tree.c:132 +msgid "don't check the working tree after merging" +msgstr "" + +#: builtin/read-tree.c:133 +msgid "don't update the index or the work tree" +msgstr "" + +#: builtin/read-tree.c:135 +msgid "skip applying sparse checkout filter" +msgstr "" + +#: builtin/read-tree.c:137 +msgid "debug unpack-trees" +msgstr "" + +#: builtin/remote.c:11 +msgid "git remote [-v | --verbose]" +msgstr "" + +#: builtin/remote.c:12 +msgid "" +"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <name> <url>" +msgstr "" + +#: builtin/remote.c:13 builtin/remote.c:32 +msgid "git remote rename <old> <new>" +msgstr "" + +#: builtin/remote.c:14 builtin/remote.c:37 +msgid "git remote remove <name>" +msgstr "" + +#: builtin/remote.c:15 +msgid "git remote set-head <name> (-a | -d | <branch>)" +msgstr "" + +#: builtin/remote.c:16 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "" + +#: builtin/remote.c:17 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "" + +#: builtin/remote.c:18 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" + +#: builtin/remote.c:19 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "" + +#: builtin/remote.c:20 builtin/remote.c:68 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "" + +#: builtin/remote.c:21 builtin/remote.c:69 +msgid "git remote set-url --add <name> <newurl>" +msgstr "" + +#: builtin/remote.c:22 builtin/remote.c:70 +msgid "git remote set-url --delete <name> <url>" +msgstr "" + +#: builtin/remote.c:27 +msgid "git remote add [<options>] <name> <url>" +msgstr "" + +#: builtin/remote.c:42 +msgid "git remote set-head <name> (-a | -d | <branch>])" +msgstr "" + +#: builtin/remote.c:47 +msgid "git remote set-branches <name> <branch>..." +msgstr "" + +#: builtin/remote.c:48 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "" + +#: builtin/remote.c:53 +msgid "git remote show [<options>] <name>" +msgstr "" + +#: builtin/remote.c:58 +msgid "git remote prune [<options>] <name>" +msgstr "" + +#: builtin/remote.c:63 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "" + #: builtin/remote.c:98 #, c-format msgid "Updating %s" @@ -4245,6 +6877,34 @@ msgstr "" msgid "unknown mirror argument: %s" msgstr "" +#: builtin/remote.c:163 +msgid "fetch the remote branches" +msgstr "" + +#: builtin/remote.c:165 +msgid "import all tags and associated objects when fetching" +msgstr "" + +#: builtin/remote.c:168 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "" + +#: builtin/remote.c:170 +msgid "branch(es) to track" +msgstr "" + +#: builtin/remote.c:171 +msgid "master branch" +msgstr "" + +#: builtin/remote.c:172 +msgid "push|fetch" +msgstr "" + +#: builtin/remote.c:173 +msgid "set up remote as a mirror to push to or fetch from" +msgstr "" + #: builtin/remote.c:185 msgid "specifying a master branch makes no sense with --mirror" msgstr "" @@ -4434,6 +7094,10 @@ msgstr "" msgid " %-*s pushes to %s" msgstr "" +#: builtin/remote.c:1091 +msgid "do not query remotes" +msgstr "" + #: builtin/remote.c:1118 #, c-format msgid "* remote %s" @@ -4492,6 +7156,14 @@ msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] "" msgstr[1] "" +#: builtin/remote.c:1199 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "" + +#: builtin/remote.c:1201 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "" + #: builtin/remote.c:1216 msgid "Cannot determine remote HEAD" msgstr "" @@ -4545,15 +7217,35 @@ msgstr "" msgid " * [pruned] %s" msgstr "" +#: builtin/remote.c:1321 +msgid "prune remotes after fetching" +msgstr "" + #: builtin/remote.c:1387 builtin/remote.c:1461 #, c-format msgid "No such remote '%s'" msgstr "" +#: builtin/remote.c:1407 +msgid "add branch" +msgstr "" + #: builtin/remote.c:1414 msgid "no remote specified" msgstr "" +#: builtin/remote.c:1436 +msgid "manipulate push URLs" +msgstr "" + +#: builtin/remote.c:1438 +msgid "add URL" +msgstr "" + +#: builtin/remote.c:1440 +msgid "delete URLs" +msgstr "" + #: builtin/remote.c:1447 msgid "--add --delete doesn't make sense" msgstr "" @@ -4572,6 +7264,55 @@ msgstr "" msgid "Will not delete all non-push URLs" msgstr "" +#: builtin/remote.c:1569 +msgid "be verbose; must be placed before a subcommand" +msgstr "" + +#: builtin/replace.c:17 +msgid "git replace [-f] <object> <replacement>" +msgstr "" + +#: builtin/replace.c:18 +msgid "git replace -d <object>..." +msgstr "" + +#: builtin/replace.c:19 +msgid "git replace -l [<pattern>]" +msgstr "" + +#: builtin/replace.c:118 +msgid "list replace refs" +msgstr "" + +#: builtin/replace.c:119 +msgid "delete replace refs" +msgstr "" + +#: builtin/replace.c:120 +msgid "replace the ref if it exists" +msgstr "" + +#: builtin/rerere.c:11 +msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" +msgstr "" + +#: builtin/rerere.c:56 +msgid "register clean resolutions in index" +msgstr "" + +#: builtin/reset.c:25 +msgid "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" +msgstr "" + +#: builtin/reset.c:26 +msgid "git reset [-q] <commit> [--] <paths>..." +msgstr "" + +#: builtin/reset.c:27 +msgid "git reset --patch [<commit>] [--] [<paths>...]" +msgstr "" + #: builtin/reset.c:33 msgid "mixed" msgstr "" @@ -4627,6 +7368,26 @@ msgstr "" msgid "Cannot do a %s reset in the middle of a merge." msgstr "" +#: builtin/reset.c:238 +msgid "be quiet, only report errors" +msgstr "" + +#: builtin/reset.c:240 +msgid "reset HEAD and index" +msgstr "" + +#: builtin/reset.c:241 +msgid "reset only HEAD" +msgstr "" + +#: builtin/reset.c:243 builtin/reset.c:245 +msgid "reset HEAD, index and working tree" +msgstr "" + +#: builtin/reset.c:247 +msgid "reset HEAD but keep local changes" +msgstr "" + #: builtin/reset.c:303 #, c-format msgid "Could not parse object '%s'." @@ -4655,23 +7416,120 @@ msgstr "" msgid "Could not reset index file to revision '%s'." msgstr "" +#: builtin/rev-parse.c:339 +msgid "git rev-parse --parseopt [options] -- [<args>...]" +msgstr "" + +#: builtin/rev-parse.c:344 +msgid "keep the `--` passed as an arg" +msgstr "" + +#: builtin/rev-parse.c:346 +msgid "stop parsing after the first non-option argument" +msgstr "" + +#: 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 "" + +#: builtin/revert.c:22 +msgid "git revert [options] <commit-ish>" +msgstr "" + +#: builtin/revert.c:23 +msgid "git revert <subcommand>" +msgstr "" + +#: builtin/revert.c:28 +msgid "git cherry-pick [options] <commit-ish>" +msgstr "" + +#: builtin/revert.c:29 +msgid "git cherry-pick <subcommand>" +msgstr "" + #: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "" -#: builtin/revert.c:131 +#: builtin/revert.c:103 +msgid "end revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:104 +msgid "resume revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:105 +msgid "cancel revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:106 +msgid "don't automatically commit" +msgstr "" + +#: builtin/revert.c:107 +msgid "edit the commit message" +msgstr "" + +#: builtin/revert.c:110 +msgid "parent number" +msgstr "" + +#: builtin/revert.c:112 +msgid "merge strategy" +msgstr "" + +#: builtin/revert.c:113 +msgid "option" +msgstr "" + +#: builtin/revert.c:114 +msgid "option for merge strategy" +msgstr "" + +#: builtin/revert.c:125 +msgid "append commit name" +msgstr "" + +#: builtin/revert.c:126 +msgid "allow fast-forward" +msgstr "" + +#: builtin/revert.c:127 +msgid "preserve initially empty commits" +msgstr "" + +#: builtin/revert.c:128 +msgid "allow commits with empty messages" +msgstr "" + +#: builtin/revert.c:129 +msgid "keep redundant, empty commits" +msgstr "" + +#: builtin/revert.c:133 msgid "program error" msgstr "" -#: builtin/revert.c:221 +#: builtin/revert.c:223 msgid "revert failed" msgstr "" -#: builtin/revert.c:236 +#: builtin/revert.c:238 msgid "cherry-pick failed" msgstr "" +#: builtin/rm.c:14 +msgid "git rm [options] [--] <file>..." +msgstr "" + #: builtin/rm.c:109 #, c-format msgid "" @@ -4693,6 +7551,26 @@ msgid "" "(use --cached to keep the file, or -f to force removal)" msgstr "" +#: builtin/rm.c:134 +msgid "do not list removed files" +msgstr "" + +#: builtin/rm.c:135 +msgid "only remove from the index" +msgstr "" + +#: builtin/rm.c:136 +msgid "override the up-to-date check" +msgstr "" + +#: builtin/rm.c:137 +msgid "allow recursive removal" +msgstr "" + +#: builtin/rm.c:139 +msgid "exit with a zero status even if nothing matched" +msgstr "" + #: builtin/rm.c:194 #, c-format msgid "not removing '%s' recursively without -r" @@ -4703,11 +7581,192 @@ msgstr "" msgid "git rm: unable to remove %s" msgstr "" +#: builtin/shortlog.c:13 +msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" +msgstr "" + #: builtin/shortlog.c:157 #, c-format msgid "Missing author: %s" msgstr "" +#: builtin/shortlog.c:253 +msgid "sort output according to the number of commits per author" +msgstr "" + +#: builtin/shortlog.c:255 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "" + +#: builtin/shortlog.c:257 +msgid "Show the email address of each author" +msgstr "" + +#: builtin/shortlog.c:258 +msgid "w[,i1[,i2]]" +msgstr "" + +#: builtin/shortlog.c:259 +msgid "Linewrap output" +msgstr "" + +#: 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 "" + +#: builtin/show-branch.c:10 +msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "" + +#: builtin/show-branch.c:651 +msgid "show remote-tracking and local branches" +msgstr "" + +#: builtin/show-branch.c:653 +msgid "show remote-tracking branches" +msgstr "" + +#: builtin/show-branch.c:655 +msgid "color '*!+-' corresponding to the branch" +msgstr "" + +#: builtin/show-branch.c:657 +msgid "show <n> more commits after the common ancestor" +msgstr "" + +#: builtin/show-branch.c:659 +msgid "synonym to more=-1" +msgstr "" + +#: builtin/show-branch.c:660 +msgid "suppress naming strings" +msgstr "" + +#: builtin/show-branch.c:662 +msgid "include the current branch" +msgstr "" + +#: builtin/show-branch.c:664 +msgid "name commits with their object names" +msgstr "" + +#: builtin/show-branch.c:666 +msgid "show possible merge bases" +msgstr "" + +#: builtin/show-branch.c:668 +msgid "show refs unreachable from any other ref" +msgstr "" + +#: builtin/show-branch.c:670 +msgid "show commits in topological order" +msgstr "" + +#: builtin/show-branch.c:672 +msgid "show only commits not on the first branch" +msgstr "" + +#: builtin/show-branch.c:674 +msgid "show merges reachable from only one tip" +msgstr "" + +#: builtin/show-branch.c:676 +msgid "show commits where no parent comes before its children" +msgstr "" + +#: builtin/show-branch.c:678 +msgid "<n>[,<base>]" +msgstr "" + +#: builtin/show-branch.c:679 +msgid "show <n> most recent ref-log entries starting at base" +msgstr "" + +#: builtin/show-ref.c:10 +msgid "" +"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash" +"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] " +msgstr "" + +#: builtin/show-ref.c:11 +msgid "git show-ref --exclude-existing[=pattern] < ref-list" +msgstr "" + +#: builtin/show-ref.c:182 +msgid "only show tags (can be combined with heads)" +msgstr "" + +#: builtin/show-ref.c:183 +msgid "only show heads (can be combined with tags)" +msgstr "" + +#: builtin/show-ref.c:184 +msgid "stricter reference checking, requires exact ref path" +msgstr "" + +#: builtin/show-ref.c:187 builtin/show-ref.c:189 +msgid "show the HEAD reference" +msgstr "" + +#: builtin/show-ref.c:191 +msgid "dereference tags into object IDs" +msgstr "" + +#: builtin/show-ref.c:193 +msgid "only show SHA1 hash using <n> digits" +msgstr "" + +#: builtin/show-ref.c:197 +msgid "do not print results to stdout (useful with --verify)" +msgstr "" + +#: builtin/show-ref.c:199 +msgid "show refs from stdin that aren't in local repository" +msgstr "" + +#: builtin/symbolic-ref.c:7 +msgid "git symbolic-ref [options] name [ref]" +msgstr "" + +#: builtin/symbolic-ref.c:38 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "" + +#: builtin/symbolic-ref.c:39 +msgid "shorten ref output" +msgstr "" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason" +msgstr "" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason of the update" +msgstr "" + +#: builtin/tag.c:22 +msgid "" +"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]" +msgstr "" + +#: builtin/tag.c:23 +msgid "git tag -d <tagname>..." +msgstr "" + +#: builtin/tag.c:24 +msgid "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n" +"\t\t[<pattern>...]" +msgstr "" + +#: builtin/tag.c:26 +msgid "git tag -v <tagname>..." +msgstr "" + #: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" @@ -4786,6 +7845,62 @@ msgstr "" msgid "malformed object name '%s'" msgstr "" +#: builtin/tag.c:447 +msgid "list tag names" +msgstr "" + +#: builtin/tag.c:449 +msgid "print <n> lines of each tag message" +msgstr "" + +#: builtin/tag.c:451 +msgid "delete tags" +msgstr "" + +#: builtin/tag.c:452 +msgid "verify tags" +msgstr "" + +#: builtin/tag.c:454 +msgid "Tag creation options" +msgstr "" + +#: builtin/tag.c:456 +msgid "annotated tag, needs a message" +msgstr "" + +#: builtin/tag.c:458 +msgid "tag message" +msgstr "" + +#: builtin/tag.c:460 +msgid "annotated and GPG-signed tag" +msgstr "" + +#: builtin/tag.c:464 +msgid "use another key to sign the tag" +msgstr "" + +#: builtin/tag.c:465 +msgid "replace the tag if exists" +msgstr "" + +#: builtin/tag.c:466 +msgid "show tag list in columns" +msgstr "" + +#: builtin/tag.c:468 +msgid "Tag listing options" +msgstr "" + +#: builtin/tag.c:471 +msgid "print only tags that contain the commit" +msgstr "" + +#: builtin/tag.c:477 +msgid "print only tags of the object" +msgstr "" + #: builtin/tag.c:506 msgid "--column and -n are incompatible" msgstr "" @@ -4835,24 +7950,180 @@ msgstr "" msgid "Updated tag '%s' (was %s)\n" msgstr "" -#: 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 "" -#: parse-options.h:133 parse-options.h:235 -msgid "n" +#: builtin/update-index.c:717 +msgid "continue refresh even when index needs update" msgstr "" -#: parse-options.h:141 -msgid "time" +#: builtin/update-index.c:720 +msgid "refresh: ignore submodules" msgstr "" -#: parse-options.h:149 -msgid "file" +#: builtin/update-index.c:723 +msgid "do not ignore new files" msgstr "" -#: parse-options.h:151 -msgid "when" +#: builtin/update-index.c:725 +msgid "let files replace directories and vice-versa" +msgstr "" + +#: builtin/update-index.c:727 +msgid "notice files missing from worktree" +msgstr "" + +#: builtin/update-index.c:729 +msgid "refresh even if index contains unmerged entries" +msgstr "" + +#: builtin/update-index.c:732 +msgid "refresh stat information" +msgstr "" + +#: builtin/update-index.c:736 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "" + +#: builtin/update-index.c:740 +msgid "<mode> <object> <path>" +msgstr "" + +#: builtin/update-index.c:741 +msgid "add the specified entry to the index" +msgstr "" + +#: builtin/update-index.c:745 +msgid "(+/-)x" +msgstr "" + +#: builtin/update-index.c:746 +msgid "override the executable bit of the listed files" +msgstr "" + +#: builtin/update-index.c:750 +msgid "mark files as \"not changing\"" +msgstr "" + +#: builtin/update-index.c:753 +msgid "clear assumed-unchanged bit" +msgstr "" + +#: builtin/update-index.c:756 +msgid "mark files as \"index-only\"" +msgstr "" + +#: builtin/update-index.c:759 +msgid "clear skip-worktree bit" +msgstr "" + +#: builtin/update-index.c:762 +msgid "add to index only; do not add content to object database" +msgstr "" + +#: builtin/update-index.c:764 +msgid "remove named paths even if present in worktree" +msgstr "" + +#: builtin/update-index.c:766 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "" + +#: builtin/update-index.c:768 +msgid "read list of paths to be updated from standard input" +msgstr "" + +#: builtin/update-index.c:772 +msgid "add entries from standard input to the index" +msgstr "" + +#: builtin/update-index.c:776 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "" + +#: builtin/update-index.c:780 +msgid "only update entries that differ from HEAD" +msgstr "" + +#: builtin/update-index.c:784 +msgid "ignore files missing from worktree" +msgstr "" + +#: builtin/update-index.c:787 +msgid "report actions to standard output" +msgstr "" + +#: builtin/update-index.c:789 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "" + +#: builtin/update-index.c:793 +msgid "write index in this format" +msgstr "" + +#: builtin/update-ref.c:7 +msgid "git update-ref [options] -d <refname> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:8 +msgid "git update-ref [options] <refname> <newval> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:19 +msgid "delete the reference" +msgstr "" + +#: builtin/update-ref.c:21 +msgid "update <refname> not the one it points to" +msgstr "" + +#: builtin/update-server-info.c:6 +msgid "git update-server-info [--force]" +msgstr "" + +#: builtin/update-server-info.c:14 +msgid "update the info files from scratch" +msgstr "" + +#: builtin/verify-pack.c:56 +msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..." +msgstr "" + +#: builtin/verify-pack.c:66 +msgid "verbose" +msgstr "" + +#: builtin/verify-pack.c:68 +msgid "show statistics only" +msgstr "" + +#: builtin/verify-tag.c:17 +msgid "git verify-tag [-v|--verbose] <tag>..." +msgstr "" + +#: builtin/verify-tag.c:73 +msgid "print tag contents" +msgstr "" + +#: builtin/write-tree.c:13 +msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" +msgstr "" + +#: builtin/write-tree.c:26 +msgid "<prefix>/" +msgstr "" + +#: builtin/write-tree.c:27 +msgid "write tree object for a subdirectory <prefix>" +msgstr "" + +#: builtin/write-tree.c:30 +msgid "only useful for debugging" +msgstr "" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." msgstr "" #: parse-options.h:156 @@ -5090,6 +8361,13 @@ msgstr "" msgid "Patch failed at $msgnum $FIRSTLINE" msgstr "" +#: git-am.sh:858 +#, sh-format +msgid "" +"The copy of the patch that failed is found in:\n" +" $dotest/patch" +msgstr "" + #: git-am.sh:876 msgid "applying to an empty history" msgstr "" @@ -5273,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" @@ -5281,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" @@ -5325,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 "" @@ -5484,25 +8766,25 @@ msgstr "" msgid "Cannot unstage modified files" msgstr "" -#: git-stash.sh:474 +#: git-stash.sh:475 msgid "Index was not unstashed." msgstr "" -#: git-stash.sh:491 +#: git-stash.sh:492 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "" -#: git-stash.sh:492 +#: git-stash.sh:493 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "" -#: git-stash.sh:499 +#: git-stash.sh:500 msgid "No branch name specified" msgstr "" -#: git-stash.sh:570 +#: git-stash.sh:571 msgid "(To restore them type \"git stash apply\")" msgstr "" @@ -5511,32 +8793,32 @@ msgstr "" msgid "cannot strip one component off url '$remoteurl'" msgstr "" -#: git-submodule.sh:145 +#: git-submodule.sh:167 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" msgstr "" -#: git-submodule.sh:189 +#: git-submodule.sh:211 #, sh-format msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "" -#: git-submodule.sh:201 +#: git-submodule.sh:223 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "" -#: git-submodule.sh:290 +#: git-submodule.sh:312 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "" -#: git-submodule.sh:307 +#: git-submodule.sh:329 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "" -#: git-submodule.sh:311 +#: git-submodule.sh:333 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" @@ -5544,151 +8826,151 @@ msgid "" "Use -f if you really want to add it." msgstr "" -#: git-submodule.sh:322 +#: git-submodule.sh:344 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "" -#: git-submodule.sh:324 +#: git-submodule.sh:346 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "" -#: git-submodule.sh:338 +#: git-submodule.sh:360 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "" -#: git-submodule.sh:343 +#: git-submodule.sh:365 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "" -#: git-submodule.sh:348 +#: git-submodule.sh:370 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "" -#: git-submodule.sh:390 +#: git-submodule.sh:413 #, sh-format msgid "Entering '$prefix$sm_path'" msgstr "" -#: git-submodule.sh:404 +#: git-submodule.sh:427 #, sh-format msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "" -#: git-submodule.sh:447 +#: git-submodule.sh:471 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "" -#: git-submodule.sh:456 +#: git-submodule.sh:480 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:458 +#: git-submodule.sh:482 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "" -#: git-submodule.sh:466 +#: git-submodule.sh:490 #, sh-format msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:565 +#: git-submodule.sh:590 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" "Maybe you want to use 'update --init'?" msgstr "" -#: git-submodule.sh:578 +#: git-submodule.sh:603 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:597 +#: git-submodule.sh:622 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:611 +#: git-submodule.sh:636 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:612 +#: git-submodule.sh:637 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "" -#: git-submodule.sh:617 +#: git-submodule.sh:642 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:618 +#: git-submodule.sh:643 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "" -#: git-submodule.sh:623 +#: git-submodule.sh:648 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:624 +#: git-submodule.sh:649 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "" -#: git-submodule.sh:646 git-submodule.sh:969 +#: git-submodule.sh:671 git-submodule.sh:995 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:754 +#: git-submodule.sh:779 msgid "The --cached option cannot be used with the --files option" msgstr "" #. unexpected type -#: git-submodule.sh:794 +#: git-submodule.sh:819 #, sh-format msgid "unexpected mode $mod_dst" msgstr "" -#: git-submodule.sh:812 +#: git-submodule.sh:837 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr "" -#: git-submodule.sh:815 +#: git-submodule.sh:840 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr "" -#: git-submodule.sh:818 +#: git-submodule.sh:843 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" -#: git-submodule.sh:843 +#: git-submodule.sh:868 msgid "blob" msgstr "" -#: git-submodule.sh:881 +#: git-submodule.sh:906 msgid "# Submodules changed but not updated:" msgstr "" -#: git-submodule.sh:883 +#: git-submodule.sh:908 msgid "# Submodule changes to be committed:" msgstr "" -#: git-submodule.sh:1027 +#: git-submodule.sh:1054 #, sh-format msgid "Synchronizing submodule url for '$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-08-06 23:47+0800\n" -"PO-Revision-Date: 2012-08-14 09:58+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" @@ -38,6 +38,93 @@ msgstr "" "lämpligt för att ange lösning och checka in,\n" "eller använd \"git commit -a\"." +#: archive.c:10 +msgid "git archive [options] <tree-ish> [<path>...]" +msgstr "git archive [flaggor] <träd-igt> [<sökväg>...]" + +#: 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 <arkiv> [--exec <kmd>] [flaggor] <träd-igt> " +"[<sökväg>...]" + +#: archive.c:13 +msgid "git archive --remote <repo> [--exec <cmd>] --list" +msgstr "git archive --remote <arkiv> [--exec <kmd>] --list" + +#: archive.c:322 +msgid "fmt" +msgstr "fmt" + +#: archive.c:322 +msgid "archive format" +msgstr "arkivformat" + +#: archive.c:323 builtin/log.c:1079 +msgid "prefix" +msgstr "prefix" + +#: archive.c:324 +msgid "prepend prefix to each pathname in the archive" +msgstr "lägg till prefix till varje sökväg i arkivet" + +#: 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" + +#: archive.c:326 builtin/archive.c:92 +msgid "write the archive to this file" +msgstr "skriv arkivet till filen" + +#: archive.c:328 +msgid "read .gitattributes in working directory" +msgstr "läs .gitattributes i arbetskatalogen" + +#: archive.c:329 +msgid "report archived files on stderr" +msgstr "rapportera arkiverade filer pÃ¥ standard fel" + +#: archive.c:330 +msgid "store only" +msgstr "endast spara" + +#: archive.c:331 +msgid "compress faster" +msgstr "komprimera snabbare" + +#: archive.c:339 +msgid "compress better" +msgstr "komprimera bättre" + +#: archive.c:342 +msgid "list supported archive formats" +msgstr "visa understödda arkivformat" + +#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85 +msgid "repo" +msgstr "arkiv" + +#: archive.c:345 builtin/archive.c:94 +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:619 +msgid "command" +msgstr "kommando" + +#: archive.c:347 builtin/archive.c:96 +msgid "path to the remote git-upload-archive command" +msgstr "sökväg till kommandot git-upload-archive pÃ¥ fjärren" + #: bundle.c:36 #, c-format msgid "'%s' does not look like a v2 bundle file" @@ -48,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:699 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "kunde inte öppna \"%s\"" @@ -57,8 +144,8 @@ msgstr "kunde inte öppna \"%s\"" msgid "Repository lacks these prerequisite commits:" msgstr "Arkivet saknar dessa nödvändiga incheckningar:" -#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290 -#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347 +#: 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" msgstr "misslyckades skapa revisionstraversering" @@ -85,7 +172,7 @@ msgstr[1] "Paketet (bundlen) kräver dessa %d referenser" msgid "rev-list died" msgstr "rev-list dog" -#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284 +#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284 #, c-format msgid "unrecognized argument: %s" msgstr "okänt argument: %s" @@ -116,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!" @@ -230,32 +317,7 @@ msgstr "" "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n" "%s" -#: diff.c:1400 -msgid " 0 files changed" -msgstr " 0 filer ändrade" - -#: diff.c:1404 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d fil ändrad" -msgstr[1] " %d filer ändrade" - -#: diff.c:1421 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d tillägg(+)" -msgstr[1] ", %d tillägg(+)" - -#: diff.c:1432 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d borttagning(-)" -msgstr[1] ", %d borttagningar(-)" - -#: diff.c:3461 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -276,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" @@ -360,74 +422,66 @@ msgstr "addinfo_cache misslyckades för sökvägen \"%s\"" msgid "error building trees" msgstr "fel vid byggande av träd" -#: merge-recursive.c:497 -msgid "diff setup failed" -msgstr "misslyckades sätta upp för diff" - -#: merge-recursive.c:627 -msgid "merge-recursive: disk full?" -msgstr "merge-recursive: disk full?" - -#: merge-recursive.c:690 +#: merge-recursive.c:672 #, c-format msgid "failed to create path '%s'%s" msgstr "misslyckades skapa sökvägen \"%s\"%s" -#: merge-recursive.c:701 +#: merge-recursive.c:683 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "Tar bort %s för att göra plats för underkatalog\n" #. something else exists #. .. but not some other error (who really cares what?) -#: merge-recursive.c:715 merge-recursive.c:736 +#: merge-recursive.c:697 merge-recursive.c:718 msgid ": perhaps a D/F conflict?" msgstr ": kanske en K/F-konflikt?" -#: merge-recursive.c:726 +#: merge-recursive.c:708 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "vägrar förlora ospÃ¥rad fil vid \"%s\"" -#: merge-recursive.c:766 +#: merge-recursive.c:748 #, c-format msgid "cannot read object %s '%s'" msgstr "kan inte läsa objektet %s: \"%s\"" -#: merge-recursive.c:768 +#: merge-recursive.c:750 #, c-format msgid "blob expected for %s '%s'" msgstr "blob förväntades för %s \"%s\"" -#: merge-recursive.c:791 builtin/clone.c:302 +#: merge-recursive.c:773 builtin/clone.c:302 #, c-format msgid "failed to open '%s'" msgstr "misslyckades öppna \"%s\"" -#: merge-recursive.c:799 +#: merge-recursive.c:781 #, c-format msgid "failed to symlink '%s'" msgstr "misslyckades ta skapa symboliska länken \"%s\"" -#: merge-recursive.c:802 +#: merge-recursive.c:784 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "vet inte hur %06o %s \"%s\" skall hanteras" -#: merge-recursive.c:939 +#: merge-recursive.c:922 msgid "Failed to execute internal merge" msgstr "Misslyckades exekvera intern sammanslagning" -#: merge-recursive.c:943 +#: merge-recursive.c:926 #, c-format msgid "Unable to add %s to database" msgstr "Kunde inte lägga till %s till databasen" -#: merge-recursive.c:959 +#: merge-recursive.c:942 msgid "unsupported object type in the tree" msgstr "objekttyp som ej stöds upptäcktes i trädet" -#: merge-recursive.c:1038 merge-recursive.c:1052 +#: 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 " @@ -436,7 +490,7 @@ msgstr "" "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad " "i trädet." -#: merge-recursive.c:1044 merge-recursive.c:1057 +#: 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 " @@ -445,20 +499,20 @@ msgstr "" "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad " "i trädet vid %s." -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "rename" msgstr "namnbyte" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "renamed" msgstr "namnbytt" -#: merge-recursive.c:1154 +#: merge-recursive.c:1137 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "%s är en katalog i %s lägger till som %s istället" -#: merge-recursive.c:1176 +#: merge-recursive.c:1159 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -467,144 +521,144 @@ msgstr "" "KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" pÃ¥ grenen \"%s\" " "namnbyte \"%s\"->\"%s\" i \"%s\"%s" -#: merge-recursive.c:1181 +#: merge-recursive.c:1164 msgid " (left unresolved)" msgstr " (lämnad olöst)" -#: merge-recursive.c:1235 +#: merge-recursive.c:1218 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" "KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s" -#: merge-recursive.c:1265 +#: merge-recursive.c:1248 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "Byter namn pÃ¥ %s till %s och %s till %s istället" -#: merge-recursive.c:1464 +#: merge-recursive.c:1447 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "KONFLIKT (namnbyte/tillägg): Namnbyte %s->%s i %s. %s tillagd i %s" -#: merge-recursive.c:1474 +#: merge-recursive.c:1457 #, c-format msgid "Adding merged %s" msgstr "Lägger till sammanslagen %s" -#: merge-recursive.c:1479 merge-recursive.c:1677 +#: merge-recursive.c:1462 merge-recursive.c:1660 #, c-format msgid "Adding as %s instead" msgstr "Lägger till som %s iställer" -#: merge-recursive.c:1530 +#: merge-recursive.c:1513 #, c-format msgid "cannot read object %s" msgstr "kan inte läsa objektet %s" -#: merge-recursive.c:1533 +#: merge-recursive.c:1516 #, c-format msgid "object %s is not a blob" msgstr "objektet %s är inte en blob" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modify" msgstr "ändra" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modified" msgstr "ändrad" -#: merge-recursive.c:1591 +#: merge-recursive.c:1574 msgid "content" msgstr "innehÃ¥ll" -#: merge-recursive.c:1598 +#: merge-recursive.c:1581 msgid "add/add" msgstr "tillägg/tillägg" -#: merge-recursive.c:1632 +#: merge-recursive.c:1615 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "Hoppade över %s (sammanslagen samma som befintlig)" -#: merge-recursive.c:1646 +#: merge-recursive.c:1629 #, c-format msgid "Auto-merging %s" msgstr "SlÃ¥r ihop %s automatiskt" -#: merge-recursive.c:1650 git-submodule.sh:844 +#: merge-recursive.c:1633 git-submodule.sh:869 msgid "submodule" msgstr "undermodul" -#: merge-recursive.c:1651 +#: merge-recursive.c:1634 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s" -#: merge-recursive.c:1741 +#: merge-recursive.c:1724 #, c-format msgid "Removing %s" msgstr "Tar bort %s" -#: merge-recursive.c:1766 +#: merge-recursive.c:1749 msgid "file/directory" msgstr "fil/katalog" -#: merge-recursive.c:1772 +#: merge-recursive.c:1755 msgid "directory/file" msgstr "katalog/fil" -#: merge-recursive.c:1777 +#: merge-recursive.c:1760 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "" "KONFLIKT (%s): Det finns en katalog med namnet %s i %s. Lägger till %s som %s" -#: merge-recursive.c:1787 +#: merge-recursive.c:1770 #, c-format msgid "Adding %s" msgstr "Lägger till %s" -#: merge-recursive.c:1804 +#: merge-recursive.c:1787 msgid "Fatal merge failure, shouldn't happen." msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa." -#: merge-recursive.c:1823 +#: merge-recursive.c:1806 msgid "Already up-to-date!" msgstr "Redan à jour!" -#: merge-recursive.c:1832 +#: merge-recursive.c:1815 #, c-format msgid "merging of trees %s and %s failed" msgstr "sammanslagning av träden %s och %s misslyckades" -#: merge-recursive.c:1862 +#: merge-recursive.c:1845 #, c-format msgid "Unprocessed path??? %s" msgstr "Obehandlad sökväg??? %s" -#: merge-recursive.c:1907 +#: merge-recursive.c:1890 msgid "Merging:" msgstr "SlÃ¥r ihop:" -#: merge-recursive.c:1920 +#: merge-recursive.c:1903 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "hittade %u gemensam förfader:" msgstr[1] "hittade %u gemensamma förfäder:" -#: merge-recursive.c:1957 +#: merge-recursive.c:1940 msgid "merge returned no commit" msgstr "sammanslagningen returnerade ingen incheckning" -#: merge-recursive.c:2014 +#: merge-recursive.c:1997 #, c-format msgid "Could not parse object '%s'" msgstr "Kunde inte tolka objektet \"%s\"" -#: merge-recursive.c:2026 builtin/merge.c:697 +#: merge-recursive.c:2009 builtin/merge.c:696 msgid "Unable to write index." msgstr "Kunde inte skriva indexet." @@ -661,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:865 builtin/merge.c:978 -#: builtin/merge.c:1088 builtin/merge.c:1098 +#: 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:868 -#: builtin/merge.c:1090 builtin/merge.c:1103 +#: 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>'" @@ -681,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" @@ -691,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:758 sequencer.c:841 +#: 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:324 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "Kunde inte tolka incheckningen %s\n" -#: sequencer.c:329 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Kunde inte tolka föräldraincheckningen %s\n" -#: sequencer.c:395 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "Din indexfil har inte slagits ihop." -#: sequencer.c:398 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "Du har ingen giltig HEAD" -#: sequencer.c:413 +#: 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:421 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "Incheckning %s har inte förälder %d" -#: sequencer.c:425 +#: 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:436 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kan inte tolka föräldraincheckningen %s" -#: sequencer.c:440 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "Kan inte hämta incheckningsmeddelande för %s" -#: sequencer.c:524 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "kunde inte Ã¥ngra %s... %s" -#: sequencer.c:525 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "kunde inte tillämpa %s... %s" -#: sequencer.c:553 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "den angivna uppsättningen incheckningar är tom" -#: sequencer.c:561 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: misslyckades läsa indexet" -#: sequencer.c:566 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: misslyckades uppdatera indexet" -#: sequencer.c:624 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "kan inte %s under en %s" -#: sequencer.c:646 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "Kan inte tolka rad %d." -#: sequencer.c:651 +#: sequencer.c:663 msgid "No commits parsed." msgstr "Inga incheckningar lästes." -#: sequencer.c:664 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "Kunde inte öppna %s" -#: sequencer.c:668 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "kunde inte läsa %s." -#: sequencer.c:675 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Oanvändbart manus: %s" -#: sequencer.c:703 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "Felaktig nyckel: %s" -#: sequencer.c:706 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "Felaktigt värde för %s: %s" -#: sequencer.c:718 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "Trasigt manus: %s" -#: sequencer.c:739 +#: 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:740 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:744 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\"" -#: sequencer.c:760 sequencer.c:845 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "Fel vid ombrytning av %s." -#: sequencer.c:779 sequencer.c:913 +#: 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:781 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "kan inte bestämma HEAD" -#: sequencer.c:783 +#: 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:805 builtin/apply.c:3988 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "kan inte öppna %s: %s" -#: sequencer.c:808 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "kan inte läsa %s: %s" -#: sequencer.c:809 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "oväntat filslut" -#: sequencer.c:815 +#: 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:838 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "Kunde inte formatera %s." -#: sequencer.c:1000 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "Kan inte Ã¥ngra som första incheckning" -#: sequencer.c:1001 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud" @@ -921,12 +975,17 @@ msgstr "Ingen standarduppström angiven för grenen \"%s\"" msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "Uppströmsgrenen \"%s\" är inte lagrad som en fjärrspÃ¥rande gren" -#: wrapper.c:413 +#: wrapper.c:408 +#, c-format +msgid "unable to access '%s': %s" +msgstr "kan inte komma Ã¥t \"%s\": %s" + +#: wrapper.c:426 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "kan inte slÃ¥ upp aktuell användare i passwd-filen: %s" -#: wrapper.c:414 +#: wrapper.c:427 msgid "no such user" msgstr "okänd användare" @@ -985,12 +1044,6 @@ msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" " (checka in eller förkasta ospÃ¥rat eller ändrat innehÃ¥ll i undermoduler)" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: wt-status.c:224 -#, c-format -msgid "%s files:" -msgstr "%se filer:" - #: wt-status.c:227 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" @@ -1194,12 +1247,12 @@ msgid "Initial commit" msgstr "Första incheckning" #: wt-status.c:1011 -msgid "Untracked" -msgstr "OspÃ¥rad" +msgid "Untracked files" +msgstr "OspÃ¥rade filer" #: wt-status.c:1013 -msgid "Ignored" -msgstr "Ignorerad" +msgid "Ignored files" +msgstr "Ignorerade filer" # %s är nästa sträng eller tom. #: wt-status.c:1015 @@ -1215,67 +1268,87 @@ msgstr " (använd flaggan -u för att visa ospÃ¥rade filer)" msgid "No changes" msgstr "Inga ändringar" -#: wt-status.c:1027 +#: wt-status.c:1028 #, c-format -msgid "no changes added to commit%s\n" -msgstr "inga ändringar att checka in%s\n" - -#: wt-status.c:1029 -msgid " (use \"git add\" and/or \"git commit -a\")" -msgstr " (använd \"git add\" och/eller \"git commit -a\")" +msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" +msgstr "" +"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a" +"\")\n" #: wt-status.c:1031 #, c-format -msgid "nothing added to commit but untracked files present%s\n" -msgstr "inget köat för incheckning, men ospÃ¥rade filer finns%s\n" +msgid "no changes added to commit\n" +msgstr "inga ändringar att checka in\n" + +#: wt-status.c:1034 +#, c-format +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" +msgstr "" +"inget köat för incheckning, men ospÃ¥rade filer finns (spÃ¥ra med \"git add" +"\")\n" -#: wt-status.c:1033 -msgid " (use \"git add\" to track)" -msgstr " (spÃ¥ra med \"git add\")" +#: wt-status.c:1037 +#, c-format +msgid "nothing added to commit but untracked files present\n" +msgstr "inget köat för incheckning, men ospÃ¥rade filer finns\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 "inget att checka in%s\n" +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" +msgstr "inget att checka in (skapa/kopiera filer och spÃ¥ra med \"git add\")\n" -#: wt-status.c:1036 -msgid " (create/copy files and use \"git add\" to track)" -msgstr " (skapa/kopiera filer och spÃ¥ra med \"git add\")" +#: wt-status.c:1043 wt-status.c:1048 +#, c-format +msgid "nothing to commit\n" +msgstr "inget att checka in\n" -#: wt-status.c:1039 -msgid " (use -u to show untracked files)" -msgstr " (använd -u för att visa ospÃ¥rade filer)" +#: wt-status.c:1046 +#, c-format +msgid "nothing to commit (use -u to show untracked files)\n" +msgstr "inget att checka in (använd -u för att visa ospÃ¥rade filer)\n" -#: wt-status.c:1042 -msgid " (working directory clean)" -msgstr " (arbetskatalogen ren)" +#: wt-status.c:1050 +#, c-format +msgid "nothing to commit, working directory clean\n" +msgstr "inget att checka in, arbetskatalogen ren\n" -#: wt-status.c:1150 +#: wt-status.c:1158 msgid "HEAD (no branch)" msgstr "HEAD (ingen gren)" -#: wt-status.c:1156 +#: wt-status.c:1164 msgid "Initial commit on " msgstr "Första incheckning pÃ¥ " -#: wt-status.c:1171 +#: wt-status.c:1179 msgid "behind " msgstr "efter " -#: wt-status.c:1174 wt-status.c:1177 +#: wt-status.c:1182 wt-status.c:1185 msgid "ahead " msgstr "före " -#: wt-status.c:1179 +#: wt-status.c:1187 msgid ", behind " msgstr ", efter " +#: compat/precompose_utf8.c:58 builtin/clone.c:341 +#, c-format +msgid "failed to unlink '%s'" +msgstr "misslyckades ta bort länken \"%s\"" + +#: builtin/add.c:19 +msgid "git add [options] [--] <filepattern>..." +msgstr "git add [flaggor] [--] <filmönster>..." + #: builtin/add.c:62 #, c-format 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" @@ -1293,7 +1366,7 @@ msgstr "Sökvägen \"%s\" är i undermodulen \"%.*s\"" msgid "Unstaged changes after refreshing the index:" msgstr "OspÃ¥rade ändringar efter att ha uppdaterat indexet:" -#: 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 "sökvägsangivelsen \"%s\" motsvarade inte nÃ¥gra filer" @@ -1330,47 +1403,99 @@ msgstr "Tom patch. Avbryter." msgid "Could not apply '%s'" msgstr "Kunde inte tillämpa \"%s\"" -#: builtin/add.c:312 +#: builtin/add.c:313 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\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 "testkörning" + +#: 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 "var pratsam" + +#: builtin/add.c:322 +msgid "interactive picking" +msgstr "plocka interaktivt" + +#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248 +msgid "select hunks interactively" +msgstr "välj stycken interaktivt" + +#: builtin/add.c:324 +msgid "edit current diff and apply" +msgstr "redigera aktuell diff och applicera" + +#: builtin/add.c:325 +msgid "allow adding otherwise ignored files" +msgstr "tillÃ¥t lägga till annars ignorerade filer" + +#: builtin/add.c:326 +msgid "update tracked files" +msgstr "uppdatera spÃ¥rade filer" + +#: builtin/add.c:327 +msgid "record only the fact that the path will be added later" +msgstr "registrera endast att sökvägen kommer läggas till senare" + +#: builtin/add.c:328 +msgid "add changes from all tracked and untracked files" +msgstr "lägg till ändringar frÃ¥n alla spÃ¥rade och ospÃ¥rade filer" + +#: builtin/add.c:329 +msgid "don't add, only refresh the index" +msgstr "lägg inte till, uppdatera endast indexet" + +#: builtin/add.c:330 +msgid "just skip files which cannot be added because of errors" +msgstr "hoppa bara över filer som inte kan läggas till pÃ¥ grund av fel" + +#: builtin/add.c:331 +msgid "check if - even missing - files are ignored in dry run" +msgstr "se om - även saknade - filer ignoreras i testkörning" + +#: builtin/add.c:353 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "Använd -f om du verkligen vill lägga till dem.\n" -#: builtin/add.c:353 +#: builtin/add.c:354 msgid "no files added" msgstr "inga filer har lagts till" -#: builtin/add.c:359 +#: builtin/add.c:360 msgid "adding files failed" msgstr "misslyckades lägga till filer" -#: builtin/add.c:391 +#: builtin/add.c:392 msgid "-A and -u are mutually incompatible" msgstr "-A och -u är ömsesidigt inkompatibla" -#: builtin/add.c:393 +#: builtin/add.c:394 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run" -#: builtin/add.c:413 +#: builtin/add.c:414 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "Inget angivet, inget tillagt.\n" -#: builtin/add.c:414 +#: builtin/add.c:415 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Kanske menade du att skriva \"git add .\"?\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 "indexfilen trasig" -#: builtin/add.c:480 builtin/apply.c:4433 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 "Kunde inte skriva ny indexfil" @@ -1388,52 +1513,52 @@ msgstr "okänt alternativ för whitespace: \"%s\"" msgid "unrecognized whitespace ignore option '%s'" msgstr "okänt alternativ för ignore-whitespace: \"%s\"" -#: builtin/apply.c:824 +#: builtin/apply.c:823 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s" -#: builtin/apply.c:833 +#: builtin/apply.c:832 #, c-format msgid "regexec returned %d for input: %s" msgstr "regexec returnerade %d för indata: %s" -#: builtin/apply.c:914 +#: builtin/apply.c:913 #, c-format msgid "unable to find filename in patch at line %d" msgstr "kan inte hitta filnamn i patchen pÃ¥ rad %d" -#: builtin/apply.c:946 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "git apply: dÃ¥lig git-diff - förväntade /dev/null, fick %s pÃ¥ rad %d" -#: builtin/apply.c:950 +#: builtin/apply.c:949 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "git apply: dÃ¥lig git-diff - motsägande nytt filnamn pÃ¥ rad %d" -#: builtin/apply.c:951 +#: builtin/apply.c:950 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "git apply: dÃ¥lig git-diff - motsägande gammalt filnamn pÃ¥ rad %d" -#: builtin/apply.c:958 +#: builtin/apply.c:957 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "git apply: dÃ¥lig git-diff - förväntade /dev/null pÃ¥ rad %d" -#: builtin/apply.c:1403 +#: builtin/apply.c:1420 #, c-format msgid "recount: unexpected line: %.*s" msgstr "recount: förväntade rad: %.*s" -#: builtin/apply.c:1460 +#: builtin/apply.c:1477 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "patch-fragment utan huvud pÃ¥ rad %d: %.*s" -#: builtin/apply.c:1477 +#: builtin/apply.c:1494 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -1449,82 +1574,82 @@ msgstr[1] "" "sökvägskomponenter\n" "tas bort (rad %d)" -#: builtin/apply.c:1637 +#: builtin/apply.c:1654 msgid "new file depends on old contents" msgstr "ny fil beror pÃ¥ gammalt innehÃ¥ll" -#: builtin/apply.c:1639 +#: builtin/apply.c:1656 msgid "deleted file still has contents" msgstr "borttagen fil har fortfarande innehÃ¥ll" -#: builtin/apply.c:1665 +#: builtin/apply.c:1682 #, c-format msgid "corrupt patch at line %d" msgstr "trasig patch pÃ¥ rad %d" -#: builtin/apply.c:1701 +#: builtin/apply.c:1718 #, c-format msgid "new file %s depends on old contents" msgstr "nya filen %s beror pÃ¥ gammalt innehÃ¥ll" -#: builtin/apply.c:1703 +#: builtin/apply.c:1720 #, c-format msgid "deleted file %s still has contents" msgstr "borttagna filen %s har fortfarande innehÃ¥ll" -#: builtin/apply.c:1706 +#: builtin/apply.c:1723 #, c-format msgid "** warning: file %s becomes empty but is not deleted" msgstr "** varning: filen %s blir tom men har inte tagits bort" -#: builtin/apply.c:1852 +#: builtin/apply.c:1869 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "trasig binärpatch pÃ¥ rad %d: %.*s" #. there has to be one hunk (forward hunk) -#: builtin/apply.c:1881 +#: builtin/apply.c:1898 #, c-format msgid "unrecognized binary patch at line %d" msgstr "binärpatchen pÃ¥ rad %d känns inte igen" -#: builtin/apply.c:1967 +#: builtin/apply.c:1984 #, c-format msgid "patch with only garbage at line %d" msgstr "patch med bara skräp pÃ¥ rad %d" -#: builtin/apply.c:2057 +#: builtin/apply.c:2074 #, c-format msgid "unable to read symlink %s" msgstr "kunde inte läsa symboliska länken %s" -#: builtin/apply.c:2061 +#: builtin/apply.c:2078 #, c-format msgid "unable to open or read %s" msgstr "kunde inte öppna eller läsa %s" -#: builtin/apply.c:2132 +#: builtin/apply.c:2149 msgid "oops" msgstr "hoppsan" -#: builtin/apply.c:2654 +#: builtin/apply.c:2671 #, c-format msgid "invalid start of line: '%c'" msgstr "felaktig inledning pÃ¥ rad: \"%c\"" -#: builtin/apply.c:2772 +#: 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] "Stycke %d lyckades pÃ¥ %d (offset %d rad)." msgstr[1] "Stycke %d lyckades pÃ¥ %d (offset %d rader)." -#: builtin/apply.c:2784 +#: builtin/apply.c:2801 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "Sammanhang reducerat till (%ld/%ld) för att tillämpa fragment vid %d" -#: builtin/apply.c:2790 +#: builtin/apply.c:2807 #, c-format msgid "" "while searching for:\n" @@ -1533,321 +1658,318 @@ msgstr "" "vid sökning efter:\n" "%.*s" -#: builtin/apply.c:2809 +#: builtin/apply.c:2826 #, c-format msgid "missing binary patch data for '%s'" msgstr "saknar binära patchdata för \"%s\"" -#: builtin/apply.c:2912 +#: builtin/apply.c:2929 #, c-format msgid "binary patch does not apply to '%s'" msgstr "binärpatchen kan inte tillämpas pÃ¥ \"%s\"" -#: builtin/apply.c:2918 +#: builtin/apply.c:2935 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" msgstr "binärpatchen pÃ¥ \"%s\" ger felaktigt resultat (förväntade %s, fick %s)" -#: builtin/apply.c:2939 +#: builtin/apply.c:2956 #, c-format msgid "patch failed: %s:%ld" msgstr "patch misslyckades: %s:%ld" -#: builtin/apply.c:3061 +#: builtin/apply.c:3078 #, c-format msgid "cannot checkout %s" msgstr "kan inte checka ut %s" -#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159 +#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176 #, c-format msgid "read of %s failed" msgstr "misslyckades läsa %s" -#: builtin/apply.c:3139 builtin/apply.c:3361 +#: builtin/apply.c:3156 builtin/apply.c:3378 #, c-format msgid "path %s has been renamed/deleted" msgstr "sökvägen %s har ändrat namn/tagits bort" -#: builtin/apply.c:3220 builtin/apply.c:3375 +#: builtin/apply.c:3237 builtin/apply.c:3392 #, c-format msgid "%s: does not exist in index" msgstr "%s: finns inte i indexet" -#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389 +#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: builtin/apply.c:3229 builtin/apply.c:3383 +#: builtin/apply.c:3246 builtin/apply.c:3400 #, c-format msgid "%s: does not match index" msgstr "%s: motsvarar inte indexet" -#: builtin/apply.c:3331 +#: builtin/apply.c:3348 msgid "removal patch leaves file contents" msgstr "patch för borttagning lämnar kvar filinnehÃ¥ll" -#: builtin/apply.c:3400 +#: builtin/apply.c:3417 #, c-format msgid "%s: wrong type" msgstr "%s: fel typ" -#: builtin/apply.c:3402 +#: builtin/apply.c:3419 #, c-format msgid "%s has type %o, expected %o" msgstr "%s har typen %o, förväntade %o" -#: builtin/apply.c:3503 +#: builtin/apply.c:3520 #, c-format msgid "%s: already exists in index" msgstr "%s: finns redan i indexet" -#: builtin/apply.c:3506 +#: builtin/apply.c:3523 #, c-format msgid "%s: already exists in working directory" msgstr "%s: finns redan i arbetskatalogen" -#: builtin/apply.c:3526 +#: builtin/apply.c:3543 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o)" -#: builtin/apply.c:3531 +#: builtin/apply.c:3548 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o) för %s" -#: builtin/apply.c:3539 +#: builtin/apply.c:3556 #, c-format msgid "%s: patch does not apply" msgstr "%s: patchen kan inte tillämpas" -#: builtin/apply.c:3552 +#: builtin/apply.c:3569 #, c-format msgid "Checking patch %s..." msgstr "Kontrollerar patchen %s..." -#: builtin/apply.c:3607 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 misslyckades för sökvägen \"%s\"" -#: builtin/apply.c:3750 +#: builtin/apply.c:3767 #, c-format msgid "unable to remove %s from index" msgstr "kan inte ta bort %s frÃ¥n indexet" -#: builtin/apply.c:3778 +#: builtin/apply.c:3795 #, c-format msgid "corrupt patch for subproject %s" msgstr "trasig patch för underprojektet %s" -#: builtin/apply.c:3782 +#: builtin/apply.c:3799 #, c-format msgid "unable to stat newly created file '%s'" msgstr "kan inte ta status pÃ¥ nyligen skapade filen \"%s\"" -#: builtin/apply.c:3787 +#: builtin/apply.c:3804 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s" -#: builtin/apply.c:3790 builtin/apply.c:3898 +#: builtin/apply.c:3807 builtin/apply.c:3915 #, c-format msgid "unable to add cache entry for %s" msgstr "kan inte lägga till cachepost för %s" -#: builtin/apply.c:3823 +#: builtin/apply.c:3840 #, c-format msgid "closing file '%s'" msgstr "stänger filen \"%s\"" -#: builtin/apply.c:3872 +#: builtin/apply.c:3889 #, c-format msgid "unable to write file '%s' mode %o" msgstr "kan inte skriva filen \"%s\" läge %o" -#: builtin/apply.c:3959 +#: builtin/apply.c:3976 #, c-format msgid "Applied patch %s cleanly." msgstr "Tillämpade patchen %s rent." -#: builtin/apply.c:3967 +#: builtin/apply.c:3984 msgid "internal error" msgstr "internt fel" #. Say this even without --verbose -#: builtin/apply.c:3970 +#: builtin/apply.c:3987 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "Tillämpade patchen %%s med %d refuserad..." msgstr[1] "Tillämpade patchen %%s med %d refuserade..." -#: builtin/apply.c:3980 +#: builtin/apply.c:3997 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "trunkerar .rej-filnamnet till %.*s.rej" -#: builtin/apply.c:4001 +#: builtin/apply.c:4018 #, c-format msgid "Hunk #%d applied cleanly." msgstr "Stycke %d tillämpades rent." -#: builtin/apply.c:4004 +#: builtin/apply.c:4021 #, c-format msgid "Rejected hunk #%d." msgstr "Refuserar stycke %d." -#: builtin/apply.c:4154 +#: builtin/apply.c:4171 msgid "unrecognized input" msgstr "indata känns inte igen" -#: builtin/apply.c:4165 +#: builtin/apply.c:4182 msgid "unable to read index file" msgstr "kan inte läsa indexfilen" -#: builtin/apply.c:4284 builtin/apply.c:4287 +#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91 +#: builtin/fetch.c:63 msgid "path" msgstr "sökväg" -#: builtin/apply.c:4285 +#: builtin/apply.c:4302 msgid "don't apply changes matching the given path" msgstr "tillämpa inte ändringar som motsvarar given sökväg" -#: builtin/apply.c:4288 +#: builtin/apply.c:4305 msgid "apply changes matching the given path" msgstr "tillämpa ändringar som motsvarar given sökväg" -#: builtin/apply.c:4290 +#: builtin/apply.c:4307 msgid "num" msgstr "antal" -#: builtin/apply.c:4291 +#: builtin/apply.c:4308 msgid "remove <num> leading slashes from traditional diff paths" msgstr "ta bort <antal> inledande snedstreck frÃ¥n traditionella diff-sökvägar" -#: builtin/apply.c:4294 +#: builtin/apply.c:4311 msgid "ignore additions made by the patch" msgstr "ignorera tillägg gjorda av patchen" -#: builtin/apply.c:4296 +#: builtin/apply.c:4313 msgid "instead of applying the patch, output diffstat for the input" msgstr "istället för att tillämpa patchen, skriv ut diffstat för indata" -#: builtin/apply.c:4300 -msgid "shows number of added and deleted lines in decimal notation" -msgstr "visar antal tillagda och borttagna rader decimalt" +#: builtin/apply.c:4317 +msgid "show number of added and deleted lines in decimal notation" +msgstr "visa antal tillagda och borttagna rader decimalt" -#: builtin/apply.c:4302 +#: builtin/apply.c:4319 msgid "instead of applying the patch, output a summary for the input" msgstr "istället för att tillämpa patchen, skriv ut en summering av indata" -#: builtin/apply.c:4304 +#: builtin/apply.c:4321 msgid "instead of applying the patch, see if the patch is applicable" msgstr "istället för att tillämpa patchen, se om patchen kan tillämpas" -#: builtin/apply.c:4306 +#: builtin/apply.c:4323 msgid "make sure the patch is applicable to the current index" msgstr "se till att patchen kan tillämpas pÃ¥ aktuellt index" -#: builtin/apply.c:4308 +#: builtin/apply.c:4325 msgid "apply a patch without touching the working tree" msgstr "tillämpa en patch utan att röra arbetskatalogen" -#: builtin/apply.c:4310 +#: builtin/apply.c:4327 msgid "also apply the patch (use with --stat/--summary/--check)" msgstr "tillämpa ocksÃ¥ patchen (använd med --stat/--summary/--check)" -#: builtin/apply.c:4312 +#: builtin/apply.c:4329 msgid "attempt three-way merge if a patch does not apply" msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas" -#: builtin/apply.c:4314 +#: builtin/apply.c:4331 msgid "build a temporary index based on embedded index information" msgstr "bygg ett temporärt index baserat pÃ¥ inbyggd indexinformation" -#: builtin/apply.c:4316 +#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460 msgid "paths are separated with NUL character" msgstr "sökvägar avdelas med NUL-tecken" -#: builtin/apply.c:4319 +#: builtin/apply.c:4336 msgid "ensure at least <n> lines of context match" msgstr "se till att Ã¥tminstone <n> rader sammanhang är lika" -#: builtin/apply.c:4320 +#: builtin/apply.c:4337 msgid "action" msgstr "Ã¥tgärd" -#: builtin/apply.c:4321 +#: builtin/apply.c:4338 msgid "detect new or modified lines that have whitespace errors" msgstr "detektera nya eller ändrade rader som har fel i blanktecken" -#: builtin/apply.c:4324 builtin/apply.c:4327 +#: builtin/apply.c:4341 builtin/apply.c:4344 msgid "ignore changes in whitespace when finding context" msgstr "ignorera ändringar i blanktecken för sammanhang" -#: builtin/apply.c:4330 +#: builtin/apply.c:4347 msgid "apply the patch in reverse" msgstr "tillämpa patchen baklänges" -#: builtin/apply.c:4332 +#: builtin/apply.c:4349 msgid "don't expect at least one line of context" msgstr "förvänta inte minst en rad sammanhang" -#: builtin/apply.c:4334 +#: builtin/apply.c:4351 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "lämna refuserade stycken i motsvarande *.rej-filer" -#: builtin/apply.c:4336 +#: builtin/apply.c:4353 msgid "allow overlapping hunks" msgstr "tillÃ¥t överlappande stycken" -#: builtin/apply.c:4337 -msgid "be verbose" -msgstr "var pratsam" - -#: builtin/apply.c:4339 +#: builtin/apply.c:4356 msgid "tolerate incorrectly detected missing new-line at the end of file" msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut" -#: builtin/apply.c:4342 +#: builtin/apply.c:4359 msgid "do not trust the line counts in the hunk headers" msgstr "lite inte pÃ¥ antalet linjer i styckehuvuden" -#: builtin/apply.c:4344 +#: builtin/apply.c:4361 msgid "root" msgstr "rot" -#: builtin/apply.c:4345 +#: builtin/apply.c:4362 msgid "prepend <root> to all filenames" msgstr "lägg till <rot> i alla filnamn" -#: builtin/apply.c:4367 +#: builtin/apply.c:4384 msgid "--3way outside a repository" msgstr "--3way utanför arkiv" -#: builtin/apply.c:4375 +#: builtin/apply.c:4392 msgid "--index outside a repository" msgstr "--index utanför arkiv" -#: builtin/apply.c:4378 +#: builtin/apply.c:4395 msgid "--cached outside a repository" msgstr "--cached utanför arkiv" -#: builtin/apply.c:4394 +#: builtin/apply.c:4411 #, c-format msgid "can't open patch '%s'" msgstr "kan inte öppna patchen \"%s\"" -#: builtin/apply.c:4408 +#: builtin/apply.c:4425 #, c-format msgid "squelched %d whitespace error" msgid_plural "squelched %d whitespace errors" msgstr[0] "undertryckte %d fel i blanksteg" msgstr[1] "undertryckte %d fel i blanksteg" -#: builtin/apply.c:4414 builtin/apply.c:4424 +#: builtin/apply.c:4431 builtin/apply.c:4441 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -1889,7 +2011,135 @@ msgstr "git archive: protokollfel" msgid "git archive: expected a flush" msgstr "git archive: förväntade en tömning (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 "utför 'git bisect next'" + +#: builtin/bisect--helper.c:19 +msgid "update BISECT_HEAD instead of checking out the current commit" +msgstr "uppdatera BISECT_HEAD istället för att checka ut aktuell incheckning" + +#: builtin/blame.c:25 +msgid "git blame [options] [rev-opts] [rev] [--] file" +msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil" + +#: builtin/blame.c:30 builtin/shortlog.c:15 +msgid "[rev-opts] are documented in git-rev-list(1)" +msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)" + +#: 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: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:2375 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "Behandla inte rotincheckningar som gränser (Standard: av)" + +#: builtin/blame.c:2376 +msgid "Show work cost statistics" +msgstr "Visa statistik över arbetskostnad" + +#: builtin/blame.c:2377 +msgid "Show output score for blame entries" +msgstr "Visa utdatapoäng för klandringsposter" + +#: builtin/blame.c:2378 +msgid "Show original filename (Default: auto)" +msgstr "Visa originalfilnamn (Standard: auto)" + +#: builtin/blame.c:2379 +msgid "Show original linenumber (Default: off)" +msgstr "Visa ursprungligt radnummer (Standard: av)" + +#: 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:2381 +msgid "Show porcelain format with per-line commit information" +msgstr "Visa porslinsformat med per-rad-incheckningsinformation" + +#: 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:2383 +msgid "Show raw timestamp (Default: off)" +msgstr "Visa rÃ¥ tidsstämpel (Standard: av)" + +#: builtin/blame.c:2384 +msgid "Show long commit SHA1 (Default: off)" +msgstr "Visa lÃ¥ng inchecknings-SHA1 (Standard: av)" + +#: builtin/blame.c:2385 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)" + +#: 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:2387 +msgid "Ignore whitespace differences" +msgstr "Ignorera ändringar i blanksteg" + +#: 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: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:2390 +msgid "Use <file>'s contents as the final image" +msgstr "Använd <fil>s innehÃ¥ll som slutgiltig bild" + +#: builtin/blame.c:2391 builtin/blame.c:2392 +msgid "score" +msgstr "poäng" + +#: builtin/blame.c:2391 +msgid "Find line copies within and across files" +msgstr "Hitta kopierade rader inuti och mellan filer" + +#: builtin/blame.c:2392 +msgid "Find line movements within and across files" +msgstr "Hitta flyttade rader inuti och mellan filer" + +#: 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 "Behandla endast radintervallet n,m, med början pÃ¥ 1" + +#: builtin/branch.c:23 +msgid "git branch [options] [-r | -a] [--merged | --no-merged]" +msgstr "git branch [flaggor] [-r | -a] [--merged | --no-merged]" + +#: builtin/branch.c:24 +msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]" +msgstr "git branch [flaggor] [-l] [-f] <grennamn> [<startpunkt>]" + +#: builtin/branch.c:25 +msgid "git branch [options] [-r] (-d | -D) <branchname>..." +msgstr "git branch [flaggor] [-r] (-d | -D) <grennamn>..." + +#: builtin/branch.c:26 +msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>" +msgstr "git branch [flaggor] (-m | -M) [<gammal_gren>] <ny_gren>" + +#: builtin/branch.c:145 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" @@ -1898,7 +2148,7 @@ msgstr "" "tar bort grenen \"%s\" som har slagits ihop med\n" " \"%s\", men ännu inte slagits ihop med HEAD." -#: builtin/branch.c:148 +#: builtin/branch.c:149 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" @@ -1907,35 +2157,35 @@ msgstr "" "tar inte bort grenen \"%s\" som inte har slagits ihop med\n" " \"%s\", trots att den har slagits ihop med HEAD." -#: builtin/branch.c:180 +#: builtin/branch.c:181 msgid "cannot use -a with -d" msgstr "kan inte ange -a med -d" -#: builtin/branch.c:186 +#: builtin/branch.c:187 msgid "Couldn't look up commit object for HEAD" msgstr "Kunde inte slÃ¥ upp incheckningsobjekt för HEAD" -#: builtin/branch.c:191 +#: builtin/branch.c:192 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "Kan inte ta bort grenen \"%s\" som du befinner dig pÃ¥ för närvarande." -#: builtin/branch.c:202 +#: builtin/branch.c:203 #, c-format msgid "remote branch '%s' not found." msgstr "fjärrgrenen \"%s\" hittades inte." -#: builtin/branch.c:203 +#: builtin/branch.c:204 #, c-format msgid "branch '%s' not found." msgstr "grenen \"%s\" hittades inte." -#: builtin/branch.c:210 +#: builtin/branch.c:211 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "Kunde inte slÃ¥ upp incheckningsobjekt för \"%s\"" -#: builtin/branch.c:216 +#: builtin/branch.c:217 #, c-format msgid "" "The branch '%s' is not fully merged.\n" @@ -1944,129 +2194,259 @@ msgstr "" "Grenen \"%s\" har inte slagits samman i sin helhet.\n" "Om du är säker pÃ¥ att du vill ta bort den, kör \"git branch -D %s\"." -#: builtin/branch.c:225 +#: builtin/branch.c:226 #, c-format msgid "Error deleting remote branch '%s'" msgstr "Fel vid borttagning av fjärrgrenen \"%s\"" -#: builtin/branch.c:226 +#: builtin/branch.c:227 #, c-format msgid "Error deleting branch '%s'" msgstr "Fel vid borttagning av grenen \"%s\"" -#: builtin/branch.c:233 +#: builtin/branch.c:234 #, c-format msgid "Deleted remote branch %s (was %s).\n" msgstr "Tog bort fjärrgrenen %s (var %s).\n" -#: builtin/branch.c:234 +#: builtin/branch.c:235 #, c-format msgid "Deleted branch %s (was %s).\n" msgstr "Tog bort grenen %s (var %s).\n" -#: builtin/branch.c:239 +#: builtin/branch.c:240 msgid "Update of config-file failed" msgstr "Misslyckades uppdatera konfigurationsfil" -#: builtin/branch.c:337 +#: builtin/branch.c:338 #, c-format msgid "branch '%s' does not point at a commit" msgstr "grenen \"%s\" pekar inte pÃ¥ en incheckning" -#: builtin/branch.c:409 +#: builtin/branch.c:410 #, c-format msgid "[%s: behind %d]" msgstr "[%s: bakom %d] " -#: builtin/branch.c:411 +#: builtin/branch.c:412 #, c-format msgid "[behind %d]" msgstr "[bakom %d] " -#: builtin/branch.c:415 +#: builtin/branch.c:416 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: före %d] " -#: builtin/branch.c:417 +#: builtin/branch.c:418 #, c-format msgid "[ahead %d]" msgstr "[före %d] " -#: builtin/branch.c:420 +#: builtin/branch.c:421 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: före %d, bakom %d] " -#: builtin/branch.c:423 +#: builtin/branch.c:424 #, c-format msgid "[ahead %d, behind %d]" msgstr "[före %d, bakom %d] " -#: builtin/branch.c:535 +#: builtin/branch.c:537 msgid "(no branch)" msgstr "(ingen gren)" -#: builtin/branch.c:600 +#: builtin/branch.c:602 msgid "some refs could not be read" msgstr "vissa referenser kunde inte läsas" -#: builtin/branch.c:613 +#: builtin/branch.c:615 msgid "cannot rename the current branch while not on any." msgstr "" "kunde inte byta namn pÃ¥ aktuell gren när du inte befinner dig pÃ¥ nÃ¥gon." -#: builtin/branch.c:623 +#: builtin/branch.c:625 #, c-format msgid "Invalid branch name: '%s'" msgstr "Felaktigt namn pÃ¥ gren: \"%s\"" -#: builtin/branch.c:638 +#: builtin/branch.c:640 msgid "Branch rename failed" msgstr "Misslyckades byta namn pÃ¥ gren" -#: builtin/branch.c:642 +#: builtin/branch.c:644 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "Bytte bort namn pÃ¥ en felaktigt namngiven gren \"%s\"" -#: builtin/branch.c:646 +#: builtin/branch.c:648 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "Grenen namnbytt till %s, men HEAD har inte uppdaterats!" -#: builtin/branch.c:653 +#: builtin/branch.c:655 msgid "Branch is renamed, but update of config-file failed" msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen" -#: builtin/branch.c:668 +#: builtin/branch.c:670 #, c-format msgid "malformed object name %s" msgstr "felformat objektnamn %s" -#: builtin/branch.c:692 +#: builtin/branch.c:694 #, c-format msgid "could not write branch description template: %s" msgstr "kunde inte skriva grenbeskrivningsmall: %s" -#: builtin/branch.c:783 +#: builtin/branch.c:724 +msgid "Generic options" +msgstr "Allmänna flaggor" + +#: builtin/branch.c:726 +msgid "show hash and subject, give twice for upstream branch" +msgstr "visa hash och ärenderad, ange tvÃ¥ gÃ¥nger för uppströmsgren" + +#: builtin/branch.c:727 +msgid "suppress informational messages" +msgstr "undertryck informationsmeddelanden" + +#: builtin/branch.c:728 +msgid "set up tracking mode (see git-pull(1))" +msgstr "ställ in spÃ¥rningsläge (se git-pull(1))" + +#: builtin/branch.c:730 +msgid "change upstream info" +msgstr "ändra uppströmsinformation" + +#: builtin/branch.c:734 +msgid "use colored output" +msgstr "använd färgad utdata" + +#: builtin/branch.c:735 +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:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 +msgid "commit" +msgstr "incheckning" + +#: builtin/branch.c:739 builtin/branch.c:745 +msgid "print only branches that contain the commit" +msgstr "visa endast grenar som innehÃ¥ller incheckningen" + +#: builtin/branch.c:751 +msgid "Specific git-branch actions:" +msgstr "Specifika git-branch-Ã¥tgärder:" + +#: builtin/branch.c:752 +msgid "list both remote-tracking and local branches" +msgstr "visa bÃ¥de fjärrspÃ¥rande och lokala grenar" + +#: builtin/branch.c:754 +msgid "delete fully merged branch" +msgstr "ta bort helt sammanslagen gren" + +#: builtin/branch.c:755 +msgid "delete branch (even if not merged)" +msgstr "ta bort gren (även om inte helt sammanslagen)" + +#: builtin/branch.c:756 +msgid "move/rename a branch and its reflog" +msgstr "flytta/ta bort en gren och dess reflogg" + +#: builtin/branch.c:757 +msgid "move/rename a branch, even if target exists" +msgstr "flytta/ta bort en gren, även om mÃ¥let finns" + +#: builtin/branch.c:758 +msgid "list branch names" +msgstr "lista namn pÃ¥ grenar" + +#: builtin/branch.c:759 +msgid "create the branch's reflog" +msgstr "skapa grenens reflogg" + +#: builtin/branch.c:761 +msgid "edit the description for the branch" +msgstr "redigera beskrivning för grenen" + +#: builtin/branch.c:762 +msgid "force creation (when already exists)" +msgstr "tvinga skapande (när den redan finns)" + +#: builtin/branch.c:765 +msgid "print only not merged branches" +msgstr "visa endast ej sammanslagna grenar" + +#: builtin/branch.c:771 +msgid "print only merged branches" +msgstr "visa endast sammanslagna grenar" + +#: builtin/branch.c:775 +msgid "list branches in columns" +msgstr "visa grenar i spalter" + +#: builtin/branch.c:788 msgid "Failed to resolve HEAD as a valid ref." msgstr "Misslyckades slÃ¥ upp HEAD som giltig referens" -#: builtin/branch.c:788 builtin/clone.c:561 +#: builtin/branch.c:793 builtin/clone.c:561 msgid "HEAD not found below refs/heads!" msgstr "HEAD hittades inte under refs/heads!" -#: builtin/branch.c:808 +#: builtin/branch.c:813 msgid "--column and --verbose are incompatible" msgstr "--column och --verbose är inkompatibla" -#: builtin/branch.c:857 +#: builtin/branch.c:864 +#, c-format +msgid "branch '%s' does not exist" +msgstr "grenen \"%s\" finns inte" + +#: builtin/branch.c:876 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "Grenen \"%s\" har ingen uppströmsinformation" + +#: builtin/branch.c:891 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" "flaggorna -a och -r pÃ¥ \"git branch\" kan inte anges tillsammans med ett " "grennamn" +#: 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 "" +"Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track " +"eller --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" +"Om du vill göra sÃ¥ att \"%s\" spÃ¥rar \"%s\" gör du sÃ¥ här:\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" @@ -2080,99 +2460,227 @@ msgstr "Behöver ett arkiv för att skapa ett paket (bundle)." msgid "Need a repository to unbundle." msgstr "Behöver ett arkiv för att packa upp ett paket (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|<typ>|--textconv) <objekt>" + +#: builtin/cat-file.c:248 +msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" +msgstr "git cat-file (--batch|--batch-check) < <objektlista>" + +#: builtin/cat-file.c:266 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "<typ> kan vara en av: blob, tree, commit, tag" + +#: builtin/cat-file.c:267 +msgid "show object type" +msgstr "visa objekttyp" + +#: builtin/cat-file.c:268 +msgid "show object size" +msgstr "visa objektstorlek" + +#: builtin/cat-file.c:270 +msgid "exit with zero when there's no error" +msgstr "avsluta med noll när det inte uppstÃ¥tt nÃ¥got fel" + +#: builtin/cat-file.c:271 +msgid "pretty-print object's content" +msgstr "visa objektets innehÃ¥ll snyggt" + +#: builtin/cat-file.c:273 +msgid "for blob objects, run textconv on object's content" +msgstr "för blob-objekt, kör textconv pÃ¥ objektets innehÃ¥ll" + +#: builtin/cat-file.c:275 +msgid "show info and content of objects fed from the standard input" +msgstr "visa information och innehÃ¥ll för objekt som listas pÃ¥ standard in" + +#: builtin/cat-file.c:278 +msgid "show info about objects fed from the standard input" +msgstr "visa information för objekt som listas pÃ¥ standard in" + +#: builtin/check-attr.c:11 +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 [-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" +msgstr "visa alla attribut som satts pÃ¥ filen" + +#: builtin/check-attr.c:20 +msgid "use .gitattributes only from the index" +msgstr "använd .gitattributes endast frÃ¥n indexet" + +#: builtin/check-attr.c:21 builtin/hash-object.c:75 +msgid "read file names from stdin" +msgstr "läs filnamn frÃ¥n standard in" + +#: builtin/check-attr.c:23 +msgid "input paths are terminated by a null character" +msgstr "sökvägar avdelas med null-tecken" + +#: builtin/checkout-index.c:126 +msgid "git checkout-index [options] [--] [<file>...]" +msgstr "git checkout-index [flaggor] [--] [<fil>...]" + +#: builtin/checkout-index.c:187 +msgid "check out all files in the index" +msgstr "checka ut alla filer i indexet" + +#: builtin/checkout-index.c:188 +msgid "force overwrite of existing files" +msgstr "tvinga överskrivning av befintliga filer" + +#: builtin/checkout-index.c:190 +msgid "no warning for existing files and files not in index" +msgstr "ingen varning för existerande filer och filer ej i indexet" + +#: builtin/checkout-index.c:192 +msgid "don't checkout new files" +msgstr "checka inte ut nya filer" + +#: builtin/checkout-index.c:194 +msgid "update stat information in the index file" +msgstr "uppdatera stat-information i indexfilen" + +#: builtin/checkout-index.c:200 +msgid "read list of paths from the standard input" +msgstr "läs listan över sökvägar frÃ¥n standard in" + +#: builtin/checkout-index.c:202 +msgid "write the content to temporary files" +msgstr "skriv innehÃ¥ll till temporära filer" + +#: builtin/checkout-index.c:203 builtin/column.c:30 +msgid "string" +msgstr "sträng" + +#: builtin/checkout-index.c:204 +msgid "when creating files, prepend <string>" +msgstr "när filer skapas, lägg till <sträng> först" + +#: builtin/checkout-index.c:207 +msgid "copy out the files from named stage" +msgstr "kopiera ut filer frÃ¥n namngiven etapp" + +#: builtin/checkout.c:25 +msgid "git checkout [options] <branch>" +msgstr "git checkout [flaggor] <gren>" + +#: builtin/checkout.c:26 +msgid "git checkout [options] [<branch>] -- <file>..." +msgstr "git checkout [flaggor] [<gren>] -- <fil>..." + +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have our version" msgstr "sökvägen \"%s\" har inte vÃ¥r version" -#: 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 "sökvägen \"%s\" har inte deras version" -#: builtin/checkout.c:132 +#: builtin/checkout.c:134 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "sökvägen \"%s\" innehÃ¥ller inte alla nödvändiga versioner" -#: builtin/checkout.c:176 +#: builtin/checkout.c:178 #, c-format msgid "path '%s' does not have necessary versions" msgstr "sökvägen \"%s\" innehÃ¥ller inte nödvändiga versioner" -#: builtin/checkout.c:193 +#: builtin/checkout.c:195 #, c-format msgid "path '%s': cannot merge" msgstr "sökväg \"%s\": kan inte slÃ¥ ihop" -#: builtin/checkout.c:210 +#: builtin/checkout.c:212 #, c-format msgid "Unable to add merge result for '%s'" msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\"" -#: builtin/checkout.c:235 builtin/checkout.c:393 +#: 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\" kan inte användas vid uppdatering av sökvägar" + +#: builtin/checkout.c:248 builtin/checkout.c:251 +#, c-format +msgid "'%s' cannot be used with %s" +msgstr "\"%s\" kan inte användas med %s" + +#: builtin/checkout.c:254 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt." + +#: builtin/checkout.c:265 builtin/checkout.c:426 msgid "corrupt index file" msgstr "indexfilen är trasig" -#: builtin/checkout.c:265 builtin/checkout.c:272 +#: builtin/checkout.c:295 builtin/checkout.c:302 #, c-format msgid "path '%s' is unmerged" msgstr "sökvägen \"%s\" har inte slagits ihop" -#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586 -#: builtin/merge.c:812 +#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586 +#: builtin/merge.c:811 msgid "unable to write new index file" msgstr "kunde inte skriva ny indexfil" -#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "diff_setup_done misslyckades" - -#: builtin/checkout.c:415 +#: builtin/checkout.c:448 msgid "you need to resolve your current index first" msgstr "du mÃ¥ste lösa ditt befintliga index först" -#: builtin/checkout.c:534 +#: builtin/checkout.c:569 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Kan inte skapa referenslog för \"%s\"\n" -#: builtin/checkout.c:567 +#: builtin/checkout.c:602 msgid "HEAD is now at" msgstr "HEAD är nu pÃ¥" -#: builtin/checkout.c:574 +#: builtin/checkout.c:609 #, c-format msgid "Reset branch '%s'\n" msgstr "Ã…terställ gren \"%s\"\n" -#: builtin/checkout.c:577 +#: builtin/checkout.c:612 #, c-format msgid "Already on '%s'\n" msgstr "Redan pÃ¥ \"%s\"\n" -#: builtin/checkout.c:581 +#: builtin/checkout.c:616 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Växlade till och nollställde grenen \"%s\"\n" -#: builtin/checkout.c:583 +#: builtin/checkout.c:618 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Växlade till en ny gren \"%s\"\n" -#: builtin/checkout.c:585 +#: builtin/checkout.c:620 #, c-format msgid "Switched to branch '%s'\n" msgstr "Växlade till grenen \"%s\"\n" -#: builtin/checkout.c:641 +#: builtin/checkout.c:676 #, c-format msgid " ... and %d more.\n" msgstr " ... och %d till.\n" #. The singular version -#: builtin/checkout.c:647 +#: builtin/checkout.c:682 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2195,7 +2703,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:665 +#: 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" @@ -2210,88 +2718,150 @@ msgstr "" " git branch nytt_grennamn %s\n" "\n" -#: builtin/checkout.c:695 +#: builtin/checkout.c:730 msgid "internal error in revision walk" msgstr "internt fel vid genomgÃ¥ng av revisioner (revision walk)" -#: builtin/checkout.c:699 +#: builtin/checkout.c:734 msgid "Previous HEAD position was" msgstr "Tidigare position för HEAD var" -#: builtin/checkout.c:725 builtin/checkout.c:920 +#: builtin/checkout.c:761 builtin/checkout.c:950 msgid "You are on a branch yet to be born" msgstr "Du är pÃ¥ en gren som ännu inte är född" #. case (1) -#: builtin/checkout.c:856 +#: builtin/checkout.c:886 #, c-format msgid "invalid reference: %s" msgstr "felaktig referens: %s" #. case (1): want a tree -#: builtin/checkout.c:895 +#: builtin/checkout.c:925 #, c-format msgid "reference is not a tree: %s" msgstr "referensen är inte ett träd: %s" -#: builtin/checkout.c:977 -msgid "-B cannot be used with -b" -msgstr "-B kan inte användas med -b" +#: builtin/checkout.c:961 +msgid "paths cannot be used with switching branches" +msgstr "sökvägar kan inte användas vid byte av gren" + +#: builtin/checkout.c:964 builtin/checkout.c:968 +#, c-format +msgid "'%s' cannot be used with switching branches" +msgstr "\"%s\" kan inte användas vid byte av gren" + +#: 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\" kan inte användas med \"%s\"" + +#: builtin/checkout.c:988 +#, c-format +msgid "Cannot switch branch to a non-commit '%s'" +msgstr "Kan inte växla gren till icke-incheckningen \"%s\"" + +#: builtin/checkout.c:1009 builtin/gc.c:177 +msgid "suppress progress reporting" +msgstr "undertryck förloppsrapportering" + +#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89 +#: builtin/remote.c:169 builtin/remote.c:171 +msgid "branch" +msgstr "gren" + +#: builtin/checkout.c:1011 +msgid "create and checkout a new branch" +msgstr "skapa och checka ut en ny gren" + +#: builtin/checkout.c:1013 +msgid "create/reset and checkout a branch" +msgstr "skapa/nollställ och checka ut en gren" + +#: builtin/checkout.c:1014 +msgid "create reflog for new branch" +msgstr "skapa reflogg för ny gren" + +#: builtin/checkout.c:1015 +msgid "detach the HEAD at named commit" +msgstr "koppla frÃ¥n HEAD vid namngiven incheckning" -#: builtin/checkout.c:986 -msgid "--patch is incompatible with all other options" -msgstr "--patch är inkompatibel med alla andra flaggor" +#: builtin/checkout.c:1016 +msgid "set upstream info for new branch" +msgstr "sätt uppströmsinformation för ny gren" -#: builtin/checkout.c:989 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "--detcah kan inte användas med -b/-B/--orphan" +#: builtin/checkout.c:1018 +msgid "new branch" +msgstr "ny gren" -#: builtin/checkout.c:991 -msgid "--detach cannot be used with -t" -msgstr "--detach kan inte användas med -t" +#: builtin/checkout.c:1018 +msgid "new unparented branch" +msgstr "ny gren utan förälder" -#: builtin/checkout.c:997 +#: builtin/checkout.c:1019 +msgid "checkout our version for unmerged files" +msgstr "checka ut vÃ¥r version för ej sammanslagna filer" + +#: builtin/checkout.c:1021 +msgid "checkout their version for unmerged files" +msgstr "checka ut deras version för ej sammanslagna filer" + +#: builtin/checkout.c:1023 +msgid "force checkout (throw away local modifications)" +msgstr "tvinga utcheckning (kasta bort lokala ändringar)" + +#: builtin/checkout.c:1024 +msgid "perform a 3-way merge with the new branch" +msgstr "utför en 3-vägssammanslagning för den nya grenen" + +#: builtin/checkout.c:1025 builtin/merge.c:215 +msgid "update ignored files (default)" +msgstr "uppdatera ignorerade filer (standard)" + +#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241 +msgid "style" +msgstr "stil" + +#: builtin/checkout.c:1027 +msgid "conflict style (merge or diff3)" +msgstr "konfliktstil (merge eller diff3)" + +#: builtin/checkout.c:1030 +msgid "second guess 'git checkout no-such-branch'" +msgstr "förutspÃ¥ \"git checkout gren-saknas\"" + +#: builtin/checkout.c:1054 +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "-b, -B och --orphan är ömsesidigt uteslutande" + +#: builtin/checkout.c:1071 msgid "--track needs a branch name" msgstr "--track behöver ett namn pÃ¥ en gren" -#: builtin/checkout.c:1004 +#: builtin/checkout.c:1078 msgid "Missing branch name; try -b" msgstr "Grennamn saknas; försök med -b" -#: builtin/checkout.c:1010 -msgid "--orphan and -b|-B are mutually exclusive" -msgstr "--orphan och -b|-B kan inte användas samtidigt" - -#: builtin/checkout.c:1012 -msgid "--orphan cannot be used with -t" -msgstr "--orphan kan inte användas med -t" - -#: builtin/checkout.c:1022 -msgid "git checkout: -f and -m are incompatible" -msgstr "git checkout: -f och -m är inkompatibla" - -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1113 msgid "invalid path specification" msgstr "felaktig sökvägsangivelse" -#: builtin/checkout.c:1064 +#: 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: uppdatera sökvägar är inkompatibelt med att växla gren.\n" -"Ville du checka ut \"%s\" som inte kan lösas som en sammanslaning?" - -#: builtin/checkout.c:1066 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren." +"Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n" +"Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?" -#: builtin/checkout.c:1071 -msgid "git checkout: --detach does not take a path argument" -msgstr "git checkout: --detach tar inte en sökväg som argument" +#: builtin/checkout.c:1125 +#, c-format +msgid "git checkout: --detach does not take a path argument '%s'" +msgstr "git checkout: --detach tar inte en sökväg som argument \"%s\"" -#: builtin/checkout.c:1074 +#: builtin/checkout.c:1129 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -2299,13 +2869,39 @@ msgstr "" "git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n" "du checkar ut frÃ¥n indexet." -#: builtin/checkout.c:1093 -msgid "Cannot switch branch to a non-commit." -msgstr "Kan inte växla gren pÃ¥ en icke-incheckning." +#: 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önster>] [-x | -X] [--] <sökvägar>..." + +#: builtin/clean.c:51 +msgid "do not print names of files removed" +msgstr "skriv inte ut namn pÃ¥ borttagna filer" + +#: builtin/clean.c:53 +msgid "force" +msgstr "tvinga" + +#: builtin/clean.c:55 +msgid "remove whole directories" +msgstr "ta bort hela kataloger" -#: builtin/checkout.c:1096 -msgid "--ours/--theirs is incompatible with switching branches." -msgstr "--ours/--theirs är inkompatibla med att byta gren." +#: 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" + +#: builtin/clean.c:57 +msgid "add <pattern> to ignore rules" +msgstr "lägg till <mönster> till ignoreringsregler" + +#: builtin/clean.c:58 +msgid "remove ignored files, too" +msgstr "ta även bort ignorerade filer" + +#: builtin/clean.c:60 +msgid "remove only ignored files" +msgstr "ta endast bort ignorerade filer" #: builtin/clean.c:78 msgid "-x and -X cannot be used together" @@ -2351,6 +2947,99 @@ msgstr "Skulle inte ta bort %s\n" msgid "Not removing %s\n" msgstr "Tar inte bort %s\n" +#: builtin/clone.c:36 +msgid "git clone [options] [--] <repo> [<dir>]" +msgstr "git clone [flaggor] [--] <arkiv> [<kat>]" + +#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212 +#: builtin/push.c:399 +msgid "force progress reporting" +msgstr "tvinga förloppsrapportering" + +#: builtin/clone.c:66 +msgid "don't create a checkout" +msgstr "skapa inte nÃ¥gon utcheckning" + +#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488 +msgid "create a bare repository" +msgstr "skapa ett naket (\"bare\") arkiv" + +#: builtin/clone.c:72 +msgid "create a mirror repository (implies bare)" +msgstr "skapa ett spegelarkiv (implicerar \"bare\")" + +#: builtin/clone.c:74 +msgid "to clone from a local repository" +msgstr "för att klona frÃ¥n ett lokalt arkiv" + +#: builtin/clone.c:76 +msgid "don't use local hardlinks, always copy" +msgstr "skapa inte lokala hÃ¥rda länkar, kopiera alltid" + +#: builtin/clone.c:78 +msgid "setup as shared repository" +msgstr "skapa som ett delat arkiv" + +#: builtin/clone.c:80 builtin/clone.c:82 +msgid "initialize submodules in the clone" +msgstr "initiera undermoduler i klonen" + +#: builtin/clone.c:83 builtin/init-db.c:485 +msgid "template-directory" +msgstr "mallkatalog" + +#: builtin/clone.c:84 builtin/init-db.c:486 +msgid "directory from which templates will be used" +msgstr "katalog att använda mallar frÃ¥n" + +#: builtin/clone.c:86 +msgid "reference repository" +msgstr "referensarkiv" + +#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +msgid "name" +msgstr "namn" + +#: builtin/clone.c:88 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "använd <namn> istället för \"origin\" för att spÃ¥ra uppströms" + +#: builtin/clone.c:90 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "checka ut <gren> istället för fjärrens HEAD" + +#: builtin/clone.c:92 +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:748 +msgid "depth" +msgstr "djup" + +#: builtin/clone.c:94 +msgid "create a shallow clone of that depth" +msgstr "skapa en grund klon pÃ¥ detta djup" + +#: builtin/clone.c:96 +msgid "clone only one branch, HEAD or --branch" +msgstr "klona endast en gren, HEAD eller --branch" + +#: builtin/clone.c:97 builtin/init-db.c:494 +msgid "gitdir" +msgstr "gitkat" + +#: builtin/clone.c:98 builtin/init-db.c:495 +msgid "separate git dir from working tree" +msgstr "separera gitkatalogen frÃ¥n arbetskatalogen" + +#: builtin/clone.c:99 +msgid "key=value" +msgstr "nyckel=värde" + +#: builtin/clone.c:100 +msgid "set config inside the new repository" +msgstr "ställ in konfiguration i det nya arkivet" + #: builtin/clone.c:243 #, c-format msgid "reference repository '%s' is not a local directory." @@ -2361,7 +3050,7 @@ msgstr "referensarkivet \"%s\" är inte en lokal katalog." msgid "failed to create directory '%s'" msgstr "misslyckades skapa katalogen \"%s\"" -#: builtin/clone.c:308 builtin/diff.c:75 +#: builtin/clone.c:308 builtin/diff.c:77 #, c-format msgid "failed to stat '%s'" msgstr "misslyckades ta status pÃ¥ \"%s\"" @@ -2376,11 +3065,6 @@ msgstr "%s finns och är ingen katalog" msgid "failed to stat %s\n" msgstr "misslyckades ta status pÃ¥ %s\n" -#: builtin/clone.c:341 -#, c-format -msgid "failed to unlink '%s'" -msgstr "misslyckades ta bort länken \"%s\"" - #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" @@ -2406,77 +3090,113 @@ 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." +#: builtin/column.c:9 +msgid "git column [options]" +msgstr "git column [flaggor]" + +#: builtin/column.c:26 +msgid "lookup config vars" +msgstr "slÃ¥ upp konfigurationsvariabler" + +#: builtin/column.c:27 builtin/column.c:28 +msgid "layout to use" +msgstr "utseende att använda" + +#: builtin/column.c:29 +msgid "Maximum width" +msgstr "Maximal bredd" + +#: builtin/column.c:30 +msgid "Padding space on left border" +msgstr "Spaltfyllnad i vänsterkanten" + +#: builtin/column.c:31 +msgid "Padding space on right border" +msgstr "Spaltfyllnad i högerkanten" + +#: builtin/column.c:32 +msgid "Padding space between columns" +msgstr "Spaltfyllnad mellan spalter" + #: builtin/column.c:51 msgid "--command must be the first argument" msgstr "--command mÃ¥ste vara första argument" -#: builtin/commit.c:43 +#: builtin/commit.c:34 +msgid "git commit [options] [--] <filepattern>..." +msgstr "git commit [flaggor] [--] <filmöster>..." + +#: builtin/commit.c:39 +msgid "git status [options] [--] <filepattern>..." +msgstr "git status [flaggor] [--] <filmönster>..." + +#: 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" @@ -2501,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" @@ -2511,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" @@ -2527,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:496 builtin/commit.c:502 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "felaktig incheckning: %s" -#: builtin/commit.c:525 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "felformad \"--author\"-flagga" -#: builtin/commit.c:585 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "Felaktig indragningssträng: \"%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 "kunde inte slÃ¥ upp incheckningen %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 "(läser loggmeddelande frÃ¥n standard in)\n" -#: builtin/commit.c:637 +#: 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:641 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "kunde inte läsa loggfilen \"%s\"" -#: builtin/commit.c:647 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "incheckningen har ett tomt meddelande" -#: builtin/commit.c:663 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "kunde inte läsa MERGE_MSG" -#: builtin/commit.c:667 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "kunde inte läsa SQUASH_MSG" -#: builtin/commit.c:671 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/commit.c:723 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "kunde inte skriva incheckningsmall" -#: builtin/commit.c:734 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -2628,7 +3348,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:739 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -2643,7 +3363,7 @@ msgstr "" "\t%s\n" "och försöker igen.\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" @@ -2651,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: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" @@ -2661,159 +3381,349 @@ 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:769 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "%sFörfattare: %s" -#: builtin/commit.c:776 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "%sIncheckare: %s" -#: builtin/commit.c:796 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "Kan inte läsa indexet" -#: builtin/commit.c:833 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "Fel vid byggande av träd" -#: 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 "Ange meddelandet en av flaggorna -m eller -F.\n" -#: builtin/commit.c:945 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "Hittade ingen befintlig författare med \"%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 "Ogiltigt läge för ospÃ¥rade filer: \"%s\"" -#: builtin/commit.c:1000 +#: 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:1011 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "Du har inget att utöka." -#: builtin/commit.c:1014 +#: 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:1016 +#: 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:1019 +#: 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:1029 +#: 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:1031 +#: 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:1039 +#: 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:1056 +#: 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:1058 +#: 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:1060 +#: 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:1062 +#: 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:1072 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:1077 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "Kan inte ange sökvägar med -a." -#: builtin/commit.c:1260 +#: builtin/commit.c:1156 builtin/commit.c:1384 +msgid "show status concisely" +msgstr "vis koncis status" + +#: builtin/commit.c:1158 builtin/commit.c:1386 +msgid "show branch information" +msgstr "visa information om gren" + +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 +msgid "machine-readable output" +msgstr "maskinläsbar utdata" + +#: builtin/commit.c:1163 builtin/commit.c:1390 +msgid "terminate entries with NUL" +msgstr "terminera poster med 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 "läge" + +#: 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:1169 +msgid "show ignored files" +msgstr "visa ignorerade filer" + +#: builtin/commit.c:1170 parse-options.h:151 +msgid "when" +msgstr "när" + +#: builtin/commit.c:1171 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "" +"ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. " +"(Default: all)" + +#: builtin/commit.c:1173 +msgid "list untracked files in columns" +msgstr "visa ospÃ¥rade filer i spalter" + +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "kunde inte slÃ¥ upp en precis skapad incheckning" -#: builtin/commit.c:1262 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "kunde inte tolka en precis skapad incheckning" -#: builtin/commit.c:1303 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "frÃ¥nkopplad HEAD" -#: builtin/commit.c:1305 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr " (rotincheckning)" -#: builtin/commit.c:1449 +#: builtin/commit.c:1354 +msgid "suppress summary after successful commit" +msgstr "undertryck sammanfattning efter framgÃ¥ngsrik incheckning" + +#: builtin/commit.c:1355 +msgid "show diff in commit message template" +msgstr "visa diff i mallen för incheckningsmeddelandet" + +#: builtin/commit.c:1357 +msgid "Commit message options" +msgstr "Alternativ för incheckningsmeddelande" + +#: builtin/commit.c:1358 builtin/tag.c:459 +msgid "read message from file" +msgstr "läs meddelande frÃ¥n fil" + +#: builtin/commit.c:1359 +msgid "author" +msgstr "författare" + +#: builtin/commit.c:1359 +msgid "override author for commit" +msgstr "överstyr författare för incheckningen" + +#: builtin/commit.c:1360 builtin/gc.c:178 +msgid "date" +msgstr "datum" + +#: builtin/commit.c:1360 +msgid "override date for commit" +msgstr "överstyr datum för inchecknignen" + +#: 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:1361 +msgid "commit message" +msgstr "incheckningsmeddelande" + +#: 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:1363 +msgid "reuse message from specified commit" +msgstr "Ã¥teranvänd meddelande frÃ¥n angiven incheckning" + +#: 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: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: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:1367 builtin/log.c:1068 builtin/revert.c:109 +msgid "add Signed-off-by:" +msgstr "lägg till Signed-off-by:" + +#: builtin/commit.c:1368 +msgid "use specified template file" +msgstr "använd angiven mallfil" + +#: builtin/commit.c:1369 +msgid "force edit of commit" +msgstr "tvinga redigering av incheckning" + +#: builtin/commit.c:1370 +msgid "default" +msgstr "standard" + +#: 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:1371 +msgid "include status in commit message template" +msgstr "inkludera status i mallen för incheckningsmeddelandet" + +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 +msgid "key id" +msgstr "nyckel-id" + +#: builtin/commit.c:1373 builtin/merge.c:214 +msgid "GPG sign commit" +msgstr "GPG-signera incheckning" + +#. end commit message options +#: builtin/commit.c:1376 +msgid "Commit contents options" +msgstr "Alternativ för incheckningens innehÃ¥ll" + +#: builtin/commit.c:1377 +msgid "commit all changed files" +msgstr "checka in alla ändrade filer" + +#: 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:1379 +msgid "interactively add files" +msgstr "lägg till filer interaktivt" + +#: builtin/commit.c:1380 +msgid "interactively add changes" +msgstr "lägg till ändringar interaktivt" + +#: builtin/commit.c:1381 +msgid "commit only specified files" +msgstr "checka endast in angivna filer" + +#: builtin/commit.c:1382 +msgid "bypass pre-commit hook" +msgstr "förbigÃ¥ pre-commit-krok" + +#: builtin/commit.c:1383 +msgid "show what would be committed" +msgstr "visa vad som skulle checkas in" + +#: builtin/commit.c:1391 +msgid "amend previous commit" +msgstr "lägg till föregÃ¥ende incheckning" + +#: builtin/commit.c:1392 +msgid "bypass post-rewrite hook" +msgstr "förbigÃ¥ post-rewrite-krok" + +#: builtin/commit.c:1397 +msgid "ok to record an empty change" +msgstr "ok att registrera en tom ändring" + +#: 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:1432 msgid "could not parse HEAD commit" msgstr "kunde inte tolka HEAD:s incheckning" -#: builtin/commit.c:1487 builtin/merge.c:509 +#: 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:1494 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Trasig MERGE_HEAD-fil (%s)" -#: builtin/commit.c:1501 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "kunde inte läsa MERGE_MODE" -#: builtin/commit.c:1520 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "kunde inte läsa incheckningsmeddelande: %s" -#: builtin/commit.c:1534 +#: 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:1539 +#: 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:1554 builtin/merge.c:936 builtin/merge.c:961 +#: 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:1575 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "kunde inte lÃ¥sa HEAD-referens" -#: builtin/commit.c:1579 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "kunde inte uppdatera HEAD-referens" -#: 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" @@ -2824,6 +3734,134 @@ msgstr "" "att kvoten inte har överskridits, och kör sedan\n" "\"git reset HEAD\" för att Ã¥terställa." +#: builtin/config.c:7 +msgid "git config [options]" +msgstr "git config [flaggor]" + +#: builtin/config.c:52 +msgid "Config file location" +msgstr "Konfigurationsfilens plats" + +#: builtin/config.c:53 +msgid "use global config file" +msgstr "använd global konfigurationsfil" + +#: builtin/config.c:54 +msgid "use system config file" +msgstr "använd systemets konfigurationsfil" + +#: builtin/config.c:55 +msgid "use repository config file" +msgstr "använd arkivets konfigurationsfil" + +#: builtin/config.c:56 +msgid "use given config file" +msgstr "använd angiven konfigurationsil" + +#: builtin/config.c:57 +msgid "Action" +msgstr "Ã…tgärd" + +#: builtin/config.c:58 +msgid "get value: name [value-regex]" +msgstr "hämta värde: namn [värde-reguttr]" + +#: builtin/config.c:59 +msgid "get all values: key [value-regex]" +msgstr "hämta alla värden: nyckel [värde-reguttr]" + +#: builtin/config.c:60 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]" + +#: builtin/config.c:61 +msgid "replace all matching variables: name value [value_regex]" +msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]" + +#: builtin/config.c:62 +msgid "add a new variable: name value" +msgstr "lägg till en ny variabel: namn värde" + +#: builtin/config.c:63 +msgid "remove a variable: name [value-regex]" +msgstr "ta bort en variabel: namn [värde-reguttr]" + +#: builtin/config.c:64 +msgid "remove all matches: name [value-regex]" +msgstr "ta bort alla träffar: namn [värde-reguttr]" + +#: builtin/config.c:65 +msgid "rename section: old-name new-name" +msgstr "byt namn pÃ¥ sektion: gammalt-namn nytt-namn" + +#: builtin/config.c:66 +msgid "remove a section: name" +msgstr "ta bort en sektion: namn" + +#: builtin/config.c:67 +msgid "list all" +msgstr "visa alla" + +#: builtin/config.c:68 +msgid "open an editor" +msgstr "öppna textredigeringsprogram" + +#: builtin/config.c:69 builtin/config.c:70 +msgid "slot" +msgstr "plats" + +#: builtin/config.c:69 +msgid "find the color configured: [default]" +msgstr "hitta den inställda färgen: [default]" + +#: builtin/config.c:70 +msgid "find the color setting: [stdout-is-tty]" +msgstr "hitta färginställningen: [stdout-is-tty]" + +#: builtin/config.c:71 +msgid "Type" +msgstr "Typ" + +#: builtin/config.c:72 +msgid "value is \"true\" or \"false\"" +msgstr "värdet är \"true\" eller \"false\"" + +#: builtin/config.c:73 +msgid "value is decimal number" +msgstr "värdet är ett decimalt tal" + +#: builtin/config.c:74 +msgid "value is --bool or --int" +msgstr "värdet är --bool eller --int" + +#: builtin/config.c:75 +msgid "value is a path (file or directory name)" +msgstr "värdet är en sökväg (fil- eller katalognamn)" + +#: builtin/config.c:76 +msgid "Other" +msgstr "Andra" + +#: builtin/config.c:77 +msgid "terminate values with NUL byte" +msgstr "terminera värden med NUL-byte" + +#: builtin/config.c:78 +msgid "respect include directives on lookup" +msgstr "respektera inkluderingsdirektiv vid uppslag" + +#: 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 [flaggor] <incheckning-igt>*" + +#: builtin/describe.c:16 +msgid "git describe [options] --dirty" +msgstr "git describe [flaggor] --dirty" + #: builtin/describe.c:234 #, c-format msgid "annotated tag %s not available" @@ -2896,6 +3934,50 @@ msgstr "" "mer än %i taggar hittades; listar de %i senaste\n" "gav upp sökningen vid %s\n" +#: builtin/describe.c:403 +msgid "find the tag that comes after the commit" +msgstr "hitta taggen som kommer efter incheckningen" + +#: builtin/describe.c:404 +msgid "debug search strategy on stderr" +msgstr "felsök sökstrategin pÃ¥ standard fel" + +#: builtin/describe.c:405 +msgid "use any ref in .git/refs" +msgstr "använd alla referenser i .git/refs" + +#: builtin/describe.c:406 +msgid "use any tag in .git/refs/tags" +msgstr "använd alla taggar i .git/refs/tags" + +#: builtin/describe.c:407 +msgid "always use long format" +msgstr "använd alltid lÃ¥ngt format" + +#: builtin/describe.c:410 +msgid "only output exact matches" +msgstr "skriv endast ut exakta träffar" + +#: builtin/describe.c:412 +msgid "consider <n> most recent tags (default: 10)" +msgstr "överväg de <n> nyaste taggarna (standard: 10)" + +#: builtin/describe.c:414 +msgid "only consider tags matching <pattern>" +msgstr "överväg endast taggar som motsvarar <mönster>" + +#: builtin/describe.c:416 builtin/name-rev.c:238 +msgid "show abbreviated commit object as fallback" +msgstr "visa förkortade incheckningsobjekt som standard" + +#: builtin/describe.c:417 +msgid "mark" +msgstr "märke" + +#: builtin/describe.c:418 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "lägg till <märke> pÃ¥ lortigt arbetsträd (standard: \"-dirty\")" + #: builtin/describe.c:436 msgid "--long is incompatible with --abbrev=0" msgstr "--long är inkompatibel med --abbrev=0" @@ -2908,45 +3990,165 @@ msgstr "Inga namn hittades, kan inte beskriva nÃ¥got." msgid "--dirty is incompatible with committishes" msgstr "--dirty är inkompatibelt med \"committish\"-värden" -#: builtin/diff.c:77 +#: builtin/diff.c:79 #, c-format msgid "'%s': not a regular file or symlink" msgstr "\"%s\": inte en normal fil eller symbolisk länk" -#: builtin/diff.c:220 +#: builtin/diff.c:224 #, c-format msgid "invalid option: %s" msgstr "ogiltig flagga: %s" -#: builtin/diff.c:297 +#: builtin/diff.c:301 msgid "Not a git repository" msgstr "Inte ett git-arkiv" -#: builtin/diff.c:341 +#: builtin/diff.c:344 #, c-format msgid "invalid object '%s' given." msgstr "objektet \"%s\" som angavs är felaktigt." -#: builtin/diff.c:346 +#: builtin/diff.c:349 #, c-format msgid "more than %d trees given: '%s'" msgstr "mer än %d träd angavs: \"%s\"" -#: builtin/diff.c:356 +#: builtin/diff.c:359 #, c-format msgid "more than two blobs given: '%s'" msgstr "mer än tvÃ¥ blobbar angavs: \"%s\"" -#: builtin/diff.c:364 +#: builtin/diff.c:367 #, c-format msgid "unhandled object '%s' given." msgstr "ej hanterat objekt \"%s\" angavs." -#: builtin/fetch.c:200 +#: builtin/fast-export.c:22 +msgid "git fast-export [rev-list-opts]" +msgstr "git fast-export [rev-list-flaggor]" + +#: builtin/fast-export.c:635 +msgid "show progress after <n> objects" +msgstr "visa förlopp efter <n> objekt" + +#: builtin/fast-export.c:637 +msgid "select handling of signed tags" +msgstr "välj hantering av signerade taggar" + +#: builtin/fast-export.c:640 +msgid "select handling of tags that tag filtered objects" +msgstr "välj hantering av taggar som har taggfiltrerade objekt" + +#: builtin/fast-export.c:643 +msgid "Dump marks to this file" +msgstr "Dump märken till filen" + +#: builtin/fast-export.c:645 +msgid "Import marks from this file" +msgstr "Importera märken frÃ¥n filen" + +#: builtin/fast-export.c:647 +msgid "Fake a tagger when tags lack one" +msgstr "Fejka taggare när taggen saknar en" + +#: builtin/fast-export.c:649 +msgid "Output full tree for each commit" +msgstr "Skriv ut hela trädet för varje incheckning" + +#: builtin/fast-export.c:651 +msgid "Use the done feature to terminate the stream" +msgstr "Använd done-funktionen för att avsluta strömmen" + +#: builtin/fast-export.c:652 +msgid "Skip output of blob data" +msgstr "Hoppa över skrivning av blob-data" + +#: builtin/fetch.c:20 +msgid "git fetch [<options>] [<repository> [<refspec>...]]" +msgstr "git fetch [<flaggor>] [<arkiv> [<refspec>...]]" + +#: builtin/fetch.c:21 +msgid "git fetch [<options>] <group>" +msgstr "git fetch [<flaggor>] <grupp>" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" +msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]" + +#: builtin/fetch.c:23 +msgid "git fetch --all [<options>]" +msgstr "git fetch --all [<flaggor>]" + +#: builtin/fetch.c:60 +msgid "fetch from all remotes" +msgstr "hämta frÃ¥n alla fjärrar" + +#: builtin/fetch.c:62 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "lägg till i .git/FETCH_HEAD istället för att skriva över" + +#: builtin/fetch.c:64 +msgid "path to upload pack on remote end" +msgstr "sökväg till upload pack pÃ¥ fjärren" + +#: builtin/fetch.c:65 +msgid "force overwrite of local branch" +msgstr "tvinga överskrivning av lokal gren" + +#: builtin/fetch.c:67 +msgid "fetch from multiple remotes" +msgstr "hämta frÃ¥n flera fjärrar" + +#: builtin/fetch.c:69 +msgid "fetch all tags and associated objects" +msgstr "hämta alla taggar och associerade objekt" + +#: builtin/fetch.c:71 +msgid "do not fetch all tags (--no-tags)" +msgstr "hämta inte alla taggar (--no-tags)" + +#: builtin/fetch.c:73 +msgid "prune remote-tracking branches no longer on remote" +msgstr "rensa fjärrspÃ¥rande grenar ej längre pÃ¥ fjärren" + +#: builtin/fetch.c:74 +msgid "on-demand" +msgstr "on-demand" + +#: builtin/fetch.c:75 +msgid "control recursive fetching of submodules" +msgstr "styr rekursiv hämtning av undermoduler" + +#: builtin/fetch.c:79 +msgid "keep downloaded pack" +msgstr "behÃ¥ll hämtade paket" + +#: builtin/fetch.c:81 +msgid "allow updating of HEAD ref" +msgstr "tillÃ¥t uppdatering av HEAD-referens" + +#: builtin/fetch.c:84 +msgid "deepen history of shallow clone" +msgstr "fördjupa historik för grund klon" + +#: builtin/fetch.c:85 builtin/log.c:1083 +msgid "dir" +msgstr "kat" + +#: builtin/fetch.c:86 +msgid "prepend this to submodule path output" +msgstr "lägg till i början av undermodulens sökvägsutdata" + +#: builtin/fetch.c:89 +msgid "default mode for recursion" +msgstr "standardläge för rekursion" + +#: builtin/fetch.c:201 msgid "Couldn't find remote ref HEAD" msgstr "Kunde inte hitta fjärr-referensen HEAD" -#: builtin/fetch.c:253 +#: builtin/fetch.c:254 #, c-format msgid "object %s not found" msgstr "objektet %s hittades inte" @@ -3058,17 +4260,17 @@ msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s" msgid "Option \"%s\" is ignored for %s\n" msgstr "Flaggan \"%s\" ignoreras för %s\n" -#: builtin/fetch.c:888 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "Hämtar %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 "Kunde inte hämta %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." @@ -3076,27 +4278,146 @@ 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:927 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "Du mÃ¥ste ange namnet pÃ¥ en tagg." -#: builtin/fetch.c:979 +#: 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:981 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kan inte anges med referensspecifikationer" -#: builtin/fetch.c:992 +#: 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:1000 +#: 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" +#: 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 <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]" + +#: 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 "fyll i loggen med som mest <n> poster frÃ¥n shortlog" + +#: builtin/fmt-merge-msg.c:657 +msgid "alias for --log (deprecated)" +msgstr "alias för --log (avrÃ¥ds)" + +#: builtin/fmt-merge-msg.c:660 +msgid "text" +msgstr "text" + +#: builtin/fmt-merge-msg.c:661 +msgid "use <text> as start of message" +msgstr "inled meddelande med <text>" + +#: builtin/fmt-merge-msg.c:662 +msgid "file to read from" +msgstr "fil att läsa frÃ¥n" + +#: builtin/for-each-ref.c:979 +msgid "git for-each-ref [options] [<pattern>]" +msgstr "git for-each-ref [flaggor] [<mönster>]" + +#: builtin/for-each-ref.c:994 +msgid "quote placeholders suitably for shells" +msgstr "citera platshÃ¥llare passande för skal" + +#: builtin/for-each-ref.c:996 +msgid "quote placeholders suitably for perl" +msgstr "citera platshÃ¥llare passande för perl" + +#: builtin/for-each-ref.c:998 +msgid "quote placeholders suitably for python" +msgstr "citera platshÃ¥llare passande för python" + +#: builtin/for-each-ref.c:1000 +msgid "quote placeholders suitably for tcl" +msgstr "citera platshÃ¥llare passande för tcl" + +#: builtin/for-each-ref.c:1003 +msgid "show only <n> matched refs" +msgstr "visa endast <n> träffade refs" + +#: builtin/for-each-ref.c:1004 +msgid "format" +msgstr "format" + +#: builtin/for-each-ref.c:1004 +msgid "format to use for the output" +msgstr "format att använda för utdata" + +#: builtin/for-each-ref.c:1005 +msgid "key" +msgstr "nyckel" + +#: builtin/for-each-ref.c:1006 +msgid "field name to sort on" +msgstr "fältnamn att sortera pÃ¥" + +#: builtin/fsck.c:608 +msgid "git fsck [options] [<object>...]" +msgstr "git fsck [flaggor] [<objekt>...]" + +#: builtin/fsck.c:614 +msgid "show unreachable objects" +msgstr "visa onÃ¥bara objekt" + +#: builtin/fsck.c:615 +msgid "show dangling objects" +msgstr "visa dinglande objekt" + +#: builtin/fsck.c:616 +msgid "report tags" +msgstr "rapportera taggar" + +#: builtin/fsck.c:617 +msgid "report root nodes" +msgstr "rapportera rotnoder" + +#: builtin/fsck.c:618 +msgid "make index objects head nodes" +msgstr "gör indexojekt till huvudnoder" + +#: builtin/fsck.c:619 +msgid "make reflogs head nodes (default)" +msgstr "gör refloggar till huvudnoder (standard)" + +#: builtin/fsck.c:620 +msgid "also consider packs and alternate objects" +msgstr "ta även hänsyn till paket och alternativa objekt" + +#: builtin/fsck.c:621 +msgid "enable more strict checking" +msgstr "aktivera striktare kontroll" + +#: builtin/fsck.c:623 +msgid "write dangling objects in .git/lost-found" +msgstr "skriv dinglande objekt i .git/lost-found" + +#: builtin/fsck.c:624 builtin/prune.c:134 +msgid "show progress" +msgstr "visa förlopp" + +#: builtin/gc.c:22 +msgid "git gc [options]" +msgstr "git gc [flaggor]" + #: builtin/gc.c:63 #, c-format msgid "Invalid %s: '%s'" @@ -3107,12 +4428,19 @@ msgstr "Felaktigt %s: \"%s\"" msgid "insanely long object directory %.*s" msgstr "tokigt lÃ¥ng objektkatalog %.*s" -#: 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:179 +msgid "prune unreferenced objects" +msgstr "rensa ej refererade objekt" + +#: builtin/gc.c:181 +msgid "be more thorough (increased runtime)" +msgstr "var mer grundlig (ökar körtiden)" -#: builtin/gc.c:224 +#: builtin/gc.c:182 +msgid "enable auto-gc mode" +msgstr "aktivera auto-gc-läge" + +#: builtin/gc.c:222 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -3121,72 +4449,300 @@ 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 "" "Det finns för mÃ¥nga onÃ¥bara lösa objekt; kör \"git prune\" för att ta bort " "dem." -#: builtin/grep.c:216 +#: builtin/grep.c:22 +msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "git grep [flaggor] [-e] <mönster> [<rev>...] [[--] <sökväg>...]" + +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: misslyckades skapa trÃ¥d. %s" -#: builtin/grep.c:402 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "Kunde inte byta katalog (chdir): %s" -#: builtin/grep.c:478 builtin/grep.c:512 +#: 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:526 +#: 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:584 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "flaggan \"%c\" antar ett numeriskt värde" -#: builtin/grep.c:601 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "kan inte öppna \"%s\"" -#: builtin/grep.c:885 +#: 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:731 +msgid "find in contents not managed by git" +msgstr "sök i innehÃ¥l som inte hanteras av git" + +#: 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:735 +msgid "search also in ignored files" +msgstr "sök även i ignorerade filer" + +#: builtin/grep.c:738 +msgid "show non-matching lines" +msgstr "vis rader som inte träffas" + +#: builtin/grep.c:740 +msgid "case insensitive matching" +msgstr "skiftlägesokänslig sökning" + +#: builtin/grep.c:742 +msgid "match patterns only at word boundaries" +msgstr "matcha endast mönster vid ordgränser" + +#: builtin/grep.c:744 +msgid "process binary files as text" +msgstr "hantera binärfiler som text" + +#: builtin/grep.c:746 +msgid "don't match patterns in binary files" +msgstr "träffa inte mönster i binärfiler" + +#: builtin/grep.c:749 +msgid "descend at most <depth> levels" +msgstr "gÃ¥ som mest ned <djup> nivÃ¥er" + +#: builtin/grep.c:753 +msgid "use extended POSIX regular expressions" +msgstr "använd utökade POSIX-reguljära uttryck" + +#: builtin/grep.c:756 +msgid "use basic POSIX regular expressions (default)" +msgstr "använd grundläggande POSIX-reguljära uttryck (standard)" + +#: builtin/grep.c:759 +msgid "interpret patterns as fixed strings" +msgstr "tolka mönster som fixerade strängar" + +#: builtin/grep.c:762 +msgid "use Perl-compatible regular expressions" +msgstr "använd Perlkompatibla reguljära uttryck" + +#: builtin/grep.c:765 +msgid "show line numbers" +msgstr "visa radnummer" + +#: builtin/grep.c:766 +msgid "don't show filenames" +msgstr "visa inte filnamn" + +#: builtin/grep.c:767 +msgid "show filenames" +msgstr "visa filnamn" + +#: builtin/grep.c:769 +msgid "show filenames relative to top directory" +msgstr "visa filnamn relativa till toppkatalogen" + +#: 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:773 +msgid "synonym for --files-with-matches" +msgstr "synonym för --files-with-matches" + +#: 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:778 +msgid "print NUL after filenames" +msgstr "skriv NUL efter filnamn" + +#: 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:781 +msgid "highlight matches" +msgstr "ljusmarkera träffar" + +#: 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: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:788 +msgid "show <n> context lines before and after matches" +msgstr "visa <n> rader sammanhang före och efter träffar" + +#: builtin/grep.c:791 +msgid "show <n> context lines before matches" +msgstr "visa <n> rader sammanhang före träffar" + +#: builtin/grep.c:793 +msgid "show <n> context lines after matches" +msgstr "visa <n> rader sammanhang efter träffar" + +#: builtin/grep.c:794 +msgid "shortcut for -C NUM" +msgstr "genväg för -C NUM" + +#: 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:799 +msgid "show the surrounding function" +msgstr "visa den omkringliggande funktionen" + +#: builtin/grep.c:802 +msgid "read patterns from file" +msgstr "läs mönster frÃ¥n fil" + +#: builtin/grep.c:804 +msgid "match <pattern>" +msgstr "träffa <mönster>" + +#: builtin/grep.c:806 +msgid "combine patterns specified with -e" +msgstr "kombinera mönster som anges med -e" + +#: builtin/grep.c:818 +msgid "indicate hit with exit status without output" +msgstr "ange träff med slutstatuskod utan utdata" + +#: 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:826 +msgid "show matching files in the pager" +msgstr "visa träffade filer i filbläddraren" + +#: 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:830 builtin/show-ref.c:201 +msgid "show usage" +msgstr "visa användning" + +#: builtin/grep.c:921 msgid "no pattern given." msgstr "inget mönster angavs." -#: builtin/grep.c:899 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "felaktigt objekt %s" -#: builtin/grep.c:940 +#: 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:963 +#: 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:968 +#: 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:971 +#: 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:979 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "bÃ¥de --cached och träd angavs." +#: builtin/hash-object.c:60 +msgid "" +"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] " +"<file>..." +msgstr "" +"git hash-object [-t <typ>] [-w] [--path=<fil>|--no-filters] [--stdin] [--] " +"<fil>..." + +#: builtin/hash-object.c:61 +msgid "git hash-object --stdin-paths < <list-of-paths>" +msgstr "git hash-object --stdin-paths < <sökvägslista>" + +#: builtin/hash-object.c:72 +msgid "type" +msgstr "typ" + +#: builtin/hash-object.c:72 +msgid "object type" +msgstr "objekttyp" + +#: builtin/hash-object.c:73 +msgid "write the object into the object database" +msgstr "skriv objektet till objektdatabasen" + +#: builtin/hash-object.c:74 +msgid "read the object from stdin" +msgstr "läs objektet frÃ¥n standard in" + +#: builtin/hash-object.c:76 +msgid "store file as is without filters" +msgstr "spara filen som den är utan filer" + +#: builtin/hash-object.c:77 +msgid "process file as it were from this path" +msgstr "hantera filen som om den kom frÃ¥n sökvägen" + +#: builtin/help.c:43 +msgid "print all available commands" +msgstr "visa alla tillgängliga kommandon" + +#: builtin/help.c:44 +msgid "show man page" +msgstr "visa manualsida" + +#: builtin/help.c:45 +msgid "show manual in web browser" +msgstr "visa manual i webbläsare" + +#: builtin/help.c:47 +msgid "show info page" +msgstr "visa info-sida" + +#: builtin/help.c:53 +msgid "git help [--all] [--man|--web|--info] [command]" +msgstr "git help [--all] [--man|--web|--info] [kommando]" + #: builtin/help.c:65 #, c-format msgid "unrecognized help format '%s'" @@ -3301,6 +4857,11 @@ msgstr "kan inte öppna paketfilen \"%s\"" msgid "pack signature mismatch" msgstr "paketsignatur stämmer inte överens" +#: builtin/index-pack.c:294 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "paketversion %<PRIu32> stöds ej" + #: builtin/index-pack.c:312 #, c-format msgid "pack has bad object at offset %lu: %s" @@ -3381,7 +4942,7 @@ msgstr "misslyckades tillämpa delta" #: builtin/index-pack.c:986 msgid "Receiving objects" -msgstr "Tar bort objekt" +msgstr "Tar emot objekt" #: builtin/index-pack.c:986 msgid "Indexing objects" @@ -3407,93 +4968,123 @@ msgstr "förvirrad bortom vanvett i parse_pack_objects()" msgid "Resolving deltas" msgstr "Analyserar delta" -#: builtin/index-pack.c:1105 +#: builtin/index-pack.c:1064 +#, c-format +msgid "unable to create thread: %s" +msgstr "kunde inte skapa trÃ¥d: %s" + +#: builtin/index-pack.c:1106 msgid "confusion beyond insanity" msgstr "förvirrad bortom vanvett" -#: builtin/index-pack.c:1124 +#: builtin/index-pack.c:1112 +#, c-format +msgid "completed with %d local objects" +msgstr "slutfördes med %d lokala objekt" + +#: builtin/index-pack.c:1121 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "Oväntad svanschecksumma för %s (trasig disk?)" + +#: builtin/index-pack.c:1125 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "paketet har %d oanalyserat delta" msgstr[1] "paketet har %d oanalyserade delta" -#: builtin/index-pack.c:1149 +#: builtin/index-pack.c:1150 #, c-format msgid "unable to deflate appended object (%d)" msgstr "kunde inte utföra \"deflate\" pÃ¥ tillagt objekt (%d)" -#: builtin/index-pack.c:1228 +#: builtin/index-pack.c:1229 #, c-format msgid "local object %s is corrupt" msgstr "lokalt objekt %s är trasigt" -#: builtin/index-pack.c:1252 +#: builtin/index-pack.c:1253 msgid "error while closing pack file" msgstr "fel vid stängning av paketfil" -#: builtin/index-pack.c:1265 +#: builtin/index-pack.c:1266 #, c-format msgid "cannot write keep file '%s'" msgstr "kan inte ta skriva \"keep\"-fil \"%s\"" -#: builtin/index-pack.c:1273 +#: builtin/index-pack.c:1274 #, c-format msgid "cannot close written keep file '%s'" msgstr "akn inte stänga skriven \"keep\"-fil \"%s\"" -#: builtin/index-pack.c:1286 +#: builtin/index-pack.c:1287 msgid "cannot store pack file" msgstr "kan inte spara paketfil" -#: builtin/index-pack.c:1297 +#: builtin/index-pack.c:1298 msgid "cannot store index file" msgstr "kan inte spara indexfil" -#: builtin/index-pack.c:1398 +#: builtin/index-pack.c:1331 +#, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "felaktig pack.indexversion=%<PRIu32>" + +#: builtin/index-pack.c:1337 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "felaktigt antal trÃ¥dar angivet (%d)" + +#: builtin/index-pack.c:1341 builtin/index-pack.c:1514 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "trÃ¥dstöd saknas, ignorerar %s" + +#: builtin/index-pack.c:1399 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Kan inte öppna befintlig paketfil \"%s\"" -#: builtin/index-pack.c:1400 +#: builtin/index-pack.c:1401 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "Kan inte öppna befintligt paket-idx-fil för \"%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] "icke-delta: %d objekt" msgstr[1] "icke-delta: %d objekt" -#: 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] "kedjelängd = %d: %lu objekt" msgstr[1] "kedjelängd = %d: %lu objekt" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 msgid "Cannot come back to cwd" msgstr "Kan inte gÃ¥ tillbaka till arbetskatalogen (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 "felaktig %s" -#: builtin/index-pack.c:1558 +#: builtin/index-pack.c:1559 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin kan inte användas med --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 "paketfilnamnet \"%s\" slutar inte med \".pack\"" -#: builtin/index-pack.c:1581 +#: builtin/index-pack.c:1582 msgid "--verify with no packfile name given" msgstr "--verify angavs utan paketfilnamn" @@ -3613,6 +5204,26 @@ msgstr " delat" msgid "cannot tell cwd" msgstr "kan inte läsa aktuell katalog (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=<mallkatalog>] [--shared" +"[=<behörigheter>]] [katalog]" + +#: builtin/init-db.c:490 +msgid "permissions" +msgstr "behörigheter" + +#: builtin/init-db.c:491 +msgid "specify that the git repository is to be shared amongst several users" +msgstr "ange att git-arkivet skall delas bland flera användare" + +#: builtin/init-db.c:493 builtin/prune-packed.c:77 +msgid "be quiet" +msgstr "var tyst" + #: builtin/init-db.c:522 builtin/init-db.c:529 #, c-format msgid "cannot mkdir %s" @@ -3641,6 +5252,26 @@ msgstr "Kan inte komma Ã¥t aktuell arbetskatalog" msgid "Cannot access work tree '%s'" msgstr "Kan inte komma Ã¥t arbetskatalogen \"%s\"" +#: builtin/log.c:37 +msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n" +msgstr "git log [<flaggor>] [<sedan>..<till>] [[--] <sökväg>...]\n" + +#: builtin/log.c:38 +msgid " or: git show [options] <object>..." +msgstr " eller: git show [flaggor] <objekt>..." + +#: builtin/log.c:100 +msgid "suppress diff output" +msgstr "undertryck diff-utdata" + +#: builtin/log.c:101 +msgid "show source" +msgstr "visa källkod" + +#: builtin/log.c:102 +msgid "decorate options" +msgstr "dekoreringsflaggor" + #: builtin/log.c:189 #, c-format msgid "Final output: %d %s\n" @@ -3677,68 +5308,332 @@ msgstr "Behöver precis ett intervall." msgid "Not a range." msgstr "Inte ett intervall." -#: builtin/log.c:792 +#: builtin/log.c:789 msgid "Cover letter needs email format" msgstr "Omslagsbrevet behöver e-postformat" -#: builtin/log.c:865 +#: builtin/log.c:862 #, c-format msgid "insane in-reply-to: %s" msgstr "tokigt in-reply-to: %s" -#: builtin/log.c:938 +#: builtin/log.c:890 +msgid "git format-patch [options] [<since> | <revision range>]" +msgstr "git format-patch [flaggor] [<sedan> | <revisionsintervall>]" + +#: builtin/log.c:935 msgid "Two output directories?" msgstr "TvÃ¥ utdatakataloger?" -#: builtin/log.c:1160 +#: builtin/log.c:1063 +msgid "use [PATCH n/m] even with a single patch" +msgstr "använd [PATCH n/m] även för en ensam patch" + +#: builtin/log.c:1066 +msgid "use [PATCH] even with multiple patches" +msgstr "använd [PATCH] även för flera patchar" + +#: builtin/log.c:1070 +msgid "print patches to standard out" +msgstr "skriv patcharna pÃ¥ stnadard ut" + +#: builtin/log.c:1072 +msgid "generate a cover letter" +msgstr "generera ett följebrev" + +#: builtin/log.c:1074 +msgid "use simple number sequence for output file names" +msgstr "använd enkel nummersekvens för utdatafilnamn" + +#: builtin/log.c:1075 +msgid "sfx" +msgstr "sfx" + +#: builtin/log.c:1076 +msgid "use <sfx> instead of '.patch'" +msgstr "använd <sfx> istället för \".patch\"" + +#: builtin/log.c:1078 +msgid "start numbering patches at <n> instead of 1" +msgstr "börja numrera patchar pÃ¥ <n> istället för 1" + +#: builtin/log.c:1080 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "Använd [<prefix>] istället för [PATCH]" + +#: builtin/log.c:1083 +msgid "store resulting files in <dir>" +msgstr "spara filerna i <katalog>" + +#: builtin/log.c:1086 +msgid "don't strip/add [PATCH]" +msgstr "ta inte bort eller lägg till [PATCH]" + +#: builtin/log.c:1089 +msgid "don't output binary diffs" +msgstr "skriv inte binära diffar" + +#: builtin/log.c:1091 +msgid "don't include a patch matching a commit upstream" +msgstr "ta inte med patchar som motsvarar en uppströmsincheckning" + +#: builtin/log.c:1093 +msgid "show patch format instead of default (patch + stat)" +msgstr "visa patchformat istället för standard (patch + stat)" + +#: builtin/log.c:1095 +msgid "Messaging" +msgstr "E-post" + +#: builtin/log.c:1096 +msgid "header" +msgstr "huvud" + +#: builtin/log.c:1097 +msgid "add email header" +msgstr "lägg till e-posthuvud" + +#: builtin/log.c:1098 builtin/log.c:1100 +msgid "email" +msgstr "epost" + +#: builtin/log.c:1098 +msgid "add To: header" +msgstr "Lägg till mottagarhuvud (\"To:\")" + +#: builtin/log.c:1100 +msgid "add Cc: header" +msgstr "Lägg till kopiehuvud (\"Cc:\")" + +#: builtin/log.c:1102 +msgid "message-id" +msgstr "meddelande-id" + +#: builtin/log.c:1103 +msgid "make first mail a reply to <message-id>" +msgstr "Gör det första brevet ett svar till <meddelande-id>" + +#: builtin/log.c:1104 builtin/log.c:1107 +msgid "boundary" +msgstr "gräns" + +#: builtin/log.c:1105 +msgid "attach the patch" +msgstr "bifoga patchen" + +#: builtin/log.c:1108 +msgid "inline the patch" +msgstr "gör patchen ett inline-objekt" + +#: builtin/log.c:1112 +msgid "enable message threading, styles: shallow, deep" +msgstr "aktivera brevtrÃ¥dning, typer: shallow, deep" + +#: builtin/log.c:1114 +msgid "signature" +msgstr "signatur" + +#: builtin/log.c:1115 +msgid "add a signature" +msgstr "lägg till signatur" + +#: builtin/log.c:1117 +msgid "don't print the patch filenames" +msgstr "visa inte filnamn för patchar" + +#: builtin/log.c:1157 #, c-format msgid "bogus committer info %s" msgstr "felaktig incheckarinformation %s" -#: builtin/log.c:1205 +#: builtin/log.c:1202 msgid "-n and -k are mutually exclusive." msgstr "-n och -k kan inte användas samtidigt." -#: builtin/log.c:1207 +#: builtin/log.c:1204 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix och -k kan inte användas samtidigt." -#: builtin/log.c:1215 +#: builtin/log.c:1212 msgid "--name-only does not make sense" msgstr "kan inte använda --name-only" -#: builtin/log.c:1217 +#: builtin/log.c:1214 msgid "--name-status does not make sense" msgstr "kan inte använda --name-status" -#: builtin/log.c:1219 +#: builtin/log.c:1216 msgid "--check does not make sense" msgstr "kan inte använda --check" -#: builtin/log.c:1242 +#: builtin/log.c:1239 msgid "standard output, or directory, which one?" msgstr "standard ut, eller katalog, vilken skall det vara?" -#: builtin/log.c:1244 +#: builtin/log.c:1241 #, c-format msgid "Could not create directory '%s'" msgstr "Kunde inte skapa katalogen \"%s\"" -#: builtin/log.c:1397 +#: builtin/log.c:1394 msgid "Failed to create output files" msgstr "Misslyckades skapa utdatafiler" -#: builtin/log.c:1501 +#: builtin/log.c:1443 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]" + +#: builtin/log.c:1498 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "Kunde inte hitta en spÃ¥rad fjärrgren, ange <uppström> manuellt.\n" -#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531 +#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 #, c-format msgid "Unknown commit %s" msgstr "Okänd incheckning %s" +#: builtin/ls-files.c:408 +msgid "git ls-files [options] [<file>...]" +msgstr "git ls-files [flaggor] [<fil>...]" + +#: builtin/ls-files.c:463 +msgid "identify the file status with tags" +msgstr "identifiera filstatus med taggar" + +#: builtin/ls-files.c:465 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "använd smÃ¥ bokstäver för \"anta oförändrade\"-filer" + +#: builtin/ls-files.c:467 +msgid "show cached files in the output (default)" +msgstr "visa cachade filer i utdata (standard)" + +#: builtin/ls-files.c:469 +msgid "show deleted files in the output" +msgstr "visa borttagna filer i utdata" + +#: builtin/ls-files.c:471 +msgid "show modified files in the output" +msgstr "visa modifierade filer i utdata" + +#: builtin/ls-files.c:473 +msgid "show other files in the output" +msgstr "visa andra filer i utdata" + +#: builtin/ls-files.c:475 +msgid "show ignored files in the output" +msgstr "visa ignorerade filer i utdata" + +#: builtin/ls-files.c:478 +msgid "show staged contents' object name in the output" +msgstr "visa köat innehÃ¥lls objektnamn i utdata" + +#: builtin/ls-files.c:480 +msgid "show files on the filesystem that need to be removed" +msgstr "visa filer i filsystemet som behöver tas bort" + +#: builtin/ls-files.c:482 +msgid "show 'other' directories' name only" +msgstr "visa endast namn för \"andra\" kataloger" + +#: builtin/ls-files.c:485 +msgid "don't show empty directories" +msgstr "visa inte tomma kataloger" + +#: builtin/ls-files.c:488 +msgid "show unmerged files in the output" +msgstr "visa ej sammanslagna filer i utdata" + +#: builtin/ls-files.c:490 +msgid "show resolve-undo information" +msgstr "visa \"resolve-undo\"-information" + +#: builtin/ls-files.c:492 +msgid "skip files matching pattern" +msgstr "hoppa över filer som motsvarar mönster" + +#: builtin/ls-files.c:495 +msgid "exclude patterns are read from <file>" +msgstr "exkludera mönster som läses frÃ¥n <fil>" + +#: builtin/ls-files.c:498 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "läs ytterligare per-katalog-exkluderingsmönster frÃ¥n <fil>" + +#: builtin/ls-files.c:500 +msgid "add the standard git exclusions" +msgstr "lägg till git:s standardexkluderingar" + +#: builtin/ls-files.c:503 +msgid "make the output relative to the project top directory" +msgstr "gör utdata relativ till projektets toppkatalog" + +#: builtin/ls-files.c:506 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "om en <fil> inte är indexet, betrakta det som ett fel" + +#: builtin/ls-files.c:507 +msgid "tree-ish" +msgstr "träd-igt" + +#: builtin/ls-files.c:508 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "lÃ¥tsas att sökvägar borttagna sedan <träd-igt> fortfarande finns" + +#: builtin/ls-files.c:510 +msgid "show debugging data" +msgstr "visa felsökningsutdata" + +#: builtin/ls-tree.c:27 +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]" + +#: builtin/ls-tree.c:125 +msgid "only show trees" +msgstr "visa endast träd" + +#: builtin/ls-tree.c:127 +msgid "recurse into subtrees" +msgstr "rekursera ner i underträd" + +#: builtin/ls-tree.c:129 +msgid "show trees when recursing" +msgstr "visa träd medan rekursering" + +#: builtin/ls-tree.c:132 +msgid "terminate entries with NUL byte" +msgstr "terminera poster med NUL-byte" + +#: builtin/ls-tree.c:133 +msgid "include object size" +msgstr "inkludera objektstorlek" + +#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +msgid "list only filenames" +msgstr "visa endast filnamn" + +#: builtin/ls-tree.c:140 +msgid "use full path names" +msgstr "använd fullständiga sökvägsnamn" + +#: builtin/ls-tree.c:142 +msgid "list entire tree; not just current directory (implies --full-name)" +msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)" + +#: builtin/merge.c:43 +msgid "git merge [options] [<commit>...]" +msgstr "git merge [flaggor] [<incheckning>...]" + +#: builtin/merge.c:44 +msgid "git merge [options] <msg> HEAD <commit>" +msgstr "git merge [flaggor] <meddelande> HEAD <incheckning>" + +#: builtin/merge.c:45 +msgid "git merge --abort" +msgstr "git merge --abort" + #: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "flaggan \"m\" behöver ett värde" @@ -3758,6 +5653,67 @@ msgstr "Tillgängliga strategier är:" msgid "Available custom strategies are:" msgstr "Tillgängliga skräddarsydda strategier är:" +#: builtin/merge.c:183 +msgid "do not show a diffstat at the end of the merge" +msgstr "visa inte en diffstat när sammanslagningen är färdig" + +#: builtin/merge.c:186 +msgid "show a diffstat at the end of the merge" +msgstr "visa en diffstat när sammanslagningen är färdig" + +#: builtin/merge.c:187 +msgid "(synonym to --stat)" +msgstr "(synonym till --stat)" + +#: builtin/merge.c:189 +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "" +"lägg till (som mest <n>) poster frÃ¥n shortlog till incheckningsmeddelandet" + +#: builtin/merge.c:192 +msgid "create a single commit instead of doing a merge" +msgstr "skapa en ensam incheckning istället för en sammanslagning" + +#: builtin/merge.c:194 +msgid "perform a commit if the merge succeeds (default)" +msgstr "utför en incheckning om sammanslagningen lyckades (standard)" + +#: builtin/merge.c:196 +msgid "edit message before committing" +msgstr "redigera meddelande innan incheckning" + +#: builtin/merge.c:198 +msgid "allow fast-forward (default)" +msgstr "tillÃ¥t snabbspolning (standard)" + +#: builtin/merge.c:200 +msgid "abort if fast-forward is not possible" +msgstr "avbryt om snabbspolning inte är möjlig" + +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 +msgid "strategy" +msgstr "strategi" + +#: builtin/merge.c:203 +msgid "merge strategy to use" +msgstr "sammanslagninsstrategi att använda" + +#: builtin/merge.c:204 +msgid "option=value" +msgstr "alternativ=värde" + +#: builtin/merge.c:205 +msgid "option for selected merge strategy" +msgstr "alternativ för vald sammanslagningsstrategi" + +#: builtin/merge.c:207 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning" + +#: builtin/merge.c:211 +msgid "abort the current in-progress merge" +msgstr "avbryt den pÃ¥gÃ¥ende sammanslagningen" + #: builtin/merge.c:240 msgid "could not run stash." msgstr "kunde köra stash." @@ -3797,51 +5753,51 @@ msgstr "Avslutar SQUASH_MSG" msgid "No merge message -- not updating HEAD\n" msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n" -#: builtin/merge.c:437 +#: builtin/merge.c:436 #, c-format msgid "'%s' does not point to a commit" msgstr "\"%s\" verkar inte peka pÃ¥ en incheckning" -#: builtin/merge.c:536 +#: builtin/merge.c:535 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Felaktig branch.%s.mergeoptions-sträng: %s" -#: builtin/merge.c:629 +#: builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "git write-tree misslyckades skriva ett träd" -#: builtin/merge.c:679 +#: builtin/merge.c:678 msgid "failed to read the cache" msgstr "misslyckads läsa cachen" -#: builtin/merge.c:710 +#: builtin/merge.c:709 msgid "Not handling anything other than two heads merge." msgstr "Hanterar inte nÃ¥got annat än en sammanslagning av tvÃ¥ huvuden." -#: builtin/merge.c:724 +#: builtin/merge.c:723 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Felaktig flagga för merge-recursive: -X%s" -#: builtin/merge.c:738 +#: builtin/merge.c:737 #, c-format msgid "unable to write %s" msgstr "kunde inte skriva %s" -#: builtin/merge.c:877 +#: builtin/merge.c:876 #, c-format msgid "Could not read from '%s'" msgstr "Kunde inte läsa frÃ¥n \"%s\"" -#: builtin/merge.c:886 +#: builtin/merge.c:885 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" "Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra " "den.\n" -#: builtin/merge.c:892 +#: builtin/merge.c:891 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -3856,53 +5812,53 @@ msgstr "" "Rader som inleds med \"#\" kommer ignoreras, och ett tomt meddelande\n" "avbryter incheckningen.\n" -#: builtin/merge.c:916 +#: builtin/merge.c:915 msgid "Empty commit message." msgstr "Tomt incheckningsmeddelande." -#: builtin/merge.c:928 +#: builtin/merge.c:927 #, c-format msgid "Wonderful.\n" msgstr "Underbart.\n" -#: builtin/merge.c:993 +#: builtin/merge.c:992 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" "Kunde inte slÃ¥ ihop automatiskt; fixa konflikter och checka in resultatet.\n" -#: builtin/merge.c:1009 +#: builtin/merge.c:1008 #, c-format msgid "'%s' is not a commit" msgstr "\"%s\" är inte en incheckning" -#: builtin/merge.c:1050 +#: builtin/merge.c:1049 msgid "No current branch." msgstr "Inte pÃ¥ nÃ¥gon gren." -#: builtin/merge.c:1052 +#: builtin/merge.c:1051 msgid "No remote for the current branch." msgstr "Ingen fjärr för aktuell gren." -#: builtin/merge.c:1054 +#: builtin/merge.c:1053 msgid "No default upstream defined for the current branch." msgstr "Ingen standarduppström angiven för aktuell gren." -#: builtin/merge.c:1059 +#: builtin/merge.c:1058 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "Ingen fjärrspÃ¥rande gren för %s frÃ¥n %s" -#: builtin/merge.c:1146 builtin/merge.c:1303 +#: builtin/merge.c:1145 builtin/merge.c:1302 #, c-format msgid "%s - not something we can merge" msgstr "%s - inte nÃ¥got vi kan slÃ¥ ihop" -#: builtin/merge.c:1214 +#: builtin/merge.c:1213 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)." -#: builtin/merge.c:1230 git-pull.sh:31 +#: builtin/merge.c:1229 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3910,11 +5866,11 @@ msgstr "" "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n" "Checka in dina ändringar innan du kan slÃ¥ ihop." -#: builtin/merge.c:1233 git-pull.sh:34 +#: builtin/merge.c:1232 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)." -#: builtin/merge.c:1237 +#: builtin/merge.c:1236 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3922,84 +5878,183 @@ msgstr "" "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n" "Checka in dina ändringar innan du kan slÃ¥ ihop." -#: builtin/merge.c:1240 +#: builtin/merge.c:1239 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)." -#: builtin/merge.c:1249 +#: builtin/merge.c:1248 msgid "You cannot combine --squash with --no-ff." msgstr "Du kan inte kombinera --squash med --no-ff." -#: builtin/merge.c:1254 +#: builtin/merge.c:1253 msgid "You cannot combine --no-ff with --ff-only." msgstr "Du kan inte kombinera --no-ff med --ff-only." -#: builtin/merge.c:1261 +#: builtin/merge.c:1260 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt." -#: builtin/merge.c:1293 +#: builtin/merge.c:1292 msgid "Can merge only exactly one commit into empty head" msgstr "Kan endast slÃ¥ ihop en enda incheckning i ett tomt huvud." -#: builtin/merge.c:1296 +#: builtin/merge.c:1295 msgid "Squash commit into empty head not supported yet" msgstr "Stöder inte en tillplattningsincheckning pÃ¥ ett tomt huvud ännu" -#: builtin/merge.c:1298 +#: builtin/merge.c:1297 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud" -#: builtin/merge.c:1413 +#: builtin/merge.c:1412 #, c-format msgid "Updating %s..%s\n" msgstr "Uppdaterar %s..%s\n" -#: builtin/merge.c:1451 +#: builtin/merge.c:1450 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Försöker riktigt enkel sammanslagning i indexet...\n" -#: builtin/merge.c:1458 +#: builtin/merge.c:1457 #, c-format msgid "Nope.\n" msgstr "Nej.\n" -#: builtin/merge.c:1490 +#: builtin/merge.c:1489 msgid "Not possible to fast-forward, aborting." msgstr "Kan inte snabbspola, avbryter." -#: builtin/merge.c:1513 builtin/merge.c:1592 +#: builtin/merge.c:1512 builtin/merge.c:1591 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Ã…terspolar trädet till orört...\n" -#: builtin/merge.c:1517 +#: builtin/merge.c:1516 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Försöker sammanslagninsstrategin %s...\n" -#: builtin/merge.c:1583 +#: builtin/merge.c:1582 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n" -#: builtin/merge.c:1585 +#: builtin/merge.c:1584 #, c-format msgid "Merge with strategy %s failed.\n" -msgstr "Sammanslaning med strategin %s misslyckades.\n" +msgstr "Sammanslagning med strategin %s misslyckades.\n" -#: builtin/merge.c:1594 +#: builtin/merge.c:1593 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Använder %s för att förbereda lösning för hand.\n" -#: builtin/merge.c:1606 +#: builtin/merge.c:1605 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" "Automatisk sammanslagning lyckades; stoppar före incheckning som önskat\n" +#: builtin/merge-base.c:26 +msgid "git merge-base [-a|--all] <commit> <commit>..." +msgstr "git merge-base [-a|--all] <incheckning> <incheckning>..." + +#: builtin/merge-base.c:27 +msgid "git merge-base [-a|--all] --octopus <commit>..." +msgstr "git merge-base [-a|--all] --octopus <incheckning>..." + +#: builtin/merge-base.c:28 +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <incheckning>..." + +#: builtin/merge-base.c:29 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "git merge-base --is-ancestor <incheckning> <incheckning>" + +#: builtin/merge-base.c:98 +msgid "output all common ancestors" +msgstr "skriv ut alla gemensamma anfäder" + +#: builtin/merge-base.c:99 +msgid "find ancestors for a single n-way merge" +msgstr "hitta anfader för enkel n-vägssammanslagning" + +#: builtin/merge-base.c:100 +msgid "list revs not reachable from others" +msgstr "visa revisioner som inte kan nÃ¥s frÃ¥n andra" + +#: builtin/merge-base.c:102 +msgid "is the first one ancestor of the other?" +msgstr "är den första anfader till den andra?" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " +"file2" +msgstr "" +"git merge-file [alternativ] [-L namn1 [-L orig [-L namn2]]] fil1 origfil fil2" + +#: builtin/merge-file.c:33 +msgid "send results to standard output" +msgstr "sänd resultat till standard ut" + +#: builtin/merge-file.c:34 +msgid "use a diff3 based merge" +msgstr "använd diff3-baserad sammanslagning" + +#: builtin/merge-file.c:35 +msgid "for conflicts, use our version" +msgstr "för konflikter, använd vÃ¥r version" + +#: builtin/merge-file.c:37 +msgid "for conflicts, use their version" +msgstr "för konflikter, använd deras version" + +#: builtin/merge-file.c:39 +msgid "for conflicts, use a union version" +msgstr "för konflikter, använd en förenad version" + +#: builtin/merge-file.c:42 +msgid "for conflicts, use this marker size" +msgstr "för konflikter, använd denna markörstorlek" + +#: builtin/merge-file.c:43 +msgid "do not warn about conflicts" +msgstr "varna inte om konflikter" + +#: builtin/merge-file.c:45 +msgid "set labels for file1/orig_file/file2" +msgstr "sätt etiketter för fil1/origfil/fil2" + +#: 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 "indata är NUL-terminerad" + +#: builtin/mktree.c:154 builtin/write-tree.c:24 +msgid "allow missing objects" +msgstr "tillÃ¥t saknade objekt" + +#: builtin/mktree.c:155 +msgid "allow creation of more than one tree" +msgstr "tillÃ¥t skapa mer än ett träd" + +#: builtin/mv.c:14 +msgid "git mv [options] <source>... <destination>" +msgstr "git mv [flaggor] <källa>... <mÃ¥l>" + +#: builtin/mv.c:64 +msgid "force move/rename even if target exists" +msgstr "tvinga flytta/ändra namn även om mÃ¥let finns" + +#: builtin/mv.c:65 +msgid "skip move/rename errors" +msgstr "hoppa över fel vid flytt/namnändring" + #: builtin/mv.c:108 #, c-format msgid "Checking rename of '%s' to '%s'\n" @@ -4062,114 +6117,287 @@ msgstr "Byter namn pÃ¥ %s till %s\n" msgid "renaming '%s' failed" msgstr "misslyckades byta namn pÃ¥ \"%s\"" -#: builtin/notes.c:139 +#: builtin/name-rev.c:175 +msgid "git name-rev [options] <commit>..." +msgstr "git name-rev [flaggor] <incheckning>..." + +#: builtin/name-rev.c:176 +msgid "git name-rev [options] --all" +msgstr "git name-rev [flaggor] --all" + +#: builtin/name-rev.c:177 +msgid "git name-rev [options] --stdin" +msgstr "git name-rev [flaggor] --stdin" + +#: builtin/name-rev.c:229 +msgid "print only names (no SHA-1)" +msgstr "skriv endast namn (ingen SHA-1)" + +#: builtin/name-rev.c:230 +msgid "only use tags to name the commits" +msgstr "använd endast taggar för att namnge incheckningar" + +#: builtin/name-rev.c:232 +msgid "only use refs matching <pattern>" +msgstr "använd endast referenser som motsvarar <mönster>" + +#: builtin/name-rev.c:234 +msgid "list all commits reachable from all refs" +msgstr "lista alla incheckningar som kan nÃ¥s alla referenser" + +#: builtin/name-rev.c:235 +msgid "read from stdin" +msgstr "läs frÃ¥n standard in" + +#: builtin/name-rev.c:236 +msgid "allow to print `undefined` names" +msgstr "tillÃ¥t att skriva \"odefinierade\" namn" + +#: builtin/notes.c:26 +msgid "git notes [--ref <notes_ref>] [list [<object>]]" +msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]" + +#: builtin/notes.c:27 +msgid "" +"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" +"git notes [--ref <anteckningsref>] add [-f] [-m <medd> | -F <fil> | (-c | -" +"C) <objekt>] [<objekt>]" + +#: 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:29 +msgid "" +"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" +"git notes [--ref <anteckningsref>] append [-m <medd> | -F <fil> | (-c | -C) " +"<objekt>] [<objekt>]" + +#: builtin/notes.c:30 +msgid "git notes [--ref <notes_ref>] edit [<object>]" +msgstr "git notes [--ref <anteckningsref>] edit [<objekt>]" + +#: builtin/notes.c:31 +msgid "git notes [--ref <notes_ref>] show [<object>]" +msgstr "git notes [--ref <anteckningsref>] show [<objekt>]" + +#: 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: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 <anteckningsref>] remove [<objekt>...]" + +#: builtin/notes.c:36 +msgid "git notes [--ref <notes_ref>] prune [-n | -v]" +msgstr "git notes [--ref <anteckningsref>] prune [-n | -v]" + +#: builtin/notes.c:37 +msgid "git notes [--ref <notes_ref>] get-ref" +msgstr "git notes [--ref <anteckningsref>] get-ref" + +#: builtin/notes.c:42 +msgid "git notes [list [<object>]]" +msgstr "git notes [list [<objekt>]]" + +#: builtin/notes.c:47 +msgid "git notes add [<options>] [<object>]" +msgstr "git notes add [<flaggor>] [<objekt>]" + +#: 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:53 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "git notes copy --stdin [<frÃ¥n-objekt> <till-objekt>]..." + +#: builtin/notes.c:58 +msgid "git notes append [<options>] [<object>]" +msgstr "git notes append [<flaggor>] [<objekt>]" + +#: builtin/notes.c:63 +msgid "git notes edit [<object>]" +msgstr "git notes edit [<objekt>]" + +#: builtin/notes.c:68 +msgid "git notes show [<object>]" +msgstr "git notes show [<objekt>]" + +#: builtin/notes.c:73 +msgid "git notes merge [<options>] <notes_ref>" +msgstr "git notes merge [<flaggor>] <anteckningsref>" + +#: builtin/notes.c:74 +msgid "git notes merge --commit [<options>]" +msgstr "git notes merge --commit [<flaggor>]" + +#: builtin/notes.c:75 +msgid "git notes merge --abort [<options>]" +msgstr "git notes merge --abort [<flaggor>]" + +#: builtin/notes.c:80 +msgid "git notes remove [<object>]" +msgstr "git notes remove [<objekt>]" + +#: builtin/notes.c:85 +msgid "git notes prune [<options>]" +msgstr "git notes prune [<flaggor>]" + +#: 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 "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:580 +#: builtin/notes.c:538 builtin/notes.c:695 +msgid "note contents as a string" +msgstr "anteckningsinnehÃ¥ll som sträng" + +#: builtin/notes.c:541 builtin/notes.c:698 +msgid "note contents in a file" +msgstr "anteckningsinnehÃ¥ll i en fil" + +#: 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:544 builtin/notes.c:701 +msgid "reuse and edit specified note object" +msgstr "Ã¥teranvänd och redigera angivet anteckningsobjekt" + +#: builtin/notes.c:547 builtin/notes.c:704 +msgid "reuse specified note object" +msgstr "Ã¥teranvänd angivet anteckningsobjekt" + +#: builtin/notes.c:549 builtin/notes.c:617 +msgid "replace existing notes" +msgstr "ersätt befintliga anteckningar" + +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -4178,16 +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:635 +#: builtin/notes.c:618 +msgid "read objects from stdin" +msgstr "läs objekt frÃ¥n standard in" + +#: 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: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 " @@ -4196,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" @@ -4210,16 +6446,74 @@ 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:971 +#: builtin/notes.c:867 +msgid "General options" +msgstr "Allmänna flaggor" + +#: builtin/notes.c:869 +msgid "Merge options" +msgstr "Flaggor för sammanslagning" + +#: builtin/notes.c:871 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "" +"läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/" +"cat_sort_uniq)" + +#: builtin/notes.c:873 +msgid "Committing unmerged notes" +msgstr "Checkar in ej sammanslagna anteckningar" + +#: 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:877 +msgid "Aborting notes merge resolution" +msgstr "Avbryt lösning av sammanslagning av anteckningar" + +#: builtin/notes.c:879 +msgid "abort notes merge" +msgstr "avbryt sammanslagning av anteckningar" + +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "Objektet %s har ingen anteckning\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 "försök att ta bort icke-existerande anteckningar är inte ett fel" + +#: builtin/notes.c:989 +msgid "read object names from the standard input" +msgstr "läs objektnamn frÃ¥n standard in" + +#: builtin/notes.c:1070 +msgid "notes_ref" +msgstr "anteckningar-ref" + +#: builtin/notes.c:1071 +msgid "use notes from <notes_ref>" +msgstr "använd anteckningar frÃ¥n <anteckningsref>" + +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Okänt underkommando: %s" +#: builtin/pack-objects.c:23 +msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]" +msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]" + +#: builtin/pack-objects.c:24 +msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" +msgstr "git pack-objects [flaggor...] basnamn [< reflista | < objektlista]" + #: builtin/pack-objects.c:183 builtin/pack-objects.c:186 #, c-format msgid "deflate error (%d)" @@ -4245,6 +6539,162 @@ msgstr "flaggan %s godtar inte negativ form" msgid "unable to parse value '%s' for option %s" msgstr "kunde inte tolka värdet \"%s\" för flaggan %s" +#: builtin/pack-objects.c:2448 +msgid "do not show progress meter" +msgstr "visa inte förloppsindikator" + +#: builtin/pack-objects.c:2450 +msgid "show progress meter" +msgstr "visa förloppsindikator" + +#: builtin/pack-objects.c:2452 +msgid "show progress meter during object writing phase" +msgstr "visa förloppsindikator under objektskrivningsfasen" + +#: builtin/pack-objects.c:2455 +msgid "similar to --all-progress when progress meter is shown" +msgstr "som --all-progress när förloppsmätaren visas" + +#: builtin/pack-objects.c:2456 +msgid "version[,offset]" +msgstr "version[,offset]" + +#: builtin/pack-objects.c:2457 +msgid "write the pack index file in the specified idx format version" +msgstr "skriv paketindexfilen i angiven indexformatversion" + +#: builtin/pack-objects.c:2460 +msgid "maximum size of each output pack file" +msgstr "maximal storlek pÃ¥ varje utdatapaketfil" + +#: builtin/pack-objects.c:2462 +msgid "ignore borrowed objects from alternate object store" +msgstr "ignorera lÃ¥nade objekt frÃ¥n alternativa objektlager" + +#: builtin/pack-objects.c:2464 +msgid "ignore packed objects" +msgstr "ignorera packade objekt" + +#: builtin/pack-objects.c:2466 +msgid "limit pack window by objects" +msgstr "begränsa paketfönster efter objekt" + +#: builtin/pack-objects.c:2468 +msgid "limit pack window by memory in addition to object limit" +msgstr "begränsa paketfönster efter minne förutom objektgräns" + +#: builtin/pack-objects.c:2470 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "maximal längd pÃ¥ deltakedja tillÃ¥ten i slutligt paket" + +#: builtin/pack-objects.c:2472 +msgid "reuse existing deltas" +msgstr "Ã¥teranvänd befintliga delta" + +#: builtin/pack-objects.c:2474 +msgid "reuse existing objects" +msgstr "Ã¥teranvänd befintliga objekt" + +#: builtin/pack-objects.c:2476 +msgid "use OFS_DELTA objects" +msgstr "använd OFS_DELTA-objekt" + +#: builtin/pack-objects.c:2478 +msgid "use threads when searching for best delta matches" +msgstr "använd trÃ¥dar vid sökning efter bästa deltaträffar" + +#: builtin/pack-objects.c:2480 +msgid "do not create an empty pack output" +msgstr "försök inte skapa tom paketutdata" + +#: builtin/pack-objects.c:2482 +msgid "read revision arguments from standard input" +msgstr "läs revisionsargument frÃ¥n standard in" + +#: builtin/pack-objects.c:2484 +msgid "limit the objects to those that are not yet packed" +msgstr "begränsa objekt till de som ännu inte packats" + +#: builtin/pack-objects.c:2487 +msgid "include objects reachable from any reference" +msgstr "inkludera objekt som kan nÃ¥s frÃ¥n nÃ¥gon referens" + +#: builtin/pack-objects.c:2490 +msgid "include objects referred by reflog entries" +msgstr "inkludera objekt som refereras frÃ¥n referensloggposter" + +#: builtin/pack-objects.c:2493 +msgid "output pack to stdout" +msgstr "skriv paket pÃ¥ standard ut" + +#: builtin/pack-objects.c:2495 +msgid "include tag objects that refer to objects to be packed" +msgstr "inkludera taggobjekt som refererar objekt som skall packas" + +#: builtin/pack-objects.c:2497 +msgid "keep unreachable objects" +msgstr "behÃ¥ll onÃ¥bara objekt" + +#: builtin/pack-objects.c:2498 parse-options.h:141 +msgid "time" +msgstr "tid" + +#: builtin/pack-objects.c:2499 +msgid "unpack unreachable objects newer than <time>" +msgstr "packa upp onÃ¥bara objekt nyare än <tid>" + +#: builtin/pack-objects.c:2502 +msgid "create thin packs" +msgstr "skapa tunna paket" + +#: builtin/pack-objects.c:2504 +msgid "ignore packs that have companion .keep file" +msgstr "ignorera paket som har tillhörande .keep-fil" + +#: builtin/pack-objects.c:2506 +msgid "pack compression level" +msgstr "komprimeringsgrad för paket" + +#: builtin/pack-objects.c:2508 +msgid "do not hide commits by grafts" +msgstr "göm inte incheckningar med ympningar (\"grafts\")" + +#: builtin/pack-refs.c:6 +msgid "git pack-refs [options]" +msgstr "git pack-refs [flaggor]" + +#: builtin/pack-refs.c:14 +msgid "pack everything" +msgstr "packa allt" + +#: builtin/pack-refs.c:15 +msgid "prune loose refs (default)" +msgstr "ta bort lösa referenser (standard)" + +#: 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 <tid>] [--] [<huvud>...]" + +#: builtin/prune.c:132 +msgid "do not remove, show only" +msgstr "ta inte bort, bara visa" + +#: builtin/prune.c:133 +msgid "report pruned objects" +msgstr "rapportera borttagna objekt" + +#: builtin/prune.c:136 +msgid "expire objects older than <time>" +msgstr "lÃ¥t tid gÃ¥ ut för objekt äldre än <tid>" + +#: builtin/push.c:14 +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]" + #: builtin/push.c:45 msgid "tag shorthand without <tag>" msgstr "taggförkortning utan <tagg>" @@ -4331,14 +6781,48 @@ msgstr "" "aktuella grenen \"%s\", utan att tala om för mig vad som\n" "skall sändas för att uppdatera fjärrgrenen." -#: builtin/push.c:174 +#: builtin/push.c:151 +msgid "" +"push.default is unset; its implicit value is changing in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the current behavior after the default changes, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" +"push.default har inte ställts in; dess underförstÃ¥dda värde\n" +"ändras i Git 2.0 frÃ¥n \"matching\" till \"simple\". För att\n" +"undertrycka det här meddelandet och behÃ¥lla nuvarande beteende\n" +"efter att förvalet ändras,\n" +"skriver du:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"För att undertrycka meddelandet och välja det nya beteendet nu skriver du:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"Se \"git help config\" och sök efter \"push.default\" för ytterligare \n" +"information. (Läget \"simple\" introducerades i Git 1.7.11. Använd det\n" +"liknande läget \"current\" istället för \"simple\" om du ibland använder\n" +"äldre versioner av Git.)" + +#: builtin/push.c:199 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" "Du angav inga referensspecifikationer att sända, och push.default är " "\"nothing\"." -#: builtin/push.c:181 +#: builtin/push.c:206 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -4350,20 +6834,21 @@ msgstr "" "innan du sänder igen.\n" "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer." -#: builtin/push.c:187 +#: builtin/push.c:212 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" -"specify branches to push or set the 'push.default' configuration\n" -"variable to 'current' or 'upstream' to push only the current branch." +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." msgstr "" "Uppdateringar avvisades dÃ¥ änden pÃ¥ en insänd gren är bakom dess\n" "fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n" "du specificera grenar att sända, eller ändra inställningsvariabeln\n" -"\"push-default\" till \"current\" eller \"upstream\" för att endast sända\n" -"aktuell gren." +"\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att " +"endast\n" +"sända aktuell gren." -#: builtin/push.c:193 +#: builtin/push.c:218 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -4375,22 +6860,22 @@ msgstr "" "\"git pull\") innan du sänder igen.\n" "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer." -#: builtin/push.c:233 +#: builtin/push.c:258 #, c-format msgid "Pushing to %s\n" msgstr "Sänder till %s\n" -#: builtin/push.c:237 +#: builtin/push.c:262 #, c-format msgid "failed to push some refs to '%s'" msgstr "misslyckades sända vissa referenser till \"%s\"" -#: builtin/push.c:269 +#: builtin/push.c:294 #, c-format msgid "bad repository '%s'" msgstr "felaktigt arkiv \"%s\"" -#: builtin/push.c:270 +#: builtin/push.c:295 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -4411,34 +6896,238 @@ msgstr "" "\n" " git push <namn>\n" -#: builtin/push.c:285 +#: builtin/push.c:310 msgid "--all and --tags are incompatible" msgstr "--all och --tags är inkompatibla" -#: builtin/push.c:286 +#: builtin/push.c:311 msgid "--all can't be combined with refspecs" msgstr "--all kan inte kombineras med referensspecifikationer" -#: builtin/push.c:291 +#: builtin/push.c:316 msgid "--mirror and --tags are incompatible" msgstr "--mirror och --tags är inkompatibla" -#: builtin/push.c:292 +#: builtin/push.c:317 msgid "--mirror can't be combined with refspecs" msgstr "--mirror kan inte kombineras med referensspecifikationer" -#: builtin/push.c:297 +#: builtin/push.c:322 msgid "--all and --mirror are incompatible" msgstr "--all och --mirror är inkompatibla" -#: builtin/push.c:385 +#: builtin/push.c:382 +msgid "repository" +msgstr "arkiv" + +#: builtin/push.c:383 +msgid "push all refs" +msgstr "sänd alla referenser" + +#: builtin/push.c:384 +msgid "mirror all refs" +msgstr "spegla alla referenser" + +#: builtin/push.c:386 +msgid "delete refs" +msgstr "ta bort referenser" + +#: builtin/push.c:387 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "sänd taggar (kan inte användas med --all eller --mirror)" + +#: builtin/push.c:390 +msgid "force updates" +msgstr "tvinga uppdateringar" + +#: builtin/push.c:391 +msgid "check" +msgstr "kontrollera" + +#: builtin/push.c:392 +msgid "control recursive pushing of submodules" +msgstr "styr rekursiv insändning av undermoduler" + +#: builtin/push.c:394 +msgid "use thin pack" +msgstr "använd tunna paket" + +#: builtin/push.c:395 builtin/push.c:396 +msgid "receive pack program" +msgstr "program för att ta emot paket" + +#: builtin/push.c:397 +msgid "set upstream for git pull/status" +msgstr "ställ in uppström för git pull/status" + +#: builtin/push.c:400 +msgid "prune locally removed refs" +msgstr "ta bort lokalt borttagna referenser" + +#: builtin/push.c:410 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete är imkompatibel med --all, --mirror och --tags" -#: builtin/push.c:387 +#: builtin/push.c:412 msgid "--delete doesn't make sense without any refs" msgstr "--delete kan inte användas utan referenser" +#: 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=<prefix>] " +"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--" +"index-output=<fil>] (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])" + +#: builtin/read-tree.c:108 +msgid "write resulting index to <file>" +msgstr "skriv resulterande index till <fil>" + +#: builtin/read-tree.c:111 +msgid "only empty the index" +msgstr "töm bara indexet" + +#: builtin/read-tree.c:113 +msgid "Merging" +msgstr "Sammanslagning" + +#: builtin/read-tree.c:115 +msgid "perform a merge in addition to a read" +msgstr "utför en sammanslagning i tillägg till en läsning" + +#: builtin/read-tree.c:117 +msgid "3-way merge if no file level merging required" +msgstr "3-vägssammanslagning om sammanslagning pÃ¥ filnivÃ¥ ej krävs" + +#: builtin/read-tree.c:119 +msgid "3-way merge in presence of adds and removes" +msgstr "3-vägssammanslagning när det finns tillägg och borttagningar" + +#: builtin/read-tree.c:121 +msgid "same as -m, but discard unmerged entries" +msgstr "som -m, men kasta bort ej sammanslagna poster" + +#: builtin/read-tree.c:122 +msgid "<subdirectory>/" +msgstr "<underkatalog>/" + +#: builtin/read-tree.c:123 +msgid "read the tree into the index under <subdirectory>/" +msgstr "läs in trädet i indexet under <underkatalog>/" + +#: builtin/read-tree.c:126 +msgid "update working tree with merge result" +msgstr "uppdatera arbetskatalogen med resultatet frÃ¥n sammanslagningen" + +#: builtin/read-tree.c:128 +msgid "gitignore" +msgstr "gitignore" + +#: builtin/read-tree.c:129 +msgid "allow explicitly ignored files to be overwritten" +msgstr "tillÃ¥t explicit ignorerade filer att skrivas över" + +#: builtin/read-tree.c:132 +msgid "don't check the working tree after merging" +msgstr "kontrollera inte arbetskatalogen efter sammanslagning" + +#: builtin/read-tree.c:133 +msgid "don't update the index or the work tree" +msgstr "uppdatera inte indexet eller arbetskatalogen" + +#: builtin/read-tree.c:135 +msgid "skip applying sparse checkout filter" +msgstr "hoppa över att applicera filter för gles utcheckning" + +#: builtin/read-tree.c:137 +msgid "debug unpack-trees" +msgstr "felsök 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 <gren>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <namn> <url>" + +#: builtin/remote.c:13 builtin/remote.c:32 +msgid "git remote rename <old> <new>" +msgstr "git remote rename <gammal> <ny>" + +#: builtin/remote.c:14 builtin/remote.c:37 +msgid "git remote remove <name>" +msgstr "git remote remove <namn>" + +#: builtin/remote.c:15 +msgid "git remote set-head <name> (-a | -d | <branch>)" +msgstr "git remote set-head <namn> (-a | -d | <gren>)" + +#: builtin/remote.c:16 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "git remote [-v | --verbose] show [-n] <namn>" + +#: builtin/remote.c:17 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "git remote prune [-n | --dry-run] <namn>" + +#: builtin/remote.c:18 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" +"git remote [-v | --verbose] update [-p | --prune] [(<grupp> | <fjärr>)...]" + +#: builtin/remote.c:19 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "git remote set-branches [--add] <namn> <gren>..." + +#: builtin/remote.c:20 builtin/remote.c:68 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "git remote set-url [--push] <namn> <nyurl> [<gammalurl>]" + +#: builtin/remote.c:21 builtin/remote.c:69 +msgid "git remote set-url --add <name> <newurl>" +msgstr "git remote set-url --add <namn> <nyurl>" + +#: builtin/remote.c:22 builtin/remote.c:70 +msgid "git remote set-url --delete <name> <url>" +msgstr "git remote set-url --delete <namn> <url>" + +#: builtin/remote.c:27 +msgid "git remote add [<options>] <name> <url>" +msgstr "git remote add [<flaggor>] <namn> <url>" + +#: builtin/remote.c:42 +msgid "git remote set-head <name> (-a | -d | <branch>])" +msgstr "git remote set-head <namn> (-a | -d | <gren>])" + +#: builtin/remote.c:47 +msgid "git remote set-branches <name> <branch>..." +msgstr "git remote set-branches <namn> <gren>..." + +#: builtin/remote.c:48 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "git remote set-branches --add <namn> <gren>..." + +#: builtin/remote.c:53 +msgid "git remote show [<options>] <name>" +msgstr "git remote show [<flaggor>] <namn>" + +#: builtin/remote.c:58 +msgid "git remote prune [<options>] <name>" +msgstr "git remote prune [<flaggor>] <namn>" + +#: builtin/remote.c:63 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..." + #: builtin/remote.c:98 #, c-format msgid "Updating %s" @@ -4457,6 +7146,34 @@ msgstr "" msgid "unknown mirror argument: %s" msgstr "okänt argument till mirror: %s" +#: builtin/remote.c:163 +msgid "fetch the remote branches" +msgstr "hämta fjärrgrenarna" + +#: builtin/remote.c:165 +msgid "import all tags and associated objects when fetching" +msgstr "importera alla taggar och associerade objekt vid hämtning" + +#: builtin/remote.c:168 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "eller hämta inte nÃ¥gra taggar alls (--no-tags)" + +#: builtin/remote.c:170 +msgid "branch(es) to track" +msgstr "gren(ar) att spÃ¥ra" + +#: builtin/remote.c:171 +msgid "master branch" +msgstr "huvudgren" + +#: 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 "ställ in arkiv som spegel att sända eller ta emot frÃ¥n" + #: builtin/remote.c:185 msgid "specifying a master branch makes no sense with --mirror" msgstr "att ange en master-gren ger ingen mening med --mirror" @@ -4653,6 +7370,10 @@ msgstr " %-*s tvingar till %s" msgid " %-*s pushes to %s" msgstr " %-*s sänder till %s" +#: builtin/remote.c:1091 +msgid "do not query remotes" +msgstr "frÃ¥ga inte fjärrar" + #: builtin/remote.c:1118 #, c-format msgid "* remote %s" @@ -4711,6 +7432,14 @@ msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] " Lokal referens konfigurerad för \"git push\"%s:" msgstr[1] " Lokala referenser konfigurerade för \"git push\"%s:" +#: builtin/remote.c:1199 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren" + +#: builtin/remote.c:1201 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "ta bort refs/remotes/<namn>/HEAD" + #: builtin/remote.c:1216 msgid "Cannot determine remote HEAD" msgstr "Kan inte bestämma HEAD pÃ¥ fjärren" @@ -4764,15 +7493,35 @@ msgstr " * [skulle rensa] %s" msgid " * [pruned] %s" msgstr " * [rensad] %s" +#: builtin/remote.c:1321 +msgid "prune remotes after fetching" +msgstr "rensa fjärrar efter hämtning" + #: builtin/remote.c:1387 builtin/remote.c:1461 #, c-format msgid "No such remote '%s'" msgstr "Ingen sÃ¥dan fjärr \"%s\"" +#: builtin/remote.c:1407 +msgid "add branch" +msgstr "lägg till gren" + #: builtin/remote.c:1414 msgid "no remote specified" msgstr "ingen fjärr angavs" +#: builtin/remote.c:1436 +msgid "manipulate push URLs" +msgstr "manipulera URL:ar för sändning" + +#: builtin/remote.c:1438 +msgid "add URL" +msgstr "lägg till URL" + +#: builtin/remote.c:1440 +msgid "delete URLs" +msgstr "ta bort URL:ar" + #: builtin/remote.c:1447 msgid "--add --delete doesn't make sense" msgstr "--add --delete ger ingen mening" @@ -4791,6 +7540,56 @@ msgstr "Ingen sÃ¥dan URL hittades: %s" msgid "Will not delete all non-push URLs" msgstr "Kommer inte ta bort alla icke-sänd-URL:er" +#: builtin/remote.c:1569 +msgid "be verbose; must be placed before a subcommand" +msgstr "var pratsam; mÃ¥ste skrivas före ett underkommando" + +#: builtin/replace.c:17 +msgid "git replace [-f] <object> <replacement>" +msgstr "git replace [-f] <objekt> <ersättning>" + +#: builtin/replace.c:18 +msgid "git replace -d <object>..." +msgstr "git replace -d <objekt>..." + +#: builtin/replace.c:19 +msgid "git replace -l [<pattern>]" +msgstr "git replace -l [<mönster>]" + +#: builtin/replace.c:118 +msgid "list replace refs" +msgstr "visa ersättningsreferenser" + +#: builtin/replace.c:119 +msgid "delete replace refs" +msgstr "ta bort ersättningsreferenser" + +#: builtin/replace.c:120 +msgid "replace the ref if it exists" +msgstr "ersätt referensen om den finns" + +#: 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 "registrera rena lösningar i indexet" + +#: builtin/reset.c:25 +msgid "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" +msgstr "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<incheckning>]" + +#: builtin/reset.c:26 +msgid "git reset [-q] <commit> [--] <paths>..." +msgstr "git reset [-q] <incheckning> [--] <sökvägar>..." + +#: builtin/reset.c:27 +msgid "git reset --patch [<commit>] [--] [<paths>...]" +msgstr "git reset --patch [<incheckning>] [--] [<sökvägar>...]" + #: builtin/reset.c:33 msgid "mixed" msgstr "blandad" @@ -4846,6 +7645,26 @@ msgstr "Oköade ändringar efter Ã¥terställning:" msgid "Cannot do a %s reset in the middle of a merge." msgstr "Kan inte utföra en %s Ã¥terställning mitt i en sammanslagning." +#: builtin/reset.c:238 +msgid "be quiet, only report errors" +msgstr "var tyst, rapportera endast fel" + +#: builtin/reset.c:240 +msgid "reset HEAD and index" +msgstr "Ã¥terställ HEAD och index" + +#: builtin/reset.c:241 +msgid "reset only HEAD" +msgstr "Ã¥terställ endast HEAD" + +#: builtin/reset.c:243 builtin/reset.c:245 +msgid "reset HEAD, index and working tree" +msgstr "Ã¥terställ HEAD, index och arbetskatalog" + +#: builtin/reset.c:247 +msgid "reset HEAD but keep local changes" +msgstr "Ã¥terställ HEAD men behÃ¥ll lokala ändringar" + #: builtin/reset.c:303 #, c-format msgid "Could not parse object '%s'." @@ -4875,23 +7694,126 @@ msgstr "%s Ã¥terställning tillÃ¥ts inte i ett naket arkiv" msgid "Could not reset index file to revision '%s'." msgstr "Kunde inte Ã¥terställa indexfilen till versionen \"%s\"." +#: builtin/rev-parse.c:339 +msgid "git rev-parse --parseopt [options] -- [<args>...]" +msgstr "git rev-parse --parseopt [options] -- [<argument>...]" + +#: builtin/rev-parse.c:344 +msgid "keep the `--` passed as an arg" +msgstr "behÃ¥ll \"--\" sänt som argument" + +#: builtin/rev-parse.c:346 +msgid "stop parsing after the first non-option argument" +msgstr "sluta tolka efter första argument som inte är flagga" + +#: 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 [flaggor] -- [<argument>...]\n" +" eller: git rev-parse --sq-quote [<argument>...]\n" +" eller: git rev-parse [flaggor] [<argument>...]\n" +"\n" +"Kör \"git rev-parse --parseopt -h\" för mer information om den första " +"varianten." + +#: builtin/revert.c:22 +msgid "git revert [options] <commit-ish>" +msgstr "git revert [flaggor] <incheckning-igt>" + +#: builtin/revert.c:23 +msgid "git revert <subcommand>" +msgstr "git revert <underkommando>" + +#: builtin/revert.c:28 +msgid "git cherry-pick [options] <commit-ish>" +msgstr "git cherry-pick [flaggor] <incheckning-igt>" + +#: builtin/revert.c:29 +msgid "git cherry-pick <subcommand>" +msgstr "git cherry-pick <underkommando>" + #: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s kan inte användas med %s" -#: builtin/revert.c:131 +#: builtin/revert.c:103 +msgid "end revert or cherry-pick sequence" +msgstr "avsluta revert- eller cherry-pick-sekvens" + +#: builtin/revert.c:104 +msgid "resume revert or cherry-pick sequence" +msgstr "Ã¥teruppta revert- eller cherry-pick-sekvens" + +#: builtin/revert.c:105 +msgid "cancel revert or cherry-pick sequence" +msgstr "avbryt revert- eller cherry-pick-sekvens" + +#: builtin/revert.c:106 +msgid "don't automatically commit" +msgstr "checka inte in automatiskt" + +#: builtin/revert.c:107 +msgid "edit the commit message" +msgstr "redigera incheckningsmeddelandet" + +#: builtin/revert.c:110 +msgid "parent number" +msgstr "nummer pÃ¥ förälder" + +#: builtin/revert.c:112 +msgid "merge strategy" +msgstr "sammanslagninsstrategi" + +#: builtin/revert.c:113 +msgid "option" +msgstr "alternativ" + +#: builtin/revert.c:114 +msgid "option for merge strategy" +msgstr "alternativ för sammanslagningsstrategi" + +#: builtin/revert.c:125 +msgid "append commit name" +msgstr "lägg till incheckningsnamn" + +#: builtin/revert.c:126 +msgid "allow fast-forward" +msgstr "tillÃ¥t snabbspolning" + +#: builtin/revert.c:127 +msgid "preserve initially empty commits" +msgstr "behÃ¥ll incheckningar som börjar som tomma" + +#: builtin/revert.c:128 +msgid "allow commits with empty messages" +msgstr "tillÃ¥t incheckningar med tomt meddelande" + +#: builtin/revert.c:129 +msgid "keep redundant, empty commits" +msgstr "behÃ¥ll redundanta, tomma incheckningar" + +#: builtin/revert.c:133 msgid "program error" msgstr "programfel" -#: builtin/revert.c:221 +#: builtin/revert.c:223 msgid "revert failed" msgstr "\"revert\" misslyckades" -#: builtin/revert.c:236 +#: builtin/revert.c:238 msgid "cherry-pick failed" msgstr "\"cherry-pick\" misslyckades" +#: builtin/rm.c:14 +msgid "git rm [options] [--] <file>..." +msgstr "git rm [flaggor] [--] <fil>..." + #: builtin/rm.c:109 #, c-format msgid "" @@ -4919,6 +7841,26 @@ msgstr "" "\"%s\" har lokala ändringar\n" "(använd --cached för att behÃ¥lla filen eller -f för att tvinga borttagning)" +#: builtin/rm.c:134 +msgid "do not list removed files" +msgstr "lista inte borttagna filer" + +#: builtin/rm.c:135 +msgid "only remove from the index" +msgstr "ta bara bort frÃ¥n indexet" + +#: builtin/rm.c:136 +msgid "override the up-to-date check" +msgstr "överstyr à jour-testet" + +#: builtin/rm.c:137 +msgid "allow recursive removal" +msgstr "tillÃ¥t rekursiv borttagning" + +#: builtin/rm.c:139 +msgid "exit with a zero status even if nothing matched" +msgstr "avsluta med nollstatus även om inget träffades" + #: builtin/rm.c:194 #, c-format msgid "not removing '%s' recursively without -r" @@ -4929,11 +7871,203 @@ msgstr "tar inte bort \"%s\" rekursivt utan -r" msgid "git rm: unable to remove %s" msgstr "git rm: kan inte ta bort %s" +#: builtin/shortlog.c:13 +msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" +msgstr "" +"git shortlog [-n] [-s] [-e] [-w] [rev-flaggor] [--] [<incheckning-id>... ]" + #: builtin/shortlog.c:157 #, c-format msgid "Missing author: %s" msgstr "Författare saknas: %s" +#: builtin/shortlog.c:253 +msgid "sort output according to the number of commits per author" +msgstr "sortera utdata enligt antal incheckningar per författare" + +#: builtin/shortlog.c:255 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "Undertryck beskrivningar, visa bara antal incheckningar" + +#: builtin/shortlog.c:257 +msgid "Show the email address of each author" +msgstr "Visa e-postadress för varje författare" + +#: builtin/shortlog.c:258 +msgid "w[,i1[,i2]]" +msgstr "w[,i1[,i2]]" + +#: builtin/shortlog.c:259 +msgid "Linewrap output" +msgstr "Radbryt utdata" + +#: 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[=<när>] | --no-color] [--sparse] [--more=<n> | --list | --" +"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | " +"<mönster>)...]" + +#: builtin/show-branch.c:10 +msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "git show-branch (-g|--reflog)[=<n>[,<bas>]] [--list] [<ref>]" + +#: builtin/show-branch.c:651 +msgid "show remote-tracking and local branches" +msgstr "visa fjärrspÃ¥rande och lokala grenar" + +#: builtin/show-branch.c:653 +msgid "show remote-tracking branches" +msgstr "visa fjärrspÃ¥rande grenar" + +#: builtin/show-branch.c:655 +msgid "color '*!+-' corresponding to the branch" +msgstr "färga \"*!+-\" enligt grenen" + +#: builtin/show-branch.c:657 +msgid "show <n> more commits after the common ancestor" +msgstr "visa <n> ytterligare incheckningar efter gemensam anfader" + +#: builtin/show-branch.c:659 +msgid "synonym to more=-1" +msgstr "synonym till more=-1" + +#: builtin/show-branch.c:660 +msgid "suppress naming strings" +msgstr "undertyck namnsträngar" + +#: builtin/show-branch.c:662 +msgid "include the current branch" +msgstr "inkludera aktuell gren" + +#: builtin/show-branch.c:664 +msgid "name commits with their object names" +msgstr "namnge incheckningar med deras objektnamn" + +#: builtin/show-branch.c:666 +msgid "show possible merge bases" +msgstr "visa möjliga sammanslaningsbaser" + +#: builtin/show-branch.c:668 +msgid "show refs unreachable from any other ref" +msgstr "visa referenser som inte kan nÃ¥s frÃ¥n nÃ¥gon annan referens" + +#: builtin/show-branch.c:670 +msgid "show commits in topological order" +msgstr "visa incheckningar i topologisk ordning" + +#: builtin/show-branch.c:672 +msgid "show only commits not on the first branch" +msgstr "visa endast incheckningar inte pÃ¥ den första grenen" + +#: builtin/show-branch.c:674 +msgid "show merges reachable from only one tip" +msgstr "visa sammanslagningar som endast kan nÃ¥s frÃ¥n en spets" + +#: builtin/show-branch.c:676 +msgid "show commits where no parent comes before its children" +msgstr "visa incheckningar där ingen förälder kommer före dess barn" + +#: builtin/show-branch.c:678 +msgid "<n>[,<base>]" +msgstr "<n>[,<bas>]" + +#: builtin/show-branch.c:679 +msgid "show <n> most recent ref-log entries starting at base" +msgstr "visa <n> nyaste refloggposter med början pÃ¥ bas" + +#: 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önster*] " + +#: builtin/show-ref.c:11 +msgid "git show-ref --exclude-existing[=pattern] < ref-list" +msgstr "git show-ref --exclude-existing[=mönster] < reflista" + +#: builtin/show-ref.c:182 +msgid "only show tags (can be combined with heads)" +msgstr "visa endast taggar (kan kombineras med huvuden)" + +#: builtin/show-ref.c:183 +msgid "only show heads (can be combined with tags)" +msgstr "visa endast huvuden (kan kombineras med taggar)" + +#: builtin/show-ref.c:184 +msgid "stricter reference checking, requires exact ref path" +msgstr "striktare referenskontroll, kräver exakt referenssökväg" + +#: builtin/show-ref.c:187 builtin/show-ref.c:189 +msgid "show the HEAD reference" +msgstr "visa HEAD-referensen" + +#: builtin/show-ref.c:191 +msgid "dereference tags into object IDs" +msgstr "avreferera taggar till objekt-id" + +#: builtin/show-ref.c:193 +msgid "only show SHA1 hash using <n> digits" +msgstr "visa SHA1-hash endast med <n> siffror" + +#: builtin/show-ref.c:197 +msgid "do not print results to stdout (useful with --verify)" +msgstr "visa inte resultat pÃ¥ standard ut (användbart med --verify)" + +#: builtin/show-ref.c:199 +msgid "show refs from stdin that aren't in local repository" +msgstr "visa referenser frÃ¥n standard in som inte finns i lokalt arkiv" + +#: builtin/symbolic-ref.c:7 +msgid "git symbolic-ref [options] name [ref]" +msgstr "git symbolic-ref [flaggor] namn [ref]" + +#: builtin/symbolic-ref.c:38 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "" +"undertryck felmeddelanden för icke-symboliska (frÃ¥nkopplade) referenser" + +#: builtin/symbolic-ref.c:39 +msgid "shorten ref output" +msgstr "förkorta ref-utdata" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason" +msgstr "skäl" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason of the update" +msgstr "skäl till uppdateringen" + +#: 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 <nyckel-id>] [-f] [-m <medd>|-F <fil>] <taggnamn> [<huvud>]" + +#: builtin/tag.c:23 +msgid "git tag -d <tagname>..." +msgstr "git tag -d <taggnamn>..." + +#: builtin/tag.c:24 +msgid "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n" +"\t\t[<pattern>...]" +msgstr "" +"git tag -l [-n[<antal>]] [--contains <incheckning>] [--points-at <objekt>] \n" +"\t\t[<mönster>...]" + +#: builtin/tag.c:26 +msgid "git tag -v <tagname>..." +msgstr "git tag -v <taggnamn>..." + #: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" @@ -5023,6 +8157,62 @@ msgstr "flaggan \"points-at\" behöver ett object" msgid "malformed object name '%s'" msgstr "felformat objektnamn \"%s\"" +#: builtin/tag.c:447 +msgid "list tag names" +msgstr "lista taggnamn" + +#: builtin/tag.c:449 +msgid "print <n> lines of each tag message" +msgstr "visa <n> rader frÃ¥n varje taggmeddelande" + +#: builtin/tag.c:451 +msgid "delete tags" +msgstr "ta bort taggar" + +#: builtin/tag.c:452 +msgid "verify tags" +msgstr "verifiera taggar" + +#: builtin/tag.c:454 +msgid "Tag creation options" +msgstr "Alternativ för att skapa taggar" + +#: builtin/tag.c:456 +msgid "annotated tag, needs a message" +msgstr "annoterad tagg, behöver meddelande" + +#: builtin/tag.c:458 +msgid "tag message" +msgstr "taggmeddelande" + +#: builtin/tag.c:460 +msgid "annotated and GPG-signed tag" +msgstr "annoterad och GPG-signerad tagg" + +#: builtin/tag.c:464 +msgid "use another key to sign the tag" +msgstr "använd annan nyckel för att signera taggen" + +#: builtin/tag.c:465 +msgid "replace the tag if exists" +msgstr "ersätt taggen om den finns" + +#: builtin/tag.c:466 +msgid "show tag list in columns" +msgstr "lista taggar i spalter" + +#: builtin/tag.c:468 +msgid "Tag listing options" +msgstr "Alternativ för listning av taggar" + +#: builtin/tag.c:471 +msgid "print only tags that contain the commit" +msgstr "visa endast taggar som innehÃ¥ller incheckningen" + +#: builtin/tag.c:477 +msgid "print only tags of the object" +msgstr "visa endast taggar för objektet" + #: builtin/tag.c:506 msgid "--column and -n are incompatible" msgstr "--column och -n är inkompatibla" @@ -5072,27 +8262,182 @@ msgstr "%s: kan inte uppdatera referensen" msgid "Updated tag '%s' (was %s)\n" msgstr "Uppdaterad tagg \"%s\" (var %s)\n" -#: git.c:16 -msgid "See 'git help <command>' for more information on a specific command." -msgstr "" -"Se \"git help <kommando>\" för mer information om ett specifikt kommando." +#: builtin/update-index.c:401 +msgid "git update-index [options] [--] [<file>...]" +msgstr "git update-index [flaggor] [--] [<fil>...]" -#: parse-options.h:133 parse-options.h:235 -msgid "n" -msgstr "n" +#: builtin/update-index.c:717 +msgid "continue refresh even when index needs update" +msgstr "fortsätt uppdatera även när index inte är à jour" -#: parse-options.h:141 -msgid "time" -msgstr "tid" +#: builtin/update-index.c:720 +msgid "refresh: ignore submodules" +msgstr "refresh: ignorera undermoduler" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: parse-options.h:149 -msgid "file" -msgstr "fil" +#: builtin/update-index.c:723 +msgid "do not ignore new files" +msgstr "ignorera inte nya filer" -#: parse-options.h:151 -msgid "when" -msgstr "när" +#: builtin/update-index.c:725 +msgid "let files replace directories and vice-versa" +msgstr "lÃ¥t filer ersätta kataloger och omvänt" + +#: builtin/update-index.c:727 +msgid "notice files missing from worktree" +msgstr "lägg märke till filer som saknas i arbetskatalogen" + +#: builtin/update-index.c:729 +msgid "refresh even if index contains unmerged entries" +msgstr "uppdatera även om indexet innehÃ¥ller ej sammanslagna poster" + +#: builtin/update-index.c:732 +msgid "refresh stat information" +msgstr "uppdatera statusinformation" + +#: builtin/update-index.c:736 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "som --refresh, men ignorera assume-unchanged-inställning" + +#: builtin/update-index.c:740 +msgid "<mode> <object> <path>" +msgstr "<läge> <objekt> <sökväg>" + +#: builtin/update-index.c:741 +msgid "add the specified entry to the index" +msgstr "lägg till angiven post i indexet" + +#: builtin/update-index.c:745 +msgid "(+/-)x" +msgstr "(+/-)x" + +#: builtin/update-index.c:746 +msgid "override the executable bit of the listed files" +msgstr "överstyr exekveringsbiten för angivna filer" + +#: builtin/update-index.c:750 +msgid "mark files as \"not changing\"" +msgstr "markera filer som \"ändras inte\"" + +#: builtin/update-index.c:753 +msgid "clear assumed-unchanged bit" +msgstr "rensa \"assume-unchanged\"-biten" + +#: builtin/update-index.c:756 +msgid "mark files as \"index-only\"" +msgstr "markera filer som \"endast index\"" + +#: builtin/update-index.c:759 +msgid "clear skip-worktree bit" +msgstr "töm \"skip-worktree\"-biten" + +#: builtin/update-index.c:762 +msgid "add to index only; do not add content to object database" +msgstr "lägg endast till indexet; lägg inte till innehÃ¥llet i objektdatabasen" + +#: builtin/update-index.c:764 +msgid "remove named paths even if present in worktree" +msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen" + +#: builtin/update-index.c:766 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "med --stdin: indatarader termineras med null-byte" + +#: builtin/update-index.c:768 +msgid "read list of paths to be updated from standard input" +msgstr "läs lista över sökvägar att uppdatera frÃ¥n standard in" + +#: builtin/update-index.c:772 +msgid "add entries from standard input to the index" +msgstr "lägg poster frÃ¥n frÃ¥n standard in till indexet" + +#: builtin/update-index.c:776 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "Ã¥terfyll etapp 2 och 3 frÃ¥n angivna sökvägar" + +#: builtin/update-index.c:780 +msgid "only update entries that differ from HEAD" +msgstr "uppdatera endast poster som skiljer sig frÃ¥n HEAD" + +#: builtin/update-index.c:784 +msgid "ignore files missing from worktree" +msgstr "ignorera filer som saknas i arbetskatalogen" + +#: builtin/update-index.c:787 +msgid "report actions to standard output" +msgstr "raportera Ã¥tgärder pÃ¥ standard ut" + +#: builtin/update-index.c:789 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "(för porslin) glöm sparade olösta konflikter" + +#: builtin/update-index.c:793 +msgid "write index in this format" +msgstr "skriv index i detta format" + +#: builtin/update-ref.c:7 +msgid "git update-ref [options] -d <refname> [<oldval>]" +msgstr "git update-ref [flaggor] -d <refnamn> [<gammaltvärde>]" + +#: builtin/update-ref.c:8 +msgid "git update-ref [options] <refname> <newval> [<oldval>]" +msgstr "git update-ref [flaggor] <refnamn> <gammaltvärde> [<nyttvärde>]" + +#: builtin/update-ref.c:19 +msgid "delete the reference" +msgstr "ta bort referensen" + +#: builtin/update-ref.c:21 +msgid "update <refname> not the one it points to" +msgstr "uppdatera <refnamn> inte det den pekar pÃ¥" + +#: 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 "uppdatera informationsfilerna frÃ¥n grunden" + +#: builtin/verify-pack.c:56 +msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..." +msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <paket>..." + +#: builtin/verify-pack.c:66 +msgid "verbose" +msgstr "pratsam" + +#: builtin/verify-pack.c:68 +msgid "show statistics only" +msgstr "visa endast statistik" + +#: builtin/verify-tag.c:17 +msgid "git verify-tag [-v|--verbose] <tag>..." +msgstr "git verify-tag [-v|--verbose] <tagg>..." + +#: builtin/verify-tag.c:73 +msgid "print tag contents" +msgstr "visa innehÃ¥ll för tag" + +#: builtin/write-tree.c:13 +msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" +msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]" + +#: builtin/write-tree.c:26 +msgid "<prefix>/" +msgstr "<prefix>/" + +#: builtin/write-tree.c:27 +msgid "write tree object for a subdirectory <prefix>" +msgstr "visa trädobjekt för underkatalogen <prefix>" + +#: builtin/write-tree.c:30 +msgid "only useful for debugging" +msgstr "endast användbart vid felsökning" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "" +"Se \"git help <kommando>\" för mer information om ett specifikt kommando." #: parse-options.h:156 msgid "no-op (backward compatibility)" @@ -5350,6 +8695,15 @@ msgstr "Inga ändringar -- Patchen har redan tillämpats." msgid "Patch failed at $msgnum $FIRSTLINE" msgstr "Patchen misslyckades vid $msgnum $FIRSTLINE" +#: git-am.sh:858 +#, sh-format +msgid "" +"The copy of the patch that failed is found in:\n" +" $dotest/patch" +msgstr "" +"En kopia av patchen som misslyckades finns i:\n" +" $dotest/patch" + #: git-am.sh:876 msgid "applying to an empty history" msgstr "tillämpar pÃ¥ en tom historik" @@ -5553,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" @@ -5564,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" @@ -5592,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" @@ -5618,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." @@ -5780,25 +9138,25 @@ msgstr "Kunde inte spara indexträd" msgid "Cannot unstage modified files" msgstr "Kan inte ta bort ändrade filer ur kön" -#: git-stash.sh:474 +#: git-stash.sh:475 msgid "Index was not unstashed." msgstr "Indexet har inte tagits ur kön." -#: git-stash.sh:491 +#: git-stash.sh:492 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Kastade ${REV} ($s)" -#: git-stash.sh:492 +#: git-stash.sh:493 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Kunde inte kasta \"stash\"-post" -#: git-stash.sh:499 +#: git-stash.sh:500 msgid "No branch name specified" msgstr "Inget grennamn angavs" -#: git-stash.sh:570 +#: git-stash.sh:571 msgid "(To restore them type \"git stash apply\")" msgstr "(För att Ã¥terställa dem, skriv \"git stash apply\")" @@ -5807,33 +9165,33 @@ msgstr "(För att Ã¥terställa dem, skriv \"git stash apply\")" msgid "cannot strip one component off url '$remoteurl'" msgstr "kan inte ta bort en komponent frÃ¥n url:en \"$remoteurl\"" -#: git-submodule.sh:145 +#: git-submodule.sh:167 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" msgstr "" "Hittade ingen undermodulmappning i .gitmodules för sökvägen \"$sm_path\"" -#: git-submodule.sh:189 +#: git-submodule.sh:211 #, sh-format msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\"" -#: git-submodule.sh:201 +#: git-submodule.sh:223 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "Gitkatalog \"$a\" ingÃ¥r i underkatalogsökvägen \"$b\" eller omvänt" -#: git-submodule.sh:290 +#: git-submodule.sh:312 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "arkiv-URL: \"$repo\" mÃ¥ste vara absolut eller börja med ./|../" -#: git-submodule.sh:307 +#: git-submodule.sh:329 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "\"$sm_path\" finns redan i indexet" -#: git-submodule.sh:311 +#: git-submodule.sh:333 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" @@ -5844,64 +9202,64 @@ msgstr "" "$sm_path\n" "Använd -f om du verkligen vill lägga till den" -#: git-submodule.sh:322 +#: git-submodule.sh:344 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet" -#: git-submodule.sh:324 +#: git-submodule.sh:346 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "\"$sm_path\" finns redan och är inte ett giltigt git-arkiv" -#: git-submodule.sh:338 +#: git-submodule.sh:360 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "Kan inte checka ut undermodulen \"$sm_path\"" -#: git-submodule.sh:343 +#: git-submodule.sh:365 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "Misslyckades lägga till undermodulen \"$sm_path\"" -#: git-submodule.sh:348 +#: git-submodule.sh:370 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "Misslyckades registrera undermodulen \"$sm_path\"" -#: git-submodule.sh:390 +#: git-submodule.sh:413 #, sh-format msgid "Entering '$prefix$sm_path'" msgstr "GÃ¥r in i \"$prefix$sm_path\"" -#: git-submodule.sh:404 +#: git-submodule.sh:427 #, sh-format msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "" "Stoppar pÃ¥ \"$sm_path\"; skriptet returnerade en status skild frÃ¥n noll." -#: git-submodule.sh:447 +#: git-submodule.sh:471 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "Hittade ingen url för undermodulsökvägen \"$sm_path\" i .gitmodules" -#: git-submodule.sh:456 +#: git-submodule.sh:480 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "Misslyckades registrera url för underkatalogsökväg \"$sm_path\"" -#: git-submodule.sh:458 +#: git-submodule.sh:482 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$sm_path\"" -#: git-submodule.sh:466 +#: git-submodule.sh:490 #, sh-format msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "" "Misslyckades registrera uppdateringsläge för undermodulsökväg \"$sm_path\"" -#: git-submodule.sh:565 +#: git-submodule.sh:590 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" @@ -5910,93 +9268,152 @@ msgstr "" "Undermodulen \"$sm_path\" har inte initierats\n" "Kanske du vill köra \"update --init\"?" -#: git-submodule.sh:578 +#: git-submodule.sh:603 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "Kan inte hitta aktuell revision i undermodulsökväg \"$sm_path\"" -#: git-submodule.sh:597 +#: git-submodule.sh:622 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\"" -#: git-submodule.sh:611 +#: git-submodule.sh:636 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "Kan inte ombasera \"$sha1\" i undermodulsökväg \"$sm_path\"" -#: git-submodule.sh:612 +#: git-submodule.sh:637 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "Undermodulsökvägen \"$sm_path\": ombaserade in i \"$sha1\"" -#: git-submodule.sh:617 +#: git-submodule.sh:642 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "Kan inte slÃ¥ ihop \"$sha1\" i undermodulsökvägen \"$sm_path\"" -#: git-submodule.sh:618 +#: git-submodule.sh:643 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "Undermodulsökvägen \"$sm_path\": sammanslagen i \"$sha1\"" -#: git-submodule.sh:623 +#: git-submodule.sh:648 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$sm_path\"" -#: git-submodule.sh:624 +#: git-submodule.sh:649 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "Undermodulsökvägen \"$sm_path\": checkade ut \"$sha1\"" -#: git-submodule.sh:646 git-submodule.sh:969 +#: git-submodule.sh:671 git-submodule.sh:995 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\"" -#: git-submodule.sh:754 +#: git-submodule.sh:779 msgid "The --cached option cannot be used with the --files option" msgstr "Flaggan --cached kan inte användas med flaggan --files" #. unexpected type -#: git-submodule.sh:794 +#: git-submodule.sh:819 #, sh-format msgid "unexpected mode $mod_dst" msgstr "oväntat läge $mod_dst" -#: git-submodule.sh:812 +#: git-submodule.sh:837 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " Varning: $name innehÃ¥ller inte incheckning $sha1_src" -#: git-submodule.sh:815 +#: git-submodule.sh:840 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " Varning: $name innehÃ¥ller inte incheckning $sha1_dst" -#: git-submodule.sh:818 +#: git-submodule.sh:843 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr " Varning: $name innehÃ¥ller inte incheckningar $sha1_src och $sha1_dst" -#: git-submodule.sh:843 +#: git-submodule.sh:868 msgid "blob" msgstr "blob" -#: git-submodule.sh:881 +#: git-submodule.sh:906 msgid "# Submodules changed but not updated:" msgstr "# Undermoduler ändrade men inte uppdaterade:" -#: git-submodule.sh:883 +#: git-submodule.sh:908 msgid "# Submodule changes to be committed:" msgstr "# Undermodulers ändringar att checka in:" -#: git-submodule.sh:1027 +#: git-submodule.sh:1054 #, sh-format 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\")" + +#~ msgid "-B cannot be used with -b" +#~ msgstr "-B kan inte användas med -b" + +#~ msgid "--patch is incompatible with all other options" +#~ msgstr "--patch är inkompatibel med alla andra flaggor" + +#~ msgid "--detach cannot be used with -b/-B/--orphan" +#~ msgstr "--detcah kan inte användas med -b/-B/--orphan" + +#~ msgid "--detach cannot be used with -t" +#~ msgstr "--detach kan inte användas med -t" + +#~ msgid "--orphan and -b|-B are mutually exclusive" +#~ msgstr "--orphan och -b|-B kan inte användas samtidigt" + +#~ msgid "--orphan cannot be used with -t" +#~ msgstr "--orphan kan inte användas med -t" + +#~ msgid "git checkout: -f and -m are incompatible" +#~ msgstr "git checkout: -f och -m är inkompatibla" + +#~ msgid "" +#~ "git checkout: updating paths is incompatible with switching branches." +#~ msgstr "" +#~ "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren." + +#~ msgid "diff setup failed" +#~ msgstr "misslyckades sätta upp för diff" + +#~ msgid "merge-recursive: disk full?" +#~ msgstr "merge-recursive: disk full?" + +#~ msgid "diff_setup_done failed" +#~ msgstr "diff_setup_done misslyckades" + #~ msgid "%s: has been deleted/renamed" #~ msgstr "%s: har tagits bort/ändrat namn" @@ -6018,9 +9435,6 @@ msgstr "Synkroniserar undermodul-url för \"$name\"" #~ msgid "--" #~ msgstr "--" -#~ msgid "Too many options specified" -#~ msgstr "För mÃ¥nga flaggor angavs" - #~ msgid "# Changed but not updated:" #~ msgstr "# Ändrade men inte uppdaterade:" @@ -6045,26 +9459,17 @@ msgstr "Synkroniserar undermodul-url för \"$name\"" #~ msgid "cannot mix --fixed-strings and regexp" #~ msgstr "kan inte blanda --fixed-strings och reguljära uttryck" -#~ msgid "invalid --decorate option: %s" -#~ msgstr "felaktigt värde till --decorate: %s" - #~ msgid "%s; will overwrite!" #~ msgstr "%s; kommer skriva över!" #~ msgid "Failed to write current notes tree to database" #~ msgstr "Kunde inte skriva aktuellt anteckningsträd till databasen" -#~ msgid "Failed to commit notes tree to database" -#~ msgstr "Kunde inte checka in anteckningsträd i databasen" - # FIXME: Untranslatable! # #~ msgid "Refusing to %s notes in %s (outside of refs/notes/)" #~ msgstr "Vägrar %s anteckningar i %s (utanför refs/notes/)" -#~ msgid "list" -#~ msgstr "list" - #~ msgid "add" #~ msgstr "add" @@ -2,23 +2,22 @@ # Copyright (C) 2012, Trần Ngá»c Quân. # This file is distributed under the same license as the git-core package. # First translated by Trần Ngá»c Quân <vnwildman@gmail.com>, 2012. +# Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com>, 2012. # msgid "" msgstr "" -"Project-Id-Version: git-1.7.12-rc1-18-ge0453\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-08-06 23:47+0800\n" -"PO-Revision-Date: 2012-08-07 07:11+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" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Plural-Forms: nplurals=2; plural=1;\n" -"X-Poedit-Language: Vietnamese\n" -"X-Poedit-Country: VIET NAM\n" -"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-Basepath: ../\n" #: advice.c:40 @@ -38,38 +37,118 @@ msgid "" "or use 'git commit -a'." msgstr "" "Sá»a chúng trong cây là m việc,\n" -"và sau đó sá» 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à sá» 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 -#: builtin/log.c:726 -#: builtin/log.c:1316 -#: builtin/log.c:1535 -#: builtin/merge.c:347 +#: 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" msgstr "Cà i đặt việc di chuyển qua các Ä‘iểm xét lại gặp lá»—i" @@ -96,9 +175,7 @@ msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu (refs) nà y" msgid "rev-list died" msgstr "rev-list bị chết" -#: bundle.c:300 -#: builtin/log.c:1212 -#: builtin/shortlog.c:284 +#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284 #, c-format msgid "unrecognized argument: %s" msgstr "đối số không được thừa nháºn: %s" @@ -106,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." @@ -123,30 +200,29 @@ 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!" -#: compat/obstack.c:406 -#: compat/obstack.c:408 +#: compat/obstack.c:406 compat/obstack.c:408 msgid "memory exhausted" 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 @@ -218,8 +294,7 @@ msgid_plural "%s, %lu months ago" msgstr[0] "%s, %lu tháng trÆ°á»›c" msgstr[1] "%s, %lu tháng trÆ°á»›c" -#: date.c:154 -#: date.c:159 +#: date.c:154 date.c:159 #, c-format msgid "%lu year ago" msgid_plural "%lu years ago" @@ -229,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 @@ -245,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:1400 -msgid " 0 files changed" -msgstr " 0 có táºp tin nà o bị sá»a đổi" - -#: diff.c:1404 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d táºp tin đã bị thay đổi" -msgstr[1] " %d táºp tin đã bị thay đổi" - -#: diff.c:1421 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d được thêm và o(+)" -msgstr[1] ", %d được thêm và o(+)" - -#: diff.c:1432 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d bị xóa(-)" -msgstr[1] ", %d bị xóa(-)" - -#: diff.c:3461 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -291,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" @@ -321,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 @@ -334,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 sẵn có.\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 @@ -345,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 thêm 'git --help'." +msgstr "git: `%s' không phải là má»™t lệnh của git. Xem `git --help'." #: help.c:370 msgid "" @@ -369,250 +419,251 @@ 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" msgstr "gặp lá»—i khi xây dá»±ng cây" -#: merge-recursive.c:497 -msgid "diff setup failed" -msgstr "cà i đặt diff gặp lá»—i" - -#: merge-recursive.c:627 -msgid "merge-recursive: disk full?" -msgstr "merge-recursive: Ä‘Ä©a bị đầy?" - -#: merge-recursive.c:690 +#: 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:701 +#: merge-recursive.c:683 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "Gỡ bá» %s để tạo chá»— (room) cho thÆ° mục con\n" #. something else exists #. .. but not some other error (who really cares what?) -#: merge-recursive.c:715 -#: merge-recursive.c:736 +#: merge-recursive.c:697 merge-recursive.c:718 msgid ": perhaps a D/F conflict?" msgstr ": có lẽ là má»™t xung Ä‘á»™t D/F?" -#: merge-recursive.c:726 +#: 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:766 +#: 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:768 +#: 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:791 -#: builtin/clone.c:302 +#: 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:799 +#: 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:802 +#: 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:939 +#: 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:943 +#: 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:959 +#: 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:1038 -#: merge-recursive.c:1052 +#: 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 in tree." -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)." +msgid "" +"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " +"in tree." +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:1044 -#: merge-recursive.c:1057 +#: 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 in tree at %s." -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." +msgid "" +"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " +"in tree at %s." +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:1098 +#: merge-recursive.c:1081 msgid "rename" msgstr "đổi tên" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "renamed" msgstr "đã đổi tên" -#: merge-recursive.c:1154 +#: 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:1176 +#: merge-recursive.c:1159 #, c-format -msgid "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s\"->\"%s\" in \"%s\"%s" -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" +msgid "" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" +"\"->\"%s\" in \"%s\"%s" +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:1181 +#: merge-recursive.c:1164 msgid " (left unresolved)" msgstr " (cần giải quyết)" -#: merge-recursive.c:1235 +#: 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" +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:1265 +#: 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:1464 +#: 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" +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:1474 +#: merge-recursive.c:1457 #, c-format msgid "Adding merged %s" msgstr "Thêm hòa trá»™n %s" -#: merge-recursive.c:1479 -#: merge-recursive.c:1677 +#: 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:1530 +#: merge-recursive.c:1513 #, c-format msgid "cannot read object %s" msgstr "không thể Ä‘á»c đối tượng %s" -#: merge-recursive.c:1533 +#: 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:1581 +#: merge-recursive.c:1564 msgid "modify" msgstr "sá»a đổi" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modified" msgstr "đã sá»a" -#: merge-recursive.c:1591 +#: merge-recursive.c:1574 msgid "content" msgstr "ná»™i dung" -#: merge-recursive.c:1598 +#: merge-recursive.c:1581 msgid "add/add" msgstr "thêm/thêm" -#: merge-recursive.c:1632 +#: merge-recursive.c:1615 #, c-format msgid "Skipped %s (merged same as existing)" -msgstr "Äã bá» qua %s (đã sẵn có lần hòa trá»™n nà y)" +msgstr "Äã bá» qua %s (đã có sẵn lần hòa trá»™n nà y)" -#: merge-recursive.c:1646 +#: merge-recursive.c:1629 #, c-format msgid "Auto-merging %s" msgstr "Tá»±-Ä‘á»™ng-hòa-trá»™n %s" -#: merge-recursive.c:1650 -#: git-submodule.sh:844 +#: merge-recursive.c:1633 git-submodule.sh:869 msgid "submodule" -msgstr "mô-Ä‘un con" +msgstr "mô-Ä‘un-con" -#: merge-recursive.c:1651 +#: 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:1741 +#: merge-recursive.c:1724 #, c-format msgid "Removing %s" msgstr "Äang xóa %s" -#: merge-recursive.c:1766 +#: merge-recursive.c:1749 msgid "file/directory" msgstr "táºp-tin/thÆ°-mục" -#: merge-recursive.c:1772 +#: merge-recursive.c:1755 msgid "directory/file" msgstr "thÆ°-mục/táºp tin" -#: merge-recursive.c:1777 +#: 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" +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:1787 +#: merge-recursive.c:1770 #, c-format msgid "Adding %s" -msgstr "Äang thêm \"%s\"" +msgstr "Thêm \"%s\"" -#: merge-recursive.c:1804 +#: 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:1823 +#: merge-recursive.c:1806 msgid "Already up-to-date!" msgstr "Äã cáºp nháºt rồi!" -#: merge-recursive.c:1832 +#: 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:1862 +#: merge-recursive.c:1845 #, c-format msgid "Unprocessed path??? %s" msgstr "ÄÆ°á»ng dẫn chÆ°a được xá» lý??? %s" -#: merge-recursive.c:1907 +#: merge-recursive.c:1890 msgid "Merging:" msgstr "Äang trá»™n:" -#: merge-recursive.c:1920 +#: 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:1957 +#: 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:2014 +#: 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:2026 -#: builtin/merge.c:697 +#: merge-recursive.c:2009 builtin/merge.c:696 msgid "Unable to write index." msgstr "Không thể ghi bảng mục lục" @@ -623,14 +674,14 @@ msgstr "..." #: parse-options.c:512 #, c-format msgid "usage: %s" -msgstr "cách sá» dụng: %s" +msgstr "cách dùng: %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation #: parse-options.c:516 #, c-format msgid " or: %s" -msgstr " hoặc: %s" +msgstr " hoặc: %s" #: parse-options.c:519 #, c-format @@ -641,15 +692,20 @@ 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 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ể đượ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ể được fast-forward.\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ể " +"đượ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ể " +"được fast-forward.\n" #: remote.c:1646 #, c-format @@ -660,262 +716,255 @@ 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:865 -#: builtin/merge.c:978 -#: builtin/merge.c:1088 -#: builtin/merge.c:1098 +#: 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:868 -#: builtin/merge.c:1090 -#: builtin/merge.c:1103 +#: 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 hay stash chúng để tiến hà nh." +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." +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 "Luồng chÃnh được chỉ định nhÆ°ng lần chuyển giao (commit) %s không phải là má»™t lần hòa trá»™n." +msgstr "" +"Luồng chÃnh được chỉ ra nhÆ°ng lần chuyển giao (commit) %s không phải là má»™t " +"lần hòa trá»™n." #. 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:3988 +#: 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" @@ -926,24 +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'" +msgstr "" +"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:413 +#: wrapper.c:408 +#, c-format +msgid "unable to access '%s': %s" +msgstr "không thể truy cáºp `%s': %s" + +#: 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" @@ -951,29 +1007,28 @@ msgstr "không có ngÆ°á»i dùng nhÆ° váºy" msgid "Unmerged paths:" msgstr "Những Ä‘Æ°á»ng dẫn chÆ°a được hòa trá»™n:" -#: wt-status.c:167 -#: wt-status.c:194 +#: wt-status.c:167 wt-status.c:194 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" -msgstr " (sá» dụng \"git reset %s <táºp-tin>...\" để bá» má»™t stage (trạng thái))" +msgstr " (dùng \"git reset %s <táºp-tin>...\" để bá» má»™t stage (trạng thái))" -#: wt-status.c:169 -#: wt-status.c:196 +#: wt-status.c:169 wt-status.c:196 msgid " (use \"git rm --cached <file>...\" to unstage)" -msgstr " (sá» dụng \"git rm --cached <táºp-tin>...\" để bá» trạng thái (stage))" +msgstr " (dùng \"git rm --cached <táºp-tin>...\" để bá» trạng thái (stage))" #: wt-status.c:173 msgid " (use \"git add <file>...\" to mark resolution)" -msgstr " (sá» dụng \"git add <táºp-tin>...\" để đánh dấu là cần giải quyết)" +msgstr " (dùng \"git add <táºp-tin>...\" để đánh dấu là cần giải quyết)" -#: wt-status.c:175 -#: wt-status.c:179 +#: wt-status.c:175 wt-status.c:179 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" -msgstr " (sá» 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)" +msgstr "" +" (dùng \"git add/rm <táºp-tin>...\" nhÆ° là má»™t cách thÃch hợp để đánh dấu " +"là cần được giải quyết)" #: wt-status.c:177 msgid " (use \"git rm <file>...\" to mark resolution)" -msgstr " (sá» dụng \"git rm <táºp-tin>...\" để đánh dấu là cần giải quyết)" +msgstr " (dùng \"git rm <táºp-tin>...\" để đánh dấu là cần giải quyết)" #: wt-status.c:188 msgid "Changes to be committed:" @@ -981,33 +1036,39 @@ msgstr "Những thay đổi sẽ được chuyển giao:" #: wt-status.c:206 msgid "Changes not staged for commit:" -msgstr "Các thay đổi không được đặt trạng thái (stage) cho lần chuyển giao (commit):" +msgstr "" +"Các thay đổi không được đặt trạng thái (stage) cho lần chuyển giao (commit):" #: wt-status.c:210 msgid " (use \"git add <file>...\" to update what will be committed)" -msgstr " (sá» dụng \"git add <táºp-tin>...\" để cáºp nháºt những gì cần chuyển giao (commit))" +msgstr "" +" (dùng \"git add <táºp-tin>...\" để cáºp nháºt những gì cần chuyển giao " +"(commit))" #: wt-status.c:212 msgid " (use \"git add/rm <file>...\" to update what will be committed)" -msgstr " (sá» dụng \"git add/rm <táºp_tin>...\" để cáºp nháºt những gì sẽ được chuyển giao)" +msgstr "" +" (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 " (use \"git checkout -- <file>...\" to discard changes in working directory)" -msgstr " (sá» dụng \"git checkout -- <táºp_tin>...\" để loại bá» những thay đổi trong thÆ° mục là m việc)" +msgid "" +" (use \"git checkout -- <file>...\" to discard changes in working directory)" +msgstr "" +" (dùng \"git checkout -- <táºp-tin>...\" để bá» thay đổi trong thÆ° mục là m " +"việc)" #: wt-status.c:215 msgid " (commit or discard the untracked or modified content in submodules)" -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:" +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:227 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" -msgstr " (sá» dụng \"git %s <táºp-tin>...\" để bao gồm thêm và o những gì cần chuyển giao (commit))" +msgstr "" +" (dùng \"git %s <táºp-tin>...\" để thêm và o những gì cần chuyển giao " +"(commit))" #: wt-status.c:244 msgid "bug" @@ -1043,15 +1104,15 @@ msgstr "bị sá»a bởi cả hai:" #: wt-status.c:285 msgid "new commits, " -msgstr " lần chuyển giao (commit) má»›i, " +msgstr "lần chuyển giao (commit) má»›i, " #: wt-status.c:287 msgid "modified content, " -msgstr "ná»™i dung được sá»a đổi," +msgstr "ná»™i dung được sá»a đổi, " #: wt-status.c:289 msgid "untracked content, " -msgstr "ná»™i dung chÆ°a được theo dõi" +msgstr "ná»™i dung chÆ°a được theo dõi, " #: wt-status.c:303 #, c-format @@ -1066,12 +1127,12 @@ msgstr "đã sao chép: %s -> %s" #: wt-status.c:309 #, c-format msgid "deleted: %s" -msgstr "bị xóa: %s" +msgstr "đã xóa: %s" #: wt-status.c:312 #, c-format msgid "modified: %s" -msgstr "bị sá»a đổi: %s" +msgstr "đã sá»a đổi: %s" #: wt-status.c:315 #, c-format @@ -1086,7 +1147,7 @@ msgstr "đổi-kiểu: %s" #: wt-status.c:321 #, c-format msgid "unknown: %s" -msgstr "không rõ: %s" +msgstr "không hiểu: %s" #: wt-status.c:324 #, c-format @@ -1102,8 +1163,7 @@ msgstr "lá»—i: không lấy được trạng thái lệnh diff %c" msgid "You have unmerged paths." msgstr "Bạn có những Ä‘Æ°á»ng dẫn chÆ°a được hòa trá»™n." -#: wt-status.c:788 -#: wt-status.c:912 +#: wt-status.c:788 wt-status.c:912 msgid " (fix conflicts and run \"git commit\")" msgstr " (sá»a các xung Ä‘á»™t sau đó chạy \"git commit\")" @@ -1113,7 +1173,7 @@ msgstr "Tất cả các xung Ä‘á»™t đã được giải quyết nhÆ°ng bạn vá #: wt-status.c:794 msgid " (use \"git commit\" to conclude merge)" -msgstr " (sá» dụng \"git commit\" để hoà n tất việc hòa trá»™n)" +msgstr " (dùng \"git commit\" để hoà n tất việc hòa trá»™n)" #: wt-status.c:804 msgid "You are in the middle of an am session." @@ -1129,14 +1189,13 @@ msgstr " (sá»a các xung Ä‘á»™t và sau đó chạy lệnh \"git am --resolved #: wt-status.c:813 msgid " (use \"git am --skip\" to skip this patch)" -msgstr " (sá» dụng \"git am --skip\" để bá» qua lần vá nà y)" +msgstr " (dùng \"git am --skip\" để bá» qua lần vá nà y)" #: wt-status.c:815 msgid " (use \"git am --abort\" to restore the original branch)" -msgstr " (sá» dụng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)" +msgstr " (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)" -#: wt-status.c:873 -#: wt-status.c:883 +#: wt-status.c:873 wt-status.c:883 msgid "You are currently rebasing." msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc rebase (tái cấu trúc)." @@ -1146,23 +1205,28 @@ msgstr " (sá»a các xung Ä‘á»™t và sau đó chạy lệnh \"git rebase --cont #: wt-status.c:878 msgid " (use \"git rebase --skip\" to skip this patch)" -msgstr " (sá» dụng \"git rebase --skip\" để bá» qua lần vá nà y)" +msgstr " (dùng \"git rebase --skip\" để bá» qua lần vá nà y)" #: wt-status.c:880 msgid " (use \"git rebase --abort\" to check out the original branch)" -msgstr " (sá» dụng \"git rebase --abort\" để check-out nhánh nguyên thủy)" +msgstr " (dùng \"git rebase --abort\" để check-out nhánh nguyên thủy)" #: wt-status.c:886 msgid " (all conflicts fixed: run \"git rebase --continue\")" -msgstr " (khi tất cả các xung Ä‘á»™t đã sá»a xong: chạy lệnh \"git rebase --continue\")" +msgstr "" +" (khi tất cả các xung Ä‘á»™t đã sá»a xong: chạy lệnh \"git rebase --continue\")" #: wt-status.c:888 msgid "You are currently splitting a commit during a rebase." -msgstr "Bạn hiện tại Ä‘ang cắt đôi má»™t lần chuyển giao trong khi Ä‘ang thá»±c hiện việc rebase." +msgstr "" +"Bạn hiện tại Ä‘ang cắt đôi má»™t lần chuyển giao trong khi Ä‘ang thá»±c hiện việc " +"rebase." #: wt-status.c:891 msgid " (Once your working directory is clean, run \"git rebase --continue\")" -msgstr " (Má»™t khi thÆ° mục là m việc của bạn đã gá»n gà ng, chạy \"git rebase --continue\")" +msgstr "" +" (Má»™t khi thÆ° mục là m việc của bạn đã gá»n gà ng, chạy \"git rebase --continue" +"\")" #: wt-status.c:893 msgid "You are currently editing a commit during a rebase." @@ -1170,11 +1234,15 @@ msgstr "Bạn hiện Ä‘ang sá»a má»™t lần chuyển giao trong khi bạn thá»± #: wt-status.c:896 msgid " (use \"git commit --amend\" to amend the current commit)" -msgstr " (sá» dụng \"git commit --amend\" để tu bổ lần chuyển giao (commit) hiện tại)" +msgstr "" +" (dùng \"git commit --amend\" để tu bổ lần chuyển giao (commit) hiện tại)" #: wt-status.c:898 -msgid " (use \"git rebase --continue\" once you are satisfied with your changes)" -msgstr " (sá» dụng \"git rebase --continue\" má»™t khi bạn cảm thấy hà i lòng vá» những thay đổi của mình)" +msgid "" +" (use \"git rebase --continue\" once you are satisfied with your changes)" +msgstr "" +" (dùng \"git rebase --continue\" má»™t khi bạn cảm thấy hà i lòng vá» những " +"thay đổi của mình)" #: wt-status.c:908 msgid "You are currently cherry-picking." @@ -1190,11 +1258,11 @@ msgstr "Bạn hiện tại Ä‘ang thá»±c hiện việc bisect (chia đôi)." #: wt-status.c:927 msgid " (use \"git bisect reset\" to get back to the original branch)" -msgstr " (sá» dụng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)" +msgstr " (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)" #: wt-status.c:978 msgid "On branch " -msgstr "Trên nhánh" +msgstr "Trên nhánh " #: wt-status.c:985 msgid "Not currently on any branch." @@ -1205,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 @@ -1219,105 +1287,126 @@ msgstr "Những táºp tin không bị theo vết không được liệt kê ra % #: wt-status.c:1017 msgid " (use -u option to show untracked files)" -msgstr " (sá» dụng tùy chá»n -u để hiển thị các táºp tin chÆ°a được theo dõi)" +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:1023 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 " (sá» 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" -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" +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:1033 -msgid " (use \"git add\" to track)" -msgstr " (sá» dụng \"git add\" để theo dõi dấu vết)" +#: 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 (dùng \"git add\" để Ä‘Æ°a và o theo dõi)\n" -#: wt-status.c:1035 -#: wt-status.c:1038 -#: wt-status.c:1041 +#: wt-status.c:1037 #, c-format -msgid "nothing to commit%s\n" -msgstr "không có gì để chuyển giao (commit) %s\n" +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:1036 -msgid " (create/copy files and use \"git add\" to track)" -msgstr " (tạo/sao-chép các táºp tin và sá» dụng \"git add\" để theo dõi dấu vết)" +#: wt-status.c:1040 +#, c-format +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:1039 -msgid " (use -u to show untracked files)" -msgstr " (sá» dụng tùy chá»n -u để hiển thị các táºp tin chÆ°a được theo dõi)" +#: 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:1042 -msgid " (working directory clean)" -msgstr " (thÆ° mục là m việc sạch sẽ)" +#: 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: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 (chÆ°a có nhánh nà o)" +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" +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" +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" +msgstr "phÃa trÆ°á»›c " -#: wt-status.c:1179 +#: wt-status.c:1187 msgid ", behind " -msgstr ", đằng sau" +msgstr ", đằng sau " + +#: compat/precompose_utf8.c:58 builtin/clone.c:341 +#, c-format +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:" +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" @@ -1326,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" @@ -1335,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." @@ -1344,55 +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" +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: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:352 +#: 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 sá» dụng cùng vá»›i --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:4433 -#: 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" @@ -1403,141 +1543,151 @@ 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:824 +#: builtin/apply.c:823 #, c-format msgid "Cannot prepare timestamp regexp %s" -msgstr "Không thể chuẩn bị biểu thức chÃnh qui dấu vết thá»i gian (timestamp regexp) %s" +msgstr "" +"Không thể chuẩn bị biểu thức chÃnh qui dấu vết thá»i gian (timestamp regexp) " +"%s" -#: builtin/apply.c:833 +#: builtin/apply.c:832 #, c-format msgid "regexec returned %d for input: %s" msgstr "thi hà nh biểu thức chÃnh quy trả vá» %d cho kết xuất: %s" -#: builtin/apply.c:914 +#: builtin/apply.c:913 #, c-format msgid "unable to find filename in patch at line %d" msgstr "không thể tìm thấy tên táºp tin trong miếng vá tại dòng %d" -#: builtin/apply.c:946 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "git apply: git-diff sai - mong đợi /dev/null, đã nháºn %s trên dòng %d" -#: builtin/apply.c:950 +#: builtin/apply.c:949 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "git apply: git-diff sai - tên táºp tin má»›i mâu thuấn trên dòng %d" -#: builtin/apply.c:951 +#: builtin/apply.c:950 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "git apply: git-diff sai - tên táºp tin cÅ© mâu thuấn trên dòng %d" -#: builtin/apply.c:958 +#: builtin/apply.c:957 #, c-format 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:1403 +#: 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:1460 +#: 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:1477 +#: builtin/apply.c:1494 #, c-format -msgid "git diff header lacks filename information when removing %d leading pathname component (line %d)" -msgid_plural "git diff header lacks filename information when removing %d leading pathname components (line %d)" -msgstr[0] "phần đầu diff cho git thiếu thông tin tên táºp tin khi gỡ bá» Ä‘i %d trong thà nh phần dẫn đầu tên của Ä‘Æ°á»ng dẫn (dòng %d)" -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)" +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "" +"phần đầu diff cho git thiếu thông tin tên táºp tin khi gỡ bá» Ä‘i %d trong " +"thà nh phần dẫn đầu tên của Ä‘Æ°á»ng dẫn (dòng %d)" +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:1637 +#: 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:1639 +#: 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:1665 +#: 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:1701 +#: 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:1703 +#: 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:1706 +#: 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:1852 +#: 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:1881 +#: 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:1967 +#: 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:2057 +#: 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:2061 +#: 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:2132 +#: builtin/apply.c:2149 msgid "oops" msgstr "ôi?" -#: builtin/apply.c:2654 +#: 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:2772 +#: 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:2784 +#: builtin/apply.c:2801 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" -msgstr "Ná»™i dung được giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %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:2790 +#: builtin/apply.c:2807 #, c-format msgid "" "while searching for:\n" @@ -1546,334 +1696,325 @@ msgstr "" "Trong khi Ä‘ang tìm kiếm cho:\n" "%.*s" -#: builtin/apply.c:2809 +#: 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:2912 +#: 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:2918 +#: 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 (Ä‘ang chá» %s, đã nháºn %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)" -#: builtin/apply.c:2939 +#: builtin/apply.c:2956 #, c-format msgid "patch failed: %s:%ld" msgstr "vá gặp lá»—i: %s:%ld" -#: builtin/apply.c:3061 +#: builtin/apply.c:3078 #, c-format msgid "cannot checkout %s" msgstr "không thể \"checkout\" %s" -#: builtin/apply.c:3106 -#: builtin/apply.c:3115 -#: builtin/apply.c:3159 +#: 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:3139 -#: builtin/apply.c:3361 +#: 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:3220 -#: builtin/apply.c:3375 +#: 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:3224 -#: builtin/apply.c:3367 -#: builtin/apply.c:3389 +#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: builtin/apply.c:3229 -#: builtin/apply.c:3383 +#: 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:3331 +#: 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:3400 +#: builtin/apply.c:3417 #, c-format msgid "%s: wrong type" msgstr "%s: sai kiểu" -#: builtin/apply.c:3402 +#: 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:3503 +#: 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:3506 +#: 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:3526 +#: 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:3531 +#: 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:3539 +#: 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:3552 +#: builtin/apply.c:3569 #, c-format msgid "Checking patch %s..." msgstr "Äang kiểm tra miếng vá %s..." -#: builtin/apply.c:3607 -#: 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:3750 +#: 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:3778 +#: 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:3782 +#: 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:3787 +#: 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:3790 -#: builtin/apply.c:3898 +#: 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:3823 +#: 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:3872 +#: 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:3959 +#: 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:3967 +#: builtin/apply.c:3984 msgid "internal error" msgstr "lá»—i ná»™i bá»™" #. Say this even without --verbose -#: builtin/apply.c:3970 +#: 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:3980 +#: 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:4001 +#: 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:4004 +#: builtin/apply.c:4021 #, c-format msgid "Rejected hunk #%d." msgstr "hunk #%d bị từ chối." -#: builtin/apply.c:4154 +#: builtin/apply.c:4171 msgid "unrecognized input" msgstr "không thừa nháºn đầu và o" -#: builtin/apply.c:4165 +#: 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:4284 -#: builtin/apply.c:4287 +#: 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:4285 +#: 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:4288 +#: 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:4290 +#: builtin/apply.c:4307 msgid "num" msgstr "số" -#: builtin/apply.c:4291 +#: 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:4294 +#: 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:4296 +#: 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" +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:4300 -msgid "shows 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: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:4302 +#: 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:4304 +#: 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:4306 +#: 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:4308 +#: 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:4310 +#: builtin/apply.c:4327 msgid "also apply the patch (use with --stat/--summary/--check)" -msgstr "đồng thá»i áp dụng miếng vá (sá» dụng vá»›i tùy chá»n --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:4312 +#: 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:4314 +#: 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" +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:4316 +#: 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:4319 +#: 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:4320 +#: builtin/apply.c:4337 msgid "action" msgstr "hà nh Ä‘á»™ng" -#: builtin/apply.c:4321 +#: 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:4324 -#: builtin/apply.c:4327 +#: 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:4330 +#: 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:4332 +#: 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:4334 +#: 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:4336 +#: builtin/apply.c:4353 msgid "allow overlapping hunks" msgstr "cho phép chồng khối nhá»›" -#: builtin/apply.c:4337 -msgid "be verbose" -msgstr "chi tiết" - -#: builtin/apply.c:4339 +#: builtin/apply.c:4356 msgid "tolerate incorrectly detected missing new-line at the end of file" -msgstr "dung sai không chÃnh xác đã tìm thấy thiếu dòng má»›i tại cuối táºp tin" +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:4342 +#: 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:4344 +#: builtin/apply.c:4361 msgid "root" msgstr "root" -#: builtin/apply.c:4345 +#: 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:4367 +#: builtin/apply.c:4384 msgid "--3way outside a repository" msgstr "--3way ở ngoà i má»™t kho chứa" -#: builtin/apply.c:4375 +#: builtin/apply.c:4392 msgid "--index outside a repository" msgstr "--index ở ngoà i má»™t kho chứa" -#: builtin/apply.c:4378 +#: builtin/apply.c:4395 msgid "--cached outside a repository" msgstr "--cached ở ngoà i má»™t kho chứa" -#: builtin/apply.c:4394 +#: 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:4408 +#: 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:4414 -#: builtin/apply.c:4424 +#: builtin/apply.c:4431 builtin/apply.c:4441 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -1883,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" @@ -1915,186 +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ể sá» dụng -a vá»›i -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 "nhánh máy chủ '%s' không tìm thấy." +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ủ đã xóa %s (trÆ°á»›c là %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 đã bị xóa '%s' (trÆ°á»›c 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" +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 có nhánh nà o)" +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 "tên nhánh sai: '%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 "HEAD không tìm thấy ở dÆ°á»›i 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 nhánh" +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 " +"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." @@ -2104,107 +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:235 -#: builtin/checkout.c:393 +#: 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: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:499 -#: builtin/clone.c:586 -#: builtin/merge.c:812 +#: 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:320 -#: builtin/diff.c:302 -#: builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "diff_setup_done gặp lá»—i" - -#: builtin/checkout.c:415 +#: 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:534 +#: 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:567 +#: builtin/checkout.c:602 msgid "HEAD is now at" msgstr "HEAD hiện giá» tại" -#: builtin/checkout.c:574 +#: 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:577 +#: 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:581 +#: 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:583 +#: 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:585 +#: 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:641 +#: 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:647 +#: builtin/checkout.c:682 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2217,17 +2745,19 @@ msgid_plural "" "\n" "%s\n" msgstr[0] "" -"Cảnh báo: bạn đã rá»i bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n" +"Cảnh báo: bạn đã rá»i bá» %d lần chuyển giao (commit) lại đằng sau, không được " +"kết nối đến\n" "bất kỳ nhánh nà o của bạn:\n" "\n" "%s\n" msgstr[1] "" -"Cảnh báo: bạn đã rá»i bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n" +"Cảnh báo: bạn đã rá»i bá» %d lần chuyển giao (commit) lại đằng sau, không được " +"kết nối đến\n" "bất kỳ nhánh nà o của bạn:\n" "\n" "%s\n" -#: builtin/checkout.c:665 +#: 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" @@ -2236,95 +2766,160 @@ msgid "" " git branch new_branch_name %s\n" "\n" msgstr "" -"Nếu bạn muốn giữ chúng bằng cách tạo ra má»™t nhánh má»›i, đây có lẽ là má»™t thá»i Ä‘iểm thÃch hợp\n" +"Nếu bạn muốn giữ chúng bằng cách tạo ra má»™t nhánh má»›i, đây có lẽ là má»™t thá»i " +"Ä‘iểm thÃch hợp\n" "để là m thế bằng lệnh:\n" "\n" " git branch tên_nhánh_má»›i %s\n" "\n" -#: builtin/checkout.c:695 +#: 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:699 +#: builtin/checkout.c:734 msgid "Previous HEAD position was" msgstr "Vị trà kế trÆ°á»›c của HEAD là " -#: builtin/checkout.c:725 -#: builtin/checkout.c:920 +#: 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:856 +#: builtin/checkout.c:886 #, c-format msgid "invalid reference: %s" msgstr "tham chiếu sai: %s" #. case (1): want a tree -#: builtin/checkout.c:895 +#: builtin/checkout.c:925 #, c-format msgid "reference is not a tree: %s" -msgstr "tham chiếu không phải là cây:%s" +msgstr "tham chiếu không phải là má»™t cây (tree):%s" + +#: 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: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 +#, 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: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: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:1011 +msgid "create and checkout a new branch" +msgstr "tạo và checkout má»™t nhánh má»›i" + +#: builtin/checkout.c:1013 +msgid "create/reset and checkout a branch" +msgstr "create/reset và checkout má»™t nhánh" + +#: 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 "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:977 -msgid "-B cannot be used with -b" -msgstr "-B không thể được sá» dụng vá»›i -b" +#: 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:986 -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: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:989 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "--detach không thể được sá» dụng vá»›i -b/-B/--orphan" +#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241 +msgid "style" +msgstr "kiểu" -#: builtin/checkout.c:991 -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:1027 +msgid "conflict style (merge or diff3)" +msgstr "xung Ä‘á»™t kiểu (hòa trá»™n hay diff3)" -#: builtin/checkout.c:997 +#: 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:1004 +#: builtin/checkout.c:1078 msgid "Missing branch name; try -b" msgstr "Thiếu tên nhánh; hãy thá» -b" -#: builtin/checkout.c:1010 -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:1012 -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:1022 -msgid "git checkout: -f and -m are incompatible" -msgstr "git checkout: -f và -m xung khắc nhau" - -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1113 msgid "invalid path specification" msgstr "Ä‘Æ°á»ng dẫn đã cho không hợp lệ" -#: builtin/checkout.c:1064 +#: 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 chuyển giao (commit)?" - -#: builtin/checkout.c:1066 -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." +"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:1071 -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:1074 +#: builtin/checkout.c:1129 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -2332,40 +2927,69 @@ 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:1093 -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:1096 -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" msgstr "-x và -X không thể dùng cùng má»™t lúc vá»›i nhau" #: builtin/clean.c:82 -msgid "clean.requireForce set to true and neither -n nor -f given; refusing to clean" -msgstr "clean.requireForce được đặt thà nh true và không Ä‘Æ°a ra tùy chá»n -n mà cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)" +msgid "" +"clean.requireForce set to true and neither -n nor -f given; refusing to clean" +msgstr "" +"clean.requireForce được đặt thà nh true và không Ä‘Æ°a ra tùy chá»n -n mà cÅ©ng " +"không -f; từ chối lệnh dá»n dẹp (clean)" #: builtin/clean.c:85 -msgid "clean.requireForce defaults to true and neither -n nor -f given; refusing to clean" -msgstr "clean.requireForce mặc định được đặt thà nh true và không Ä‘Æ°a ra tùy chá»n -n mà cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)" +msgid "" +"clean.requireForce defaults to true and neither -n nor -f given; refusing to " +"clean" +msgstr "" +"clean.requireForce mặc định được đặt thà nh true và không Ä‘Æ°a ra tùy chá»n -n " +"mà cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)" -#: builtin/clean.c:155 -#: builtin/clean.c:176 +#: builtin/clean.c:155 builtin/clean.c:176 #, c-format msgid "Would remove %s\n" msgstr "Có thể gỡ bá» %s\n" -#: builtin/clean.c:159 -#: builtin/clean.c:179 +#: builtin/clean.c:159 builtin/clean.c:179 #, c-format msgid "Removing %s\n" msgstr "Äang gỡ bá» %s\n" -#: builtin/clean.c:162 -#: builtin/clean.c:182 +#: builtin/clean.c:162 builtin/clean.c:182 #, c-format msgid "failed to remove %s" msgstr "gặp lá»—i khi gỡ bá» %s" @@ -2380,21 +3004,113 @@ 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 msgid "failed to create directory '%s'" msgstr "tạo thÆ° mục \"%s\" gặp lá»—i" -#: builtin/clone.c:308 -#: builtin/diff.c:75 +#: 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 @@ -2406,20 +3122,15 @@ msgstr "%s tồn tại nhÆ°ng không phải là má»™t thÆ° mục" msgid "failed to stat %s\n" msgstr "lá»—i stat (lấy trạng thái vá») %s\n" -#: builtin/clone.c:341 -#, c-format -msgid "failed to unlink '%s'" -msgstr "bá» liên kết (unlink) %s không thà nh công" - #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" -msgstr "tạo được liên kết má»m tá»›i %s gặp lá»—i" +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 "sao chép tệp tin tá»›i '%s' gặp lá»—i" +msgstr "gặp lá»—i khi chép táºp tin tá»›i `%s'" #: builtin/clone.c:373 #, c-format @@ -2435,78 +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" @@ -2519,29 +3265,35 @@ msgid "" "\n" " git commit --amend --reset-author\n" msgstr "" -"Tên và địa chỉ thÆ° Ä‘iện tá» của bạn được cấu hình má»™t cách tá»± Ä‘á»™ng trên cÆ¡ sở\n" -"tà i khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chÃnh xác không.\n" -"Bạn có thể chặn những thông báo kiểu nà y bằng cách cà i đặt các thông tin trên má»™t cách rõ rà ng:\n" +"Tên và địa chỉ thÆ° Ä‘iện tá» của bạn được cấu hình má»™t cách tá»± Ä‘á»™ng trên cÆ¡ " +"sở\n" +"tà i khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chÃnh " +"xác không.\n" +"Bạn có thể chặn những thông báo kiểu nà y bằng cách cà i đặt các thông tin " +"trên má»™t cách rõ rà ng:\n" "\n" " git config --global user.name \"Tên của bạn\"\n" " git config --global user.email you@example.com\n" "\n" -"Sau khi thá»±c hiện xong, bạn có thể sá»a chữa định danh được sá» dụng cho lần chuyển giao (commit) nà y vá»›i lệnh:\n" +"Sau khi thá»±c hiện xong, bạn có thể sá»a chữa định danh được sá» dụng cho lần " +"chuyển giao (commit) nà y vá»›i lệnh:\n" "\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" "remove the commit entirely with \"git reset HEAD^\".\n" msgstr "" -"Bạn đã yêu cầu amend (tu bổ) phần lá»›n các lần chuyển giao (commit) gần đây, nhÆ°ng là m nhÆ° thế\n" -"có thể là m cho nó trở nên trống rá»—ng. Bạn có thể lặp lại lệnh của mình bằng --allow-empty,\n" +"Bạn đã yêu cầu amend (tu bổ) phần lá»›n các lần chuyển giao (commit) gần đây, " +"nhÆ°ng là m nhÆ° thế\n" +"có thể là m cho nó trở nên trống rá»—ng. Bạn có thể lặp lại lệnh của mình bằng " +"--allow-empty,\n" "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" @@ -2550,106 +3302,105 @@ msgid "" "\n" "Otherwise, please use 'git reset'\n" msgstr "" -"Lần cherry-pick trÆ°á»›c hiện nay trống rá»—ng, có lẽ là bởi vì sá»± phân giải xung Ä‘á»™t.\n" +"Lần cherry-pick trÆ°á»›c hiện nay trống rá»—ng, có lẽ là bởi vì sá»± phân giải xung " +"Ä‘á»™t.\n" "Nếu bạn muốn chuyển giao nó cho dù thế nà o Ä‘i nữa, sá» dụng:\n" "\n" " git commit --allow-empty\n" "\n" -"Nếu không, hãy thá» sá» 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." +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." +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" @@ -2664,7 +3415,7 @@ msgstr "" "\t%s\n" "và thá» lại.\n" -#: builtin/commit.c:739 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -2679,182 +3430,385 @@ 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á» lần chuyển giao (commit).\n" +"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á» " +"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" "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; bạn có thể xóa chúng Ä‘i nếu muốn.\n" +"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" "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ả đã sẵn có 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ổ)." +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ổ)." +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." +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." +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... Ä‘ang tu bổ cái cuối vá»›i bảng mục lục phi nghÄ©a." +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..." +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" +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:509 +#: 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" +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" +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:936 -#: builtin/merge.c:961 +#: 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 HEAD ref (tham chiếu)" +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" @@ -2862,7 +3816,136 @@ msgid "" msgstr "" "Kho chứa đã hoà n tất việc cáºp nháºt, nhÆ°ng không thể ghi và o\n" "táºp tin new_index (bảng mục lục má»›i). Hãy kiểm tra xem Ä‘Ä©a có bị đầy quá\n" -"hay quota (hạn nghạch Ä‘Ä©a cứng) bị vượt quá, và sau đó \"git reset HEAD\" để khắc phục." +"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 @@ -2877,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 @@ -2887,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 @@ -2910,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 @@ -2919,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 @@ -2936,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" @@ -2948,45 +4075,167 @@ msgstr "Không tìm thấy các tên, không thể mô tả gì cả." msgid "--dirty is incompatible with committishes" msgstr "--dirty là xung khắc vá»›i các tùy chá»n dà nh cho chuyển giao (commit)" -#: builtin/diff.c:77 +#: 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:220 +#: builtin/diff.c:224 #, c-format msgid "invalid option: %s" msgstr "tùy chá»n sai: %s" -#: builtin/diff.c:297 +#: builtin/diff.c:301 msgid "Not a git repository" msgstr "Không phải là kho git" -#: builtin/diff.c:341 +#: 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:346 +#: 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:356 +#: 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:364 +#: 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:200 +#: 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: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" @@ -2998,10 +4247,9 @@ msgstr "[đã cáºp nháºt]" #: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" -msgstr "! %-*s %-*s -> %s (không thể fetch (lấy vá») trong nhánh hiện hà nh)" +msgstr "! %-*s %-*s -> %s (không thể fetch (lấy) vá» nhánh hiện hà nh)" -#: builtin/fetch.c:274 -#: builtin/fetch.c:360 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "[Bị từ chối]" @@ -3009,9 +4257,7 @@ msgstr "[Bị từ chối]" msgid "[tag update]" msgstr "[cáºp nháºt thẻ]" -#: builtin/fetch.c:287 -#: builtin/fetch.c:322 -#: builtin/fetch.c:340 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr " (không thể cáºp nháºt tham chiếu (ref) ná»™i bá»™)" @@ -3039,8 +4285,7 @@ msgstr "cưỡng bức cáºp nháºt" msgid "(non-fast-forward)" msgstr "(non-fast-forward)" -#: builtin/fetch.c:393 -#: builtin/fetch.c:685 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "không thể mở %s: %s\n" @@ -3062,31 +4307,32 @@ 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 msgid " (%s will become dangling)" -msgstr " (%s sẽ trở thà nh lủng lẳng (không được quản lý))" +msgstr " (%s sẽ trở thà nh không đầu (không được quản lý))" #: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)" -msgstr " (%s phải trở thà nh lủng lẳng (không được quản lý))" +msgstr " (%s đã trở thà nh không đầu (không được quản lý))" #: builtin/fetch.c:557 msgid "[deleted]" msgstr "[đã xóa]" -#: builtin/fetch.c:558 -#: builtin/remote.c:1055 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "(không)" #: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" -msgstr "Từ chối việc lấy (fetch) và o trong nhánh hiện tại %s của má»™t kho chứa không phải kho trần (bare)" +msgstr "" +"Từ chối việc lấy (fetch) và o trong nhánh hiện tại %s của má»™t kho chứa không " +"phải kho trần (bare)" #: builtin/fetch.c:709 #, c-format @@ -3103,18 +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." @@ -3122,119 +4367,479 @@ 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á» sá» dụng tùy chá»n --all sẽ không lấy đối số kho chứa" +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 sá» dụng tùy chá»n --all không hợp lý vá»›i 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" "run \"git gc\" manually. See \"git help gc\" for more information.\n" msgstr "" "Tá»± Ä‘á»™ng đóng gói kho chứa để tối Æ°u hóa hiệu suất là m việc.\n" -"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" +"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 -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' để xóa bá» chúng Ä‘i." +#: 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' " +"để 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:402 +#: 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:478 -#: builtin/grep.c:512 +#: 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:526 +#: 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:584 +#: 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:601 +#: 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:885 +#: builtin/grep.c:781 +msgid "highlight matches" +msgstr "tô sáng cái khá»›p" + +#: 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:899 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "đối tượng sai %s" -#: builtin/grep.c:940 +#: 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:963 +#: 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:968 +#: 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." +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:971 +#: 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:979 +#: 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." @@ -3247,15 +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 +#: 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 @@ -3263,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 @@ -3272,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 @@ -3282,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" @@ -3292,8 +4894,7 @@ msgstr "không có trình xem trợ giúp dạng manpage tiếp hợp vá»›i yêu msgid "no info viewer handled the request" msgstr "không có trình xem trợ giúp dạng info tiếp hợp vá»›i yêu cầu" -#: builtin/help.c:447 -#: builtin/help.c:454 +#: builtin/help.c:447 builtin/help.c:454 #, c-format msgid "usage: %s%s" msgstr "cách sá» dụng: %s%s" @@ -3338,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" @@ -3387,17 +4993,13 @@ msgstr[1] "táºp tin pack bị kết thúc sá»›m, %lu byte bị thiếu" msgid "serious inflate inconsistency" msgstr "sá»± mâu thuẫn xả nén nghiêm trá»ng" -#: builtin/index-pack.c:649 -#: builtin/index-pack.c:655 -#: builtin/index-pack.c:678 -#: builtin/index-pack.c:712 -#: builtin/index-pack.c:721 +#: builtin/index-pack.c:649 builtin/index-pack.c:655 builtin/index-pack.c:678 +#: builtin/index-pack.c:712 builtin/index-pack.c:721 #, c-format msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "Sá»° VA CHẠM SHA1 Äà XẢY RA VỚI %s!" -#: builtin/index-pack.c:652 -#: builtin/pack-objects.c:170 +#: builtin/index-pack.c:652 builtin/pack-objects.c:170 #: builtin/pack-objects.c:262 #, c-format msgid "unable to read %s" @@ -3427,8 +5029,7 @@ msgstr "Lá»—i trong đối tượng" msgid "Not all child objects of %s are reachable" msgstr "Không phải tất cả các đối tượng con của %s là có thể vá»›i tá»›i được" -#: builtin/index-pack.c:821 -#: builtin/index-pack.c:847 +#: builtin/index-pack.c:821 builtin/index-pack.c:847 msgid "failed to apply delta" msgstr "gặp lá»—i khi áp dụng delta" @@ -3460,96 +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" @@ -3566,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 @@ -3591,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 @@ -3616,23 +5244,22 @@ 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 msgid "insane git directory %s" msgstr "thÆ° mục git Ä‘iên rồ %s" -#: builtin/init-db.c:323 -#: builtin/init-db.c:326 +#: builtin/init-db.c:323 builtin/init-db.c:326 #, c-format msgid "%s already exists" -msgstr "%s đã tồn tại rồi" +msgstr "%s đã có từ trÆ°á»›c rồi" #: builtin/init-db.c:355 #, c-format msgid "unable to handle file type %d" -msgstr "không thể handle tệp tin kiểu %d" +msgstr "không thể nắm (handle) táºp tin kiểu %d" #: builtin/init-db.c:358 #, c-format @@ -3642,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 @@ -3670,8 +5297,27 @@ msgstr " đã chia sẻ" msgid "cannot tell cwd" msgstr "không nói chuyện được vá»›i lệnh cwd" -#: builtin/init-db.c:522 -#: builtin/init-db.c:529 +#: 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" msgstr "không thể mkdir (tạo thÆ° mục): %s" @@ -3683,8 +5329,12 @@ msgstr "không thể chdir (chuyển đổi thÆ° mục) sang %s" #: builtin/init-db.c:555 #, c-format -msgid "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-dir=<directory>)" -msgstr "%s (hoặc --work-tree=<thÆ°-mục>) không cho phép không chỉ định %s (hoặc --git-dir=<thÆ°-mục>)" +msgid "" +"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" +"dir=<directory>)" +msgstr "" +"%s (hoặc --work-tree=<thÆ°-mục>) không cho phép không chỉ định %s (hoặc --git-" +"dir=<thÆ°-mục>)" #: builtin/init-db.c:579 msgid "Cannot access current working directory" @@ -3693,15 +5343,34 @@ 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 msgid "Final output: %d %s\n" msgstr "Kết xuất cuối cùng: %d %s\n" -#: builtin/log.c:403 -#: builtin/log.c:494 +#: builtin/log.c:403 builtin/log.c:494 #, c-format msgid "Could not read object %s" msgstr "Không thể Ä‘á»c đối tượng %s" @@ -3732,69 +5401,337 @@ msgstr "Cần chÃnh xác má»™t vùng." msgid "Not a range." msgstr "Không phải là má»™t vùng." -#: builtin/log.c:792 +#: builtin/log.c:789 msgid "Cover letter needs email format" msgstr "'Cover letter' cần cho định dạng thÆ°" -#: builtin/log.c:865 +#: builtin/log.c:862 #, c-format msgid "insane in-reply-to: %s" msgstr "in-reply-to Ä‘iên rồ: %s" -#: builtin/log.c:938 +#: 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:1160 +#: 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" msgstr "thông tin ngÆ°á»i chuyển giao không có thá»±c %s" -#: builtin/log.c:1205 +#: builtin/log.c:1202 msgid "-n and -k are mutually exclusive." msgstr "-n và -k loại từ lẫn nhau." -#: builtin/log.c:1207 +#: builtin/log.c:1204 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix và -k xung khắc nhau." -#: builtin/log.c:1215 +#: builtin/log.c:1212 msgid "--name-only does not make sense" msgstr "--name-only không hợp lý" -#: builtin/log.c:1217 +#: builtin/log.c:1214 msgid "--name-status does not make sense" msgstr "--name-status không hợp lý" -#: builtin/log.c:1219 +#: builtin/log.c:1216 msgid "--check does not make sense" msgstr "--check không hợp lý" -#: builtin/log.c:1242 +#: builtin/log.c:1239 msgid "standard output, or directory, which one?" msgstr "đầu ra chuẩn, hay thÆ° mục, chá»n cái nà o?" -#: builtin/log.c:1244 +#: 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:1397 +#: 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:1501 +#: 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 thủ công.\n" +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 <thượng-nguồn> má»™t cách " +"thủ công.\n" -#: builtin/log.c:1517 -#: builtin/log.c:1519 -#: builtin/log.c:1531 +#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 #, c-format 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ị" @@ -3802,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 @@ -3814,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." @@ -3827,14 +5825,13 @@ msgstr "stash gặp lá»—i" msgid "not a valid object: %s" msgstr "không phải là má»™t đối tượng hợp lệ: %s" -#: builtin/merge.c:269 -#: builtin/merge.c:286 +#: builtin/merge.c:269 builtin/merge.c:286 msgid "read-tree failed" msgstr "read-tree gặp lá»—i" #: builtin/merge.c:316 msgid " (nothing to squash)" -msgstr " (không có ghì để squash)" +msgstr " (không có gì để squash)" #: builtin/merge.c:329 #, c-format @@ -3854,49 +5851,51 @@ msgstr "Hoà n thà nh SQUASH_MSG" msgid "No merge message -- not updating HEAD\n" msgstr "Không thông Ä‘iệp hòa trá»™n -- không cáºp nháºt HEAD\n" -#: builtin/merge.c:437 +#: 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:536 +#: builtin/merge.c:535 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Chuá»—i branch.%s.mergeoptions sai: %s" -#: builtin/merge.c:629 +#: builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "lệnh git write-tree gặp lá»—i khi ghi má»™t cây" -#: builtin/merge.c:679 +#: builtin/merge.c:678 msgid "failed to read the cache" msgstr "gặp lá»—i khi Ä‘á»c bá»™ nhá»› tạm" -#: builtin/merge.c:710 +#: builtin/merge.c:709 msgid "Not handling anything other than two heads merge." msgstr "Không cầm nắm gì ngoà i hai head hòa trá»™n" -#: builtin/merge.c:724 +#: builtin/merge.c:723 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Không hiểu tùy chá»n cho merge-recursive: -X%s" -#: builtin/merge.c:738 +#: builtin/merge.c:737 #, c-format msgid "unable to write %s" -msgstr "không ghi được %s" +msgstr "không thể ghi %s" -#: builtin/merge.c:877 +#: 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:886 +#: 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' để hoà n tất việc hòa trá»™n.\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' để " +"hoà n tất việc hòa trá»™n.\n" -#: builtin/merge.c:892 +#: builtin/merge.c:891 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -3904,60 +5903,64 @@ msgid "" "Lines starting with '#' will be ignored, and an empty message aborts\n" "the commit.\n" 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 topic.\n" +"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 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 rá»—ng\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 " +"rá»—ng\n" "sẽ là m hủy bá» lần chuyển giao (commit).\n" -#: builtin/merge.c:916 +#: builtin/merge.c:915 msgid "Empty commit message." msgstr "Chú thÃch của lần commit (chuyển giao) bị trống rá»—ng." -#: builtin/merge.c:928 +#: builtin/merge.c:927 #, c-format msgid "Wonderful.\n" msgstr "Thần kỳ.\n" -#: builtin/merge.c:993 +#: builtin/merge.c:992 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" -msgstr "Việc tá»± Ä‘á»™ng hòa trá»™n gặp lá»—i; hãy sá»a các xung Ä‘á»™t sau đó chuyển giao (commit) kết quả.\n" +msgstr "" +"Việc tá»± Ä‘á»™ng hòa trá»™n gặp lá»—i; hãy sá»a các xung Ä‘á»™t sau đó chuyển giao " +"(commit) kết quả.\n" -#: builtin/merge.c:1009 +#: builtin/merge.c:1008 #, c-format msgid "'%s' is not a commit" msgstr "%s không phải là má»™t lần commit (chuyển giao)" -#: builtin/merge.c:1050 +#: builtin/merge.c:1049 msgid "No current branch." msgstr "không phải nhánh hiện hà nh" -#: builtin/merge.c:1052 +#: builtin/merge.c:1051 msgid "No remote for the current branch." msgstr "Không có máy chủ cho nhánh hiện hà nh." -#: builtin/merge.c:1054 +#: 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:1059 +#: builtin/merge.c:1058 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "Không nhánh mạng theo vết cho %s từ %s" -#: builtin/merge.c:1146 -#: builtin/merge.c:1303 +#: builtin/merge.c:1145 builtin/merge.c:1302 #, c-format msgid "%s - not something we can merge" msgstr "%s - không phải là má»™t số thứ chúng tôi có thể hòa trá»™n" -#: builtin/merge.c:1214 +#: builtin/merge.c:1213 msgid "There is no merge to abort (MERGE_HEAD missing)." -msgstr "Ở đây không có lần hòa trá»™n nà o được hủy bá» giữa chừng cả (không thấy MERGE_HEAD)." +msgstr "" +"Ở đây không có lần hòa trá»™n nà o được hủy bá» giữa chừng cả (thiếu MERGE_HEAD)." -#: builtin/merge.c:1230 -#: git-pull.sh:31 +#: builtin/merge.c:1229 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3965,12 +5968,11 @@ msgstr "" "Bạn chÆ°a kết thúc việc hòa trá»™ng (MERGE_HEAD vẫn tồn tại).\n" "Hãy chuyển giao (commit) các thay đổi trÆ°á»›c khi bạn có thể hòa trá»™n." -#: builtin/merge.c:1233 -#: git-pull.sh:34 +#: builtin/merge.c:1232 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Bạn chÆ°a kết thúc việc hòa trá»™ng (MERGE_HEAD vẫn tồn tại)." -#: builtin/merge.c:1237 +#: builtin/merge.c:1236 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3978,88 +5980,195 @@ msgstr "" "Bạn chÆ°a kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n" "Hãy chuyển giao (commit) các thay đổi trÆ°á»›c khi bạn có thể hòa trá»™n." -#: builtin/merge.c:1240 +#: builtin/merge.c:1239 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "Bạn chÆ°a kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)." -#: builtin/merge.c:1249 +#: builtin/merge.c:1248 msgid "You cannot combine --squash with --no-ff." -msgstr "Bạn không thể tổ hợp --squash vá»›i --no-ff." +msgstr "Bạn không thể kết hợp --squash vá»›i --no-ff." -#: builtin/merge.c:1254 +#: builtin/merge.c:1253 msgid "You cannot combine --no-ff with --ff-only." -msgstr "Bạn không thể tổ hợp --no-ff vá»›i --ff-only." +msgstr "Bạn không thể kết hợp --no-ff vá»›i --ff-only." -#: builtin/merge.c:1261 +#: builtin/merge.c:1260 msgid "No commit specified and merge.defaultToUpstream not set." -msgstr "Không chỉ ra lần chuyển giao (commit) và merge.defaultToUpstream chÆ°a được đặt." +msgstr "" +"Không chỉ ra lần chuyển giao (commit) và merge.defaultToUpstream chÆ°a được " +"đặt." -#: builtin/merge.c:1293 +#: builtin/merge.c:1292 msgid "Can merge only exactly one commit into empty head" -msgstr "Không thể hòa trá»™n má»™t cách đúng đắn má»™t lần chuyển giao (commit) và o má»™t head rá»—ng" +msgstr "" +"Không thể hòa trá»™n má»™t cách đúng đắn má»™t lần chuyển giao (commit) và o má»™t " +"head rá»—ng" -#: builtin/merge.c:1296 +#: builtin/merge.c:1295 msgid "Squash commit into empty head not supported yet" msgstr "Squash commit và o má»™t head trống rá»—ng vẫn chÆ°a được há»— trợ" -#: builtin/merge.c:1298 +#: builtin/merge.c:1297 msgid "Non-fast-forward commit does not make sense into an empty head" -msgstr "Chuyển giao (commit) không-fast-forward không hợp lý ở trong má»™t head trống rá»—ng" +msgstr "" +"Chuyển giao (commit) không-fast-forward không hợp lý ở trong má»™t head trống " +"rá»—ng" -#: builtin/merge.c:1413 +#: builtin/merge.c:1412 #, c-format msgid "Updating %s..%s\n" msgstr "Äang cáºp nháºt %s..%s\n" -#: builtin/merge.c:1451 +#: builtin/merge.c:1450 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Äang thá» hòa trá»™n kiểu 'trivial in-index'...\n" -#: builtin/merge.c:1458 +#: builtin/merge.c:1457 #, c-format msgid "Nope.\n" msgstr "Không.\n" -#: builtin/merge.c:1490 +#: builtin/merge.c:1489 msgid "Not possible to fast-forward, aborting." msgstr "Thá»±c hiện lệnh fast-forward là không thể được, Ä‘ang bá» qua." -#: builtin/merge.c:1513 -#: builtin/merge.c:1592 +#: builtin/merge.c:1512 builtin/merge.c:1591 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Äang tua lại cây thà nh thá»i xa xÆ°a...\n" -#: builtin/merge.c:1517 +#: builtin/merge.c:1516 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Äang thá» chiến lược hòa trá»™n %s...\n" -#: builtin/merge.c:1583 +#: builtin/merge.c:1582 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Không có chiến lược hòa trá»™n nà o được nắm giữ (handle) sá»± hòa trá»™n.\n" -#: builtin/merge.c:1585 +#: builtin/merge.c:1584 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Hòa trá»™n vá»›i chiến lược %s gặp lá»—i.\n" -#: builtin/merge.c:1594 +#: builtin/merge.c:1593 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Sá» dụng %s để chuẩn bị giải quyết bằng tay.\n" -#: builtin/merge.c:1606 +#: builtin/merge.c:1605 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" -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" +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" @@ -4093,11 +6202,11 @@ 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" -msgstr "Không thể ghi chèn" +msgstr "Không thể ghi đè" #: builtin/mv.c:187 msgid "multiple sources for the same target" @@ -4111,185 +6220,417 @@ msgstr "%s, nguồn=%s, Ä‘Ãch=%s" #: builtin/mv.c:212 #, c-format msgid "Renaming %s to %s\n" -msgstr "Äang thay đổi tên %s thà nh %s\n" +msgstr "Äổi tên %s thà nh %s\n" -#: builtin/mv.c:215 -#: builtin/remote.c:731 +#: builtin/mv.c:215 builtin/remote.c:731 #, c-format 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" +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'" - -#: 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 +msgstr "không thể mở để Ä‘á»c hay ghi `%s'" + +#: 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ú" +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'" - -#: 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 +msgstr "Gặp lá»—i khi sao chép ghi chú (note) từ `%s' tá»›i `%s'" + +#: 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 ghi chú được tìm thấy cho đối tượng %s." +msgstr "không tìm thấy ghi chú cho đối tượng %s." + +#: 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:580 +#: 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 existing notes" -msgstr "Không thể thêm các ghi chú. Äã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sá» dụng tùy chá»n '-f' để ghi đè lên các ghi chú cÅ©" +msgid "" +"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +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 existing notes" -msgstr "Không thể sao chép các ghi chú. Äã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sá» dụng tùy chá»n '-f' để ghi đè lên các ghi chú cÅ©" +msgid "" +"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +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: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:971 +#: 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:183 -#: builtin/pack-objects.c:186 +#: 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)" msgstr "lá»—i giải nén (%d)" @@ -4302,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 @@ -4312,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>" @@ -4328,7 +6826,8 @@ 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 config'." +"Äể 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 #, c-format @@ -4344,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" @@ -4378,15 +6877,16 @@ 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 (upstream), sá» dụng\n" +"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" #: 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 @@ -4395,15 +6895,52 @@ 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 (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" +"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" "để cáºp nháºt nhánh máy chủ nà o." -#: builtin/push.c:174 -msgid "You didn't specify any refspecs to push, and push.default is \"nothing\"." -msgstr "Bạn đã không chỉ ra má»™t refspecs nà o để push, và push.default là \"không là gì cả\"." +#: builtin/push.c:151 +msgid "" +"push.default is unset; its implicit value is changing in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the current behavior after the default changes, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" +"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" +"Äể 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" +"(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Å©)" + +#: builtin/push.c:199 +msgid "" +"You didn't specify any refspecs to push, and push.default is \"nothing\"." +msgstr "" +"Bạn đã không chỉ ra má»™t refspecs nà o để push, và push.default là \"không là " +"gì cả\"." -#: builtin/push.c:181 +#: builtin/push.c:206 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -4411,23 +6948,28 @@ 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 pull')\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 " +"pull')\n" "trÆ°á»›c khi lại push lần nữa.\n" -"Xem trong phần 'Note about fast-forwards' trong ná»™i dung từ lệnh 'git push --help'." +"Xem trong phần 'Note about fast-forwards' từ lệnh `git push --help' để có " +"thông tin chi tiết." -#: builtin/push.c:187 +#: builtin/push.c:212 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" -"specify branches to push or set the 'push.default' configuration\n" -"variable to 'current' or 'upstream' to push only the current branch." +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." 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ủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ muốn\n" -"chỉ định các nhánh để push hoặt là đặt ná»™i dung cho biến cấu hình 'push.default'\n" -"thà nh 'current' hoặc 'upstream' để push chỉ nhánh hiện hà nh mà thôi." - -#: builtin/push.c:193 +"pháºn tÆ°Æ¡ng ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ " +"muốn\n" +"chỉ định các nhánh để push hoặt là đặt ná»™i dung cho biến cấu hình 'push." +"default'\n" +"thà nh 'simple', 'current' hoặc 'upstream' để chỉ push nhánh hiện hà nh mà " +"thôi." + +#: builtin/push.c:218 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -4435,29 +6977,32 @@ 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ủ. 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' trong ná»™i dung từ lệnh 'git push --help'." +"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ó " +"thông tin chi tiết." -#: builtin/push.c:233 +#: builtin/push.c:258 #, c-format msgid "Pushing to %s\n" msgstr "Äang push (đẩy) lên %s\n" -#: builtin/push.c:237 +#: 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:269 +#: builtin/push.c:294 #, c-format msgid "bad repository '%s'" -msgstr "repository (kho) sai '%s'" +msgstr "repository (kho) sai `%s'" -#: builtin/push.c:270 +#: builtin/push.c:295 msgid "" "No configured push destination.\n" -"Either specify the URL from the command-line or configure a remote repository using\n" +"Either specify the URL from the command-line or configure a remote " +"repository using\n" "\n" " git remote add <name> <url>\n" "\n" @@ -4474,34 +7019,241 @@ msgstr "" "\n" " git push <tên>\n" -#: builtin/push.c:285 +#: builtin/push.c:310 msgid "--all and --tags are incompatible" msgstr "--all và --tags xung khắc nhau" -#: builtin/push.c:286 +#: builtin/push.c:311 msgid "--all can't be combined with refspecs" msgstr "--all không thể được tổ hợp cùng vá»›i refspecs" -#: builtin/push.c:291 +#: builtin/push.c:316 msgid "--mirror and --tags are incompatible" msgstr "--mirror và --tags xung khắc nhau" -#: builtin/push.c:292 +#: builtin/push.c:317 msgid "--mirror can't be combined with refspecs" msgstr "--mirror không thể được tổ hợp cùng vá»›i refspecs" -#: builtin/push.c:297 +#: builtin/push.c:322 msgid "--all and --mirror are incompatible" msgstr "--all và --mirror xung khắc nhau" -#: builtin/push.c:385 +#: 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" -#: builtin/push.c:387 +#: builtin/push.c:412 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" @@ -4520,30 +7272,57 @@ 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 phân biệt HOA/thÆ°á»ng vá»›i tùy chá»n --mirror" +msgstr "Ä‘ang chỉ định má»™t nhánh master không hợp lý vá»›i tùy chá»n --mirror" #: builtin/remote.c:187 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "chỉ định những nhánh để theo vết chỉ hợp lý vá»›i các 'fetch mirror'" -#: builtin/remote.c:195 -#: builtin/remote.c:646 +#: builtin/remote.c:195 builtin/remote.c:646 #, c-format msgid "remote %s already exists." msgstr "máy chủ %s đã tồn tại rồi." -#: builtin/remote.c:199 -#: builtin/remote.c:650 +#: 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 @@ -4555,8 +7334,7 @@ msgstr "nhiá»u hÆ¡n má»™t %s" msgid "Could not get fetch map for refspec %s" msgstr "Không thể lấy ánh xạ (map) fetch cho refspec %s" -#: builtin/remote.c:440 -#: builtin/remote.c:448 +#: builtin/remote.c:440 builtin/remote.c:448 msgid "(matching)" msgstr "(mẫu)" @@ -4564,16 +7342,12 @@ msgstr "(mẫu)" msgid "(delete)" msgstr "(xoá)" -#: builtin/remote.c:595 -#: builtin/remote.c:601 -#: builtin/remote.c:607 +#: 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 +#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 #, c-format msgid "No such remote: %s" msgstr "Không có máy chủ nà o nhÆ° thế: %s" @@ -4581,13 +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 +#: 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 @@ -4603,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 @@ -4623,7 +7396,7 @@ msgstr "tạo %s gặp lá»—i" #: builtin/remote.c:764 #, c-format msgid "Could not remove branch %s" -msgstr "Không thể gỡ nhánh %s" +msgstr "Không thể gỡ bá» nhánh %s" #: builtin/remote.c:834 msgid "" @@ -4636,7 +7409,8 @@ msgstr[0] "" "Chú ý: Má»™t nhánh nằm ngoà i hệ thống refs/remotes/ đã không được gỡ bá» Ä‘i;\n" "để xóa Ä‘i, sá» dụng:" msgstr[1] "" -"Chú ý: Má»™t số nhánh nằm ngoà i hệ thống refs/remotes/ đã không được gỡ bá» Ä‘i;\n" +"Chú ý: Má»™t số nhánh nằm ngoà i hệ thống refs/remotes/ đã không được gỡ bá» " +"Ä‘i;\n" "để xóa Ä‘i, sá» dụng:" #: builtin/remote.c:943 @@ -4646,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Å© (sá» dụng 'git remote prune' để gỡ bá»)" +msgstr " cÅ© (dùng `git remote prune' để gỡ bá»)" #: builtin/remote.c:950 msgid " ???" @@ -4678,7 +7452,7 @@ msgstr " và vá»›i máy chủ" #: builtin/remote.c:1004 #, c-format msgid "merges with remote %s" -msgstr "hòa trá»™n vá»›i máy chủ %s" +msgstr "hòa trá»™n vá»›i máy chủ %s" #: builtin/remote.c:1005 msgid " and with remote" @@ -4724,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" @@ -4734,28 +7512,25 @@ msgstr "* máy chủ %s" msgid " Fetch URL: %s" msgstr " URL để lấy vá» (fetch): %s" -#: builtin/remote.c:1120 -#: builtin/remote.c:1285 +#: builtin/remote.c:1120 builtin/remote.c:1285 msgid "(no URL)" -msgstr "(không có URL nà o)" +msgstr "(không có URL)" -#: builtin/remote.c:1129 -#: builtin/remote.c:1131 +#: builtin/remote.c:1129 builtin/remote.c:1131 #, c-format msgid " Push URL: %s" -msgstr " URL để đẩy lên (push) : %s" +msgstr " URL để đẩy lên (push): %s" -#: builtin/remote.c:1133 -#: builtin/remote.c:1135 -#: builtin/remote.c:1137 +#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 #, c-format msgid " HEAD branch: %s" msgstr " Nhánh HEAD: %s" #: builtin/remote.c:1139 #, c-format -msgid " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" -msgstr " nhánh HEAD (HEAD máy chủ là không rõ rà ng, có lẽ là má»™t trong số sau):\n" +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr " nhánh HEAD (HEAD máy chủ chÆ°a rõ rà ng, có lẽ là má»™t trong số sau):\n" #: builtin/remote.c:1151 #, c-format @@ -4764,27 +7539,34 @@ msgid_plural " Remote branches:%s" msgstr[0] " Nhánh trên máy chủ:%s" msgstr[1] " Những nhánh trên máy chủ:%s" -#: builtin/remote.c:1154 -#: builtin/remote.c:1181 +#: builtin/remote.c:1154 builtin/remote.c:1181 msgid " (status not queried)" 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" @@ -4812,12 +7594,12 @@ msgstr "Không thể cà i đặt %s" #: builtin/remote.c:1274 #, c-format msgid " %s will become dangling!" -msgstr " %s sẽ trở thà nh lủng lẳng (không được quản lý)!" +msgstr " %s sẽ trở thà nh không đầu (không được quản lý)!" #: builtin/remote.c:1275 #, c-format msgid " %s has become dangling!" -msgstr " %s phải trở thà nh lủng lẳng (không được quản lý)!" +msgstr " %s đã trở thà nh không đầu (không được quản lý)!" #: builtin/remote.c:1281 #, c-format @@ -4839,16 +7621,35 @@ msgstr " * [nên xén bá»›t] %s" msgid " * [pruned] %s" msgstr " *[đã xén bá»›] %s" -#: builtin/remote.c:1387 -#: builtin/remote.c:1461 +#: 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ý" @@ -4867,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" @@ -4922,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}" @@ -4933,7 +7804,9 @@ 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 reset -- <Ä‘Æ°á»ng_dẫn>'." +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 " +"reset -- <Ä‘Æ°á»ng_dẫn>'." #: builtin/reset.c:319 #, c-format @@ -4948,34 +7821,135 @@ 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/revert.c:70 -#: builtin/revert.c:92 +#: 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á» dụng -f để ép buá»™c gỡ bá»)" +"`%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 #, c-format @@ -4983,8 +7957,8 @@ 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á» dụng --cached để giữ táºp tin, hoặc -f để ép buá»™c gỡ bá»)" +"`%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 #, c-format @@ -4992,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á» dụng --cached để giữ táºp tin, hoặc -f để ép buá»™c gỡ bá»)" +"`%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 @@ -5023,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 "" @@ -5054,13 +8244,15 @@ msgid "" "\n" "#\n" "# Write a tag message\n" -"# Lines starting with '#' will be kept; you may remove them yourself if you want to.\n" +"# Lines starting with '#' will be kept; you may remove them yourself if you " +"want to.\n" "#\n" msgstr "" "\n" "#\n" "# Viết các ghi chú cho (thẻ) tag\n" -"# Những dòng được bắt đầu bằng '#' sẽ được bá» qua; bạn có thể xóa chúng Ä‘i nếu muốn.\n" +"# Những dòng được bắt đầu bằng '#' sẽ được bá» qua; bạn có thể xóa chúng Ä‘i " +"nếu muốn.\n" "#\n" #: builtin/tag.c:298 @@ -5095,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" @@ -5124,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 @@ -5144,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." -msgstr "Chạy lệnh 'git help <tên-lệnh>' để có thêm thông tin vá» lệnh được chỉ ra." +#: builtin/update-index.c:401 +msgid "git update-index [options] [--] [<file>...]" +msgstr "git update-index [các-tùy-chá»n] [<táºp-tin>...]" -#: parse-options.h:133 -#: parse-options.h:235 -msgid "n" -msgstr "n" +#: 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" -#: parse-options.h:141 -msgid "time" -msgstr "thá»i-gian" +#: builtin/update-index.c:720 +msgid "refresh: ignore submodules" +msgstr "refresh: lá» Ä‘i mô-Ä‘un-con" -#: parse-options.h:149 -msgid "file" -msgstr "táºp-tin" +#: 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" -#: parse-options.h:151 -msgid "when" -msgstr "khi" +#: 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 "" +"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" + +#: builtin/update-index.c:732 +msgid "refresh stat information" +msgstr "lấy lại thông tin thống kê" + +#: 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'" + +#: builtin/update-index.c:740 +msgid "<mode> <object> <path>" +msgstr "<mode> <đối tượng> <Ä‘Æ°á»ng dẫn>" + +#: 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)" @@ -5209,7 +8617,9 @@ msgstr "Ghi các thay đổi và o kho chứa" #: common-cmds.h:14 msgid "Show changes between commits, commit and working tree, etc" -msgstr "Hiển thị các thay đổi giữa những lần chuyển giao (commit), commit và cây là m việc, v.v.." +msgstr "" +"Hiển thị các thay đổi giữa những lần chuyển giao (commit), commit và cây là m " +"việc, v.v.." #: common-cmds.h:15 msgid "Download objects and refs from another repository" @@ -5221,7 +8631,8 @@ msgstr "In ra những dòng khá»›p vá»›i má»™t mẫu" #: common-cmds.h:17 msgid "Create an empty git repository or reinitialize an existing one" -msgstr "Tạo má»™t kho git trống rá»—ng hay khởi tạo lại má»™t kho đã tồn tại từ trÆ°á»›c" +msgstr "" +"Tạo má»™t kho git trống rá»—ng hay khởi tạo lại má»™t kho đã tồn tại từ trÆ°á»›c" #: common-cmds.h:18 msgid "Show commit logs" @@ -5229,7 +8640,9 @@ msgstr "hiển thị nháºt ký các lần commit (chuyển giao)" #: common-cmds.h:19 msgid "Join two or more development histories together" -msgstr "Hợp nhất hai hay nhiá»u hÆ¡n lịch sá» của các nhà phát triển phần má»m lại vá»›i nhau" +msgstr "" +"Hợp nhất hai hay nhiá»u hÆ¡n lịch sá» của các nhà phát triển phần má»m lại vá»›i " +"nhau" #: common-cmds.h:20 msgid "Move or rename a file, a directory, or a symlink" @@ -5241,11 +8654,13 @@ msgstr "Fetch (lấy vá») và hòa trá»™ng vá»›i kho khác hay nhánh ná»™i bá» #: common-cmds.h:22 msgid "Update remote refs along with associated objects" -msgstr "Cáºp nháºt tham chiếu (refs) máy chủ cùng vá»›i các đối tượng liên quan đến nó" +msgstr "" +"Cáºp nháºt tham chiếu (refs) máy chủ cùng vá»›i các đối tượng liên quan đến nó" #: 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" +msgstr "" +"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" @@ -5265,7 +8680,9 @@ msgstr "Hiển thị trạng thái cây là m việc" #: common-cmds.h:28 msgid "Create, list, delete or verify a tag object signed with GPG" -msgstr "Tạo, liệt kê, xóa hay xác thá»±c má»™t đối tượng thẻ (tag) mà nó được ký sá» dụng GPG" +msgstr "" +"Tạo, liệt kê, xóa hay xác thá»±c má»™t đối tượng thẻ (tag) mà nó được ký sá» dụng " +"GPG" #: git-am.sh:50 msgid "You need to set your committer info first" @@ -5287,8 +8704,10 @@ msgid "" "To restore the original branch and stop patching, run \"$cmdline --abort\"." msgstr "" "Khi bạn cần giải quyết vấn Ä‘á» nà y hãy chạy lệnh \"$cmdline --resolved\".\n" -"Nếu bạn có ý định bá» qua miếng vá, thay và o đó bạn chạy \"$cmdline --skip\".\n" -"Äể 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 \"$cmdline --abort\"." +"Nếu bạn có ý định bá» qua miếng vá, thay và o đó bạn chạy \"$cmdline --skip" +"\".\n" +"Äể 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 " +"\"$cmdline --abort\"." #: git-am.sh:121 msgid "Cannot fall back to three-way merge." @@ -5300,7 +8719,8 @@ msgstr "Kho thiếu đối tượng blob cần thiết để trở vá» trên '3 #: git-am.sh:139 msgid "Using index info to reconstruct a base tree..." -msgstr "Sá» dụng thông tin trong bảng mục lục để cấu trúc lại má»™t cây (tree) cÆ¡ sở..." +msgstr "" +"Sá» dụng thông tin trong bảng mục lục để cấu trúc lại má»™t cây (tree) cÆ¡ sở..." #: git-am.sh:154 msgid "" @@ -5350,7 +8770,8 @@ msgstr "Xin hãy rõ rà ng. --skip hay --abort?" #: git-am.sh:509 msgid "Resolve operation not in progress, we are not resuming." -msgstr "Thao tác phân giải không Ä‘ang được tiến hà nh, chúng ta không phục hồi lại." +msgstr "" +"Thao tác phân giải không Ä‘ang được tiến hà nh, chúng ta không phục hồi lại." #: git-am.sh:575 #, sh-format @@ -5365,8 +8786,10 @@ msgid "" "To restore the original branch and stop patching run \"$cmdline --abort\"." msgstr "" "Miếng vá trống rá»—ng. Nó đã bị chia cắt sai phải không?\n" -"Nếu bạn thÃch bá» qua miếng vá nà y, hãy chạy lệnh sau để thay thế \"$cmdline --skip\".\n" -"Äể phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --abort\"." +"Nếu bạn thÃch bá» qua miếng vá nà y, hãy chạy lệnh sau để thay thế \"$cmdline " +"--skip\".\n" +"Äể phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --" +"abort\"." #: git-am.sh:706 msgid "Patch does not have a valid e-mail address." @@ -5374,7 +8797,8 @@ msgstr "Miếng vá không có địa chỉ e-mail hợp lệ." #: git-am.sh:753 msgid "cannot be interactive without stdin connected to a terminal." -msgstr "không thể được tÆ°Æ¡ng tác mà không có stdin kết nối vá»›i má»™t thiết bị cuối" +msgstr "" +"không thể được tÆ°Æ¡ng tác mà không có stdin kết nối vá»›i má»™t thiết bị cuối" #: git-am.sh:757 msgid "Commit Body is:" @@ -5385,7 +8809,9 @@ msgstr "Thân của lần chuyển giao (commit) là :" #. input at this point. #: git-am.sh:764 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " -msgstr "Ãp dụng? đồng ý [y]/không [n]/chỉnh sá»a [e]/hiển thị miếng [v]á/đồng ý tất cả [a]" +msgstr "" +"Ãp dụng? đồng ý [y]/không [n]/chỉnh sá»a [e]/hiển thị miếng [v]á/đồng ý tất " +"cả [a] " #: git-am.sh:800 #, sh-format @@ -5398,9 +8824,10 @@ 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." +"đã 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." #: git-am.sh:829 msgid "" @@ -5408,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." @@ -5419,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" @@ -5450,8 +8886,11 @@ msgstr "HEAD sai - Tôi cần má»™t HEAD" #: git-bisect.sh:130 #, sh-format -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 <nhánh_hợp_lệ>'." +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 " +"<nhánh_hợp_lệ>'." #: git-bisect.sh:140 msgid "won't bisect on seeked tree" @@ -5482,20 +8921,21 @@ 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. #: git-bisect.sh:273 msgid "Warning: bisecting only with a bad commit." -msgstr "Cảnh báo: chỉ thá»±c hiện việc bisect vá»›i má»™t lần chuyển giao (commit) sai." +msgstr "" +"Cảnh báo: chỉ thá»±c hiện việc bisect vá»›i má»™t lần chuyển giao (commit) sai." #. TRANSLATORS: Make sure to include [Y] and [n] in your #. translation. The program will only accept English input #. at this point. #: git-bisect.sh:279 msgid "Are you sure [Y/n]? " -msgstr "Bạn có chắc chắn chÆ°a [Y/n]?" +msgstr "Bạn có chắc chắn chÆ°a [Y/n]? " #: git-bisect.sh:289 msgid "" @@ -5512,11 +8952,11 @@ msgid "" "(You can use \"git bisect bad\" and \"git bisect good\" for that.)" msgstr "" "Bạn cần bắt đầu bằng lệnh \"git bisect start\".\n" -"Bạn sau đó cần phải chỉ cho tôi Ãt nhất má»™t Ä‘iểm xét duyệt đúng và má»™t Ä‘iểm sai.\n" +"Bạn sau đó cần phải chỉ cho tôi Ãt nhất má»™t Ä‘iểm xét duyệt đúng và má»™t Ä‘iểm " +"sai.\n" "(Bạn có thể sá» dụng \"git bisect bad\" và \"git bisect good\" cho chúng.)" -#: git-bisect.sh:347 -#: git-bisect.sh:474 +#: git-bisect.sh:347 git-bisect.sh:474 msgid "We are not bisecting." msgstr "Chúng tôi không bisect." @@ -5532,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" @@ -5585,16 +9025,20 @@ 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 commit -a'." +"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 msgid "Pull is not possible because you have unmerged files." -msgstr "Full là không thể thá»±c hiện bởi vì bạn có những táºp tin chÆ°a được hòa trá»™n." +msgstr "" +"Full là không thể thá»±c hiện bởi vì bạn có những táºp tin chÆ°a được hòa trá»™n." #: git-pull.sh:197 msgid "updating an unborn branch with changes added to the index" -msgstr "Ä‘ang cáºp nháºt má»™t nhánh chÆ°a được sinh ra vá»›i các thay đổi được thêm và o bảng mục lục" +msgstr "" +"Ä‘ang cáºp nháºt má»™t nhánh chÆ°a được sinh ra vá»›i các thay đổi được thêm và o " +"bảng mục lục" #. The fetch involved updating the current branch. #. The working tree and the index file is still based on the @@ -5619,37 +9063,48 @@ 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" -"To check out the original branch and stop rebasing, run \"git rebase --abort\"." +"To check out the original branch and stop rebasing, run \"git rebase --abort" +"\"." msgstr "" "Khi bạn cần giải quyết vấn Ä‘á» nà y hãy chạy lệnh \"git rebase --continue\".\n" -"Nếu bạn có ý định bá» qua miếng vá, thay và o đó bạn chạy \"git rebase --skip\".\n" -"Äể 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\"." +"Nếu bạn có ý định bá» qua miếng vá, thay và o đó bạn chạy \"git rebase --skip" +"\".\n" +"Äể 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." +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 phải Ä‘ang rebase?" +msgstr "Không có tiến trình rebase nà o phải không?" + +#: 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:313 +#: 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" @@ -5657,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" @@ -5685,64 +9140,65 @@ 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 " +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ó..." +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." #: git-stash.sh:51 msgid "git stash clear with parameters is unimplemented" -msgstr "git stash clear vá»›i các tham số là chÆ°a được thá»±c hiện (không nháºn đối số)" +msgstr "" +"git stash clear vá»›i các tham số là chÆ°a được thá»±c hiện (không nháºn đối số)" #: git-stash.sh:74 msgid "You do not have the initial commit yet" @@ -5752,8 +9208,7 @@ msgstr "Bạn chÆ°a còn có lần chuyển giao (commit) khởi tạo" msgid "Cannot save the current index state" msgstr "Không thể ghi lại trạng thái bảng mục lục hiện hà nh" -#: git-stash.sh:123 -#: git-stash.sh:136 +#: git-stash.sh:123 git-stash.sh:136 msgid "Cannot save the current worktree state" msgstr "Không thể ghi lại trạng thái cây-là m-việc hiện hà nh" @@ -5806,7 +9261,7 @@ msgstr "Không thể gỡ bá» các thay đổi cây-là m-việc" #: git-stash.sh:352 msgid "No stash found." -msgstr "Không tìm thấy stast nà o." +msgstr "Không tìm thấy stash nà o." #: git-stash.sh:359 #, sh-format @@ -5848,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\")" @@ -5875,98 +9330,105 @@ msgstr "(Äể phục hồi lại chúng hãy gõ \"git stash apply\")" msgid "cannot strip one component off url '$remoteurl'" msgstr "không thể tháo bá» má»™t thà nh phần ra khá»i url '$remoteurl'" -#: git-submodule.sh:145 +#: git-submodule.sh:167 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" -msgstr "Không tìm thấy ánh xạ (mapping) mô-Ä‘un-con trong .gitmodules cho Ä‘Æ°á»ng dẫn '$sm_path'" +msgstr "" +"Không tìm thấy ánh xạ (mapping) mô-Ä‘un-con trong .gitmodules cho Ä‘Æ°á»ng dẫn " +"'$sm_path'" -#: git-submodule.sh:189 +#: git-submodule.sh:211 #, sh-format msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "Nhân bản '$url' và o Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path' gặp lá»—i" -#: git-submodule.sh:201 +#: git-submodule.sh:223 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" -msgstr "Gitdir '$a' là bá»™ pháºn của Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$b' hoặc \"vice versa\"" +msgstr "" +"Gitdir '$a' là bá»™ pháºn của Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$b' hoặc \"vice versa\"" -#: git-submodule.sh:290 +#: git-submodule.sh:312 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" -msgstr "repo URL: '$repo' phải là đưá»ng dẫn tuyệt đối hoặc là bắt đầu bằng ./|../" +msgstr "" +"repo URL: '$repo' phải là đưá»ng dẫn tuyệt đối hoặc là bắt đầu bằng ./|../" -#: git-submodule.sh:307 +#: git-submodule.sh:329 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "'$sm_path' thá»±c sá»± đã tồn tại ở bảng mục lục rồi" -#: git-submodule.sh:311 +#: git-submodule.sh:333 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" "$sm_path\n" "Use -f if you really want to add it." 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" +"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" "$sm_path\n" "Sá» dụng -f nếu bạn thá»±c sá»± muốn thêm nó và o." -#: git-submodule.sh:322 +#: git-submodule.sh:344 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "Äang thêm repo có sẵn tại '$sm_path' và o bảng mục lục" -#: git-submodule.sh:324 +#: git-submodule.sh:346 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "'$sm_path' đã tồn tại từ trÆ°á»›c và không phải là má»™t kho git hợp lệ" -#: git-submodule.sh:338 +#: git-submodule.sh:360 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "Không thể checkout mô-Ä‘un con '$sm_path'" -#: git-submodule.sh:343 +#: git-submodule.sh:365 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "Gặp lá»—i khi thêm mô-Ä‘un con '$sm_path'" -#: git-submodule.sh:348 +#: git-submodule.sh:370 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "Gặp lá»—i khi đăng ký vá»›i hệ thống mô-Ä‘un con '$sm_path'" -#: git-submodule.sh:390 +#: git-submodule.sh:413 #, sh-format msgid "Entering '$prefix$sm_path'" msgstr "Äang nháºp '$prefix$sm_path'" -#: git-submodule.sh:404 +#: git-submodule.sh:427 #, sh-format msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "Dừng lại tại '$sm_path'; script trả vá» trạng thái khác không." -#: git-submodule.sh:447 +#: git-submodule.sh:471 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" -msgstr "Không tìm thấy url cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path' trong .gitmodules" +msgstr "" +"Không tìm thấy url cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path' trong .gitmodules" -#: git-submodule.sh:456 +#: git-submodule.sh:480 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "Gặp lá»—i khi đăng ký url cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:458 +#: git-submodule.sh:482 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "Mô-Ä‘un-con '$name' ($url) được đăng ký cho Ä‘Æ°á»ng dẫn '$sm_path'" -#: git-submodule.sh:466 +#: git-submodule.sh:490 #, sh-format msgid "Failed to register update mode for submodule path '$sm_path'" -msgstr "Gặp lá»—i khi đăng ký chế Ä‘á»™ cáºp nháºt cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" +msgstr "" +"Gặp lá»—i khi đăng ký chế Ä‘á»™ cáºp nháºt cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:565 +#: git-submodule.sh:590 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" @@ -5975,94 +9437,157 @@ msgstr "" "ÄÆ°á»ng dẫn mô-Ä‘un-con '$sm_path' chÆ°a được khởi tạo\n" "Có lẽ bạn muốn sá» dụng lệnh 'update --init'?" -#: git-submodule.sh:578 +#: git-submodule.sh:603 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" -msgstr "Không tìm thấy Ä‘iểm xét lại hiện hà nh trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" +msgstr "" +"Không tìm thấy Ä‘iểm xét lại hiện hà nh trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:597 +#: git-submodule.sh:622 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Không thể lấy vá» (fetch) trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:611 +#: git-submodule.sh:636 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "Không thể rebase '$sha1' trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:612 +#: git-submodule.sh:637 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con '$sm_path': được rebase và o trong '$sha1'" -#: git-submodule.sh:617 +#: git-submodule.sh:642 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" -msgstr "Không thể hòa trá»™n (merge) '$sha1' trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" +msgstr "" +"Không thể hòa trá»™n (merge) '$sha1' trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:618 +#: git-submodule.sh:643 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con '$sm_path': được hòa trá»™n và o '$sha1'" -#: git-submodule.sh:623 +#: git-submodule.sh:648 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "Không thể checkout '$sha1' trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:624 +#: git-submodule.sh:649 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con '$sm_path': được checkout '$sha1'" -#: git-submodule.sh:646 -#: git-submodule.sh:969 +#: git-submodule.sh:671 git-submodule.sh:995 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Gặp lá»—i khi đệ quy và o trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con '$sm_path'" -#: git-submodule.sh:754 +#: git-submodule.sh:779 msgid "The --cached option cannot be used with the --files option" msgstr "Tùy chá»n --cached không thể dùng cùng vá»›i tùy chá»n --files" #. unexpected type -#: git-submodule.sh:794 +#: git-submodule.sh:819 #, sh-format msgid "unexpected mode $mod_dst" msgstr "chế Ä‘á»™ không nhÆ° mong chá» $mod_dst" -#: git-submodule.sh:812 +#: git-submodule.sh:837 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_src" -#: git-submodule.sh:815 +#: git-submodule.sh:840 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_dst" -#: git-submodule.sh:818 +#: git-submodule.sh:843 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" -msgstr " Cảnh báo: $name không chứa những lần chuyển giao (commit) $sha1_src và $sha1_dst" +msgstr "" +" Cảnh báo: $name không chứa những lần chuyển giao (commit) $sha1_src và " +"$sha1_dst" -#: git-submodule.sh:843 +#: git-submodule.sh:868 msgid "blob" msgstr "blob" -#: git-submodule.sh:881 +#: git-submodule.sh:906 msgid "# Submodules changed but not updated:" msgstr "# Những mô-Ä‘un-con đã bị thay đổi nhÆ°ng chÆ°a được cáºp nháºt:" -#: git-submodule.sh:883 +#: git-submodule.sh:908 msgid "# Submodule changes to be committed:" msgstr "# Những thay đổi mô-Ä‘un-con được chuyển giao (commit):" -#: git-submodule.sh:1027 +#: git-submodule.sh:1054 #, sh-format 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" + +#~ msgid "merge-recursive: disk full?" +#~ msgstr "merge-recursive: Ä‘Ä©a bị đầy?" + +#~ msgid "diff_setup_done failed" +#~ msgstr "diff_setup_done gặp lá»—i" + #~ msgid "-d option is no longer supported. Do not use." #~ msgstr "Tùy chá»n -d không còn được há»— trợ nữa. Xin đừng sá» dụng." @@ -6086,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ỡ" diff --git a/po/zh_CN.po b/po/zh_CN.po index bc04236e47..46d158ffd1 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-08-06 23:47+0800\n" -"PO-Revision-Date: 2012-08-07 01:07+0800\n" +"POT-Creation-Date: 2012-09-15 10:21+0800\n" +"PO-Revision-Date: 2012-09-07 17:56+0800\n" "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n" "Language-Team: GitHub <https://github.com/gotgit/git/>\n" "Language: zh_CN\n" @@ -42,6 +42,95 @@ msgstr "" "'git add/rm <file>' æ ‡è®°è§£å†³æ–¹æ¡ˆï¼Œ\n" "或使用 'git commit -a'。" +#: archive.c:10 +#, fuzzy +msgid "git archive [options] <tree-ish> [<path>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: archive.c:11 +#, fuzzy +msgid "git archive --list" +msgstr "git archive:NACK %s" + +#: archive.c:12 +msgid "" +"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]" +msgstr "" + +#: archive.c:13 +msgid "git archive --remote <repo> [--exec <cmd>] --list" +msgstr "" + +#: archive.c:322 +msgid "fmt" +msgstr "" + +#: archive.c:322 +msgid "archive format" +msgstr "" + +#: archive.c:323 builtin/log.c:1079 +msgid "prefix" +msgstr "" + +#: archive.c:324 +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 +msgid "file" +msgstr "文件" + +#: archive.c:326 builtin/archive.c:92 +msgid "write the archive to this file" +msgstr "" + +#: archive.c:328 +#, fuzzy +msgid "read .gitattributes in working directory" +msgstr "%s:已ç»å˜åœ¨äºŽå·¥ä½œåŒºä¸" + +#: archive.c:329 +msgid "report archived files on stderr" +msgstr "" + +#: archive.c:330 +msgid "store only" +msgstr "" + +#: archive.c:331 +msgid "compress faster" +msgstr "" + +#: archive.c:339 +msgid "compress better" +msgstr "" + +#: archive.c:342 +msgid "list supported archive formats" +msgstr "" + +#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85 +msgid "repo" +msgstr "" + +#: archive.c:345 builtin/archive.c:94 +msgid "retrieve the archive from remote repository <repo>" +msgstr "" + +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616 +#, fuzzy +msgid "command" +msgstr "è¿è¡Œ $command" + +#: archive.c:347 builtin/archive.c:96 +msgid "path to the remote git-upload-archive command" +msgstr "" + #: bundle.c:36 #, c-format msgid "'%s' does not look like a v2 bundle file" @@ -52,7 +141,7 @@ msgstr "'%s' ä¸åƒæ˜¯ä¸€ä¸ª v2 版本的包文件" msgid "unrecognized header: %s%s (%d)" msgstr "未能识别的包头:%s%s (%d)" -#: bundle.c:89 builtin/commit.c:699 +#: bundle.c:89 builtin/commit.c:714 #, c-format msgid "could not open '%s'" msgstr "ä¸èƒ½æ‰“å¼€ '%s'" @@ -61,8 +150,8 @@ msgstr "ä¸èƒ½æ‰“å¼€ '%s'" msgid "Repository lacks these prerequisite commits:" msgstr "版本库缺少这些必备的æ交:" -#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290 -#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347 +#: bundle.c:164 sequencer.c:557 sequencer.c:989 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" msgstr "版本é历设置失败" @@ -89,7 +178,7 @@ msgstr[1] "è¿™ä¸ªåŒ…éœ€è¦ %d 个这些引用" msgid "rev-list died" msgstr "rev-list 终æ¢" -#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284 +#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284 #, c-format msgid "unrecognized argument: %s" msgstr "未能识别的å‚数:%s" @@ -236,32 +325,32 @@ msgstr "" "å‘现é…ç½®å˜é‡ 'diff.dirstat' ä¸çš„错误:\n" "%s" -#: diff.c:1400 +#: diff.c:1401 msgid " 0 files changed" msgstr " 0 个文件被修改" -#: diff.c:1404 +#: diff.c:1405 #, c-format msgid " %d file changed" msgid_plural " %d files changed" msgstr[0] " %d 个文件被修改" msgstr[1] " %d 个文件被修改" -#: diff.c:1421 +#: diff.c:1422 #, c-format msgid ", %d insertion(+)" msgid_plural ", %d insertions(+)" msgstr[0] ",æ’å…¥ %d è¡Œ(+)" msgstr[1] ",æ’å…¥ %d è¡Œ(+)" -#: diff.c:1432 +#: diff.c:1433 #, c-format msgid ", %d deletion(-)" msgid_plural ", %d deletions(-)" msgstr[0] "ï¼Œåˆ é™¤ %d è¡Œ(-)" msgstr[1] "ï¼Œåˆ é™¤ %d è¡Œ(-)" -#: diff.c:3461 +#: diff.c:3460 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -350,7 +439,7 @@ msgstr[0] "" "您指的是这个么?" msgstr[1] "" "\n" -"您指的是这些其ä¸ä¸€ä¸ªä¹ˆï¼Ÿ" +"您指的是这其ä¸çš„æŸä¸€ä¸ªä¹ˆï¼Ÿ" #: merge-recursive.c:190 #, c-format @@ -366,74 +455,66 @@ msgstr "为路径 '%s' addinfo_cache 失败" msgid "error building trees" msgstr "æ— æ³•åˆ›å»ºæ ‘" -#: merge-recursive.c:497 -msgid "diff setup failed" -msgstr "diff 设置失败" - -#: merge-recursive.c:627 -msgid "merge-recursive: disk full?" -msgstr "merge-recursive:ç£ç›˜å·²æ»¡ï¼Ÿ" - -#: merge-recursive.c:690 +#: merge-recursive.c:672 #, c-format msgid "failed to create path '%s'%s" msgstr "æ— æ³•åˆ›å»ºè·¯å¾„ '%s'%s" -#: merge-recursive.c:701 +#: merge-recursive.c:683 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "åˆ é™¤ %s 以便为å目录留出空间\n" #. something else exists #. .. but not some other error (who really cares what?) -#: merge-recursive.c:715 merge-recursive.c:736 +#: merge-recursive.c:697 merge-recursive.c:718 msgid ": perhaps a D/F conflict?" msgstr ":å¯èƒ½æ˜¯ä¸€ä¸ªç›®å½•/文件冲çªï¼Ÿ" -#: merge-recursive.c:726 +#: merge-recursive.c:708 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "æ‹’ç»ä¸¢å¼ƒ '%s' ä¸çš„未跟踪文件" -#: merge-recursive.c:766 +#: merge-recursive.c:748 #, c-format msgid "cannot read object %s '%s'" msgstr "ä¸èƒ½è¯»å–对象 %s '%s'" -#: merge-recursive.c:768 +#: merge-recursive.c:750 #, c-format msgid "blob expected for %s '%s'" msgstr "%s '%s' 应为二进制对象(blob)" -#: merge-recursive.c:791 builtin/clone.c:302 +#: merge-recursive.c:773 builtin/clone.c:302 #, c-format msgid "failed to open '%s'" msgstr "æ— æ³•æ‰“å¼€ '%s'" -#: merge-recursive.c:799 +#: merge-recursive.c:781 #, c-format msgid "failed to symlink '%s'" msgstr "æ— æ³•åˆ›å»ºç¬¦å·é“¾æŽ¥ '%s'" -#: merge-recursive.c:802 +#: merge-recursive.c:784 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "ä¸çŸ¥é“å¦‚ä½•å¤„ç† %06o %s '%s'" -#: merge-recursive.c:939 +#: merge-recursive.c:922 msgid "Failed to execute internal merge" msgstr "æ— æ³•æ‰§è¡Œå†…éƒ¨åˆå¹¶" -#: merge-recursive.c:943 +#: merge-recursive.c:926 #, c-format msgid "Unable to add %s to database" msgstr "ä¸èƒ½æ·»åŠ %s 至对象库" -#: merge-recursive.c:959 +#: merge-recursive.c:942 msgid "unsupported object type in the tree" msgstr "åœ¨æ ‘ä¸æœ‰ä¸æ”¯æŒçš„对象类型" -#: merge-recursive.c:1038 merge-recursive.c:1052 +#: 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 " @@ -442,7 +523,7 @@ msgstr "" "冲çªï¼ˆ%1$s/åˆ é™¤ï¼‰ï¼š%2$s 在 %3$s ä¸è¢«åˆ 除,在 %5$s ä¸è¢« %4$s。%7$s 在 %6$s ä¸" "的版本被ä¿ç•™ã€‚" -#: merge-recursive.c:1044 merge-recursive.c:1057 +#: 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 " @@ -451,20 +532,20 @@ msgstr "" "冲çªï¼ˆ%1$s/åˆ é™¤ï¼‰ï¼š%2$s 在 %3$s ä¸è¢«åˆ 除,在 %5$s ä¸è¢« %4$s。%7$s 在 %6$s ä¸" "的版本ä¿ç•™äºŽ %8$s ä¸ã€‚" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "rename" msgstr "é‡å‘½å" -#: merge-recursive.c:1098 +#: merge-recursive.c:1081 msgid "renamed" msgstr "é‡å‘½å" -#: merge-recursive.c:1154 +#: merge-recursive.c:1137 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "%s 是 %s ä¸çš„一个目录而以 %s 为åè¢«æ·»åŠ " -#: merge-recursive.c:1176 +#: merge-recursive.c:1159 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -473,144 +554,144 @@ msgstr "" "冲çªï¼ˆé‡å‘½å/é‡å‘½å):在分支 \"%3$s\" ä¸é‡å‘½å \"%1$s\"->\"%2$s\",在分支 " "\"%6$s\" ä¸é‡å‘½å \"%4$s\"->\"%5$s\"%7$s" -#: merge-recursive.c:1181 +#: merge-recursive.c:1164 msgid " (left unresolved)" msgstr "(留下未解决)" -#: merge-recursive.c:1235 +#: merge-recursive.c:1218 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" "冲çªï¼ˆé‡å‘½å/é‡å‘½å):在 %3$s ä¸é‡å‘½å %1$s->%2$s,在 %6$s ä¸é‡å‘½å %4$s->" "%5$s" -#: merge-recursive.c:1265 +#: merge-recursive.c:1248 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "而是é‡å‘½å %s 至 %s ä»¥åŠ %s 至 %s" -#: merge-recursive.c:1464 +#: merge-recursive.c:1447 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "冲çªï¼ˆé‡å‘½å/æ·»åŠ ï¼‰ï¼šåœ¨ %3$s ä¸é‡å‘½å %1$s->%2$s。在 %5$s ä¸æ·»åŠ %4$s" -#: merge-recursive.c:1474 +#: merge-recursive.c:1457 #, c-format msgid "Adding merged %s" msgstr "æ·»åŠ åˆå¹¶åŽçš„ %s" -#: merge-recursive.c:1479 merge-recursive.c:1677 +#: merge-recursive.c:1462 merge-recursive.c:1660 #, c-format msgid "Adding as %s instead" msgstr "而是以 %s 为åæ·»åŠ " -#: merge-recursive.c:1530 +#: merge-recursive.c:1513 #, c-format msgid "cannot read object %s" msgstr "ä¸èƒ½è¯»å–对象 %s" -#: merge-recursive.c:1533 +#: merge-recursive.c:1516 #, c-format msgid "object %s is not a blob" msgstr "对象 %s ä¸æ˜¯ä¸€ä¸ªäºŒè¿›åˆ¶å¯¹è±¡ï¼ˆblob)" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modify" msgstr "修改" -#: merge-recursive.c:1581 +#: merge-recursive.c:1564 msgid "modified" msgstr "修改" -#: merge-recursive.c:1591 +#: merge-recursive.c:1574 msgid "content" msgstr "内容" -#: merge-recursive.c:1598 +#: merge-recursive.c:1581 msgid "add/add" msgstr "æ·»åŠ /æ·»åŠ " -#: merge-recursive.c:1632 +#: merge-recursive.c:1615 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "略过 %s(已ç»åšè¿‡ç›¸åŒåˆå¹¶ï¼‰" -#: merge-recursive.c:1646 +#: merge-recursive.c:1629 #, c-format msgid "Auto-merging %s" msgstr "自动åˆå¹¶ %s" -#: merge-recursive.c:1650 git-submodule.sh:844 +#: merge-recursive.c:1633 git-submodule.sh:869 msgid "submodule" msgstr "å模组" -#: merge-recursive.c:1651 +#: merge-recursive.c:1634 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "冲çªï¼ˆ%s):åˆå¹¶å†²çªäºŽ %s" -#: merge-recursive.c:1741 +#: merge-recursive.c:1724 #, c-format msgid "Removing %s" msgstr "åˆ é™¤ %s" -#: merge-recursive.c:1766 +#: merge-recursive.c:1749 msgid "file/directory" msgstr "文件/目录" -#: merge-recursive.c:1772 +#: merge-recursive.c:1755 msgid "directory/file" msgstr "目录/文件" -#: merge-recursive.c:1777 +#: merge-recursive.c:1760 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "冲çªï¼ˆ%1$s):在 %3$s ä¸æœ‰ä¸€ä¸ªå为 %2$s 的目录。以 %5$s 为åæ·»åŠ %4$s" -#: merge-recursive.c:1787 +#: merge-recursive.c:1770 #, c-format msgid "Adding %s" msgstr "æ·»åŠ %s" -#: merge-recursive.c:1804 +#: merge-recursive.c:1787 msgid "Fatal merge failure, shouldn't happen." msgstr "严é‡çš„åˆå¹¶é”™è¯¯ï¼Œä¸åº”å‘生。" -#: merge-recursive.c:1823 +#: merge-recursive.c:1806 msgid "Already up-to-date!" msgstr "å·²ç»æ˜¯æœ€æ–°çš„ï¼" -#: merge-recursive.c:1832 +#: merge-recursive.c:1815 #, c-format msgid "merging of trees %s and %s failed" msgstr "æ— æ³•åˆå¹¶æ ‘ %s å’Œ %s" -#: merge-recursive.c:1862 +#: merge-recursive.c:1845 #, c-format msgid "Unprocessed path??? %s" msgstr "未处ç†çš„路径??? %s" -#: merge-recursive.c:1907 +#: merge-recursive.c:1890 msgid "Merging:" msgstr "åˆå¹¶ï¼š" -#: merge-recursive.c:1920 +#: merge-recursive.c:1903 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "å‘现 %u 个共åŒç¥–先:" msgstr[1] "å‘现 %u 个共åŒç¥–先:" -#: merge-recursive.c:1957 +#: merge-recursive.c:1940 msgid "merge returned no commit" msgstr "åˆå¹¶æœªè¿”回æ交" -#: merge-recursive.c:2014 +#: merge-recursive.c:1997 #, c-format msgid "Could not parse object '%s'" msgstr "ä¸èƒ½è§£æžå¯¹è±¡ '%s'" -#: merge-recursive.c:2026 builtin/merge.c:697 +#: merge-recursive.c:2009 builtin/merge.c:696 msgid "Unable to write index." msgstr "ä¸èƒ½å†™å…¥ç´¢å¼•ã€‚" @@ -661,19 +742,19 @@ msgid_plural "" "and have %d and %d different commits each, respectively.\n" msgstr[0] "" "您的分支和 '%s' 出现了å离,\n" -"并且å„自分别有 %d å’Œ %d 处ä¸åŒçš„æ交。\n" +"并且分别有 %d å’Œ %d 处ä¸åŒçš„æ交。\n" msgstr[1] "" "您的分支和 '%s' 出现了å离,\n" -"并且å„自分别有 %d å’Œ %d 处ä¸åŒçš„æ交。\n" +"并且分别有 %d å’Œ %d 处ä¸åŒçš„æ交。\n" -#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 -#: builtin/merge.c:1088 builtin/merge.c:1098 +#: sequencer.c:121 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 "ä¸èƒ½ä¸ºå†™å…¥æ‰“å¼€ '%s'" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 -#: builtin/merge.c:1090 builtin/merge.c:1103 +#: sequencer.c:123 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 "ä¸èƒ½å†™å…¥ '%s'" @@ -695,7 +776,7 @@ msgstr "" "冲çªè§£å†³å®Œæ¯•åŽï¼Œç”¨ 'git add <paths>' 或 'git rm <paths>'\n" "对修æ£åŽçš„文件åšæ ‡è®°ï¼Œç„¶åŽç”¨ 'git commit' æ交" -#: sequencer.c:160 sequencer.c:758 sequencer.c:841 +#: sequencer.c:160 sequencer.c:765 sequencer.c:848 #, c-format msgid "Could not write to %s" msgstr "ä¸èƒ½å†™å…¥ %s" @@ -731,178 +812,178 @@ msgstr "ä¸èƒ½è§£æž HEAD æ交\n" msgid "Unable to update cache tree\n" msgstr "ä¸èƒ½æ›´æ–°ç¼“å˜\n" -#: sequencer.c:324 +#: sequencer.c:327 #, c-format msgid "Could not parse commit %s\n" msgstr "ä¸èƒ½è§£æžæ交 %s\n" -#: sequencer.c:329 +#: sequencer.c:332 #, c-format msgid "Could not parse parent commit %s\n" msgstr "ä¸èƒ½è§£æžçˆ¶æ交 %s\n" -#: sequencer.c:395 +#: sequencer.c:398 msgid "Your index file is unmerged." msgstr "您的索引文件未完æˆåˆå¹¶ã€‚" -#: sequencer.c:398 +#: sequencer.c:401 msgid "You do not have a valid HEAD" msgstr "您没有一个有效的 HEAD" -#: sequencer.c:413 +#: sequencer.c:416 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "æ交 %s 是一个åˆå¹¶æ交但未æä¾› -m 选项。" -#: sequencer.c:421 +#: sequencer.c:424 #, c-format msgid "Commit %s does not have parent %d" msgstr "æ交 %s 没有父æ交 %d" -#: sequencer.c:425 +#: sequencer.c:428 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "指定了主线但æ交 %s ä¸æ˜¯ä¸€ä¸ªåˆå¹¶ã€‚" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:436 +#: sequencer.c:439 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s:ä¸èƒ½è§£æžçˆ¶æ交 %s" -#: sequencer.c:440 +#: sequencer.c:443 #, c-format msgid "Cannot get commit message for %s" msgstr "ä¸èƒ½å¾—到 %s çš„æ交说明" -#: sequencer.c:524 +#: sequencer.c:527 #, c-format msgid "could not revert %s... %s" msgstr "ä¸èƒ½è¿˜åŽŸ %s... %s" -#: sequencer.c:525 +#: sequencer.c:528 #, c-format msgid "could not apply %s... %s" msgstr "ä¸èƒ½åº”用 %s... %s" -#: sequencer.c:553 +#: sequencer.c:560 msgid "empty commit set passed" msgstr "æ供了空的æ交集" -#: sequencer.c:561 +#: sequencer.c:568 #, c-format msgid "git %s: failed to read the index" msgstr "git %sï¼šæ— æ³•è¯»å–索引" -#: sequencer.c:566 +#: sequencer.c:573 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %sï¼šæ— æ³•åˆ·æ–°ç´¢å¼•" -#: sequencer.c:624 +#: sequencer.c:631 #, c-format msgid "Cannot %s during a %s" msgstr "æ— æ³• %s 在一个 %s 过程ä¸" -#: sequencer.c:646 +#: sequencer.c:653 #, c-format msgid "Could not parse line %d." msgstr "ä¸èƒ½è§£æžç¬¬ %d 行。" -#: sequencer.c:651 +#: sequencer.c:658 msgid "No commits parsed." msgstr "没有æ交被解æžã€‚" -#: sequencer.c:664 +#: sequencer.c:671 #, c-format msgid "Could not open %s" msgstr "ä¸èƒ½æ‰“å¼€ %s" -#: sequencer.c:668 +#: sequencer.c:675 #, c-format msgid "Could not read %s." msgstr "ä¸èƒ½è¯»å– %s。" -#: sequencer.c:675 +#: sequencer.c:682 #, c-format msgid "Unusable instruction sheet: %s" msgstr "æ— ç”¨çš„æŒ‡ä»¤è¡¨å•ï¼š%s" -#: sequencer.c:703 +#: sequencer.c:710 #, c-format msgid "Invalid key: %s" msgstr "æ— æ•ˆé”®å:%s" -#: sequencer.c:706 +#: sequencer.c:713 #, c-format msgid "Invalid value for %s: %s" msgstr "%s çš„å€¼æ— æ•ˆï¼š%s" -#: sequencer.c:718 +#: sequencer.c:725 #, c-format msgid "Malformed options sheet: %s" msgstr "éžæ³•çš„选项表å•ï¼š%s" -#: sequencer.c:739 +#: sequencer.c:746 msgid "a cherry-pick or revert is already in progress" msgstr "一个拣选或还原æ“作已在进行" -#: sequencer.c:740 +#: sequencer.c:747 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "å°è¯• \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:744 +#: sequencer.c:751 #, c-format msgid "Could not create sequencer directory %s" msgstr "ä¸èƒ½åˆ›å»ºåºåˆ—目录 %s" -#: sequencer.c:760 sequencer.c:845 +#: sequencer.c:767 sequencer.c:852 #, c-format msgid "Error wrapping up %s." msgstr "错误收尾 %s。" -#: sequencer.c:779 sequencer.c:913 +#: sequencer.c:786 sequencer.c:920 msgid "no cherry-pick or revert in progress" -msgstr "没有拣选或还原æ“作在进行" +msgstr "拣选或还原æ“作并未进行" -#: sequencer.c:781 +#: sequencer.c:788 msgid "cannot resolve HEAD" msgstr "ä¸èƒ½è§£æž HEAD" -#: sequencer.c:783 +#: sequencer.c:790 msgid "cannot abort from a branch yet to be born" msgstr "ä¸èƒ½ä»Žå°šæœªå»ºç«‹çš„分支终æ¢" -#: sequencer.c:805 builtin/apply.c:3988 +#: sequencer.c:812 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "ä¸èƒ½æ‰“å¼€ %s:%s" -#: sequencer.c:808 +#: sequencer.c:815 #, c-format msgid "cannot read %s: %s" msgstr "ä¸èƒ½è¯»å– %s:%s" -#: sequencer.c:809 +#: sequencer.c:816 msgid "unexpected end of file" -msgstr "未预期的文件结æŸ" +msgstr "æ„外的文件结æŸ" -#: sequencer.c:815 +#: sequencer.c:822 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "ä¿å˜æ‹£é€‰æ交å‰çš„ HEAD 文件 '%s' æŸå" -#: sequencer.c:838 +#: sequencer.c:845 #, c-format msgid "Could not format %s." msgstr "ä¸èƒ½æ ¼å¼åŒ– %s。" -#: sequencer.c:1000 +#: sequencer.c:1007 msgid "Can't revert as initial commit" msgstr "ä¸èƒ½ä½œä¸ºåˆå§‹æ交还原" -#: sequencer.c:1001 +#: sequencer.c:1008 msgid "Can't cherry-pick into empty head" msgstr "ä¸èƒ½æ‹£é€‰åˆ°ç©ºåˆ†æ”¯" @@ -925,12 +1006,17 @@ msgstr "尚未给分支 '%s' 设置上游" msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "上游分支 '%s' 没有å˜å‚¨ä¸ºä¸€ä¸ªè¿œç¨‹è·Ÿè¸ªåˆ†æ”¯" -#: wrapper.c:413 +#: wrapper.c:408 +#, fuzzy, c-format +msgid "unable to access '%s': %s" +msgstr "ä¸èƒ½åˆ›å»º '%s'" + +#: wrapper.c:426 #, c-format msgid "unable to look up current user in the passwd file: %s" -msgstr "æ— æ³•åœ¨ passwd 文件ä¸æŸ¥è¯¢åˆ°å½“å‰ç”¨æˆ·ï¼š%s" +msgstr "æ— æ³•åœ¨ passwd 文件ä¸æŸ¥è¯¢åˆ°è¯¥ç”¨æˆ·ï¼š%s" -#: wrapper.c:414 +#: wrapper.c:427 msgid "no such user" msgstr "æ— æ¤ç”¨æˆ·" @@ -993,11 +1079,6 @@ msgstr " (使用 \"git checkout -- <file>...\" 丢弃工作区的改动)" msgid " (commit or discard the untracked or modified content in submodules)" msgstr " (æ交或丢弃å模组ä¸æœªè·Ÿè¸ªæˆ–修改的内容)" -#: wt-status.c:224 -#, c-format -msgid "%s files:" -msgstr "%s文件:" - # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ #: wt-status.c:227 #, c-format @@ -1106,7 +1187,7 @@ msgstr "bug:未处ç†çš„å·®å¼‚çŠ¶æ€ %c" #: wt-status.c:785 msgid "You have unmerged paths." -msgstr "您有路径尚未åˆå¹¶ã€‚" +msgstr "您有尚未åˆå¹¶çš„路径。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ #: wt-status.c:788 wt-status.c:912 @@ -1191,7 +1272,7 @@ msgstr " (使用 \"git commit --amend\" 修补当å‰æ交)" #: wt-status.c:898 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" -msgstr " (执行 \"git rebase --continue\" 一旦您满æ„您的修改)" +msgstr " (当您对您的修改满æ„åŽæ‰§è¡Œ \"git rebase --continue\")" #: wt-status.c:908 msgid "You are currently cherry-picking." @@ -1224,11 +1305,13 @@ msgid "Initial commit" msgstr "åˆå§‹æ交" #: wt-status.c:1011 -msgid "Untracked" +#, fuzzy +msgid "Untracked files" msgstr "未跟踪的" #: wt-status.c:1013 -msgid "Ignored" +#, fuzzy +msgid "Ignored files" msgstr "忽略的" #: wt-status.c:1015 @@ -1245,70 +1328,86 @@ msgstr "(使用 -u å‚数显示未跟踪的文件)" msgid "No changes" msgstr "没有修改" -#: wt-status.c:1027 -#, c-format -msgid "no changes added to commit%s\n" -msgstr "ä¿®æ”¹å°šæœªåŠ å…¥æ交%s\n" - # 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1029 -msgid " (use \"git add\" and/or \"git commit -a\")" +#: wt-status.c:1028 +#, fuzzy, c-format +msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "(使用 \"git add\" å’Œ/或 \"git commit -a\")" #: wt-status.c:1031 -#, c-format -msgid "nothing added to commit but untracked files present%s\n" -msgstr "空æ交但å˜åœ¨æœªè·Ÿè¸ªæ–‡ä»¶%s\n" +#, fuzzy, c-format +msgid "no changes added to commit\n" +msgstr "ä¿®æ”¹å°šæœªåŠ å…¥æ交%s\n" -# 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1033 -msgid " (use \"git add\" to track)" -msgstr "(使用 \"git add\" 建立跟踪)" +#: wt-status.c:1034 +#, fuzzy, c-format +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" +msgstr "空æ交但å˜åœ¨æœªè·Ÿè¸ªæ–‡ä»¶%s\n" -#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041 -#, c-format -msgid "nothing to commit%s\n" -msgstr "æ— é¡»æ交%s\n" +#: wt-status.c:1037 +#, fuzzy, c-format +msgid "nothing added to commit but untracked files present\n" +msgstr "空æ交但å˜åœ¨æœªè·Ÿè¸ªæ–‡ä»¶%s\n" # 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1036 -msgid " (create/copy files and use \"git add\" to track)" +#: wt-status.c:1040 +#, fuzzy, c-format +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "(新建/æ‹·è´çš„文件使用 \"git add\" 建立跟踪)" +#: wt-status.c:1043 wt-status.c:1048 +#, fuzzy, c-format +msgid "nothing to commit\n" +msgstr "æ— é¡»æ交%s\n" + # 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1039 -msgid " (use -u to show untracked files)" +#: wt-status.c:1046 +#, fuzzy, c-format +msgid "nothing to commit (use -u to show untracked files)\n" msgstr "(使用 -u 显示未跟踪文件)" # 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1042 -msgid " (working directory clean)" +#: wt-status.c:1050 +#, fuzzy, c-format +msgid "nothing to commit, working directory clean\n" msgstr "(干净的工作区)" -#: wt-status.c:1150 +#: wt-status.c:1158 msgid "HEAD (no branch)" msgstr "HEAD(éžåˆ†æ”¯ï¼‰" # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1156 +#: wt-status.c:1164 msgid "Initial commit on " msgstr "åˆå§‹æ交于 " # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1171 +#: wt-status.c:1179 msgid "behind " msgstr "è½åŽ " # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1174 wt-status.c:1177 +#: wt-status.c:1182 wt-status.c:1185 msgid "ahead " msgstr "领先 " # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1179 +#: wt-status.c:1187 msgid ", behind " msgstr ",è½åŽ " +#: compat/precompose_utf8.c:58 builtin/clone.c:341 +#, c-format +msgid "failed to unlink '%s'" +msgstr "æ— æ³•åˆ é™¤ '%s'" + +#: builtin/add.c:19 +#, fuzzy +msgid "git add [options] [--] <filepattern>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + #: builtin/add.c:62 #, c-format msgid "unexpected diff status %c" @@ -1332,7 +1431,7 @@ msgstr "路径 '%s' 属于模组 '%.*s'" msgid "Unstaged changes after refreshing the index:" msgstr "刷新索引之åŽå°šæœªè¢«æš‚å˜çš„å˜æ›´ï¼š" -#: 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 "路径 '%s' 未匹é…任何文件" @@ -1349,11 +1448,11 @@ msgstr "ä¸èƒ½è¯»å–索引" #: builtin/add.c:286 #, c-format msgid "Could not open '%s' for writing." -msgstr "ä¸èƒ½ä¸ºå†™å…¥æ‰“å¼€ '%s'。" +msgstr "ä¸èƒ½æ‰“å¼€ '%s' 以写入。" #: builtin/add.c:290 msgid "Could not write patch" -msgstr "ä¸èƒ½å†™è¡¥ä¸" +msgstr "ä¸èƒ½ç”Ÿæˆè¡¥ä¸" #: builtin/add.c:295 #, c-format @@ -1369,47 +1468,102 @@ msgstr "空补ä¸ã€‚异常终æ¢ã€‚" msgid "Could not apply '%s'" msgstr "ä¸èƒ½åº”用 '%s'" -#: builtin/add.c:312 +#: builtin/add.c:313 msgid "The following paths are ignored by one of your .gitignore files:\n" -msgstr "下列路径被您的一个 .gitignore 文件所忽略:\n" +msgstr "ä¸‹åˆ—è·¯å¾„æ ¹æ®æ‚¨çš„一个 .gitignore 文件而被忽略:\n" + +#: 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 "" -#: builtin/add.c:352 +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187 +#: 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 "冗长输出" + +#: builtin/add.c:322 +#, fuzzy +msgid "interactive picking" +msgstr "交互å¼æ·»åŠ 失败" + +#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248 +msgid "select hunks interactively" +msgstr "" + +#: builtin/add.c:324 +msgid "edit current diff and apply" +msgstr "" + +#: builtin/add.c:325 +msgid "allow adding otherwise ignored files" +msgstr "" + +#: builtin/add.c:326 +#, fuzzy +msgid "update tracked files" +msgstr "æ— æ³•å˜å‚¨åŒ…文件" + +#: builtin/add.c:327 +msgid "record only the fact that the path will be added later" +msgstr "" + +#: builtin/add.c:328 +msgid "add changes from all tracked and untracked files" +msgstr "" + +#: builtin/add.c:329 +#, fuzzy +msgid "don't add, only refresh the index" +msgstr "git %sï¼šæ— æ³•åˆ·æ–°ç´¢å¼•" + +#: builtin/add.c:330 +msgid "just skip files which cannot be added because of errors" +msgstr "" + +#: builtin/add.c:331 +msgid "check if - even missing - files are ignored in dry run" +msgstr "" + +#: builtin/add.c:353 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "使用 -f å‚数如果您确实è¦æ·»åŠ 它们。\n" -#: builtin/add.c:353 +#: builtin/add.c:354 msgid "no files added" msgstr "æ²¡æœ‰æ–‡ä»¶è¢«æ·»åŠ " -#: builtin/add.c:359 +#: builtin/add.c:360 msgid "adding files failed" msgstr "æ·»åŠ æ–‡ä»¶å¤±è´¥" -#: builtin/add.c:391 +#: builtin/add.c:392 msgid "-A and -u are mutually incompatible" msgstr "-A å’Œ -u 选项互斥" -#: builtin/add.c:393 +#: builtin/add.c:394 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "选项 --ignore-missing åªèƒ½å’Œ --dry-run åŒæ—¶ä½¿ç”¨" -#: builtin/add.c:413 +#: builtin/add.c:414 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "æ²¡æœ‰æŒ‡å®šæ–‡ä»¶ï¼Œä¹Ÿæ²¡æœ‰æ–‡ä»¶è¢«æ·»åŠ ã€‚\n" -#: builtin/add.c:414 +#: builtin/add.c:415 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "也许您想è¦æ‰§è¡Œ 'git add .'?\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:289 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "索引文件æŸå" -#: builtin/add.c:480 builtin/apply.c:4433 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 "æ— æ³•å†™å…¥æ–°ç´¢å¼•æ–‡ä»¶" @@ -1427,52 +1581,52 @@ msgstr "未能识别的空白å—符选项 '%s'" msgid "unrecognized whitespace ignore option '%s'" msgstr "未能识别的空白å—符忽略选项 '%s'" -#: builtin/apply.c:824 +#: builtin/apply.c:823 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "æ— æ³•å‡†å¤‡æ—¶é—´æˆ³æ£åˆ™è¡¨è¾¾å¼ %s" -#: builtin/apply.c:833 +#: builtin/apply.c:832 #, c-format msgid "regexec returned %d for input: %s" msgstr "regexec 返回 %d,输入为:%s" -#: builtin/apply.c:914 +#: builtin/apply.c:913 #, c-format msgid "unable to find filename in patch at line %d" msgstr "ä¸èƒ½åœ¨è¡¥ä¸çš„第 %d 行找到文件å" -#: builtin/apply.c:946 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" -msgstr "git apply:错误的 git-diff - 期望 /dev/null,但在第 %2$d 行得到 %1$s" +msgstr "git apply:错误的 git-diff - 应为 /dev/null,但在第 %2$d 行得到 %1$s" -#: builtin/apply.c:950 +#: builtin/apply.c:949 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "git apply:错误的 git-diff - 第 %d 行上新文件åä¸ä¸€è‡´" -#: builtin/apply.c:951 +#: builtin/apply.c:950 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件åä¸ä¸€è‡´" -#: builtin/apply.c:958 +#: builtin/apply.c:957 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" -msgstr "git apply:错误的 git-diff - 期望 /dev/null 于第 %d è¡Œ" +msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null" -#: builtin/apply.c:1403 +#: builtin/apply.c:1420 #, c-format msgid "recount: unexpected line: %.*s" msgstr "recount:æ„外的行:%.*s" -#: builtin/apply.c:1460 +#: builtin/apply.c:1477 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "第 %d 行的补ä¸ç‰‡æ®µæ²¡æœ‰å¤´ä¿¡æ¯ï¼š%.*s" -#: builtin/apply.c:1477 +#: builtin/apply.c:1494 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -1483,82 +1637,82 @@ msgid_plural "" msgstr[0] "当移除 %d 个å‰å¯¼è·¯å¾„åŽ git diff 头缺ä¹æ–‡ä»¶åä¿¡æ¯ï¼ˆç¬¬ %d 行)" msgstr[1] "当移除 %d 个å‰å¯¼è·¯å¾„åŽ git diff 头缺ä¹æ–‡ä»¶åä¿¡æ¯ï¼ˆç¬¬ %d 行)" -#: builtin/apply.c:1637 +#: builtin/apply.c:1654 msgid "new file depends on old contents" msgstr "新文件ä¾èµ–旧内容" -#: builtin/apply.c:1639 +#: builtin/apply.c:1656 msgid "deleted file still has contents" msgstr "åˆ é™¤çš„æ–‡ä»¶ä»æœ‰å†…容" -#: builtin/apply.c:1665 +#: builtin/apply.c:1682 #, c-format msgid "corrupt patch at line %d" -msgstr "è¡¥ä¸æŸåä½äºŽç¬¬ %d è¡Œ" +msgstr "è¡¥ä¸åœ¨ç¬¬ %d è¡ŒæŸå" -#: builtin/apply.c:1701 +#: builtin/apply.c:1718 #, c-format msgid "new file %s depends on old contents" msgstr "新文件 %s ä¾èµ–旧内容" -#: builtin/apply.c:1703 +#: builtin/apply.c:1720 #, c-format msgid "deleted file %s still has contents" msgstr "åˆ é™¤çš„æ–‡ä»¶ %s ä»æœ‰å†…容" -#: builtin/apply.c:1706 +#: builtin/apply.c:1723 #, c-format msgid "** warning: file %s becomes empty but is not deleted" msgstr "** è¦å‘Šï¼šæ–‡ä»¶ %s æˆä¸ºç©ºæ–‡ä»¶ä½†å¹¶æœªåˆ 除" -#: builtin/apply.c:1852 +#: builtin/apply.c:1869 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "二进制补ä¸åœ¨ç¬¬ %d è¡ŒæŸå:%.*s" #. there has to be one hunk (forward hunk) -#: builtin/apply.c:1881 +#: builtin/apply.c:1898 #, c-format msgid "unrecognized binary patch at line %d" msgstr "未能识别的二进制补ä¸ä½äºŽç¬¬ %d è¡Œ" -#: builtin/apply.c:1967 +#: builtin/apply.c:1984 #, c-format msgid "patch with only garbage at line %d" msgstr "è¡¥ä¸æ–‡ä»¶çš„第 %d è¡Œåªæœ‰åžƒåœ¾æ•°æ®" -#: builtin/apply.c:2057 +#: builtin/apply.c:2074 #, c-format msgid "unable to read symlink %s" msgstr "æ— æ³•è¯»å–符å·é“¾æŽ¥ %s" -#: builtin/apply.c:2061 +#: builtin/apply.c:2078 #, c-format msgid "unable to open or read %s" msgstr "ä¸èƒ½æ‰“å¼€æˆ–è¯»å– %s" -#: builtin/apply.c:2132 +#: builtin/apply.c:2149 msgid "oops" msgstr "å“Žå“Ÿ" -#: builtin/apply.c:2654 +#: builtin/apply.c:2671 #, c-format msgid "invalid start of line: '%c'" msgstr "æ— æ•ˆçš„è¡Œé¦–å—符:'%c'" -#: builtin/apply.c:2772 +#: 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] "å— #%d æˆåŠŸåº”用于 %d (å移 %d 行)" msgstr[1] "å— #%d æˆåŠŸåº”用于 %d (å移 %d 行)" -#: builtin/apply.c:2784 +#: builtin/apply.c:2801 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "上下文å‡å°‘到(%ld/%ld)以在第 %d 行应用补ä¸ç‰‡æ®µ" -#: builtin/apply.c:2790 +#: builtin/apply.c:2807 #, c-format msgid "" "while searching for:\n" @@ -1567,321 +1721,319 @@ msgstr "" "当查询:\n" "%.*s" -#: builtin/apply.c:2809 +#: builtin/apply.c:2826 #, c-format msgid "missing binary patch data for '%s'" msgstr "缺失 '%s' 的二进制补ä¸æ•°æ®" -#: builtin/apply.c:2912 +#: builtin/apply.c:2929 #, c-format msgid "binary patch does not apply to '%s'" msgstr "二进制补ä¸æœªåº”用到 '%s'" -#: builtin/apply.c:2918 +#: builtin/apply.c:2935 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" -msgstr "到 '%s' 的二进制补ä¸äº§ç”Ÿäº†ä¸æ£ç¡®çš„结果(预期 %s,得到 %s)" +msgstr "到 '%s' 的二进制补ä¸äº§ç”Ÿäº†ä¸æ£ç¡®çš„结果(应为 %s,å´ä¸º %s)" -#: builtin/apply.c:2939 +#: builtin/apply.c:2956 #, c-format msgid "patch failed: %s:%ld" msgstr "打补ä¸å¤±è´¥ï¼š%s:%ld" -#: builtin/apply.c:3061 +#: builtin/apply.c:3078 #, c-format msgid "cannot checkout %s" msgstr "ä¸èƒ½æ£€å‡º %s" -#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159 +#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176 #, c-format msgid "read of %s failed" msgstr "è¯»å– %s 失败" -#: builtin/apply.c:3139 builtin/apply.c:3361 +#: builtin/apply.c:3156 builtin/apply.c:3378 #, c-format msgid "path %s has been renamed/deleted" msgstr "路径 %s å·²ç»è¢«é‡å‘½å/åˆ é™¤" -#: builtin/apply.c:3220 builtin/apply.c:3375 +#: builtin/apply.c:3237 builtin/apply.c:3392 #, c-format msgid "%s: does not exist in index" msgstr "%s:ä¸å˜åœ¨äºŽç´¢å¼•ä¸" -#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389 +#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406 #, c-format msgid "%s: %s" msgstr "%s:%s" -#: builtin/apply.c:3229 builtin/apply.c:3383 +#: builtin/apply.c:3246 builtin/apply.c:3400 #, c-format msgid "%s: does not match index" msgstr "%s:和索引ä¸åŒ¹é…" -#: builtin/apply.c:3331 +#: builtin/apply.c:3348 msgid "removal patch leaves file contents" msgstr "移除补ä¸ä»ç•™ä¸‹äº†æ–‡ä»¶å†…容" -#: builtin/apply.c:3400 +#: builtin/apply.c:3417 #, c-format msgid "%s: wrong type" msgstr "%s:错误类型" -#: builtin/apply.c:3402 +#: builtin/apply.c:3419 #, c-format msgid "%s has type %o, expected %o" -msgstr "%s 的类型是 %o,预期是 %o" +msgstr "%s 的类型是 %o,应为 %o" -#: builtin/apply.c:3503 +#: builtin/apply.c:3520 #, c-format msgid "%s: already exists in index" msgstr "%s:已ç»å˜åœ¨äºŽç´¢å¼•ä¸" -#: builtin/apply.c:3506 +#: builtin/apply.c:3523 #, c-format msgid "%s: already exists in working directory" msgstr "%s:已ç»å˜åœ¨äºŽå·¥ä½œåŒºä¸" -#: builtin/apply.c:3526 +#: builtin/apply.c:3543 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "%2$s 的新模å¼ï¼ˆ%1$o)和旧模å¼ï¼ˆ%3$o)ä¸åŒ¹é…" -#: builtin/apply.c:3531 +#: builtin/apply.c:3548 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "%2$s 的新模å¼ï¼ˆ%1$o)和 %4$s 的旧模å¼ï¼ˆ%3$o)ä¸åŒ¹é…" -#: builtin/apply.c:3539 +#: builtin/apply.c:3556 #, c-format msgid "%s: patch does not apply" msgstr "%s:补ä¸æœªåº”用" -#: builtin/apply.c:3552 +#: builtin/apply.c:3569 #, c-format msgid "Checking patch %s..." msgstr "æ£€æŸ¥è¡¥ä¸ %s..." -#: builtin/apply.c:3607 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 "对路径 '%s' çš„ make_cache_entry æ“作失败" -#: builtin/apply.c:3750 +#: builtin/apply.c:3767 #, c-format msgid "unable to remove %s from index" msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸ç§»é™¤ %s" -#: builtin/apply.c:3778 +#: builtin/apply.c:3795 #, c-format msgid "corrupt patch for subproject %s" msgstr "å项目 %s æŸåçš„è¡¥ä¸" -#: builtin/apply.c:3782 +#: builtin/apply.c:3799 #, c-format msgid "unable to stat newly created file '%s'" msgstr "ä¸èƒ½æžšä¸¾æ–°å»ºæ–‡ä»¶ '%s' 的状æ€" -#: builtin/apply.c:3787 +#: builtin/apply.c:3804 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "ä¸èƒ½ä¸ºæ–°å»ºæ–‡ä»¶ %s 创建åŽç«¯å˜å‚¨" -#: builtin/apply.c:3790 builtin/apply.c:3898 +#: builtin/apply.c:3807 builtin/apply.c:3915 #, c-format msgid "unable to add cache entry for %s" msgstr "æ— æ³•ä¸º %s æ·»åŠ ç¼“å˜æ¡ç›®" -#: builtin/apply.c:3823 +#: builtin/apply.c:3840 #, c-format msgid "closing file '%s'" msgstr "å…³é—文件 '%s'" -#: builtin/apply.c:3872 +#: builtin/apply.c:3889 #, c-format msgid "unable to write file '%s' mode %o" msgstr "ä¸èƒ½å†™æ–‡ä»¶ '%s' æƒé™ %o" -#: builtin/apply.c:3959 +#: builtin/apply.c:3976 #, c-format msgid "Applied patch %s cleanly." msgstr "æˆåŠŸåº”ç”¨è¡¥ä¸ %s。" -#: builtin/apply.c:3967 +#: builtin/apply.c:3984 msgid "internal error" msgstr "内部错误" #. Say this even without --verbose -#: builtin/apply.c:3970 +#: builtin/apply.c:3987 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." -msgstr[0] "åº”ç”¨è¡¥ä¸ %%s æ—¶ %d 个被拒ç»..." -msgstr[1] "åº”ç”¨è¡¥ä¸ %%s æ—¶ %d 个被拒ç»..." +msgstr[0] "应用 %%s 个补ä¸ï¼Œå…¶ä¸ %d 个被拒ç»..." +msgstr[1] "应用 %%s 个补ä¸ï¼Œå…¶ä¸ %d 个被拒ç»..." -#: builtin/apply.c:3980 +#: builtin/apply.c:3997 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "æˆªçŸ .rej 文件å为 %.*s.rej" -#: builtin/apply.c:4001 +#: builtin/apply.c:4018 #, c-format msgid "Hunk #%d applied cleanly." msgstr "第 #%d 个片段æˆåŠŸåº”用。" -#: builtin/apply.c:4004 +#: builtin/apply.c:4021 #, c-format msgid "Rejected hunk #%d." msgstr "æ‹’ç»ç¬¬ #%d 个片段。" -#: builtin/apply.c:4154 +#: builtin/apply.c:4171 msgid "unrecognized input" msgstr "未能识别的输入" -#: builtin/apply.c:4165 +#: builtin/apply.c:4182 msgid "unable to read index file" msgstr "æ— æ³•è¯»å–索引文件" -#: builtin/apply.c:4284 builtin/apply.c:4287 +#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91 +#: builtin/fetch.c:63 msgid "path" msgstr "路径" -#: builtin/apply.c:4285 +#: builtin/apply.c:4302 msgid "don't apply changes matching the given path" msgstr "ä¸è¦åº”用与给出路径å‘匹é…çš„å˜æ›´" -#: builtin/apply.c:4288 +#: builtin/apply.c:4305 msgid "apply changes matching the given path" msgstr "应用与给出路径å‘匹é…çš„å˜æ›´" -#: builtin/apply.c:4290 +#: builtin/apply.c:4307 msgid "num" msgstr "æ•°å—" -#: builtin/apply.c:4291 +#: builtin/apply.c:4308 msgid "remove <num> leading slashes from traditional diff paths" msgstr "ä»Žä¼ ç»Ÿçš„ diff 路径ä¸ç§»é™¤ <æ•°å—> 个å‰å¯¼è·¯å¾„" -#: builtin/apply.c:4294 +#: builtin/apply.c:4311 msgid "ignore additions made by the patch" msgstr "忽略补ä¸ä¸çš„æ·»åŠ çš„æ–‡ä»¶" -#: builtin/apply.c:4296 +#: builtin/apply.c:4313 msgid "instead of applying the patch, output diffstat for the input" msgstr "ä¸åº”用补ä¸ï¼Œè€Œæ˜¯æ˜¾ç¤ºè¾“入的差异统计(diffstat)" -#: builtin/apply.c:4300 -msgid "shows number of added and deleted lines in decimal notation" +#: builtin/apply.c:4317 +#, fuzzy +msgid "show number of added and deleted lines in decimal notation" msgstr "以数å—æ–¹å¼æ˜¾ç¤ºæ·»åŠ æˆ–åˆ é™¤è¡Œçš„æ•°é‡" -#: builtin/apply.c:4302 +#: builtin/apply.c:4319 msgid "instead of applying the patch, output a summary for the input" msgstr "ä¸åº”用补ä¸ï¼Œè€Œæ˜¯æ˜¾ç¤ºè¾“入的概è¦" -#: builtin/apply.c:4304 +#: builtin/apply.c:4321 msgid "instead of applying the patch, see if the patch is applicable" msgstr "ä¸åº”用补ä¸ï¼Œè€Œæ˜¯æŸ¥çœ‹è¡¥ä¸æ˜¯å¦å¯åº”用" -#: builtin/apply.c:4306 +#: builtin/apply.c:4323 msgid "make sure the patch is applicable to the current index" msgstr "确认补ä¸å¯ä»¥åº”用到当å‰ç´¢å¼•" -#: builtin/apply.c:4308 +#: builtin/apply.c:4325 msgid "apply a patch without touching the working tree" msgstr "应用补ä¸è€Œä¸ä¿®æ”¹å·¥ä½œåŒº" -#: builtin/apply.c:4310 +#: builtin/apply.c:4327 msgid "also apply the patch (use with --stat/--summary/--check)" -msgstr "还应用æ¤è¡¥ä¸ï¼ˆä½¿ç”¨ --stat/--summary/--check å‚数)" +msgstr "还应用æ¤è¡¥ä¸ï¼ˆä¸Ž --stat/--summary/--check 选项åŒæ—¶ä½¿ç”¨ï¼‰" -#: builtin/apply.c:4312 +#: builtin/apply.c:4329 msgid "attempt three-way merge if a patch does not apply" msgstr "如果一个补ä¸ä¸èƒ½åº”用则å°è¯•ä¸‰è·¯åˆå¹¶" -#: builtin/apply.c:4314 +#: builtin/apply.c:4331 msgid "build a temporary index based on embedded index information" msgstr "创建一个临时索引基于嵌入的索引信æ¯" -#: builtin/apply.c:4316 +#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460 msgid "paths are separated with NUL character" msgstr "路径以 NUL å—符分隔" -#: builtin/apply.c:4319 +#: builtin/apply.c:4336 msgid "ensure at least <n> lines of context match" msgstr "ç¡®ä¿è‡³å°‘åŒ¹é… <n> 行上下文" -#: builtin/apply.c:4320 +#: builtin/apply.c:4337 msgid "action" msgstr "动作" -#: builtin/apply.c:4321 +#: builtin/apply.c:4338 msgid "detect new or modified lines that have whitespace errors" msgstr "检查新增和修改的行ä¸é—´çš„空白å—符滥用" -#: builtin/apply.c:4324 builtin/apply.c:4327 +#: builtin/apply.c:4341 builtin/apply.c:4344 msgid "ignore changes in whitespace when finding context" msgstr "查找上下文时忽略空白å—符的å˜æ›´" -#: builtin/apply.c:4330 +#: builtin/apply.c:4347 msgid "apply the patch in reverse" msgstr "åå‘应用补ä¸" -#: builtin/apply.c:4332 +#: builtin/apply.c:4349 msgid "don't expect at least one line of context" msgstr "æ— éœ€è‡³å°‘ä¸€è¡Œä¸Šä¸‹æ–‡" -#: builtin/apply.c:4334 +#: builtin/apply.c:4351 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "将拒ç»çš„è¡¥ä¸ç‰‡æ®µä¿å˜åœ¨å¯¹åº”çš„ *.rej 文件ä¸" -#: builtin/apply.c:4336 +#: builtin/apply.c:4353 msgid "allow overlapping hunks" msgstr "å…许é‡å çš„è¡¥ä¸ç‰‡æ®µ" -#: builtin/apply.c:4337 -msgid "be verbose" -msgstr "冗长输出" - -#: builtin/apply.c:4339 +#: builtin/apply.c:4356 msgid "tolerate incorrectly detected missing new-line at the end of file" -msgstr "宽容ä¸æ£ç¡®çš„文件末尾æ¢è¡Œç¬¦" +msgstr "å…许ä¸æ£ç¡®çš„文件末尾æ¢è¡Œç¬¦" -#: builtin/apply.c:4342 +#: builtin/apply.c:4359 msgid "do not trust the line counts in the hunk headers" msgstr "ä¸ä¿¡ä»»è¡¥ä¸ç‰‡æ®µçš„头信æ¯ä¸çš„è¡Œå·" -#: builtin/apply.c:4344 +#: builtin/apply.c:4361 msgid "root" msgstr "æ ¹ç›®å½•" -#: builtin/apply.c:4345 +#: builtin/apply.c:4362 msgid "prepend <root> to all filenames" msgstr "为所有文件åå‰æ·»åŠ <æ ¹ç›®å½•>" -#: builtin/apply.c:4367 +#: builtin/apply.c:4384 msgid "--3way outside a repository" msgstr "--3way 在一个版本库之外" -#: builtin/apply.c:4375 +#: builtin/apply.c:4392 msgid "--index outside a repository" msgstr "--index 在一个版本库之外" -#: builtin/apply.c:4378 +#: builtin/apply.c:4395 msgid "--cached outside a repository" msgstr "--cached 在一个版本库之外" -#: builtin/apply.c:4394 +#: builtin/apply.c:4411 #, c-format msgid "can't open patch '%s'" msgstr "ä¸èƒ½æ‰“å¼€è¡¥ä¸ '%s'" -#: builtin/apply.c:4408 +#: builtin/apply.c:4425 #, c-format msgid "squelched %d whitespace error" msgid_plural "squelched %d whitespace errors" msgstr[0] "抑制下ä»æœ‰ %d 个空白å—符误用" msgstr[1] "抑制下ä»æœ‰ %d 个空白å—符误用" -#: builtin/apply.c:4414 builtin/apply.c:4424 +#: builtin/apply.c:4431 builtin/apply.c:4441 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -1895,7 +2047,7 @@ msgstr "ä¸èƒ½åˆ›å»ºå½’档文件 '%s'" #: builtin/archive.c:20 msgid "could not redirect output" -msgstr "ä¸èƒ½è¾“出é‡å®šå‘" +msgstr "ä¸èƒ½é‡å®šå‘输出" #: builtin/archive.c:37 msgid "git archive: Remote with no URL" @@ -1903,7 +2055,7 @@ msgstr "git archive:未æ供远程URL" #: builtin/archive.c:58 msgid "git archive: expected ACK/NAK, got EOF" -msgstr "git archive:期待ACK/NACK,å´å¾—到EOF" +msgstr "git archive:应为ACK/NACK,å´å¾—到EOF" #: builtin/archive.c:63 #, c-format @@ -1921,10 +2073,142 @@ msgstr "git archive:å议错误" #: builtin/archive.c:71 msgid "git archive: expected a flush" -msgstr "git archive:预期一个刷新" +msgstr "git archive:应为刷新" + +#: builtin/bisect--helper.c:7 +msgid "git bisect--helper --next-all [--no-checkout]" +msgstr "" + +#: builtin/bisect--helper.c:17 +msgid "perform 'git bisect next'" +msgstr "" + +#: builtin/bisect--helper.c:19 +msgid "update BISECT_HEAD instead of checking out the current commit" +msgstr "" + +#: builtin/blame.c:25 +msgid "git blame [options] [rev-opts] [rev] [--] file" +msgstr "" + +#: builtin/blame.c:30 builtin/shortlog.c:15 +msgid "[rev-opts] are documented in git-rev-list(1)" +msgstr "" + +#: builtin/blame.c:2316 +msgid "Show blame entries as we find them, incrementally" +msgstr "" + +#: builtin/blame.c:2317 +msgid "Show blank SHA-1 for boundary commits (Default: off)" +msgstr "" + +#: builtin/blame.c:2318 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "" + +#: builtin/blame.c:2319 +#, fuzzy +msgid "Show work cost statistics" +msgstr "显示工作区状æ€" + +#: builtin/blame.c:2320 +msgid "Show output score for blame entries" +msgstr "" + +#: builtin/blame.c:2321 +msgid "Show original filename (Default: auto)" +msgstr "" + +#: builtin/blame.c:2322 +msgid "Show original linenumber (Default: off)" +msgstr "" + +#: builtin/blame.c:2323 +msgid "Show in a format designed for machine consumption" +msgstr "" + +#: builtin/blame.c:2324 +msgid "Show porcelain format with per-line commit information" +msgstr "" + +#: builtin/blame.c:2325 +msgid "Use the same output mode as git-annotate (Default: off)" +msgstr "" + +#: builtin/blame.c:2326 +msgid "Show raw timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2327 +msgid "Show long commit SHA1 (Default: off)" +msgstr "" + +#: builtin/blame.c:2328 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2329 +msgid "Show author email instead of name (Default: off)" +msgstr "" + +#: builtin/blame.c:2330 +msgid "Ignore whitespace differences" +msgstr "" + +#: builtin/blame.c:2331 +msgid "Spend extra cycles to find better match" +msgstr "" + +#: builtin/blame.c:2332 +msgid "Use revisions from <file> instead of calling git-rev-list" +msgstr "" + +#: builtin/blame.c:2333 +#, fuzzy +msgid "Use <file>'s contents as the final image" +msgstr "æ·»åŠ æ–‡ä»¶å†…å®¹è‡³ç´¢å¼•" + +#: builtin/blame.c:2334 builtin/blame.c:2335 +msgid "score" +msgstr "" + +#: builtin/blame.c:2334 +msgid "Find line copies within and across files" +msgstr "" + +#: builtin/blame.c:2335 +msgid "Find line movements within and across files" +msgstr "" + +#: builtin/blame.c:2336 +#, fuzzy +msgid "n,m" +msgstr "æ•°å—" + +#: builtin/blame.c:2336 +msgid "Process only line range n,m, counting from 1" +msgstr "" + +#: builtin/branch.c:23 +msgid "git branch [options] [-r | -a] [--merged | --no-merged]" +msgstr "" + +#: builtin/branch.c:24 +msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]" +msgstr "" + +#: builtin/branch.c:25 +#, fuzzy +msgid "git branch [options] [-r] (-d | -D) <branchname>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/branch.c:26 +msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>" +msgstr "" # 译者:ä¿æŒåŽŸæ¢è¡Œæ ¼å¼ï¼Œåœ¨è¾“出时 %s 的替代内容会让å—符串å˜é•¿ -#: builtin/branch.c:144 +#: builtin/branch.c:145 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" @@ -1934,7 +2218,7 @@ msgstr "" " '%s',但未åˆå¹¶åˆ° HEAD。" # 译者:ä¿æŒåŽŸæ¢è¡Œæ ¼å¼ï¼Œåœ¨è¾“出时 %s 的替代内容会让å—符串å˜é•¿ -#: builtin/branch.c:148 +#: builtin/branch.c:149 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" @@ -1943,35 +2227,35 @@ msgstr "" "å¹¶æœªåˆ é™¤åˆ†æ”¯ '%s', 虽然它已ç»åˆå¹¶åˆ° HEAD,\n" " 然而å´å°šæœªè¢«åˆå¹¶åˆ°åˆ†æ”¯ '%s' 。" -#: builtin/branch.c:180 +#: builtin/branch.c:181 msgid "cannot use -a with -d" msgstr "ä¸èƒ½å°† -a å’Œ -d åŒæ—¶ä½¿ç”¨" -#: builtin/branch.c:186 +#: builtin/branch.c:187 msgid "Couldn't look up commit object for HEAD" msgstr "æ— æ³•æŸ¥è¯¢ HEAD 指å‘çš„æ交对象" -#: builtin/branch.c:191 +#: builtin/branch.c:192 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "æ— æ³•åˆ é™¤æ‚¨å½“å‰æ‰€åœ¨çš„分支 '%s'。" -#: builtin/branch.c:202 +#: builtin/branch.c:203 #, c-format msgid "remote branch '%s' not found." msgstr "远程分支 '%s' 未å‘现。" -#: builtin/branch.c:203 +#: builtin/branch.c:204 #, c-format msgid "branch '%s' not found." msgstr "分支 '%s' 未å‘现。" -#: builtin/branch.c:210 +#: builtin/branch.c:211 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "æ— æ³•æŸ¥è¯¢ '%s' 指å‘çš„æ交对象" -#: builtin/branch.c:216 +#: builtin/branch.c:217 #, c-format msgid "" "The branch '%s' is not fully merged.\n" @@ -1980,126 +2264,258 @@ msgstr "" "分支 '%s' 没有完全åˆå¹¶ã€‚\n" "如果您确认è¦åˆ 除它,执行 'git branch -D %s'。" -#: builtin/branch.c:225 +#: builtin/branch.c:226 #, c-format msgid "Error deleting remote branch '%s'" msgstr "åˆ é™¤è¿œç¨‹åˆ†æ”¯ '%s' 时出错" -#: builtin/branch.c:226 +#: builtin/branch.c:227 #, c-format msgid "Error deleting branch '%s'" msgstr "åˆ é™¤åˆ†æ”¯ '%s' 时出错" -#: builtin/branch.c:233 +#: builtin/branch.c:234 #, c-format msgid "Deleted remote branch %s (was %s).\n" msgstr "å·²åˆ é™¤è¿œç¨‹åˆ†æ”¯ %s(曾为 %s)。\n" -#: builtin/branch.c:234 +#: builtin/branch.c:235 #, c-format msgid "Deleted branch %s (was %s).\n" msgstr "å·²åˆ é™¤åˆ†æ”¯ %s(曾为 %s)。\n" -#: builtin/branch.c:239 +#: builtin/branch.c:240 msgid "Update of config-file failed" msgstr "æ— æ³•æ›´æ–° config 文件" -#: builtin/branch.c:337 +#: builtin/branch.c:338 #, c-format msgid "branch '%s' does not point at a commit" msgstr "分支 '%s' 未指å‘一个æ交" -#: builtin/branch.c:409 +#: builtin/branch.c:410 #, c-format msgid "[%s: behind %d]" msgstr "[%s:è½åŽ %d]" -#: builtin/branch.c:411 +#: builtin/branch.c:412 #, c-format msgid "[behind %d]" msgstr "[è½åŽ %d]" -#: builtin/branch.c:415 +#: builtin/branch.c:416 #, c-format msgid "[%s: ahead %d]" msgstr "[%s:领先 %d]" -#: builtin/branch.c:417 +#: builtin/branch.c:418 #, c-format msgid "[ahead %d]" msgstr "[领先 %d]" -#: builtin/branch.c:420 +#: builtin/branch.c:421 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s:领先 %d,è½åŽ %d]" -#: builtin/branch.c:423 +#: builtin/branch.c:424 #, c-format msgid "[ahead %d, behind %d]" msgstr "[领先 %d,è½åŽ %d]" -#: builtin/branch.c:535 +#: builtin/branch.c:537 msgid "(no branch)" msgstr "(éžåˆ†æ”¯ï¼‰" -#: builtin/branch.c:600 +#: builtin/branch.c:602 msgid "some refs could not be read" msgstr "一些引用ä¸èƒ½è¯»å–" -#: builtin/branch.c:613 +#: builtin/branch.c:615 msgid "cannot rename the current branch while not on any." msgstr "æ— æ³•é‡å‘½å当å‰åˆ†æ”¯å› 为ä¸å¤„于任何分支上。" -#: builtin/branch.c:623 +#: builtin/branch.c:625 #, c-format msgid "Invalid branch name: '%s'" msgstr "æ— æ•ˆçš„åˆ†æ”¯å:'%s'" -#: builtin/branch.c:638 +#: builtin/branch.c:640 msgid "Branch rename failed" msgstr "分支é‡å‘½å失败" -#: builtin/branch.c:642 +#: builtin/branch.c:644 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "é‡å‘½å掉一个错误命å的旧分支 '%s'" -#: builtin/branch.c:646 +#: builtin/branch.c:648 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "分支é‡å‘½å为 %s,但 HEAD 没有更新ï¼" -#: builtin/branch.c:653 +#: builtin/branch.c:655 msgid "Branch is renamed, but update of config-file failed" msgstr "分支被é‡å‘½å,但更新 config 文件失败" -#: builtin/branch.c:668 +#: builtin/branch.c:670 #, c-format msgid "malformed object name %s" msgstr "éžæ³•çš„对象å %s" -#: builtin/branch.c:692 +#: builtin/branch.c:694 #, c-format msgid "could not write branch description template: %s" msgstr "ä¸èƒ½å†™åˆ†æ”¯æ述模版:%s" -#: builtin/branch.c:783 +#: builtin/branch.c:724 +#, fuzzy +msgid "Generic options" +msgstr "æ— æ•ˆé€‰é¡¹ï¼š%s" + +#: builtin/branch.c:726 +msgid "show hash and subject, give twice for upstream branch" +msgstr "" + +#: builtin/branch.c:727 +msgid "suppress informational messages" +msgstr "" + +#: builtin/branch.c:728 +msgid "set up tracking mode (see git-pull(1))" +msgstr "" + +#: builtin/branch.c:730 +msgid "change upstream info" +msgstr "" + +#: builtin/branch.c:734 +#, fuzzy +msgid "use colored output" +msgstr "ä¸èƒ½è¾“出é‡å®šå‘" + +#: builtin/branch.c:735 +#, fuzzy +msgid "act on remote-tracking branches" +msgstr "%s 没有æ¥è‡ª %s 的远程跟踪分支" + +#: 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 +#, fuzzy +msgid "commit" +msgstr "(åæ交)\n" + +#: builtin/branch.c:739 builtin/branch.c:745 +msgid "print only branches that contain the commit" +msgstr "" + +#: builtin/branch.c:751 +msgid "Specific git-branch actions:" +msgstr "" + +#: builtin/branch.c:752 +msgid "list both remote-tracking and local branches" +msgstr "" + +#: builtin/branch.c:754 +msgid "delete fully merged branch" +msgstr "" + +#: builtin/branch.c:755 +msgid "delete branch (even if not merged)" +msgstr "" + +#: builtin/branch.c:756 +msgid "move/rename a branch and its reflog" +msgstr "" + +#: builtin/branch.c:757 +msgid "move/rename a branch, even if target exists" +msgstr "" + +#: builtin/branch.c:758 +#, fuzzy +msgid "list branch names" +msgstr "æ— æ•ˆçš„åˆ†æ”¯å:'%s'" + +#: builtin/branch.c:759 +msgid "create the branch's reflog" +msgstr "" + +#: builtin/branch.c:761 +msgid "edit the description for the branch" +msgstr "" + +#: builtin/branch.c:762 +#, fuzzy +msgid "force creation (when already exists)" +msgstr "远程 %s å·²ç»å˜åœ¨ã€‚" + +#: builtin/branch.c:765 +#, fuzzy +msgid "print only not merged branches" +msgstr "æ— æ³•ç§»é™¤åˆ†æ”¯ %s" + +#: builtin/branch.c:771 +msgid "print only merged branches" +msgstr "" + +#: builtin/branch.c:775 +msgid "list branches in columns" +msgstr "" + +#: builtin/branch.c:788 msgid "Failed to resolve HEAD as a valid ref." msgstr "æ— æ³•å°† HEAD 解æžä¸ºæœ‰æ•ˆå¼•ç”¨ã€‚" -#: builtin/branch.c:788 builtin/clone.c:561 +#: builtin/branch.c:793 builtin/clone.c:561 msgid "HEAD not found below refs/heads!" msgstr "HEAD 没有ä½äºŽ /refs/heads 之下ï¼" -#: builtin/branch.c:808 +#: builtin/branch.c:813 msgid "--column and --verbose are incompatible" msgstr "--column å’Œ --verbose ä¸å…¼å®¹" -#: builtin/branch.c:857 +#: builtin/branch.c:864 +#, fuzzy, c-format +msgid "branch '%s' does not exist" +msgstr "版本库 '%s' ä¸å˜åœ¨" + +#: builtin/branch.c:876 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "" + +#: builtin/branch.c:891 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "'git branch' çš„ -a å’Œ -r 选项带一个分支åå‚数没有æ„义" +#: 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 "" + +#: builtin/branch.c:911 +#, c-format +msgid "" +"\n" +"If you wanted to make '%s' track '%s', do this:\n" +"\n" +msgstr "" + +#: builtin/branch.c:912 +#, fuzzy, c-format +msgid " git branch -d %s\n" +msgstr " HEAD分支:%s" + +#: builtin/branch.c:913 +#, c-format +msgid " git branch --set-upstream-to %s\n" +msgstr "" + #: builtin/bundle.c:47 #, c-format msgid "%s is okay\n" @@ -2113,100 +2529,238 @@ msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥åˆ›å»ºåŒ…。" msgid "Need a repository to unbundle." msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥è§£åŒ…。" -#: 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 "" + +#: builtin/cat-file.c:248 +msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" +msgstr "" + +#: builtin/cat-file.c:266 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "" + +#: builtin/cat-file.c:267 +#, fuzzy +msgid "show object type" +msgstr "å的对象类型。" + +#: builtin/cat-file.c:268 +#, fuzzy +msgid "show object size" +msgstr "å对象 %s" + +#: builtin/cat-file.c:270 +msgid "exit with zero when there's no error" +msgstr "" + +#: builtin/cat-file.c:271 +msgid "pretty-print object's content" +msgstr "" + +#: builtin/cat-file.c:273 +msgid "for blob objects, run textconv on object's content" +msgstr "" + +#: builtin/cat-file.c:275 +msgid "show info and content of objects fed from the standard input" +msgstr "" + +#: builtin/cat-file.c:278 +#, fuzzy +msgid "show info about objects fed from the standard input" +msgstr "ä¸èƒ½ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯" + +#: builtin/check-attr.c:11 +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>" +msgstr "" + +#: builtin/check-attr.c:19 +msgid "report all attributes set on file" +msgstr "" + +#: builtin/check-attr.c:20 +msgid "use .gitattributes only from the index" +msgstr "" + +#: builtin/check-attr.c:21 builtin/hash-object.c:75 +#, fuzzy +msgid "read file names from stdin" +msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" + +#: builtin/check-attr.c:23 +#, fuzzy +msgid "input paths are terminated by a null character" +msgstr "路径以 NUL å—符分隔" + +#: builtin/checkout-index.c:126 +msgid "git checkout-index [options] [--] [<file>...]" +msgstr "" + +#: builtin/checkout-index.c:187 +msgid "check out all files in the index" +msgstr "" + +#: builtin/checkout-index.c:188 +msgid "force overwrite of existing files" +msgstr "" + +#: builtin/checkout-index.c:190 +msgid "no warning for existing files and files not in index" +msgstr "" + +#: builtin/checkout-index.c:192 +#, fuzzy +msgid "don't checkout new files" +msgstr "ä¸èƒ½æ£€å‡º %s" + +#: builtin/checkout-index.c:194 +#, fuzzy +msgid "update stat information in the index file" +msgstr "æ— æ³•å†™æ–°çš„ç´¢å¼•æ–‡ä»¶" + +#: builtin/checkout-index.c:200 +#, fuzzy +msgid "read list of paths from the standard input" +msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" + +#: builtin/checkout-index.c:202 +msgid "write the content to temporary files" +msgstr "" + +#: builtin/checkout-index.c:203 builtin/column.c:30 +msgid "string" +msgstr "" + +#: builtin/checkout-index.c:204 +msgid "when creating files, prepend <string>" +msgstr "" + +#: builtin/checkout-index.c:207 +msgid "copy out the files from named stage" +msgstr "" + +#: builtin/checkout.c:25 +#, fuzzy +msgid "git checkout [options] <branch>" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/checkout.c:26 +#, fuzzy +msgid "git checkout [options] [<branch>] -- <file>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have our version" msgstr "路径 '%s' 没有我们的版本" -#: 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 "路径 '%s' 没有他们的版本" -#: builtin/checkout.c:132 +#: builtin/checkout.c:134 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "路径 '%s' 没有全部必须的版本" -#: builtin/checkout.c:176 +#: builtin/checkout.c:178 #, c-format msgid "path '%s' does not have necessary versions" msgstr "路径 '%s' 没有必须的版本" -#: builtin/checkout.c:193 +#: builtin/checkout.c:195 #, c-format msgid "path '%s': cannot merge" msgstr "path '%s'ï¼šæ— æ³•åˆå¹¶" -#: builtin/checkout.c:210 +#: builtin/checkout.c:212 #, c-format msgid "Unable to add merge result for '%s'" msgstr "æ— æ³•ä¸º '%s' æ·»åŠ åˆå¹¶ç»“æžœ" -#: builtin/checkout.c:235 builtin/checkout.c:393 +#: builtin/checkout.c:236 builtin/checkout.c:239 builtin/checkout.c:242 +#: builtin/checkout.c:245 +#, fuzzy, c-format +msgid "'%s' cannot be used with updating paths" +msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" + +#: builtin/checkout.c:248 builtin/checkout.c:251 +#, fuzzy, c-format +msgid "'%s' cannot be used with %s" +msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" + +#: builtin/checkout.c:254 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "" + +#: builtin/checkout.c:265 builtin/checkout.c:426 msgid "corrupt index file" msgstr "æŸå的索引文件" -#: builtin/checkout.c:265 builtin/checkout.c:272 +#: builtin/checkout.c:295 builtin/checkout.c:302 #, c-format msgid "path '%s' is unmerged" msgstr "路径 '%s' 未åˆå¹¶" -#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586 -#: builtin/merge.c:812 +#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586 +#: builtin/merge.c:811 msgid "unable to write new index file" msgstr "æ— æ³•å†™æ–°çš„ç´¢å¼•æ–‡ä»¶" -#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "diff_setup_done 失败" - -#: builtin/checkout.c:415 +#: builtin/checkout.c:448 msgid "you need to resolve your current index first" msgstr "您需è¦å…ˆè§£å†³å½“å‰ç´¢å¼•çš„冲çª" -#: builtin/checkout.c:534 +#: builtin/checkout.c:569 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "ä¸èƒ½å¯¹ '%s' 执行 reflog æ“作\n" -#: builtin/checkout.c:567 +#: builtin/checkout.c:602 msgid "HEAD is now at" msgstr "HEAD ç›®å‰ä½äºŽ" -#: builtin/checkout.c:574 +#: builtin/checkout.c:609 #, c-format msgid "Reset branch '%s'\n" msgstr "é‡ç½®åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:577 +#: builtin/checkout.c:612 #, c-format msgid "Already on '%s'\n" msgstr "å·²ç»ä½äºŽ '%s'\n" -#: builtin/checkout.c:581 +#: builtin/checkout.c:616 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "切æ¢å¹¶é‡ç½®åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:583 +#: builtin/checkout.c:618 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "切æ¢åˆ°ä¸€ä¸ªæ–°åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:585 +#: builtin/checkout.c:620 #, c-format msgid "Switched to branch '%s'\n" msgstr "切æ¢åˆ°åˆ†æ”¯ '%s'\n" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/checkout.c:641 +#: builtin/checkout.c:676 #, c-format msgid " ... and %d more.\n" msgstr " ... åŠå…¶å®ƒ %d 个。\n" #. The singular version -#: builtin/checkout.c:647 +#: builtin/checkout.c:682 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -2227,7 +2781,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:665 +#: 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,101 +2796,197 @@ msgstr "" " git branch new_branch_name %s\n" "\n" -#: builtin/checkout.c:695 +#: builtin/checkout.c:730 msgid "internal error in revision walk" msgstr "在版本é历时é‡åˆ°å†…部错误" -#: builtin/checkout.c:699 +#: builtin/checkout.c:734 msgid "Previous HEAD position was" msgstr "之å‰çš„ HEAD ä½ç½®æ˜¯" -#: builtin/checkout.c:725 builtin/checkout.c:920 +#: builtin/checkout.c:761 builtin/checkout.c:950 msgid "You are on a branch yet to be born" msgstr "您ä½äºŽä¸€ä¸ªå°šæœªåˆå§‹åŒ–的分支" #. case (1) -#: builtin/checkout.c:856 +#: builtin/checkout.c:886 #, c-format msgid "invalid reference: %s" msgstr "æ— æ•ˆå¼•ç”¨ï¼š%s" #. case (1): want a tree -#: builtin/checkout.c:895 +#: builtin/checkout.c:925 #, c-format msgid "reference is not a tree: %s" msgstr "引用ä¸æ˜¯ä¸€ä¸ªæ ‘:%s" -#: builtin/checkout.c:977 -msgid "-B cannot be used with -b" -msgstr "-B ä¸èƒ½å’Œ -b åŒæ—¶ä½¿ç”¨" +#: builtin/checkout.c:961 +#, fuzzy +msgid "paths cannot be used with switching branches" +msgstr "--ours/--theirs 和切æ¢åˆ†æ”¯ä¸å…¼å®¹ã€‚" -#: builtin/checkout.c:986 -msgid "--patch is incompatible with all other options" -msgstr "--patch 选项和其他选项ä¸å…¼å®¹" +#: builtin/checkout.c:964 builtin/checkout.c:968 +#, fuzzy, c-format +msgid "'%s' cannot be used with switching branches" +msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:989 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "--detach ä¸èƒ½å’Œ -b/-B/--orphan åŒæ—¶ä½¿ç”¨" +#: builtin/checkout.c:972 builtin/checkout.c:975 builtin/checkout.c:980 +#: builtin/checkout.c:983 +#, fuzzy, c-format +msgid "'%s' cannot be used with '%s'" +msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:991 -msgid "--detach cannot be used with -t" -msgstr "--detach ä¸èƒ½å’Œ -t åŒæ—¶ä½¿ç”¨" +#: builtin/checkout.c:988 +#, fuzzy, c-format +msgid "Cannot switch branch to a non-commit '%s'" +msgstr "æ— æ³•åˆ‡æ¢åˆ†æ”¯åˆ°ä¸€ä¸ªéžæ交。" -#: builtin/checkout.c:997 +#: builtin/checkout.c:1009 builtin/gc.c:177 +msgid "suppress progress reporting" +msgstr "" + +#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89 +#: builtin/remote.c:169 builtin/remote.c:171 +#, fuzzy +msgid "branch" +msgstr "ä½äºŽåˆ†æ”¯ " + +#: builtin/checkout.c:1011 +msgid "create and checkout a new branch" +msgstr "" + +#: builtin/checkout.c:1013 +msgid "create/reset and checkout a branch" +msgstr "" + +#: builtin/checkout.c:1014 +#, fuzzy +msgid "create reflog for new branch" +msgstr "列出ã€åˆ›å»ºæˆ–åˆ é™¤åˆ†æ”¯" + +#: builtin/checkout.c:1015 +msgid "detach the HEAD at named commit" +msgstr "" + +#: builtin/checkout.c:1016 +#, fuzzy +msgid "set upstream info for new branch" +msgstr "尚未给分支 '%s' 设置上游" + +#: builtin/checkout.c:1018 +#, fuzzy +msgid "new branch" +msgstr "[新分支]" + +#: builtin/checkout.c:1018 +#, fuzzy +msgid "new unparented branch" +msgstr "没有当å‰åˆ†æ”¯ã€‚" + +#: builtin/checkout.c:1019 +msgid "checkout our version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1021 +msgid "checkout their version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1023 +msgid "force checkout (throw away local modifications)" +msgstr "" + +#: builtin/checkout.c:1024 +msgid "perform a 3-way merge with the new branch" +msgstr "" + +#: builtin/checkout.c:1025 builtin/merge.c:215 +#, fuzzy +msgid "update ignored files (default)" +msgstr "更新文件失败" + +#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241 +msgid "style" +msgstr "" + +#: builtin/checkout.c:1027 +msgid "conflict style (merge or diff3)" +msgstr "" + +#: builtin/checkout.c:1030 +msgid "second guess 'git checkout no-such-branch'" +msgstr "" + +#: builtin/checkout.c:1054 +#, fuzzy +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "-n å’Œ -k 互斥。" + +#: builtin/checkout.c:1071 msgid "--track needs a branch name" msgstr "--track 需è¦ä¸€ä¸ªåˆ†æ”¯å" -#: builtin/checkout.c:1004 +#: builtin/checkout.c:1078 msgid "Missing branch name; try -b" msgstr "缺少分支åï¼›å°è¯• -b" -#: builtin/checkout.c:1010 -msgid "--orphan and -b|-B are mutually exclusive" -msgstr "--orphan å’Œ -b|-B 互斥" - -#: builtin/checkout.c:1012 -msgid "--orphan cannot be used with -t" -msgstr "--orphan ä¸èƒ½å’Œ -t åŒæ—¶ä½¿ç”¨" - -#: builtin/checkout.c:1022 -msgid "git checkout: -f and -m are incompatible" -msgstr "git checkout:-f å’Œ -m ä¸å…¼å®¹" - -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1113 msgid "invalid path specification" msgstr "æ— æ•ˆçš„è·¯å¾„è§„æ ¼" -#: builtin/checkout.c:1064 -#, c-format +#: builtin/checkout.c:1120 +#, fuzzy, 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:更新路径和切æ¢åˆ†æ”¯ä¸å…¼å®¹ã€‚\n" "您是想è¦æ£€å‡º '%s' 但未能将其解æžä¸ºæ交么?" -#: builtin/checkout.c:1066 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "git checkout:更新路径和切æ¢åˆ†æ”¯ä¸å…¼å®¹ã€‚" - -#: builtin/checkout.c:1071 -msgid "git checkout: --detach does not take a path argument" +#: builtin/checkout.c:1125 +#, fuzzy, c-format +msgid "git checkout: --detach does not take a path argument '%s'" msgstr "git checkout:--detach ä¸è·Ÿè·¯å¾„å‚æ•°" -#: builtin/checkout.c:1074 +#: builtin/checkout.c:1129 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" "git checkout:在从索引检出时,--ours/--theirsã€--force å’Œ --merge ä¸å…¼å®¹ã€‚" -#: builtin/checkout.c:1093 -msgid "Cannot switch branch to a non-commit." -msgstr "æ— æ³•åˆ‡æ¢åˆ†æ”¯åˆ°ä¸€ä¸ªéžæ交。" +#: builtin/clean.c:19 +msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +msgstr "" -#: builtin/checkout.c:1096 -msgid "--ours/--theirs is incompatible with switching branches." -msgstr "--ours/--theirs 和切æ¢åˆ†æ”¯ä¸å…¼å®¹ã€‚" +#: builtin/clean.c:51 +msgid "do not print names of files removed" +msgstr "" + +#: builtin/clean.c:53 +msgid "force" +msgstr "" + +#: builtin/clean.c:55 +#, fuzzy +msgid "remove whole directories" +msgstr "两个输出目录?" + +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802 +#: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 +msgid "pattern" +msgstr "" + +#: builtin/clean.c:57 +msgid "add <pattern> to ignore rules" +msgstr "" + +#: builtin/clean.c:58 +msgid "remove ignored files, too" +msgstr "" + +#: builtin/clean.c:60 +msgid "remove only ignored files" +msgstr "" #: builtin/clean.c:78 msgid "-x and -X cannot be used together" @@ -2380,6 +3030,104 @@ msgstr "ä¸ä¼šåˆ 除 %s\n" msgid "Not removing %s\n" msgstr "æœªåˆ é™¤ %s\n" +#: builtin/clone.c:36 +msgid "git clone [options] [--] <repo> [<dir>]" +msgstr "" + +#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212 +#: builtin/push.c:399 +msgid "force progress reporting" +msgstr "" + +#: builtin/clone.c:66 +msgid "don't create a checkout" +msgstr "" + +#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488 +#, fuzzy +msgid "create a bare repository" +msgstr "ä¸æ˜¯ä¸€ä¸ª git 版本库" + +#: builtin/clone.c:72 +msgid "create a mirror repository (implies bare)" +msgstr "" + +#: builtin/clone.c:74 +msgid "to clone from a local repository" +msgstr "" + +#: builtin/clone.c:76 +msgid "don't use local hardlinks, always copy" +msgstr "" + +#: builtin/clone.c:78 +#, fuzzy +msgid "setup as shared repository" +msgstr "ä¸æ˜¯ä¸€ä¸ª git 版本库" + +#: builtin/clone.c:80 builtin/clone.c:82 +msgid "initialize submodules in the clone" +msgstr "" + +#: builtin/clone.c:83 builtin/init-db.c:485 +#, fuzzy +msgid "template-directory" +msgstr "文件/目录" + +#: builtin/clone.c:84 builtin/init-db.c:486 +msgid "directory from which templates will be used" +msgstr "" + +#: builtin/clone.c:86 +msgid "reference repository" +msgstr "" + +#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#, fuzzy +msgid "name" +msgstr "é‡å‘½å" + +#: builtin/clone.c:88 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "" + +#: builtin/clone.c:90 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "" + +#: builtin/clone.c:92 +msgid "path to git-upload-pack on the remote" +msgstr "" + +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747 +msgid "depth" +msgstr "" + +#: builtin/clone.c:94 +msgid "create a shallow clone of that depth" +msgstr "" + +#: builtin/clone.c:96 +msgid "clone only one branch, HEAD or --branch" +msgstr "" + +#: builtin/clone.c:97 builtin/init-db.c:494 +msgid "gitdir" +msgstr "" + +#: builtin/clone.c:98 builtin/init-db.c:495 +msgid "separate git dir from working tree" +msgstr "" + +#: builtin/clone.c:99 +msgid "key=value" +msgstr "" + +#: builtin/clone.c:100 +#, fuzzy +msgid "set config inside the new repository" +msgstr "记录å˜æ›´åˆ°ç‰ˆæœ¬åº“" + #: builtin/clone.c:243 #, c-format msgid "reference repository '%s' is not a local directory." @@ -2390,7 +3138,7 @@ msgstr "引用版本库 '%s' ä¸æ˜¯ä¸€ä¸ªæœ¬åœ°ç›®å½•ã€‚" msgid "failed to create directory '%s'" msgstr "æ— æ³•åˆ›å»ºç›®å½• '%s'" -#: builtin/clone.c:308 builtin/diff.c:75 +#: builtin/clone.c:308 builtin/diff.c:77 #, c-format msgid "failed to stat '%s'" msgstr "æ— æ³•æžšä¸¾ '%s' 状æ€" @@ -2405,11 +3153,6 @@ msgstr "%s å˜åœ¨ä¸”ä¸æ˜¯ä¸€ä¸ªç›®å½•" msgid "failed to stat %s\n" msgstr "æ— æ³•æžšä¸¾ %s 状æ€\n" -#: builtin/clone.c:341 -#, c-format -msgid "failed to unlink '%s'" -msgstr "æ— æ³•åˆ é™¤ '%s'" - #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" @@ -2500,10 +3243,49 @@ msgstr "远程分支 %s 在上游 %s 未å‘现" msgid "You appear to have cloned an empty repository." msgstr "您似乎克隆了一个空版本库。" +#: builtin/column.c:9 +msgid "git column [options]" +msgstr "" + +#: builtin/column.c:26 +msgid "lookup config vars" +msgstr "" + +#: builtin/column.c:27 builtin/column.c:28 +#, fuzzy +msgid "layout to use" +msgstr "本地已过时" + +#: builtin/column.c:29 +msgid "Maximum width" +msgstr "" + +#: builtin/column.c:30 +msgid "Padding space on left border" +msgstr "" + +#: builtin/column.c:31 +msgid "Padding space on right border" +msgstr "" + +#: builtin/column.c:32 +msgid "Padding space between columns" +msgstr "" + #: builtin/column.c:51 msgid "--command must be the first argument" msgstr "--command 必须是第一个å‚æ•°" +#: builtin/commit.c:33 +#, fuzzy +msgid "git commit [options] [--] <filepattern>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/commit.c:38 +#, fuzzy +msgid "git status [options] [--] <filepattern>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + #: builtin/commit.c:43 msgid "" "Your name and email address were configured automatically based\n" @@ -2584,61 +3366,61 @@ msgstr "æ— æ³•è¯»å–索引" msgid "unable to write temporary index file" msgstr "æ— æ³•å†™ä¸´æ—¶ç´¢å¼•æ–‡ä»¶" -#: builtin/commit.c:496 builtin/commit.c:502 +#: builtin/commit.c:510 builtin/commit.c:516 #, c-format msgid "invalid commit: %s" msgstr "æ— æ•ˆçš„æ交:%s" -#: builtin/commit.c:525 +#: builtin/commit.c:539 msgid "malformed --author parameter" msgstr "éžæ³•çš„ --author å‚æ•°" -#: builtin/commit.c:585 +#: builtin/commit.c:600 #, c-format msgid "Malformed ident string: '%s'" msgstr "éžæ³•çš„身份å—符串:'%s'" -#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970 +#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985 #, c-format msgid "could not lookup commit %s" msgstr "ä¸èƒ½æŸ¥è¯¢æ交 %s" -#: builtin/commit.c:635 builtin/shortlog.c:296 +#: builtin/commit.c:650 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" -#: builtin/commit.c:637 +#: builtin/commit.c:652 msgid "could not read log from standard input" msgstr "ä¸èƒ½ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯" -#: builtin/commit.c:641 +#: builtin/commit.c:656 #, c-format msgid "could not read log file '%s'" msgstr "ä¸èƒ½è¯»å–日志文件 '%s'" -#: builtin/commit.c:647 +#: builtin/commit.c:662 msgid "commit has empty message" msgstr "æ交说明为空" -#: builtin/commit.c:663 +#: builtin/commit.c:678 msgid "could not read MERGE_MSG" msgstr "ä¸èƒ½è¯»å– MERGE_MSG" -#: builtin/commit.c:667 +#: builtin/commit.c:682 msgid "could not read SQUASH_MSG" msgstr "ä¸èƒ½è¯»å– SQUASH_MSG" -#: builtin/commit.c:671 +#: builtin/commit.c:686 #, c-format msgid "could not read '%s'" msgstr "ä¸èƒ½è¯»å– '%s'" -#: builtin/commit.c:723 +#: builtin/commit.c:738 msgid "could not write commit template" msgstr "ä¸èƒ½å†™æ交模版" -#: builtin/commit.c:734 +#: builtin/commit.c:749 #, c-format msgid "" "\n" @@ -2652,7 +3434,7 @@ msgstr "" "\t%s\n" "然åŽé‡è¯•ã€‚\n" -#: builtin/commit.c:739 +#: builtin/commit.c:754 #, c-format msgid "" "\n" @@ -2666,7 +3448,7 @@ msgstr "" "\t%s\n" "然åŽé‡è¯•ã€‚\n" -#: builtin/commit.c:751 +#: builtin/commit.c:766 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" @@ -2674,7 +3456,7 @@ msgstr "" "请为您的å˜æ›´è¾“å…¥æ交说明。以 '#' 开始的行将被忽略,而一个空的æ交\n" "说明将会终æ¢æ交。\n" -#: builtin/commit.c:756 +#: builtin/commit.c:771 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" @@ -2684,160 +3466,357 @@ msgstr "" "å¦‚æžœæ‚¨æƒ³è¿™æ ·åšçš„è¯ã€‚而一个空的æ交说明将会终æ¢æ交。\n" # 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: builtin/commit.c:769 +#: builtin/commit.c:784 #, c-format msgid "%sAuthor: %s" msgstr "%s作者: %s" # 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: builtin/commit.c:776 +#: builtin/commit.c:791 #, c-format msgid "%sCommitter: %s" msgstr "%sæ交者: %s" -#: builtin/commit.c:796 +#: builtin/commit.c:811 msgid "Cannot read index" msgstr "æ— æ³•è¯»å–索引" -#: builtin/commit.c:833 +#: builtin/commit.c:848 msgid "Error building trees" msgstr "æ— æ³•åˆ›å»ºæ ‘å¯¹è±¡" -#: builtin/commit.c:848 builtin/tag.c:361 +#: builtin/commit.c:863 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "请使用 -m 或者 -F 选项æä¾›æ交说明。\n" -#: builtin/commit.c:945 +#: builtin/commit.c:960 #, c-format msgid "No existing author found with '%s'" msgstr "æ²¡æœ‰æ‰¾åˆ°åŒ¹é… '%s' 的作者" -#: builtin/commit.c:960 builtin/commit.c:1160 +#: builtin/commit.c:975 builtin/commit.c:1175 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "æ— æ•ˆçš„æœªè¿½è¸ªæ–‡ä»¶å‚æ•° '%s'" -#: builtin/commit.c:1000 +#: builtin/commit.c:1015 msgid "Using both --reset-author and --author does not make sense" msgstr "åŒæ—¶ä½¿ç”¨ --reset-author å’Œ --author 没有æ„义" -#: builtin/commit.c:1011 +#: builtin/commit.c:1026 msgid "You have nothing to amend." msgstr "您没有å¯ä¿®è¡¥çš„æ交。" -#: builtin/commit.c:1014 +#: builtin/commit.c:1029 msgid "You are in the middle of a merge -- cannot amend." msgstr "您æ£å¤„于一个åˆå¹¶è¿‡ç¨‹ä¸ -- æ— æ³•ä¿®è¡¥æ交。" -#: builtin/commit.c:1016 +#: builtin/commit.c:1031 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "您æ£å¤„äºŽä¸€ä¸ªæ‹£é€‰è¿‡ç¨‹ä¸ -- æ— æ³•ä¿®è¡¥æ交。" -#: builtin/commit.c:1019 +#: builtin/commit.c:1034 msgid "Options --squash and --fixup cannot be used together" msgstr "选项 --squash å’Œ --fixup ä¸èƒ½åŒæ—¶ä½¿ç”¨" -#: builtin/commit.c:1029 +#: builtin/commit.c:1044 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "åªèƒ½ç”¨ä¸€ä¸ª -c/-C/-F/--fixup 选项。" -#: builtin/commit.c:1031 +#: builtin/commit.c:1046 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "选项 -m ä¸èƒ½å’Œ -c/-C/-F/--fixup åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/commit.c:1039 +#: builtin/commit.c:1054 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author åªèƒ½å’Œ -Cã€-c 或 --amend åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/commit.c:1056 +#: builtin/commit.c:1071 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "åªèƒ½ç”¨ä¸€ä¸ª --include/--only/--all/--interactive/--patch 选项。" -#: builtin/commit.c:1058 +#: builtin/commit.c:1073 msgid "No paths with --include/--only does not make sense." msgstr "å‚æ•° --include/--only ä¸è·Ÿè·¯å¾„没有æ„义。" -#: builtin/commit.c:1060 +#: builtin/commit.c:1075 msgid "Clever... amending the last one with dirty index." msgstr "èªæ˜Ž... 在索引ä¸å¹²å‡€ä¸‹ä¿®è¡¥æœ€åŽçš„æ交。" -#: builtin/commit.c:1062 +#: builtin/commit.c:1077 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "指定了明确的路径而没有使用 -i 或 -o 选项;认为是 --only paths..." -#: builtin/commit.c:1072 builtin/tag.c:577 +#: builtin/commit.c:1087 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "æ— æ•ˆçš„æ¸…ç†æ¨¡å¼ %s" -#: builtin/commit.c:1077 +#: builtin/commit.c:1092 msgid "Paths with -a does not make sense." msgstr "路径和 -a 选项åŒæ—¶ä½¿ç”¨æ²¡æœ‰æ„义。" -#: builtin/commit.c:1260 +#: builtin/commit.c:1189 builtin/commit.c:1417 +msgid "show status concisely" +msgstr "" + +#: builtin/commit.c:1191 builtin/commit.c:1419 +msgid "show branch information" +msgstr "" + +#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389 +msgid "machine-readable output" +msgstr "" + +#: builtin/commit.c:1196 builtin/commit.c:1423 +msgid "terminate entries with NUL" +msgstr "" + +#: builtin/commit.c:1198 builtin/commit.c:1426 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 +msgid "show untracked files, optional modes: all, normal, no. (Default: all)" +msgstr "" + +#: builtin/commit.c:1202 +msgid "show ignored files" +msgstr "" + +#: builtin/commit.c:1203 parse-options.h:151 +msgid "when" +msgstr "何时" + +#: builtin/commit.c:1204 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "" + +#: builtin/commit.c:1206 +#, fuzzy +msgid "list untracked files in columns" +msgstr "æ— æ•ˆçš„æœªè¿½è¸ªæ–‡ä»¶å‚æ•° '%s'" + +#: builtin/commit.c:1275 msgid "couldn't look up newly created commit" msgstr "æ— æ³•æ‰¾åˆ°æ–°åˆ›å»ºçš„æ交" -#: builtin/commit.c:1262 +#: builtin/commit.c:1277 msgid "could not parse newly created commit" msgstr "ä¸èƒ½è§£æžæ–°åˆ›å»ºçš„æ交" -#: builtin/commit.c:1303 +#: builtin/commit.c:1318 msgid "detached HEAD" msgstr "分离头指针" # 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: builtin/commit.c:1305 +#: builtin/commit.c:1320 msgid " (root-commit)" msgstr "ï¼ˆæ ¹æ交)" -#: builtin/commit.c:1449 +#: builtin/commit.c:1387 +msgid "suppress summary after successful commit" +msgstr "" + +#: builtin/commit.c:1388 +msgid "show diff in commit message template" +msgstr "" + +#: builtin/commit.c:1390 +#, fuzzy +msgid "Commit message options" +msgstr "ä¸èƒ½å¾—到 %s çš„æ交说明" + +#: builtin/commit.c:1391 builtin/tag.c:459 +msgid "read message from file" +msgstr "" + +#: builtin/commit.c:1392 +msgid "author" +msgstr "" + +#: builtin/commit.c:1392 +#, fuzzy +msgid "override author for commit" +msgstr "åˆå¹¶æœªè¿”回æ交" + +#: builtin/commit.c:1393 builtin/gc.c:178 +msgid "date" +msgstr "" + +#: builtin/commit.c:1393 +#, fuzzy +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 +#, fuzzy +msgid "message" +msgstr "æ— tag 说明?" + +#: builtin/commit.c:1394 +#, fuzzy +msgid "commit message" +msgstr "空æ交信æ¯ã€‚" + +#: builtin/commit.c:1395 +msgid "reuse and edit message from specified commit" +msgstr "" + +#: builtin/commit.c:1396 +msgid "reuse message from specified commit" +msgstr "" + +#: builtin/commit.c:1397 +msgid "use autosquash formatted message to fixup specified commit" +msgstr "" + +#: builtin/commit.c:1398 +msgid "use autosquash formatted message to squash specified commit" +msgstr "" + +#: builtin/commit.c:1399 +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 +msgid "add Signed-off-by:" +msgstr "" + +#: builtin/commit.c:1401 +msgid "use specified template file" +msgstr "" + +#: builtin/commit.c:1402 +#, fuzzy +msgid "force edit of commit" +msgstr "åˆå¹¶æœªè¿”回æ交" + +#: builtin/commit.c:1403 +msgid "default" +msgstr "" + +#: builtin/commit.c:1403 builtin/tag.c:462 +msgid "how to strip spaces and #comments from message" +msgstr "" + +#: builtin/commit.c:1404 +#, fuzzy +msgid "include status in commit message template" +msgstr "ä¸èƒ½å†™æ交模版" + +#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463 +msgid "key id" +msgstr "" + +#: builtin/commit.c:1406 builtin/merge.c:214 +msgid "GPG sign commit" +msgstr "" + +#. end commit message options +#: builtin/commit.c:1409 +msgid "Commit contents options" +msgstr "" + +#: builtin/commit.c:1410 +msgid "commit all changed files" +msgstr "" + +#: builtin/commit.c:1411 +msgid "add specified files to index for commit" +msgstr "" + +#: builtin/commit.c:1412 +#, fuzzy +msgid "interactively add files" +msgstr "交互å¼æ·»åŠ 失败" + +#: builtin/commit.c:1413 +#, fuzzy +msgid "interactively add changes" +msgstr "交互å¼æ·»åŠ 失败" + +#: builtin/commit.c:1414 +#, fuzzy +msgid "commit only specified files" +msgstr "æ— æ³•è¿˜åŽŸä¿®æ”¹çš„æ–‡ä»¶" + +#: builtin/commit.c:1415 +msgid "bypass pre-commit hook" +msgstr "" + +#: builtin/commit.c:1416 +#, fuzzy +msgid "show what would be committed" +msgstr "è¦æ交的å˜æ›´ï¼š" + +#: builtin/commit.c:1424 +msgid "amend previous commit" +msgstr "" + +#: builtin/commit.c:1425 +msgid "bypass post-rewrite hook" +msgstr "" + +#: builtin/commit.c:1430 +msgid "ok to record an empty change" +msgstr "" + +#: builtin/commit.c:1433 +msgid "ok to record a change with an empty message" +msgstr "" + +#: builtin/commit.c:1464 msgid "could not parse HEAD commit" msgstr "ä¸èƒ½è§£æž HEAD æ交" -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1502 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "ä¸èƒ½ä¸ºè¯»å…¥æ‰“å¼€ '%s'" -#: builtin/commit.c:1494 +#: builtin/commit.c:1509 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "æŸåçš„ MERGE_HEAD 文件(%s)" -#: builtin/commit.c:1501 +#: builtin/commit.c:1516 msgid "could not read MERGE_MODE" msgstr "ä¸èƒ½è¯»å– MERGE_MODE" -#: builtin/commit.c:1520 +#: builtin/commit.c:1535 #, c-format msgid "could not read commit message: %s" msgstr "ä¸èƒ½è¯»å–æ交说明:%s" -#: builtin/commit.c:1534 +#: builtin/commit.c:1549 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "终æ¢æ交;您未更改æ¥è‡ªæ¨¡ç‰ˆçš„æ交说明。\n" -#: builtin/commit.c:1539 +#: builtin/commit.c:1554 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "终æ¢æäº¤å› ä¸ºæ交说明为空。\n" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "æ— æ³•å†™æ交对象" -#: builtin/commit.c:1575 +#: builtin/commit.c:1590 msgid "cannot lock HEAD ref" msgstr "æ— æ³•é”定 HEAD 引用" -#: builtin/commit.c:1579 +#: builtin/commit.c:1594 msgid "cannot update HEAD ref" msgstr "æ— æ³•æ›´æ–° HEAD 引用" -#: builtin/commit.c:1590 +#: builtin/commit.c:1605 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -2846,6 +3825,138 @@ msgstr "" "ç‰ˆæœ¬åº“å·²æ›´æ–°ï¼Œä½†æ— æ³•å†™ new_index 文件。检查是å¦ç£ç›˜å·²æ»¡\n" "或ç£ç›˜é…é¢å·²è€—尽,然åŽæ‰§è¡Œ \"git reset HEAD\" æ¢å¤ã€‚" +#: builtin/config.c:7 +msgid "git config [options]" +msgstr "" + +#: builtin/config.c:52 +msgid "Config file location" +msgstr "" + +#: builtin/config.c:53 +#, fuzzy +msgid "use global config file" +msgstr "æ— æ³•æ›´æ–° config 文件" + +#: builtin/config.c:54 +msgid "use system config file" +msgstr "" + +#: builtin/config.c:55 +#, fuzzy +msgid "use repository config file" +msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥è§£åŒ…。" + +#: builtin/config.c:56 +#, fuzzy +msgid "use given config file" +msgstr "未预期的文件结æŸ" + +#: builtin/config.c:57 +#, fuzzy +msgid "Action" +msgstr "动作" + +#: builtin/config.c:58 +msgid "get value: name [value-regex]" +msgstr "" + +#: builtin/config.c:59 +msgid "get all values: key [value-regex]" +msgstr "" + +#: builtin/config.c:60 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "" + +#: builtin/config.c:61 +msgid "replace all matching variables: name value [value_regex]" +msgstr "" + +#: builtin/config.c:62 +msgid "add a new variable: name value" +msgstr "" + +#: builtin/config.c:63 +msgid "remove a variable: name [value-regex]" +msgstr "" + +#: builtin/config.c:64 +msgid "remove all matches: name [value-regex]" +msgstr "" + +#: builtin/config.c:65 +msgid "rename section: old-name new-name" +msgstr "" + +#: builtin/config.c:66 +msgid "remove a section: name" +msgstr "" + +#: builtin/config.c:67 +msgid "list all" +msgstr "" + +#: builtin/config.c:68 +msgid "open an editor" +msgstr "" + +#: builtin/config.c:69 builtin/config.c:70 +msgid "slot" +msgstr "" + +#: builtin/config.c:69 +msgid "find the color configured: [default]" +msgstr "" + +#: builtin/config.c:70 +msgid "find the color setting: [stdout-is-tty]" +msgstr "" + +#: builtin/config.c:71 +msgid "Type" +msgstr "" + +#: builtin/config.c:72 +msgid "value is \"true\" or \"false\"" +msgstr "" + +#: builtin/config.c:73 +msgid "value is decimal number" +msgstr "" + +#: builtin/config.c:74 +msgid "value is --bool or --int" +msgstr "" + +#: builtin/config.c:75 +msgid "value is a path (file or directory name)" +msgstr "" + +#: builtin/config.c:76 +msgid "Other" +msgstr "" + +#: builtin/config.c:77 +msgid "terminate values with NUL byte" +msgstr "" + +#: builtin/config.c:78 +msgid "respect include directives on lookup" +msgstr "" + +#: builtin/count-objects.c:69 +msgid "git count-objects [-v]" +msgstr "" + +#: builtin/describe.c:15 +msgid "git describe [options] <committish>*" +msgstr "" + +#: builtin/describe.c:16 +msgid "git describe [options] --dirty" +msgstr "" + #: builtin/describe.c:234 #, c-format msgid "annotated tag %s not available" @@ -2918,6 +4029,52 @@ msgstr "" "å‘现多于 %i 个 tag,列出最近的 %i 个\n" "在 %s 放弃æœç´¢\n" +#: builtin/describe.c:403 +msgid "find the tag that comes after the commit" +msgstr "" + +#: builtin/describe.c:404 +msgid "debug search strategy on stderr" +msgstr "" + +#: builtin/describe.c:405 +msgid "use any ref in .git/refs" +msgstr "" + +#: builtin/describe.c:406 +msgid "use any tag in .git/refs/tags" +msgstr "" + +#: builtin/describe.c:407 +msgid "always use long format" +msgstr "" + +#: builtin/describe.c:410 +#, fuzzy +msgid "only output exact matches" +msgstr "没有 tag å‡†ç¡®åŒ¹é… '%s'" + +#: builtin/describe.c:412 +msgid "consider <n> most recent tags (default: 10)" +msgstr "" + +#: builtin/describe.c:414 +#, fuzzy +msgid "only consider tags matching <pattern>" +msgstr "输出和模å¼åŒ¹é…çš„è¡Œ" + +#: builtin/describe.c:416 builtin/name-rev.c:238 +msgid "show abbreviated commit object as fallback" +msgstr "" + +#: builtin/describe.c:417 +msgid "mark" +msgstr "" + +#: builtin/describe.c:418 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "" + #: builtin/describe.c:436 msgid "--long is incompatible with --abbrev=0" msgstr "--long 与 --abbrev=0 ä¸å…¼å®¹" @@ -2930,111 +4087,237 @@ msgstr "没有å‘现åç§°ï¼Œæ— æ³•æ述任何东西。" msgid "--dirty is incompatible with committishes" msgstr "--dirty ä¸èƒ½ä¸Žæ交åŒæ—¶ä½¿ç”¨" -#: builtin/diff.c:77 +#: builtin/diff.c:79 #, c-format msgid "'%s': not a regular file or symlink" msgstr "'%s':ä¸æ˜¯ä¸€ä¸ªæ£è§„文件或符å·é“¾æŽ¥" -#: builtin/diff.c:220 +#: builtin/diff.c:224 #, c-format msgid "invalid option: %s" msgstr "æ— æ•ˆé€‰é¡¹ï¼š%s" -#: builtin/diff.c:297 +#: builtin/diff.c:301 msgid "Not a git repository" msgstr "ä¸æ˜¯ä¸€ä¸ª git 版本库" -#: builtin/diff.c:341 +#: builtin/diff.c:344 #, c-format msgid "invalid object '%s' given." msgstr "æä¾›äº†æ— æ•ˆå¯¹è±¡ '%s'。" -#: builtin/diff.c:346 +#: builtin/diff.c:349 #, c-format msgid "more than %d trees given: '%s'" msgstr "æ供了超过 %d ä¸ªæ ‘å¯¹è±¡ï¼š'%s'" -#: builtin/diff.c:356 +#: builtin/diff.c:359 #, c-format msgid "more than two blobs given: '%s'" msgstr "æ供了超过两个二进制对象(blob):'%s'" -#: builtin/diff.c:364 +#: builtin/diff.c:367 #, c-format msgid "unhandled object '%s' given." msgstr "æä¾›äº†æ— æ³•å¤„ç†çš„对象 '%s'。" -#: builtin/fetch.c:200 +#: builtin/fast-export.c:22 +msgid "git fast-export [rev-list-opts]" +msgstr "" + +#: builtin/fast-export.c:635 +#, fuzzy +msgid "show progress after <n> objects" +msgstr "显示å„ç§ç±»åž‹çš„对象" + +#: builtin/fast-export.c:637 +msgid "select handling of signed tags" +msgstr "" + +#: builtin/fast-export.c:640 +msgid "select handling of tags that tag filtered objects" +msgstr "" + +#: builtin/fast-export.c:643 +msgid "Dump marks to this file" +msgstr "" + +#: builtin/fast-export.c:645 +msgid "Import marks from this file" +msgstr "" + +#: builtin/fast-export.c:647 +msgid "Fake a tagger when tags lack one" +msgstr "" + +#: builtin/fast-export.c:649 +msgid "Output full tree for each commit" +msgstr "" + +#: builtin/fast-export.c:651 +msgid "Use the done feature to terminate the stream" +msgstr "" + +#: builtin/fast-export.c:652 +msgid "Skip output of blob data" +msgstr "" + +#: builtin/fetch.c:20 +#, fuzzy +msgid "git fetch [<options>] [<repository> [<refspec>...]]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/fetch.c:21 +msgid "git fetch [<options>] <group>" +msgstr "" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" +msgstr "" + +#: builtin/fetch.c:23 +msgid "git fetch --all [<options>]" +msgstr "" + +#: builtin/fetch.c:60 +msgid "fetch from all remotes" +msgstr "" + +#: builtin/fetch.c:62 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "" + +#: builtin/fetch.c:64 +msgid "path to upload pack on remote end" +msgstr "" + +#: builtin/fetch.c:65 +msgid "force overwrite of local branch" +msgstr "" + +#: builtin/fetch.c:67 +msgid "fetch from multiple remotes" +msgstr "" + +#: builtin/fetch.c:69 +#, fuzzy +msgid "fetch all tags and associated objects" +msgstr "更新远程引用和相关的对象" + +#: builtin/fetch.c:71 +msgid "do not fetch all tags (--no-tags)" +msgstr "" + +#: builtin/fetch.c:73 +#, fuzzy +msgid "prune remote-tracking branches no longer on remote" +msgstr "%s 没有æ¥è‡ª %s 的远程跟踪分支" + +#: builtin/fetch.c:74 +msgid "on-demand" +msgstr "" + +#: builtin/fetch.c:75 +msgid "control recursive fetching of submodules" +msgstr "" + +#: builtin/fetch.c:79 +msgid "keep downloaded pack" +msgstr "" + +#: builtin/fetch.c:81 +#, fuzzy +msgid "allow updating of HEAD ref" +msgstr "æ— æ³•æ›´æ–° HEAD 引用" + +#: builtin/fetch.c:84 +msgid "deepen history of shallow clone" +msgstr "" + +#: builtin/fetch.c:85 builtin/log.c:1083 +msgid "dir" +msgstr "" + +#: builtin/fetch.c:86 +#, fuzzy +msgid "prepend this to submodule path output" +msgstr "æ— æ³•é€’å½’è¿›å模组路径 '$sm_path'" + +#: builtin/fetch.c:89 +msgid "default mode for recursion" +msgstr "" + +#: builtin/fetch.c:201 msgid "Couldn't find remote ref HEAD" msgstr "æ— æ³•å‘现远程 HEAD 引用" -#: builtin/fetch.c:253 +#: builtin/fetch.c:254 #, c-format msgid "object %s not found" msgstr "对象 %s 未å‘现" -#: builtin/fetch.c:259 +#: builtin/fetch.c:260 msgid "[up to date]" msgstr "[最新]" -#: builtin/fetch.c:273 +#: builtin/fetch.c:274 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (在当å‰åˆ†æ”¯ä¸‹ä¸èƒ½èŽ·å–)" -#: builtin/fetch.c:274 builtin/fetch.c:360 +#: builtin/fetch.c:275 builtin/fetch.c:361 msgid "[rejected]" msgstr "[已拒ç»]" -#: builtin/fetch.c:285 +#: builtin/fetch.c:286 msgid "[tag update]" msgstr "[tagæ›´æ–°]" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 +#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341 msgid " (unable to update local ref)" msgstr " (ä¸èƒ½æ›´æ–°æœ¬åœ°å¼•ç”¨ï¼‰" -#: builtin/fetch.c:305 +#: builtin/fetch.c:306 msgid "[new tag]" msgstr "[æ–°tag]" -#: builtin/fetch.c:308 +#: builtin/fetch.c:309 msgid "[new branch]" msgstr "[新分支]" -#: builtin/fetch.c:311 +#: builtin/fetch.c:312 msgid "[new ref]" msgstr "[新引用]" -#: builtin/fetch.c:356 +#: builtin/fetch.c:357 msgid "unable to update local ref" msgstr "ä¸èƒ½æ›´æ–°æœ¬åœ°å¼•ç”¨" -#: builtin/fetch.c:356 +#: builtin/fetch.c:357 msgid "forced update" msgstr "强制更新" -#: builtin/fetch.c:362 +#: builtin/fetch.c:363 msgid "(non-fast-forward)" msgstr "(éžå¿«è¿›å¼ï¼‰" -#: builtin/fetch.c:393 builtin/fetch.c:685 +#: builtin/fetch.c:394 builtin/fetch.c:686 #, c-format msgid "cannot open %s: %s\n" msgstr "æ— æ³•æ‰“å¼€ %s:%s\n" -#: builtin/fetch.c:402 +#: builtin/fetch.c:403 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s 未å‘é€æ‰€æœ‰å¿…须的对象\n" -#: builtin/fetch.c:488 +#: builtin/fetch.c:489 #, c-format msgid "From %.*s\n" msgstr "æ¥è‡ª %.*s\n" -#: builtin/fetch.c:499 +#: builtin/fetch.c:500 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -3044,82 +4327,204 @@ msgstr "" " 'git remote prune %s' æ¥åˆ 除旧的ã€æœ‰å†²çªçš„分支" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:549 +#: builtin/fetch.c:550 #, c-format msgid " (%s will become dangling)" msgstr " (%s å°†æˆä¸ºæ‚¬ç©ºçŠ¶æ€ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:550 +#: builtin/fetch.c:551 #, c-format msgid " (%s has become dangling)" msgstr " (%s å·²æˆä¸ºæ‚¬ç©ºçŠ¶æ€ï¼‰" -#: builtin/fetch.c:557 +#: builtin/fetch.c:558 msgid "[deleted]" msgstr "[å·²åˆ é™¤]" -#: builtin/fetch.c:558 builtin/remote.c:1055 +#: builtin/fetch.c:559 builtin/remote.c:1055 msgid "(none)" msgstr "ï¼ˆæ— ï¼‰" -#: builtin/fetch.c:675 +#: builtin/fetch.c:676 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "æ‹’ç»èŽ·å–到éžè£¸ç‰ˆæœ¬åº“的当å‰åˆ†æ”¯ %s" -#: builtin/fetch.c:709 +#: builtin/fetch.c:710 #, c-format msgid "Don't know how to fetch from %s" msgstr "ä¸çŸ¥é“如何从 %s 获å–" -#: builtin/fetch.c:786 +#: builtin/fetch.c:787 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s æ˜¯æ— æ•ˆçš„" -#: builtin/fetch.c:789 +#: builtin/fetch.c:790 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "选项 \"%s\" 为 %s 所忽略\n" -#: builtin/fetch.c:888 +#: builtin/fetch.c:892 #, c-format msgid "Fetching %s\n" msgstr "æ£åœ¨èŽ·å– %s\n" -#: builtin/fetch.c:890 builtin/remote.c:100 +#: builtin/fetch.c:894 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "ä¸èƒ½èŽ·å– %s" -#: builtin/fetch.c:907 +#: builtin/fetch.c:913 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." msgstr "未指定远程版本库。请通过一个URL或远程版本库å指定,用以获å–æ–°æ交。" -#: builtin/fetch.c:927 +#: builtin/fetch.c:933 msgid "You need to specify a tag name." msgstr "您需è¦æŒ‡å®šä¸€ä¸ª tag å称。" -#: builtin/fetch.c:979 +#: builtin/fetch.c:985 msgid "fetch --all does not take a repository argument" msgstr "fetch --all ä¸èƒ½å¸¦ä¸€ä¸ªç‰ˆæœ¬åº“å‚æ•°" -#: builtin/fetch.c:981 +#: builtin/fetch.c:987 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all 带引用表达å¼æ²¡æœ‰ä»»ä½•æ„义" -#: builtin/fetch.c:992 +#: builtin/fetch.c:998 #, c-format msgid "No such remote or remote group: %s" msgstr "æ²¡æœ‰è¿™æ ·çš„è¿œç¨‹æˆ–è¿œç¨‹ç»„ï¼š%s" -#: builtin/fetch.c:1000 +#: builtin/fetch.c:1006 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "获å–组并指定引用表达å¼æ²¡æœ‰æ„义" +#: builtin/fmt-merge-msg.c:13 +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/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 "æ•°å—" + +#: builtin/fmt-merge-msg.c:654 +msgid "populate log with at most <n> entries from shortlog" +msgstr "" + +#: builtin/fmt-merge-msg.c:657 +msgid "alias for --log (deprecated)" +msgstr "" + +#: builtin/fmt-merge-msg.c:660 +msgid "text" +msgstr "" + +#: builtin/fmt-merge-msg.c:661 +msgid "use <text> as start of message" +msgstr "" + +#: builtin/fmt-merge-msg.c:662 +#, fuzzy +msgid "file to read from" +msgstr "ä¸èƒ½è¯» %s" + +#: builtin/for-each-ref.c:979 +#, fuzzy +msgid "git for-each-ref [options] [<pattern>]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/for-each-ref.c:994 +msgid "quote placeholders suitably for shells" +msgstr "" + +#: builtin/for-each-ref.c:996 +msgid "quote placeholders suitably for perl" +msgstr "" + +#: builtin/for-each-ref.c:998 +msgid "quote placeholders suitably for python" +msgstr "" + +#: builtin/for-each-ref.c:1000 +msgid "quote placeholders suitably for tcl" +msgstr "" + +#: builtin/for-each-ref.c:1003 +msgid "show only <n> matched refs" +msgstr "" + +#: builtin/for-each-ref.c:1004 +msgid "format" +msgstr "" + +#: builtin/for-each-ref.c:1004 +msgid "format to use for the output" +msgstr "" + +#: builtin/for-each-ref.c:1005 +msgid "key" +msgstr "" + +#: builtin/for-each-ref.c:1006 +msgid "field name to sort on" +msgstr "" + +#: builtin/fsck.c:608 +#, fuzzy +msgid "git fsck [options] [<object>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/fsck.c:614 +msgid "show unreachable objects" +msgstr "" + +#: builtin/fsck.c:615 +#, fuzzy +msgid "show dangling objects" +msgstr "索引对象ä¸" + +#: builtin/fsck.c:616 +msgid "report tags" +msgstr "" + +#: builtin/fsck.c:617 +msgid "report root nodes" +msgstr "" + +#: builtin/fsck.c:618 +msgid "make index objects head nodes" +msgstr "" + +#: builtin/fsck.c:619 +msgid "make reflogs head nodes (default)" +msgstr "" + +#: builtin/fsck.c:620 +msgid "also consider packs and alternate objects" +msgstr "" + +#: builtin/fsck.c:621 +msgid "enable more strict checking" +msgstr "" + +#: builtin/fsck.c:623 +msgid "write dangling objects in .git/lost-found" +msgstr "" + +#: builtin/fsck.c:624 builtin/prune.c:134 +msgid "show progress" +msgstr "" + +#: builtin/gc.c:22 +msgid "git gc [options]" +msgstr "" + #: builtin/gc.c:63 #, c-format msgid "Invalid %s: '%s'" @@ -3130,6 +4535,18 @@ msgstr "æ— æ•ˆçš„ %s:'%s'" msgid "insanely long object directory %.*s" msgstr "ä¸æ£å¸¸çš„长对象目录 %.*s" +#: builtin/gc.c:179 +msgid "prune unreferenced objects" +msgstr "" + +#: builtin/gc.c:181 +msgid "be more thorough (increased runtime)" +msgstr "" + +#: builtin/gc.c:182 +msgid "enable auto-gc mode" +msgstr "" + #: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" @@ -3149,65 +4566,293 @@ msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "有太多ä¸å¯è¾¾çš„æ¾æ•£å¯¹è±¡ï¼Œè¿è¡Œ 'git prune' åˆ é™¤å®ƒä»¬ã€‚" +#: builtin/grep.c:22 +msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "" + #: builtin/grep.c:216 #, c-format msgid "grep: failed to create thread: %s" msgstr "grepï¼šæ— æ³•åˆ›å»ºçº¿ç¨‹ï¼š%s" -#: builtin/grep.c:402 +#: builtin/grep.c:454 #, c-format msgid "Failed to chdir: %s" msgstr "æ— æ³•åˆ‡æ¢ç›®å½•ï¼š%s" -#: builtin/grep.c:478 builtin/grep.c:512 +#: builtin/grep.c:530 builtin/grep.c:564 #, c-format msgid "unable to read tree (%s)" msgstr "æ— æ³•è¯»å–æ ‘ï¼ˆ%s)" -#: builtin/grep.c:526 +#: builtin/grep.c:578 #, c-format msgid "unable to grep from object of type %s" msgstr "æ— æ³•æŠ“å–æ¥è‡ªäºŽ %s 类型的对象" -#: builtin/grep.c:584 +#: builtin/grep.c:636 #, c-format msgid "switch `%c' expects a numerical value" msgstr "开关 `%c' 期望一个数å—值" -#: builtin/grep.c:601 +#: builtin/grep.c:653 #, c-format msgid "cannot open '%s'" msgstr "ä¸èƒ½æ‰“å¼€ '%s'" -#: builtin/grep.c:885 +#: builtin/grep.c:728 +msgid "search in index instead of in the work tree" +msgstr "" + +#: builtin/grep.c:730 +msgid "find in contents not managed by git" +msgstr "" + +# 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ +#: builtin/grep.c:732 +#, fuzzy +msgid "search in both tracked and untracked files" +msgstr "(使用 -u å‚数显示未跟踪的文件)" + +#: builtin/grep.c:734 +msgid "search also in ignored files" +msgstr "" + +#: builtin/grep.c:737 +msgid "show non-matching lines" +msgstr "" + +#: builtin/grep.c:739 +msgid "case insensitive matching" +msgstr "" + +#: builtin/grep.c:741 +msgid "match patterns only at word boundaries" +msgstr "" + +#: builtin/grep.c:743 +msgid "process binary files as text" +msgstr "" + +#: builtin/grep.c:745 +msgid "don't match patterns in binary files" +msgstr "" + +#: builtin/grep.c:748 +msgid "descend at most <depth> levels" +msgstr "" + +#: builtin/grep.c:752 +msgid "use extended POSIX regular expressions" +msgstr "" + +#: builtin/grep.c:755 +msgid "use basic POSIX regular expressions (default)" +msgstr "" + +#: builtin/grep.c:758 +msgid "interpret patterns as fixed strings" +msgstr "" + +#: builtin/grep.c:761 +msgid "use Perl-compatible regular expressions" +msgstr "" + +#: builtin/grep.c:764 +msgid "show line numbers" +msgstr "" + +#: builtin/grep.c:765 +msgid "don't show filenames" +msgstr "" + +#: builtin/grep.c:766 +#, fuzzy +msgid "show filenames" +msgstr "%s文件:" + +#: builtin/grep.c:768 +msgid "show filenames relative to top directory" +msgstr "" + +#: builtin/grep.c:770 +msgid "show only filenames instead of matching lines" +msgstr "" + +#: builtin/grep.c:772 +msgid "synonym for --files-with-matches" +msgstr "" + +#: builtin/grep.c:775 +msgid "show only the names of files without match" +msgstr "" + +#: builtin/grep.c:777 +#, fuzzy +msgid "print NUL after filenames" +msgstr "为所有文件åå‰æ·»åŠ <æ ¹ç›®å½•>" + +#: builtin/grep.c:779 +msgid "show the number of matches instead of matching lines" +msgstr "" + +#: builtin/grep.c:780 +msgid "highlight matches" +msgstr "" + +#: builtin/grep.c:782 +msgid "print empty line between matches from different files" +msgstr "" + +#: builtin/grep.c:784 +msgid "show filename only once above matches from same file" +msgstr "" + +#: builtin/grep.c:787 +msgid "show <n> context lines before and after matches" +msgstr "" + +#: builtin/grep.c:790 +msgid "show <n> context lines before matches" +msgstr "" + +#: builtin/grep.c:792 +msgid "show <n> context lines after matches" +msgstr "" + +#: builtin/grep.c:793 +msgid "shortcut for -C NUM" +msgstr "" + +#: builtin/grep.c:796 +msgid "show a line with the function name before matches" +msgstr "" + +#: builtin/grep.c:798 +msgid "show the surrounding function" +msgstr "" + +#: builtin/grep.c:801 +msgid "read patterns from file" +msgstr "" + +#: builtin/grep.c:803 +msgid "match <pattern>" +msgstr "" + +#: builtin/grep.c:805 +msgid "combine patterns specified with -e" +msgstr "" + +#: builtin/grep.c:817 +msgid "indicate hit with exit status without output" +msgstr "" + +#: builtin/grep.c:819 +msgid "show only matches from files that match all patterns" +msgstr "" + +#: builtin/grep.c:822 +msgid "pager" +msgstr "" + +#: builtin/grep.c:822 +msgid "show matching files in the pager" +msgstr "" + +#: builtin/grep.c:825 +msgid "allow calling of grep(1) (ignored by this build)" +msgstr "" + +#: builtin/grep.c:826 builtin/show-ref.c:201 +msgid "show usage" +msgstr "" + +#: builtin/grep.c:917 msgid "no pattern given." msgstr "未æ供模å¼åŒ¹é…。" -#: builtin/grep.c:899 +#: builtin/grep.c:931 #, c-format msgid "bad object %s" msgstr "å对象 %s" -#: builtin/grep.c:940 +#: builtin/grep.c:972 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager 仅用于工作区" -#: builtin/grep.c:963 +#: builtin/grep.c:995 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached 或 --untracked ä¸èƒ½ä¸Ž --no-index åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/grep.c:968 +#: builtin/grep.c:1000 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index 或 --untracked ä¸èƒ½å’Œç‰ˆæœ¬åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/grep.c:971 +#: builtin/grep.c:1003 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard ä¸èƒ½ç”¨äºŽå·²è·Ÿè¸ªå†…容。" -#: builtin/grep.c:979 +#: builtin/grep.c:1011 msgid "both --cached and trees are given." msgstr "åŒæ—¶ç»™å‡ºäº† --cached å’Œæ ‘å¯¹è±¡ã€‚" +#: builtin/hash-object.c:60 +msgid "" +"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] " +"<file>..." +msgstr "" + +#: builtin/hash-object.c:61 +msgid "git hash-object --stdin-paths < <list-of-paths>" +msgstr "" + +#: builtin/hash-object.c:72 +msgid "type" +msgstr "" + +#: builtin/hash-object.c:72 +#, fuzzy +msgid "object type" +msgstr "å的对象类型。" + +#: builtin/hash-object.c:73 +msgid "write the object into the object database" +msgstr "" + +#: builtin/hash-object.c:74 +msgid "read the object from stdin" +msgstr "" + +#: builtin/hash-object.c:76 +msgid "store file as is without filters" +msgstr "" + +#: builtin/hash-object.c:77 +msgid "process file as it were from this path" +msgstr "" + +#: builtin/help.c:43 +#, fuzzy +msgid "print all available commands" +msgstr "在 '%s' 下å¯ç”¨çš„ git 命令" + +#: builtin/help.c:44 +msgid "show man page" +msgstr "" + +#: builtin/help.c:45 +msgid "show manual in web browser" +msgstr "" + +#: builtin/help.c:47 +msgid "show info page" +msgstr "" + +#: builtin/help.c:53 +msgid "git help [--all] [--man|--web|--info] [command]" +msgstr "" + #: builtin/help.c:65 #, c-format msgid "unrecognized help format '%s'" @@ -3322,6 +4967,11 @@ msgstr "æ— æ³•æ‰“å¼€åŒ…æ–‡ä»¶ '%s'" msgid "pack signature mismatch" msgstr "包ç¾åä¸åŒ¹é…" +#: builtin/index-pack.c:294 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "" + #: builtin/index-pack.c:312 #, c-format msgid "pack has bad object at offset %lu: %s" @@ -3428,93 +5078,123 @@ msgstr "parse_pack_objects() ä¸é‡åˆ°ä¸å¯ç†å–»çš„问题" msgid "Resolving deltas" msgstr "å¤„ç† delta ä¸" -#: builtin/index-pack.c:1105 +#: builtin/index-pack.c:1064 +#, fuzzy, c-format +msgid "unable to create thread: %s" +msgstr "grepï¼šæ— æ³•åˆ›å»ºçº¿ç¨‹ï¼š%s" + +#: builtin/index-pack.c:1106 msgid "confusion beyond insanity" msgstr "ä¸å¯ç†å–»" -#: builtin/index-pack.c:1124 +#: builtin/index-pack.c:1112 +#, c-format +msgid "completed with %d local objects" +msgstr "" + +#: builtin/index-pack.c:1121 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "" + +#: builtin/index-pack.c:1125 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "包有 %d 个未解决的 delta" msgstr[1] "包有 %d 个未解决的 delta" -#: builtin/index-pack.c:1149 +#: builtin/index-pack.c:1150 #, c-format msgid "unable to deflate appended object (%d)" msgstr "ä¸èƒ½ç¼©å°é™„åŠ å¯¹è±¡ï¼ˆ%d)" -#: builtin/index-pack.c:1228 +#: builtin/index-pack.c:1229 #, c-format msgid "local object %s is corrupt" msgstr "本地对象 %s å·²æŸå" -#: builtin/index-pack.c:1252 +#: builtin/index-pack.c:1253 msgid "error while closing pack file" msgstr "å…³é—包文件时出错" -#: builtin/index-pack.c:1265 +#: builtin/index-pack.c:1266 #, c-format msgid "cannot write keep file '%s'" msgstr "æ— æ³•å†™ä¿ç•™æ–‡ä»¶ '%s'" -#: builtin/index-pack.c:1273 +#: builtin/index-pack.c:1274 #, c-format msgid "cannot close written keep file '%s'" msgstr "æ— æ³•å…³é—ä¿ç•™æ–‡ä»¶ '%s'" -#: builtin/index-pack.c:1286 +#: builtin/index-pack.c:1287 msgid "cannot store pack file" msgstr "æ— æ³•å˜å‚¨åŒ…文件" -#: builtin/index-pack.c:1297 +#: builtin/index-pack.c:1298 msgid "cannot store index file" msgstr "æ— æ³•å˜å‚¨ç´¢å¼•æ–‡ä»¶" -#: builtin/index-pack.c:1398 +#: builtin/index-pack.c:1331 +#, fuzzy, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "å的索引版本 '%s'" + +#: builtin/index-pack.c:1337 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "" + +#: builtin/index-pack.c:1341 builtin/index-pack.c:1514 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "" + +#: builtin/index-pack.c:1399 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "æ— æ³•æ‰“å¼€çŽ°å˜åŒ…文件 '%s'" -#: builtin/index-pack.c:1400 +#: builtin/index-pack.c:1401 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "æ— æ³•ä¸º %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] "éž delta:%d 个对象" msgstr[1] "éž delta:%d 个对象" -#: 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] "链长 = %d: %lu 对象" msgstr[1] "链长 = %d: %lu 对象" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 msgid "Cannot come back to cwd" msgstr "æ— æ³•è¿”å›žå½“å‰å·¥ä½œç›®å½•" -#: 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" -#: builtin/index-pack.c:1558 +#: builtin/index-pack.c:1559 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin ä¸èƒ½å’Œ --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 "包å '%s' 没有以 '.pack' 结尾" -#: builtin/index-pack.c:1581 +#: builtin/index-pack.c:1582 msgid "--verify with no packfile name given" msgstr "--verify 没有æ供包åå‚æ•°" @@ -3635,6 +5315,25 @@ msgstr "共享" msgid "cannot tell cwd" msgstr "æ— æ³•èŽ·çŸ¥å½“å‰è·¯å¾„" +#: builtin/init-db.c:467 +msgid "" +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared" +"[=<permissions>]] [directory]" +msgstr "" + +#: builtin/init-db.c:490 +msgid "permissions" +msgstr "" + +#: builtin/init-db.c:491 +msgid "specify that the git repository is to be shared amongst several users" +msgstr "" + +#: builtin/init-db.c:493 builtin/prune-packed.c:77 +#, fuzzy +msgid "be quiet" +msgstr "æ›´åŠ å®‰é™" + #: builtin/init-db.c:522 builtin/init-db.c:529 #, c-format msgid "cannot mkdir %s" @@ -3663,6 +5362,29 @@ msgstr "ä¸èƒ½è®¿é—®å½“å‰å·¥ä½œç›®å½•" msgid "Cannot access work tree '%s'" msgstr "ä¸èƒ½è®¿é—®å·¥ä½œåŒº '%s'" +#: builtin/log.c:37 +#, fuzzy +msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/log.c:38 +#, fuzzy +msgid " or: git show [options] <object>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/log.c:100 +msgid "suppress diff output" +msgstr "" + +#: builtin/log.c:101 +#, fuzzy +msgid "show source" +msgstr "åçš„æº" + +#: builtin/log.c:102 +msgid "decorate options" +msgstr "" + #: builtin/log.c:189 #, c-format msgid "Final output: %d %s\n" @@ -3699,68 +5421,345 @@ msgstr "åªéœ€è¦ä¸€ä¸ªèŒƒå›´ã€‚" msgid "Not a range." msgstr "ä¸æ˜¯ä¸€ä¸ªèŒƒå›´ã€‚" -#: builtin/log.c:792 +#: builtin/log.c:789 msgid "Cover letter needs email format" msgstr "ä¿¡å°éœ€è¦é‚®ä»¶åœ°å€æ ¼å¼" -#: builtin/log.c:865 +#: builtin/log.c:862 #, c-format msgid "insane in-reply-to: %s" msgstr "ä¸æ£å¸¸çš„ in-reply-to:%s" -#: builtin/log.c:938 +#: builtin/log.c:890 +msgid "git format-patch [options] [<since> | <revision range>]" +msgstr "" + +#: builtin/log.c:935 msgid "Two output directories?" msgstr "两个输出目录?" -#: builtin/log.c:1160 +#: builtin/log.c:1063 +msgid "use [PATCH n/m] even with a single patch" +msgstr "" + +#: builtin/log.c:1066 +msgid "use [PATCH] even with multiple patches" +msgstr "" + +#: builtin/log.c:1070 +msgid "print patches to standard out" +msgstr "" + +#: builtin/log.c:1072 +msgid "generate a cover letter" +msgstr "" + +#: builtin/log.c:1074 +msgid "use simple number sequence for output file names" +msgstr "" + +#: builtin/log.c:1075 +msgid "sfx" +msgstr "" + +#: builtin/log.c:1076 +msgid "use <sfx> instead of '.patch'" +msgstr "" + +#: builtin/log.c:1078 +msgid "start numbering patches at <n> instead of 1" +msgstr "" + +#: builtin/log.c:1080 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "" + +#: builtin/log.c:1083 +msgid "store resulting files in <dir>" +msgstr "" + +#: builtin/log.c:1086 +msgid "don't strip/add [PATCH]" +msgstr "" + +#: builtin/log.c:1089 +msgid "don't output binary diffs" +msgstr "" + +#: builtin/log.c:1091 +msgid "don't include a patch matching a commit upstream" +msgstr "" + +#: builtin/log.c:1093 +msgid "show patch format instead of default (patch + stat)" +msgstr "" + +#: builtin/log.c:1095 +#, fuzzy +msgid "Messaging" +msgstr "åˆå¹¶ï¼š" + +# 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ +#: builtin/log.c:1096 +#, fuzzy +msgid "header" +msgstr "领先 " + +#: builtin/log.c:1097 +msgid "add email header" +msgstr "" + +#: builtin/log.c:1098 builtin/log.c:1100 +msgid "email" +msgstr "" + +#: builtin/log.c:1098 +msgid "add To: header" +msgstr "" + +#: builtin/log.c:1100 +msgid "add Cc: header" +msgstr "" + +#: builtin/log.c:1102 +msgid "message-id" +msgstr "" + +#: builtin/log.c:1103 +msgid "make first mail a reply to <message-id>" +msgstr "" + +#: builtin/log.c:1104 builtin/log.c:1107 +msgid "boundary" +msgstr "" + +#: builtin/log.c:1105 +msgid "attach the patch" +msgstr "" + +#: builtin/log.c:1108 +#, fuzzy +msgid "inline the patch" +msgstr "忽略补ä¸ä¸çš„æ·»åŠ çš„æ–‡ä»¶" + +#: builtin/log.c:1112 +msgid "enable message threading, styles: shallow, deep" +msgstr "" + +#: builtin/log.c:1114 +msgid "signature" +msgstr "" + +#: builtin/log.c:1115 +msgid "add a signature" +msgstr "" + +#: builtin/log.c:1117 +#, fuzzy +msgid "don't print the patch filenames" +msgstr "æ— æ³•æ‰“å¼€è¡¥ä¸æ–‡ä»¶ %s" + +#: builtin/log.c:1157 #, c-format msgid "bogus committer info %s" msgstr "虚å‡çš„æäº¤è€…ä¿¡æ¯ %s" -#: builtin/log.c:1205 +#: builtin/log.c:1202 msgid "-n and -k are mutually exclusive." msgstr "-n å’Œ -k 互斥。" -#: builtin/log.c:1207 +#: builtin/log.c:1204 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix å’Œ -k 互斥。" -#: builtin/log.c:1215 +#: builtin/log.c:1212 msgid "--name-only does not make sense" msgstr "--name-only æ— æ„义" -#: builtin/log.c:1217 +#: builtin/log.c:1214 msgid "--name-status does not make sense" msgstr "--name-status æ— æ„义" -#: builtin/log.c:1219 +#: builtin/log.c:1216 msgid "--check does not make sense" msgstr "--check æ— æ„义" -#: builtin/log.c:1242 +#: builtin/log.c:1239 msgid "standard output, or directory, which one?" msgstr "æ ‡å‡†è¾“å‡ºæˆ–ç›®å½•ï¼Œå“ªä¸€ä¸ªï¼Ÿ" -#: builtin/log.c:1244 +#: builtin/log.c:1241 #, c-format msgid "Could not create directory '%s'" msgstr "ä¸èƒ½åˆ›å»ºç›®å½• '%s'" -#: builtin/log.c:1397 +#: builtin/log.c:1394 msgid "Failed to create output files" msgstr "æ— æ³•åˆ›å»ºè¾“å‡ºæ–‡ä»¶" -#: builtin/log.c:1501 +#: builtin/log.c:1443 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "" + +#: builtin/log.c:1498 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "ä¸èƒ½æ‰¾åˆ°è·Ÿè¸ªçš„远程分支,请手工指定 <upstream>。\n" -#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531 +#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525 #, c-format msgid "Unknown commit %s" msgstr "未知æ交 %s" +#: builtin/ls-files.c:408 +#, fuzzy +msgid "git ls-files [options] [<file>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/ls-files.c:463 +msgid "identify the file status with tags" +msgstr "" + +#: builtin/ls-files.c:465 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "" + +#: builtin/ls-files.c:467 +msgid "show cached files in the output (default)" +msgstr "" + +#: builtin/ls-files.c:469 +#, fuzzy +msgid "show deleted files in the output" +msgstr "åˆ é™¤çš„æ–‡ä»¶ %s ä»æœ‰å†…容" + +#: builtin/ls-files.c:471 +msgid "show modified files in the output" +msgstr "" + +#: builtin/ls-files.c:473 +msgid "show other files in the output" +msgstr "" + +#: builtin/ls-files.c:475 +msgid "show ignored files in the output" +msgstr "" + +#: builtin/ls-files.c:478 +msgid "show staged contents' object name in the output" +msgstr "" + +#: builtin/ls-files.c:480 +msgid "show files on the filesystem that need to be removed" +msgstr "" + +#: builtin/ls-files.c:482 +msgid "show 'other' directories' name only" +msgstr "" + +#: builtin/ls-files.c:485 +#, fuzzy +msgid "don't show empty directories" +msgstr "两个输出目录?" + +#: builtin/ls-files.c:488 +msgid "show unmerged files in the output" +msgstr "" + +#: builtin/ls-files.c:490 +msgid "show resolve-undo information" +msgstr "" + +#: builtin/ls-files.c:492 +#, fuzzy +msgid "skip files matching pattern" +msgstr "输出和模å¼åŒ¹é…çš„è¡Œ" + +#: builtin/ls-files.c:495 +msgid "exclude patterns are read from <file>" +msgstr "" + +#: builtin/ls-files.c:498 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "" + +#: builtin/ls-files.c:500 +msgid "add the standard git exclusions" +msgstr "" + +#: builtin/ls-files.c:503 +msgid "make the output relative to the project top directory" +msgstr "" + +#: builtin/ls-files.c:506 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "" + +#: builtin/ls-files.c:507 +msgid "tree-ish" +msgstr "" + +#: builtin/ls-files.c:508 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "" + +#: builtin/ls-files.c:510 +msgid "show debugging data" +msgstr "" + +#: builtin/ls-tree.c:27 +#, fuzzy +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/ls-tree.c:125 +msgid "only show trees" +msgstr "" + +#: builtin/ls-tree.c:127 +#, fuzzy +msgid "recurse into subtrees" +msgstr "å˜åŸºåˆ°è¿œç¨‹ %s" + +#: builtin/ls-tree.c:129 +msgid "show trees when recursing" +msgstr "" + +#: builtin/ls-tree.c:132 +msgid "terminate entries with NUL byte" +msgstr "" + +#: builtin/ls-tree.c:133 +#, fuzzy +msgid "include object size" +msgstr "æä¾›äº†æ— æ•ˆå¯¹è±¡ '%s'。" + +#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +msgid "list only filenames" +msgstr "" + +#: builtin/ls-tree.c:140 +msgid "use full path names" +msgstr "" + +#: builtin/ls-tree.c:142 +msgid "list entire tree; not just current directory (implies --full-name)" +msgstr "" + +#: builtin/merge.c:43 +#, fuzzy +msgid "git merge [options] [<commit>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/merge.c:44 +msgid "git merge [options] <msg> HEAD <commit>" +msgstr "" + +#: builtin/merge.c:45 +msgid "git merge --abort" +msgstr "" + #: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "开关 `m' 需è¦ä¸€ä¸ªå€¼" @@ -3780,6 +5779,71 @@ msgstr "å¯ç”¨çš„ç–略有:" msgid "Available custom strategies are:" msgstr "å¯ç”¨çš„自定义ç–略有:" +#: builtin/merge.c:183 +msgid "do not show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:186 +msgid "show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:187 +msgid "(synonym to --stat)" +msgstr "" + +#: builtin/merge.c:189 +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "" + +#: builtin/merge.c:192 +#, fuzzy +msgid "create a single commit instead of doing a merge" +msgstr "在åˆå¹¶è¿‡ç¨‹ä¸ä¸èƒ½åšéƒ¨åˆ†æ交。" + +#: builtin/merge.c:194 +msgid "perform a commit if the merge succeeds (default)" +msgstr "" + +#: builtin/merge.c:196 +#, fuzzy +msgid "edit message before committing" +msgstr "尚未暂å˜ä»¥å¤‡æ交的å˜æ›´ï¼š" + +#: builtin/merge.c:198 +#, fuzzy +msgid "allow fast-forward (default)" +msgstr "å¯å¿«è¿›" + +#: builtin/merge.c:200 +msgid "abort if fast-forward is not possible" +msgstr "" + +#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112 +msgid "strategy" +msgstr "" + +#: builtin/merge.c:203 +#, fuzzy +msgid "merge strategy to use" +msgstr "å°è¯•åˆå¹¶ç–ç•¥ %s...\n" + +#: builtin/merge.c:204 +msgid "option=value" +msgstr "" + +#: builtin/merge.c:205 +msgid "option for selected merge strategy" +msgstr "" + +#: builtin/merge.c:207 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "" + +#: builtin/merge.c:211 +#, fuzzy +msgid "abort the current in-progress merge" +msgstr "æ— æ³•ä¿å˜å½“å‰ç´¢å¼•çŠ¶æ€" + #: builtin/merge.c:240 msgid "could not run stash." msgstr "ä¸èƒ½è¿›è¡Œè¿›åº¦ä¿å˜ã€‚" @@ -3820,49 +5884,49 @@ msgstr "å®Œæˆ SQUASH_MSG" msgid "No merge message -- not updating HEAD\n" msgstr "æ— åˆå¹¶ä¿¡æ¯ -- 未更新 HEAD\n" -#: builtin/merge.c:437 +#: builtin/merge.c:436 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' 没有指å‘一个æ交" -#: builtin/merge.c:536 +#: builtin/merge.c:535 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "åçš„ branch.%s.mergeoptions å—符串:%s" -#: builtin/merge.c:629 +#: builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "git write-tree æ— æ³•å†™å…¥ä¸€æ ‘å¯¹è±¡" -#: builtin/merge.c:679 +#: builtin/merge.c:678 msgid "failed to read the cache" msgstr "æ— æ³•è¯»å–缓å˜" -#: builtin/merge.c:710 +#: builtin/merge.c:709 msgid "Not handling anything other than two heads merge." msgstr "ä¸èƒ½å¤„ç†ä¸¤ä¸ªå¤´åˆå¹¶ä¹‹å¤–的任何æ“作。" -#: builtin/merge.c:724 +#: builtin/merge.c:723 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "merge-recursive 的未知选项:-X%s" -#: builtin/merge.c:738 +#: builtin/merge.c:737 #, c-format msgid "unable to write %s" msgstr "ä¸èƒ½å†™ %s" -#: builtin/merge.c:877 +#: builtin/merge.c:876 #, c-format msgid "Could not read from '%s'" msgstr "ä¸èƒ½ä»Ž '%s' 读å–" -#: builtin/merge.c:886 +#: builtin/merge.c:885 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "未æ交åˆå¹¶ï¼Œä½¿ç”¨ 'git commit' 完æˆæ¤æ¬¡åˆå¹¶ã€‚\n" -#: builtin/merge.c:892 +#: builtin/merge.c:891 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -3875,52 +5939,52 @@ msgstr "" "\n" "以 '#' 开头的行将被忽略,而且空æ交说明将会终æ¢æ交。\n" -#: builtin/merge.c:916 +#: builtin/merge.c:915 msgid "Empty commit message." msgstr "空æ交信æ¯ã€‚" -#: builtin/merge.c:928 +#: builtin/merge.c:927 #, c-format msgid "Wonderful.\n" msgstr "太棒了。\n" -#: builtin/merge.c:993 +#: builtin/merge.c:992 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "自动åˆå¹¶å¤±è´¥ï¼Œä¿®æ£å†²çªç„¶åŽæ交修æ£çš„结果。\n" -#: builtin/merge.c:1009 +#: builtin/merge.c:1008 #, c-format msgid "'%s' is not a commit" msgstr "'%s' ä¸æ˜¯ä¸€ä¸ªæ交" -#: builtin/merge.c:1050 +#: builtin/merge.c:1049 msgid "No current branch." msgstr "没有当å‰åˆ†æ”¯ã€‚" -#: builtin/merge.c:1052 +#: builtin/merge.c:1051 msgid "No remote for the current branch." msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å¯¹åº”的远程版本库。" -#: builtin/merge.c:1054 +#: builtin/merge.c:1053 msgid "No default upstream defined for the current branch." msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å®šä¹‰é»˜è®¤çš„上游分支。" -#: builtin/merge.c:1059 +#: builtin/merge.c:1058 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "%s 没有æ¥è‡ª %s 的远程跟踪分支" -#: builtin/merge.c:1146 builtin/merge.c:1303 +#: builtin/merge.c:1145 builtin/merge.c:1302 #, c-format msgid "%s - not something we can merge" msgstr "%s - ä¸èƒ½è¢«åˆå¹¶" -#: builtin/merge.c:1214 +#: builtin/merge.c:1213 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "没有è¦ç»ˆæ¢çš„åˆå¹¶ï¼ˆMERGE_HEAD 丢失)。" -#: builtin/merge.c:1230 git-pull.sh:31 +#: builtin/merge.c:1229 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3928,11 +5992,11 @@ msgstr "" "您尚未结æŸæ‚¨çš„åˆå¹¶ï¼ˆå˜åœ¨ MERGE_HEAD)。\n" "请在åˆå¹¶å‰å…ˆæ交您的修改。" -#: builtin/merge.c:1233 git-pull.sh:34 +#: builtin/merge.c:1232 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "您尚未结æŸæ‚¨çš„åˆå¹¶ï¼ˆå˜åœ¨ MERGE_HEAD)。" -#: builtin/merge.c:1237 +#: builtin/merge.c:1236 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -3940,83 +6004,184 @@ msgstr "" "您尚未结æŸæ‚¨çš„拣选(å˜åœ¨ CHERRY_PICK_HEAD)。\n" "请在åˆå¹¶å‰å…ˆæ交您的修改。" -#: builtin/merge.c:1240 +#: builtin/merge.c:1239 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "您尚未结æŸæ‚¨çš„拣选(å˜åœ¨ CHERRY_PICK_HEAD)。" -#: builtin/merge.c:1249 +#: builtin/merge.c:1248 msgid "You cannot combine --squash with --no-ff." msgstr "您ä¸èƒ½å°† --squash 与 --no-ff åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/merge.c:1254 +#: builtin/merge.c:1253 msgid "You cannot combine --no-ff with --ff-only." msgstr "您ä¸èƒ½å°† --no-ff 与 --ff-only åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/merge.c:1261 +#: builtin/merge.c:1260 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "未指定æ交并且 merge.defaultToUpstream 未设置。" -#: builtin/merge.c:1293 +#: builtin/merge.c:1292 msgid "Can merge only exactly one commit into empty head" msgstr "åªèƒ½å°†ä¸€ä¸ªæ交åˆå¹¶åˆ°ç©ºåˆ†æ”¯ä¸Š" -#: builtin/merge.c:1296 +#: builtin/merge.c:1295 msgid "Squash commit into empty head not supported yet" msgstr "å°šä¸æ”¯æŒåˆ°ç©ºåˆ†æ”¯çš„压缩æ交" -#: builtin/merge.c:1298 +#: builtin/merge.c:1297 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "到空分支的éžå¿«è¿›å¼æ交没有æ„义" -#: builtin/merge.c:1413 +#: builtin/merge.c:1412 #, c-format msgid "Updating %s..%s\n" msgstr "æ›´æ–° %s..%s\n" -#: builtin/merge.c:1451 +#: builtin/merge.c:1450 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "å°è¯•éžå¸¸å°çš„索引内åˆå¹¶...\n" -#: builtin/merge.c:1458 +#: builtin/merge.c:1457 #, c-format msgid "Nope.\n" msgstr "æ— ã€‚\n" -#: builtin/merge.c:1490 +#: builtin/merge.c:1489 msgid "Not possible to fast-forward, aborting." msgstr "æ— æ³•å¿«è¿›ï¼Œç»ˆæ¢ã€‚" -#: builtin/merge.c:1513 builtin/merge.c:1592 +#: builtin/merge.c:1512 builtin/merge.c:1591 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "å°†æ ‘å›žæ»šè‡³åŽŸå§‹çŠ¶æ€...\n" -#: builtin/merge.c:1517 +#: builtin/merge.c:1516 #, c-format msgid "Trying merge strategy %s...\n" msgstr "å°è¯•åˆå¹¶ç–ç•¥ %s...\n" -#: builtin/merge.c:1583 +#: builtin/merge.c:1582 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "没有åˆå¹¶ç–略处ç†æ¤åˆå¹¶ã€‚\n" -#: builtin/merge.c:1585 +#: builtin/merge.c:1584 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "使用ç–ç•¥ %s åˆå¹¶å¤±è´¥ã€‚\n" -#: builtin/merge.c:1594 +#: builtin/merge.c:1593 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "使用 %s 以准备手工解决。\n" -#: builtin/merge.c:1606 +#: builtin/merge.c:1605 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "自动åˆå¹¶è¿›å±•é¡ºåˆ©ï¼ŒæŒ‰è¦æ±‚在æ交å‰åœæ¢\n" +#: builtin/merge-base.c:26 +msgid "git merge-base [-a|--all] <commit> <commit>..." +msgstr "" + +#: builtin/merge-base.c:27 +msgid "git merge-base [-a|--all] --octopus <commit>..." +msgstr "" + +#: builtin/merge-base.c:28 +msgid "git merge-base --independent <commit>..." +msgstr "" + +#: builtin/merge-base.c:29 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "" + +#: builtin/merge-base.c:98 +#, fuzzy +msgid "output all common ancestors" +msgstr "å‘现 %u 个共åŒç¥–先:" + +#: builtin/merge-base.c:99 +msgid "find ancestors for a single n-way merge" +msgstr "" + +#: builtin/merge-base.c:100 +msgid "list revs not reachable from others" +msgstr "" + +#: builtin/merge-base.c:102 +msgid "is the first one ancestor of the other?" +msgstr "" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " +"file2" +msgstr "" + +#: builtin/merge-file.c:33 +msgid "send results to standard output" +msgstr "" + +#: builtin/merge-file.c:34 +msgid "use a diff3 based merge" +msgstr "" + +#: builtin/merge-file.c:35 +msgid "for conflicts, use our version" +msgstr "" + +#: builtin/merge-file.c:37 +msgid "for conflicts, use their version" +msgstr "" + +#: builtin/merge-file.c:39 +msgid "for conflicts, use a union version" +msgstr "" + +#: builtin/merge-file.c:42 +msgid "for conflicts, use this marker size" +msgstr "" + +#: builtin/merge-file.c:43 +msgid "do not warn about conflicts" +msgstr "" + +#: builtin/merge-file.c:45 +msgid "set labels for file1/orig_file/file2" +msgstr "" + +#: builtin/mktree.c:67 +msgid "git mktree [-z] [--missing] [--batch]" +msgstr "" + +#: builtin/mktree.c:153 +msgid "input is NUL terminated" +msgstr "" + +#: builtin/mktree.c:154 builtin/write-tree.c:24 +#, fuzzy +msgid "allow missing objects" +msgstr "接收对象ä¸" + +#: builtin/mktree.c:155 +msgid "allow creation of more than one tree" +msgstr "" + +#: builtin/mv.c:14 +msgid "git mv [options] <source>... <destination>" +msgstr "" + +#: builtin/mv.c:64 +msgid "force move/rename even if target exists" +msgstr "" + +#: builtin/mv.c:65 +#, fuzzy +msgid "skip move/rename errors" +msgstr "程åºé”™è¯¯" + #: builtin/mv.c:108 #, c-format msgid "Checking rename of '%s' to '%s'\n" @@ -4079,6 +6244,151 @@ msgstr "é‡å‘½å %s 至 %s\n" msgid "renaming '%s' failed" msgstr "é‡å‘½å '%s' 失败" +#: builtin/name-rev.c:175 +#, fuzzy +msgid "git name-rev [options] <commit>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/name-rev.c:176 +msgid "git name-rev [options] --all" +msgstr "" + +#: builtin/name-rev.c:177 +msgid "git name-rev [options] --stdin" +msgstr "" + +#: builtin/name-rev.c:229 +msgid "print only names (no SHA-1)" +msgstr "" + +#: builtin/name-rev.c:230 +msgid "only use tags to name the commits" +msgstr "" + +#: builtin/name-rev.c:232 +#, fuzzy +msgid "only use refs matching <pattern>" +msgstr "输出和模å¼åŒ¹é…çš„è¡Œ" + +#: builtin/name-rev.c:234 +msgid "list all commits reachable from all refs" +msgstr "" + +#: builtin/name-rev.c:235 +msgid "read from stdin" +msgstr "" + +#: builtin/name-rev.c:236 +msgid "allow to print `undefined` names" +msgstr "" + +#: builtin/notes.c:23 +msgid "git notes [--ref <notes_ref>] [list [<object>]]" +msgstr "" + +#: builtin/notes.c:24 +msgid "" +"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:25 +msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:26 +msgid "" +"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:27 +msgid "git notes [--ref <notes_ref>] edit [<object>]" +msgstr "" + +#: builtin/notes.c:28 +msgid "git notes [--ref <notes_ref>] show [<object>]" +msgstr "" + +#: builtin/notes.c:29 +msgid "" +"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" +msgstr "" + +#: builtin/notes.c:30 +msgid "git notes merge --commit [-v | -q]" +msgstr "" + +#: builtin/notes.c:31 +msgid "git notes merge --abort [-v | -q]" +msgstr "" + +#: builtin/notes.c:32 +msgid "git notes [--ref <notes_ref>] remove [<object>...]" +msgstr "" + +#: builtin/notes.c:33 +msgid "git notes [--ref <notes_ref>] prune [-n | -v]" +msgstr "" + +#: builtin/notes.c:34 +msgid "git notes [--ref <notes_ref>] get-ref" +msgstr "" + +#: builtin/notes.c:39 +msgid "git notes [list [<object>]]" +msgstr "" + +#: builtin/notes.c:44 +#, fuzzy +msgid "git notes add [<options>] [<object>]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/notes.c:49 +msgid "git notes copy [<options>] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:50 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "" + +#: builtin/notes.c:55 +#, fuzzy +msgid "git notes append [<options>] [<object>]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/notes.c:60 +msgid "git notes edit [<object>]" +msgstr "" + +#: builtin/notes.c:65 +msgid "git notes show [<object>]" +msgstr "" + +#: builtin/notes.c:70 +msgid "git notes merge [<options>] <notes_ref>" +msgstr "" + +#: builtin/notes.c:71 +msgid "git notes merge --commit [<options>]" +msgstr "" + +#: builtin/notes.c:72 +msgid "git notes merge --abort [<options>]" +msgstr "" + +#: builtin/notes.c:77 +msgid "git notes remove [<object>]" +msgstr "" + +#: builtin/notes.c:82 +msgid "git notes prune [<options>]" +msgstr "" + +#: builtin/notes.c:87 +msgid "git notes get-ref" +msgstr "" + #: builtin/notes.c:139 #, c-format msgid "unable to start 'show' for object '%s'" @@ -4186,6 +6496,37 @@ msgstr "å‚数太多" msgid "No note found for object %s." msgstr "未å‘现对象 %s 的注解。" +#: builtin/notes.c:535 builtin/notes.c:692 +#, fuzzy +msgid "note contents as a string" +msgstr "注解内容被留在文件 %s ä¸" + +#: builtin/notes.c:538 builtin/notes.c:695 +#, fuzzy +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 +#, fuzzy +msgid "object" +msgstr "å对象 %s" + +#: builtin/notes.c:541 builtin/notes.c:698 +#, fuzzy +msgid "reuse and edit specified note object" +msgstr "ä¸èƒ½å†™æ³¨è§£å¯¹è±¡" + +#: builtin/notes.c:544 builtin/notes.c:701 +#, fuzzy +msgid "reuse specified note object" +msgstr "ä¸èƒ½å†™æ³¨è§£å¯¹è±¡" + +#: builtin/notes.c:546 builtin/notes.c:614 +#, fuzzy +msgid "replace existing notes" +msgstr "ä¸èƒ½è¯»å–现å˜å¯¹è±¡ %s" + #: builtin/notes.c:580 #, c-format msgid "" @@ -4198,6 +6539,15 @@ msgstr "ä¸èƒ½æ·»åŠ 注解。å‘现对象 %s å·²å˜åœ¨æ³¨è§£ã€‚使用 '-f' è¦†ç› msgid "Overwriting existing notes for object %s\n" msgstr "覆盖对象 %s 现å˜æ³¨è§£\n" +#: builtin/notes.c:615 +#, fuzzy +msgid "read objects from stdin" +msgstr "å对象 %s" + +#: builtin/notes.c:617 +msgid "load rewriting config for <command> (implies --stdin)" +msgstr "" + #: builtin/notes.c:635 msgid "too few parameters" msgstr "å‚数太少" @@ -4223,16 +6573,73 @@ msgstr "" "å命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n" "请æ¢ç”¨ 'git notes add -f -m/-F/-c/-C'。\n" +#: builtin/notes.c:864 +#, fuzzy +msgid "General options" +msgstr "æ— æ•ˆé€‰é¡¹ï¼š%s" + +#: builtin/notes.c:866 +msgid "Merge options" +msgstr "" + +#: builtin/notes.c:868 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "" + +#: builtin/notes.c:870 +msgid "Committing unmerged notes" +msgstr "" + +#: builtin/notes.c:872 +msgid "finalize notes merge by committing unmerged notes" +msgstr "" + +#: builtin/notes.c:874 +msgid "Aborting notes merge resolution" +msgstr "" + +#: builtin/notes.c:876 +#, fuzzy +msgid "abort notes merge" +msgstr "path '%s'ï¼šæ— æ³•åˆå¹¶" + #: builtin/notes.c:971 #, c-format msgid "Object %s has no note\n" msgstr "对象 %s 没有注解\n" +#: builtin/notes.c:983 +msgid "attempt to remove non-existent note is not an error" +msgstr "" + +#: builtin/notes.c:986 +#, fuzzy +msgid "read object names from the standard input" +msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" + +#: builtin/notes.c:1067 +msgid "notes_ref" +msgstr "" + +#: builtin/notes.c:1068 +msgid "use notes from <notes_ref>" +msgstr "" + #: builtin/notes.c:1103 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "未知å命令:%s" +#: builtin/pack-objects.c:23 +msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]" +msgstr "" + +#: builtin/pack-objects.c:24 +msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" +msgstr "" + #: builtin/pack-objects.c:183 builtin/pack-objects.c:186 #, c-format msgid "deflate error (%d)" @@ -4258,6 +6665,171 @@ msgstr "选项 %s ä¸æŽ¥å—å¦å®šæ ¼å¼" msgid "unable to parse value '%s' for option %s" msgstr "ä¸èƒ½è§£æžé€‰é¡¹ %1$s 的值 '%2$s'" +#: builtin/pack-objects.c:2448 +msgid "do not show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2450 +msgid "show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2452 +msgid "show progress meter during object writing phase" +msgstr "" + +#: builtin/pack-objects.c:2455 +msgid "similar to --all-progress when progress meter is shown" +msgstr "" + +#: builtin/pack-objects.c:2456 +msgid "version[,offset]" +msgstr "" + +#: builtin/pack-objects.c:2457 +msgid "write the pack index file in the specified idx format version" +msgstr "" + +#: builtin/pack-objects.c:2460 +#, fuzzy +msgid "maximum size of each output pack file" +msgstr "æ— æ³•åˆ›å»ºè¾“å‡ºæ–‡ä»¶" + +#: builtin/pack-objects.c:2462 +msgid "ignore borrowed objects from alternate object store" +msgstr "" + +#: builtin/pack-objects.c:2464 +#, fuzzy +msgid "ignore packed objects" +msgstr "ä¸èƒ½è¯»å–对象 %s" + +#: builtin/pack-objects.c:2466 +msgid "limit pack window by objects" +msgstr "" + +#: builtin/pack-objects.c:2468 +msgid "limit pack window by memory in addition to object limit" +msgstr "" + +#: builtin/pack-objects.c:2470 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "" + +#: builtin/pack-objects.c:2472 +#, fuzzy +msgid "reuse existing deltas" +msgstr "å¤„ç† delta ä¸" + +#: builtin/pack-objects.c:2474 +#, fuzzy +msgid "reuse existing objects" +msgstr "ä¸èƒ½è¯»å–现å˜å¯¹è±¡ %s" + +#: builtin/pack-objects.c:2476 +msgid "use OFS_DELTA objects" +msgstr "" + +#: builtin/pack-objects.c:2478 +msgid "use threads when searching for best delta matches" +msgstr "" + +#: builtin/pack-objects.c:2480 +msgid "do not create an empty pack output" +msgstr "" + +#: builtin/pack-objects.c:2482 +#, fuzzy +msgid "read revision arguments from standard input" +msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" + +#: builtin/pack-objects.c:2484 +msgid "limit the objects to those that are not yet packed" +msgstr "" + +#: builtin/pack-objects.c:2487 +msgid "include objects reachable from any reference" +msgstr "" + +#: builtin/pack-objects.c:2490 +msgid "include objects referred by reflog entries" +msgstr "" + +#: builtin/pack-objects.c:2493 +msgid "output pack to stdout" +msgstr "" + +#: builtin/pack-objects.c:2495 +msgid "include tag objects that refer to objects to be packed" +msgstr "" + +#: builtin/pack-objects.c:2497 +msgid "keep unreachable objects" +msgstr "" + +#: builtin/pack-objects.c:2498 parse-options.h:141 +msgid "time" +msgstr "时间" + +#: builtin/pack-objects.c:2499 +msgid "unpack unreachable objects newer than <time>" +msgstr "" + +#: builtin/pack-objects.c:2502 +msgid "create thin packs" +msgstr "" + +#: builtin/pack-objects.c:2504 +msgid "ignore packs that have companion .keep file" +msgstr "" + +#: builtin/pack-objects.c:2506 +msgid "pack compression level" +msgstr "" + +#: builtin/pack-objects.c:2508 +#, fuzzy +msgid "do not hide commits by grafts" +msgstr "ä¸èƒ½å†™æ交模版" + +#: builtin/pack-refs.c:6 +msgid "git pack-refs [options]" +msgstr "" + +#: builtin/pack-refs.c:14 +msgid "pack everything" +msgstr "" + +#: builtin/pack-refs.c:15 +msgid "prune loose refs (default)" +msgstr "" + +#: builtin/prune-packed.c:7 +msgid "git prune-packed [-n|--dry-run] [-q|--quiet]" +msgstr "" + +#: builtin/prune.c:12 +msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" +msgstr "" + +#: builtin/prune.c:132 +#, fuzzy +msgid "do not remove, show only" +msgstr "ä¸ä¼šåˆ 除 %s\n" + +#: builtin/prune.c:133 +#, fuzzy +msgid "report pruned objects" +msgstr "ä¸èƒ½è¯»å–对象 %s" + +#: builtin/prune.c:136 +msgid "expire objects older than <time>" +msgstr "" + +#: builtin/push.c:14 +#, fuzzy +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + #: builtin/push.c:45 msgid "tag shorthand without <tag>" msgstr "tag 简写没有跟 <tag> å‚æ•°" @@ -4340,12 +6912,44 @@ msgstr "" "您æ£æŽ¨é€è‡³è¿œç¨‹ '%s'(其并éžå½“å‰åˆ†æ”¯ '%s' 的上游),\n" "而没有告诉我è¦æŽ¨é€ä»€ä¹ˆã€æ›´æ–°å“ªä¸ªè¿œç¨‹åˆ†æ”¯ã€‚" -#: builtin/push.c:174 +# 译者:å—符串首行行首è¦æ·»åŠ “warning: â€å—串,故æ¤é¦–è¡Œè¦è¾ƒå…¶ä½™è¡ŒçŸ +#: builtin/push.c:151 +msgid "" +"push.default is unset; its implicit value is changing in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the current behavior after the default changes, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" +"push.default 未设置,它的默认值将会在 Git 2.0 ç”± 'matching'\n" +"修改为 'simple'。若è¦ä¸å†æ˜¾ç¤ºæœ¬ä¿¡æ¯å¹¶åœ¨å…¶é»˜è®¤å€¼æ”¹å˜åŽç»´æŒå½“å‰ä½¿ç”¨ä¹ 惯,\n" +"进行如下设置:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"è‹¥è¦ä¸å†æ˜¾ç¤ºæœ¬ä¿¡æ¯å¹¶ä»ŽçŽ°åœ¨å¼€å§‹é‡‡ç”¨æ–°çš„ä½¿ç”¨ä¹ æƒ¯ï¼Œè®¾ç½®ï¼š\n" +"\n" +" git config --global push.default simple\n" +"\n" +"å‚è§ 'git help config' 并查找 'push.default' 以获å–更多信æ¯ã€‚\n" +"('simple' 模å¼ç”± Git 1.7.11 版本引入。如果您有时è¦ä½¿ç”¨è€ç‰ˆæœ¬çš„ Git,\n" +"为ä¿æŒå…¼å®¹ï¼Œè¯·ç”¨ 'current' 代替 'simple' 模å¼ï¼‰" + +#: builtin/push.c:199 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "您没有为推é€æŒ‡å®šä»»ä½•å¼•ç”¨è¡¨è¾¾å¼ï¼Œå¹¶ä¸” push.default 为 \"nothing\"。" -#: builtin/push.c:181 +#: builtin/push.c:206 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -4356,18 +6960,19 @@ msgstr "" "å†æ¬¡æŽ¨é€å‰ï¼Œå…ˆä¸Žè¿œç¨‹å˜æ›´åˆå¹¶ï¼ˆå¦‚ 'git pull')。详è§\n" "'git push --help' ä¸çš„ 'Note about fast-forwards' å°èŠ‚。" -#: builtin/push.c:187 +#: builtin/push.c:212 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" -"specify branches to push or set the 'push.default' configuration\n" -"variable to 'current' or 'upstream' to push only the current branch." +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." msgstr "" "更新被拒ç»ï¼Œå› 为推é€çš„一个分支的最新æ交è½åŽäºŽå…¶å¯¹åº”的远程分支。\n" "如果您并éžæœ‰æ„推é€è¯¥åˆ†æ”¯ï¼Œæ‚¨å¯ä»¥åœ¨æŽ¨é€æ—¶æŒ‡å®šè¦æŽ¨é€çš„分支,或者将\n" -"é…ç½®å˜é‡ 'push.default' 设置为 'current' 或 'upstream' 以便åªæŽ¨é€å½“å‰åˆ†æ”¯ã€‚" +"é…ç½®å˜é‡ 'push.default' 设置为 'simple'ã€'current' 或 'upstream'\n" +"以便åªæŽ¨é€å½“å‰åˆ†æ”¯ã€‚" -#: builtin/push.c:193 +#: builtin/push.c:218 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -4378,22 +6983,22 @@ msgstr "" "检出该分支并与远程å˜æ›´åˆå¹¶ï¼ˆå¦‚ 'git pull'),然åŽå†æŽ¨é€ã€‚详è§\n" "'git push --help' ä¸çš„ 'Note about fast-forwards' å°èŠ‚。" -#: builtin/push.c:233 +#: builtin/push.c:258 #, c-format msgid "Pushing to %s\n" msgstr "推é€åˆ° %s\n" -#: builtin/push.c:237 +#: builtin/push.c:262 #, c-format msgid "failed to push some refs to '%s'" msgstr "æ— æ³•æŽ¨é€ä¸€äº›å¼•ç”¨åˆ° '%s'" -#: builtin/push.c:269 +#: builtin/push.c:294 #, c-format msgid "bad repository '%s'" msgstr "å的版本库 '%s'" -#: builtin/push.c:270 +#: builtin/push.c:295 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -4414,34 +7019,241 @@ msgstr "" "\n" " git push <name>\n" -#: builtin/push.c:285 +#: builtin/push.c:310 msgid "--all and --tags are incompatible" msgstr "--all å’Œ --tags ä¸å…¼å®¹" -#: builtin/push.c:286 +#: builtin/push.c:311 msgid "--all can't be combined with refspecs" msgstr "--all ä¸èƒ½å’Œå¼•ç”¨è¡¨è¾¾å¼åŒæ—¶ä½¿ç”¨" -#: builtin/push.c:291 +#: builtin/push.c:316 msgid "--mirror and --tags are incompatible" msgstr "--mirror å’Œ --tags ä¸å…¼å®¹" -#: builtin/push.c:292 +#: builtin/push.c:317 msgid "--mirror can't be combined with refspecs" msgstr "--mirror ä¸èƒ½å’Œå¼•ç”¨è¡¨è¾¾å¼åŒæ—¶ä½¿ç”¨" -#: builtin/push.c:297 +#: builtin/push.c:322 msgid "--all and --mirror are incompatible" msgstr "--all å’Œ --mirror ä¸å…¼å®¹" -#: builtin/push.c:385 +#: builtin/push.c:382 +#, fuzzy +msgid "repository" +msgstr "å的版本库 '%s'" + +#: builtin/push.c:383 +msgid "push all refs" +msgstr "" + +#: builtin/push.c:384 +msgid "mirror all refs" +msgstr "" + +#: builtin/push.c:386 +#, fuzzy +msgid "delete refs" +msgstr "åˆ é™¤" + +#: builtin/push.c:387 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "" + +#: builtin/push.c:390 +#, fuzzy +msgid "force updates" +msgstr "强制更新" + +#: builtin/push.c:391 +msgid "check" +msgstr "" + +#: builtin/push.c:392 +msgid "control recursive pushing of submodules" +msgstr "" + +#: builtin/push.c:394 +msgid "use thin pack" +msgstr "" + +#: builtin/push.c:395 builtin/push.c:396 +msgid "receive pack program" +msgstr "" + +#: builtin/push.c:397 +msgid "set upstream for git pull/status" +msgstr "" + +#: builtin/push.c:400 +msgid "prune locally removed refs" +msgstr "" + +#: builtin/push.c:410 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete 与 --allã€--mirror åŠ --tags ä¸å…¼å®¹" -#: builtin/push.c:387 +#: builtin/push.c:412 msgid "--delete doesn't make sense without any refs" msgstr "--delete 未接任何引用没有æ„义" +#: 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 "" + +#: builtin/read-tree.c:108 +#, fuzzy +msgid "write resulting index to <file>" +msgstr "æŸå的索引文件" + +#: builtin/read-tree.c:111 +#, fuzzy +msgid "only empty the index" +msgstr "ä¸èƒ½è¯»å–索引" + +#: builtin/read-tree.c:113 +#, fuzzy +msgid "Merging" +msgstr "åˆå¹¶ï¼š" + +#: builtin/read-tree.c:115 +msgid "perform a merge in addition to a read" +msgstr "" + +#: builtin/read-tree.c:117 +msgid "3-way merge if no file level merging required" +msgstr "" + +#: builtin/read-tree.c:119 +msgid "3-way merge in presence of adds and removes" +msgstr "" + +#: builtin/read-tree.c:121 +msgid "same as -m, but discard unmerged entries" +msgstr "" + +#: builtin/read-tree.c:122 +#, fuzzy +msgid "<subdirectory>/" +msgstr "目录/文件" + +#: builtin/read-tree.c:123 +msgid "read the tree into the index under <subdirectory>/" +msgstr "" + +#: builtin/read-tree.c:126 +msgid "update working tree with merge result" +msgstr "" + +#: builtin/read-tree.c:128 +#, fuzzy +msgid "gitignore" +msgstr "忽略的" + +#: builtin/read-tree.c:129 +msgid "allow explicitly ignored files to be overwritten" +msgstr "" + +#: builtin/read-tree.c:132 +#, fuzzy +msgid "don't check the working tree after merging" +msgstr "显示工作区状æ€" + +#: builtin/read-tree.c:133 +msgid "don't update the index or the work tree" +msgstr "" + +#: builtin/read-tree.c:135 +msgid "skip applying sparse checkout filter" +msgstr "" + +#: builtin/read-tree.c:137 +msgid "debug unpack-trees" +msgstr "" + +#: builtin/remote.c:11 +msgid "git remote [-v | --verbose]" +msgstr "" + +#: builtin/remote.c:12 +msgid "" +"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <name> <url>" +msgstr "" + +#: builtin/remote.c:13 builtin/remote.c:32 +msgid "git remote rename <old> <new>" +msgstr "" + +#: builtin/remote.c:14 builtin/remote.c:37 +msgid "git remote remove <name>" +msgstr "" + +#: builtin/remote.c:15 +msgid "git remote set-head <name> (-a | -d | <branch>)" +msgstr "" + +#: builtin/remote.c:16 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "" + +#: builtin/remote.c:17 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "" + +#: builtin/remote.c:18 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" + +#: builtin/remote.c:19 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "" + +#: builtin/remote.c:20 builtin/remote.c:68 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "" + +#: builtin/remote.c:21 builtin/remote.c:69 +msgid "git remote set-url --add <name> <newurl>" +msgstr "" + +#: builtin/remote.c:22 builtin/remote.c:70 +msgid "git remote set-url --delete <name> <url>" +msgstr "" + +#: builtin/remote.c:27 +msgid "git remote add [<options>] <name> <url>" +msgstr "" + +#: builtin/remote.c:42 +msgid "git remote set-head <name> (-a | -d | <branch>])" +msgstr "" + +#: builtin/remote.c:47 +msgid "git remote set-branches <name> <branch>..." +msgstr "" + +#: builtin/remote.c:48 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "" + +#: builtin/remote.c:53 +msgid "git remote show [<options>] <name>" +msgstr "" + +#: builtin/remote.c:58 +msgid "git remote prune [<options>] <name>" +msgstr "" + +#: builtin/remote.c:63 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "" + #: builtin/remote.c:98 #, c-format msgid "Updating %s" @@ -4460,6 +7272,36 @@ msgstr "" msgid "unknown mirror argument: %s" msgstr "未知的镜åƒå‚数:%s" +#: builtin/remote.c:163 +#, fuzzy +msgid "fetch the remote branches" +msgstr " 远程分支:%s" + +#: builtin/remote.c:165 +msgid "import all tags and associated objects when fetching" +msgstr "" + +#: builtin/remote.c:168 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "" + +#: builtin/remote.c:170 +msgid "branch(es) to track" +msgstr "" + +#: builtin/remote.c:171 +#, fuzzy +msgid "master branch" +msgstr " 远程分支:%s" + +#: builtin/remote.c:172 +msgid "push|fetch" +msgstr "" + +#: builtin/remote.c:173 +msgid "set up remote as a mirror to push to or fetch from" +msgstr "" + #: builtin/remote.c:185 msgid "specifying a master branch makes no sense with --mirror" msgstr "指定一个 master 分支并使用 --mirror 选项没有æ„义" @@ -4652,6 +7494,11 @@ msgstr " %-*s 强制推é€è‡³ %s" msgid " %-*s pushes to %s" msgstr " %-*s 推é€è‡³ %s" +#: builtin/remote.c:1091 +#, fuzzy +msgid "do not query remotes" +msgstr "ä¸ä¼šåˆ 除 %s\n" + #: builtin/remote.c:1118 #, c-format msgid "* remote %s" @@ -4711,6 +7558,14 @@ msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] " 为 'git push' é…置的本地引用%s:" msgstr[1] " 为 'git push' é…置的本地引用%s:" +#: builtin/remote.c:1199 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "" + +#: builtin/remote.c:1201 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "" + #: builtin/remote.c:1216 msgid "Cannot determine remote HEAD" msgstr "æ— æ³•ç¡®å®šè¿œç¨‹ HEAD" @@ -4766,15 +7621,37 @@ msgstr " * [å°†åˆ é™¤] %s" msgid " * [pruned] %s" msgstr " * [å·²åˆ é™¤] %s" +#: builtin/remote.c:1321 +msgid "prune remotes after fetching" +msgstr "" + #: builtin/remote.c:1387 builtin/remote.c:1461 #, c-format msgid "No such remote '%s'" msgstr "没有æ¤è¿œç¨‹ '%s'" +#: builtin/remote.c:1407 +#, fuzzy +msgid "add branch" +msgstr "ä½äºŽåˆ†æ”¯ " + #: builtin/remote.c:1414 msgid "no remote specified" msgstr "未指定远程" +#: builtin/remote.c:1436 +msgid "manipulate push URLs" +msgstr "" + +#: builtin/remote.c:1438 +msgid "add URL" +msgstr "" + +#: builtin/remote.c:1440 +#, fuzzy +msgid "delete URLs" +msgstr "åˆ é™¤" + #: builtin/remote.c:1447 msgid "--add --delete doesn't make sense" msgstr "--add --delete æ— æ„义" @@ -4793,6 +7670,56 @@ msgstr "未找到æ¤URL:%s" msgid "Will not delete all non-push URLs" msgstr "å°†ä¸ä¼šåˆ 除所有éžæŽ¨é€URL地å€" +#: builtin/remote.c:1569 +msgid "be verbose; must be placed before a subcommand" +msgstr "" + +#: builtin/replace.c:17 +msgid "git replace [-f] <object> <replacement>" +msgstr "" + +#: builtin/replace.c:18 +msgid "git replace -d <object>..." +msgstr "" + +#: builtin/replace.c:19 +msgid "git replace -l [<pattern>]" +msgstr "" + +#: builtin/replace.c:118 +msgid "list replace refs" +msgstr "" + +#: builtin/replace.c:119 +msgid "delete replace refs" +msgstr "" + +#: builtin/replace.c:120 +msgid "replace the ref if it exists" +msgstr "" + +#: builtin/rerere.c:11 +msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" +msgstr "" + +#: builtin/rerere.c:56 +#, fuzzy +msgid "register clean resolutions in index" +msgstr "%s:已ç»å˜åœ¨äºŽç´¢å¼•ä¸" + +#: builtin/reset.c:25 +msgid "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" +msgstr "" + +#: builtin/reset.c:26 +msgid "git reset [-q] <commit> [--] <paths>..." +msgstr "" + +#: builtin/reset.c:27 +msgid "git reset --patch [<commit>] [--] [<paths>...]" +msgstr "" + #: builtin/reset.c:33 msgid "mixed" msgstr "æ··æ‚" @@ -4849,6 +7776,26 @@ msgstr "é‡ç½®åŽæ’¤å‡ºæš‚å˜åŒºçš„å˜æ›´ï¼š" msgid "Cannot do a %s reset in the middle of a merge." msgstr "在åˆå¹¶è¿‡ç¨‹ä¸ä¸èƒ½åš%sé‡ç½®æ“作。" +#: builtin/reset.c:238 +msgid "be quiet, only report errors" +msgstr "" + +#: builtin/reset.c:240 +msgid "reset HEAD and index" +msgstr "" + +#: builtin/reset.c:241 +msgid "reset only HEAD" +msgstr "" + +#: builtin/reset.c:243 builtin/reset.c:245 +msgid "reset HEAD, index and working tree" +msgstr "" + +#: builtin/reset.c:247 +msgid "reset HEAD but keep local changes" +msgstr "" + #: builtin/reset.c:303 #, c-format msgid "Could not parse object '%s'." @@ -4879,23 +7826,132 @@ msgstr "ä¸èƒ½å¯¹è£¸ç‰ˆæœ¬åº“进行%sé‡ç½®" msgid "Could not reset index file to revision '%s'." msgstr "ä¸èƒ½é‡ç½®ç´¢å¼•æ–‡ä»¶è‡³ç‰ˆæœ¬ '%s'。" +#: builtin/rev-parse.c:339 +#, fuzzy +msgid "git rev-parse --parseopt [options] -- [<args>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" + +#: builtin/rev-parse.c:344 +msgid "keep the `--` passed as an arg" +msgstr "" + +#: builtin/rev-parse.c:346 +msgid "stop parsing after the first non-option argument" +msgstr "" + +#: 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 "" + +#: builtin/revert.c:22 +msgid "git revert [options] <commit-ish>" +msgstr "" + +#: builtin/revert.c:23 +msgid "git revert <subcommand>" +msgstr "" + +#: builtin/revert.c:28 +msgid "git cherry-pick [options] <commit-ish>" +msgstr "" + +#: builtin/revert.c:29 +#, fuzzy +msgid "git cherry-pick <subcommand>" +msgstr "拣选失败" + #: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" -#: builtin/revert.c:131 +#: builtin/revert.c:103 +msgid "end revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:104 +msgid "resume revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:105 +msgid "cancel revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:106 +#, fuzzy +msgid "don't automatically commit" +msgstr "ä¸èƒ½ä½œä¸ºåˆå§‹æ交还原" + +#: builtin/revert.c:107 +#, fuzzy +msgid "edit the commit message" +msgstr "空æ交信æ¯ã€‚" + +#: builtin/revert.c:110 +msgid "parent number" +msgstr "" + +#: builtin/revert.c:112 +#, fuzzy +msgid "merge strategy" +msgstr "å°è¯•åˆå¹¶ç–ç•¥ %s...\n" + +#: builtin/revert.c:113 +#, fuzzy +msgid "option" +msgstr "动作" + +#: builtin/revert.c:114 +#, fuzzy +msgid "option for merge strategy" +msgstr "å°è¯•åˆå¹¶ç–ç•¥ %s...\n" + +#: builtin/revert.c:125 +msgid "append commit name" +msgstr "" + +#: builtin/revert.c:126 +#, fuzzy +msgid "allow fast-forward" +msgstr "(éžå¿«è¿›å¼ï¼‰" + +#: builtin/revert.c:127 +#, fuzzy +msgid "preserve initially empty commits" +msgstr "ä¸èƒ½ä½œä¸ºåˆå§‹æ交还原" + +#: builtin/revert.c:128 +#, fuzzy +msgid "allow commits with empty messages" +msgstr "æ交说明为空" + +#: builtin/revert.c:129 +#, fuzzy +msgid "keep redundant, empty commits" +msgstr "åˆå¹¶æœªè¿”回æ交" + +#: builtin/revert.c:133 msgid "program error" msgstr "程åºé”™è¯¯" -#: builtin/revert.c:221 +#: builtin/revert.c:223 msgid "revert failed" msgstr "还原失败" -#: builtin/revert.c:236 +#: builtin/revert.c:238 msgid "cherry-pick failed" msgstr "拣选失败" +#: builtin/rm.c:14 +#, fuzzy +msgid "git rm [options] [--] <file>..." +msgstr "git apply [选项] [<è¡¥ä¸>...]" + #: builtin/rm.c:109 #, c-format msgid "" @@ -4923,6 +7979,28 @@ msgstr "" "'%s' 有本地修改\n" "(使用 --cached ä¿å˜æ–‡ä»¶ï¼Œæˆ–用 -f å¼ºåˆ¶åˆ é™¤ï¼‰" +#: builtin/rm.c:134 +#, fuzzy +msgid "do not list removed files" +msgstr "æ— æ³•è¿˜åŽŸä¿®æ”¹çš„æ–‡ä»¶" + +#: builtin/rm.c:135 +#, fuzzy +msgid "only remove from the index" +msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸ç§»é™¤ %s" + +#: builtin/rm.c:136 +msgid "override the up-to-date check" +msgstr "" + +#: builtin/rm.c:137 +msgid "allow recursive removal" +msgstr "" + +#: builtin/rm.c:139 +msgid "exit with a zero status even if nothing matched" +msgstr "" + #: builtin/rm.c:194 #, c-format msgid "not removing '%s' recursively without -r" @@ -4933,11 +8011,199 @@ msgstr "未æä¾› -r 选项ä¸ä¼šé€’å½’åˆ é™¤ '%s'" msgid "git rm: unable to remove %s" msgstr "git rm:ä¸èƒ½åˆ 除 %s" +#: builtin/shortlog.c:13 +msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" +msgstr "" + #: builtin/shortlog.c:157 #, c-format msgid "Missing author: %s" msgstr "缺少作者:%s" +#: builtin/shortlog.c:253 +msgid "sort output according to the number of commits per author" +msgstr "" + +#: builtin/shortlog.c:255 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "" + +#: builtin/shortlog.c:257 +msgid "Show the email address of each author" +msgstr "" + +#: builtin/shortlog.c:258 +msgid "w[,i1[,i2]]" +msgstr "" + +#: builtin/shortlog.c:259 +msgid "Linewrap output" +msgstr "" + +#: 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 "" + +#: builtin/show-branch.c:10 +msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "" + +#: builtin/show-branch.c:651 +#, fuzzy +msgid "show remote-tracking and local branches" +msgstr "%s 没有æ¥è‡ª %s 的远程跟踪分支" + +#: builtin/show-branch.c:653 +#, fuzzy +msgid "show remote-tracking branches" +msgstr "%s 没有æ¥è‡ª %s 的远程跟踪分支" + +#: builtin/show-branch.c:655 +msgid "color '*!+-' corresponding to the branch" +msgstr "" + +#: builtin/show-branch.c:657 +msgid "show <n> more commits after the common ancestor" +msgstr "" + +#: builtin/show-branch.c:659 +msgid "synonym to more=-1" +msgstr "" + +#: builtin/show-branch.c:660 +msgid "suppress naming strings" +msgstr "" + +#: builtin/show-branch.c:662 +#, fuzzy +msgid "include the current branch" +msgstr "没有当å‰åˆ†æ”¯ã€‚" + +#: builtin/show-branch.c:664 +#, fuzzy +msgid "name commits with their object names" +msgstr "ä¸èƒ½å†™æ³¨è§£å¯¹è±¡" + +#: builtin/show-branch.c:666 +msgid "show possible merge bases" +msgstr "" + +#: builtin/show-branch.c:668 +msgid "show refs unreachable from any other ref" +msgstr "" + +#: builtin/show-branch.c:670 +msgid "show commits in topological order" +msgstr "" + +#: builtin/show-branch.c:672 +msgid "show only commits not on the first branch" +msgstr "" + +#: builtin/show-branch.c:674 +msgid "show merges reachable from only one tip" +msgstr "" + +#: builtin/show-branch.c:676 +msgid "show commits where no parent comes before its children" +msgstr "" + +#: builtin/show-branch.c:678 +msgid "<n>[,<base>]" +msgstr "" + +#: builtin/show-branch.c:679 +msgid "show <n> most recent ref-log entries starting at base" +msgstr "" + +#: builtin/show-ref.c:10 +msgid "" +"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash" +"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] " +msgstr "" + +#: builtin/show-ref.c:11 +msgid "git show-ref --exclude-existing[=pattern] < ref-list" +msgstr "" + +#: builtin/show-ref.c:182 +#, fuzzy +msgid "only show tags (can be combined with heads)" +msgstr "--all ä¸èƒ½å’Œå¼•ç”¨è¡¨è¾¾å¼åŒæ—¶ä½¿ç”¨" + +#: builtin/show-ref.c:183 +#, fuzzy +msgid "only show heads (can be combined with tags)" +msgstr "--all ä¸èƒ½å’Œå¼•ç”¨è¡¨è¾¾å¼åŒæ—¶ä½¿ç”¨" + +#: builtin/show-ref.c:184 +msgid "stricter reference checking, requires exact ref path" +msgstr "" + +#: builtin/show-ref.c:187 builtin/show-ref.c:189 +msgid "show the HEAD reference" +msgstr "" + +#: builtin/show-ref.c:191 +#, fuzzy +msgid "dereference tags into object IDs" +msgstr "引用ä¸æ˜¯ä¸€ä¸ªæ ‘:%s" + +#: builtin/show-ref.c:193 +msgid "only show SHA1 hash using <n> digits" +msgstr "" + +#: builtin/show-ref.c:197 +msgid "do not print results to stdout (useful with --verify)" +msgstr "" + +#: builtin/show-ref.c:199 +msgid "show refs from stdin that aren't in local repository" +msgstr "" + +#: builtin/symbolic-ref.c:7 +msgid "git symbolic-ref [options] name [ref]" +msgstr "" + +#: builtin/symbolic-ref.c:38 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "" + +#: builtin/symbolic-ref.c:39 +msgid "shorten ref output" +msgstr "" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason" +msgstr "" + +#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18 +msgid "reason of the update" +msgstr "" + +#: builtin/tag.c:22 +msgid "" +"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]" +msgstr "" + +#: builtin/tag.c:23 +msgid "git tag -d <tagname>..." +msgstr "" + +#: builtin/tag.c:24 +msgid "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n" +"\t\t[<pattern>...]" +msgstr "" + +#: builtin/tag.c:26 +msgid "git tag -v <tagname>..." +msgstr "" + #: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" @@ -5026,6 +8292,66 @@ msgstr "开关 'points-at' 需è¦ä¸€ä¸ªå¯¹è±¡" msgid "malformed object name '%s'" msgstr "éžæ³•çš„对象å '%s'" +#: builtin/tag.c:447 +msgid "list tag names" +msgstr "" + +#: builtin/tag.c:449 +msgid "print <n> lines of each tag message" +msgstr "" + +#: builtin/tag.c:451 +#, fuzzy +msgid "delete tags" +msgstr "åˆ é™¤" + +#: builtin/tag.c:452 +msgid "verify tags" +msgstr "" + +#: builtin/tag.c:454 +msgid "Tag creation options" +msgstr "" + +#: builtin/tag.c:456 +#, fuzzy +msgid "annotated tag, needs a message" +msgstr "注释 tag %s 没有嵌入å称" + +#: builtin/tag.c:458 +#, fuzzy +msgid "tag message" +msgstr "æ— tag 说明?" + +#: builtin/tag.c:460 +msgid "annotated and GPG-signed tag" +msgstr "" + +#: builtin/tag.c:464 +#, fuzzy +msgid "use another key to sign the tag" +msgstr "æ— æ³•ç¾ç½² tag" + +#: builtin/tag.c:465 +msgid "replace the tag if exists" +msgstr "" + +#: builtin/tag.c:466 +msgid "show tag list in columns" +msgstr "" + +#: builtin/tag.c:468 +msgid "Tag listing options" +msgstr "" + +#: builtin/tag.c:471 +msgid "print only tags that contain the commit" +msgstr "" + +#: builtin/tag.c:477 +msgid "print only tags of the object" +msgstr "" + #: builtin/tag.c:506 msgid "--column and -n are incompatible" msgstr "--column å’Œ -n ä¸å…¼å®¹" @@ -5075,25 +8401,187 @@ msgstr "%s:ä¸èƒ½æ›´æ–°å¼•ç”¨" msgid "Updated tag '%s' (was %s)\n" msgstr "已更新tag '%s'(曾为 %s)\n" -#: git.c:16 -msgid "See 'git help <command>' for more information on a specific command." -msgstr "å‚è§ 'git help <command>' 以获得该特定命令的详细信æ¯ã€‚" +#: builtin/update-index.c:401 +#, fuzzy +msgid "git update-index [options] [--] [<file>...]" +msgstr "git apply [选项] [<è¡¥ä¸>...]" -#: parse-options.h:133 parse-options.h:235 -msgid "n" -msgstr "æ•°å—" +#: builtin/update-index.c:717 +msgid "continue refresh even when index needs update" +msgstr "" -#: parse-options.h:141 -msgid "time" -msgstr "时间" +#: builtin/update-index.c:720 +msgid "refresh: ignore submodules" +msgstr "" -#: parse-options.h:149 -msgid "file" -msgstr "文件" +#: builtin/update-index.c:723 +#, fuzzy +msgid "do not ignore new files" +msgstr "æ— æ³•å˜å‚¨ç´¢å¼•æ–‡ä»¶" -#: parse-options.h:151 -msgid "when" -msgstr "何时" +#: builtin/update-index.c:725 +msgid "let files replace directories and vice-versa" +msgstr "" + +#: builtin/update-index.c:727 +msgid "notice files missing from worktree" +msgstr "" + +#: builtin/update-index.c:729 +msgid "refresh even if index contains unmerged entries" +msgstr "" + +#: builtin/update-index.c:732 +msgid "refresh stat information" +msgstr "" + +#: builtin/update-index.c:736 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "" + +#: builtin/update-index.c:740 +msgid "<mode> <object> <path>" +msgstr "" + +#: builtin/update-index.c:741 +#, fuzzy +msgid "add the specified entry to the index" +msgstr "æ·»åŠ æ–‡ä»¶å†…å®¹è‡³ç´¢å¼•" + +#: builtin/update-index.c:745 +msgid "(+/-)x" +msgstr "" + +#: builtin/update-index.c:746 +msgid "override the executable bit of the listed files" +msgstr "" + +#: builtin/update-index.c:750 +msgid "mark files as \"not changing\"" +msgstr "" + +#: builtin/update-index.c:753 +msgid "clear assumed-unchanged bit" +msgstr "" + +#: builtin/update-index.c:756 +msgid "mark files as \"index-only\"" +msgstr "" + +#: builtin/update-index.c:759 +msgid "clear skip-worktree bit" +msgstr "" + +#: builtin/update-index.c:762 +msgid "add to index only; do not add content to object database" +msgstr "" + +#: builtin/update-index.c:764 +msgid "remove named paths even if present in worktree" +msgstr "" + +#: builtin/update-index.c:766 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "" + +#: builtin/update-index.c:768 +#, fuzzy +msgid "read list of paths to be updated from standard input" +msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" + +#: builtin/update-index.c:772 +#, fuzzy +msgid "add entries from standard input to the index" +msgstr "ä¸èƒ½ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯" + +#: builtin/update-index.c:776 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "" + +#: builtin/update-index.c:780 +msgid "only update entries that differ from HEAD" +msgstr "" + +#: builtin/update-index.c:784 +msgid "ignore files missing from worktree" +msgstr "" + +#: builtin/update-index.c:787 +msgid "report actions to standard output" +msgstr "" + +#: builtin/update-index.c:789 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "" + +#: builtin/update-index.c:793 +msgid "write index in this format" +msgstr "" + +#: builtin/update-ref.c:7 +msgid "git update-ref [options] -d <refname> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:8 +msgid "git update-ref [options] <refname> <newval> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:19 +msgid "delete the reference" +msgstr "" + +#: builtin/update-ref.c:21 +msgid "update <refname> not the one it points to" +msgstr "" + +#: builtin/update-server-info.c:6 +msgid "git update-server-info [--force]" +msgstr "" + +#: builtin/update-server-info.c:14 +msgid "update the info files from scratch" +msgstr "" + +#: builtin/verify-pack.c:56 +msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..." +msgstr "" + +#: builtin/verify-pack.c:66 +#, fuzzy +msgid "verbose" +msgstr "冗长输出" + +#: builtin/verify-pack.c:68 +msgid "show statistics only" +msgstr "" + +#: builtin/verify-tag.c:17 +msgid "git verify-tag [-v|--verbose] <tag>..." +msgstr "" + +#: builtin/verify-tag.c:73 +msgid "print tag contents" +msgstr "" + +#: builtin/write-tree.c:13 +msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" +msgstr "" + +#: builtin/write-tree.c:26 +msgid "<prefix>/" +msgstr "" + +#: builtin/write-tree.c:27 +msgid "write tree object for a subdirectory <prefix>" +msgstr "" + +#: builtin/write-tree.c:30 +msgid "only useful for debugging" +msgstr "" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "å‚è§ 'git help <command>' 以获得该特定命令的详细信æ¯ã€‚" #: parse-options.h:156 msgid "no-op (backward compatibility)" @@ -5344,6 +8832,13 @@ msgstr "没有å˜æ›´ -- è¡¥ä¸å·²ç»åº”用过。" msgid "Patch failed at $msgnum $FIRSTLINE" msgstr "è¡¥ä¸å¤±è´¥äºŽ $msgnum $FIRSTLINE" +#: git-am.sh:858 +#, sh-format +msgid "" +"The copy of the patch that failed is found in:\n" +" $dotest/patch" +msgstr "" + #: git-am.sh:876 msgid "applying to an empty history" msgstr "æ£åº”用到一个空历å²ä¸Š" @@ -5769,25 +9264,25 @@ msgstr "ä¸èƒ½ä¿å˜ç´¢å¼•æ ‘" msgid "Cannot unstage modified files" msgstr "æ— æ³•è¿˜åŽŸä¿®æ”¹çš„æ–‡ä»¶" -#: git-stash.sh:474 +#: git-stash.sh:475 msgid "Index was not unstashed." msgstr "索引的进度没有被æ¢å¤ã€‚" -#: git-stash.sh:491 +#: git-stash.sh:492 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "丢弃了 ${REV} ($s)" -#: git-stash.sh:492 +#: git-stash.sh:493 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}:ä¸èƒ½ä¸¢å¼ƒè¿›åº¦æ¡ç›®" -#: git-stash.sh:499 +#: git-stash.sh:500 msgid "No branch name specified" msgstr "未指定分支å" -#: git-stash.sh:570 +#: git-stash.sh:571 msgid "(To restore them type \"git stash apply\")" msgstr "(为æ¢å¤æ•°æ®è¾“å…¥ \"git stash apply\")" @@ -5796,32 +9291,32 @@ msgstr "(为æ¢å¤æ•°æ®è¾“å…¥ \"git stash apply\")" msgid "cannot strip one component off url '$remoteurl'" msgstr "æ— æ³•ä»Ž url '$remoteurl' 剥离一个组件" -#: git-submodule.sh:145 +#: git-submodule.sh:167 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" msgstr "未在 .gitmodules ä¸å‘现路径 '$sm_path' çš„åæ¨¡ç»„æ˜ å°„" -#: git-submodule.sh:189 +#: git-submodule.sh:211 #, sh-format msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "æ— æ³•å…‹éš† '$url' 到å模组路径 '$sm_path'" -#: git-submodule.sh:201 +#: git-submodule.sh:223 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "Gitdir '$a' 在å模组路径 '$b' 之下或者相å" -#: git-submodule.sh:290 +#: git-submodule.sh:312 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "版本库URL:'$repo' 必须是ç»å¯¹è·¯å¾„或以 ./|../ 起始" -#: git-submodule.sh:307 +#: git-submodule.sh:329 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "'$sm_path' å·²ç»å˜åœ¨äºŽç´¢å¼•ä¸" -#: git-submodule.sh:311 +#: git-submodule.sh:333 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" @@ -5832,62 +9327,62 @@ msgstr "" "$sm_path\n" "å¦‚æžœæ‚¨ç¡®å®žæƒ³æ·»åŠ å®ƒï¼Œä½¿ç”¨ -f å‚数。" -#: git-submodule.sh:322 +#: git-submodule.sh:344 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "æ·»åŠ ä½äºŽ '$sm_path' 的现å˜ç‰ˆæœ¬åº“到索引" -#: git-submodule.sh:324 +#: git-submodule.sh:346 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "'$sm_path' å·²å˜åœ¨ä¸”ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ git 版本库" -#: git-submodule.sh:338 +#: git-submodule.sh:360 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "ä¸èƒ½æ£€å‡ºå模组 '$sm_path'" -#: git-submodule.sh:343 +#: git-submodule.sh:365 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "æ— æ³•æ·»åŠ å模组 '$sm_path'" -#: git-submodule.sh:348 +#: git-submodule.sh:370 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "æ— æ³•æ³¨å†Œå模组 '$sm_path'" -#: git-submodule.sh:390 +#: git-submodule.sh:413 #, sh-format msgid "Entering '$prefix$sm_path'" msgstr "æ£åœ¨è¿›å…¥ '$prefix$sm_path'" -#: git-submodule.sh:404 +#: git-submodule.sh:427 #, sh-format msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "åœæ¢äºŽ '$sm_path',脚本返回éžé›¶å€¼ã€‚" -#: git-submodule.sh:447 +#: git-submodule.sh:471 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "在 .gitmodules ä¸æœªæ‰¾åˆ°å模组路径 '$sm_path' çš„ url" -#: git-submodule.sh:456 +#: git-submodule.sh:480 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "æ— æ³•ä¸ºå模组路径 '$sm_path' 注册 url" -#: git-submodule.sh:458 +#: git-submodule.sh:482 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "å模组 '$name' ($url) 已为路径 '$sm_path' 注册" -#: git-submodule.sh:466 +#: git-submodule.sh:490 #, sh-format msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "æ— æ³•ä¸ºå模组路径 '$sm_path' 注册更新模å¼" -#: git-submodule.sh:565 +#: git-submodule.sh:590 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" @@ -5896,92 +9391,130 @@ msgstr "" "å模组路径 '$sm_path' 没有åˆå§‹åŒ–\n" "也许您想用 'update --init'?" -#: git-submodule.sh:578 +#: git-submodule.sh:603 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "æ— æ³•åœ¨å模组路径 '$sm_path' ä¸æ‰¾åˆ°å½“å‰ç‰ˆæœ¬" -#: git-submodule.sh:597 +#: git-submodule.sh:622 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "æ— æ³•åœ¨å模组路径 '$sm_path' ä¸èŽ·å–" -#: git-submodule.sh:611 +#: git-submodule.sh:636 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "æ— æ³•åœ¨å模组路径 '$sm_path' ä¸å˜åŸº '$sha1'" -#: git-submodule.sh:612 +#: git-submodule.sh:637 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "å模组路径 '$sm_path':å˜åŸºè‡³ '$sha1'" -#: git-submodule.sh:617 +#: git-submodule.sh:642 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "æ— æ³•åˆå¹¶ '$sha1' 到å模组路径 '$sm_path' ä¸" -#: git-submodule.sh:618 +#: git-submodule.sh:643 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "å模组路径 '$sm_path':已åˆå¹¶å…¥ '$sha1'" -#: git-submodule.sh:623 +#: git-submodule.sh:648 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "æ— æ³•åœ¨å模组路径 '$sm_path' ä¸æ£€å‡º '$sha1'" -#: git-submodule.sh:624 +#: git-submodule.sh:649 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "å模组路径 '$sm_path':检出 '$sha1'" -#: git-submodule.sh:646 git-submodule.sh:969 +#: git-submodule.sh:671 git-submodule.sh:995 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "æ— æ³•é€’å½’è¿›å模组路径 '$sm_path'" -#: git-submodule.sh:754 +#: git-submodule.sh:779 msgid "The --cached option cannot be used with the --files option" msgstr "选项 --cached ä¸èƒ½å’Œé€‰é¡¹ --files åŒæ—¶ä½¿ç”¨" #. unexpected type -#: git-submodule.sh:794 +#: git-submodule.sh:819 #, sh-format msgid "unexpected mode $mod_dst" msgstr "æ„å¤–çš„æ¨¡å¼ $mod_dst" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:812 +#: git-submodule.sh:837 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " è¦å‘Šï¼š$name 未包å«æ交 $sha1_src" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:815 +#: git-submodule.sh:840 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " è¦å‘Šï¼š$name 未包å«æ交 $sha1_dst" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:818 +#: git-submodule.sh:843 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr " è¦å‘Šï¼š$name 未包å«æ交 $sha1_src å’Œ $sha1_dst" -#: git-submodule.sh:843 +#: git-submodule.sh:868 msgid "blob" msgstr "二进制对象" -#: git-submodule.sh:881 +#: git-submodule.sh:906 msgid "# Submodules changed but not updated:" msgstr "# å模组已修改但尚未更新:" -#: git-submodule.sh:883 +#: git-submodule.sh:908 msgid "# Submodule changes to be committed:" msgstr "è¦æ交的å模组å˜æ›´ï¼š" -#: git-submodule.sh:1027 +#: git-submodule.sh:1054 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "为 '$name' åŒæ¥å模组 url" + +# 译者:ä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ +#~ msgid " (use \"git add\" to track)" +#~ msgstr "(使用 \"git add\" 建立跟踪)" + +#~ msgid "-B cannot be used with -b" +#~ msgstr "-B ä¸èƒ½å’Œ -b åŒæ—¶ä½¿ç”¨" + +#~ msgid "--patch is incompatible with all other options" +#~ msgstr "--patch 选项和其他选项ä¸å…¼å®¹" + +#~ msgid "--detach cannot be used with -b/-B/--orphan" +#~ msgstr "--detach ä¸èƒ½å’Œ -b/-B/--orphan åŒæ—¶ä½¿ç”¨" + +#~ msgid "--detach cannot be used with -t" +#~ msgstr "--detach ä¸èƒ½å’Œ -t åŒæ—¶ä½¿ç”¨" + +#~ msgid "--orphan and -b|-B are mutually exclusive" +#~ msgstr "--orphan å’Œ -b|-B 互斥" + +#~ msgid "--orphan cannot be used with -t" +#~ msgstr "--orphan ä¸èƒ½å’Œ -t åŒæ—¶ä½¿ç”¨" + +#~ msgid "git checkout: -f and -m are incompatible" +#~ msgstr "git checkout:-f å’Œ -m ä¸å…¼å®¹" + +#~ msgid "" +#~ "git checkout: updating paths is incompatible with switching branches." +#~ msgstr "git checkout:更新路径和切æ¢åˆ†æ”¯ä¸å…¼å®¹ã€‚" + +#~ msgid "diff setup failed" +#~ msgstr "diff 设置失败" + +#~ msgid "merge-recursive: disk full?" +#~ msgstr "merge-recursive:ç£ç›˜å·²æ»¡ï¼Ÿ" + +#~ msgid "diff_setup_done failed" +#~ msgstr "diff_setup_done 失败" diff --git a/read-cache.c b/read-cache.c index 2f8159fb16..fda78bc353 100644 --- a/read-cache.c +++ b/read-cache.c @@ -424,7 +424,7 @@ int cache_name_compare(const char *name1, int len1, const char *name2, int len2) return cache_name_stage_compare(name1, len1, 0, name2, len2, 0); } -int index_name_stage_pos(const struct index_state *istate, const char *name, int namelen, int stage) +static int index_name_stage_pos(const struct index_state *istate, const char *name, int namelen, int stage) { int first, last; @@ -1414,11 +1414,9 @@ int read_index_from(struct index_state *istate, const char *path) size_t mmap_size; struct strbuf previous_name_buf = STRBUF_INIT, *previous_name; - errno = EBUSY; if (istate->initialized) return istate->cache_nr; - errno = ENOENT; istate->timestamp.sec = 0; istate->timestamp.nsec = 0; fd = open(path, O_RDONLY); @@ -1431,15 +1429,14 @@ int read_index_from(struct index_state *istate, const char *path) if (fstat(fd, &st)) die_errno("cannot stat the open index"); - errno = EINVAL; mmap_size = xsize_t(st.st_size); if (mmap_size < sizeof(struct cache_header) + 20) die("index file smaller than expected"); mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - close(fd); if (mmap == MAP_FAILED) die_errno("unable to map index file"); + close(fd); hdr = mmap; if (verify_hdr(hdr, mmap_size) < 0) @@ -1495,7 +1492,6 @@ int read_index_from(struct index_state *istate, const char *path) unmap: munmap(mmap, mmap_size); - errno = EINVAL; die("index file corrupt"); } @@ -1800,6 +1796,8 @@ int write_index(struct index_state *istate, int newfd) continue; if (!ce_uptodate(ce) && is_racy_timestamp(istate, ce)) ce_smudge_racily_clean_entry(ce); + if (is_null_sha1(ce->sha1)) + return error("cache entry has null sha1: %s", ce->name); if (ce_write_entry(&c, newfd, ce, previous_name) < 0) return -1; } diff --git a/remote-curl.c b/remote-curl.c index 04a9d6277d..42716c59cf 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -95,15 +95,16 @@ static struct discovery* discover_refs(const char *service) struct strbuf buffer = STRBUF_INIT; struct discovery *last = last_discovery; char *refs_url; - int http_ret, is_http = 0, proto_git_candidate = 1; + int http_ret, maybe_smart = 0; if (last && !strcmp(service, last->service)) return last; free_discovery(last); strbuf_addf(&buffer, "%sinfo/refs", url); - if (!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) { - is_http = 1; + if ((!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) && + git_env_bool("GIT_SMART_HTTP", 1)) { + maybe_smart = 1; if (!strchr(url, '?')) strbuf_addch(&buffer, '?'); else @@ -113,19 +114,6 @@ static struct discovery* discover_refs(const char *service) refs_url = strbuf_detach(&buffer, NULL); http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE); - - /* try again with "plain" url (no ? or & appended) */ - if (http_ret != HTTP_OK && http_ret != HTTP_NOAUTH) { - free(refs_url); - strbuf_reset(&buffer); - - proto_git_candidate = 0; - strbuf_addf(&buffer, "%sinfo/refs", url); - refs_url = strbuf_detach(&buffer, NULL); - - http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE); - } - switch (http_ret) { case HTTP_OK: break; @@ -144,8 +132,7 @@ static struct discovery* discover_refs(const char *service) last->buf_alloc = strbuf_detach(&buffer, &last->len); last->buf = last->buf_alloc; - if (is_http && proto_git_candidate - && 5 <= last->len && last->buf[4] == '#') { + if (maybe_smart && 5 <= last->len && last->buf[4] == '#') { /* smart HTTP response; validate that the service * pkt-line matches our request. */ @@ -362,16 +349,17 @@ static size_t rpc_in(char *ptr, size_t eltsize, static int run_slot(struct active_request_slot *slot) { - int err = 0; + int err; struct slot_results results; slot->results = &results; slot->curl_result = curl_easy_perform(slot->curl); finish_active_slot(slot); - if (results.curl_result != CURLE_OK) { - err |= error("RPC failed; result=%d, HTTP code = %ld", - results.curl_result, results.http_code); + err = handle_curl_result(slot, &results); + if (err != HTTP_OK && err != HTTP_REAUTH) { + error("RPC failed; result=%d, HTTP code = %ld", + results.curl_result, results.http_code); } return err; @@ -392,7 +380,7 @@ static int probe_rpc(struct rpc_state *rpc) curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0); curl_easy_setopt(slot->curl, CURLOPT_POST, 1); curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url); - curl_easy_setopt(slot->curl, CURLOPT_ENCODING, ""); + curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL); curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000"); curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers); @@ -436,9 +424,11 @@ static int post_rpc(struct rpc_state *rpc) } if (large_request) { - err = probe_rpc(rpc); - if (err) - return err; + do { + err = probe_rpc(rpc); + } while (err == HTTP_REAUTH); + if (err != HTTP_OK) + return -1; } slot = get_active_slot(); @@ -446,7 +436,7 @@ static int post_rpc(struct rpc_state *rpc) curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0); curl_easy_setopt(slot->curl, CURLOPT_POST, 1); curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url); - curl_easy_setopt(slot->curl, CURLOPT_ENCODING, ""); + 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); @@ -525,7 +515,11 @@ 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); - err = run_slot(slot); + do { + err = run_slot(slot); + } while (err == HTTP_REAUTH && !large_request && !use_gzip); + if (err != HTTP_OK) + err = -1; curl_slist_free_all(headers); free(gzip_body); @@ -25,7 +25,7 @@ const char *rerere_path(const char *hex, const char *file) return git_path("rr-cache/%s/%s", hex, file); } -int has_rerere_resolution(const char *hex) +static int has_rerere_resolution(const char *hex) { struct stat st; return !stat(rerere_path(hex, "postimage"), &st); @@ -16,7 +16,6 @@ extern void *RERERE_RESOLVED; extern int setup_rerere(struct string_list *, int); extern int rerere(int); extern const char *rerere_path(const char *hex, const char *file); -extern int has_rerere_resolution(const char *hex); extern int rerere_forget(const char **); extern int rerere_remaining(struct string_list *); extern void rerere_clear(struct string_list *); diff --git a/revision.c b/revision.c index 9e8f47a25d..a09e60bedb 100644 --- a/revision.c +++ b/revision.c @@ -345,6 +345,7 @@ static int tree_difference = REV_TREE_SAME; static void file_add_remove(struct diff_options *options, int addremove, unsigned mode, const unsigned char *sha1, + int sha1_valid, const char *fullpath, unsigned dirty_submodule) { int diff = addremove == '+' ? REV_TREE_NEW : REV_TREE_OLD; @@ -358,6 +359,7 @@ static void file_change(struct diff_options *options, unsigned old_mode, unsigned new_mode, const unsigned char *old_sha1, const unsigned char *new_sha1, + int old_sha1_valid, int new_sha1_valid, const char *fullpath, unsigned old_dirty_submodule, unsigned new_dirty_submodule) { @@ -1132,15 +1134,27 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi const char *this = arg; int symmetric = *next == '.'; unsigned int flags_exclude = flags ^ UNINTERESTING; + static const char head_by_default[] = "HEAD"; unsigned int a_flags; *dotdot = 0; next += symmetric; if (!*next) - next = "HEAD"; + next = head_by_default; if (dotdot == arg) - this = "HEAD"; + this = head_by_default; + if (this == head_by_default && next == head_by_default && + !symmetric) { + /* + * Just ".."? That is not a range but the + * pathspec for the parent directory. + */ + if (!cant_be_filename) { + *dotdot = '.'; + return -1; + } + } if (!get_sha1_committish(this, from_sha1) && !get_sha1_committish(next, sha1)) { struct commit *a, *b; @@ -1298,7 +1312,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg !strcmp(arg, "--no-walk") || !strcmp(arg, "--do-walk") || !strcmp(arg, "--bisect") || !prefixcmp(arg, "--glob=") || !prefixcmp(arg, "--branches=") || !prefixcmp(arg, "--tags=") || - !prefixcmp(arg, "--remotes=")) + !prefixcmp(arg, "--remotes=") || !prefixcmp(arg, "--no-walk=")) { unkv[(*unkc)++] = arg; return 1; @@ -1581,9 +1595,14 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if ((argcount = parse_long_opt("committer", argv, &optarg))) { add_header_grep(revs, GREP_HEADER_COMMITTER, optarg); return argcount; + } else if ((argcount = parse_long_opt("grep-reflog", argv, &optarg))) { + add_header_grep(revs, GREP_HEADER_REFLOG, optarg); + return argcount; } else if ((argcount = parse_long_opt("grep", argv, &optarg))) { add_message_grep(revs, optarg); return argcount; + } else if (!strcmp(arg, "--grep-debug")) { + revs->grep_filter.debug = 1; } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) { revs->grep_filter.regflags |= REG_EXTENDED; } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) { @@ -1693,7 +1712,18 @@ static int handle_revision_pseudo_opt(const char *submodule, } else if (!strcmp(arg, "--not")) { *flags ^= UNINTERESTING; } else if (!strcmp(arg, "--no-walk")) { - revs->no_walk = 1; + revs->no_walk = REVISION_WALK_NO_WALK_SORTED; + } else if (!prefixcmp(arg, "--no-walk=")) { + /* + * Detached form ("--no-walk X" as opposed to "--no-walk=X") + * not allowed, since the argument is optional. + */ + if (!strcmp(arg + 10, "sorted")) + revs->no_walk = REVISION_WALK_NO_WALK_SORTED; + else if (!strcmp(arg + 10, "unsorted")) + revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED; + else + return error("invalid argument to --no-walk"); } else if (!strcmp(arg, "--do-walk")) { revs->no_walk = 0; } else { @@ -1861,8 +1891,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s if (revs->combine_merges) revs->ignore_merges = 0; revs->diffopt.abbrev = revs->abbrev; - if (diff_setup_done(&revs->diffopt) < 0) - die("diff_setup_done failed"); + diff_setup_done(&revs->diffopt); compile_grep_patterns(&revs->grep_filter); @@ -1879,6 +1908,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s if (revs->reflog_info && revs->graph) die("cannot combine --walk-reflogs with --graph"); + if (!revs->reflog_info && revs->grep_filter.use_reflog_filter) + die("cannot use --grep-reflog without --walk-reflogs"); return left; } @@ -2116,10 +2147,11 @@ int prepare_revision_walk(struct rev_info *revs) } e++; } - commit_list_sort_by_date(&revs->commits); if (!revs->leak_pending) free(list); + if (revs->no_walk != REVISION_WALK_NO_WALK_UNSORTED) + commit_list_sort_by_date(&revs->commits); if (revs->no_walk) return 0; if (revs->limited) @@ -2183,10 +2215,38 @@ static int rewrite_parents(struct rev_info *revs, struct commit *commit) static int commit_match(struct commit *commit, struct rev_info *opt) { + int retval; + struct strbuf buf = STRBUF_INIT; if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list) return 1; - return grep_buffer(&opt->grep_filter, - commit->buffer, strlen(commit->buffer)); + + /* Prepend "fake" headers as needed */ + if (opt->grep_filter.use_reflog_filter) { + strbuf_addstr(&buf, "reflog "); + get_reflog_message(&buf, opt->reflog_info); + strbuf_addch(&buf, '\n'); + } + + /* Copy the commit to temporary if we are using "fake" headers */ + if (buf.len) + strbuf_addstr(&buf, commit->buffer); + + /* Append "fake" message parts as needed */ + if (opt->show_notes) { + if (!buf.len) + strbuf_addstr(&buf, commit->buffer); + format_display_notes(commit->object.sha1, &buf, + get_log_output_encoding(), 0); + } + + /* Find either in the commit object, or in the temporary */ + if (buf.len) + retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len); + else + retval = grep_buffer(&opt->grep_filter, + commit->buffer, strlen(commit->buffer)); + strbuf_release(&buf); + return retval; } static inline int want_ancestry(struct rev_info *revs) diff --git a/revision.h b/revision.h index cb5ab3513b..a95bd0b3f3 100644 --- a/revision.h +++ b/revision.h @@ -41,6 +41,10 @@ struct rev_cmdline_info { } *rev; }; +#define REVISION_WALK_WALK 0 +#define REVISION_WALK_NO_WALK_SORTED 1 +#define REVISION_WALK_NO_WALK_UNSORTED 2 + struct rev_info { /* Starting list */ struct commit_list *commits; @@ -62,7 +66,7 @@ struct rev_info { /* Traversal flags */ unsigned int dense:1, prune:1, - no_walk:1, + no_walk:2, show_all:1, remove_empty_trees:1, simplify_history:1, diff --git a/run-command.c b/run-command.c index 606791dc67..3b982e4d55 100644 --- a/run-command.c +++ b/run-command.c @@ -53,13 +53,14 @@ static void mark_child_for_cleanup(pid_t pid) static void clear_child_for_cleanup(pid_t pid) { - struct child_to_clean **last, *p; + struct child_to_clean **pp; - last = &children_to_clean; - for (p = children_to_clean; p; p = p->next) { - if (p->pid == pid) { - *last = p->next; - free(p); + for (pp = &children_to_clean; *pp; pp = &(*pp)->next) { + struct child_to_clean *clean_me = *pp; + + if (clean_me->pid == pid) { + *pp = clean_me->next; + free(clean_me); return; } } @@ -139,6 +140,8 @@ int sane_execvp(const char *file, char * const argv[]) */ if (errno == EACCES && !strchr(file, '/')) errno = exists_in_PATH(file) ? EACCES : ENOENT; + else if (errno == ENOTDIR && !strchr(file, '/')) + errno = ENOENT; return -1; } @@ -394,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 *); diff --git a/sequencer.c b/sequencer.c index bf078f274b..e3723d2095 100644 --- a/sequencer.c +++ b/sequencer.c @@ -17,7 +17,9 @@ #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION" -void remove_sequencer_state(void) +const char sign_off_header[] = "Signed-off-by: "; + +static void remove_sequencer_state(void) { struct strbuf seq_dir = STRBUF_INIT; @@ -233,6 +235,9 @@ static int do_recursive_merge(struct commit *base, struct commit *next, die(_("%s: Unable to write new index file"), action_name(opts)); rollback_lock_file(&index_lock); + if (opts->signoff) + append_signoff(msgbuf, 0); + if (!clean) { int i; strbuf_addstr(msgbuf, "\nConflicts:\n"); @@ -311,6 +316,9 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, if (allow_empty) argv_array_push(&array, "--allow-empty"); + if (opts->allow_empty_message) + argv_array_push(&array, "--allow-empty-message"); + rc = run_command_v_opt(array.argv, RUN_GIT_CMD); argv_array_clear(&array); return rc; @@ -543,7 +551,11 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) static void prepare_revs(struct replay_opts *opts) { - if (opts->action != REPLAY_REVERT) + /* + * picking (but not reverting) ranges (but not individual revisions) + * should be done in reverse + */ + if (opts->action == REPLAY_PICK && !opts->revs->no_walk) opts->revs->reverse ^= 1; if (prepare_revision_walk(opts->revs)) @@ -1004,3 +1016,63 @@ int sequencer_pick_revisions(struct replay_opts *opts) save_opts(opts); return pick_commits(todo_list, opts); } + +static int ends_rfc2822_footer(struct strbuf *sb, int ignore_footer) +{ + int ch; + int hit = 0; + int i, j, k; + int len = sb->len - ignore_footer; + int first = 1; + const char *buf = sb->buf; + + for (i = len - 1; i > 0; i--) { + if (hit && buf[i] == '\n') + break; + hit = (buf[i] == '\n'); + } + + while (i < len - 1 && buf[i] == '\n') + i++; + + for (; i < len; i = k) { + for (k = i; k < len && buf[k] != '\n'; k++) + ; /* do nothing */ + k++; + + if ((buf[k] == ' ' || buf[k] == '\t') && !first) + continue; + + first = 0; + + for (j = 0; i + j < len; j++) { + ch = buf[i + j]; + if (ch == ':') + break; + if (isalnum(ch) || + (ch == '-')) + continue; + return 0; + } + } + return 1; +} + +void append_signoff(struct strbuf *msgbuf, int ignore_footer) +{ + struct strbuf sob = STRBUF_INIT; + int i; + + strbuf_addstr(&sob, sign_off_header); + strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"), + getenv("GIT_COMMITTER_EMAIL"))); + strbuf_addch(&sob, '\n'); + for (i = msgbuf->len - 1 - ignore_footer; i > 0 && msgbuf->buf[i - 1] != '\n'; i--) + ; /* do nothing */ + if (prefixcmp(msgbuf->buf + i, sob.buf)) { + if (!i || !ends_rfc2822_footer(msgbuf, ignore_footer)) + strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0, "\n", 1); + strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0, sob.buf, sob.len); + } + strbuf_release(&sob); +} diff --git a/sequencer.h b/sequencer.h index aa5f17cc30..9d57d57524 100644 --- a/sequencer.h +++ b/sequencer.h @@ -30,6 +30,7 @@ struct replay_opts { int allow_ff; int allow_rerere_auto; int allow_empty; + int allow_empty_message; int keep_redundant_commits; int mainline; @@ -43,9 +44,10 @@ struct replay_opts { struct rev_info *revs; }; -/* Removes SEQ_DIR. */ -extern void remove_sequencer_state(void); - int sequencer_pick_revisions(struct replay_opts *opts); +extern const char sign_off_header[]; + +void append_signoff(struct strbuf *msgbuf, int ignore_footer); + #endif @@ -79,7 +79,7 @@ static void NORETURN die_verify_filename(const char *prefix, { if (!diagnose_misspelt_rev) die("%s: no such path in the working tree.\n" - "Use '-- <path>...' to specify paths that do not exist locally.", + "Use 'git <command> -- <path>...' to specify paths that do not exist locally.", arg); /* * Saying "'(icase)foo' does not exist in the index" when the @@ -92,7 +92,8 @@ static void NORETURN die_verify_filename(const char *prefix, /* ... or fall back the most general message. */ die("ambiguous argument '%s': unknown revision or path not in the working tree.\n" - "Use '--' to separate paths from revisions", arg); + "Use '--' to separate paths from revisions, like this:\n" + "'git <command> [<revision>...] -- [<file>...]'", arg); } @@ -141,7 +142,8 @@ void verify_non_filename(const char *prefix, const char *arg) if (!check_filename(prefix, arg)) return; die("ambiguous argument '%s': both revision and filename\n" - "Use '--' to separate filenames from revisions", arg); + "Use '--' to separate paths from revisions, like this:\n" + "'git <command> [<revision>...] -- [<file>...]'", arg); } /* diff --git a/sha1-array.c b/sha1-array.c index b2f47f98fb..6f4a2246c9 100644 --- a/sha1-array.c +++ b/sha1-array.c @@ -14,7 +14,7 @@ static int void_hashcmp(const void *a, const void *b) return hashcmp(a, b); } -void sha1_array_sort(struct sha1_array *array) +static void sha1_array_sort(struct sha1_array *array) { qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp); array->sorted = 1; diff --git a/sha1-array.h b/sha1-array.h index 4499b5dad4..72bb33bec6 100644 --- a/sha1-array.h +++ b/sha1-array.h @@ -11,7 +11,6 @@ struct sha1_array { #define SHA1_ARRAY_INIT { NULL, 0, 0, 0 } void sha1_array_append(struct sha1_array *array, const unsigned char *sha1); -void sha1_array_sort(struct sha1_array *array); int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1); void sha1_array_clear(struct sha1_array *array); diff --git a/sha1_file.c b/sha1_file.c index af5cfbde63..9152974642 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -731,6 +731,24 @@ void free_pack_by_name(const char *pack_name) } } +static unsigned int get_max_fd_limit(void) +{ +#ifdef RLIMIT_NOFILE + struct rlimit lim; + + if (getrlimit(RLIMIT_NOFILE, &lim)) + die_errno("cannot get RLIMIT_NOFILE"); + + return lim.rlim_cur; +#elif defined(_SC_OPEN_MAX) + return sysconf(_SC_OPEN_MAX); +#elif defined(OPEN_MAX) + return OPEN_MAX; +#else + return 1; /* see the caller ;-) */ +#endif +} + /* * Do not call this directly as this leaks p->pack_fd on error return; * call open_packed_git() instead. @@ -747,13 +765,7 @@ static int open_packed_git_1(struct packed_git *p) return error("packfile %s index unavailable", p->pack_name); if (!pack_max_fds) { - struct rlimit lim; - unsigned int max_fds; - - if (getrlimit(RLIMIT_NOFILE, &lim)) - die_errno("cannot get RLIMIT_NOFILE"); - - max_fds = lim.rlim_cur; + unsigned int max_fds = get_max_fd_limit(); /* Save 3 for stdin/stdout/stderr, 22 for work */ if (25 < max_fds) @@ -445,8 +445,8 @@ static int is_rfc3986_unreserved(char ch) ch == '-' || ch == '_' || ch == '.' || ch == '~'; } -void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len, - int reserved) +static void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len, + int reserved) { strbuf_grow(sb, len); while (len--) { @@ -465,15 +465,6 @@ void strbuf_addstr_urlencode(struct strbuf *sb, const char *s, strbuf_add_urlencode(sb, s, strlen(s), reserved); } -void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - strbuf_vaddf(sb, fmt, ap); - va_end(ap); - strbuf_addch(sb, '\n'); -} - int printf_ln(const char *fmt, ...) { int ret; @@ -99,8 +99,6 @@ __attribute__((format (printf,2,3))) extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...); __attribute__((format (printf,2,0))) extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap); -__attribute__((format (printf,2,3))) -extern void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...); extern void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, size_t size); @@ -126,8 +124,6 @@ extern int launch_editor(const char *path, struct strbuf *buffer, const char *co extern int strbuf_branchname(struct strbuf *sb, const char *name); extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name); -extern void strbuf_add_urlencode(struct strbuf *, const char *, size_t, - int reserved); extern void strbuf_addstr_urlencode(struct strbuf *, const char *, int reserved); diff --git a/string-list.c b/string-list.c index d9810aba42..c54b816244 100644 --- a/string-list.c +++ b/string-list.c @@ -92,6 +92,23 @@ struct string_list_item *string_list_lookup(struct string_list *list, const char return list->items + i; } +void string_list_remove_duplicates(struct string_list *list, int free_util) +{ + if (list->nr > 1) { + int src, dst; + for (src = dst = 1; src < list->nr; src++) { + if (!strcmp(list->items[dst - 1].string, list->items[src].string)) { + if (list->strdup_strings) + free(list->items[src].string); + if (free_util) + free(list->items[src].util); + } else + list->items[dst++] = list->items[src]; + } + list->nr = dst; + } +} + int for_each_string_list(struct string_list *list, string_list_each_func_t fn, void *cb_data) { @@ -102,6 +119,43 @@ int for_each_string_list(struct string_list *list, return ret; } +void filter_string_list(struct string_list *list, int free_util, + string_list_each_func_t want, void *cb_data) +{ + int src, dst = 0; + for (src = 0; src < list->nr; src++) { + if (want(&list->items[src], cb_data)) { + list->items[dst++] = list->items[src]; + } else { + if (list->strdup_strings) + free(list->items[src].string); + if (free_util) + free(list->items[src].util); + } + } + list->nr = dst; +} + +char *string_list_longest_prefix(const struct string_list *prefixes, + const char *string) +{ + int i, max_len = -1; + char *retval = NULL; + + for (i = 0; i < prefixes->nr; i++) { + char *prefix = prefixes->items[i].string; + if (!prefixcmp(string, prefix)) { + int len = strlen(prefix); + if (len > max_len) { + retval = prefix; + max_len = len; + } + } + } + + return retval; +} + void string_list_clear(struct string_list *list, int free_util) { if (list->items) { @@ -148,13 +202,23 @@ void print_string_list(const struct string_list *p, const char *text) printf("%s:%p\n", p->items[i].string, p->items[i].util); } -struct string_list_item *string_list_append(struct string_list *list, const char *string) +struct string_list_item *string_list_append_nodup(struct string_list *list, + char *string) { + struct string_list_item *retval; ALLOC_GROW(list->items, list->nr + 1, list->alloc); - list->items[list->nr].string = - list->strdup_strings ? xstrdup(string) : (char *)string; - list->items[list->nr].util = NULL; - return list->items + list->nr++; + retval = &list->items[list->nr++]; + retval->string = string; + retval->util = NULL; + return retval; +} + +struct string_list_item *string_list_append(struct string_list *list, + const char *string) +{ + return string_list_append_nodup( + list, + list->strdup_strings ? xstrdup(string) : (char *)string); } static int cmp_items(const void *a, const void *b) @@ -194,3 +258,56 @@ void unsorted_string_list_delete_item(struct string_list *list, int i, int free_ list->items[i] = list->items[list->nr-1]; list->nr--; } + +int string_list_split(struct string_list *list, const char *string, + int delim, int maxsplit) +{ + int count = 0; + const char *p = string, *end; + + if (!list->strdup_strings) + die("internal error in string_list_split(): " + "list->strdup_strings must be set"); + for (;;) { + count++; + if (maxsplit >= 0 && count > maxsplit) { + string_list_append(list, p); + return count; + } + end = strchr(p, delim); + if (end) { + string_list_append_nodup(list, xmemdupz(p, end - p)); + p = end + 1; + } else { + string_list_append(list, p); + return count; + } + } +} + +int string_list_split_in_place(struct string_list *list, char *string, + int delim, int maxsplit) +{ + int count = 0; + char *p = string, *end; + + if (list->strdup_strings) + die("internal error in string_list_split_in_place(): " + "list->strdup_strings must not be set"); + for (;;) { + count++; + if (maxsplit >= 0 && count > maxsplit) { + string_list_append(list, p); + return count; + } + end = strchr(p, delim); + if (end) { + *end = '\0'; + string_list_append(list, p); + p = end + 1; + } else { + string_list_append(list, p); + return count; + } + } +} diff --git a/string-list.h b/string-list.h index 0684cb73bf..5efd07b44e 100644 --- a/string-list.h +++ b/string-list.h @@ -29,6 +29,24 @@ int for_each_string_list(struct string_list *list, #define for_each_string_list_item(item,list) \ for (item = (list)->items; item < (list)->items + (list)->nr; ++item) +/* + * Apply want to each item in list, retaining only the ones for which + * the function returns true. If free_util is true, call free() on + * the util members of any items that have to be deleted. Preserve + * the order of the items that are retained. + */ +void filter_string_list(struct string_list *list, int free_util, + string_list_each_func_t want, void *cb_data); + +/* + * Return the longest string in prefixes that is a prefix (in the + * sense of prefixcmp()) of string, or NULL if no such prefix exists. + * This function does not require the string_list to be sorted (it + * does a linear search). + */ +char *string_list_longest_prefix(const struct string_list *prefixes, const char *string); + + /* Use these functions only on sorted lists: */ int string_list_has_string(const struct string_list *list, const char *string); int string_list_find_insert_index(const struct string_list *list, const char *string, @@ -38,11 +56,64 @@ struct string_list_item *string_list_insert_at_index(struct string_list *list, int insert_at, const char *string); struct string_list_item *string_list_lookup(struct string_list *list, const char *string); +/* + * Remove all but the first of consecutive entries with the same + * string value. If free_util is true, call free() on the util + * members of any items that have to be deleted. + */ +void string_list_remove_duplicates(struct string_list *sorted_list, int free_util); + + /* Use these functions only on unsorted lists: */ + +/* + * Add string to the end of list. If list->strdup_string is set, then + * string is copied; otherwise the new string_list_entry refers to the + * input string. + */ struct string_list_item *string_list_append(struct string_list *list, const char *string); + +/* + * Like string_list_append(), except string is never copied. When + * list->strdup_strings is set, this function can be used to hand + * ownership of a malloc()ed string to list without making an extra + * copy. + */ +struct string_list_item *string_list_append_nodup(struct string_list *list, char *string); + void sort_string_list(struct string_list *list); int unsorted_string_list_has_string(struct string_list *list, const char *string); struct string_list_item *unsorted_string_list_lookup(struct string_list *list, const char *string); + void unsorted_string_list_delete_item(struct string_list *list, int i, int free_util); + +/* + * Split string into substrings on character delim and append the + * substrings to list. The input string is not modified. + * list->strdup_strings must be set, as new memory needs to be + * allocated to hold the substrings. If maxsplit is non-negative, + * then split at most maxsplit times. Return the number of substrings + * appended to list. + * + * Examples: + * string_list_split(l, "foo:bar:baz", ':', -1) -> ["foo", "bar", "baz"] + * string_list_split(l, "foo:bar:baz", ':', 0) -> ["foo:bar:baz"] + * string_list_split(l, "foo:bar:baz", ':', 1) -> ["foo", "bar:baz"] + * string_list_split(l, "foo:bar:", ':', -1) -> ["foo", "bar", ""] + * string_list_split(l, "", ':', -1) -> [""] + * string_list_split(l, ":", ':', -1) -> ["", ""] + */ +int string_list_split(struct string_list *list, const char *string, + int delim, int maxsplit); + +/* + * Like string_list_split(), except that string is split in-place: the + * delimiter characters in string are overwritten with NULs, and the + * new string_list_items point into string (which therefore must not + * be modified or freed while the string_list is in use). + * list->strdup_strings must *not* be set. + */ +int string_list_split_in_place(struct string_list *list, char *string, + int delim, int maxsplit); #endif /* STRING_LIST_H */ diff --git a/submodule.c b/submodule.c index 959d349ea7..50f213e926 100644 --- a/submodule.c +++ b/submodule.c @@ -574,8 +574,7 @@ static void calculate_changed_submodule_paths(void) DIFF_OPT_SET(&diff_opts, RECURSIVE); diff_opts.output_format |= DIFF_FORMAT_CALLBACK; diff_opts.format_callback = submodule_collect_changed_cb; - if (diff_setup_done(&diff_opts) < 0) - die("diff_setup_done failed"); + diff_setup_done(&diff_opts); diff_tree_sha1(parent->item->object.sha1, commit->object.sha1, "", &diff_opts); diffcore_std(&diff_opts); diff_flush(&diff_opts); @@ -589,13 +588,13 @@ static void calculate_changed_submodule_paths(void) initialized_fetch_ref_tips = 0; } -int fetch_populated_submodules(int num_options, const char **options, +int fetch_populated_submodules(const struct argv_array *options, const char *prefix, int command_line_option, int quiet) { - int i, result = 0, argc = 0, default_argc; + int i, result = 0; struct child_process cp; - const char **argv; + struct argv_array argv = ARGV_ARRAY_INIT; struct string_list_item *name_for_path; const char *work_tree = get_git_work_tree(); if (!work_tree) @@ -605,17 +604,13 @@ int fetch_populated_submodules(int num_options, const char **options, if (read_cache() < 0) die("index file corrupt"); - /* 6: "fetch" (options) --recurse-submodules-default default "--submodule-prefix" prefix NULL */ - argv = xcalloc(num_options + 6, sizeof(const char *)); - argv[argc++] = "fetch"; - for (i = 0; i < num_options; i++) - argv[argc++] = options[i]; - argv[argc++] = "--recurse-submodules-default"; - default_argc = argc++; - argv[argc++] = "--submodule-prefix"; + argv_array_push(&argv, "fetch"); + for (i = 0; i < options->argc; i++) + argv_array_push(&argv, options->argv[i]); + argv_array_push(&argv, "--recurse-submodules-default"); + /* default value, "--submodule-prefix" and its value are added later */ memset(&cp, 0, sizeof(cp)); - cp.argv = argv; cp.env = local_repo_env; cp.git_cmd = 1; cp.no_stdin = 1; @@ -675,16 +670,21 @@ int fetch_populated_submodules(int num_options, const char **options, if (!quiet) printf("Fetching submodule %s%s\n", prefix, ce->name); cp.dir = submodule_path.buf; - argv[default_argc] = default_argv; - argv[argc] = submodule_prefix.buf; + argv_array_push(&argv, default_argv); + argv_array_push(&argv, "--submodule-prefix"); + argv_array_push(&argv, submodule_prefix.buf); + cp.argv = argv.argv; if (run_command(&cp)) result = 1; + argv_array_pop(&argv); + argv_array_pop(&argv); + argv_array_pop(&argv); } strbuf_release(&submodule_path); strbuf_release(&submodule_git_dir); strbuf_release(&submodule_prefix); } - free(argv); + argv_array_clear(&argv); out: string_list_clear(&changed_submodule_paths, 1); return result; @@ -789,7 +789,7 @@ static int find_first_merges(struct object_array *result, const char *path, die("revision walk setup failed"); while ((commit = get_revision(&revs)) != NULL) { struct object *o = &(commit->object); - if (in_merge_bases(b, &commit, 1)) + if (in_merge_bases(b, commit)) add_object_array(o, NULL, &merges); } reset_revision_walk(); @@ -804,7 +804,7 @@ static int find_first_merges(struct object_array *result, const char *path, contains_another = 0; for (j = 0; j < merges.nr; j++) { struct commit *m2 = (struct commit *) merges.objects[j].item; - if (i != j && in_merge_bases(m2, &m1, 1)) { + if (i != j && in_merge_bases(m2, m1)) { contains_another = 1; break; } @@ -866,18 +866,18 @@ int merge_submodule(unsigned char result[20], const char *path, } /* check whether both changes are forward */ - if (!in_merge_bases(commit_base, &commit_a, 1) || - !in_merge_bases(commit_base, &commit_b, 1)) { + if (!in_merge_bases(commit_base, commit_a) || + !in_merge_bases(commit_base, commit_b)) { MERGE_WARNING(path, "commits don't follow merge-base"); return 0; } /* Case #1: a is contained in b or vice versa */ - if (in_merge_bases(commit_a, &commit_b, 1)) { + if (in_merge_bases(commit_a, commit_b)) { hashcpy(result, b); return 1; } - if (in_merge_bases(commit_b, &commit_a, 1)) { + if (in_merge_bases(commit_b, commit_a)) { hashcpy(result, a); return 1; } diff --git a/submodule.h b/submodule.h index e105b0ebe6..594b50d510 100644 --- a/submodule.h +++ b/submodule.h @@ -2,6 +2,7 @@ #define SUBMODULE_H struct diff_options; +struct argv_array; enum { RECURSE_SUBMODULES_ON_DEMAND = -1, @@ -23,7 +24,7 @@ void show_submodule_summary(FILE *f, const char *path, const char *del, const char *add, const char *reset); void set_config_fetch_recurse_submodules(int value); void check_for_new_submodule_commits(unsigned char new_sha1[20]); -int fetch_populated_submodules(int num_options, const char **options, +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); diff --git a/symlinks.c b/symlinks.c index 290036744b..c2b41a8501 100644 --- a/symlinks.c +++ b/symlinks.c @@ -1,5 +1,8 @@ #include "cache.h" +static int threaded_check_leading_path(struct cache_def *cache, const char *name, int len); +static int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len); + /* * Returns the length (on a path component basis) of the longest * common prefix match of 'name_a' and 'name_b'. @@ -231,7 +234,7 @@ int check_leading_path(const char *name, int len) * Return path length if leading path exists and is neither a * directory nor a symlink. */ -int threaded_check_leading_path(struct cache_def *cache, const char *name, int len) +static int threaded_check_leading_path(struct cache_def *cache, const char *name, int len) { int flags; int match_len = lstat_cache_matchlen(cache, name, len, &flags, @@ -263,7 +266,7 @@ int has_dirs_only_path(const char *name, int len, int prefix_len) * 'prefix_len', thus we then allow for symlinks in the prefix part as * long as those points to real existing directories. */ -int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len) +static int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len) { return lstat_cache(cache, name, len, FL_DIR|FL_FULLPATH, prefix_len) & diff --git a/t/Git-SVN/Utils/add_path_to_url.t b/t/Git-SVN/Utils/add_path_to_url.t new file mode 100644 index 0000000000..bfbd87845f --- /dev/null +++ b/t/Git-SVN/Utils/add_path_to_url.t @@ -0,0 +1,27 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use Test::More 'no_plan'; + +use Git::SVN::Utils qw( + add_path_to_url +); + +# A reference cannot be a hash key, so we use an array. +my @tests = ( + ["http://x.com", "bar"] => 'http://x.com/bar', + ["http://x.com", ""] => 'http://x.com', + ["http://x.com/foo/", undef] => 'http://x.com/foo/', + ["http://x.com/foo/", "/bar/baz/"] => 'http://x.com/foo/bar/baz/', + ["http://x.com", 'per%cent'] => 'http://x.com/per%25cent', +); + +while(@tests) { + my($have, $want) = splice @tests, 0, 2; + + my $args = join ", ", map { qq['$_'] } map { defined($_) ? $_ : 'undef' } @$have; + my $name = "add_path_to_url($args) eq $want"; + is add_path_to_url(@$have), $want, $name; +} diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/t/Git-SVN/Utils/canonicalize_url.t new file mode 100644 index 0000000000..05795ab636 --- /dev/null +++ b/t/Git-SVN/Utils/canonicalize_url.t @@ -0,0 +1,26 @@ +#!/usr/bin/env perl + +# Test our own home rolled URL canonicalizer. Test the private one +# directly because we can't predict what the SVN API is doing to do. + +use strict; +use warnings; + +use Test::More 'no_plan'; + +use Git::SVN::Utils; +my $canonicalize_url = \&Git::SVN::Utils::_canonicalize_url_ourselves; + +my %tests = ( + "http://x.com" => "http://x.com", + "http://x.com/" => "http://x.com", + "http://x.com/foo/bar" => "http://x.com/foo/bar", + "http://x.com//foo//bar//" => "http://x.com/foo/bar", + "http://x.com/ /%/" => "http://x.com/%20%20/%25", +); + +for my $arg (keys %tests) { + my $want = $tests{$arg}; + + is $canonicalize_url->($arg), $want, "canonicalize_url('$arg') => $want"; +} diff --git a/t/Git-SVN/Utils/collapse_dotdot.t b/t/Git-SVN/Utils/collapse_dotdot.t new file mode 100644 index 0000000000..1da1cce156 --- /dev/null +++ b/t/Git-SVN/Utils/collapse_dotdot.t @@ -0,0 +1,23 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use Test::More 'no_plan'; + +use Git::SVN::Utils; +my $collapse_dotdot = \&Git::SVN::Utils::_collapse_dotdot; + +my %tests = ( + "foo/bar/baz" => "foo/bar/baz", + ".." => "..", + "foo/.." => "", + "/foo/bar/../../baz" => "/baz", + "deeply/.././deeply/nested" => "./deeply/nested", +); + +for my $arg (keys %tests) { + my $want = $tests{$arg}; + + is $collapse_dotdot->($arg), $want, "_collapse_dotdot('$arg') => $want"; +} diff --git a/t/Git-SVN/Utils/join_paths.t b/t/Git-SVN/Utils/join_paths.t new file mode 100644 index 0000000000..d4488e7162 --- /dev/null +++ b/t/Git-SVN/Utils/join_paths.t @@ -0,0 +1,32 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use Test::More 'no_plan'; + +use Git::SVN::Utils qw( + join_paths +); + +# A reference cannot be a hash key, so we use an array. +my @tests = ( + [] => '', + ["/x.com", "bar"] => '/x.com/bar', + ["x.com", ""] => 'x.com', + ["/x.com/foo/", undef, "bar"] => '/x.com/foo/bar', + ["x.com/foo/", "/bar/baz/"] => 'x.com/foo/bar/baz/', + ["foo", "bar"] => 'foo/bar', + ["/foo/bar", "baz", "/biff"] => '/foo/bar/baz/biff', + ["", undef, "."] => '.', + [] => '', + +); + +while(@tests) { + my($have, $want) = splice @tests, 0, 2; + + my $args = join ", ", map { qq['$_'] } map { defined($_) ? $_ : 'undef' } @$have; + my $name = "join_paths($args) eq '$want'"; + is join_paths(@$have), $want, $name; +} @@ -625,6 +625,15 @@ use these, and "test_set_prereq" for how to define your own. Git was compiled with USE_LIBPCRE=YesPlease. Wrap any tests that use git-grep --perl-regexp or git-grep -P in these. + - CASE_INSENSITIVE_FS + + Test is run on a case insensitive file system. + + - UTF8_NFD_TO_NFC + + Test is run on a filesystem which converts decomposed utf-8 (nfd) + to precomposed utf-8 (nfc). + Tips for Writing Tests ---------------------- diff --git a/t/lib-credential.sh b/t/lib-credential.sh index 957ae936e8..3c43ff11b3 100755 --- a/t/lib-credential.sh +++ b/t/lib-credential.sh @@ -18,6 +18,10 @@ check() { cat stderr && false fi && + if test_have_prereq MINGW + then + dos2unix -q stderr + fi && test_cmp expect-stdout stdout && test_cmp expect-stderr stderr } diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh index 2d753ab7e1..7061dce7e5 100644 --- a/t/lib-git-p4.sh +++ b/t/lib-git-p4.sh @@ -26,9 +26,10 @@ testid=${this_test#t} git_p4_test_start=9800 P4DPORT=$((10669 + ($testid - $git_p4_test_start))) -export P4PORT=localhost:$P4DPORT -export P4CLIENT=client -export P4EDITOR=: +P4PORT=localhost:$P4DPORT +P4CLIENT=client +P4EDITOR=: +export P4PORT P4CLIENT P4EDITOR db="$TRASH_DIRECTORY/db" cli=$(test-path-utils real_path "$TRASH_DIRECTORY/cli") @@ -115,3 +116,20 @@ marshal_dump() { EOF "$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py" } + +# +# Construct a client with this list of View lines +# +client_view() { + ( + cat <<-EOF && + Client: client + Description: client + Root: $cli + View: + EOF + for arg ; do + printf "\t$arg\n" + done + ) | p4 client -i +} diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index d773542680..02f442bfad 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -167,3 +167,42 @@ test_http_push_nonff() { test_i18ngrep "Updates were rejected because" output ' } + +setup_askpass_helper() { + test_expect_success 'setup askpass helper' ' + write_script "$TRASH_DIRECTORY/askpass" <<-\EOF && + echo >>"$TRASH_DIRECTORY/askpass-query" "askpass: $*" && + cat "$TRASH_DIRECTORY/askpass-response" + EOF + GIT_ASKPASS="$TRASH_DIRECTORY/askpass" && + export GIT_ASKPASS && + export TRASH_DIRECTORY + ' +} + +set_askpass() { + >"$TRASH_DIRECTORY/askpass-query" && + echo "$*" >"$TRASH_DIRECTORY/askpass-response" +} + +expect_askpass() { + dest=$HTTPD_DEST + { + case "$1" in + none) + ;; + pass) + echo "askpass: Password for 'http://$2@$dest': " + ;; + both) + echo "askpass: Username for 'http://$dest': " + echo "askpass: Password for 'http://$2@$dest': " + ;; + *) + false + ;; + esac + } >"$TRASH_DIRECTORY/askpass-expect" && + test_cmp "$TRASH_DIRECTORY/askpass-expect" \ + "$TRASH_DIRECTORY/askpass-query" +} diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 36b1596a10..49d5d877ce 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -46,24 +46,22 @@ PassEnv GIT_VALGRIND PassEnv GIT_VALGRIND_OPTIONS Alias /dumb/ www/ -Alias /auth/ www/auth/ +Alias /auth/dumb/ www/auth/dumb/ -<Location /smart/> +<LocationMatch /smart/> SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_HTTP_EXPORT_ALL -</Location> -<Location /smart_noexport/> +</LocationMatch> +<LocationMatch /smart_noexport/> SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} -</Location> -<Location /smart_custom_env/> +</LocationMatch> +<LocationMatch /smart_custom_env/> SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_HTTP_EXPORT_ALL SetEnv GIT_COMMITTER_NAME "Custom User" SetEnv GIT_COMMITTER_EMAIL custom@example.com -</Location> -ScriptAlias /smart/ ${GIT_EXEC_PATH}/git-http-backend/ -ScriptAlias /smart_noexport/ ${GIT_EXEC_PATH}/git-http-backend/ -ScriptAlias /smart_custom_env/ ${GIT_EXEC_PATH}/git-http-backend/ +</LocationMatch> +ScriptAliasMatch /smart_*[^/]*/(.*) ${GIT_EXEC_PATH}/git-http-backend/$1 <Directory ${GIT_EXEC_PATH}> Options FollowSymlinks </Directory> @@ -94,6 +92,13 @@ SSLEngine On Require valid-user </Location> +<LocationMatch "^/auth-push/.*/git-receive-pack$"> + AuthType Basic + AuthName "git-auth" + AuthUserFile passwd + Require valid-user +</LocationMatch> + <IfDefine DAV> LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so diff --git a/t/perf/.gitignore b/t/perf/.gitignore index 50f5cc1ed9..982eb8e3a9 100644 --- a/t/perf/.gitignore +++ b/t/perf/.gitignore @@ -1,2 +1,3 @@ -build/ -test-results/ +/build/ +/test-results/ +/trash directory*/ diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh index 5580c22812..a816fbcb76 100644 --- a/t/perf/perf-lib.sh +++ b/t/perf/perf-lib.sh @@ -42,6 +42,7 @@ else fi TEST_NO_CREATE_REPO=t +TEST_NO_MALLOC_CHECK=t . ../test-lib.sh @@ -163,7 +164,7 @@ test_perf () { else echo "perf $test_count - $1:" fi - for i in $(seq 1 $GIT_PERF_REPEAT_COUNT); do + for i in $(test_seq 1 $GIT_PERF_REPEAT_COUNT); do say >&3 "running: $2" if test_run_perf_ "$2" then diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index ccb5435b2a..08677df10e 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -18,16 +18,6 @@ swapping compression and hashing order, the person who is making the modification *should* take notice and update the test vectors here. ' -################################################################ -# It appears that people try to run tests without building... - -../git >/dev/null -if test $? != 1 -then - echo >&2 'You do not seem to have built git yet.' - exit 1 -fi - . ./test-lib.sh ################################################################ @@ -450,24 +440,6 @@ test_expect_success 'update-index D/F conflict' ' test $numpath0 = 1 ' -test_expect_success SYMLINKS 'real path works as expected' ' - mkdir first && - ln -s ../.git first/.git && - mkdir second && - ln -s ../first second/other && - mkdir third && - dir="$(cd .git; pwd -P)" && - dir2=third/../second/other/.git && - test "$dir" = "$(test-path-utils real_path $dir2)" && - file="$dir"/index && - test "$file" = "$(test-path-utils real_path $dir2/index)" && - basename=blub && - test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" && - ln -s ../first/file .git/syml && - sym="$(cd first; pwd -P)"/file && - test "$sym" = "$(test-path-utils real_path "$dir2/syml")" -' - test_expect_success 'very long name in the index handled sanely' ' a=a && # 1 diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 51f3045ba4..febc45c9cc 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -123,16 +123,6 @@ test_expect_success 'attribute matching is case insensitive when core.ignorecase ' -test_expect_success 'check whether FS is case-insensitive' ' - mkdir junk && - echo good >junk/CamelCase && - echo bad >junk/camelcase && - if test "$(cat junk/CamelCase)" != good - then - test_set_prereq CASE_INSENSITIVE_FS - fi -' - test_expect_success CASE_INSENSITIVE_FS 'additional case insensitivity tests' ' test_must_fail attr_check a/B/D/g "a/b/d/*" "-c core.ignorecase=0" && test_must_fail attr_check A/B/D/NO "a/b/d/*" "-c core.ignorecase=0" && diff --git a/t/t0006-date.sh b/t/t0006-date.sh index 1d29810a7a..e53cf6d36d 100755 --- a/t/t0006-date.sh +++ b/t/t0006-date.sh @@ -11,7 +11,7 @@ check_show() { echo "$t -> $2" >expect test_expect_${3:-success} "relative date ($2)" " test-date show $t >actual && - test_cmp expect actual + test_i18ncmp expect actual " } diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index e3f354a45e..244a43c920 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -51,7 +51,7 @@ EOF test_expect_success 'test help' ' test_must_fail test-parse-options -h > output 2> output.err && test ! -s output.err && - test_cmp expect output + test_i18ncmp expect output ' mv expect expect.err @@ -79,6 +79,17 @@ check() { test_cmp expect output } +check_i18n() { + what="$1" && + shift && + expect="$1" && + shift && + sed "s/^$what .*/$what $expect/" <expect.template >expect && + test-parse-options $* >output 2>output.err && + test ! -s output.err && + test_i18ncmp expect output +} + check_unknown() { case "$1" in --*) @@ -92,6 +103,19 @@ check_unknown() { test_cmp expect output.err } +check_unknown_i18n() { + case "$1" in + --*) + echo error: unknown option \`${1#--}\' >expect ;; + -*) + echo error: unknown switch \`${1#-}\' >expect ;; + esac && + cat expect.err >>expect && + test_must_fail test-parse-options $* >output 2>output.err && + test ! -s output && + test_i18ncmp expect output.err +} + test_expect_success 'OPT_BOOL() #1' 'check boolean: 1 --yes' test_expect_success 'OPT_BOOL() #2' 'check boolean: 1 --no-doubt' test_expect_success 'OPT_BOOL() #3' 'check boolean: 1 -D' @@ -104,8 +128,8 @@ test_expect_success 'OPT_BOOL() is idempotent #2' 'check boolean: 1 -DB' test_expect_success 'OPT_BOOL() negation #1' 'check boolean: 0 -D --no-yes' test_expect_success 'OPT_BOOL() negation #2' 'check boolean: 0 -D --no-no-doubt' -test_expect_success 'OPT_BOOL() no negation #1' 'check_unknown --fear' -test_expect_success 'OPT_BOOL() no negation #2' 'check_unknown --no-no-fear' +test_expect_success 'OPT_BOOL() no negation #1' 'check_unknown_i18n --fear' +test_expect_success 'OPT_BOOL() no negation #2' 'check_unknown_i18n --no-no-fear' test_expect_success 'OPT_BOOL() positivation' 'check boolean: 0 -D --doubt' @@ -310,8 +334,8 @@ EOF test_expect_success 'OPT_CALLBACK() and callback errors work' ' test_must_fail test-parse-options --no-length > output 2> output.err && - test_cmp expect output && - test_cmp expect.err output.err + test_i18ncmp expect output && + test_i18ncmp expect.err output.err ' cat > expect <<EOF diff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh index 1542cf6a13..78816d9d93 100755 --- a/t/t0050-filesystem.sh +++ b/t/t0050-filesystem.sh @@ -7,48 +7,26 @@ test_description='Various filesystem issues' auml=$(printf '\303\244') aumlcdiar=$(printf '\141\314\210') -case_insensitive= -unibad= -no_symlinks= -test_expect_success 'see what we expect' ' - - test_case=test_expect_success && - test_unicode=test_expect_success && - mkdir junk && - echo good >junk/CamelCase && - echo bad >junk/camelcase && - if test "$(cat junk/CamelCase)" != good - then - test_case=test_expect_failure && - case_insensitive=t - fi && - rm -fr junk && - mkdir junk && - >junk/"$auml" && - case "$(cd junk && echo *)" in - "$aumlcdiar") - test_unicode=test_expect_failure && - unibad=t - ;; - *) ;; - esac && - rm -fr junk && - { - ln -s x y 2> /dev/null && - test -h y 2> /dev/null || - no_symlinks=1 && - rm -f y - } -' - -test "$case_insensitive" && +if test_have_prereq CASE_INSENSITIVE_FS +then say "will test on a case insensitive filesystem" -test "$unibad" && + test_case=test_expect_failure +else + test_case=test_expect_success +fi + +if test_have_prereq UTF8_NFD_TO_NFC +then say "will test on a unicode corrupting filesystem" -test "$no_symlinks" && + test_unicode=test_expect_failure +else + test_unicode=test_expect_success +fi + +test_have_prereq SYMLINKS || say "will test on a filesystem lacking symbolic links" -if test "$case_insensitive" +if test_have_prereq CASE_INSENSITIVE_FS then test_expect_success "detection of case insensitive filesystem during repo init" ' @@ -62,18 +40,18 @@ test_expect_success "detection of case insensitive filesystem during repo init" ' fi -if test "$no_symlinks" +if test_have_prereq SYMLINKS then test_expect_success "detection of filesystem w/o symlink support during repo init" ' - v=$(git config --bool core.symlinks) && - test "$v" = false + test_must_fail git config --bool core.symlinks || + test "$(git config --bool core.symlinks)" = true ' else test_expect_success "detection of filesystem w/o symlink support during repo init" ' - test_must_fail git config --bool core.symlinks || - test "$(git config --bool core.symlinks)" = true + v=$(git config --bool core.symlinks) && + test "$v" = false ' fi diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index 53cf1f8dc4..4ef2345982 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -139,4 +139,63 @@ test_expect_success 'strip_path_suffix' ' test c:/msysgit = $(test-path-utils strip_path_suffix \ c:/msysgit/libexec//git-core libexec/git-core) ' + +test_expect_success 'absolute path rejects the empty string' ' + test_must_fail test-path-utils absolute_path "" +' + +test_expect_success 'real path rejects the empty string' ' + test_must_fail test-path-utils real_path "" +' + +test_expect_success POSIX 'real path works on absolute paths 1' ' + nopath="hopefully-absent-path" && + test "/" = "$(test-path-utils real_path "/")" && + test "/$nopath" = "$(test-path-utils real_path "/$nopath")" +' + +test_expect_success 'real path works on absolute paths 2' ' + nopath="hopefully-absent-path" && + # Find an existing top-level directory for the remaining tests: + d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && + test "$d" = "$(test-path-utils real_path "$d")" && + test "$d/$nopath" = "$(test-path-utils real_path "$d/$nopath")" +' + +test_expect_success POSIX 'real path removes extra leading slashes' ' + nopath="hopefully-absent-path" && + test "/" = "$(test-path-utils real_path "///")" && + test "/$nopath" = "$(test-path-utils real_path "///$nopath")" && + # Find an existing top-level directory for the remaining tests: + d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && + test "$d" = "$(test-path-utils real_path "//$d")" && + test "$d/$nopath" = "$(test-path-utils real_path "//$d/$nopath")" +' + +test_expect_success 'real path removes other extra slashes' ' + nopath="hopefully-absent-path" && + # Find an existing top-level directory for the remaining tests: + d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && + test "$d" = "$(test-path-utils real_path "$d///")" && + test "$d/$nopath" = "$(test-path-utils real_path "$d///$nopath")" +' + +test_expect_success SYMLINKS 'real path works on symlinks' ' + mkdir first && + ln -s ../.git first/.git && + mkdir second && + ln -s ../first second/other && + mkdir third && + dir="$(cd .git; pwd -P)" && + dir2=third/../second/other/.git && + test "$dir" = "$(test-path-utils real_path $dir2)" && + file="$dir"/index && + test "$file" = "$(test-path-utils real_path $dir2/index)" && + basename=blub && + test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" && + ln -s ../first/file .git/syml && + sym="$(cd first; pwd -P)"/file && + test "$sym" = "$(test-path-utils real_path "$dir2/syml")" +' + test_done diff --git a/t/t0063-string-list.sh b/t/t0063-string-list.sh new file mode 100755 index 0000000000..41c8826a74 --- /dev/null +++ b/t/t0063-string-list.sh @@ -0,0 +1,121 @@ +#!/bin/sh +# +# Copyright (c) 2012 Michael Haggerty +# + +test_description='Test string list functionality' + +. ./test-lib.sh + +test_split () { + cat >expected && + test_expect_success "split $1 at $2, max $3" " + test-string-list split '$1' '$2' '$3' >actual && + test_cmp expected actual && + test-string-list split_in_place '$1' '$2' '$3' >actual && + test_cmp expected actual + " +} + +test_longest_prefix () { + test "$(test-string-list longest_prefix "$1" "$2")" = "$3" +} + +test_no_longest_prefix () { + test_must_fail test-string-list longest_prefix "$1" "$2" +} + +test_split "foo:bar:baz" ":" "-1" <<EOF +3 +[0]: "foo" +[1]: "bar" +[2]: "baz" +EOF + +test_split "foo:bar:baz" ":" "0" <<EOF +1 +[0]: "foo:bar:baz" +EOF + +test_split "foo:bar:baz" ":" "1" <<EOF +2 +[0]: "foo" +[1]: "bar:baz" +EOF + +test_split "foo:bar:baz" ":" "2" <<EOF +3 +[0]: "foo" +[1]: "bar" +[2]: "baz" +EOF + +test_split "foo:bar:" ":" "-1" <<EOF +3 +[0]: "foo" +[1]: "bar" +[2]: "" +EOF + +test_split "" ":" "-1" <<EOF +1 +[0]: "" +EOF + +test_split ":" ":" "-1" <<EOF +2 +[0]: "" +[1]: "" +EOF + +test_expect_success "test filter_string_list" ' + test "x-" = "x$(test-string-list filter - y)" && + test "x-" = "x$(test-string-list filter no y)" && + test yes = "$(test-string-list filter yes y)" && + test yes = "$(test-string-list filter no:yes y)" && + test yes = "$(test-string-list filter yes:no y)" && + test y1:y2 = "$(test-string-list filter y1:y2 y)" && + test y2:y1 = "$(test-string-list filter y2:y1 y)" && + test "x-" = "x$(test-string-list filter x1:x2 y)" +' + +test_expect_success "test remove_duplicates" ' + test "x-" = "x$(test-string-list remove_duplicates -)" && + test "x" = "x$(test-string-list remove_duplicates "")" && + test a = "$(test-string-list remove_duplicates a)" && + test a = "$(test-string-list remove_duplicates a:a)" && + test a = "$(test-string-list remove_duplicates a:a:a:a:a)" && + test a:b = "$(test-string-list remove_duplicates a:b)" && + test a:b = "$(test-string-list remove_duplicates a:a:b)" && + test a:b = "$(test-string-list remove_duplicates a:b:b)" && + test a:b:c = "$(test-string-list remove_duplicates a:b:c)" && + test a:b:c = "$(test-string-list remove_duplicates a:a:b:c)" && + test a:b:c = "$(test-string-list remove_duplicates a:b:b:c)" && + test a:b:c = "$(test-string-list remove_duplicates a:b:c:c)" && + test a:b:c = "$(test-string-list remove_duplicates a:a:b:b:c:c)" && + test a:b:c = "$(test-string-list remove_duplicates a:a:a:b:b:b:c:c:c)" +' + +test_expect_success "test longest_prefix" ' + test_no_longest_prefix - '' && + test_no_longest_prefix - x && + test_longest_prefix "" x "" && + test_longest_prefix x x x && + test_longest_prefix "" foo "" && + test_longest_prefix : foo "" && + test_longest_prefix f foo f && + test_longest_prefix foo foobar foo && + test_longest_prefix foo foo foo && + test_no_longest_prefix bar foo && + test_no_longest_prefix bar:bar foo && + test_no_longest_prefix foobar foo && + test_longest_prefix foo:bar foo foo && + test_longest_prefix foo:bar bar bar && + test_longest_prefix foo::bar foo foo && + test_longest_prefix foo:foobar foo foo && + test_longest_prefix foobar:foo foo foo && + test_longest_prefix foo: bar "" && + test_longest_prefix :foo bar "" +' + +test_done diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh index 9bee8bfd2e..da2c504e53 100755 --- a/t/t0070-fundamental.sh +++ b/t/t0070-fundamental.sh @@ -25,4 +25,9 @@ test_expect_success POSIXPERM 'mktemp to unwritable directory prints filename' ' grep "cannotwrite/test" err ' +test_expect_success 'check for a bug in the regex routines' ' + # if this test fails, re-build git with NO_REGEX=1 + test-regex +' + test_done diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh index a477453e2e..e127f35db9 100755 --- a/t/t1300-repo-config.sh +++ b/t/t1300-repo-config.sh @@ -391,7 +391,7 @@ test_expect_success 'get bool variable with empty value' \ test_expect_success 'no arguments, but no crash' ' test_must_fail git config >output 2>&1 && - grep usage output + test_i18ngrep usage output ' cat > .git/config << EOF diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 5b79c51b8c..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' ' @@ -213,4 +211,30 @@ test_expect_success 'rev-list --verify-objects with bad sha1' ' grep -q "error: sha1 mismatch 63ffffffffffffffffffffffffffffffffffffff" out ' +_bz='\0' +_bz5="$_bz$_bz$_bz$_bz$_bz" +_bz20="$_bz5$_bz5$_bz5$_bz5" + +test_expect_success 'fsck notices blob entry pointing to null sha1' ' + (git init null-blob && + cd null-blob && + sha=$(printf "100644 file$_bz$_bz20" | + git hash-object -w --stdin -t tree) && + git fsck 2>out && + cat out && + grep "warning.*null sha1" out + ) +' + +test_expect_success 'fsck notices submodule entry pointing to null sha1' ' + (git init null-commit && + cd null-commit && + sha=$(printf "160000 submodule$_bz$_bz20" | + git hash-object -w --stdin -t tree) && + git fsck 2>out && + cat out && + grep "warning.*null sha1" out + ) +' + test_done diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index 1efd7f76dd..13c88c9aae 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -41,7 +41,7 @@ EOF test_expect_success 'test --parseopt help output' ' test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec && - test_cmp expect output + test_i18ncmp expect output ' cat > expect <<EOF diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh index c5cb77a0e1..f950c10128 100755 --- a/t/t1506-rev-parse-diagnosis.sh +++ b/t/t1506-rev-parse-diagnosis.sh @@ -182,4 +182,18 @@ test_expect_success '<commit>:file correctly diagnosed after a pathname' ' test_cmp expect actual ' +test_expect_success 'dotdot is not an empty set' ' + ( H=$(git rev-parse HEAD) && echo $H && echo ^$H ) >expect && + + git rev-parse HEAD.. >actual && + test_cmp expect actual && + + git rev-parse ..HEAD >actual && + test_cmp expect actual && + + echo .. >expect && + git rev-parse .. >actual && + test_cmp expect actual +' + test_done diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh index b8559838b1..57cbdfe9bc 100755 --- a/t/t2006-checkout-index-basic.sh +++ b/t/t2006-checkout-index-basic.sh @@ -7,7 +7,7 @@ test_description='basic checkout-index tests test_expect_success 'checkout-index --gobbledegook' ' test_expect_code 129 git checkout-index --gobbledegook 2>err && - grep "[Uu]sage" err + test_i18ngrep "[Uu]sage" err ' test_expect_success 'checkout-index -h in broken repository' ' @@ -18,7 +18,7 @@ test_expect_success 'checkout-index -h in broken repository' ' >.git/index && test_expect_code 129 git checkout-index -h >usage 2>&1 ) && - grep "[Uu]sage" broken/usage + test_i18ngrep "[Uu]sage" broken/usage ' test_done diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh index 809fafe208..a6405d318d 100755 --- a/t/t2107-update-index-basic.sh +++ b/t/t2107-update-index-basic.sh @@ -15,7 +15,7 @@ test_expect_success 'update-index --nonsense fails' ' test_expect_success 'update-index --nonsense dumps usage' ' test_expect_code 129 git update-index --nonsense 2>err && - grep "[Uu]sage: git update-index" err + test_i18ngrep "[Uu]sage: git update-index" err ' test_expect_success 'update-index -h with corrupt index' ' @@ -26,7 +26,26 @@ test_expect_success 'update-index -h with corrupt index' ' >.git/index && test_expect_code 129 git update-index -h >usage 2>&1 ) && - grep "[Uu]sage: git update-index" broken/usage + test_i18ngrep "[Uu]sage: git update-index" broken/usage +' + +test_expect_success '--cacheinfo does not accept blob null sha1' ' + echo content >file && + git add file && + git rev-parse :file >expect && + test_must_fail git update-index --cacheinfo 100644 $_z40 file && + git rev-parse :file >actual && + test_cmp expect actual +' + +test_expect_success '--cacheinfo does not accept gitlink null sha1' ' + git init submodule && + (cd submodule && test_commit foo) && + git add submodule && + git rev-parse :submodule >expect && + test_must_fail git update-index --cacheinfo 160000 $_z40 submodule && + git rev-parse :submodule >actual && + test_cmp expect actual ' test_done diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh index 490e052875..8d9bc3c2af 100755 --- a/t/t3004-ls-files-basic.sh +++ b/t/t3004-ls-files-basic.sh @@ -22,7 +22,7 @@ test_expect_success 'ls-files with nonexistent path' ' test_expect_success 'ls-files with nonsense option' ' test_expect_code 129 git ls-files --nonsense 2>actual && - grep "[Uu]sage: git ls-files" actual + test_i18ngrep "[Uu]sage: git ls-files" actual ' test_expect_success 'ls-files -h in corrupt repository' ' @@ -33,7 +33,7 @@ test_expect_success 'ls-files -h in corrupt repository' ' >.git/index && test_expect_code 129 git ls-files -h >usage 2>&1 ) && - grep "[Uu]sage: git ls-files " broken/usage + test_i18ngrep "[Uu]sage: git ls-files " broken/usage ' test_done diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index a17f8b2a40..79c8d0142e 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -31,7 +31,7 @@ test_expect_success 'branch -h in broken repository' ' >.git/refs/heads/master && test_expect_code 129 git branch -h >usage 2>&1 ) && - grep "[Uu]sage" broken/usage + test_i18ngrep "[Uu]sage" broken/usage ' test_expect_success \ @@ -74,7 +74,7 @@ test_expect_success \ test_expect_success \ 'git branch -m dumps usage' \ 'test_expect_code 129 git branch -m 2>err && - grep "[Uu]sage: git branch" err' + test_i18ngrep "[Uu]sage: git branch" err' test_expect_success \ 'git branch -m m m/m should work' \ @@ -369,6 +369,76 @@ test_expect_success \ 'git tag foobar && test_must_fail git branch --track my11 foobar' +test_expect_success 'use --set-upstream-to modify HEAD' \ + 'test_config branch.master.remote foo && + test_config branch.master.merge foo && + git branch my12 + git branch --set-upstream-to my12 && + test "$(git config branch.master.remote)" = "." && + test "$(git config branch.master.merge)" = "refs/heads/my12"' + +test_expect_success 'use --set-upstream-to modify a particular branch' \ + 'git branch my13 + git branch --set-upstream-to master my13 && + test "$(git config branch.my13.remote)" = "." && + test "$(git config branch.my13.merge)" = "refs/heads/master"' + +test_expect_success '--unset-upstream should fail if given a non-existent branch' \ + 'test_must_fail git branch --unset-upstream i-dont-exist' + +test_expect_success 'test --unset-upstream on HEAD' \ + 'git branch my14 + test_config branch.master.remote foo && + test_config branch.master.merge foo && + git branch --set-upstream-to my14 && + git branch --unset-upstream && + test_must_fail git config branch.master.remote && + test_must_fail git config branch.master.merge && + # fail for a branch without upstream set + test_must_fail git branch --unset-upstream +' + +test_expect_success 'test --unset-upstream on a particular branch' \ + 'git branch my15 + git branch --set-upstream-to master my14 && + git branch --unset-upstream my14 && + test_must_fail git config branch.my14.remote && + test_must_fail git config branch.my14.merge' + +test_expect_success '--set-upstream shows message when creating a new branch that exists as remote-tracking' \ + 'git update-ref refs/remotes/origin/master HEAD && + git branch --set-upstream origin/master 2>actual && + test_when_finished git update-ref -d refs/remotes/origin/master && + test_when_finished git branch -d origin/master && + cat >expected <<EOF && +The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to + +If you wanted to make '"'master'"' track '"'origin/master'"', do this: + + git branch -d origin/master + git branch --set-upstream-to origin/master +EOF + test_cmp expected actual +' + +test_expect_success '--set-upstream with two args only shows the deprecation message' \ + 'git branch --set-upstream master my13 2>actual && + test_when_finished git branch --unset-upstream master && + cat >expected <<EOF && +The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to +EOF + test_cmp expected actual +' + +test_expect_success '--set-upstream with one arg only shows the deprecation message if the branch existed' \ + 'git branch --set-upstream my13 2>actual && + test_when_finished git branch --unset-upstream my13 && + cat >expected <<EOF && +The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to +EOF + test_cmp expected actual +' + # Keep this test last, as it changes the current branch cat >expect <<EOF $_z40 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh index 1f35e55ee3..7480d6e7c2 100755 --- a/t/t3300-funny-names.sh +++ b/t/t3300-funny-names.sh @@ -11,6 +11,16 @@ tree, index, and tree objects. . ./test-lib.sh +HT=' ' + +echo 2>/dev/null > "Name with an${HT}HT" +if ! test -f "Name with an${HT}HT" +then + # since FAT/NTFS does not allow tabs in filenames, skip this test + skip_all='Your filesystem does not allow tabs in filenames' + test_done +fi + p0='no-funny' p1='tabs ," (dq) and spaces' p2='just space' @@ -23,21 +33,9 @@ test_expect_success 'setup' ' EOF { cat "$p0" >"$p1" || :; } && - { echo "Foo Bar Baz" >"$p2" || :; } && - - if test -f "$p1" && cmp "$p0" "$p1" - then - test_set_prereq TABS_IN_FILENAMES - fi + { echo "Foo Bar Baz" >"$p2" || :; } ' -if ! test_have_prereq TABS_IN_FILENAMES -then - # since FAT/NTFS does not allow tabs in filenames, skip this test - skip_all='Your filesystem does not allow tabs in filenames' - test_done -fi - test_expect_success 'setup: populate index and tree' ' git update-index --add "$p0" "$p2" && t0=$(git write-tree) diff --git a/t/t3401-rebase-partial.sh b/t/t3401-rebase-partial.sh index 7f8693b928..58f4823783 100755 --- a/t/t3401-rebase-partial.sh +++ b/t/t3401-rebase-partial.sh @@ -47,7 +47,23 @@ test_expect_success 'rebase ignores empty commit' ' git commit --allow-empty -m empty && test_commit D && git rebase C && - test $(git log --format=%s C..) = "D" + test "$(git log --format=%s C..)" = "D" +' + +test_expect_success 'rebase --keep-empty' ' + git reset --hard D && + git rebase --keep-empty C && + test "$(git log --format=%s C..)" = "D +empty" +' + +test_expect_success 'rebase --keep-empty keeps empty even if already in upstream' ' + git reset --hard A && + git commit --allow-empty -m also-empty && + git rebase --keep-empty D && + test "$(git log --format=%s A..)" = "also-empty +D +empty" ' test_done diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 7304b663c3..32fdc9938e 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -118,6 +118,17 @@ test_expect_success 'rebase -i with the exec command checks tree cleanness' ' git rebase --continue ' +test_expect_success 'rebase -i with exec of inexistent command' ' + git checkout master && + test_when_finished "git rebase --abort" && + ( + FAKE_LINES="exec_this-command-does-not-exist 1" && + export FAKE_LINES && + test_must_fail git rebase -i HEAD^ >actual 2>&1 + ) && + ! grep "Maybe git-rebase is broken" actual +' + test_expect_success 'no changes are a nop' ' git checkout branch2 && git rebase -i F && @@ -911,4 +922,22 @@ test_expect_success 'rebase -i --root fixup root commit' ' test 0 = $(git cat-file commit HEAD | grep -c ^parent\ ) ' +test_expect_success 'rebase --edit-todo does not works on non-interactive rebase' ' + git reset --hard && + git checkout conflict-branch && + test_must_fail git rebase --onto HEAD~2 HEAD~ && + test_must_fail git rebase --edit-todo && + git rebase --abort +' + +test_expect_success 'rebase --edit-todo can be used to modify todo' ' + git reset --hard && + git checkout no-conflict-branch^0 && + FAKE_LINES="edit 1 2 3" git rebase -i HEAD~3 && + FAKE_LINES="2 1" git rebase --edit-todo && + git rebase --continue + test M = $(git cat-file commit HEAD^ | sed -ne \$p) && + test L = $(git cat-file commit HEAD | sed -ne \$p) +' + test_done diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh index 595d2ff990..34c86e5de6 100755 --- a/t/t3501-revert-cherry-pick.sh +++ b/t/t3501-revert-cherry-pick.sh @@ -47,7 +47,7 @@ test_expect_success 'cherry-pick --nonsense' ' git diff --exit-code HEAD && test_must_fail git cherry-pick --nonsense 2>msg && git diff --exit-code HEAD "$pos" && - grep '[Uu]sage:' msg + test_i18ngrep '[Uu]sage:' msg ' test_expect_success 'revert --nonsense' ' @@ -56,7 +56,7 @@ test_expect_success 'revert --nonsense' ' git diff --exit-code HEAD && test_must_fail git revert --nonsense 2>msg && git diff --exit-code HEAD "$pos" && - grep '[Uu]sage:' msg + test_i18ngrep '[Uu]sage:' msg ' test_expect_success 'cherry-pick after renaming branch' ' diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh index 5a1340cee6..a0c6e30d80 100755 --- a/t/t3505-cherry-pick-empty.sh +++ b/t/t3505-cherry-pick-empty.sh @@ -53,6 +53,11 @@ test_expect_success 'index lockfile was removed' ' ' +test_expect_success 'cherry-pick a commit with an empty message with --allow-empty-message' ' + git checkout -f master && + git cherry-pick --allow-empty-message empty-branch +' + test_expect_success 'cherry pick an empty non-ff commit without --allow-empty' ' git checkout master && echo fourth >>file2 && diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh index 0c81b3c427..c82f7210c4 100755 --- a/t/t3507-cherry-pick-conflict.sh +++ b/t/t3507-cherry-pick-conflict.sh @@ -30,6 +30,7 @@ test_expect_success setup ' test_commit initial foo a && test_commit base foo b && test_commit picked foo c && + test_commit --signoff picked-signed foo d && git config advice.detachedhead false ' @@ -340,4 +341,35 @@ test_expect_success 'revert conflict, diff3 -m style' ' test_cmp expected actual ' +test_expect_success 'failed cherry-pick does not forget -s' ' + pristine_detach initial && + test_must_fail git cherry-pick -s picked && + test_i18ngrep -e "Signed-off-by" .git/MERGE_MSG +' + +test_expect_success 'commit after failed cherry-pick does not add duplicated -s' ' + pristine_detach initial && + test_must_fail git cherry-pick -s picked-signed && + git commit -a -s && + test $(git show -s |grep -c "Signed-off-by") = 1 +' + +test_expect_success 'commit after failed cherry-pick adds -s at the right place' ' + pristine_detach initial && + test_must_fail git cherry-pick picked && + git commit -a -s && + pwd && + cat <<EOF > expected && +picked + +Signed-off-by: C O Mitter <committer@example.com> + +Conflicts: + foo +EOF + + git show -s --pretty=format:%B > actual && + test_cmp expected actual +' + test_done diff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh index 75f7ff4f2f..340afc760d 100755 --- a/t/t3508-cherry-pick-many-commits.sh +++ b/t/t3508-cherry-pick-many-commits.sh @@ -44,6 +44,21 @@ test_expect_success 'cherry-pick first..fourth works' ' check_head_differs_from fourth ' +test_expect_success 'cherry-pick three one two works' ' + git checkout -f first && + test_commit one && + test_commit two && + test_commit three && + git checkout -f master && + git reset --hard first && + git cherry-pick three one two && + git diff --quiet three && + git diff --quiet HEAD three && + test "$(git log --reverse --format=%s first..)" = "three +one +two" +' + test_expect_success 'output to keep user entertained during multi-pick' ' cat <<-\EOF >expected && [master OBJID] second diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index f4e6450d6a..b5fb527b2e 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -410,7 +410,7 @@ test_expect_success '--continue respects -x in first commit in multi-pick' ' grep "cherry picked from.*$picked" msg ' -test_expect_success '--signoff is not automatically propagated to resolved conflict' ' +test_expect_failure '--signoff is automatically propagated to resolved conflict' ' pristine_detach initial && test_expect_code 1 git cherry-pick --signoff base..anotherpick && echo "c" >foo && @@ -428,7 +428,7 @@ test_expect_success '--signoff is not automatically propagated to resolved confl grep "Signed-off-by:" anotherpick_msg ' -test_expect_success '--signoff dropped for implicit commit of resolution, multi-pick case' ' +test_expect_failure '--signoff dropped for implicit commit of resolution, multi-pick case' ' pristine_detach initial && test_must_fail git cherry-pick -s picked anotherpick && echo c >foo && @@ -441,7 +441,7 @@ test_expect_success '--signoff dropped for implicit commit of resolution, multi- ! grep Signed-off-by: msg ' -test_expect_success 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' ' +test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' ' pristine_detach initial && test_must_fail git cherry-pick -s picked && echo c >foo && diff --git a/t/t3902-quoted.sh b/t/t3902-quoted.sh index 534ee08a44..892f567844 100755 --- a/t/t3902-quoted.sh +++ b/t/t3902-quoted.sh @@ -16,9 +16,8 @@ echo foo 2>/dev/null > "Name and an${HT}HT" if ! test -f "Name and an${HT}HT" then # FAT/NTFS does not allow tabs in filenames - say 'Your filesystem does not allow tabs in filenames' -else - test_set_prereq TABS_IN_FILENAMES + skip_all='Your filesystem does not allow tabs in filenames' + test_done fi for_each_name () { @@ -31,7 +30,7 @@ for_each_name () { done } -test_expect_success TABS_IN_FILENAMES 'setup' ' +test_expect_success 'setup' ' mkdir "$FN" && for_each_name "echo initial >\"\$name\"" && @@ -45,7 +44,7 @@ test_expect_success TABS_IN_FILENAMES 'setup' ' ' -test_expect_success TABS_IN_FILENAMES 'setup expected files' ' +test_expect_success 'setup expected files' ' cat >expect.quoted <<\EOF && Name "Name and a\nLF" @@ -75,74 +74,74 @@ With SP in it EOF ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' ' +test_expect_success 'check fully quoted output from ls-files' ' git ls-files >current && test_cmp expect.quoted current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' ' +test_expect_success 'check fully quoted output from diff-files' ' git diff --name-only >current && test_cmp expect.quoted current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' ' +test_expect_success 'check fully quoted output from diff-index' ' git diff --name-only HEAD >current && test_cmp expect.quoted current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' ' +test_expect_success 'check fully quoted output from diff-tree' ' git diff --name-only HEAD^ HEAD >current && test_cmp expect.quoted current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' ' +test_expect_success 'check fully quoted output from ls-tree' ' git ls-tree --name-only -r HEAD >current && test_cmp expect.quoted current ' -test_expect_success TABS_IN_FILENAMES 'setting core.quotepath' ' +test_expect_success 'setting core.quotepath' ' git config --bool core.quotepath false ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' ' +test_expect_success 'check fully quoted output from ls-files' ' git ls-files >current && test_cmp expect.raw current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' ' +test_expect_success 'check fully quoted output from diff-files' ' git diff --name-only >current && test_cmp expect.raw current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' ' +test_expect_success 'check fully quoted output from diff-index' ' git diff --name-only HEAD >current && test_cmp expect.raw current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' ' +test_expect_success 'check fully quoted output from diff-tree' ' git diff --name-only HEAD^ HEAD >current && test_cmp expect.raw current ' -test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' ' +test_expect_success 'check fully quoted output from ls-tree' ' git ls-tree --name-only -r HEAD >current && test_cmp expect.raw current diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index cd042633ba..5dfbda7491 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -610,7 +610,7 @@ test_expect_success 'stash apply shows status same as git status (relative to cu git stash apply ) | sed -e 1,2d >actual && # drop "Saved..." and "HEAD is now..." - test_cmp expect actual + test_i18ncmp expect actual ' cat > expect << EOF diff --git a/t/t3910-mac-os-precompose.sh b/t/t3910-mac-os-precompose.sh index 88b7a20c11..5fe57c5438 100755 --- a/t/t3910-mac-os-precompose.sh +++ b/t/t3910-mac-os-precompose.sh @@ -7,158 +7,147 @@ test_description='utf-8 decomposed (nfd) converted to precomposed (nfc)' . ./test-lib.sh +if ! test_have_prereq UTF8_NFD_TO_NFC +then + skip_all="filesystem does not corrupt utf-8" + test_done +fi + +# create utf-8 variables Adiarnfc=`printf '\303\204'` Adiarnfd=`printf 'A\314\210'` -# check if the feature is compiled in -mkdir junk && ->junk/"$Adiarnfc" && -case "$(cd junk && echo *)" in - "$Adiarnfd") - test_nfd=1 - ;; - *) ;; -esac -rm -rf junk +Odiarnfc=`printf '\303\226'` +Odiarnfd=`printf 'O\314\210'` +AEligatu=`printf '\303\206'` +Invalidu=`printf '\303\377'` -if test "$test_nfd" -then - # create more utf-8 variables - Odiarnfc=`printf '\303\226'` - Odiarnfd=`printf 'O\314\210'` - AEligatu=`printf '\303\206'` - Invalidu=`printf '\303\377'` +#Create a string with 255 bytes (decomposed) +Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte +Alongd=$Alongd$Alongd$Alongd #63 Byte +Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd #255 Byte +#Create a string with 254 bytes (precomposed) +Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte +Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #50 Byte +Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #250 Byte +Alongc=$Alongc$AEligatu$AEligatu #254 Byte - #Create a string with 255 bytes (decomposed) - Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte - Alongd=$Alongd$Alongd$Alongd #63 Byte - Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd #255 Byte - - #Create a string with 254 bytes (precomposed) - Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte - Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #50 Byte - Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #250 Byte - Alongc=$Alongc$AEligatu$AEligatu #254 Byte - - test_expect_success "detect if nfd needed" ' - precomposeunicode=`git config core.precomposeunicode` && - test "$precomposeunicode" = false && - git config core.precomposeunicode true - ' - test_expect_success "setup" ' - >x && - git add x && - git commit -m "1st commit" && - git rm x && - git commit -m "rm x" - ' - test_expect_success "setup case mac" ' - git checkout -b mac_os - ' - # This will test nfd2nfc in readdir() - test_expect_success "add file Adiarnfc" ' - echo f.Adiarnfc >f.$Adiarnfc && - git add f.$Adiarnfc && - git commit -m "add f.$Adiarnfc" - ' - # This will test nfd2nfc in git stage() - test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" ' - mkdir d.$Adiarnfd && - echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd && - git stage d.$Adiarnfd/f.$Adiarnfd && - git commit -m "add d.$Adiarnfd/f.$Adiarnfd" - ' - test_expect_success "add link Adiarnfc" ' - ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc && - git add l.$Adiarnfc && - git commit -m "add l.Adiarnfc" - ' - # This will test git log - test_expect_success "git log f.Adiar" ' - git log f.$Adiarnfc > f.Adiarnfc.log && - git log f.$Adiarnfd > f.Adiarnfd.log && - test -s f.Adiarnfc.log && - test -s f.Adiarnfd.log && - test_cmp f.Adiarnfc.log f.Adiarnfd.log && - rm f.Adiarnfc.log f.Adiarnfd.log - ' - # This will test git ls-files - test_expect_success "git lsfiles f.Adiar" ' - git ls-files f.$Adiarnfc > f.Adiarnfc.log && - git ls-files f.$Adiarnfd > f.Adiarnfd.log && - test -s f.Adiarnfc.log && - test -s f.Adiarnfd.log && - test_cmp f.Adiarnfc.log f.Adiarnfd.log && - rm f.Adiarnfc.log f.Adiarnfd.log - ' - # This will test git mv - test_expect_success "git mv" ' - git mv f.$Adiarnfd f.$Odiarnfc && - git mv d.$Adiarnfd d.$Odiarnfc && - git mv l.$Adiarnfd l.$Odiarnfc && - git commit -m "mv Adiarnfd Odiarnfc" - ' - # Files can be checked out as nfc - # And the link has been corrected from nfd to nfc - test_expect_success "git checkout nfc" ' - rm f.$Odiarnfc && - git checkout f.$Odiarnfc - ' - # Make it possible to checkout files with their NFD names - test_expect_success "git checkout file nfd" ' - rm -f f.* && - git checkout f.$Odiarnfd - ' - # Make it possible to checkout links with their NFD names - test_expect_success "git checkout link nfd" ' - rm l.* && - git checkout l.$Odiarnfd - ' - test_expect_success "setup case mac2" ' - git checkout master && - git reset --hard && - git checkout -b mac_os_2 - ' - # This will test nfd2nfc in git commit - test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" ' - mkdir d2.$Adiarnfd && - echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd && - git add d2.$Adiarnfd/f.$Adiarnfd && - git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd - ' - test_expect_success "setup for long decomposed filename" ' - git checkout master && - git reset --hard && - git checkout -b mac_os_long_nfd_fn - ' - test_expect_success "Add long decomposed filename" ' - echo longd >$Alongd && - git add * && - git commit -m "Long filename" - ' - test_expect_success "setup for long precomposed filename" ' - git checkout master && - git reset --hard && - git checkout -b mac_os_long_nfc_fn - ' - test_expect_success "Add long precomposed filename" ' - echo longc >$Alongc && - git add * && - git commit -m "Long filename" - ' - # Test if the global core.precomposeunicode stops autosensing - # Must be the last test case - test_expect_success "respect git config --global core.precomposeunicode" ' - git config --global core.precomposeunicode true && - rm -rf .git && - git init && - precomposeunicode=`git config core.precomposeunicode` && - test "$precomposeunicode" = "true" - ' -else - say "Skipping nfc/nfd tests" -fi +test_expect_success "detect if nfd needed" ' + precomposeunicode=`git config core.precomposeunicode` && + test "$precomposeunicode" = false && + git config core.precomposeunicode true +' +test_expect_success "setup" ' + >x && + git add x && + git commit -m "1st commit" && + git rm x && + git commit -m "rm x" +' +test_expect_success "setup case mac" ' + git checkout -b mac_os +' +# This will test nfd2nfc in readdir() +test_expect_success "add file Adiarnfc" ' + echo f.Adiarnfc >f.$Adiarnfc && + git add f.$Adiarnfc && + git commit -m "add f.$Adiarnfc" +' +# This will test nfd2nfc in git stage() +test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" ' + mkdir d.$Adiarnfd && + echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd && + git stage d.$Adiarnfd/f.$Adiarnfd && + git commit -m "add d.$Adiarnfd/f.$Adiarnfd" +' +test_expect_success "add link Adiarnfc" ' + ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc && + git add l.$Adiarnfc && + git commit -m "add l.Adiarnfc" +' +# This will test git log +test_expect_success "git log f.Adiar" ' + git log f.$Adiarnfc > f.Adiarnfc.log && + git log f.$Adiarnfd > f.Adiarnfd.log && + test -s f.Adiarnfc.log && + test -s f.Adiarnfd.log && + test_cmp f.Adiarnfc.log f.Adiarnfd.log && + rm f.Adiarnfc.log f.Adiarnfd.log +' +# This will test git ls-files +test_expect_success "git lsfiles f.Adiar" ' + git ls-files f.$Adiarnfc > f.Adiarnfc.log && + git ls-files f.$Adiarnfd > f.Adiarnfd.log && + test -s f.Adiarnfc.log && + test -s f.Adiarnfd.log && + test_cmp f.Adiarnfc.log f.Adiarnfd.log && + rm f.Adiarnfc.log f.Adiarnfd.log +' +# This will test git mv +test_expect_success "git mv" ' + git mv f.$Adiarnfd f.$Odiarnfc && + git mv d.$Adiarnfd d.$Odiarnfc && + git mv l.$Adiarnfd l.$Odiarnfc && + git commit -m "mv Adiarnfd Odiarnfc" +' +# Files can be checked out as nfc +# And the link has been corrected from nfd to nfc +test_expect_success "git checkout nfc" ' + rm f.$Odiarnfc && + git checkout f.$Odiarnfc +' +# Make it possible to checkout files with their NFD names +test_expect_success "git checkout file nfd" ' + rm -f f.* && + git checkout f.$Odiarnfd +' +# Make it possible to checkout links with their NFD names +test_expect_success "git checkout link nfd" ' + rm l.* && + git checkout l.$Odiarnfd +' +test_expect_success "setup case mac2" ' + git checkout master && + git reset --hard && + git checkout -b mac_os_2 +' +# This will test nfd2nfc in git commit +test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" ' + mkdir d2.$Adiarnfd && + echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd && + git add d2.$Adiarnfd/f.$Adiarnfd && + git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd +' +test_expect_success "setup for long decomposed filename" ' + git checkout master && + git reset --hard && + git checkout -b mac_os_long_nfd_fn +' +test_expect_success "Add long decomposed filename" ' + echo longd >$Alongd && + git add * && + git commit -m "Long filename" +' +test_expect_success "setup for long precomposed filename" ' + git checkout master && + git reset --hard && + git checkout -b mac_os_long_nfc_fn +' +test_expect_success "Add long precomposed filename" ' + echo longc >$Alongc && + git add * && + git commit -m "Long filename" +' +# Test if the global core.precomposeunicode stops autosensing +# Must be the last test case +test_expect_success "respect git config --global core.precomposeunicode" ' + git config --global core.precomposeunicode true && + rm -rf .git && + git init && + precomposeunicode=`git config core.precomposeunicode` && + test "$precomposeunicode" = "true" +' test_done diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh index 7a3e1f9a24..3d4b1ba23f 100755 --- a/t/t4006-diff-mode.sh +++ b/t/t4006-diff-mode.sh @@ -36,24 +36,24 @@ test_expect_success '--stat output after text chmod' ' test_chmod -x rezrov && echo " 0 files changed" >expect && git diff HEAD --stat >actual && - test_cmp expect actual + test_i18ncmp expect actual ' test_expect_success '--shortstat output after text chmod' ' git diff HEAD --shortstat >actual && - test_cmp expect actual + test_i18ncmp expect actual ' test_expect_success '--stat output after binary chmod' ' test_chmod +x binbin && echo " 0 files changed" >expect && git diff HEAD --stat >actual && - test_cmp expect actual + test_i18ncmp expect actual ' test_expect_success '--shortstat output after binary chmod' ' git diff HEAD --shortstat >actual && - test_cmp expect actual + test_i18ncmp expect actual ' test_done diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh index ec4deea192..1215ae544b 100755 --- a/t/t4012-diff-binary.sh +++ b/t/t4012-diff-binary.sh @@ -63,7 +63,7 @@ test_expect_success 'apply --numstat understands diff --binary format' ' # apply needs to be able to skip the binary material correctly # in order to report the line number of a corrupt patch. -test_expect_success 'apply detecting corrupt patch correctly' ' +test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' ' git diff >output && sed -e "s/-CIT/xCIT/" <output >broken && test_must_fail git apply --stat --summary broken 2>detected && @@ -73,7 +73,7 @@ test_expect_success 'apply detecting corrupt patch correctly' ' test "$detected" = xCIT ' -test_expect_success 'apply detecting corrupt patch correctly' ' +test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' ' git diff --binary | sed -e "s/-CIT/xCIT/" >broken && test_must_fail git apply --stat --summary broken 2>detected && detected=`cat detected` && diff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh index 97b81778cb..cd543ecc54 100755 --- a/t/t4016-diff-quote.sh +++ b/t/t4016-diff-quote.sh @@ -13,14 +13,12 @@ P1='pathname with HT' P2='pathname with SP' P3='pathname with LF' -if : 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" -then - test_set_prereq TABS_IN_FILENAMES -else - say 'Your filesystem does not allow tabs in filenames' -fi +echo 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" || { + skip_all='Your filesystem does not allow tabs in filenames' + test_done +} -test_expect_success TABS_IN_FILENAMES setup ' +test_expect_success setup ' echo P0.0 >"$P0.0" && echo P0.1 >"$P0.1" && echo P0.2 >"$P0.2" && @@ -40,7 +38,7 @@ test_expect_success TABS_IN_FILENAMES setup ' : ' -test_expect_success TABS_IN_FILENAMES 'setup expected files' ' +test_expect_success 'setup expected files' ' cat >expect <<\EOF rename pathname.1 => "Rpathname\twith HT.0" (100%) rename pathname.3 => "Rpathname\nwith LF.0" (100%) @@ -52,12 +50,12 @@ cat >expect <<\EOF EOF ' -test_expect_success TABS_IN_FILENAMES 'git diff --summary -M HEAD' ' +test_expect_success 'git diff --summary -M HEAD' ' git diff --summary -M HEAD >actual && test_cmp expect actual ' -test_expect_success TABS_IN_FILENAMES 'git diff --numstat -M HEAD' ' +test_expect_success 'git diff --numstat -M HEAD' ' cat >expect <<-\EOF && 0 0 pathname.1 => "Rpathname\twith HT.0" 0 0 pathname.3 => "Rpathname\nwith LF.0" @@ -71,7 +69,7 @@ test_expect_success TABS_IN_FILENAMES 'git diff --numstat -M HEAD' ' test_cmp expect actual ' -test_expect_success TABS_IN_FILENAMES 'git diff --stat -M HEAD' ' +test_expect_success 'git diff --stat -M HEAD' ' cat >expect <<-\EOF && pathname.1 => "Rpathname\twith HT.0" | 0 pathname.3 => "Rpathname\nwith LF.0" | 0 diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh index 4bd2a1c838..082d3e83bd 100755 --- a/t/t4018-diff-funcname.sh +++ b/t/t4018-diff-funcname.sh @@ -105,7 +105,7 @@ test_expect_funcname () { grep "^@@.*@@ $1" diff } -for p in bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex +for p in ada bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex do test_expect_success "builtin $p pattern compiles" ' echo "*.java diff=$p" >.gitattributes && diff --git a/t/t4022-diff-rewrite.sh b/t/t4022-diff-rewrite.sh index c00a94b9ba..2d030a4ec3 100755 --- a/t/t4022-diff-rewrite.sh +++ b/t/t4022-diff-rewrite.sh @@ -66,5 +66,35 @@ test_expect_success 'suppress deletion diff with -B -D' ' grep -v "Linus Torvalds" actual ' +test_expect_success 'prepare a file that ends with an incomplete line' ' + test_seq 1 99 >seq && + printf 100 >>seq && + git add seq && + git commit seq -m seq +' + +test_expect_success 'rewrite the middle 90% of sequence file and terminate with newline' ' + test_seq 1 5 >seq && + test_seq 9331 9420 >>seq && + test_seq 96 100 >>seq +' + +test_expect_success 'confirm that sequence file is considered a rewrite' ' + git diff -B seq >res && + grep "dissimilarity index" res +' + +test_expect_success 'no newline at eof is on its own line without -B' ' + git diff seq >res && + grep "^\\\\ " res && + ! grep "^..*\\\\ " res +' + +test_expect_success 'no newline at eof is on its own line with -B' ' + git diff -B seq >res && + grep "^\\\\ " res && + ! grep "^..*\\\\ " res +' + test_done diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh index 30d42cb3bf..40ab333a8a 100755 --- a/t/t4034-diff-words.sh +++ b/t/t4034-diff-words.sh @@ -298,6 +298,7 @@ test_expect_success 'unset default driver' ' test_unconfig diff.wordregex ' +test_language_driver ada test_language_driver bibtex test_language_driver cpp test_language_driver csharp diff --git a/t/t4034/ada/expect b/t/t4034/ada/expect new file mode 100644 index 0000000000..be2376e904 --- /dev/null +++ b/t/t4034/ada/expect @@ -0,0 +1,27 @@ +<BOLD>diff --git a/pre b/post<RESET> +<BOLD>index d96fdd1..df21bb0 100644<RESET> +<BOLD>--- a/pre<RESET> +<BOLD>+++ b/post<RESET> +<CYAN>@@ -1,13 +1,13 @@<RESET> +Ada.Text_IO.Put_Line("Hello World<RED>!<RESET><GREEN>?<RESET>"); +1 1e<RED>-<RESET>10 16#FE12#E2 3.141_592 '<RED>x<RESET><GREEN>y<RESET>' +<RED>a<RESET><GREEN>x<RESET>+<RED>b a<RESET><GREEN>y x<RESET>-<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>*<RED>b a<RESET><GREEN>y x<RESET>/<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>**<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>(<RED>b<RESET><GREEN>y<RESET>) +<RED>a<RESET><GREEN>x<RESET>:=<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>=<RED>b a<RESET><GREEN>y x<RESET>/= <RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET><<RED>b a<RESET><GREEN>y x<RESET><=<RED>b a<RESET><GREEN>y x<RESET>><RED>b a<RESET><GREEN>y x<RESET>>=<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>,<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>=><RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET>..<RED>b<RESET> +<RED>a<RESET><GREEN>y<RESET> +<GREEN>x<RESET><><RED>b<RESET><GREEN>y<RESET> diff --git a/t/t4034/ada/post b/t/t4034/ada/post new file mode 100644 index 0000000000..df21bb044f --- /dev/null +++ b/t/t4034/ada/post @@ -0,0 +1,13 @@ +Ada.Text_IO.Put_Line("Hello World?"); +1 1e10 16#FE12#E2 3.141_592 'y' +x+y x-y +x*y x/y +x**y +x(y) +x:=y +x=y x/= y +x<y x<=y x>y x>=y +x,y +x=>y +x..y +x<>y diff --git a/t/t4034/ada/pre b/t/t4034/ada/pre new file mode 100644 index 0000000000..d96fdd1e8e --- /dev/null +++ b/t/t4034/ada/pre @@ -0,0 +1,13 @@ +Ada.Text_IO.Put_Line("Hello World!"); +1 1e-10 16#FE12#E2 3.141_592 'x' +a+b a-b +a*b a/b +a**b +a(b) +a:=b +a=b a/= b +a<b a<=b a>b a>=b +a,b +a=>b +a..b +a<>b diff --git a/t/t4054-diff-bogus-tree.sh b/t/t4054-diff-bogus-tree.sh new file mode 100755 index 0000000000..0843c87890 --- /dev/null +++ b/t/t4054-diff-bogus-tree.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +test_description='test diff with a bogus tree containing the null sha1' +. ./test-lib.sh + +empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904 + +test_expect_success 'create bogus tree' ' + bogus_tree=$( + printf "100644 fooQQQQQQQQQQQQQQQQQQQQQ" | + q_to_nul | + git hash-object -w --stdin -t tree + ) +' + +test_expect_success 'create tree with matching file' ' + echo bar >foo && + git add foo && + good_tree=$(git write-tree) + blob=$(git rev-parse :foo) +' + +test_expect_success 'raw diff shows null sha1 (addition)' ' + echo ":000000 100644 $_z40 $_z40 A foo" >expect && + git diff-tree $empty_tree $bogus_tree >actual && + test_cmp expect actual +' + +test_expect_success 'raw diff shows null sha1 (removal)' ' + echo ":100644 000000 $_z40 $_z40 D foo" >expect && + git diff-tree $bogus_tree $empty_tree >actual && + test_cmp expect actual +' + +test_expect_success 'raw diff shows null sha1 (modification)' ' + echo ":100644 100644 $blob $_z40 M foo" >expect && + git diff-tree $good_tree $bogus_tree >actual && + test_cmp expect actual +' + +test_expect_success 'raw diff shows null sha1 (other direction)' ' + echo ":100644 100644 $_z40 $blob M foo" >expect && + git diff-tree $bogus_tree $good_tree >actual && + test_cmp expect actual +' + +test_expect_success 'raw diff shows null sha1 (reverse)' ' + echo ":100644 100644 $_z40 $blob M foo" >expect && + git diff-tree -R $good_tree $bogus_tree >actual && + test_cmp expect actual +' + +test_expect_success 'raw diff shows null sha1 (index)' ' + echo ":100644 100644 $_z40 $blob M foo" >expect && + git diff-index $bogus_tree >actual && + test_cmp expect actual +' + +test_expect_success 'patch fails due to bogus sha1 (addition)' ' + test_must_fail git diff-tree -p $empty_tree $bogus_tree +' + +test_expect_success 'patch fails due to bogus sha1 (removal)' ' + test_must_fail git diff-tree -p $bogus_tree $empty_tree +' + +test_expect_success 'patch fails due to bogus sha1 (modification)' ' + test_must_fail git diff-tree -p $good_tree $bogus_tree +' + +test_expect_success 'patch fails due to bogus sha1 (other direction)' ' + test_must_fail git diff-tree -p $bogus_tree $good_tree +' + +test_expect_success 'patch fails due to bogus sha1 (reverse)' ' + test_must_fail git diff-tree -R -p $good_tree $bogus_tree +' + +test_expect_success 'patch fails due to bogus sha1 (index)' ' + test_must_fail git diff-index -p $bogus_tree +' + +test_done 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/t4103-apply-binary.sh b/t/t4103-apply-binary.sh index 99627bc6d6..b1b906b1bb 100755 --- a/t/t4103-apply-binary.sh +++ b/t/t4103-apply-binary.sh @@ -8,30 +8,28 @@ test_description='git apply handling binary patches ' . ./test-lib.sh -# setup - -cat >file1 <<EOF -A quick brown fox jumps over the lazy dog. -A tiny little penguin runs around in circles. -There is a flag with Linux written on it. -A slow black-and-white panda just sits there, -munching on his bamboo. -EOF -cat file1 >file2 -cat file1 >file4 - -test_expect_success 'setup' " +test_expect_success 'setup' ' + cat >file1 <<-\EOF && + A quick brown fox jumps over the lazy dog. + A tiny little penguin runs around in circles. + There is a flag with Linux written on it. + A slow black-and-white panda just sits there, + munching on his bamboo. + EOF + cat file1 >file2 && + cat file1 >file4 && + git update-index --add --remove file1 file2 file4 && - git commit -m 'Initial Version' 2>/dev/null && + git commit -m "Initial Version" 2>/dev/null && git checkout -b binary && - "$PERL_PATH" -pe 'y/x/\000/' <file1 >file3 && + "$PERL_PATH" -pe "y/x/\000/" <file1 >file3 && cat file3 >file4 && git add file2 && - "$PERL_PATH" -pe 'y/\000/v/' <file3 >file1 && + "$PERL_PATH" -pe "y/\000/v/" <file3 >file1 && rm -f file2 && git update-index --add --remove file1 file2 file3 file4 && - git commit -m 'Second Version' && + git commit -m "Second Version" && git diff-tree -p master binary >B.diff && git diff-tree -p -C master binary >C.diff && @@ -42,17 +40,25 @@ test_expect_success 'setup' " git diff-tree -p --full-index master binary >B-index.diff && git diff-tree -p -C --full-index master binary >C-index.diff && + git diff-tree -p --binary --no-prefix master binary -- file3 >B0.diff && + git init other-repo && - (cd other-repo && - git fetch .. master && - git reset --hard FETCH_HEAD + ( + cd other-repo && + git fetch .. master && + git reset --hard FETCH_HEAD ) -" +' test_expect_success 'stat binary diff -- should not fail.' \ 'git checkout master && git apply --stat --summary B.diff' +test_expect_success 'stat binary -p0 diff -- should not fail.' ' + git checkout master && + git apply --stat -p0 B0.diff +' + test_expect_success 'stat binary diff (copy) -- should not fail.' \ 'git checkout master && git apply --stat --summary C.diff' @@ -143,4 +149,10 @@ test_expect_success 'apply binary diff (copy).' \ git apply --allow-binary-replacement --index CF.diff && test -z "$(git diff --name-status binary)"' +test_expect_success 'apply binary -p0 diff' ' + do_reset && + git apply -p0 --index B0.diff && + test -z "$(git diff --name-status binary -- file3)" +' + test_done diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh index a33d510bf6..c5fecdfed4 100755 --- a/t/t4120-apply-popt.sh +++ b/t/t4120-apply-popt.sh @@ -32,7 +32,7 @@ test_expect_success 'apply git diff with -p2' ' test_expect_success 'apply with too large -p' ' cp file1.saved file1 && test_must_fail git apply --stat -p3 patch.file 2>err && - grep "removing 3 leading" err + test_i18ngrep "removing 3 leading" err ' test_expect_success 'apply (-p2) traditional diff with funny filenames' ' @@ -54,7 +54,7 @@ test_expect_success 'apply (-p2) traditional diff with funny filenames' ' test_expect_success 'apply with too large -p and fancy filename' ' cp file1.saved file1 && test_must_fail git apply --stat -p3 patch.escaped 2>err && - grep "removing 3 leading" err + test_i18ngrep "removing 3 leading" err ' test_expect_success 'apply (-p2) diff, mode change only' ' diff --git a/t/t4133-apply-filenames.sh b/t/t4133-apply-filenames.sh index 94da99075c..2ecb4216b7 100755 --- a/t/t4133-apply-filenames.sh +++ b/t/t4133-apply-filenames.sh @@ -30,9 +30,9 @@ EOF test_expect_success 'apply diff with inconsistent filenames in headers' ' test_must_fail git apply bad1.patch 2>err && - grep "inconsistent new filename" err && + test_i18ngrep "inconsistent new filename" err && test_must_fail git apply bad2.patch 2>err && - grep "inconsistent old filename" err + test_i18ngrep "inconsistent old filename" err ' test_done diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index 3ab670d36a..7f6666fcd3 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -382,13 +382,13 @@ test_expect_success 'rerere --no-no-rerere-autoupdate' ' git update-index --index-info <failedmerge && cp file3.conflict file3 && test_must_fail git rerere --no-no-rerere-autoupdate 2>err && - grep [Uu]sage err && + test_i18ngrep [Uu]sage err && test_must_fail git update-index --refresh ' test_expect_success 'rerere -h' ' test_must_fail git rerere -h >help && - grep [Uu]sage help + test_i18ngrep [Uu]sage help ' test_done diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 71be59d446..924ba536ca 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -178,11 +178,21 @@ test_expect_success 'git log --no-walk <commits> sorts by commit time' ' test_cmp expect actual ' +test_expect_success 'git log --no-walk=sorted <commits> sorts by commit time' ' + git log --no-walk=sorted --oneline 5d31159 804a787 394ef78 > actual && + test_cmp expect actual +' + cat > expect << EOF 5d31159 fourth 804a787 sixth 394ef78 fifth EOF +test_expect_success 'git log --no-walk=unsorted <commits> leaves list of commits as given' ' + git log --no-walk=unsorted --oneline 5d31159 804a787 394ef78 > actual && + test_cmp expect actual +' + test_expect_success 'git show <commits> leaves list of commits as given' ' git show --oneline -s 5d31159 804a787 394ef78 > actual && test_cmp expect actual @@ -803,7 +813,14 @@ sanitize_output () { test_expect_success 'log --graph with diff and stats' ' git log --graph --pretty=short --stat -p >actual && sanitize_output >actual.sanitized <actual && - test_cmp expect actual.sanitized + test_i18ncmp expect actual.sanitized +' + +test_expect_success 'dotdot is a parent directory' ' + mkdir -p a/b && + ( echo sixth && echo fifth ) >expect && + ( cd a/b && git log --format=%s .. ) >actual && + test_cmp expect actual ' test_done diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 4afd77815f..2c45de7aea 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -88,7 +88,7 @@ test_expect_success 'NUL separation with --stat' ' stat1_part=$(git diff --stat --root HEAD^) && printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n" >expected && git log -z --stat --pretty="format:%s" >actual && - test_cmp expected actual + test_i18ncmp expected actual ' test_expect_failure 'NUL termination with --stat' ' @@ -96,7 +96,7 @@ test_expect_failure 'NUL termination with --stat' ' stat1_part=$(git diff --stat --root HEAD^) && printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n\0" >expected && git log -z --stat --pretty="tformat:%s" >actual && - test_cmp expected actual + test_i18ncmp expected actual ' test_done diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index 81904d9ec8..3e64a7a65d 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -11,7 +11,7 @@ test_expect_success 'split sample box' \ 'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last && last=`cat last` && echo total is $last && - test `cat last` = 16' + test `cat last` = 17' check_mailinfo () { mail=$1 opt=$2 diff --git a/t/t5100/info0017 b/t/t5100/info0017 new file mode 100644 index 0000000000..d2bc89ffe9 --- /dev/null +++ b/t/t5100/info0017 @@ -0,0 +1,5 @@ +Author: A U Thor +Email: a.u.thor@example.com +Subject: A E I O U +Date: Mon, 17 Sep 2012 14:23:44 -0700 + diff --git a/t/t5100/msg0017 b/t/t5100/msg0017 new file mode 100644 index 0000000000..2ee0900850 --- /dev/null +++ b/t/t5100/msg0017 @@ -0,0 +1,2 @@ +New content here + diff --git a/t/t5100/patch0017 b/t/t5100/patch0017 new file mode 100644 index 0000000000..35cf84c9a1 --- /dev/null +++ b/t/t5100/patch0017 @@ -0,0 +1,6 @@ +diff --git a/foo b/foo +index e69de29..d95f3ad 100644 +--- a/foo ++++ b/foo +@@ -0,0 +1 @@ ++New content diff --git a/t/t5100/sample.mbox b/t/t5100/sample.mbox index 34a09a0fc1..8b2ae064c3 100644 --- a/t/t5100/sample.mbox +++ b/t/t5100/sample.mbox @@ -683,3 +683,19 @@ index e69de29..d95f3ad 100644 @@ -0,0 +1 @@ +content +From nobody Mon Sep 17 00:00:00 2001 +From: A U Thor <a.u.thor@example.com> +Subject: A E I O U +Date: Mon, 17 Sep 2012 14:23:44 -0700 +MIME-Version: 1.0 +Content-Type: text/plain; charset="iso-2022-jp" +Content-type: text/plain; charset="UTF-8" + +New content here + +diff --git a/foo b/foo +index e69de29..d95f3ad 100644 +--- a/foo ++++ b/foo +@@ -0,0 +1 @@ ++New content diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 2e52f8b838..a07c871797 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -416,11 +416,11 @@ test_expect_success \ test_expect_success \ 'make sure index-pack detects the SHA1 collision' \ 'test_must_fail git index-pack -o bad.idx test-3.pack 2>msg && - grep "SHA1 COLLISION FOUND" msg' + test_i18ngrep "SHA1 COLLISION FOUND" msg' test_expect_success \ 'make sure index-pack detects the SHA1 collision (large blobs)' \ 'test_must_fail git -c core.bigfilethreshold=1 index-pack -o bad.idx test-3.pack 2>msg && - grep "SHA1 COLLISION FOUND" msg' + test_i18ngrep "SHA1 COLLISION FOUND" msg' test_done diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index 0eace37a03..129fc88bd2 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -145,6 +145,40 @@ test_expect_success 'push --all excludes remote-tracking hierarchy' ' ) ' +test_expect_success 'receive-pack runs auto-gc in remote repo' ' + rm -rf parent child && + git init parent && + ( + # Setup a repo with 2 packs + cd parent && + echo "Some text" >file.txt && + git add . && + git commit -m "Initial commit" && + git repack -adl && + echo "Some more text" >>file.txt && + git commit -a -m "Second commit" && + git repack + ) && + cp -R parent child && + ( + # Set the child to auto-pack if more than one pack exists + cd child && + git config gc.autopacklimit 1 && + git branch test_auto_gc && + # And create a file that follows the temporary object naming + # convention for the auto-gc to remove + : >.git/objects/tmp_test_object && + test-chmtime =-1209601 .git/objects/tmp_test_object + ) && + ( + cd parent && + echo "Even more text" >>file.txt && + git commit -a -m "Third commit" && + git send-pack ../child HEAD:refs/heads/test_auto_gc + ) && + test ! -e child/.git/objects/tmp_test_object +' + rewound_push_setup() { rm -rf parent child && mkdir parent && diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index e80a2af348..6322e8ade8 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -391,10 +391,55 @@ test_expect_success 'fetch mixed refs from cmdline and stdin' ' test_expect_success 'test duplicate refs from stdin' ' ( cd client && - test_must_fail git fetch-pack --stdin --no-progress .. <../input.dup + git fetch-pack --stdin --no-progress .. <../input.dup ) >output && cut -d " " -f 2 <output | sort >actual && test_cmp expect actual ' +test_expect_success 'set up tests of missing reference' ' + cat >expect-error <<-\EOF + error: no such remote ref refs/heads/xyzzy + EOF +' + +test_expect_success 'test lonely missing ref' ' + ( + cd client && + test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy + ) >/dev/null 2>error-m && + test_cmp expect-error error-m +' + +test_expect_success 'test missing ref after existing' ' + ( + cd client && + test_must_fail git fetch-pack --no-progress .. refs/heads/A refs/heads/xyzzy + ) >/dev/null 2>error-em && + test_cmp expect-error error-em +' + +test_expect_success 'test missing ref before existing' ' + ( + cd client && + test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy refs/heads/A + ) >/dev/null 2>error-me && + test_cmp expect-error error-me +' + +test_expect_success 'test --all, --depth, and explicit head' ' + ( + cd client && + git fetch-pack --no-progress --all --depth=1 .. refs/heads/A + ) >out-adh 2>error-adh +' + +test_expect_success 'test --all, --depth, and explicit tag' ' + git tag OLDTAG refs/heads/B~5 && + ( + cd client && + git fetch-pack --no-progress --all --depth=1 .. refs/tags/OLDTAG + ) >out-adt 2>error-adt +' + test_done diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 35ec294d9a..69ee13c8be 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -89,7 +89,7 @@ test_expect_success 'push with !receive.fsckobjects' ' cat >exp <<EOF To dst -! refs/heads/master:refs/heads/test [remote rejected] (n/a (unpacker error)) +! refs/heads/master:refs/heads/test [remote rejected] (unpacker error) EOF test_expect_success 'push with receive.fsckobjects' ' diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index e8af615e6d..ccc55ebf4b 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -52,7 +52,7 @@ test_expect_success setup ' ' -test_expect_success 'remote information for the origin' ' +test_expect_success C_LOCALE_OUTPUT 'remote information for the origin' ' ( cd test && tokens_match origin "$(git remote)" && @@ -66,8 +66,6 @@ test_expect_success 'add another remote' ' cd test && git remote add -f second ../two && tokens_match "origin second" "$(git remote)" && - check_remote_track origin master side && - check_remote_track second master side another && check_tracking_branch second master side another && git for-each-ref "--format=%(refname)" refs/remotes | sed -e "/^refs\/remotes\/origin\//d" \ @@ -77,6 +75,14 @@ test_expect_success 'add another remote' ' ) ' +test_expect_success C_LOCALE_OUTPUT 'check remote tracking' ' +( + cd test && + check_remote_track origin master side && + check_remote_track second master side another +) +' + test_expect_success 'remote forces tracking branches' ' ( cd test && @@ -95,7 +101,7 @@ test_expect_success 'remove remote' ' ) ' -test_expect_success 'remove remote' ' +test_expect_success C_LOCALE_OUTPUT 'remove remote' ' ( cd test && tokens_match origin "$(git remote)" && @@ -125,14 +131,14 @@ EOF } && git tag footag && git config --add remote.oops.fetch "+refs/*:refs/*" && - git remote rm oops 2>actual1 && + git remote remove oops 2>actual1 && git branch foobranch && git config --add remote.oops.fetch "+refs/*:refs/*" && git remote rm oops 2>actual2 && git branch -d foobranch && git tag -d footag && - test_cmp expect1 actual1 && - test_cmp expect2 actual2 + test_i18ncmp expect1 actual1 && + test_i18ncmp expect2 actual2 ) ' @@ -192,7 +198,7 @@ test_expect_success 'show' ' git config --add remote.two.push refs/heads/master:refs/heads/another && git remote show origin two > output && git branch -d rebase octopus && - test_cmp expect output) + test_i18ncmp expect output) ' cat > test/expect << EOF @@ -217,7 +223,7 @@ test_expect_success 'show -n' ' cd test && git remote show -n origin > output && mv ../one.unreachable ../one && - test_cmp expect output) + test_i18ncmp expect output) ' test_expect_success 'prune' ' @@ -255,7 +261,7 @@ EOF test_expect_success 'set-head --auto fails w/multiple HEADs' ' (cd test && test_must_fail git remote set-head --auto two >output 2>&1 && - test_cmp expect output) + test_i18ncmp expect output) ' cat >test/expect <<EOF @@ -285,7 +291,7 @@ test_expect_success 'prune --dry-run' ' test_must_fail git rev-parse refs/remotes/origin/side && (cd ../one && git branch -m side side2) && - test_cmp expect output) + test_i18ncmp expect output) ' test_expect_success 'add --mirror && prune' ' @@ -672,7 +678,7 @@ test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' ' git clone one five && origin_url=$(pwd)/one && (cd five && - git remote rm origin && + git remote remove origin && mkdir -p .git/remotes && cat ../remotes_origin > .git/remotes/origin && git remote rename origin origin && @@ -705,7 +711,7 @@ test_expect_success 'remote prune to cause a dangling symref' ' cd seven && git remote prune origin ) >err 2>&1 && - grep "has become dangling" err && + test_i18ngrep "has become dangling" err && : And the dangling symref will not cause other annoying errors && ( diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh index 227dd56137..0f8140957f 100755 --- a/t/t5514-fetch-multiple.sh +++ b/t/t5514-fetch-multiple.sh @@ -151,4 +151,34 @@ test_expect_success 'git fetch --multiple (ignoring skipFetchAll)' ' test_cmp ../expect output) ' +test_expect_success 'git fetch --all --no-tags' ' + >expect && + git clone one test5 && + git clone test5 test6 && + (cd test5 && git tag test-tag) && + ( + cd test6 && + git fetch --all --no-tags && + git tag >output + ) && + test_cmp expect test6/output +' + +test_expect_success 'git fetch --all --tags' ' + echo test-tag >expect && + git clone one test7 && + git clone test7 test8 && + ( + cd test7 && + test_commit test-tag && + git reset --hard HEAD^ + ) && + ( + cd test8 && + git fetch --all --tags && + git tag >output + ) && + test_cmp expect test8/output +' + test_done diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh index 6b2a5f4a65..c983d3694c 100755 --- a/t/t5530-upload-pack-error.sh +++ b/t/t5530-upload-pack-error.sh @@ -35,8 +35,8 @@ test_expect_success 'upload-pack fails due to error in pack-objects packing' ' printf "0032want %s\n00000009done\n0000" \ $(git rev-parse HEAD) >input && test_must_fail git upload-pack . <input >/dev/null 2>output.err && - grep "unable to read" output.err && - grep "pack-objects died" output.err + test_i18ngrep "unable to read" output.err && + test_i18ngrep "pack-objects died" output.err ' test_expect_success 'corrupt repo differently' ' diff --git a/t/t5540-http-push.sh b/t/t5540-http-push.sh index 1eea647656..01d0d95b4d 100755 --- a/t/t5540-http-push.sh +++ b/t/t5540-http-push.sh @@ -46,15 +46,7 @@ test_expect_success 'create password-protected repository' ' "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" ' -test_expect_success 'setup askpass helper' ' - cat >askpass <<-\EOF && - #!/bin/sh - echo user@host - EOF - chmod +x askpass && - GIT_ASKPASS="$PWD/askpass" && - export GIT_ASKPASS -' +setup_askpass_helper test_expect_success 'clone remote repository' ' cd "$ROOT_PATH" && @@ -117,7 +109,7 @@ test_expect_success 'http-push fetches packed objects' ' # By reset, we force git to retrieve the packed object (cd "$ROOT_PATH"/test_repo_clone_packed && git reset --hard HEAD^ && - git remote rm origin && + git remote remove origin && git reflog expire --expire=0 --all && git prune && git push -f -v $HTTPD_URL/dumb/test_repo_packed.git master) @@ -162,6 +154,7 @@ test_http_push_nonff "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \ test_expect_success 'push to password-protected repository (user in URL)' ' test_commit pw-user && + set_askpass user@host && git push "$HTTPD_URL_USER/auth/dumb/test_repo.git" HEAD && git rev-parse --verify HEAD >expect && git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \ @@ -169,9 +162,15 @@ test_expect_success 'push to password-protected repository (user in URL)' ' test_cmp expect actual ' +test_expect_failure 'user was prompted only once for password' ' + expect_askpass pass user@host +' + test_expect_failure 'push to password-protected repository (no user in URL)' ' test_commit pw-nouser && + set_askpass user@host && git push "$HTTPD_URL/auth/dumb/test_repo.git" HEAD && + expect_askpass both user@host git rev-parse --verify HEAD >expect && git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \ rev-parse --verify HEAD >actual && diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 312e484090..4b4b4a604f 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -36,6 +36,8 @@ test_expect_success 'setup remote repository' ' mv test_repo.git "$HTTPD_DOCUMENT_ROOT_PATH" ' +setup_askpass_helper + cat >exp <<EOF GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200 POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200 @@ -64,7 +66,10 @@ test_expect_success 'no empty path components' ' test_expect_success 'clone remote repository' ' rm -rf test_repo_clone && - git clone $HTTPD_URL/smart/test_repo.git test_repo_clone + git clone $HTTPD_URL/smart/test_repo.git test_repo_clone && + ( + cd test_repo_clone && git config push.default matching + ) ' test_expect_success 'push to remote repository (standard)' ' @@ -266,5 +271,29 @@ test_expect_success 'http push respects GIT_COMMITTER_* in reflog' ' test_cmp expect actual ' +test_expect_success 'push over smart http with auth' ' + cd "$ROOT_PATH/test_repo_clone" && + echo push-auth-test >expect && + test_commit push-auth-test && + set_askpass user@host && + git push "$HTTPD_URL"/auth/smart/test_repo.git && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \ + log -1 --format=%s >actual && + expect_askpass both user@host && + test_cmp expect actual +' + +test_expect_success 'push to auth-only-for-push repo' ' + cd "$ROOT_PATH/test_repo_clone" && + echo push-half-auth >expect && + test_commit push-half-auth && + set_askpass user@host && + git push "$HTTPD_URL"/auth-push/smart/test_repo.git && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \ + log -1 --format=%s >actual && + expect_askpass both user@host && + test_cmp expect actual +' + stop_httpd test_done diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh index b06f817af3..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 && @@ -41,68 +41,34 @@ test_expect_success 'clone http repository' ' ' test_expect_success 'create password-protected repository' ' - mkdir "$HTTPD_DOCUMENT_ROOT_PATH/auth/" && + mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/" && cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ - "$HTTPD_DOCUMENT_ROOT_PATH/auth/repo.git" -' - -test_expect_success 'setup askpass helpers' ' - cat >askpass <<-EOF && - #!/bin/sh - echo >>"$PWD/askpass-query" "askpass: \$*" && - cat "$PWD/askpass-response" - EOF - chmod +x askpass && - GIT_ASKPASS="$PWD/askpass" && - export GIT_ASKPASS -' - -expect_askpass() { - dest=$HTTPD_DEST - { - case "$1" in - none) - ;; - pass) - echo "askpass: Password for 'http://$2@$dest': " - ;; - both) - echo "askpass: Username for 'http://$dest': " - echo "askpass: Password for 'http://$2@$dest': " - ;; - *) - false - ;; - esac - } >askpass-expect && - test_cmp askpass-expect askpass-query -} + "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/repo.git" +' + +setup_askpass_helper test_expect_success 'cloning password-protected repository can fail' ' - >askpass-query && - echo wrong >askpass-response && - test_must_fail git clone "$HTTPD_URL/auth/repo.git" clone-auth-fail && + set_askpass wrong && + test_must_fail git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-fail && expect_askpass both wrong ' test_expect_success 'http auth can use user/pass in URL' ' - >askpass-query && - echo wrong >askpass-response && - git clone "$HTTPD_URL_USER_PASS/auth/repo.git" clone-auth-none && + set_askpass wrong && + git clone "$HTTPD_URL_USER_PASS/auth/dumb/repo.git" clone-auth-none && expect_askpass none ' test_expect_success 'http auth can use just user in URL' ' - >askpass-query && - echo user@host >askpass-response && - git clone "$HTTPD_URL_USER/auth/repo.git" clone-auth-pass && + set_askpass user@host && + git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass && expect_askpass pass user@host ' test_expect_success 'http auth can request both user and pass' ' - >askpass-query && - echo user@host >askpass-response && - git clone "$HTTPD_URL/auth/repo.git" clone-auth-both && + set_askpass user@host && + git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both && expect_askpass both user@host ' @@ -112,25 +78,22 @@ test_expect_success 'http auth respects credential helper config' ' echo username=user@host echo password=user@host }; f" && - >askpass-query && - echo wrong >askpass-response && - git clone "$HTTPD_URL/auth/repo.git" clone-auth-helper && + set_askpass wrong && + git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-helper && expect_askpass none ' test_expect_success 'http auth can get username from config' ' test_config_global "credential.$HTTPD_URL.username" user@host && - >askpass-query && - echo user@host >askpass-response && - git clone "$HTTPD_URL/auth/repo.git" clone-auth-user && + set_askpass user@host && + git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user && expect_askpass pass user@host ' test_expect_success 'configured username does not override URL' ' test_config_global "credential.$HTTPD_URL.username" wrong && - >askpass-query && - echo user@host >askpass-response && - git clone "$HTTPD_URL_USER/auth/repo.git" clone-auth-user2 && + set_askpass user@host && + git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 && expect_askpass pass user@host ' diff --git a/t/t5551-http-fetch.sh b/t/t5551-http-fetch.sh index fadf2f258e..5060879d6d 100755 --- a/t/t5551-http-fetch.sh +++ b/t/t5551-http-fetch.sh @@ -27,16 +27,19 @@ test_expect_success 'create http-accessible bare repository' ' git push public master:master ' +setup_askpass_helper + cat >exp <<EOF > GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 > Accept: */* +> Accept-Encoding: gzip > Pragma: no-cache < HTTP/1.1 200 OK < Pragma: no-cache < Cache-Control: no-cache, max-age=0, must-revalidate < Content-Type: application/x-git-upload-pack-advertisement > POST /smart/repo.git/git-upload-pack HTTP/1.1 -> Accept-Encoding: deflate, gzip +> Accept-Encoding: gzip > Content-Type: application/x-git-upload-pack-request > Accept: application/x-git-upload-pack-result > Content-Length: xxx @@ -109,12 +112,42 @@ test_expect_success 'follow redirects (302)' ' git clone $HTTPD_URL/smart-redir-temp/repo.git --quiet repo-t ' +test_expect_success 'clone from password-protected repository' ' + echo two >expect && + set_askpass user@host && + git clone --bare "$HTTPD_URL/auth/smart/repo.git" smart-auth && + expect_askpass both user@host && + git --git-dir=smart-auth log -1 --format=%s >actual && + test_cmp expect actual +' + +test_expect_success 'clone from auth-only-for-push repository' ' + echo two >expect && + set_askpass wrong && + git clone --bare "$HTTPD_URL/auth-push/smart/repo.git" smart-noauth && + expect_askpass none && + git --git-dir=smart-noauth log -1 --format=%s >actual && + test_cmp expect actual +' + +test_expect_success 'disable dumb http on server' ' + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ + config http.getanyfile false +' + +test_expect_success 'GIT_SMART_HTTP can disable smart http' ' + (GIT_SMART_HTTP=0 && + export GIT_SMART_HTTP && + cd clone && + test_must_fail git fetch) +' + test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE test_expect_success EXPENSIVE 'create 50,000 tags in the repo' ' ( cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - for i in `seq 50000` + for i in `test_seq 50000` do echo "commit refs/heads/too-many-refs" echo "mark :$i" diff --git a/t/t5709-clone-refspec.sh b/t/t5709-clone-refspec.sh new file mode 100755 index 0000000000..6f1ea984d4 --- /dev/null +++ b/t/t5709-clone-refspec.sh @@ -0,0 +1,156 @@ +#!/bin/sh + +test_description='test refspec written by clone-command' +. ./test-lib.sh + +test_expect_success 'setup' ' + # Make two branches, "master" and "side" + echo one >file && + git add file && + git commit -m one && + echo two >file && + git commit -a -m two && + git tag two && + echo three >file && + git commit -a -m three && + git checkout -b side && + echo four >file && + git commit -a -m four && + git checkout master && + + # default clone + git clone . dir_all && + + # default --single that follows HEAD=master + git clone --single-branch . dir_master && + + # default --single that follows HEAD=side + git checkout side && + git clone --single-branch . dir_side && + + # explicit --single that follows side + git checkout master && + git clone --single-branch --branch side . dir_side2 && + + # default --single with --mirror + git clone --single-branch --mirror . dir_mirror && + + # default --single with --branch and --mirror + git clone --single-branch --mirror --branch side . dir_mirror_side && + + # --single that does not know what branch to follow + git checkout two^ && + git clone --single-branch . dir_detached && + + # explicit --single with tag + git clone --single-branch --branch two . dir_tag && + + # advance both "master" and "side" branches + git checkout side && + echo five >file && + git commit -a -m five && + git checkout master && + echo six >file && + git commit -a -m six && + + # update tag + git tag -d two && git tag two +' + +test_expect_success 'by default all branches will be kept updated' ' + ( + cd dir_all && git fetch && + git for-each-ref refs/remotes/origin | + sed -e "/HEAD$/d" \ + -e "s|/remotes/origin/|/heads/|" >../actual + ) && + # follow both master and side + git for-each-ref refs/heads >expect && + test_cmp expect actual +' + +test_expect_success 'by default no tags will be kept updated' ' + ( + cd dir_all && git fetch && + git for-each-ref refs/tags >../actual + ) && + git for-each-ref refs/tags >expect && + test_must_fail test_cmp expect actual +' + +test_expect_success '--single-branch while HEAD pointing at master' ' + ( + cd dir_master && git fetch && + git for-each-ref refs/remotes/origin | + sed -e "/HEAD$/d" \ + -e "s|/remotes/origin/|/heads/|" >../actual + ) && + # only follow master + git for-each-ref refs/heads/master >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch while HEAD pointing at side' ' + ( + cd dir_side && git fetch && + git for-each-ref refs/remotes/origin | + sed -e "/HEAD$/d" \ + -e "s|/remotes/origin/|/heads/|" >../actual + ) && + # only follow side + git for-each-ref refs/heads/side >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch with explicit --branch side' ' + ( + cd dir_side2 && git fetch && + git for-each-ref refs/remotes/origin | + sed -e "/HEAD$/d" \ + -e "s|/remotes/origin/|/heads/|" >../actual + ) && + # only follow side + git for-each-ref refs/heads/side >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' ' + ( + cd dir_tag && git fetch && + git for-each-ref refs/tags >../actual + ) && + git for-each-ref refs/tags >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch with --mirror' ' + ( + cd dir_mirror && git fetch && + git for-each-ref refs > ../actual + ) && + git for-each-ref refs >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch with explicit --branch and --mirror' ' + ( + cd dir_mirror_side && git fetch && + git for-each-ref refs > ../actual + ) && + git for-each-ref refs >expect && + test_cmp expect actual +' + +test_expect_success '--single-branch with detached' ' + ( + cd dir_detached && git fetch && + git for-each-ref refs/remotes/origin | + sed -e "/HEAD$/d" \ + -e "s|/remotes/origin/|/heads/|" >../actual + ) + # nothing + >expect && + test_cmp expect actual +' + +test_done 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/t6037-merge-ours-theirs.sh b/t/t6037-merge-ours-theirs.sh index 2cf42c73f1..3889eca4ae 100755 --- a/t/t6037-merge-ours-theirs.sh +++ b/t/t6037-merge-ours-theirs.sh @@ -53,7 +53,19 @@ test_expect_success 'recursive favouring ours' ' ! grep 1 file ' -test_expect_success 'pull with -X' ' +test_expect_success 'binary file with -Xours/-Xtheirs' ' + echo file binary >.gitattributes && + + git reset --hard master && + git merge -s recursive -X theirs side && + git diff --exit-code side HEAD -- file && + + git reset --hard master && + git merge -s recursive -X ours side && + git diff --exit-code master HEAD -- file +' + +test_expect_success 'pull passes -X to underlying merge' ' git reset --hard master && git pull -s recursive -Xours . side && git reset --hard master && git pull -s recursive -X ours . side && git reset --hard master && git pull -s recursive -Xtheirs . side && diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 172178490a..752f5cb7d0 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -456,4 +456,14 @@ test_atom refs/tags/signed-long contents "subject line body contents $sig" +cat >expected <<\EOF +408fe76d02a785a006c2e9c669b7be5589ede96d <committer@example.com> refs/tags/master +90b5ebede4899eda64893bc2a4c8f1d6fb6dfc40 <committer@example.com> refs/tags/bogo +EOF + +test_expect_success 'Verify sort with multiple keys' ' + git for-each-ref --format="%(objectname) %(taggeremail) %(refname)" --sort=objectname --sort=taggeremail \ + refs/tags/bogo refs/tags/master > actual && + test_cmp expected actual +' test_done diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh index 82f3639937..b1a63655f9 100755 --- a/t/t6500-gc.sh +++ b/t/t6500-gc.sh @@ -11,7 +11,7 @@ test_expect_success 'gc empty repository' ' test_expect_success 'gc --gobbledegook' ' test_expect_code 129 git gc --nonsense 2>err && - grep "[Uu]sage: git gc" err + test_i18ngrep "[Uu]sage: git gc" err ' test_expect_success 'gc -h with invalid configuration' ' @@ -22,7 +22,7 @@ test_expect_success 'gc -h with invalid configuration' ' echo "[gc] pruneexpire = CORRUPT" >>.git/config && test_expect_code 129 git gc -h >usage 2>&1 ) && - grep "[Uu]sage" broken/usage + test_i18ngrep "[Uu]sage" broken/usage ' test_done diff --git a/t/t7007-show.sh b/t/t7007-show.sh index a40cd3630c..e41fa00b80 100755 --- a/t/t7007-show.sh +++ b/t/t7007-show.sh @@ -108,4 +108,16 @@ test_expect_success 'showing range' ' test_cmp expect actual.filtered ' +test_expect_success '-s suppresses diff' ' + echo main3 >expect && + git show -s --format=%s main3 >actual && + test_cmp expect actual +' + +test_expect_success '--quiet suppresses diff' ' + echo main3 >expect && + git show --quiet --format=%s main3 >actual && + test_cmp expect actual +' + test_done diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index c73bec9551..5397037491 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -258,6 +258,27 @@ test_expect_success 'init should register submodule url in .git/config' ' test_cmp expect url ' +test_failure_with_unknown_submodule () { + test_must_fail git submodule $1 no-such-submodule 2>output.err && + grep "^error: .*no-such-submodule" output.err +} + +test_expect_success 'init should fail with unknown submodule' ' + test_failure_with_unknown_submodule init +' + +test_expect_success 'update should fail with unknown submodule' ' + test_failure_with_unknown_submodule update +' + +test_expect_success 'status should fail with unknown submodule' ' + test_failure_with_unknown_submodule status +' + +test_expect_success 'sync should fail with unknown submodule' ' + test_failure_with_unknown_submodule sync +' + test_expect_success 'update should fail when path is used by a file' ' echo hello >expect && @@ -417,11 +438,8 @@ test_expect_success 'moving to a commit without submodule does not leave empty d git checkout second ' -test_expect_success 'submodule <invalid-path> warns' ' - - git submodule no-such-submodule 2> output.err && - grep "^error: .*no-such-submodule" output.err - +test_expect_success 'submodule <invalid-subcommand> fails' ' + test_must_fail git submodule no-such-subcommand ' test_expect_success 'add submodules without specifying an explicit path' ' diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index ce61d4c0fa..15426530e4 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -123,6 +123,18 @@ test_expect_success 'submodule update should throw away changes with --force ' ' ) ' +test_expect_success 'submodule update --force forcibly checks out submodules' ' + (cd super && + (cd submodule && + rm -f file + ) && + git submodule update --force submodule && + (cd submodule && + test "$(git status -s file)" = "" + ) + ) +' + test_expect_success 'submodule update --rebase staying on master' ' (cd super/submodule && git checkout master @@ -367,7 +379,7 @@ test_expect_success 'submodule update continues after checkout error' ' git submodule init && git commit -am "new_submodule" && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../expect + git rev-parse --verify HEAD >../expect ) && (cd submodule && test_commit "update_submodule" file @@ -384,7 +396,7 @@ test_expect_success 'submodule update continues after checkout error' ' git checkout HEAD^ && test_must_fail git submodule update && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../actual + git rev-parse --verify HEAD >../actual ) && test_cmp expect actual ) @@ -413,7 +425,7 @@ test_expect_success 'submodule update continues after recursive checkout error' test_commit "update_submodule_again_again" file ) && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../expect && + git rev-parse --verify HEAD >../expect && test_commit "update_submodule2_again" file ) && git add submodule && @@ -428,7 +440,7 @@ test_expect_success 'submodule update continues after recursive checkout error' ) && test_must_fail git submodule update --recursive && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../actual + git rev-parse --verify HEAD >../actual ) && test_cmp expect actual ) @@ -460,12 +472,12 @@ test_expect_success 'submodule update exit immediately in case of merge conflict ) && git checkout HEAD^ && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../expect + git rev-parse --verify HEAD >../expect ) && git config submodule.submodule.update merge && test_must_fail git submodule update && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../actual + git rev-parse --verify HEAD >../actual ) && test_cmp expect actual ) @@ -495,12 +507,12 @@ test_expect_success 'submodule update exit immediately after recursive rebase er ) && git checkout HEAD^ && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../expect + git rev-parse --verify HEAD >../expect ) && git config submodule.submodule.update rebase && test_must_fail git submodule update && (cd submodule2 && - git rev-parse --max-count=1 HEAD > ../actual + git rev-parse --verify HEAD >../actual ) && test_cmp expect actual ) diff --git a/t/t7508-status.sh b/t/t7508-status.sh index c206f4777a..e313ef196e 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -80,7 +80,7 @@ test_expect_success 'status --column' ' # dir1/untracked dir2/untracked untracked # dir2/modified output EOF - test_cmp expect output + test_i18ncmp expect output ' cat >expect <<\EOF diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 9e27bbf902..5e19598fe7 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -157,7 +157,7 @@ test_expect_success 'merge -h with invalid index' ' >.git/index && test_expect_code 129 git merge -h 2>usage ) && - grep "[Uu]sage: git merge" broken/usage + test_i18ngrep "[Uu]sage: git merge" broken/usage ' test_expect_success 'reject non-strategy with a git-merge-foo name' ' diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index f5e16fc7db..bc38737b2a 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -55,6 +55,16 @@ test_expect_success 'setup' ' git rm file12 && git commit -m "branch1 changes" && + git checkout -b stash1 master && + echo stash1 change file11 >file11 && + git add file11 && + git commit -m "stash1 changes" && + + git checkout -b stash2 master && + echo stash2 change file11 >file11 && + git add file11 && + git commit -m "stash2 changes" && + git checkout master && git submodule update -N && echo master updated >file1 && @@ -193,7 +203,35 @@ test_expect_success 'mergetool skips resolved paths when rerere is active' ' git reset --hard ' +test_expect_success 'conflicted stash sets up rerere' ' + git config rerere.enabled true && + git checkout stash1 && + echo "Conflicting stash content" >file11 && + git stash && + + git checkout --detach stash2 && + test_must_fail git stash apply && + + test -n "$(git ls-files -u)" && + conflicts="$(git rerere remaining)" && + test "$conflicts" = "file11" && + output="$(git mergetool --no-prompt)" && + test "$output" != "No files need merging" && + + git commit -am "save the stash resolution" && + + git reset --hard stash2 && + test_must_fail git stash apply && + + test -n "$(git ls-files -u)" && + conflicts="$(git rerere remaining)" && + test -z "$conflicts" && + output="$(git mergetool --no-prompt)" && + test "$output" = "No files need merging" +' + test_expect_success 'mergetool takes partial path' ' + git reset --hard git config rerere.enabled false && git checkout -b test12 branch1 && git submodule update -N && @@ -471,4 +509,17 @@ test_expect_success 'file with no base' ' git reset --hard master >/dev/null 2>&1 ' +test_expect_success 'custom commands override built-ins' ' + git checkout -b test14 branch1 && + git config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" && + git config mergetool.defaults.trustExitCode true && + test_must_fail git merge master && + git mergetool --no-prompt --tool defaults -- both && + echo master both added >expected && + test_cmp both expected && + git config --unset mergetool.defaults.cmd && + git config --unset mergetool.defaults.trustExitCode && + git reset --hard master >/dev/null 2>&1 +' + test_done diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 9c3e997b9d..eb1d3f85b5 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -76,6 +76,17 @@ test_expect_success PERL 'custom commands' ' test "$diff" = "branch" ' +# Ensures that a custom difftool.<tool>.cmd overrides built-ins +test_expect_success PERL 'custom commands override built-ins' ' + restore_test_defaults && + git config difftool.defaults.cmd "cat \$REMOTE" && + + diff=$(git difftool --tool defaults --no-prompt branch) && + test "$diff" = "master" && + + git config --unset difftool.defaults.cmd +' + # Ensures that git-difftool ignores bogus --tool values test_expect_success PERL 'difftool ignores bad --tool values' ' diff=$(git difftool --no-prompt --tool=bad-tool branch) diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index 523d04123d..f698001c99 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -250,6 +250,84 @@ do git -c grep.extendedRegexp=true grep "a+b*c" ab >actual && test_cmp expected actual ' + + test_expect_success "grep $L with grep.patterntype=basic" ' + echo "ab:a+bc" >expected && + git -c grep.patterntype=basic grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success "grep $L with grep.patterntype=extended" ' + echo "ab:abc" >expected && + git -c grep.patterntype=extended grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success "grep $L with grep.patterntype=fixed" ' + echo "ab:a+b*c" >expected && + git -c grep.patterntype=fixed grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success LIBPCRE "grep $L with grep.patterntype=perl" ' + echo "ab:a+b*c" >expected && + git -c grep.patterntype=perl grep "a\x{2b}b\x{2a}c" ab >actual && + test_cmp expected actual + ' + + test_expect_success "grep $L with grep.patternType=default and grep.extendedRegexp=true" ' + echo "ab:abc" >expected && + git \ + -c grep.patternType=default \ + -c grep.extendedRegexp=true \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success "grep $L with grep.extendedRegexp=true and grep.patternType=default" ' + echo "ab:abc" >expected && + git \ + -c grep.extendedRegexp=true \ + -c grep.patternType=default \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success 'grep $L with grep.patternType=extended and grep.extendedRegexp=false' ' + echo "ab:abc" >expected && + git \ + -c grep.patternType=extended \ + -c grep.extendedRegexp=false \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success 'grep $L with grep.patternType=basic and grep.extendedRegexp=true' ' + echo "ab:a+bc" >expected && + git \ + -c grep.patternType=basic \ + -c grep.extendedRegexp=true \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success 'grep $L with grep.extendedRegexp=false and grep.patternType=extended' ' + echo "ab:abc" >expected && + git \ + -c grep.extendedRegexp=false \ + -c grep.patternType=extended \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' + + test_expect_success 'grep $L with grep.extendedRegexp=true and grep.patternType=basic' ' + echo "ab:a+bc" >expected && + git \ + -c grep.extendedRegexp=true \ + -c grep.patternType=basic \ + grep "a+b*c" ab >actual && + test_cmp expected actual + ' done cat >expected <<EOF @@ -424,31 +502,41 @@ test_expect_success 'log grep setup' ' test_expect_success 'log grep (1)' ' git log --author=author --pretty=tformat:%s >actual && - ( echo third ; echo initial ) >expect && + { + echo third && echo initial + } >expect && test_cmp expect actual ' test_expect_success 'log grep (2)' ' git log --author=" * " -F --pretty=tformat:%s >actual && - ( echo second ) >expect && + { + echo second + } >expect && test_cmp expect actual ' test_expect_success 'log grep (3)' ' git log --author="^A U" --pretty=tformat:%s >actual && - ( echo third ; echo initial ) >expect && + { + echo third && echo initial + } >expect && test_cmp expect actual ' test_expect_success 'log grep (4)' ' git log --author="frotz\.com>$" --pretty=tformat:%s >actual && - ( echo second ) >expect && + { + echo second + } >expect && test_cmp expect actual ' test_expect_success 'log grep (5)' ' git log --author=Thor -F --pretty=tformat:%s >actual && - ( echo third ; echo initial ) >expect && + { + echo third && echo initial + } >expect && test_cmp expect actual ' @@ -458,11 +546,49 @@ test_expect_success 'log grep (6)' ' test_cmp expect actual ' -test_expect_success 'log --grep --author implicitly uses all-match' ' - # grep matches initial and second but not third - # author matches only initial and third - git log --author="A U Thor" --grep=s --grep=l --format=%s >actual && - echo initial >expect && +test_expect_success 'log grep (7)' ' + git log -g --grep-reflog="commit: third" --pretty=tformat:%s >actual && + echo third >expect && + test_cmp expect actual +' + +test_expect_success 'log grep (8)' ' + git log -g --grep-reflog="commit: third" --grep-reflog="commit: second" --pretty=tformat:%s >actual && + { + echo third && echo second + } >expect && + test_cmp expect actual +' + +test_expect_success 'log grep (9)' ' + git log -g --grep-reflog="commit: third" --author="Thor" --pretty=tformat:%s >actual && + echo third >expect && + test_cmp expect actual +' + +test_expect_success 'log grep (9)' ' + git log -g --grep-reflog="commit: third" --author="non-existant" --pretty=tformat:%s >actual && + : >expect && + test_cmp expect actual +' + +test_expect_success 'log --grep-reflog can only be used under -g' ' + test_must_fail git log --grep-reflog="commit: third" +' + +test_expect_success 'log with multiple --grep uses union' ' + git log --grep=i --grep=r --format=%s >actual && + { + echo fourth && echo third && echo initial + } >expect && + test_cmp expect actual +' + +test_expect_success 'log --all-match with multiple --grep uses intersection' ' + git log --all-match --grep=i --grep=r --format=%s >actual && + { + echo third + } >expect && test_cmp expect actual ' @@ -474,7 +600,47 @@ test_expect_success 'log with multiple --author uses union' ' test_cmp expect actual ' -test_expect_success 'log with --grep and multiple --author uses all-match' ' +test_expect_success 'log --all-match with multiple --author still uses union' ' + git log --all-match --author="Thor" --author="Aster" --format=%s >actual && + { + echo third && echo second && echo initial + } >expect && + test_cmp expect actual +' + +test_expect_success 'log --grep --author uses intersection' ' + # grep matches only third and fourth + # author matches only initial and third + git log --author="A U Thor" --grep=r --format=%s >actual && + { + echo third + } >expect && + test_cmp expect actual +' + +test_expect_success 'log --grep --grep --author takes union of greps and intersects with author' ' + # grep matches initial and second but not third + # author matches only initial and third + git log --author="A U Thor" --grep=s --grep=l --format=%s >actual && + { + echo initial + } >expect && + test_cmp expect actual +' + +test_expect_success 'log ---all-match -grep --author --author still takes union of authors and intersects with grep' ' + # grep matches only initial and third + # author matches all but second + git log --all-match --author="Thor" --author="Night" --grep=i --format=%s >actual && + { + echo third && echo initial + } >expect && + test_cmp expect actual +' + +test_expect_success 'log --grep --author --author takes union of authors and intersects with grep' ' + # grep matches only initial and third + # author matches all but second git log --author="Thor" --author="Night" --grep=i --format=%s >actual && { echo third && echo initial @@ -482,9 +648,25 @@ test_expect_success 'log with --grep and multiple --author uses all-match' ' test_cmp expect actual ' -test_expect_success 'log with --grep and multiple --author uses all-match' ' - git log --author="Thor" --author="Night" --grep=q --format=%s >actual && - >expect && +test_expect_success 'log --all-match --grep --grep --author takes intersection' ' + # grep matches only third + # author matches only initial and third + git log --all-match --author="A U Thor" --grep=i --grep=r --format=%s >actual && + { + echo third + } >expect && + test_cmp expect actual +' + +test_expect_success 'log --author does not search in timestamp' ' + : >expect && + git log --author="$GIT_AUTHOR_DATE" >actual && + test_cmp expect actual +' + +test_expect_success 'log --committer does not search in timestamp' ' + : >expect && + git log --committer="$GIT_COMMITTER_DATE" >actual && test_cmp expect actual ' @@ -761,44 +943,147 @@ test_expect_success 'grep -G invalidpattern properly dies ' ' test_must_fail git grep -G "a[" ' +test_expect_success 'grep invalidpattern properly dies with grep.patternType=basic' ' + test_must_fail git -c grep.patterntype=basic grep "a[" +' + test_expect_success 'grep -E invalidpattern properly dies ' ' test_must_fail git grep -E "a[" ' +test_expect_success 'grep invalidpattern properly dies with grep.patternType=extended' ' + test_must_fail git -c grep.patterntype=extended grep "a[" +' + test_expect_success LIBPCRE 'grep -P invalidpattern properly dies ' ' test_must_fail git grep -P "a[" ' +test_expect_success LIBPCRE 'grep invalidpattern properly dies with grep.patternType=perl' ' + test_must_fail git -c grep.patterntype=perl grep "a[" +' + test_expect_success 'grep -G -E -F pattern' ' echo "ab:a+b*c" >expected && git grep -G -E -F "a+b*c" ab >actual && test_cmp expected actual ' +test_expect_success 'grep pattern with grep.patternType=basic, =extended, =fixed' ' + echo "ab:a+b*c" >expected && + git \ + -c grep.patterntype=basic \ + -c grep.patterntype=extended \ + -c grep.patterntype=fixed \ + grep "a+b*c" ab >actual && + test_cmp expected actual +' + test_expect_success 'grep -E -F -G pattern' ' echo "ab:a+bc" >expected && git grep -E -F -G "a+b*c" ab >actual && test_cmp expected actual ' +test_expect_success 'grep pattern with grep.patternType=extended, =fixed, =basic' ' + echo "ab:a+bc" >expected && + git \ + -c grep.patterntype=extended \ + -c grep.patterntype=fixed \ + -c grep.patterntype=basic \ + grep "a+b*c" ab >actual && + test_cmp expected actual +' + test_expect_success 'grep -F -G -E pattern' ' echo "ab:abc" >expected && git grep -F -G -E "a+b*c" ab >actual && test_cmp expected actual ' +test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =extended' ' + echo "ab:abc" >expected && + git \ + -c grep.patterntype=fixed \ + -c grep.patterntype=basic \ + -c grep.patterntype=extended \ + grep "a+b*c" ab >actual && + test_cmp expected actual +' + test_expect_success 'grep -G -F -P -E pattern' ' >empty && test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual && test_cmp empty actual ' +test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =perl, =extended' ' + >empty && + test_must_fail git \ + -c grep.patterntype=fixed \ + -c grep.patterntype=basic \ + -c grep.patterntype=perl \ + -c grep.patterntype=extended \ + grep "a\x{2b}b\x{2a}c" ab >actual && + test_cmp empty actual +' + test_expect_success LIBPCRE 'grep -G -F -E -P pattern' ' echo "ab:a+b*c" >expected && git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual && test_cmp expected actual ' +test_expect_success LIBPCRE 'grep pattern with grep.patternType=fixed, =basic, =extended, =perl' ' + echo "ab:a+b*c" >expected && + git \ + -c grep.patterntype=fixed \ + -c grep.patterntype=basic \ + -c grep.patterntype=extended \ + -c grep.patterntype=perl \ + grep "a\x{2b}b\x{2a}c" ab >actual && + test_cmp expected actual +' + +test_expect_success LIBPCRE 'grep -P pattern with grep.patternType=fixed' ' + echo "ab:a+b*c" >expected && + git \ + -c grep.patterntype=fixed \ + grep -P "a\x{2b}b\x{2a}c" ab >actual && + test_cmp expected actual +' + +test_expect_success 'grep -F pattern with grep.patternType=basic' ' + echo "ab:a+b*c" >expected && + git \ + -c grep.patterntype=basic \ + grep -F "*c" ab >actual && + test_cmp expected actual +' + +test_expect_success 'grep -G pattern with grep.patternType=fixed' ' + { + echo "ab:a+b*c" + echo "ab:a+bc" + } >expected && + git \ + -c grep.patterntype=fixed \ + grep -G "a+b" ab >actual && + test_cmp expected actual +' + +test_expect_success 'grep -E pattern with grep.patternType=fixed' ' + { + echo "ab:a+b*c" + echo "ab:a+bc" + echo "ab:abc" + } >expected && + git \ + -c grep.patterntype=fixed \ + grep -E "a+" ab >actual && + test_cmp expected actual +' + test_config() { git config "$1" "$2" && test_when_finished "git config --unset $1" diff --git a/t/t8004-blame-with-conflicts.sh b/t/t8004-blame-with-conflicts.sh index ba19ac127e..9c353ab222 100755 --- a/t/t8004-blame-with-conflicts.sh +++ b/t/t8004-blame-with-conflicts.sh @@ -66,7 +66,7 @@ test_expect_success \ git blame file2 ' -test_expect_success 'blame runs on conflicted file in stages 1,3' ' +test_expect_success 'blame does not crash with conflicted file in stages 1,3' ' git blame file1 ' diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 8c12c65c72..035122808b 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -841,6 +841,19 @@ test_expect_success $PREREQ '--compose adds MIME for utf8 subject' ' grep "^Subject: =?UTF-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1 ' +test_expect_success $PREREQ 'utf8 author is correctly passed on' ' + clean_fake_sendmail && + test_commit weird_author && + test_when_finished "git reset --hard HEAD^" && + git commit --amend --author "Füñný Nâmé <odd_?=mail@example.com>" && + git format-patch --stdout -1 >funny_name.patch && + git send-email --from="Example <nobody@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + funny_name.patch && + grep "^From: Füñný Nâmé <odd_?=mail@example.com>" msgtxt1 +' + test_expect_success $PREREQ 'detects ambiguous reference/file conflict' ' echo master > master && git add master && diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh index 289fc313fb..ee73013eed 100755 --- a/t/t9107-git-svn-migrate.sh +++ b/t/t9107-git-svn-migrate.sh @@ -27,15 +27,17 @@ test_expect_success 'setup old-looking metadata' ' head=`git rev-parse --verify refs/heads/git-svn-HEAD^0` test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'" +svnrepo_escaped=`echo $svnrepo | sed 's/ /%20/'` + test_expect_success 'initialize old-style (v0) git svn layout' ' mkdir -p "$GIT_DIR"/git-svn/info "$GIT_DIR"/svn/info && echo "$svnrepo" > "$GIT_DIR"/git-svn/info/url && echo "$svnrepo" > "$GIT_DIR"/svn/info/url && git svn migrate && - ! test -d "$GIT_DIR"/git svn && + ! test -d "$GIT_DIR"/git-svn && git rev-parse --verify refs/${remotes_git_svn}^0 && git rev-parse --verify refs/remotes/svn^0 && - test "$(git config --get svn-remote.svn.url)" = "$svnrepo" && + test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" && test `git config --get svn-remote.svn.fetch` = \ ":refs/${remotes_git_svn}" ' diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh index 63fc982c8c..15f93b4c28 100755 --- a/t/t9118-git-svn-funky-branch-names.sh +++ b/t/t9118-git-svn-funky-branch-names.sh @@ -28,10 +28,15 @@ 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 ' +# SVN 1.7 will truncate "not-a%40{0]" to just "not-a". +# Look at what SVN wound up naming the branch and use that. +# Be sure to escape the @ if it shows up. +non_reflog=`svn_cmd ls "$svnrepo/pr ject/branches" | grep not-a | sed 's/\///' | sed 's/@/%40/'` + test_expect_success 'test clone with funky branch names' ' git svn clone -s "$svnrepo/pr ject" project && ( @@ -42,7 +47,7 @@ test_expect_success 'test clone with funky branch names' ' git rev-parse "refs/remotes/%2Eleading_dot" && git rev-parse "refs/remotes/trailing_dot%2E" && git rev-parse "refs/remotes/trailing_dotlock%2Elock" && - git rev-parse "refs/remotes/not-a%40{0}reflog" + git rev-parse "refs/remotes/$non_reflog" ) ' diff --git a/t/t9154-git-svn-fancy-glob.sh b/t/t9154-git-svn-fancy-glob.sh index a6a56a6cb9..b780e0efe3 100755 --- a/t/t9154-git-svn-fancy-glob.sh +++ b/t/t9154-git-svn-fancy-glob.sh @@ -21,6 +21,15 @@ test_expect_success 'add red branch' " test_must_fail git rev-parse refs/remotes/blue " +test_expect_success 'add gre branch' " + GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev && + git config svn-remote.svn.branches 'branches/{red,gre}:refs/remotes/*' && + git svn fetch && + git rev-parse refs/remotes/red && + test_must_fail git rev-parse refs/remotes/green && + test_must_fail git rev-parse refs/remotes/blue + " + test_expect_success 'add green branch' " GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev && git config svn-remote.svn.branches 'branches/{red,green}:refs/remotes/*' && diff --git a/t/t9164-git-svn-dcommit-concrrent.sh b/t/t9164-git-svn-dcommit-concurrent.sh index aac2ddadf2..d8464d4218 100755 --- a/t/t9164-git-svn-dcommit-concrrent.sh +++ b/t/t9164-git-svn-dcommit-concurrent.sh @@ -60,11 +60,11 @@ setup_hook() [ "$cnt" = "0" ] || exit 0 EOF1 if [ "$hook_type" = "pre-commit" ]; then - echo "echo 'commit disallowed' >&2; exit 1" >> "$hook" + echo "echo 'commit disallowed' >&2; exit 1" >>"$hook" else - echo "PATH=\"$PATH\"; export PATH" >> $hook - echo "svnconf=\"$svnconf\"" >> $hook - cat >> "$hook" <<- 'EOF2' + echo "PATH=\"$PATH\"; export PATH" >>"$hook" + echo "svnconf=\"$svnconf\"" >>"$hook" + cat >>"$hook" <<- 'EOF2' cd work-auto-commits.svn svn up --config-dir "$svnconf" echo "$$" >> auto_updated_file diff --git a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh new file mode 100755 index 0000000000..13ae7e33f9 --- /dev/null +++ b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Copyright (c) 2012 Steven Walter +# + +test_description='git svn merge detection' +. ./lib-git-svn.sh + +svn_ver="$(svn --version --quiet)" +case $svn_ver in +0.* | 1.[0-4].*) + skip_all="skipping git-svn test - SVN too old ($svn_ver)" + test_done + ;; +esac + +test_expect_success 'initialize source svn repo' ' + svn_cmd mkdir -m x "$svnrepo"/trunk && + svn_cmd mkdir -m x "$svnrepo"/branches && + svn_cmd co "$svnrepo"/trunk "$SVN_TREE" && + ( + cd "$SVN_TREE" && + touch foo && + svn_cmd add foo && + svn_cmd commit -m "initial commit" && + svn_cmd cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch1 && + svn_cmd switch "$svnrepo"/branches/branch1 && + touch bar && + svn_cmd add bar && + svn_cmd commit -m branch1 && + svn_cmd cp -m branch "$svnrepo"/branches/branch1 "$svnrepo"/branches/branch2 && + svn_cmd switch "$svnrepo"/branches/branch2 && + touch baz && + svn_cmd add baz && + svn_cmd commit -m branch2 && + svn_cmd switch "$svnrepo"/trunk && + touch bar2 && + svn_cmd add bar2 && + svn_cmd commit -m trunk && + svn_cmd switch "$svnrepo"/branches/branch2 && + svn_cmd merge "$svnrepo"/trunk && + svn_cmd commit -m "merge trunk" + svn_cmd switch "$svnrepo"/trunk && + svn_cmd merge --reintegrate "$svnrepo"/branches/branch2 && + svn_cmd commit -m "merge branch2" + ) && + rm -rf "$SVN_TREE" +' + +test_expect_success 'clone svn repo' ' + git svn init -s "$svnrepo" && + git svn fetch +' + +test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) && + y=$(git rev-parse branch2) && + test "x$x" = "x$y" +' + +test_done diff --git a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh new file mode 100755 index 0000000000..af0ec0e2e3 --- /dev/null +++ b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# +# Copyright (c) 2012 Steven Walter +# + +test_description='git svn merge detection' +. ./lib-git-svn.sh + +svn_ver="$(svn --version --quiet)" +case $svn_ver in +0.* | 1.[0-4].*) + skip_all="skipping git-svn test - SVN too old ($svn_ver)" + test_done + ;; +esac + +test_expect_success 'initialize source svn repo' ' + svn_cmd mkdir -m x "$svnrepo"/trunk && + svn_cmd mkdir -m x "$svnrepo"/branches && + svn_cmd co "$svnrepo"/trunk "$SVN_TREE" && + ( + cd "$SVN_TREE" && + touch foo && + svn_cmd add foo && + svn_cmd commit -m "initial commit" && + svn_cmd cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch1 && + svn_cmd switch "$svnrepo"/branches/branch1 && + touch bar && + svn_cmd add bar && + svn_cmd commit -m branch1 && + svn_cmd cp -m branch "$svnrepo"/branches/branch1 "$svnrepo"/branches/branch2 && + svn_cmd switch "$svnrepo"/branches/branch2 && + touch baz && + svn_cmd add baz && + svn_cmd commit -m branch2 && + svn_cmd switch "$svnrepo"/trunk && + svn_cmd merge --reintegrate "$svnrepo"/branches/branch2 && + svn_cmd commit -m "merge branch2" + ) && + rm -rf "$SVN_TREE" +' + +test_expect_success 'clone svn repo' ' + git svn init -s "$svnrepo" && + git svn fetch +' + +test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) && + y=$(git rev-parse branch2) && + test "x$x" = "x$y" +' + +test_done diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh index 99fe16b72d..9730821c30 100755 --- a/t/t9801-git-p4-branch.sh +++ b/t/t9801-git-p4-branch.sh @@ -410,6 +410,83 @@ test_expect_failure 'git p4 clone file subset branch' ' test_path_is_missing file3 ) ' + +# From a report in http://stackoverflow.com/questions/11893688 +# where --use-client-spec caused branch prefixes not to be removed; +# every file in git appeared into a subdirectory of the branch name. +test_expect_success 'use-client-spec detect-branches setup' ' + rm -rf "$cli" && + mkdir "$cli" && + ( + cd "$cli" && + client_view "//depot/usecs/... //client/..." && + mkdir b1 && + echo b1/b1-file1 >b1/b1-file1 && + p4 add b1/b1-file1 && + p4 submit -d "b1/b1-file1" && + + p4 integrate //depot/usecs/b1/... //depot/usecs/b2/... && + p4 submit -d "b1 -> b2" && + p4 branch -i <<-EOF && + Branch: b2 + View: //depot/usecs/b1/... //depot/usecs/b2/... + EOF + + echo b2/b2-file2 >b2/b2-file2 && + p4 add b2/b2-file2 && + p4 submit -d "b2/b2-file2" + ) +' + +test_expect_success 'use-client-spec detect-branches files in top-level' ' + test_when_finished cleanup_git && + test_create_repo "$git" && + ( + cd "$git" && + git p4 sync --detect-branches --use-client-spec //depot/usecs@all && + git checkout -b master p4/usecs/b1 && + test_path_is_file b1-file1 && + test_path_is_missing b2-file2 && + test_path_is_missing b1 && + test_path_is_missing b2 && + + git checkout -b b2 p4/usecs/b2 && + test_path_is_file b1-file1 && + test_path_is_file b2-file2 && + test_path_is_missing b1 && + test_path_is_missing b2 + ) +' + +test_expect_success 'use-client-spec detect-branches skips branches setup' ' + ( + cd "$cli" && + + p4 integrate //depot/usecs/b1/... //depot/usecs/b3/... && + p4 submit -d "b1 -> b3" && + p4 branch -i <<-EOF && + Branch: b3 + View: //depot/usecs/b1/... //depot/usecs/b3/... + EOF + + echo b3/b3-file3 >b3/b3-file3 && + p4 add b3/b3-file3 && + p4 submit -d "b3/b3-file3" + ) +' + +test_expect_success 'use-client-spec detect-branches skips branches' ' + client_view "//depot/usecs/... //client/..." \ + "-//depot/usecs/b3/... //client/b3/..." && + test_when_finished cleanup_git && + test_create_repo "$git" && + ( + cd "$git" && + git p4 sync --detect-branches --use-client-spec //depot/usecs@all && + test_must_fail git rev-parse refs/remotes/p4/usecs/b3 + ) +' + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9805-git-p4-skip-submit-edit.sh b/t/t9805-git-p4-skip-submit-edit.sh index fb3c8ec12c..ff2cc79701 100755 --- a/t/t9805-git-p4-skip-submit-edit.sh +++ b/t/t9805-git-p4-skip-submit-edit.sh @@ -38,7 +38,7 @@ test_expect_success 'no config, unedited, say no' ' cd "$git" && echo line >>file1 && git commit -a -m "change 3 (not really)" && - printf "bad response\nn\n" | git p4 submit && + printf "bad response\nn\n" | test_expect_code 1 git p4 submit && p4 changes //depot/... >wc && test_line_count = 2 wc ) diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index 9394fd4e9b..0ae048f29f 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -54,6 +54,47 @@ test_expect_success 'submit --origin' ' ) ' +test_expect_success 'submit --dry-run' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + test_commit "dry-run1" && + test_commit "dry-run2" && + git p4 submit --dry-run >out && + test_i18ngrep "Would apply" out + ) && + ( + cd "$cli" && + test_path_is_missing "dry-run1.t" && + test_path_is_missing "dry-run2.t" + ) +' + +test_expect_success 'submit --dry-run --export-labels' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo dry-run1 >dry-run1 && + git add dry-run1 && + git commit -m "dry-run1" dry-run1 && + git config git-p4.skipSubmitEdit true && + git p4 submit && + echo dry-run2 >dry-run2 && + git add dry-run2 && + git commit -m "dry-run2" dry-run2 && + git tag -m "dry-run-tag1" dry-run-tag1 HEAD^ && + git p4 submit --dry-run --export-labels >out && + test_i18ngrep "Would create p4 label" out + ) && + ( + cd "$cli" && + test_path_is_file "dry-run1" && + test_path_is_missing "dry-run2" + ) +' + test_expect_success 'submit with allowSubmit' ' test_when_finished cleanup_git && git p4 clone --dest="$git" //depot && @@ -334,6 +375,30 @@ test_expect_success 'description with Jobs section and bogus following text' ' make_job $(cat jobname) && test_must_fail git p4 submit 2>err && test_i18ngrep "Unknown field name" err + ) && + ( + cd "$cli" && + p4 revert desc6 && + rm desc6 + ) +' + +test_expect_success 'submit --prepare-p4-only' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo prep-only-add >prep-only-add && + git add prep-only-add && + git commit -m "prep only add" && + git p4 submit --prepare-p4-only >out && + test_i18ngrep "prepared for submission" out && + test_i18ngrep "must be deleted" out + ) && + ( + cd "$cli" && + test_path_is_file prep-only-add && + p4 fstat -T action prep-only-add | grep -w add ) ' diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh index 7d993ef80a..281be29174 100755 --- a/t/t9809-git-p4-client-view.sh +++ b/t/t9809-git-p4-client-view.sh @@ -9,23 +9,6 @@ test_expect_success 'start p4d' ' ' # -# Construct a client with this list of View lines -# -client_view() { - ( - cat <<-EOF && - Client: client - Description: client - Root: $cli - View: - EOF - for arg ; do - printf "\t$arg\n" - done - ) | p4 client -i -} - -# # Verify these files exist, exactly. Caller creates # a list of files in file "files". # diff --git a/t/t9810-git-p4-rcs.sh b/t/t9810-git-p4-rcs.sh index e9daa9c4f6..fe30ad881f 100755 --- a/t/t9810-git-p4-rcs.sh +++ b/t/t9810-git-p4-rcs.sh @@ -160,9 +160,6 @@ test_expect_success 'cleanup after failure' ' # the cli file so that submit will get a conflict. Make sure that # scrubbing doesn't make a mess of things. # -# Assumes that git-p4 exits leaving the p4 file open, with the -# conflict-generating patch unapplied. -# # This might happen only if the git repo is behind the p4 repo at # submit time, and there is a conflict. # @@ -181,14 +178,11 @@ test_expect_success 'do not scrub plain text' ' sed -i "s/^line5/line5 p4 edit/" file_text && p4 submit -d "file5 p4 edit" ) && - ! git p4 submit && + echo s | test_expect_code 1 git p4 submit && ( - # exepct something like: - # file_text - file(s) not opened on this client - # but not copious diff output + # make sure the file is not left open cd "$cli" && - p4 diff file_text >wc && - test_line_count = 1 wc + ! p4 fstat -T action file_text ) ) ' @@ -343,44 +337,6 @@ test_expect_failure 'Add keywords in git which do not match the default p4 value ) ' -# Check that the existing merge conflict handling still works. -# Modify kwfile1.c in git, and delete in p4. We should be able -# to skip the git commit. -# -test_expect_success 'merge conflict handling still works' ' - test_when_finished cleanup_git && - ( - cd "$cli" && - echo "Hello:\$Id\$" >merge2.c && - echo "World" >>merge2.c && - p4 add -t ktext merge2.c && - p4 submit -d "add merge test file" - ) && - git p4 clone --dest="$git" //depot && - ( - cd "$git" && - sed -e "/Hello/d" merge2.c >merge2.c.tmp && - mv merge2.c.tmp merge2.c && - git add merge2.c && - git commit -m "Modifying merge2.c" - ) && - ( - cd "$cli" && - p4 delete merge2.c && - p4 submit -d "remove merge test file" - ) && - ( - cd "$git" && - test -f merge2.c && - git config git-p4.skipSubmitEdit true && - git config git-p4.attemptRCSCleanup true && - !(echo "s" | git p4 submit) && - git rebase --skip && - ! test -f merge2.c - ) -' - - test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh new file mode 100755 index 0000000000..d2b7b3d98d --- /dev/null +++ b/t/t9815-git-p4-submit-fail.sh @@ -0,0 +1,429 @@ +#!/bin/sh + +test_description='git p4 submit failure handling' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +test_expect_success 'init depot' ' + ( + cd "$cli" && + p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i && + echo line1 >file1 && + p4 add file1 && + p4 submit -d "line1 in file1" + ) +' + +test_expect_success 'conflict on one commit' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line2 >>file1 && + p4 submit -d "line2 in file1" + ) && + ( + # now this commit should cause a conflict + cd "$git" && + git config git-p4.skipSubmitEdit true && + echo line3 >>file1 && + git add file1 && + git commit -m "line3 in file1 will conflict" && + test_expect_code 1 git p4 submit >out && + test_i18ngrep "No commits applied" out + ) +' + +test_expect_success 'conflict on second of two commits' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line3 >>file1 && + p4 submit -d "line3 in file1" + ) && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # this commit is okay + test_commit "first_commit_okay" && + # now this submit should cause a conflict + echo line4 >>file1 && + git add file1 && + git commit -m "line4 in file1 will conflict" && + test_expect_code 1 git p4 submit >out && + test_i18ngrep "Applied only the commits" out + ) +' + +test_expect_success 'conflict on first of two commits, skip' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line4 >>file1 && + p4 submit -d "line4 in file1" + ) && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # this submit should cause a conflict + echo line5 >>file1 && + git add file1 && + git commit -m "line5 in file1 will conflict" && + # but this commit is okay + test_commit "okay_commit_after_skip" && + echo s | test_expect_code 1 git p4 submit >out && + test_i18ngrep "Applied only the commits" out + ) +' + +test_expect_success 'conflict on first of two commits, quit' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line7 >>file1 && + p4 submit -d "line7 in file1" + ) && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # this submit should cause a conflict + echo line8 >>file1 && + git add file1 && + git commit -m "line8 in file1 will conflict" && + # but this commit is okay + test_commit "okay_commit_after_quit" && + echo q | test_expect_code 1 git p4 submit >out && + test_i18ngrep "No commits applied" out + ) +' + +test_expect_success 'conflict cli and config options' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git p4 submit --conflict=ask && + git p4 submit --conflict=skip && + git p4 submit --conflict=quit && + test_expect_code 2 git p4 submit --conflict=foo && + test_expect_code 2 git p4 submit --conflict && + git config git-p4.conflict foo && + test_expect_code 1 git p4 submit && + git config --unset git-p4.conflict && + git p4 submit + ) +' + +test_expect_success 'conflict on first of two commits, --conflict=skip' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line9 >>file1 && + p4 submit -d "line9 in file1" + ) && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # this submit should cause a conflict + echo line10 >>file1 && + git add file1 && + git commit -m "line10 in file1 will conflict" && + # but this commit is okay + test_commit "okay_commit_after_auto_skip" && + test_expect_code 1 git p4 submit --conflict=skip >out && + test_i18ngrep "Applied only the commits" out + ) +' + +test_expect_success 'conflict on first of two commits, --conflict=quit' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$cli" && + p4 open file1 && + echo line11 >>file1 && + p4 submit -d "line11 in file1" + ) && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # this submit should cause a conflict + echo line12 >>file1 && + git add file1 && + git commit -m "line12 in file1 will conflict" && + # but this commit is okay + test_commit "okay_commit_after_auto_quit" && + test_expect_code 1 git p4 submit --conflict=quit >out && + test_i18ngrep "No commits applied" out + ) +' + +# +# Cleanup after submit fail, all cases. Some modifications happen +# before trying to apply the patch. Make sure these are unwound +# properly. Put each one in a diff along with something that will +# obviously conflict. Make sure it is back to normal after. +# + +test_expect_success 'cleanup edit p4 populate' ' + ( + cd "$cli" && + echo text file >text && + p4 add text && + echo text+x file >text+x && + chmod 755 text+x && + p4 add text+x && + p4 submit -d "populate p4" + ) +' + +setup_conflict() { + # clone before modifying file1 to force it to conflict + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + # ticks outside subshells + test_tick && + ( + cd "$cli" && + p4 open file1 && + echo $test_tick >>file1 && + p4 submit -d "$test_tick in file1" + ) && + test_tick && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + # easy conflict + echo $test_tick >>file1 && + git add file1 + # caller will add more and submit + ) +} + +test_expect_success 'cleanup edit after submit fail' ' + setup_conflict && + ( + cd "$git" && + echo another line >>text && + git add text && + git commit -m "conflict" && + test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + # make sure it is not open + ! p4 fstat -T action text + ) +' + +test_expect_success 'cleanup add after submit fail' ' + setup_conflict && + ( + cd "$git" && + echo new file >textnew && + git add textnew && + git commit -m "conflict" && + test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + # make sure it is not there + # and that p4 thinks it is not added + # P4 returns 0 both for "not there but added" and + # "not there", so grep. + test_path_is_missing textnew && + p4 fstat -T action textnew 2>&1 | grep "no such file" + ) +' + +test_expect_success 'cleanup delete after submit fail' ' + setup_conflict && + ( + cd "$git" && + git rm text+x && + git commit -m "conflict" && + test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + # make sure it is there + test_path_is_file text+x && + ! p4 fstat -T action text+x + ) +' + +test_expect_success 'cleanup copy after submit fail' ' + setup_conflict && + ( + cd "$git" && + cp text text2 && + git add text2 && + git commit -m "conflict" && + git config git-p4.detectCopies true && + git config git-p4.detectCopiesHarder true && + # make sure setup is okay + git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 && + test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing text2 && + p4 fstat -T action text2 2>&1 | grep "no such file" + ) +' + +test_expect_success 'cleanup rename after submit fail' ' + setup_conflict && + ( + cd "$git" && + git mv text text2 && + git commit -m "conflict" && + git config git-p4.detectRenames true && + # make sure setup is okay + git diff-tree -r -M HEAD | grep text2 | grep R100 && + test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing text2 && + p4 fstat -T action text2 2>&1 | grep "no such file" + ) +' + +# +# Cleanup after deciding not to submit during editTemplate. This +# involves unwinding more work, because files have been added, deleted +# and chmod-ed now. Same approach as above. +# + +test_expect_success 'cleanup edit after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line >>text && + git add text && + git commit -m text && + echo n | test_expect_code 1 git p4 submit && + git reset --hard HEAD^ + ) && + ( + cd "$cli" && + ! p4 fstat -T action text && + test_cmp "$git"/text text + ) +' + +test_expect_success 'cleanup add after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line >textnew && + git add textnew && + git commit -m textnew && + echo n | test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing textnew && + p4 fstat -T action textnew 2>&1 | grep "no such file" + ) +' + +test_expect_success 'cleanup delete after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git rm text && + git commit -m "rm text" && + echo n | test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file text && + ! p4 fstat -T action text + ) +' + +test_expect_success 'cleanup copy after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + cp text text2 && + git add text2 && + git commit -m text2 && + git config git-p4.detectCopies true && + git config git-p4.detectCopiesHarder true && + git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 && + echo n | test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing text2 && + p4 fstat -T action text2 2>&1 | grep "no such file" + ) +' + +test_expect_success 'cleanup rename after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git mv text text2 && + git commit -m text2 && + git config git-p4.detectRenames true && + git diff-tree -r -M HEAD | grep text2 | grep R100 && + echo n | test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing text2 && + p4 fstat -T action text2 2>&1 | grep "no such file" + test_path_is_file text && + ! p4 fstat -T action text + ) +' + +test_expect_success 'cleanup chmod after submit cancel' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + chmod u+x text && + chmod u-x text+x && + git add text text+x && + git commit -m "chmod texts" && + echo n | test_expect_code 1 git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file text && + ! p4 fstat -T action text && + stat --format=%A text | egrep ^-r-- && + test_path_is_file text+x && + ! p4 fstat -T action text+x && + stat --format=%A text+x | egrep ^-r-x + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 92d7eb47c2..cbd0fb66f9 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -61,6 +61,15 @@ test_completion () test_cmp expected out } +# Like test_completion, but reads expectation from stdin, +# which is convenient when it is multiline. We also process "_" into +# spaces to make test vectors more readable. +test_completion_long () +{ + tr _ " " >expected && + test_completion "$1" +} + newline=$'\n' test_expect_success '__gitcomp - trailing space - options' ' @@ -228,4 +237,55 @@ test_expect_success 'general options plus command' ' test_completion "git --no-replace-objects check" "checkout " ' +test_expect_success 'setup for ref completion' ' + echo content >file1 && + echo more >file2 && + git add . && + git commit -m one && + git branch mybranch && + git tag mytag +' + +test_expect_success 'checkout completes ref names' ' + test_completion_long "git checkout m" <<-\EOF + master_ + mybranch_ + mytag_ + EOF +' + +test_expect_success 'show completes all refs' ' + test_completion_long "git show m" <<-\EOF + master_ + mybranch_ + mytag_ + EOF +' + +test_expect_success '<ref>: completes paths' ' + test_completion_long "git show mytag:f" <<-\EOF + file1_ + file2_ + EOF +' + +test_expect_success 'complete tree filename with spaces' ' + echo content >"name with spaces" && + git add . && + git commit -m spaces && + test_completion_long "git show HEAD:nam" <<-\EOF + name with spaces_ + EOF +' + +test_expect_failure 'complete tree filename with metacharacters' ' + echo content >"name with \${meta}" && + git add . && + git commit -m meta && + test_completion_long "git show HEAD:nam" <<-\EOF + name with ${meta}_ + name with spaces_ + EOF +' + test_done diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 80daaca780..8889ba5104 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -144,11 +144,22 @@ test_pause () { test_commit () { notick= && - if test "z$1" = "z--notick" - then - notick=yes + signoff= && + while test $# != 0 + do + case "$1" in + --notick) + notick=yes + ;; + --signoff) + signoff="$1" + ;; + *) + break + ;; + esac shift - fi && + done && file=${2:-"$1.t"} && echo "${3-$1}" > "$file" && git add "$file" && @@ -156,7 +167,7 @@ test_commit () { then test_tick fi && - git commit -m "$1" && + git commit $signoff -m "$1" && git tag "$1" } @@ -221,9 +232,35 @@ write_script () { # capital letters by convention). test_set_prereq () { - satisfied="$satisfied$1 " + satisfied_prereq="$satisfied_prereq$1 " +} +satisfied_prereq=" " +lazily_testable_prereq= lazily_tested_prereq= + +# Usage: test_lazy_prereq PREREQ 'script' +test_lazy_prereq () { + lazily_testable_prereq="$lazily_testable_prereq$1 " + eval test_prereq_lazily_$1=\$2 +} + +test_run_lazy_prereq_ () { + script=' +mkdir -p "$TRASH_DIRECTORY/prereq-test-dir" && +( + cd "$TRASH_DIRECTORY/prereq-test-dir" &&'"$2"' +)' + say >&3 "checking prerequisite: $1" + say >&3 "$script" + test_eval_ "$script" + eval_ret=$? + rm -rf "$TRASH_DIRECTORY/prereq-test-dir" + if test "$eval_ret" = 0; then + say >&3 "prerequisite $1 ok" + else + say >&3 "prerequisite $1 not satisfied" + fi + return $eval_ret } -satisfied=" " test_have_prereq () { # prerequisites can be concatenated with ',' @@ -238,8 +275,24 @@ test_have_prereq () { for prerequisite do + case " $lazily_tested_prereq " in + *" $prerequisite "*) + ;; + *) + case " $lazily_testable_prereq " in + *" $prerequisite "*) + eval "script=\$test_prereq_lazily_$prerequisite" && + if test_run_lazy_prereq_ "$prerequisite" "$script" + then + test_set_prereq $prerequisite + fi + lazily_tested_prereq="$lazily_tested_prereq$prerequisite " + esac + ;; + esac + total_prereq=$(($total_prereq + 1)) - case $satisfied in + case "$satisfied_prereq" in *" $prerequisite "*) ok_prereq=$(($ok_prereq + 1)) ;; @@ -530,6 +583,27 @@ test_cmp() { $GIT_TEST_CMP "$@" } +# Print a sequence of numbers or letters in increasing order. This is +# similar to GNU seq(1), but the latter might not be available +# everywhere (and does not do letters). It may be used like: +# +# for i in `test_seq 100`; do +# for j in `test_seq 10 20`; do +# for k in `test_seq a z`; do +# echo $i-$j-$k +# done +# done +# done + +test_seq () { + case $# in + 1) set 1 "$@" ;; + 2) ;; + *) error "bug in the test script: not 1 or 2 parameters to test_seq" ;; + esac + "$PERL_PATH" -le 'print for $ARGV[0]..$ARGV[1]' -- "$@" +} + # This function can be used to schedule some commands to be run # unconditionally at the end of the test to restore sanity: # diff --git a/t/test-lib.sh b/t/test-lib.sh index bb4f8865b2..514282cbdf 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -15,22 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/ . -# if --tee was passed, write the output not only to the terminal, but -# additionally to the file test-results/$BASENAME.out, too. -case "$GIT_TEST_TEE_STARTED, $* " in -done,*) - # do not redirect again - ;; -*' --tee '*|*' --va'*) - mkdir -p test-results - BASE=test-results/$(basename "$0" .sh) - (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1; - echo $? > $BASE.exit) | tee $BASE.out - test "$(cat $BASE.exit)" = 0 - exit - ;; -esac - # Keep the original TERM for say_color ORIGINAL_TERM=$TERM @@ -51,9 +35,34 @@ then fi GIT_BUILD_DIR="$TEST_DIRECTORY"/.. +################################################################ +# It appears that people try to run tests without building... +"$GIT_BUILD_DIR/git" >/dev/null +if test $? != 1 +then + echo >&2 'error: you do not seem to have built git yet.' + exit 1 +fi + . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS export PERL_PATH SHELL_PATH +# if --tee was passed, write the output not only to the terminal, but +# additionally to the file test-results/$BASENAME.out, too. +case "$GIT_TEST_TEE_STARTED, $* " in +done,*) + # do not redirect again + ;; +*' --tee '*|*' --va'*) + mkdir -p test-results + BASE=test-results/$(basename "$0" .sh) + (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1; + echo $? > $BASE.exit) | tee $BASE.out + test "$(cat $BASE.exit)" = 0 + exit + ;; +esac + # For repeatability, reset the environment to known value. LANG=C LC_ALL=C @@ -93,6 +102,27 @@ export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME export EDITOR +# Add libc MALLOC and MALLOC_PERTURB test +# only if we are not executing the test with valgrind +if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null || + test -n "$TEST_NO_MALLOC_CHECK" +then + setup_malloc_check () { + : nothing + } + teardown_malloc_check () { + : nothing + } +else + setup_malloc_check () { + MALLOC_CHECK_=3 MALLOC_PERTURB_=165 + export MALLOC_CHECK_ MALLOC_PERTURB_ + } + teardown_malloc_check () { + unset MALLOC_CHECK_ MALLOC_PERTURB_ + } +fi + # Protect ourselves from common misconfiguration to export # CDPATH into the environment unset CDPATH @@ -100,12 +130,12 @@ unset CDPATH unset GREP_OPTIONS case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in - 1|2|true) - echo "* warning: Some tests will not work if GIT_TRACE" \ - "is set as to trace on STDERR ! *" - echo "* warning: Please set GIT_TRACE to something" \ - "other than 1, 2 or true ! *" - ;; +1|2|true) + echo "* warning: Some tests will not work if GIT_TRACE" \ + "is set as to trace on STDERR ! *" + echo "* warning: Please set GIT_TRACE to something" \ + "other than 1, 2 or true ! *" + ;; esac # Convenience @@ -172,17 +202,23 @@ do esac done -if test -n "$color"; then +if test -n "$color" +then say_color () { ( TERM=$ORIGINAL_TERM export TERM case "$1" in - error) tput bold; tput setaf 1;; # bold red - skip) tput bold; tput setaf 2;; # bold green - pass) tput setaf 2;; # green - info) tput setaf 3;; # brown - *) test -n "$quiet" && return;; + error) + tput bold; tput setaf 1;; # bold red + skip) + tput bold; tput setaf 2;; # bold green + pass) + tput setaf 2;; # green + info) + tput setaf 3;; # brown + *) + test -n "$quiet" && return;; esac shift printf "%s" "$*" @@ -296,9 +332,12 @@ test_run_ () { if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure" then + setup_malloc_check test_eval_ "$test_cleanup" + teardown_malloc_check fi - if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then + if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE" + then echo "" fi return "$eval_ret" @@ -346,7 +385,8 @@ test_at_end_hook_ () { test_done () { GIT_EXIT_OK=t - if test -z "$HARNESS_ACTIVE"; then + if test -z "$HARNESS_ACTIVE" + then test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" mkdir -p "$test_results_dir" test_results_path="$test_results_dir/${0%.sh}-$$.counts" @@ -375,10 +415,18 @@ test_done () { case "$test_failure" in 0) # Maybe print SKIP message + if test -n "$skip_all" && test $test_count -gt 0 + then + error "Can't use skip_all after running some tests" + fi [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all" - if test $test_external_has_tap -eq 0; then - say_color pass "# passed all $msg" + if test $test_external_has_tap -eq 0 + then + if test $test_count -gt 0 + then + say_color pass "# passed all $msg" + fi say "1..$test_count$skip_all" fi @@ -391,7 +439,8 @@ test_done () { exit 0 ;; *) - if test $test_external_has_tap -eq 0; then + if test $test_external_has_tap -eq 0 + then say_color error "# failed $test_failure among $msg" say "1..$test_count" fi @@ -471,22 +520,26 @@ then PATH=$GIT_VALGRIND/bin:$PATH GIT_EXEC_PATH=$GIT_VALGRIND/bin export GIT_VALGRIND -elif test -n "$GIT_TEST_INSTALLED" ; then +elif test -n "$GIT_TEST_INSTALLED" +then GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || error "Cannot run git from $GIT_TEST_INSTALLED." PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} else # normal case, use ../bin-wrappers only unless $with_dashes: git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" - if ! test -x "$git_bin_dir/git" ; then - if test -z "$with_dashes" ; then + if ! test -x "$git_bin_dir/git" + then + if test -z "$with_dashes" + then say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" fi with_dashes=t fi PATH="$git_bin_dir:$PATH" GIT_EXEC_PATH=$GIT_BUILD_DIR - if test -n "$with_dashes" ; then + if test -n "$with_dashes" + then PATH="$GIT_BUILD_DIR:$PATH" fi fi @@ -521,7 +574,8 @@ then } fi -if ! test -x "$GIT_BUILD_DIR"/test-chmtime; then +if ! test -x "$GIT_BUILD_DIR"/test-chmtime +then echo >&2 'You need to build test-chmtime:' echo >&2 'Run "make test-chmtime" in the source (toplevel) directory' exit 1 @@ -544,7 +598,8 @@ rm -fr "$test" || { HOME="$TRASH_DIRECTORY" export HOME -if test -z "$TEST_NO_CREATE_REPO"; then +if test -z "$TEST_NO_CREATE_REPO" +then test_create_repo "$test" else mkdir -p "$test" @@ -659,9 +714,29 @@ test_i18ngrep () { fi } -# test whether the filesystem supports symbolic links -ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS -rm -f y +test_lazy_prereq SYMLINKS ' + # test whether the filesystem supports symbolic links + ln -s x y && test -h y +' + +test_lazy_prereq CASE_INSENSITIVE_FS ' + echo good >CamelCase && + echo bad >camelcase && + test "$(cat CamelCase)" != good +' + +test_lazy_prereq UTF8_NFD_TO_NFC ' + # check whether FS converts nfd unicode to nfc + auml=$(printf "\303\244") + aumlcdiar=$(printf "\141\314\210") + >"$auml" && + case "$(echo *)" in + "$aumlcdiar") + true ;; + *) + false ;; + esac +' # When the tests are run as root, permission tests will report that # things are writable when they shouldn't be. diff --git a/test-regex.c b/test-regex.c new file mode 100644 index 0000000000..b5bfd54139 --- /dev/null +++ b/test-regex.c @@ -0,0 +1,20 @@ +#include <git-compat-util.h> + +int main(int argc, char **argv) +{ + char *pat = "[^={} \t]+"; + char *str = "={}\nfred"; + regex_t r; + regmatch_t m[1]; + + if (regcomp(&r, pat, REG_EXTENDED | REG_NEWLINE)) + die("failed regcomp() for pattern '%s'", pat); + if (regexec(&r, str, 1, m, 0)) + die("no match of pattern '%s' to string '%s'", pat, str); + + /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957 */ + if (m[0].rm_so == 3) /* matches '\n' when it should not */ + die("regex bug confirmed: re-build git with NO_REGEX=1"); + + exit(0); +} diff --git a/test-string-list.c b/test-string-list.c new file mode 100644 index 0000000000..4693295a98 --- /dev/null +++ b/test-string-list.c @@ -0,0 +1,123 @@ +#include "cache.h" +#include "string-list.h" + +/* + * Parse an argument into a string list. arg should either be a + * ':'-separated list of strings, or "-" to indicate an empty string + * list (as opposed to "", which indicates a string list containing a + * single empty string). list->strdup_strings must be set. + */ +static void parse_string_list(struct string_list *list, const char *arg) +{ + if (!strcmp(arg, "-")) + return; + + (void)string_list_split(list, arg, ':', -1); +} + +static void write_list(const struct string_list *list) +{ + int i; + for (i = 0; i < list->nr; i++) + printf("[%d]: \"%s\"\n", i, list->items[i].string); +} + +static void write_list_compact(const struct string_list *list) +{ + int i; + if (!list->nr) + printf("-\n"); + else { + printf("%s", list->items[0].string); + for (i = 1; i < list->nr; i++) + printf(":%s", list->items[i].string); + printf("\n"); + } +} + +static int prefix_cb(struct string_list_item *item, void *cb_data) +{ + const char *prefix = (const char *)cb_data; + return !prefixcmp(item->string, prefix); +} + +int main(int argc, char **argv) +{ + if (argc == 5 && !strcmp(argv[1], "split")) { + struct string_list list = STRING_LIST_INIT_DUP; + int i; + const char *s = argv[2]; + int delim = *argv[3]; + int maxsplit = atoi(argv[4]); + + i = string_list_split(&list, s, delim, maxsplit); + printf("%d\n", i); + write_list(&list); + string_list_clear(&list, 0); + return 0; + } + + if (argc == 5 && !strcmp(argv[1], "split_in_place")) { + struct string_list list = STRING_LIST_INIT_NODUP; + int i; + char *s = xstrdup(argv[2]); + int delim = *argv[3]; + int maxsplit = atoi(argv[4]); + + i = string_list_split_in_place(&list, s, delim, maxsplit); + printf("%d\n", i); + write_list(&list); + string_list_clear(&list, 0); + free(s); + return 0; + } + + if (argc == 4 && !strcmp(argv[1], "filter")) { + /* + * Retain only the items that have the specified prefix. + * Arguments: list|- prefix + */ + struct string_list list = STRING_LIST_INIT_DUP; + const char *prefix = argv[3]; + + parse_string_list(&list, argv[2]); + filter_string_list(&list, 0, prefix_cb, (void *)prefix); + write_list_compact(&list); + string_list_clear(&list, 0); + return 0; + } + + if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) { + struct string_list list = STRING_LIST_INIT_DUP; + + parse_string_list(&list, argv[2]); + string_list_remove_duplicates(&list, 0); + write_list_compact(&list); + string_list_clear(&list, 0); + return 0; + } + + if (argc == 4 && !strcmp(argv[1], "longest_prefix")) { + /* arguments: <colon-separated-prefixes>|- <string> */ + struct string_list prefixes = STRING_LIST_INIT_DUP; + int retval; + const char *prefix_string = argv[2]; + const char *string = argv[3]; + const char *match; + + parse_string_list(&prefixes, prefix_string); + match = string_list_longest_prefix(&prefixes, string); + if (match) { + printf("%s\n", match); + retval = 0; + } + else + retval = 1; + string_list_clear(&prefixes, 0); + return retval; + } + + fprintf(stderr, "%s: unknown function name: %s\n", argv[0], + argv[1] ? argv[1] : "(there was none)"); + return 1; +} @@ -62,7 +62,7 @@ static int get_trace_fd(const char *key, int *need_close) static const char err_msg[] = "Could not trace into fd given by " "GIT_TRACE environment variable"; -void trace_vprintf(const char *key, const char *fmt, va_list ap) +static void trace_vprintf(const char *key, const char *fmt, va_list ap) { struct strbuf buf = STRBUF_INIT; diff --git a/transport.c b/transport.c index 1811b500d9..9932f402df 100644 --- a/transport.c +++ b/transport.c @@ -518,8 +518,7 @@ static int fetch_refs_via_pack(struct transport *transport, int nr_heads, struct ref **to_fetch) { struct git_transport_data *data = transport->data; - char **heads = xmalloc(nr_heads * sizeof(*heads)); - char **origh = xmalloc(nr_heads * sizeof(*origh)); + struct string_list sought = STRING_LIST_INIT_DUP; const struct ref *refs; char *dest = xstrdup(transport->url); struct fetch_pack_args args; @@ -538,7 +537,7 @@ static int fetch_refs_via_pack(struct transport *transport, args.depth = data->options.depth; for (i = 0; i < nr_heads; i++) - origh[i] = heads[i] = xstrdup(to_fetch[i]->name); + string_list_append(&sought, to_fetch[i]->name); if (!data->got_remote_heads) { connect_setup(transport, 0, 0); @@ -548,7 +547,7 @@ static int fetch_refs_via_pack(struct transport *transport, refs = fetch_pack(&args, data->fd, data->conn, refs_tmp ? refs_tmp : transport->remote_refs, - dest, nr_heads, heads, &transport->pack_lockfile); + dest, &sought, &transport->pack_lockfile); close(data->fd[0]); close(data->fd[1]); if (finish_connect(data->conn)) @@ -558,10 +557,7 @@ static int fetch_refs_via_pack(struct transport *transport, free_refs(refs_tmp); - for (i = 0; i < nr_heads; i++) - free(origh[i]); - free(origh); - free(heads); + string_list_clear(&sought, 0); free(dest); return (refs ? 0 : -1); } diff --git a/transport.h b/transport.h index b866c126e6..3b21c4abe6 100644 --- a/transport.h +++ b/transport.h @@ -106,6 +106,7 @@ struct transport { #define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND 256 #define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3) +#define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x) /* Returns a transport suitable for the url */ struct transport *transport_get(struct remote *, const char *); diff --git a/tree-diff.c b/tree-diff.c index 28ad6db9ff..ba01563a02 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -49,12 +49,12 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, if (DIFF_OPT_TST(opt, RECURSIVE) && S_ISDIR(mode1)) { if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE)) { opt->change(opt, mode1, mode2, - sha1, sha2, base->buf, 0, 0); + sha1, sha2, 1, 1, base->buf, 0, 0); } strbuf_addch(base, '/'); diff_tree_sha1(sha1, sha2, base->buf, opt); } else { - opt->change(opt, mode1, mode2, sha1, sha2, base->buf, 0, 0); + opt->change(opt, mode1, mode2, sha1, sha2, 1, 1, base->buf, 0, 0); } strbuf_setlen(base, old_baselen); return 0; @@ -100,7 +100,7 @@ static void show_entry(struct diff_options *opt, const char *prefix, die("corrupt tree sha %s", sha1_to_hex(sha1)); if (DIFF_OPT_TST(opt, TREE_IN_RECURSIVE)) - opt->add_remove(opt, *prefix, mode, sha1, base->buf, 0); + opt->add_remove(opt, *prefix, mode, sha1, 1, base->buf, 0); strbuf_addch(base, '/'); @@ -108,7 +108,7 @@ static void show_entry(struct diff_options *opt, const char *prefix, show_tree(opt, prefix, &inner, base); free(tree); } else - opt->add_remove(opt, prefix[0], mode, sha1, base->buf, 0); + opt->add_remove(opt, prefix[0], mode, sha1, 1, base->buf, 0); strbuf_setlen(base, old_baselen); } @@ -212,8 +212,7 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co diff_opts.rename_score = opt->rename_score; paths[0] = NULL; diff_tree_setup_paths(paths, &diff_opts); - if (diff_setup_done(&diff_opts) < 0) - die("unable to set up diff options to follow renames"); + diff_setup_done(&diff_opts); diff_tree(t1, t2, base, &diff_opts); diffcore_std(&diff_opts); diff_tree_release_paths(&diff_opts); diff --git a/upload-pack.c b/upload-pack.c index bb08e2eb0d..2e90ccb74f 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -11,6 +11,7 @@ #include "list-objects.h" #include "run-command.h" #include "sigchain.h" +#include "version.h" static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>"; @@ -734,9 +735,11 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo } if (capabilities) - packet_write(1, "%s %s%c%s%s\n", sha1_to_hex(sha1), refname_nons, + packet_write(1, "%s %s%c%s%s agent=%s\n", + sha1_to_hex(sha1), refname_nons, 0, capabilities, - stateless_rpc ? " no-done" : ""); + stateless_rpc ? " no-done" : "", + git_user_agent_sanitized()); else packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname_nons); capabilities = NULL; diff --git a/userdiff.c b/userdiff.c index 1e7184f7f0..ed958ef6b8 100644 --- a/userdiff.c +++ b/userdiff.c @@ -14,6 +14,15 @@ static int drivers_alloc; { name, NULL, -1, { pattern, REG_EXTENDED | REG_ICASE }, \ word_regex "|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+" } static struct userdiff_driver builtin_drivers[] = { +IPATTERN("ada", + "!^(.*[ \t])?(is new|renames|is separate)([ \t].*)?$\n" + "!^[ \t]*with[ \t].*$\n" + "^[ \t]*((procedure|function)[ \t]+.*)$\n" + "^[ \t]*((package|protected|task)[ \t]+.*)$", + /* -- */ + "[a-zA-Z][a-zA-Z0-9_]*" + "|[0-9][-+0-9#_.eE]" + "|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"), IPATTERN("fortran", "!^([C*]|[ \t]*!)\n" "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n" @@ -1,5 +1,6 @@ #include "git-compat-util.h" #include "version.h" +#include "strbuf.h" const char git_version_string[] = GIT_VERSION; @@ -15,3 +16,23 @@ const char *git_user_agent(void) return agent; } + +const char *git_user_agent_sanitized(void) +{ + static const char *agent = NULL; + + if (!agent) { + struct strbuf buf = STRBUF_INIT; + int i; + + strbuf_addstr(&buf, git_user_agent()); + strbuf_trim(&buf); + for (i = 0; i < buf.len; i++) { + if (buf.buf[i] <= 32 || buf.buf[i] >= 127) + buf.buf[i] = '.'; + } + agent = buf.buf; + } + + return agent; +} @@ -4,5 +4,6 @@ extern const char git_version_string[]; const char *git_user_agent(void); +const char *git_user_agent_sanitized(void); #endif /* VERSION_H */ @@ -403,6 +403,19 @@ int remove_or_warn(unsigned int mode, const char *file) return S_ISGITLINK(mode) ? rmdir_or_warn(file) : unlink_or_warn(file); } +void warn_on_inaccessible(const char *path) +{ + warning(_("unable to access '%s': %s"), path, strerror(errno)); +} + +int access_or_warn(const char *path, int mode) +{ + int ret = access(path, mode); + if (ret && errno != ENOENT) + warn_on_inaccessible(path); + return ret; +} + struct passwd *xgetpwuid_self(void) { struct passwd *pw; diff --git a/wt-status.c b/wt-status.c index c110cbc125..2a9658bad4 100644 --- a/wt-status.c +++ b/wt-status.c @@ -100,8 +100,8 @@ void status_printf(struct wt_status *s, const char *color, va_end(ap); } -void status_printf_more(struct wt_status *s, const char *color, - const char *fmt, ...) +static void status_printf_more(struct wt_status *s, const char *color, + const char *fmt, ...) { va_list ap; @@ -221,7 +221,7 @@ static void wt_status_print_other_header(struct wt_status *s, const char *how) { const char *c = color(WT_STATUS_HEADER, s); - status_printf_ln(s, c, _("%s files:"), what); + status_printf_ln(s, c, "%s:", what); if (!advice_status_hints) return; status_printf_ln(s, c, _(" (use \"git %s <file>...\" to include in what will be committed)"), how); @@ -1008,9 +1008,9 @@ void wt_status_print(struct wt_status *s) wt_status_print_submodule_summary(s, 1); /* unstaged */ } if (s->show_untracked_files) { - wt_status_print_other(s, &s->untracked, _("Untracked"), "add"); + wt_status_print_other(s, &s->untracked, _("Untracked files"), "add"); if (s->show_ignored_files) - wt_status_print_other(s, &s->ignored, _("Ignored"), "add -f"); + wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f"); } else if (s->commitable) status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"), advice_status_hints @@ -1023,23 +1023,31 @@ void wt_status_print(struct wt_status *s) status_printf_ln(s, GIT_COLOR_NORMAL, _("No changes")); else if (s->nowarn) ; /* nothing */ - else if (s->workdir_dirty) - printf(_("no changes added to commit%s\n"), - advice_status_hints - ? _(" (use \"git add\" and/or \"git commit -a\")") : ""); - else if (s->untracked.nr) - printf(_("nothing added to commit but untracked files present%s\n"), - advice_status_hints - ? _(" (use \"git add\" to track)") : ""); - else if (s->is_initial) - printf(_("nothing to commit%s\n"), advice_status_hints - ? _(" (create/copy files and use \"git add\" to track)") : ""); - else if (!s->show_untracked_files) - printf(_("nothing to commit%s\n"), advice_status_hints - ? _(" (use -u to show untracked files)") : ""); - else - printf(_("nothing to commit%s\n"), advice_status_hints - ? _(" (working directory clean)") : ""); + else if (s->workdir_dirty) { + if (advice_status_hints) + printf(_("no changes added to commit " + "(use \"git add\" and/or \"git commit -a\")\n")); + else + printf(_("no changes added to commit\n")); + } else if (s->untracked.nr) { + if (advice_status_hints) + printf(_("nothing added to commit but untracked files " + "present (use \"git add\" to track)\n")); + else + printf(_("nothing added to commit but untracked files present\n")); + } else if (s->is_initial) { + if (advice_status_hints) + printf(_("nothing to commit (create/copy files " + "and use \"git add\" to track)\n")); + else + printf(_("nothing to commit\n")); + } else if (!s->show_untracked_files) { + if (advice_status_hints) + printf(_("nothing to commit (use -u to show untracked files)\n")); + else + printf(_("nothing to commit\n")); + } else + printf(_("nothing to commit, working directory clean\n")); } } diff --git a/wt-status.h b/wt-status.h index f8fc58cc0a..236b41fd34 100644 --- a/wt-status.h +++ b/wt-status.h @@ -92,7 +92,5 @@ void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, . ; void status_printf(struct wt_status *s, const char *color, const char *fmt, ...) ; -void status_printf_more(struct wt_status *s, const char *color, const char *fmt, ...) - __attribute__((format(printf, 3, 4))); #endif /* STATUS_H */ |