diff options
598 files changed, 45826 insertions, 24250 deletions
diff --git a/.gitignore b/.gitignore index 66199edd4a..dc600f9b36 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /GIT-CFLAGS /GIT-LDFLAGS /GIT-PREFIX +/GIT-PERL-DEFINES /GIT-PYTHON-VARS /GIT-SCRIPT-DEFINES /GIT-USER-AGENT @@ -75,7 +76,6 @@ /git-init-db /git-instaweb /git-log -/git-lost-found /git-ls-files /git-ls-remote /git-ls-tree @@ -105,7 +105,6 @@ /git-pack-refs /git-parse-remote /git-patch-id -/git-peek-remote /git-prune /git-prune-packed /git-pull @@ -131,7 +130,6 @@ /git-remote-testsvn /git-repack /git-replace -/git-repo-config /git-request-pull /git-rerere /git-reset @@ -159,7 +157,6 @@ /git-svn /git-symbolic-ref /git-tag -/git-tar-tree /git-unpack-file /git-unpack-objects /git-update-index @@ -185,6 +182,7 @@ /test-dump-cache-tree /test-scrap-cache-tree /test-genrandom +/test-hashmap /test-index-version /test-line-buffer /test-match-trees diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index a600e35c81..ed432a80ca 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -126,6 +126,17 @@ For C programs: "char * string". This makes it easier to understand code like "char *string, c;". + - Use whitespace around operators and keywords, but not inside + parentheses and not around functions. So: + + while (condition) + func(bar + 1); + + and not: + + while( condition ) + func (bar+1); + - We avoid using braces unnecessarily. I.e. if (bla) { @@ -260,9 +271,11 @@ Writing Documentation: Every user-visible change should be reflected in the documentation. The same general rule as for code applies -- imitate the existing - conventions. A few commented examples follow to provide reference - when writing or modifying command usage strings and synopsis sections - in the manual pages: + conventions. + + A few commented examples follow to provide reference when writing or + modifying command usage strings and synopsis sections in the manual + pages: Placeholders are spelled in lowercase and enclosed in angle brackets: <file> @@ -312,3 +325,29 @@ Writing Documentation: Use 'git' (all lowercase) when talking about commands i.e. something the user would type into a shell and use 'Git' (uppercase first letter) when talking about the version control system and its properties. + + A few commented examples follow to provide reference when writing or + modifying paragraphs or option/command explanations that contain options + or commands: + + Literal examples (e.g. use of command-line options, command names, and + configuration variables) are typeset in monospace, and if you can use + `backticks around word phrases`, do so. + `--pretty=oneline` + `git rev-list` + `remote.pushdefault` + + Word phrases enclosed in `backtick characters` are rendered literally + and will not be further expanded. The use of `backticks` to achieve the + previous rule means that literal examples should not use AsciiDoc + escapes. + Correct: + `--pretty=oneline` + Incorrect: + `\--pretty=oneline` + + If some place in the documentation needs to typeset a command usage + example with inline substitutions, it is fine to use +monospaced and + inline substituted text+ instead of `monospaced literal text`, and with + the former, the part that should not get substituted must be + quoted/escaped. diff --git a/Documentation/Makefile b/Documentation/Makefile index 4f13a23893..fc6b2cf9ec 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -2,6 +2,9 @@ MAN1_TXT = MAN5_TXT = MAN7_TXT = +TECH_DOCS = +ARTICLES = +SP_ARTICLES = MAN1_TXT += $(filter-out \ $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \ @@ -37,12 +40,12 @@ MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT)) OBSOLETE_HTML = git-remote-helpers.html DOC_HTML = $(MAN_HTML) $(OBSOLETE_HTML) -ARTICLES = howto-index +ARTICLES += howto-index ARTICLES += everyday ARTICLES += git-tools ARTICLES += git-bisect-lk2009 # with their own formatting rules. -SP_ARTICLES = user-manual +SP_ARTICLES += user-manual SP_ARTICLES += howto/new-command SP_ARTICLES += howto/revert-branch-rebase SP_ARTICLES += howto/using-merge-subtree @@ -53,13 +56,15 @@ SP_ARTICLES += howto/setup-git-server-over-http SP_ARTICLES += howto/separating-topic-branches SP_ARTICLES += howto/revert-a-faulty-merge SP_ARTICLES += howto/recover-corrupted-blob-object +SP_ARTICLES += howto/recover-corrupted-object-harder SP_ARTICLES += howto/rebuild-from-update-hook SP_ARTICLES += howto/rebase-from-internal-branch SP_ARTICLES += howto/maintain-git API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt))) SP_ARTICLES += $(API_DOCS) -TECH_DOCS = technical/index-format +TECH_DOCS += technical/http-protocol +TECH_DOCS += technical/index-format TECH_DOCS += technical/pack-format TECH_DOCS += technical/pack-heuristics TECH_DOCS += technical/pack-protocol @@ -323,7 +328,7 @@ manpage-base-url.xsl: manpage-base-url.xsl.in user-manual.xml: user-manual.txt user-manual.conf $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \ - $(ASCIIDOC) $(ASCIIDOC_EXTRA) -b docbook -d book -o $@+ $< && \ + $(ASCIIDOC) $(ASCIIDOC_EXTRA) -b docbook -d article -o $@+ $< && \ mv $@+ $@ technical/api-index.txt: technical/api-index-skel.txt \ diff --git a/Documentation/RelNotes/1.8.4.2.txt b/Documentation/RelNotes/1.8.4.2.txt index 867ae69070..9adccb1efb 100644 --- a/Documentation/RelNotes/1.8.4.2.txt +++ b/Documentation/RelNotes/1.8.4.2.txt @@ -4,6 +4,20 @@ Git v1.8.4.2 Release Notes Fixes since v1.8.4.1 -------------------- + * "git clone" gave some progress messages to the standard output, not + to the standard error, and did not allow suppressing them with the + "--no-progress" option. + + * "format-patch --from=<whom>" forgot to omit unnecessary in-body + from line, i.e. when <whom> is the same as the real author. + + * "git shortlog" used to choke and die when there is a malformed + commit (e.g. missing authors); it now simply ignore such a commit + and keeps going. + + * "git merge-recursive" did not parse its "--diff-algorithm=" command + line option correctly. + * "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a local branch of the upstream repository you are tracking from. diff --git a/Documentation/RelNotes/1.8.4.3.txt b/Documentation/RelNotes/1.8.4.3.txt new file mode 100644 index 0000000000..03f3d17751 --- /dev/null +++ b/Documentation/RelNotes/1.8.4.3.txt @@ -0,0 +1,54 @@ +Git v1.8.4.3 Release Notes +======================== + +Fixes since v1.8.4.2 +-------------------- + + * The interaction between use of Perl in our test suite and NO_PERL + has been clarified a bit. + + * A fast-import stream expresses a pathname with funny characters by + quoting them in C style; remote-hg remote helper (in contrib/) + forgot to unquote such a path. + + * One long-standing flaw in the pack transfer protocol used by "git + clone" was that there was no way to tell the other end which branch + "HEAD" points at, and the receiving end needed to guess. A new + capability has been defined in the pack protocol to convey this + information so that cloning from a repository with more than one + branches pointing at the same commit where the HEAD is at now + reliably sets the initial branch in the resulting repository. + + * We did not handle cases where http transport gets redirected during + the authorization request (e.g. from http:// to https://). + + * "git rev-list --objects ^v1.0^ v1.0" gave v1.0 tag itself in the + output, but "git rev-list --objects v1.0^..v1.0" did not. + + * The fall-back parsing of commit objects with broken author or + committer lines were less robust than ideal in picking up the + timestamps. + + * Bash prompting code to deal with an SVN remote as an upstream + were coded in a way not supported by older Bash versions (3.x). + + * "git checkout topic", when there is not yet a local "topic" branch + but there is a unique remote-tracking branch for a remote "topic" + branch, pretended as if "git checkout -t -b topic remote/$r/topic" + (for that unique remote $r) was run. This hack however was not + implemented for "git checkout topic --". + + * Coloring around octopus merges in "log --graph" output was screwy. + + * We did not generate HTML version of documentation to "git subtree" + in contrib/. + + * The synopsis section of "git unpack-objects" documentation has been + clarified a bit. + + * An ancient How-To on serving Git repositories on an HTTP server + lacked a warning that it has been mostly superseded with more + modern way. + +Also contains a handful of trivial code clean-ups, documentation +updates, updates to the test suite, etc. diff --git a/Documentation/RelNotes/1.8.4.4.txt b/Documentation/RelNotes/1.8.4.4.txt new file mode 100644 index 0000000000..7bc4c5dcc0 --- /dev/null +++ b/Documentation/RelNotes/1.8.4.4.txt @@ -0,0 +1,10 @@ +Git v1.8.4.4 Release Notes +======================== + +Fixes since v1.8.4.3 +-------------------- + + * The fix in v1.8.4.3 to the pack transfer protocol to propagate + the target of symbolic refs broke "git clone/git fetch" from a + repository with too many symbolic refs. As a hotfix/workaround, + we transfer only the information on HEAD. diff --git a/Documentation/RelNotes/1.8.4.5.txt b/Documentation/RelNotes/1.8.4.5.txt new file mode 100644 index 0000000000..215bd1a7a2 --- /dev/null +++ b/Documentation/RelNotes/1.8.4.5.txt @@ -0,0 +1,13 @@ +Git v1.8.4.5 Release Notes +========================== + +Fixes since v1.8.4.4 +-------------------- + + * Recent update to remote-hg that attempted to make it work better + with non ASCII pathnames fed Unicode strings to the underlying Hg + API, which was wrong. + + * "git submodule init" copied "submodule.$name.update" settings from + .gitmodules to .git/config without making sure if the suggested + value was sensible. diff --git a/Documentation/RelNotes/1.8.5.1.txt b/Documentation/RelNotes/1.8.5.1.txt new file mode 100644 index 0000000000..7236aaf232 --- /dev/null +++ b/Documentation/RelNotes/1.8.5.1.txt @@ -0,0 +1,9 @@ +Git v1.8.5.1 Release Notes +========================== + +Fixes since v1.8.5 +------------------ + + * "git submodule init" copied "submodule.$name.update" settings from + .gitmodules to .git/config without making sure if the suggested + value was sensible. diff --git a/Documentation/RelNotes/1.8.5.2.txt b/Documentation/RelNotes/1.8.5.2.txt new file mode 100644 index 0000000000..3ac4984f10 --- /dev/null +++ b/Documentation/RelNotes/1.8.5.2.txt @@ -0,0 +1,20 @@ +Git v1.8.5.2 Release Notes +========================== + +Fixes since v1.8.5.1 +-------------------- + + * "git diff -- ':(icase)makefile'" was unnecessarily rejected at the + command line parser. + + * "git cat-file --batch-check=ok" did not check the existence of + the named object. + + * "git am --abort" sometimes complained about not being able to write + a tree with an 0{40} object in it. + + * Two processes creating loose objects at the same time could have + failed unnecessarily when the name of their new objects started + with the same byte value, due to a race condition. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/1.8.5.3.txt b/Documentation/RelNotes/1.8.5.3.txt new file mode 100644 index 0000000000..3de2dd0f19 --- /dev/null +++ b/Documentation/RelNotes/1.8.5.3.txt @@ -0,0 +1,27 @@ +Git v1.8.5.3 Release Notes +========================== + +Fixes since v1.8.5.2 +-------------------- + + * The "--[no-]informative-errors" options to "git daemon" were parsed + a bit too loosely, allowing any other string after these option + names. + + * A "gc" process running as a different user should be able to stop a + new "gc" process from starting. + + * An earlier "clean-up" introduced an unnecessary memory leak to the + credential subsystem. + + * "git mv A B/", when B does not exist as a directory, should error + out, but it didn't. + + * "git rev-parse <revs> -- <paths>" did not implement the usual + disambiguation rules the commands in the "git log" family used in + the same way. + + * "git cat-file --batch=", an admittedly useless command, did not + behave very well. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/1.8.5.4.txt b/Documentation/RelNotes/1.8.5.4.txt new file mode 100644 index 0000000000..d18c40389e --- /dev/null +++ b/Documentation/RelNotes/1.8.5.4.txt @@ -0,0 +1,48 @@ +Git v1.8.5.4 Release Notes +========================== + +Fixes since v1.8.5.3 +-------------------- + + * "git fetch --depth=0" was a no-op, and was silently ignored. + Diagnose it as an error. + + * Remote repository URL expressed in scp-style host:path notation are + parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks + to connect to user's home directory on host at address ::1. + + * SSL-related options were not passed correctly to underlying socket + layer in "git send-email". + + * "git commit -v" appends the patch to the log message before + editing, and then removes the patch when the editor returned + control. However, the patch was not stripped correctly when the + first modified path was a submodule. + + * "git mv A B/", when B does not exist as a directory, should error + out, but it didn't. + + * When we figure out how many file descriptors to allocate for + keeping packfiles open, a system with non-working getrlimit() could + cause us to die(), but because we make this call only to get a + rough estimate of how many is available and we do not even attempt + to use up all file descriptors available ourselves, it is nicer to + fall back to a reasonable low value rather than dying. + + * "git log --decorate" did not handle a tag pointed by another tag + nicely. + + * "git add -A" (no other arguments) in a totally empty working tree + used to emit an error. + + * There is no reason to have a hardcoded upper limit of the number of + parents for an octopus merge, created via the graft mechanism, but + there was. + + * The implementation of 'git stash $cmd "stash@{...}"' did not quote + the stash argument properly and left it split at IFS whitespace. + + * The documentation to "git pull" hinted there is an "-m" option + because it incorrectly shared the documentation with "git merge". + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/1.8.5.5.txt b/Documentation/RelNotes/1.8.5.5.txt new file mode 100644 index 0000000000..9191ce948f --- /dev/null +++ b/Documentation/RelNotes/1.8.5.5.txt @@ -0,0 +1,37 @@ +Git v1.8.5.5 Release Notes +========================== + +Fixes since v1.8.5.4 +-------------------- + + * The pathspec matching code, while comparing two trees (e.g. "git + diff A B -- path1 path2") was too aggressive and failed to match + some paths when multiple pathspecs were involved. + + * "git repack --max-pack-size=8g" stopped being parsed correctly when + the command was reimplemented in C. + + * A recent update to "git send-email" broke platforms where + /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path + (e.g. Fedora rawhide). + + * A handful of bugs around interpreting $branch@{upstream} notation + and its lookalike, when $branch part has interesting characters, + e.g. "@", and ":", have been fixed. + + * "git clone" would fail to clone from a repository that has a ref + directly under "refs/", e.g. "refs/stash", because different + validation paths do different things on such a refname. Loosen the + client side's validation to allow such a ref. + + * "git log --left-right A...B" lost the "leftness" of commits + reachable from A when A is a tag as a side effect of a recent + bugfix. This is a regression in 1.8.4.x series. + + * "git merge-base --octopus" used to leave cleaning up suboptimal + result to the caller, but now it does the clean-up itself. + + * "git mv A B/", when B does not exist as a directory, should error + out, but it didn't. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/1.8.5.txt b/Documentation/RelNotes/1.8.5.txt index 4c2aa7077b..602df0cac2 100644 --- a/Documentation/RelNotes/1.8.5.txt +++ b/Documentation/RelNotes/1.8.5.txt @@ -8,7 +8,7 @@ When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" -semantics that pushes: +semantics, which pushes: - only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote @@ -53,9 +53,12 @@ Updates since v1.8.4 Foreign interfaces, subsystems and ports. - * "git-svn" used with SVN 1.8.0 when talking over https:// connection + * "git-svn" has been taught to use the serf library, which is the + only option SVN 1.8.0 offers us when talking the HTTP protocol. + + * "git-svn" talking over an https:// connection using the serf library dumped core due to a bug in the serf library that SVN uses. Work - it around on our side, even though the SVN side is being fixed. + around it on our side, even though the SVN side is being fixed. * On MacOS X, we detected if the filesystem needs the "pre-composed unicode strings" workaround, but did not automatically enable it. @@ -65,10 +68,7 @@ Foreign interfaces, subsystems and ports. repository relative to the home directory, e.g. "clone hg::~/there". * imap-send ported to OS X uses Apple's security framework instead of - OpenSSL one. - - * Subversion 1.8.0 that was recently released breaks older subversion - clients coming over http/https in various ways. + OpenSSL's. * "git fast-import" treats an empty path given to "ls" as the root of the tree. @@ -76,22 +76,25 @@ Foreign interfaces, subsystems and ports. UI, Workflows & Features - * "git grep" and "git show" pays attention to "--textconv" option + * xdg-open can be used as a browser backend for "git web-browse" + (hence to show "git help -w" output), when available. + + * "git grep" and "git show" pay attention to the "--textconv" option when these commands are told to operate on blob objects (e.g. "git - grep -e pattern HEAD:Makefile"). + grep -e pattern --textconv HEAD:Makefile"). * "git replace" helper no longer allows an object to be replaced with another object of a different type to avoid confusion (you can - still manually craft such replacement using "git update-ref", as an + still manually craft such a replacement using "git update-ref", as an escape hatch). - * "git status" no longer prints dirty status information for + * "git status" no longer prints the dirty status information of submodules for which submodule.$name.ignore is set to "all". * "git rebase -i" honours core.abbrev when preparing the insn sheet for editing. - * "git status" during a cherry-pick shows what original commit is + * "git status" during a cherry-pick shows which original commit is being picked. * Instead of typing four capital letters "HEAD", you can say "@" now, @@ -99,21 +102,21 @@ UI, Workflows & Features * "git check-ignore" follows the same rule as "git add" and "git status" in that the ignore/exclude mechanism does not take effect - on paths that are already tracked. With "--no-index" option, it + on paths that are already tracked. With the "--no-index" option, it can be used to diagnose which paths that should have been ignored have been mistakenly added to the index. * Some irrelevant "advice" messages that are shared with "git status" output have been removed from the commit log template. - * "update-refs" learnt a "--stdin" option to read multiple update + * "update-refs" learned a "--stdin" option to read multiple update requests and perform them in an all-or-none fashion. * Just like "make -C <directory>", "git -C <directory> ..." tells Git to go there before doing anything else. - * Just like "git checkout -" knows to check out and "git merge -" - knows to merge the branch you were previously on, "git cherry-pick" + * Just like "git checkout -" knows to check out, and "git merge -" + knows to merge, the branch you were previously on, "git cherry-pick" now understands "git cherry-pick -" to pick from the previous branch. @@ -123,59 +126,58 @@ UI, Workflows & Features "git status --porcelain" instead, as its format is stable and easier to parse. - * Make "foo^{tag}" to peel a tag to itself, i.e. no-op., and fail if - "foo" is not a tag. "git rev-parse --verify v1.0^{tag}" would be - a more convenient way to say "test $(git cat-file -t v1.0) = tag". + * The ref syntax "foo^{tag}" (with the literal string "{tag}") peels a + tag ref to itself, i.e. it's a no-op., and fails if + "foo" is not a tag. "git rev-parse --verify v1.0^{tag}" is + a more convenient way than "test $(git cat-file -t v1.0) = tag" to + check if v1.0 is a tag. * "git branch -v -v" (and "git status") did not distinguish among a - branch that does not build on any other branch, a branch that is in - sync with the branch it builds on, and a branch that is configured - to build on some other branch that no longer exists. + branch that is not based on any other branch, a branch that is in + sync with its upstream branch, and a branch that is configured with an + upstream branch that no longer exists. - * A packfile that stores the same object more than once is broken and - will be rejected by "git index-pack" that is run when receiving - data over the wire. - - * Earlier we started rejecting an attempt to add 0{40} object name to + * Earlier we started rejecting any attempt to add the 0{40} object name to the index and to tree objects, but it sometimes is necessary to - allow so to be able to use tools like filter-branch to correct such - broken tree objects. "filter-branch" can again be used to to do - so. + allow this to be able to use tools like filter-branch to correct such + broken tree objects. "filter-branch" can again be used to do this. * "git config" did not provide a way to set or access numbers larger than a native "int" on the platform; it now provides 64-bit signed integers on all platforms. * "git pull --rebase" always chose to do the bog-standard flattening - rebase. You can tell it to run "rebase --preserve-merges" by + rebase. You can tell it to run "rebase --preserve-merges" with + "git pull --rebase=preserve" or by setting "pull.rebase" configuration to "preserve". * "git push --no-thin" actually disables the "thin pack transfer" optimization. - * Magic pathspecs like ":(icase)makefile" that matches both - Makefile and makefile can be used in more places. + * Magic pathspecs like ":(icase)makefile" (matches both Makefile + and makefile) and ":(glob)foo/**/bar" (matches "bar" in "foo" + and any subdirectory of "foo") can be used in more places. - * The "http.*" variables can now be specified per URL that the - configuration applies. For example, + * The "http.*" variables can now be specified for individual URLs. + For example, [http] sslVerify = true [http "https://weak.example.com/"] sslVerify = false - would flip http.sslVerify off only when talking to that specified + would flip http.sslVerify off only when talking to that specific site. - * "git mv A B" when moving a submodule A has been taught to - relocate its working tree and to adjust the paths in the + * "git mv A B" when moving a submodule has been taught to + relocate the submodule's working tree and to adjust the paths in the .gitmodules file. * "git blame" can now take more than one -L option to discover the - origin of multiple blocks of the lines. + origin of multiple blocks of lines. * The http transport clients can optionally ask to save cookies - with http.savecookies configuration variable. + with the http.savecookies configuration variable. * "git push" learned a more fine grained control over a blunt "--force" when requesting a non-fast-forward update with the @@ -197,7 +199,7 @@ UI, Workflows & Features * "git whatchanged" may still be used by old timers, but mention of it in documents meant for new users will only waste readers' time - wonderig what the difference is between it and "git log". Make it + wondering what the difference is between it and "git log". Make it less prominent in the general part of the documentation and explain that it is merely a "git log" with different default behaviour in its own document. @@ -205,6 +207,12 @@ UI, Workflows & Features Performance, Internal Implementation, etc. + * "git for-each-ref" when asking for merely the object name does not + have to parse the object pointed at by the refs; the codepath has + been optimized. + + * The HTTP transport will try to use TCP keepalive when able. + * "git repack" is now written in C. * Build procedure for MSVC has been updated. @@ -213,23 +221,23 @@ Performance, Internal Implementation, etc. should apply the same "no subprocess or pipe" optimization as we apply to user-supplied GIT_PAGER=cat. - * Many commands use --dashed-option as a operation mode selector - (e.g. "git tag --delete") that the user can use at most one - (e.g. "git tag --delete --verify" is a nonsense) and you cannot - negate (e.g. "git tag --no-delete" is a nonsense). parse-options + * Many commands use a --dashed-option as an operation mode selector + (e.g. "git tag --delete") that excludes other operation modes + (e.g. "git tag --delete --verify" is nonsense) and that cannot be + negated (e.g. "git tag --no-delete" is nonsense). The parse-options API learned a new OPT_CMDMODE macro to make it easier to implement such a set of options. - * OPT_BOOLEAN() in parse-options API was misdesigned to be "counting + * OPT_BOOLEAN() in the parse-options API was misdesigned to be "counting up" but many subcommands expect it to behave as "on/off". Update them to use OPT_BOOL() which is a proper boolean. - * "git gc" exits early without doing a double-work when it detects + * "git gc" exits early without doing any work when it detects that another instance of itself is already running. * Under memory pressure and/or file descriptor pressure, we used to - close pack windows that are not used and also closed filehandle to - an open but unused packfiles. These are now controlled separately + close pack windows that are not used and also closed filehandles to + open but unused packfiles. These are now controlled separately to better cope with the load. Also contains various documentation updates and code clean-ups. @@ -239,20 +247,82 @@ Fixes since v1.8.4 ------------------ Unless otherwise noted, all the fixes since v1.8.4 in the maintenance -track are contained in this release (see release notes to them for +track are contained in this release (see the maintenance releases' notes for details). - * "git clone" gave some progress messages to the standard output, not - to the standard error, and did not allow suppressing them with the + * An ancient How-To on serving Git repositories on an HTTP server + lacked a warning that it has been mostly superseded with a more + modern way. + (merge 6d52bc3 sc/doc-howto-dumb-http later to maint). + + * The interaction between the use of Perl in our test suite and NO_PERL + has been clarified a bit. + (merge f8fc0ee jn/test-prereq-perl-doc later to maint). + + * The synopsis section of the "git unpack-objects" documentation has been + clarified a bit. + (merge 61e2e22 vd/doc-unpack-objects later to maint). + + * We did not generate the HTML version of the documentation to "git subtree" + in contrib/. + (merge 95c62fb jk/subtree-install-fix later to maint). + + * A fast-import stream expresses a pathname with funny characters by + quoting them in C style; the remote-hg remote helper forgot to unquote + such a path. + (merge 1136265 ap/remote-hg-unquote-cquote later to maint). + + * "git reset -p HEAD" has a codepath to special-case it to behave + differently from resetting to contents of other commits, but a + recent change broke it. + + * Coloring around octopus merges in "log --graph" output was screwy. + (merge 339c17b hn/log-graph-color-octopus later to maint). + + * "git checkout topic", when there is not yet a local "topic" branch + but there is a unique remote-tracking branch for a remote "topic" + branch, pretended as if "git checkout -t -b topic remote/$r/topic" + (for that unique remote $r) was run. This hack however was not + implemented for "git checkout topic --". + (merge bca3969 mm/checkout-auto-track-fix later to maint). + + * One long-standing flaw in the pack transfer protocol used by "git + clone" was that there was no way to tell the other end which branch + "HEAD" points at, and the receiving end needed to guess. A new + capability has been defined in the pack protocol to convey this + information so that cloning from a repository with more than one + branch pointing at the same commit where the HEAD is at now + reliably sets the initial branch in the resulting repository. + (merge 360a326 jc/upload-pack-send-symref later to maint). + + * We did not handle cases where the http transport gets redirected during + the authorization request (e.g. from http:// to https://). + (merge 70900ed jk/http-auth-redirects later to maint). + + * Bash prompting code to deal with an SVN remote as an upstream + was coded in a way unsupported by older Bash versions (3.x). + (merge 52ec889 sg/prompt-svn-remote-fix later to maint). + + * The fall-back parsing of commit objects with broken author or + committer lines was less robust than ideal in picking up the + timestamps. + (merge 03818a4 jk/split-broken-ident later to maint). + + * "git rev-list --objects ^v1.0^ v1.0" gave the v1.0 tag itself in the + output, but "git rev-list --objects v1.0^..v1.0" did not. + (merge 895c5ba jc/revision-range-unpeel later to maint). + + * "git clone" wrote some progress messages to standard output, not + to standard error, and did not suppress them with the --no-progress option. (merge 643f918 jk/clone-progress-to-stderr later to maint). - * "format-patch --from=<whom>" forgot to omit unnecessary in-body + * "format-patch --from=<whom>" forgot to omit an unnecessary in-body from line, i.e. when <whom> is the same as the real author. (merge 662cc30 jk/format-patch-from later to maint). * "git shortlog" used to choke and die when there is a malformed - commit (e.g. missing authors); it now simply ignore such a commit + commit (e.g. missing authors); it now simply ignores such a commit and keeps going. (merge cd4f09e jk/shortlog-tolerate-broken-commit later to maint). @@ -266,16 +336,16 @@ details). small empty messages to keep the connection alive. (merge 115dedd jk/upload-pack-keepalive later to maint). - * "git rebase" had a portability regression in v1.8.4 to trigger a + * "git rebase" had a portability regression in v1.8.4 that triggered a bug in some BSD shell implementations. (merge 99855dd mm/rebase-continue-freebsd-WB later to maint). * "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a - local branch of the upstream repository you are tracking from. + local branch of the upstream repository you are tracking. (merge b0f49ff jh/checkout-auto-tracking later to maint). - * When the webserver responds with "405 Method Not Allowed", "git + * When the web server responds with "405 Method Not Allowed", "git http-backend" should tell the client what methods are allowed with the "Allow" header. (merge 9247be0 bc/http-backend-allow-405 later to maint). @@ -289,22 +359,22 @@ details). executable files. (merge 1b48d56 jc/cvsserver-perm-bit-fix later to maint). - * When send-email comes up with an error message to die with upon + * When send-email obtains an error message to die with upon failure to start an SSL session, it tried to read the error string from a wrong place. (merge 6cb0c88 bc/send-email-ssl-die-message-fix later to maint). - * The implementation of "add -i" has a crippling code to work around + * The implementation of "add -i" has some crippling code to work around an ActiveState Perl limitation but it by mistake also triggered on Git for Windows where MSYS perl is used. (merge df17e77 js/add-i-mingw later to maint). - * We made sure that we notice the user-supplied GIT_DIR is actually a + * We made sure that we notice when the user-supplied GIT_DIR is actually a gitfile, but did not do the same when the default ".git" is a gitfile. (merge 487a2b7 nd/git-dir-pointing-at-gitfile later to maint). - * When an object is not found after checking the packfiles and then + * When an object is not found after checking the packfiles and the loose object directory, read_sha1_file() re-checks the packfiles to prevent racing with a concurrent repacker; teach the same logic to has_sha1_file(). @@ -322,22 +392,22 @@ details). made it unnecessarily inefficient. (merge 680be04 jc/ls-files-killed-optim later to maint). - * The commit object names in the insn sheet that was prepared at the - beginning of "rebase -i" session can become ambiguous as the + * The shortened commit object names in the insn sheet that is prepared at the + beginning of a "rebase -i" session can become ambiguous as the rebasing progresses and the repository gains more commits. Make sure the internal record is kept with full 40-hex object names. (merge 75c6976 es/rebase-i-no-abbrev later to maint). * "git rebase --preserve-merges" internally used the merge machinery - and as a side effect, left merge summary message in the log, but - when rebasing, there should not be a need for merge summary. + and as a side effect left the merge summary message in the log, but + when rebasing there is no need for the merge summary. (merge a9f739c rt/rebase-p-no-merge-summary later to maint). - * A call to xread() was used without a loop around to cope with short - read in the codepath to stream new contents to a pack. + * A call to xread() was used without a loop around it to cope with short + reads in the codepath to stream new contents to a pack. (merge e92527c js/xread-in-full later to maint). - * "git rebase -i" forgot that the comment character can be + * "git rebase -i" forgot that the comment character is configurable while reading its insn sheet. (merge 7bca7af es/rebase-i-respect-core-commentchar later to maint). @@ -348,8 +418,8 @@ details). * We used to send a large request to read(2)/write(2) as a single system call, which was bad from the latency point of view when the operation needs to be killed, and also triggered an error on - broken 64-bit systems that refuse to take more than 2GB read or - write in one go. + broken 64-bit systems that refuse to read or write more than 2GB + in one go. (merge a487916 sp/clip-read-write-to-8mb later to maint). * "git fetch" that auto-followed tags incorrectly reused the @@ -363,17 +433,17 @@ details). had a similar problem. (merge 838f9a1 tr/log-full-diff-keep-true-parents later to maint). - * Setting submodule.*.path configuration variable to true (without + * Setting a submodule.*.path configuration variable to true (without giving "= value") caused Git to segfault. (merge 4b05440 jl/some-submodule-config-are-not-boolean later to maint). * "git rebase -i" (there could be others, as the root cause is pretty - generic) fed a random, data dependeant string to 'echo' and - expects it to come out literally, corrupting its error message. + generic) fed a random, data dependent string to 'echo' and + expected it to come out literally, corrupting its error message. (merge 89b0230 mm/no-shell-escape-in-die-message later to maint). * Some people still use rather old versions of bash, which cannot - grok some constructs like 'printf -v varname' the prompt and + grok some constructs like 'printf -v varname' which the prompt and completion code started to use recently. (merge a44aa69 bc/completion-for-bash-3.0 later to maint). diff --git a/Documentation/RelNotes/1.9.0.txt b/Documentation/RelNotes/1.9.0.txt new file mode 100644 index 0000000000..752d79127a --- /dev/null +++ b/Documentation/RelNotes/1.9.0.txt @@ -0,0 +1,345 @@ +Git v1.9.0 Release Notes +======================== + +Backward compatibility notes +---------------------------- + +"git submodule foreach $cmd $args" used to treat "$cmd $args" the same +way "ssh" did, concatenating them into a single string and letting the +shell unquote. Careless users who forget to sufficiently quote $args +get their argument split at $IFS whitespaces by the shell, and got +unexpected results due to this. Starting from this release, the +command line is passed directly to the shell, if it has an argument. + +Read-only support for experimental loose-object format, in which users +could optionally choose to write their loose objects for a short +while between v1.4.3 and v1.5.3 era, has been dropped. + +The meanings of the "--tags" option to "git fetch" has changed; the +command fetches tags _in addition to_ what is fetched by the same +command line without the option. + +The way "git push $there $what" interprets the $what part given on the +command line, when it does not have a colon that explicitly tells us +what ref at the $there repository is to be updated, has been enhanced. + +A handful of ancient commands that have long been deprecated are +finally gone (repo-config, tar-tree, lost-found, and peek-remote). + + +Backward compatibility notes (for Git 2.0.0) +-------------------------------------------- + +When "git push [$there]" does not say what to push, we have used the +traditional "matching" semantics so far (all your branches were sent +to the remote as long as there already are branches of the same name +over there). In Git 2.0, the default will change to the "simple" +semantics, which pushes: + + - only the current branch to the branch with the same name, and only + when the current branch is set to integrate with that remote + branch, if you are pushing to the same remote as you fetch from; or + + - only the current branch to the branch with the same name, if you + are pushing to a remote that is not where you usually fetch from. + +Use the user preference configuration variable "push.default" to +change this. If you are an old-timer who is used to the "matching" +semantics, you can set the variable to "matching" to keep the +traditional behaviour. If you want to live in the future early, you +can set it to "simple" today without waiting for Git 2.0. + +When "git add -u" (and "git add -A") is run inside a subdirectory and +does not specify which paths to add on the command line, it +will operate on the entire tree in Git 2.0 for consistency +with "git commit -a" and other commands. There will be no +mechanism to make plain "git add -u" behave like "git add -u .". +Current users of "git add -u" (without a pathspec) should start +training their fingers to explicitly say "git add -u ." +before Git 2.0 comes. A warning is issued when these commands are +run without a pathspec and when you have local changes outside the +current directory, because the behaviour in Git 2.0 will be different +from today's version in such a situation. + +In Git 2.0, "git add <path>" will behave as "git add -A <path>", so +that "git add dir/" will notice paths you removed from the directory +and record the removal. Versions before Git 2.0, including this +release, will keep ignoring removals, but the users who rely on this +behaviour are encouraged to start using "git add --ignore-removal <path>" +now before 2.0 is released. + +The default prefix for "git svn" will change in Git 2.0. For a long +time, "git svn" created its remote-tracking branches directly under +refs/remotes, but it will place them under refs/remotes/origin/ unless +it is told otherwise with its --prefix option. + + +Updates since v1.8.5 +-------------------- + +Foreign interfaces, subsystems and ports. + + * The HTTP transport, when talking GSS-Negotiate, uses "100 + Continue" response to avoid having to rewind and resend a large + payload, which may not be always doable. + + * Various bugfixes to remote-bzr and remote-hg (in contrib/). + + * The build procedure is aware of MirBSD now. + + * Various "git p4", "git svn" and "gitk" updates. + + +UI, Workflows & Features + + * Fetching from a shallowly-cloned repository used to be forbidden, + primarily because the codepaths involved were not carefully vetted + and we did not bother supporting such usage. This release attempts + to allow object transfer out of a shallowly-cloned repository in a + more controlled way (i.e. the receiver becomes a shallow repository + with a truncated history). + + * Just like we give a reasonable default for "less" via the LESS + environment variable, we now specify a reasonable default for "lv" + via the "LV" environment variable when spawning the pager. + + * Two-level configuration variable names in "branch.*" and "remote.*" + hierarchies, whose variables are predominantly three-level, were + not completed by hitting a <TAB> in bash and zsh completions. + + * Fetching a 'frotz' branch with "git fetch", while a 'frotz/nitfol' + remote-tracking branch from an earlier fetch was still there, would + error out, primarily because the command was not told that it is + allowed to lose any information on our side. "git fetch --prune" + now can be used to remove 'frotz/nitfol' to make room for fetching and + storing the 'frotz' remote-tracking branch. + + * "diff.orderfile=<file>" configuration variable can be used to + pretend as if the "-O<file>" option were given from the command + line of "git diff", etc. + + * The negative pathspec syntax allows "git log -- . ':!dir'" to tell + us "I am interested in everything but 'dir' directory". + + * "git difftool" shows how many different paths there are in total, + and how many of them have been shown so far, to indicate progress. + + * "git push origin master" used to push our 'master' branch to update + the 'master' branch at the 'origin' repository. This has been + enhanced to use the same ref mapping "git push origin" would use to + determine what ref at the 'origin' to be updated with our 'master'. + For example, with this configuration + + [remote "origin"] + push = refs/heads/*:refs/review/* + + that would cause "git push origin" to push out our local branches + to corresponding refs under refs/review/ hierarchy at 'origin', + "git push origin master" would update 'refs/review/master' over + there. Alternatively, if push.default is set to 'upstream' and our + 'master' is set to integrate with 'topic' from the 'origin' branch, + running "git push origin" while on our 'master' would update their + 'topic' branch, and running "git push origin master" while on any + of our branches does the same. + + * "gitweb" learned to treat ref hierarchies other than refs/heads as + if they are additional branch namespaces (e.g. refs/changes/ in + Gerrit). + + * "git for-each-ref --format=..." learned a few formatting directives; + e.g. "%(color:red)%(HEAD)%(color:reset) %(refname:short) %(subject)". + + * The command string given to "git submodule foreach" is passed + directly to the shell, without being eval'ed. This is a backward + incompatible change that may break existing users. + + * "git log" and friends learned the "--exclude=<glob>" option, to + allow people to say "list history of all branches except those that + match this pattern" with "git log --exclude='*/*' --branches". + + * "git rev-parse --parseopt" learned a new "--stuck-long" option to + help scripts parse options with an optional parameter. + + * The "--tags" option to "git fetch" no longer tells the command to + fetch _only_ the tags. It instead fetches tags _in addition to_ + what are fetched by the same command line without the option. + + +Performance, Internal Implementation, etc. + + * When parsing a 40-hex string into the object name, the string is + checked to see if it can be interpreted as a ref so that a warning + can be given for ambiguity. The code kicked in even when the + core.warnambiguousrefs is set to false to squelch this warning, in + which case the cycles spent to look at the ref namespace were an + expensive no-op, as the result was discarded without being used. + + * The naming convention of the packfiles has been updated; it used to + be based on the enumeration of names of the objects that are + contained in the pack, but now it also depends on how the packed + result is represented---packing the same set of objects using + different settings (or delta order) would produce a pack with + different name. + + * "git diff --no-index" mode used to unnecessarily attempt to read + the index when there is one. + + * The deprecated parse-options macro OPT_BOOLEAN has been removed; + use OPT_BOOL or OPT_COUNTUP in new code. + + * A few duplicate implementations of prefix/suffix string comparison + functions have been unified to starts_with() and ends_with(). + + * The new PERLLIB_EXTRA makefile variable can be used to specify + additional directories Perl modules (e.g. the ones necessary to run + git-svn) are installed on the platform when building. + + * "git merge-base" learned the "--fork-point" mode, that implements + the same logic used in "git pull --rebase" to find a suitable fork + point out of the reflog entries for the remote-tracking branch the + work has been based on. "git rebase" has the same logic that can be + triggered with the "--fork-point" option. + + * A third-party "receive-pack" (the responder to "git push") can + advertise the "no-thin" capability to tell "git push" not to use + the thin-pack optimization. Our receive-pack has always been + capable of accepting and fattening a thin-pack, and will continue + not to ask "git push" to use a non-thin pack. + + +Also contains various documentation updates and code clean-ups. + + +Fixes since v1.8.5 +------------------ + +Unless otherwise noted, all the fixes since v1.8.5 in the maintenance +track are contained in this release (see the maintenance releases' notes +for details). + + * The pathspec matching code, while comparing two trees (e.g. "git + diff A B -- path1 path2") was too aggressive and failed to match + some paths when multiple pathspecs were involved. + + * "git repack --max-pack-size=8g" stopped being parsed correctly when + the command was reimplemented in C. + + * An earlier update in v1.8.4.x to "git rev-list --objects" with + negative ref had a performance regression. + (merge 200abe7 jk/mark-edges-uninteresting later to maint). + + * A recent update to "git send-email" broke platforms where + /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path + (e.g. Fedora rawhide). + + * A handful of bugs around interpreting $branch@{upstream} notation + and its lookalike, when $branch part has interesting characters, + e.g. "@", and ":", have been fixed. + + * "git clone" would fail to clone from a repository that has a ref + directly under "refs/", e.g. "refs/stash", because different + validation paths do different things on such a refname. Loosen the + client side's validation to allow such a ref. + + * "git log --left-right A...B" lost the "leftness" of commits + reachable from A when A is a tag as a side effect of a recent + bugfix. This is a regression in 1.8.4.x series. + + * documentations to "git pull" hinted there is an "-m" option because + it incorrectly shared the documentation with "git merge". + + * "git diff A B submod" and "git diff A B submod/" ought to have done + the same for a submodule "submod", but didn't. + + * "git clone $origin foo\bar\baz" on Windows failed to create the + leading directories (i.e. a moral-equivalent of "mkdir -p"). + + * "submodule.*.update=checkout", when propagated from .gitmodules to + .git/config, turned into a "submodule.*.update=none", which did not + make much sense. + (merge efa8fd7 fp/submodule-checkout-mode later to maint). + + * The implementation of 'git stash $cmd "stash@{...}"' did not quote + the stash argument properly and left it split at IFS whitespace. + + * The "--[no-]informative-errors" options to "git daemon" were parsed + a bit too loosely, allowing any other string after these option + names. + + * There is no reason to have a hardcoded upper limit for the number of + parents of an octopus merge, created via the graft mechanism, but + there was. + + * The basic test used to leave unnecessary trash directories in the + t/ directory. + (merge 738a8be jk/test-framework-updates later to maint). + + * "git merge-base --octopus" used to leave cleaning up suboptimal + result to the caller, but now it does the clean-up itself. + + * A "gc" process running as a different user should be able to stop a + new "gc" process from starting, but it didn't. + + * An earlier "clean-up" introduced an unnecessary memory leak. + + * "git add -A" (no other arguments) in a totally empty working tree + used to emit an error. + + * "git log --decorate" did not handle a tag pointed by another tag + nicely. + + * When we figure out how many file descriptors to allocate for + keeping packfiles open, a system with non-working getrlimit() could + cause us to die(), but because we make this call only to get a + rough estimate of how many are available and we do not even attempt + to use up all available file descriptors ourselves, it is nicer to + fall back to a reasonable low value rather than dying. + + * read_sha1_file(), that is the workhorse to read the contents given + an object name, honoured object replacements, but there was no + corresponding mechanism to sha1_object_info() that was used to + obtain the metainfo (e.g. type & size) about the object. This led + callers to weird inconsistencies. + (merge 663a856 cc/replace-object-info later to maint). + + * "git cat-file --batch=", an admittedly useless command, did not + behave very well. + + * "git rev-parse <revs> -- <paths>" did not implement the usual + disambiguation rules the commands in the "git log" family used in + the same way. + + * "git mv A B/", when B does not exist as a directory, should error + out, but it didn't. + + * A workaround to an old bug in glibc prior to glibc 2.17 has been + retired; this would remove a side effect of the workaround that + corrupts system error messages in non-C locales. + + * SSL-related options were not passed correctly to underlying socket + layer in "git send-email". + + * "git commit -v" appends the patch to the log message before + editing, and then removes the patch when the editor returned + control. However, the patch was not stripped correctly when the + first modified path was a submodule. + + * "git fetch --depth=0" was a no-op, and was silently ignored. + Diagnose it as an error. + + * Remote repository URLs expressed in scp-style host:path notation are + parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks + to connect to user's home directory on host at address ::1. + + * "git diff -- ':(icase)makefile'" was unnecessarily rejected at the + command line parser. + + * "git cat-file --batch-check=ok" did not check the existence of + the named object. + + * "git am --abort" sometimes complained about not being able to write + a tree with an 0{40} object in it. + + * Two processes creating loose objects at the same time could have + failed unnecessarily when the name of their new objects started + with the same byte value, due to a race condition. diff --git a/Documentation/RelNotes/2.0.0.txt b/Documentation/RelNotes/2.0.0.txt new file mode 100644 index 0000000000..0c71d9d54d --- /dev/null +++ b/Documentation/RelNotes/2.0.0.txt @@ -0,0 +1,207 @@ +Git v2.0 Release Notes +====================== + +Backward compatibility notes +---------------------------- + +When "git push [$there]" does not say what to push, we have used the +traditional "matching" semantics so far (all your branches were sent +to the remote as long as there already are branches of the same name +over there). In Git 2.0, the default is now the "simple" semantics, +which pushes: + + - only the current branch to the branch with the same name, and only + when the current branch is set to integrate with that remote + branch, if you are pushing to the same remote as you fetch from; or + + - only the current branch to the branch with the same name, if you + are pushing to a remote that is not where you usually fetch from. + +You can use the configuration variable "push.default" to change +this. If you are an old-timer who wants to keep using the +"matching" semantics, you can set the variable to "matching", for +example. Read the documentation for other possibilities. + +When "git add -u" and "git add -A" are run inside a subdirectory +without specifying which paths to add on the command line, they +operate on the entire tree for consistency with "git commit -a" and +other commands (these commands used to operate only on the current +subdirectory). Say "git add -u ." or "git add -A ." if you want to +limit the operation to the current directory. + +"git add <path>" is the same as "git add -A <path>" now, so that +"git add dir/" will notice paths you removed from the directory and +record the removal. In older versions of Git, "git add <path>" used +to ignore removals. You can say "git add --ignore-removal <path>" to +add only added or modified paths in <path>, if you really want to. + +The "-q" option to "git diff-files", which does *NOT* mean "quiet", +has been removed (it told Git to ignore deletion, which you can do +with "git diff-files --diff-filter=d"). + + +Updates since v1.9 series +------------------------- + +Foreign interfaces, subsystems and ports. + + +UI, Workflows & Features + + * The "simple" mode is the default for "git push". + + * "git add -u" and "git add -A", when run without any pathspec, is a + tree-wide operation even when run inside a subdirectory of a + working tree. + + * "git add <path> is the same as "git add -A <path>" now. + + * "core.statinfo" configuration variable, which is a + never-advertised synonym to "core.checkstat", has been removed. + + * The "-q" option to "git diff-files", which does *NOT* mean + "quiet", has been removed (it told Git to ignore deletion, which + you can do with "git diff-files --diff-filter=d"). + + * Server operators can loosen the "tips of refs only" restriction for + the remote archive service with the uploadarchive.allowUnreachable + configuration option. + + * The progress indicators from various time-consuming commands have + been marked for i18n/l10n. + + * "git notes -C <blob>" diagnoses an attempt to use an object that + is not a blob as an error. + + * "git config" learned to read from the standard input when "-" is + given as the value to its "--file" parameter (attempting an + operation to update the configuration in the standard input of + course is rejected). + + * Trailing whitespaces in .gitignore files, unless they are quoted + for fnmatch(3), e.g. "path\ ", are warned and ignored. Strictly + speaking, this is a backward incompatible change, but very unlikely + to bite any sane user and adjusting should be obvious and easy. + + * Many commands that create commits, e.g. "pull", "rebase", + learned to take the --gpg-sign option on the command line. + + * "git commit" can be told to always GPG sign the resulting commit + by setting "commit.gpgsign" configuration variable to true (the + command line option --no-gpg-sign should override it). + + * "git pull" can be told to only accept fast-forward by setting the + new "pull.ff" configuration. + + * "git reset" learned "-N" option, which does not reset the index + fully for paths the index knows about but the tree-ish the command + resets to does not (these paths are kept as intend-to-add entries). + + * Newly cloned submodule repositories by "git submodule update", + when the "checkout" update mode is used, will be on a local + branch instead of on a detached HEAD, just like submodules added + with "git submodule add". + + +Performance, Internal Implementation, etc. + + * We started using wildmatch() in place of fnmatch(3) a few releases + ago; complete the process and stop using fnmatch(3). + + * Uses of curl's "multi" interface and "easy" interface do not mix + well when we attempt to reuse outgoing connections. Teach the RPC + over http code, used in the smart HTTP transport, not to use the + "easy" interface. + + * The bitmap-index feature from JGit has been ported, which should + significantly improve performance when serving objects form a + repository that uses it. + + * The way "git log --cc" shows a combined diff against multiple + parents have been optimized. + + * The prefixcmp() and suffixcmp() functions are gone. Use + starts_with() and ends_with(), and also consider if skip_prefix() + suits your needs better when using the former. + + +Also contains various documentation updates and code clean-ups. Many +of them came from flurry of activities as GSoC candidate microproject +exercises. + + +Fixes since v1.9 series +----------------------- + +Unless otherwise noted, all the fixes since v1.9 in the maintenance +track are contained in this release (see the maintenance releases' +notes for details). + + * "git difftool" misbehaved when the repository is bound to the + working tree with the ".git file" mechanism, where a textual file + ".git" tells us where it is. + (merge fcfec8b da/difftool-git-files later to maint). + + * "git push" did not pay attention to branch.*.pushremote if it is + defined earlier than remote.pushdefault; the order of these two + variables in the configuration file should not matter, but it did + by mistake. + (merge 98b406f jk/remote-pushremote-config-reading later to maint). + + * Codepaths that parse timestamps in commit objects have been + tightened. + (merge 3f419d4 jk/commit-dates-parsing-fix later to maint). + + * "git diff --external-diff" incorrectly fed the submodule directory + in the working tree to the external diff driver when it knew it is + the same as one of the versions being compared. + (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint). + + * "git reset" needs to refresh the index when working in a working + tree (it can also be used to match the index to the HEAD in an + otherwise bare repository), but it failed to set up the working + tree properly, causing GIT_WORK_TREE to be ignored. + (merge b7756d4 nd/reset-setup-worktree later to maint). + + * "git check-attr" when working on a repository with a working tree + did not work well when the working tree was specified via the + --work-tree (and obviously with --git-dir) option. + (merge cdbf623 jc/check-attr-honor-working-tree later to maint). + + * "merge-recursive" was broken in 1.7.7 era and stopped working in + an empty (temporary) working tree, when there are renames + involved. This has been corrected. + (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.) + + * "git rev-parse" was loose in rejecting command line arguments + that do not make sense, e.g. "--default" without the required + value for that option. + (merge a43219f ds/rev-parse-required-args later to maint.) + + * include.path variable (or any variable that expects a path that + can use ~username expansion) in the configuration file is not a + boolean, but the code failed to check it. + (merge 67beb60 jk/config-path-include-fix later to maint.) + + * Commands that take pathspecs on the command line misbehaved when + the pathspec is given as an absolute pathname (which is a + practice not particularly encouraged) that points at a symbolic + link in the working tree. + (merge later 655ee9e mw/symlinks to maint.) + + * "git diff --quiet -- pathspec1 pathspec2" sometimes did not return + correct status value. + (merge f34b205 nd/diff-quiet-stat-dirty later to maint.) + + * Attempting to deepen a shallow repository by fetching over smart + HTTP transport failed in the protocol exchange, when no-done + extension was used. The fetching side waited for the list of + shallow boundary commits after the sending end stopped talking to + it. + (merge 0232852 nd/http-fetch-shallow-fix later to maint.) + + * Allow "git cmd path/", when the 'path' is where a submodule is + bound to the top-level working tree, to match 'path', despite the + extra and unnecessary trailing slash (such a slash is often + given by command line completion). + (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.) diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 705557689d..e6d46edbe7 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -139,8 +139,15 @@ People on the Git mailing list need to be able to read and comment on the changes you are submitting. It is important for a developer to be able to "quote" your changes, using standard e-mail tools, so that they may comment on specific portions of -your code. For this reason, all patches should be submitted -"inline". If your log message (including your name on the +your code. For this reason, each patch should be submitted +"inline" in a separate message. + +Multiple related patches should be grouped into their own e-mail +thread to help readers find all parts of the series. To that end, +send them as replies to either an additional "cover letter" message +(see below), the first patch, or the respective preceding patch. + +If your log message (including your name on the Signed-off-by line) is not writable in ASCII, make sure that you send off a message in the correct encoding. diff --git a/Documentation/config.txt b/Documentation/config.txt index ab26963d61..79e576878a 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -142,19 +142,13 @@ advice.*:: -- pushUpdateRejected:: Set this variable to 'false' if you want to disable - 'pushNonFFCurrent', 'pushNonFFDefault', + 'pushNonFFCurrent', 'pushNonFFMatching', 'pushAlreadyExists', 'pushFetchFirst', and 'pushNeedsForce' simultaneously. pushNonFFCurrent:: Advice shown when linkgit:git-push[1] fails due to a non-fast-forward update to the current branch. - pushNonFFDefault:: - Advice to set 'push.default' to 'upstream' or 'current' - when you ran linkgit:git-push[1] and pushed 'matching - refs' by default (i.e. you did not provide an explicit - refspec, and no 'push.default' configuration was set) - and it resulted in a non-fast-forward error. pushNonFFMatching:: Advice shown when you ran linkgit:git-push[1] and pushed 'matching refs' explicitly (i.e. you used ':', or @@ -567,6 +561,10 @@ be passed to the shell by Git, which will translate the final command to `LESS=FRSX less -+S`. The environment tells the command to set the `S` option to chop long lines but the command line resets it to the default to fold long lines. ++ +Likewise, when the `LV` environment variable is unset, Git sets it +to `-c`. You can override this setting by exporting `LV` with +another value or setting `core.pager` to `lv +c`. core.whitespace:: A comma separated list of common whitespace problems to @@ -988,6 +986,14 @@ commit.cleanup:: have to remove the help lines that begin with `#` in the commit log template yourself, if you do this). +commit.gpgsign:: + + A boolean to specify whether all commits should be GPG signed. + Use of this option when doing operations such as rebase can + result in a large number of commits being signed. It may be + convenient to use an agent to avoid typing your GPG passphrase + several times. + commit.status:: A boolean to enable/disable inclusion of status information in the commit message template when using an editor to prepare the commit @@ -1163,6 +1169,10 @@ gc.autopacklimit:: --auto` consolidates them into one larger pack. The default value is 50. Setting this to 0 disables it. +gc.autodetach:: + Make `git gc --auto` return immediately andrun in background + if the system supports it. Default is true. + gc.packrefs:: Running `git pack-refs` in a repository renders it unclonable by Git versions prior to 1.5.1.2 over dumb @@ -1597,6 +1607,10 @@ imap:: The configuration variables in the 'imap' section are described in linkgit:git-imap-send[1]. +index.version:: + Specify the version with which new index files should be + initialized. This does not affect existing repositories. + init.templatedir:: Specify the directory from which templates will be copied. (See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].) @@ -1629,7 +1643,7 @@ interactive.singlekey:: linkgit:git-add[1], linkgit:git-checkout[1], linkgit:git-commit[1], linkgit:git-reset[1], and linkgit:git-stash[1]. Note that this setting is silently ignored if portable keystroke input - is not available. + is not available; requires the Perl module Term::ReadKey. log.abbrevCommit:: If true, makes linkgit:git-log[1], linkgit:git-show[1], and @@ -1858,6 +1872,31 @@ pack.packSizeLimit:: Common unit suffixes of 'k', 'm', or 'g' are supported. +pack.useBitmaps:: + When true, git will use pack bitmaps (if available) when packing + to stdout (e.g., during the server side of a fetch). Defaults to + true. You should not generally need to turn this off unless + you are debugging pack bitmaps. + +pack.writebitmaps:: + When true, git will write a bitmap index when packing all + objects to disk (e.g., when `git repack -a` is run). This + index can speed up the "counting objects" phase of subsequent + packs created for clones and fetches, at the cost of some disk + space and extra time spent on the initial repack. Defaults to + false. + +pack.writeBitmapHashCache:: + When true, git will include a "hash cache" section in the bitmap + index (if one is written). This cache can be used to feed git's + delta heuristics, potentially leading to better deltas between + bitmapped and non-bitmapped objects (e.g., when serving a fetch + between an older, bitmapped pack and objects that have been + pushed since the last gc). The downside is that it consumes 4 + bytes per object of disk space, and that JGit's bitmap + implementation does not understand it, causing it to complain if + Git and JGit are used on the same repository. Defaults to false. + pager.<cmd>:: If the value is boolean, turns on or off pagination of the output of a particular Git subcommand when writing to a tty. @@ -1877,6 +1916,16 @@ pretty.<name>:: Note that an alias with the same name as a built-in format will be silently ignored. +pull.ff:: + By default, Git does not create an extra merge commit when merging + a commit that is a descendant of the current commit. Instead, the + tip of the current branch is fast-forwarded. When set to `false`, + this variable tells Git to create an extra merge commit in such + a case (equivalent to giving the `--no-ff` option from the command + line). When set to `only`, only such fast-forward merges are + allowed (equivalent to giving the `--ff-only` option from the + command line). + pull.rebase:: When true, rebase branches on top of the fetched branch, instead of merging the default branch from the default remote when "git @@ -1929,7 +1978,7 @@ When pushing to a remote that is different from the remote you normally pull from, work as `current`. This is the safest option and is suited for beginners. + -This mode will become the default in Git 2.0. +This mode has become the default in Git 2.0. * `matching` - push all branches having the same name on both ends. This makes the repository you are pushing to remember the set of @@ -1948,8 +1997,8 @@ suitable for pushing into a shared central repository, as other people may add new branches there, or update the tip of existing branches outside your control. + -This is currently the default, but Git 2.0 will change the default -to `simple`. +This used to be the default, but not since Git 2.0 (`simple` is the +new default). -- @@ -2026,6 +2075,10 @@ receive.updateserverinfo:: If set to true, git-receive-pack will run git-update-server-info after receiving data from git-push and updating refs. +receive.shallowupdate:: + If set to true, .git/shallow can be updated when new refs + require new shallow roots. Otherwise those refs are rejected. + remote.pushdefault:: The remote to push to by default. Overrides `branch.<name>.remote` for all branches, and is overridden by @@ -2087,8 +2140,8 @@ remote.<name>.vcs:: remote.<name>.prune:: When set to true, fetching from this remote by default will also - remove any remote-tracking branches which no longer exist on the - remote (as if the `--prune` option was give on the command line). + remove any remote-tracking references that no longer exist on the + remote (as if the `--prune` option was given on the command line). Overrides `fetch.prune` settings, if any. remotes.<group>:: @@ -2283,6 +2336,13 @@ transfer.unpackLimit:: not set, the value of this variable is used instead. The default value is 100. +uploadarchive.allowUnreachable:: + If true, allow clients to use `git archive --remote` to request + any tree, whether reachable from the ref tips or not. See the + discussion in the `SECURITY` section of + linkgit:git-upload-archive[1] for more details. Defaults to + `false`. + uploadpack.hiderefs:: String(s) `upload-pack` uses to decide which refs to omit from its initial advertisement. Use more than one diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt index c000f08a9d..ccd1fc8122 100644 --- a/Documentation/date-formats.txt +++ b/Documentation/date-formats.txt @@ -8,9 +8,9 @@ endif::git-commit[] support the following date formats: Git internal format:: - It is `<unix timestamp> <timezone offset>`, where `<unix + It is `<unix timestamp> <time zone offset>`, where `<unix timestamp>` is the number of seconds since the UNIX epoch. - `<timezone offset>` is a positive or negative offset from UTC. + `<time zone offset>` is a positive or negative offset from UTC. For example CET (which is 2 hours ahead UTC) is `+0200`. RFC 2822:: diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt index 223b9310df..f07b4513ed 100644 --- a/Documentation/diff-config.txt +++ b/Documentation/diff-config.txt @@ -98,6 +98,11 @@ diff.mnemonicprefix:: diff.noprefix:: If set, 'git diff' does not show any source or destination prefix. +diff.orderfile:: + File indicating how to order files within a diff, using + one shell glob pattern per line. + Can be overridden by the '-O' option to linkgit:git-diff[1]. + diff.renameLimit:: The number of files to consider when performing the copy/rename detection; equivalent to the 'git diff' option '-l'. diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index bbed2cd79c..9b37b2a10b 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -432,6 +432,9 @@ endif::git-format-patch[] -O<orderfile>:: Output the patch in the order specified in the <orderfile>, which has one shell glob pattern per line. + This overrides the `diff.orderfile` configuration variable + (see linkgit:git-config[1]). To cancel `diff.orderfile`, + use `-O/dev/null`. ifndef::git-format-patch[] -R:: diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index ba1fe49582..92c68c3fda 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -14,8 +14,18 @@ branch history. Tags for the deepened commits are not fetched. --unshallow:: - Convert a shallow repository to a complete one, removing all - the limitations imposed by shallow repositories. + If the source repository is complete, convert a shallow + repository to a complete one, removing all the limitations + imposed by shallow repositories. ++ +If the source repository is shallow, fetch as much as possible so that +the current repository has the same history as the source repository. + +--update-shallow:: + By default when fetching from a shallow repository, + `git fetch` refuses refs that require updating + .git/shallow. This option updates .git/shallow and accept such + refs. ifndef::git-pull[] --dry-run:: @@ -41,17 +51,20 @@ ifndef::git-pull[] -p:: --prune:: - After fetching, remove any remote-tracking branches which - no longer exist on the remote. + After fetching, remove any remote-tracking references that no + longer exist on the remote. Tags are not subject to pruning + if they are fetched only because of the default tag + auto-following or due to a --tags option. However, if tags + are fetched due to an explicit refspec (either on the command + line or in the remote configuration, for example if the remote + was cloned with the --mirror option), then they are also + subject to pruning. endif::git-pull[] -ifdef::git-pull[] ---no-tags:: -endif::git-pull[] ifndef::git-pull[] -n:: ---no-tags:: endif::git-pull[] +--no-tags:: By default, tags that point at objects that are downloaded from the remote repository are fetched and stored locally. This option disables this automatic tag following. The default @@ -61,11 +74,12 @@ endif::git-pull[] ifndef::git-pull[] -t:: --tags:: - This is a short-hand for giving `refs/tags/*:refs/tags/*` - refspec from the command line, to ask all tags to be fetched - and stored locally. Because this acts as an explicit - refspec, the default refspecs (configured with the - remote.$name.fetch variable) are overridden and not used. + Fetch all tags from the remote (i.e., fetch remote tags + `refs/tags/*` into local tags with the same name), in addition + to whatever else would otherwise be fetched. Using this + option alone does not subject tags to pruning, even if --prune + is used (though tags may be pruned anyway if they are also the + destination of an explicit refspec; see '--prune'). --recurse-submodules[=yes|on-demand|no]:: This option controls if and under what conditions new commits of diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 48754cbc67..895922e27c 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -53,8 +53,14 @@ OPTIONS Files to add content from. Fileglobs (e.g. `*.c`) can be given to add all matching files. Also a leading directory name (e.g. `dir` to add `dir/file1` - and `dir/file2`) can be given to add all files in the - directory, recursively. + and `dir/file2`) can be given to update the index to + match the current state of the directory as a whole (e.g. + specifying `dir` will record not just a file `dir/file1` + modified in the working tree, a file `dir/file2` added to + the working tree, but also a file `dir/file3` removed from + the working tree. Note that older versions of Git used + to ignore removed files; use `--no-all` option if you want + to add modified or new files but ignore removed ones. -n:: --dry-run:: @@ -104,10 +110,10 @@ apply to the index. See EDITING PATCHES below. <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files. + -If no <pathspec> is given, the current version of Git defaults to -"."; in other words, update all tracked files in the current directory -and its subdirectories. This default will change in a future version -of Git, hence the form without <pathspec> should not be used. +If no <pathspec> is given when `-u` option is used, all +tracked files in the entire working tree are updated (old versions +of Git used to limit the update to the current directory and its +subdirectories). -A:: --all:: @@ -117,10 +123,10 @@ of Git, hence the form without <pathspec> should not be used. entry. This adds, modifies, and removes index entries to match the working tree. + -If no <pathspec> is given, the current version of Git defaults to -"."; in other words, update all files in the current directory -and its subdirectories. This default will change in a future version -of Git, hence the form without <pathspec> should not be used. +If no <pathspec> is given when `-A` option is used, all +files in the entire working tree are updated (old versions +of Git used to limit the update to the current directory and its +subdirectories). --no-all:: --ignore-removal:: @@ -129,11 +135,9 @@ of Git, hence the form without <pathspec> should not be used. files that have been removed from the working tree. This option is a no-op when no <pathspec> is used. + -This option is primarily to help the current users of Git, whose -"git add <pathspec>..." ignores removed files. In future versions -of Git, "git add <pathspec>..." will be a synonym to "git add -A -<pathspec>..." and "git add --ignore-removal <pathspec>..." will behave like -today's "git add <pathspec>...", ignoring removed files. +This option is primarily to help users who are used to older +versions of Git, whose "git add <pathspec>..." was a synonym +for "git add --no-all <pathspec>...", i.e. ignored removed files. -N:: --intent-to-add:: diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 54d8461d61..a2b97582fe 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -14,7 +14,7 @@ SYNOPSIS [--ignore-date] [--ignore-space-change | --ignore-whitespace] [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>] [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet] - [--[no-]scissors] + [--[no-]scissors] [-S[<keyid>]] [(<mbox> | <Maildir>)...] 'git am' (--continue | --skip | --abort) @@ -119,6 +119,10 @@ default. You can use `--no-utf8` to override this. Skip the current patch. This is only meaningful when restarting an aborted patch. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: + GPG-sign commits. + --continue:: -r:: --resolved:: @@ -189,6 +193,11 @@ commits, like running 'git am' on the wrong branch or an error in the commits that is more easily fixed by changing the mailbox (e.g. errors in the "From:" lines). +HOOKS +----- +This command can run `applypatch-msg`, `pre-applypatch`, +and `post-applypatch` hooks. See linkgit:githooks[5] for more +information. SEE ALSO -------- diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt index b97aaab4ed..cfa1e4ebe4 100644 --- a/Documentation/git-archive.txt +++ b/Documentation/git-archive.txt @@ -65,7 +65,10 @@ OPTIONS --remote=<repo>:: Instead of making a tar archive from the local repository, - retrieve a tar archive from a remote repository. + retrieve a tar archive from a remote repository. Note that the + remote repository may place restrictions on which sha1 + expressions may be allowed in `<tree-ish>`. See + linkgit:git-upload-archive[1] for details. --exec=<git-upload-archive>:: Used with --remote to specify the path to the diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index f2c85cc633..9f23a861ce 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -35,7 +35,8 @@ Apart from supporting file annotation, Git also supports searching the development history for when a code snippet occurred in a change. This makes it possible to track when a code snippet was added to a file, moved or copied between files, and eventually deleted or replaced. It works by searching for -a text string in the diff. A small example: +a text string in the diff. A small example of the pickaxe interface +that searches for `blame_usage`: ----------------------------------------------------------------------------- $ git log --pretty=oneline -S'blame_usage' @@ -103,7 +104,7 @@ This header line is followed by the following information at least once for each commit: - the author name ("author"), email ("author-mail"), time - ("author-time"), and timezone ("author-tz"); similarly + ("author-time"), and time zone ("author-tz"); similarly for committer. - the filename in the commit that the line is attributed to. - the first line of the commit log message ("summary"). diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt index 322f5ed315..f6a16f4300 100644 --- a/Documentation/git-cat-file.txt +++ b/Documentation/git-cat-file.txt @@ -109,6 +109,11 @@ newline. The available atoms are: The size, in bytes, that the object takes up on disk. See the note about on-disk sizes in the `CAVEATS` section below. +`deltabase`:: + If the object is stored as a delta on-disk, this expands to the + 40-hex sha1 of the delta base object. Otherwise, expands to the + null sha1 (40 zeroes). See `CAVEATS` below. + `rest`:: If this atom is used in the output string, input lines are split at the first whitespace boundary. All characters before that @@ -152,10 +157,11 @@ should be taken in drawing conclusions about which refs or objects are responsible for disk usage. The size of a packed non-delta object may be much larger than the size of objects which delta against it, but the choice of which object is the base and which is the delta is arbitrary -and is subject to change during a repack. Note also that multiple copies -of an object may be present in the object database; in this case, it is -undefined which copy's size will be reported. +and is subject to change during a repack. +Note also that multiple copies of an object may be present in the object +database; in this case, it is undefined which copy's size or delta base +will be reported. GIT --- diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 91294f89c8..33ad2adf5c 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -232,8 +232,8 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. commit, your HEAD becomes "detached" and you are no longer on any branch (see below for details). + -As a special case, the `"@{-N}"` syntax for the N-th last branch -checks out the branch (instead of detaching). You may also specify +As a special case, the `"@{-N}"` syntax for the N-th last branch/commit +checks out branches (instead of detaching). You may also specify `-` which is synonymous with `"@{-1}"`. + As a further special case, you may use `"A...B"` as a shortcut for the diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index c205d2363e..f1e6b2fd6d 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -8,7 +8,8 @@ git-cherry-pick - Apply the changes introduced by some existing commits SYNOPSIS -------- [verse] -'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>... +'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] + [-S[<keyid>]] <commit>... 'git cherry-pick' --continue 'git cherry-pick' --quit 'git cherry-pick' --abort @@ -100,6 +101,10 @@ effect to your index in a row. --signoff:: Add Signed-off-by line at the end of the commit message. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: + GPG-sign commits. + --ff:: If the current HEAD is the same as the parent of the cherry-pick'ed commit, then a fast forward to this commit will diff --git a/Documentation/git-cherry.txt b/Documentation/git-cherry.txt index 2d0daae626..0ea921a593 100644 --- a/Documentation/git-cherry.txt +++ b/Documentation/git-cherry.txt @@ -3,7 +3,7 @@ git-cherry(1) NAME ---- -git-cherry - Find commits not merged upstream +git-cherry - Find commits yet to be applied to upstream SYNOPSIS -------- @@ -12,46 +12,26 @@ SYNOPSIS DESCRIPTION ----------- -The changeset (or "diff") of each commit between the fork-point and <head> -is compared against each commit between the fork-point and <upstream>. -The diffs are compared after removing any whitespace and line numbers. +Determine whether there are commits in `<head>..<upstream>` that are +equivalent to those in the range `<limit>..<head>`. -Every commit that doesn't exist in the <upstream> branch -has its id (sha1) reported, prefixed by a symbol. The ones that have -equivalent change already -in the <upstream> branch are prefixed with a minus (-) sign, and those -that only exist in the <head> branch are prefixed with a plus (+) symbol: - - __*__*__*__*__> <upstream> - / - fork-point - \__+__+__-__+__+__-__+__> <head> - - -If a <limit> has been given then the commits along the <head> branch up -to and including <limit> are not reported: - - __*__*__*__*__> <upstream> - / - fork-point - \__*__*__<limit>__-__+__> <head> - - -Because 'git cherry' compares the changeset rather than the commit id -(sha1), you can use 'git cherry' to find out if a commit you made locally -has been applied <upstream> under a different commit id. For example, -this will happen if you're feeding patches <upstream> via email rather -than pushing or pulling commits directly. +The equivalence test is based on the diff, after removing whitespace +and line numbers. git-cherry therefore detects when commits have been +"copied" by means of linkgit:git-cherry-pick[1], linkgit:git-am[1] or +linkgit:git-rebase[1]. +Outputs the SHA1 of every commit in `<limit>..<head>`, prefixed with +`-` for commits that have an equivalent in <upstream>, and `+` for +commits that do not. OPTIONS ------- -v:: - Verbose. + Show the commit subjects next to the SHA1s. <upstream>:: - Upstream branch to compare against. - Defaults to the first tracked remote branch, if available. + Upstream branch to search for equivalent commits. + Defaults to the upstream branch of HEAD. <head>:: Working branch; defaults to HEAD. @@ -59,6 +39,103 @@ OPTIONS <limit>:: Do not report commits up to (and including) limit. +EXAMPLES +-------- + +Patch workflows +~~~~~~~~~~~~~~~ + +git-cherry is frequently used in patch-based workflows (see +linkgit:gitworkflows[7]) to determine if a series of patches has been +applied by the upstream maintainer. In such a workflow you might +create and send a topic branch like this: + +------------ +$ git checkout -b topic origin/master +# work and create some commits +$ git format-patch origin/master +$ git send-email ... 00* +------------ + +Later, you can see whether your changes have been applied by saying +(still on `topic`): + +------------ +$ git fetch # update your notion of origin/master +$ git cherry -v +------------ + +Concrete example +~~~~~~~~~~~~~~~~ + +In a situation where topic consisted of three commits, and the +maintainer applied two of them, the situation might look like: + +------------ +$ git log --graph --oneline --decorate --boundary origin/master...topic +* 7654321 (origin/master) upstream tip commit +[... snip some other commits ...] +* cccc111 cherry-pick of C +* aaaa111 cherry-pick of A +[... snip a lot more that has happened ...] +| * cccc000 (topic) commit C +| * bbbb000 commit B +| * aaaa000 commit A +|/ +o 1234567 branch point +------------ + +In such cases, git-cherry shows a concise summary of what has yet to +be applied: + +------------ +$ git cherry origin/master topic +- cccc000... commit C ++ bbbb000... commit B +- aaaa000... commit A +------------ + +Here, we see that the commits A and C (marked with `-`) can be +dropped from your `topic` branch when you rebase it on top of +`origin/master`, while the commit B (marked with `+`) still needs to +be kept so that it will be sent to be applied to `origin/master`. + + +Using a limit +~~~~~~~~~~~~~ + +The optional <limit> is useful in cases where your topic is based on +other work that is not in upstream. Expanding on the previous +example, this might look like: + +------------ +$ git log --graph --oneline --decorate --boundary origin/master...topic +* 7654321 (origin/master) upstream tip commit +[... snip some other commits ...] +* cccc111 cherry-pick of C +* aaaa111 cherry-pick of A +[... snip a lot more that has happened ...] +| * cccc000 (topic) commit C +| * bbbb000 commit B +| * aaaa000 commit A +| * 0000fff (base) unpublished stuff F +[... snip ...] +| * 0000aaa unpublished stuff A +|/ +o 1234567 merge-base between upstream and topic +------------ + +By specifying `base` as the limit, you can avoid listing commits +between `base` and `topic`: + +------------ +$ git cherry origin/master topic base +- cccc000... commit C ++ bbbb000... commit B +- aaaa000... commit A +------------ + + SEE ALSO -------- linkgit:git-patch-id[1] diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 450f158779..0363d0039b 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -55,15 +55,12 @@ repository is specified as a URL, then this flag is ignored (and we never use the local optimizations). Specifying `--no-local` will override the default when `/path/to/repo` is given, using the regular Git transport instead. -+ -To force copying instead of hardlinking (which may be desirable if you -are trying to make a back-up of your repository), but still avoid the -usual "Git aware" transport mechanism, `--no-hardlinks` can be used. --no-hardlinks:: - Optimize the cloning process from a repository on a - local filesystem by copying files under `.git/objects` - directory. + Force the cloning process from a repository on a local + filesystem to copy the files under the `.git/objects` + directory instead of using hardlinks. This may be desirable + if you are trying to make a back-up of your repository. --shared:: -s:: @@ -181,12 +178,7 @@ objects from the source repository into a pack in the cloned repository. --depth <depth>:: Create a 'shallow' clone with a history truncated to the - specified number of revisions. A shallow repository has a - number of limitations (you cannot clone or fetch from - it, nor push from nor into it), but is adequate if you - are only interested in the recent history of a large project - with a long history, and would want to send in fixes - as patches. + specified number of revisions. --[no-]single-branch:: Clone only the history leading to the tip of a single branch, @@ -213,7 +205,7 @@ objects from the source repository into a pack in the cloned repository. --separate-git-dir=<git dir>:: Instead of placing the cloned repository where it is supposed to be, place the cloned repository at the specified directory, - then make a filesytem-agnostic Git symbolic link to there. + then make a filesystem-agnostic Git symbolic link to there. The result is Git repository can be separated from working tree. diff --git a/Documentation/git-column.txt b/Documentation/git-column.txt index 5d6f1cc464..03d18465d4 100644 --- a/Documentation/git-column.txt +++ b/Documentation/git-column.txt @@ -43,11 +43,6 @@ OPTIONS --padding=<N>:: The number of spaces between columns. One space by default. - -Author ------- -Written by Nguyen Thai Ngoc Duy <pclouds@gmail.com> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt index cafdc9642d..a469eab066 100644 --- a/Documentation/git-commit-tree.txt +++ b/Documentation/git-commit-tree.txt @@ -55,8 +55,13 @@ OPTIONS from the standard input. -S[<keyid>]:: +--gpg-sign[=<keyid>]:: GPG-sign commit. +--no-gpg-sign:: + Countermand `commit.gpgsign` configuration variable that is + set to force each and every commit to be signed. + Commit Information ------------------ diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 1a7616c73a..7c42e9cabc 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -302,6 +302,10 @@ configuration variable documented in linkgit:git-config[1]. --gpg-sign[=<keyid>]:: GPG-sign commit. +--no-gpg-sign:: + Countermand `commit.gpgsign` configuration variable that is + set to force each and every commit to be signed. + \--:: Do not interpret any more arguments as options. diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt index d1bcda28f4..260f39fd40 100644 --- a/Documentation/git-cvsimport.txt +++ b/Documentation/git-cvsimport.txt @@ -21,8 +21,8 @@ DESCRIPTION *WARNING:* `git cvsimport` uses cvsps version 2, which is considered deprecated; it does not work with cvsps version 3 and later. If you are performing a one-shot import of a CVS repository consider using -link:http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or -link:https://github.com/BartMassey/parsecvs[parsecvs]. +http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or +https://github.com/BartMassey/parsecvs[parsecvs]. Imports a CVS repository into Git. It will either create a new repository, or incrementally import into an existing one. @@ -144,7 +144,7 @@ This option can be used several times to provide several detection regexes. CVS by default uses the Unix username when writing its commit logs. Using this option and an author-conv-file maps the name recorded in CVS to author name, e-mail and - optional timezone: + optional time zone: + --------- exon=Andreas Ericsson <ae@op5.se> @@ -154,7 +154,7 @@ This option can be used several times to provide several detection regexes. + 'git cvsimport' will make it appear as those authors had their GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL set properly -all along. If a timezone is specified, GIT_AUTHOR_DATE will +all along. If a time zone is specified, GIT_AUTHOR_DATE will have the corresponding offset applied. + For convenience, this data is saved to `$GIT_DIR/cvs-authors` diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt index 33fbd8c56f..56fb7e5322 100644 --- a/Documentation/git-diff.txt +++ b/Documentation/git-diff.txt @@ -44,7 +44,7 @@ two blob objects, or changes between two files on disk. commit relative to the named <commit>. Typically you would want comparison with the latest commit, so if you do not give <commit>, it defaults to HEAD. - If HEAD does not exist (e.g. unborned branches) and + If HEAD does not exist (e.g. unborn branches) and <commit> is not given, it shows all staged changes. --staged is a synonym of --cached. diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index 73f980638e..fd22a9a0c1 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -251,7 +251,7 @@ advisement to help formatting routines display the timestamp. If the local offset is not available in the source material, use ``+0000'', or the most common local offset. For example many organizations have a CVS repository which has only ever been accessed -by users who are located in the same location and timezone. In this +by users who are located in the same location and time zone. In this case a reasonable offset from UTC could be assumed. + Unlike the `rfc2822` format, this format is very strict. Any @@ -271,7 +271,7 @@ the malformed string. There are also some types of malformed strings which Git will parse wrong, and yet consider valid. Seriously malformed strings will be rejected. + -Unlike the `raw` format above, the timezone/UTC offset information +Unlike the `raw` format above, the time zone/UTC offset information contained in an RFC 2822 date string is used to adjust the date value to UTC prior to storage. Therefore it is important that this information be as accurate as possible. @@ -287,13 +287,13 @@ format, or its format is easily convertible to it, as there is no ambiguity in parsing. `now`:: - Always use the current time and timezone. The literal + Always use the current time and time zone. The literal `now` must always be supplied for `<when>`. + -This is a toy format. The current time and timezone of this system +This is a toy format. The current time and time zone of this system is always copied into the identity string at the time it is being created by fast-import. There is no way to specify a different time or -timezone. +time zone. + This particular format is supplied as it's short to implement and may be useful to a process that wants to create a new commit diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.txt index 444b805d35..93b5067946 100644 --- a/Documentation/git-fetch-pack.txt +++ b/Documentation/git-fetch-pack.txt @@ -12,7 +12,7 @@ SYNOPSIS 'git fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] - [-v] [<host>:]<directory> [<refs>...] + [-v] <repository> [<refs>...] DESCRIPTION ----------- @@ -97,19 +97,18 @@ be in a separate packet, and the list must end with a flush packet. -v:: Run verbosely. -<host>:: - A remote host that houses the repository. When this - part is specified, 'git-upload-pack' is invoked via - ssh. - -<directory>:: - The repository to sync from. +<repository>:: + The URL to the remote repository. <refs>...:: The remote heads to update from. This is relative to $GIT_DIR (e.g. "HEAD", "refs/heads/master"). When unspecified, update from all heads the remote side has. +SEE ALSO +-------- +linkgit:git-fetch[1] + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt index e08a028946..5809aa4eb9 100644 --- a/Documentation/git-fetch.txt +++ b/Documentation/git-fetch.txt @@ -24,19 +24,22 @@ The ref names and their object names of fetched refs are stored in `.git/FETCH_HEAD`. This information is left for a later merge operation done by 'git merge'. -When <refspec> stores the fetched result in remote-tracking branches, -the tags that point at these branches are automatically -followed. This is done by first fetching from the remote using -the given <refspec>s, and if the repository has objects that are -pointed by remote tags that it does not yet have, then fetch -those missing tags. If the other end has tags that point at -branches you are not interested in, you will not get them. +By default, tags are auto-followed. This means that when fetching +from a remote, any tags on the remote that point to objects that exist +in the local repository are fetched. The effect is to fetch tags that +point at branches that you are interested in. This default behavior +can be changed by using the --tags or --no-tags options, by +configuring remote.<name>.tagopt, or by using a refspec that fetches +tags explicitly. 'git fetch' can fetch from either a single named repository, or from several repositories at once if <group> is given and there is a remotes.<group> entry in the configuration file. (See linkgit:git-config[1]). +When no remote is specified, by default the `origin` remote will be used, +unless there's an upstream branch configured for the current branch. + OPTIONS ------- include::fetch-options.txt[] diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt index e4c8e82660..09535f2a08 100644 --- a/Documentation/git-filter-branch.txt +++ b/Documentation/git-filter-branch.txt @@ -393,7 +393,7 @@ git filter-branch --index-filter \ Checklist for Shrinking a Repository ------------------------------------ -git-filter-branch is often used to get rid of a subset of files, +git-filter-branch can be used to get rid of a subset of files, usually with some combination of `--index-filter` and `--subdirectory-filter`. People expect the resulting repository to be smaller than the original, but you need a few more steps to @@ -429,6 +429,37 @@ warned. (or if your git-gc is not new enough to support arguments to `--prune`, use `git repack -ad; git prune` instead). +Notes +----- + +git-filter-branch allows you to make complex shell-scripted rewrites +of your Git history, but you probably don't need this flexibility if +you're simply _removing unwanted data_ like large files or passwords. +For those operations you may want to consider +http://rtyley.github.io/bfg-repo-cleaner/[The BFG Repo-Cleaner], +a JVM-based alternative to git-filter-branch, typically at least +10-50x faster for those use-cases, and with quite different +characteristics: + +* Any particular version of a file is cleaned exactly _once_. The BFG, + unlike git-filter-branch, does not give you the opportunity to + handle a file differently based on where or when it was committed + within your history. This constraint gives the core performance + benefit of The BFG, and is well-suited to the task of cleansing bad + data - you don't care _where_ the bad data is, you just want it + _gone_. + +* By default The BFG takes full advantage of multi-core machines, + cleansing commit file-trees in parallel. git-filter-branch cleans + commits sequentially (ie in a single-threaded manner), though it + _is_ possible to write filters that include their own parallellism, + in the scripts executed against each commit. + +* The http://rtyley.github.io/bfg-repo-cleaner/#examples[command options] + are much more restrictive than git-filter branch, and dedicated just + to the tasks of removing unwanted data- e.g: + `--strip-blobs-bigger-than 1M`. + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index f2e08d11c1..42408752d0 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -91,7 +91,19 @@ objectname:: upstream:: The name of a local ref which can be considered ``upstream'' from the displayed ref. Respects `:short` in the same way as - `refname` above. + `refname` above. Additionally respects `:track` to show + "[ahead N, behind M]" and `:trackshort` to show the terse + version: ">" (ahead), "<" (behind), "<>" (ahead and behind), + or "=" (in sync). Has no effect if the ref does not have + tracking information associated with it. + +HEAD:: + '*' if HEAD matches current ref (the checked out branch), ' ' + otherwise. + +color:: + Change output color. Followed by `:<colorname>`, where names + are described in `color.branch.*`. In addition to the above, for commit and tag objects, the header field names (`tree`, `parent`, `object`, `type`, and `tag`) can @@ -207,13 +219,9 @@ eval=`git for-each-ref --shell --format="$fmt" \ eval "$eval" ------------ -Author ------- -Written by Junio C Hamano <gitster@pobox.com>. - -Documentation -------------- -Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. +SEE ALSO +-------- +linkgit:git-show-ref[1] GIT --- diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt index e3bcdb50e3..e8c13f60ae 100644 --- a/Documentation/git-http-backend.txt +++ b/Documentation/git-http-backend.txt @@ -263,14 +263,6 @@ identifying information of the remote user who performed the push. All CGI environment variables are available to each of the hooks invoked by the 'git-receive-pack'. -Author ------- -Written by Shawn O. Pearce <spearce@spearce.org>. - -Documentation --------------- -Documentation by Shawn O. Pearce <spearce@spearce.org>. - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 34097efea7..1f7bc67d6c 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -15,9 +15,9 @@ DESCRIPTION ----------- Shows the commit logs. -The command takes options applicable to the 'git rev-list' +The command takes options applicable to the `git rev-list` command to control what is shown and how, and options applicable to -the 'git diff-*' commands to control how the changes +the `git diff-*` commands to control how the changes each commit introduces are shown. @@ -42,29 +42,27 @@ OPTIONS --use-mailmap:: Use mailmap file to map author and committer names and email - to canonical real names and email addresses. See + addresses to canonical real names and email addresses. See linkgit:git-shortlog[1]. --full-diff:: - Without this flag, "git log -p <path>..." shows commits that + Without this flag, `git log -p <path>...` shows commits that touch the specified paths, and diffs about the same specified paths. With this, the full diff is shown for commits that touch the specified paths; this means that "<path>..." limits only commits, and doesn't limit diff for those commits. + Note that this affects all diff-based output types, e.g. those -produced by --stat etc. +produced by `--stat`, etc. --log-size:: - Before the log message print out its size in bytes. Intended - mainly for porcelain tools consumption. If Git is unable to - produce a valid value size is set to zero. - Note that only message is considered, if also a diff is shown - its size is not included. + Include a line ``log size <number>'' in the output for each commit, + where <number> is the length of that commit's message in bytes. + Intended to speed up tools that read log messages from `git log` + output by allowing them to allocate space in advance. -L <start>,<end>:<file>:: -L :<regex>:<file>:: - Trace the evolution of the line range given by "<start>,<end>" (or the funcname regex <regex>) within the <file>. You may not give any pathspec limiters. This is currently limited to @@ -80,16 +78,16 @@ include::line-range-format.txt[] whole history leading to the current commit). `origin..HEAD` specifies all the commits reachable from the current commit (i.e. `HEAD`), but not from `origin`. For a complete list of - ways to spell <revision range>, see the "Specifying Ranges" + ways to spell <revision range>, see the 'Specifying Ranges' section of linkgit:gitrevisions[7]. [\--] <path>...:: Show only commits that are enough to explain how the files - that match the specified paths came to be. See "History - Simplification" below for details and other simplification + that match the specified paths came to be. See 'History + Simplification' below for details and other simplification modes. + -Paths may need to be prefixed with "\-- " to separate them from +Paths may need to be prefixed with ``\-- '' to separate them from options or the revision range, when confusion arises. include::rev-list-options.txt[] @@ -113,12 +111,12 @@ EXAMPLES `git log v2.6.12.. include/scsi drivers/scsi`:: Show all commits since version 'v2.6.12' that changed any file - in the include/scsi or drivers/scsi subdirectories + in the `include/scsi` or `drivers/scsi` subdirectories `git log --since="2 weeks ago" -- gitk`:: Show the changes during the last two weeks to the file 'gitk'. - The "--" is necessary to avoid confusion with the *branch* named + The ``--'' is necessary to avoid confusion with the *branch* named 'gitk' `git log --name-status release..test`:: @@ -129,7 +127,7 @@ EXAMPLES `git log --follow builtin/rev-list.c`:: - Shows the commits that changed builtin/rev-list.c, including + Shows the commits that changed `builtin/rev-list.c`, including those commits that occurred before the file was given its present name. @@ -147,17 +145,18 @@ EXAMPLES `git log -p -m --first-parent`:: Shows the history including change diffs, but only from the - "main branch" perspective, skipping commits that come from merged + ``main branch'' perspective, skipping commits that come from merged branches, and showing full diffs of changes introduced by the merges. This makes sense only when following a strict policy of merging all topic branches when staying on a single integration branch. `git log -L '/int main/',/^}/:main.c`:: - Shows how the function `main()` in the file 'main.c' evolved + Shows how the function `main()` in the file `main.c` evolved over time. `git log -3`:: + Limits the number of commits to show to 3. DISCUSSION @@ -172,12 +171,12 @@ See linkgit:git-config[1] for core variables and linkgit:git-diff[1] for settings related to diff generation. format.pretty:: - Default for the `--format` option. (See "PRETTY FORMATS" above.) - Defaults to "medium". + Default for the `--format` option. (See 'Pretty Formats' above.) + Defaults to `medium`. i18n.logOutputEncoding:: - Encoding to use when displaying logs. (See "Discussion", above.) - Defaults to the value of `i18n.commitEncoding` if set, UTF-8 + Encoding to use when displaying logs. (See 'Discussion' above.) + Defaults to the value of `i18n.commitEncoding` if set, and UTF-8 otherwise. log.date:: @@ -186,7 +185,7 @@ log.date:: dates like `Sat May 8 19:35:34 2010 -0500`. log.showroot:: - If `false`, 'git log' and related commands will not treat the + If `false`, `git log` and related commands will not treat the initial commit as a big creation event. Any root commits in `git log -p` output would be shown without a diff attached. The default is `true`. @@ -197,7 +196,7 @@ mailmap.*:: notes.displayRef:: Which refs, in addition to the default set by `core.notesRef` or 'GIT_NOTES_REF', to read notes from when showing commit - messages with the 'log' family of commands. See + messages with the `log` family of commands. See linkgit:git-notes[1]. + May be an unabbreviated ref name or a glob and may be specified diff --git a/Documentation/git-lost-found.txt b/Documentation/git-lost-found.txt deleted file mode 100644 index d54932889f..0000000000 --- a/Documentation/git-lost-found.txt +++ /dev/null @@ -1,74 +0,0 @@ -git-lost-found(1) -================= - -NAME ----- -git-lost-found - Recover lost refs that luckily have not yet been pruned - -SYNOPSIS --------- -[verse] -'git lost-found' - -DESCRIPTION ------------ - -*NOTE*: this command is deprecated. Use linkgit:git-fsck[1] with -the option '--lost-found' instead. - -Finds dangling commits and tags from the object database, and -creates refs to them in the .git/lost-found/ directory. Commits and -tags that dereference to commits are stored in .git/lost-found/commit, -and other objects are stored in .git/lost-found/other. - - -OUTPUT ------- -Prints to standard output the object names and one-line descriptions -of any commits or tags found. - -EXAMPLE -------- - -Suppose you run 'git tag -f' and mistype the tag to overwrite. -The ref to your tag is overwritten, but until you run 'git -prune', the tag itself is still there. - ------------- -$ git lost-found -[1ef2b196d909eed523d4f3c9bf54b78cdd6843c6] GIT 0.99.9c -... ------------- - -Also you can use gitk to browse how any tags found relate to each -other. - ------------- -$ 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 `refs` hierarchy by using -the `update-ref` command. - ------------- -$ git cat-file -t 1ef2b196 -tag -$ git cat-file tag 1ef2b196 -object fa41bbce8e38c67a218415de6cfa510c7e50032a -type commit -tag v0.99.9c -tagger Junio C Hamano <junkio@cox.net> 1131059594 -0800 - -GIT 0.99.9c - -This contains the following changes from the "master" branch, since -... -$ git update-ref refs/tags/not-lost-anymore 1ef2b196 -$ git rev-parse not-lost-anymore -1ef2b196d909eed523d4f3c9bf54b78cdd6843c6 ------------- - -GIT ---- -Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt index 87842e33f8..808426faac 100644 --- a/Documentation/git-merge-base.txt +++ b/Documentation/git-merge-base.txt @@ -13,6 +13,7 @@ SYNOPSIS 'git merge-base' [-a|--all] --octopus <commit>... 'git merge-base' --is-ancestor <commit> <commit> 'git merge-base' --independent <commit>... +'git merge-base' --fork-point <ref> [<commit>] DESCRIPTION ----------- @@ -24,8 +25,8 @@ that does not have any better common ancestor is a 'best common ancestor', i.e. a 'merge base'. Note that there can be more than one merge base for a pair of commits. -OPERATION MODE --------------- +OPERATION MODES +--------------- As the most common special case, specifying only two commits on the command line means computing the merge base between the given two commits. @@ -56,6 +57,14 @@ from linkgit:git-show-branch[1] when used with the `--merge-base` option. 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. +--fork-point:: + Find the point at which a branch (or any history that leads + to <commit>) forked from another branch (or any reference) + <ref>. This does not just look for the common ancestor of + the two commits, but also takes into account the reflog of + <ref> to see if the history leading to <commit> forked from + an earlier incarnation of the branch <ref> (see discussion + on this mode below). OPTIONS ------- @@ -137,6 +146,31 @@ In modern git, you can say this in a more direct way: instead. +Discussion on fork-point mode +----------------------------- + +After working on the `topic` branch created with `git checkout -b +topic origin/master`, the history of remote-tracking branch +`origin/master` may have been rewound and rebuilt, leading to a +history of this shape: + + o---B1 + / + ---o---o---B2--o---o---o---B (origin/master) + \ + B3 + \ + Derived (topic) + +where `origin/master` used to point at commits B3, B2, B1 and now it +points at B, and your `topic` branch was started on top of it back +when `origin/master` was at B3. This mode uses the reflog of +`origin/master` to find B3 as the fork point, so that the `topic` +can be rebased on top of the updated `origin/master` by: + + $ fork_point=$(git merge-base --fork-point origin/master topic) + $ git rebase --onto origin/master $fork_point topic + See also -------- diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt index b1f79881ef..e4531325cd 100644 --- a/Documentation/git-mv.txt +++ b/Documentation/git-mv.txt @@ -52,6 +52,18 @@ core.worktree setting to make the submodule work in the new location. It also will attempt to update the submodule.<name>.path setting in the linkgit:gitmodules[5] file and stage that file (unless -n is used). +BUGS +---- +Each time a superproject update moves a populated submodule (e.g. when +switching between commits before and after the move) a stale submodule +checkout will remain in the old location and an empty directory will +appear in the new location. To populate the submodule again in the new +location the user will have to run "git submodule update" +afterwards. Removing the old directory is only safe when it uses a +gitfile, as otherwise the history of the submodule will be deleted +too. Both steps will be obsolete when recursive submodule update has +been implemented. + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt index 46ef0466be..84bb0fecb0 100644 --- a/Documentation/git-notes.txt +++ b/Documentation/git-notes.txt @@ -375,16 +375,6 @@ does not match any refs is silently ignored. If not set in the environment, the list of notes to copy depends on the `notes.rewrite.<command>` and `notes.rewriteRef` settings. - -Author ------- -Written by Johannes Schindelin <johannes.schindelin@gmx.de> and -Johan Herland <johan@herland.net> - -Documentation -------------- -Documentation by Johannes Schindelin and Johan Herland - GIT --- Part of the linkgit:git[7] suite diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 8cba16d67f..6ab5f9497a 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -168,7 +168,8 @@ All commands except clone accept these options. --git-dir <dir>:: Set the 'GIT_DIR' environment variable. See linkgit:git[1]. ---verbose, -v:: +-v:: +--verbose:: Provide more progress information. Sync options @@ -279,7 +280,8 @@ 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:: +-n:: +--dry-run:: Show just what commits would be submitted to p4; do not change state in Git or p4. diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt index d94edcd4b4..cdab9ed503 100644 --- a/Documentation/git-pack-objects.txt +++ b/Documentation/git-pack-objects.txt @@ -51,8 +51,7 @@ base-name:: <base-name> to determine the name of the created file. When this option is used, the two files are written in <base-name>-<SHA-1>.{pack,idx} files. <SHA-1> is a hash - of the sorted object names to make the resulting filename - based on the pack content, and written to the standard + based on the pack content and is written to the standard output of the command. --stdout:: diff --git a/Documentation/git-peek-remote.txt b/Documentation/git-peek-remote.txt deleted file mode 100644 index 87ea3fb054..0000000000 --- a/Documentation/git-peek-remote.txt +++ /dev/null @@ -1,43 +0,0 @@ -git-peek-remote(1) -================== - -NAME ----- -git-peek-remote - List the references in a remote repository - - -SYNOPSIS --------- -[verse] -'git peek-remote' [--upload-pack=<git-upload-pack>] [<host>:]<directory> - -DESCRIPTION ------------ -This command is deprecated; use 'git ls-remote' instead. - -OPTIONS -------- ---upload-pack=<git-upload-pack>:: - Use this to specify the path to 'git-upload-pack' on the - remote side, if it is not found on your $PATH. Some - installations of sshd ignores the user's environment - setup scripts for login shells (e.g. .bash_profile) and - your privately installed git may not be found on the system - default $PATH. Another workaround suggested is to set - up your $PATH in ".bashrc", but this flag is for people - who do not want to pay the overhead for non-interactive - shells, but prefer having a lean .bashrc file (they set most of - the things up in .bash_profile). - -<host>:: - A remote host that houses the repository. When this - part is specified, 'git-upload-pack' is invoked via - ssh. - -<directory>:: - The repository to sync from. - - -GIT ---- -Part of the linkgit:git[1] suite diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt index bf824108c1..058ac0dc85 100644 --- a/Documentation/git-prune.txt +++ b/Documentation/git-prune.txt @@ -24,6 +24,8 @@ objects unreachable from any of these head objects from the object database. In addition, it prunes the unpacked objects that are also found in packs by running 'git prune-packed'. +It also removes entries from .git/shallow that are not reachable by +any ref. Note that unreachable, packed objects will remain. If this is not desired, see linkgit:git-repack[1]. diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index beea10b148..200eb22260 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -42,6 +42,8 @@ Assume the following history exists and the current branch is A---B---C master on origin / D---E---F---G master + ^ + origin/master in your repository ------------ Then "`git pull`" will fetch and replay the changes from the remote @@ -51,7 +53,7 @@ result in a new commit along with the names of the two parent commits and a log message from the user describing the changes. ------------ - A---B---C remotes/origin/master + A---B---C origin/master / \ D---E---F---G---H master ------------ @@ -97,10 +99,10 @@ must be given before the options meant for 'git fetch'. Options related to merging ~~~~~~~~~~~~~~~~~~~~~~~~~~ -include::merge-options.txt[] - :git-pull: 1 +include::merge-options.txt[] + -r:: --rebase[=false|true|preserve]:: When true, rebase the current branch on top of the upstream diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 9eec740910..14862fb203 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -56,8 +56,13 @@ it can be any arbitrary "SHA-1 expression", such as `master~4` or + The <dst> tells which ref on the remote side is updated with this push. Arbitrary expressions cannot be used here, an actual ref must -be named. If `:`<dst> is omitted, the same ref as <src> will be -updated. +be named. +If `git push [<repository>]` without any `<refspec>` argument is set to +update some ref at the destination with `<src>` with +`remote.<repository>.push` configuration variable, `:<dst>` part can +be omitted---such a push will update a ref that `<src>` normally updates +without any `<refspec>` on the command line. Otherwise, missing +`:<dst>` means to update the same ref as the `<src>`. + The object referenced by <src> is used to update the <dst> reference on the remote side. By default this is only allowed if <dst> is not @@ -78,8 +83,8 @@ the local side, the remote side is updated if a branch of the same name already exists on the remote side. --all:: - Instead of naming each ref to push, specifies that all - refs under `refs/heads/` be pushed. + Push all branches (i.e. refs under `refs/heads/`); cannot be + used with other <refspec>. --prune:: Remove remote branches that don't have a local counterpart. For example @@ -437,8 +442,10 @@ Examples configured for the current branch). `git push origin`:: - Without additional configuration, works like - `git push origin :`. + Without additional configuration, pushes the current branch to + the configured upstream (`remote.origin.merge` configuration + variable) if it has the same name as the current branch, and + errors out without pushing otherwise. + The default behavior of this command when no <refspec> is given can be configured by setting the `push` option of the remote, or the `push.default` diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 94e07fdab5..2a93c645bd 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -281,6 +281,10 @@ which makes little sense. specified, `-s recursive`. Note the reversal of 'ours' and 'theirs' as noted above for the `-m` option. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: + GPG-sign commits. + -q:: --quiet:: Be quiet. Implies --no-stat. @@ -324,6 +328,16 @@ fresh commits so it can be remerged successfully without needing to "revert the reversion" (see the link:howto/revert-a-faulty-merge.html[revert-a-faulty-merge How-To] for details). +--fork-point:: +--no-fork-point:: + Use 'git merge-base --fork-point' to find a better common ancestor + between `upstream` and `branch` when calculating which commits have + have been introduced by `branch` (see linkgit:git-merge-base[1]). ++ +If no non-option arguments are given on the command line, then the default is +`--fork-point @{u}` otherwise the `upstream` argument is interpreted literally +unless the `--fork-point` option is specified. + --ignore-whitespace:: --whitespace=<option>:: These flag are passed to the 'git apply' program diff --git a/Documentation/git-remote-ext.txt b/Documentation/git-remote-ext.txt index 8cfc748ae2..cd0bb77e4a 100644 --- a/Documentation/git-remote-ext.txt +++ b/Documentation/git-remote-ext.txt @@ -116,11 +116,6 @@ begins with `ext::`. Examples: determined by the helper using environment variables (see above). -Documentation --------------- -Documentation by Ilari Liusvaara, Jonathan Nieder and the Git list -<git@vger.kernel.org> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-remote-fd.txt b/Documentation/git-remote-fd.txt index 933c2adaf6..bcd37668e3 100644 --- a/Documentation/git-remote-fd.txt +++ b/Documentation/git-remote-fd.txt @@ -50,10 +50,6 @@ EXAMPLES `git push fd::7,8/bar master`:: Same as above. -Documentation --------------- -Documentation by Ilari Liusvaara and the Git list <git@vger.kernel.org> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt index 2507c8bd91..cb103c8b6f 100644 --- a/Documentation/git-remote.txt +++ b/Documentation/git-remote.txt @@ -3,7 +3,7 @@ git-remote(1) NAME ---- -git-remote - manage set of tracked repositories +git-remote - Manage set of tracked repositories SYNOPSIS diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 4c1aff65e6..002cfd5eb9 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -9,12 +9,12 @@ git-repack - Pack unpacked objects in a repository SYNOPSIS -------- [verse] -'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [--window=<n>] [--depth=<n>] +'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [--window=<n>] [--depth=<n>] DESCRIPTION ----------- -This script is used to combine all objects that do not currently +This command is used to combine all objects that do not currently reside in a "pack", into a pack. It can also be used to re-organize existing packs into a single, more efficient pack. @@ -110,6 +110,13 @@ other objects in that pack they already have locally. The default is unlimited, unless the config variable `pack.packSizeLimit` is set. +-b:: +--write-bitmap-index:: + Write a reachability bitmap index as part of the repack. This + only makes sense when used with `-a` or `-A`, as the bitmaps + must be able to refer to all reachable objects. This option + overrides the setting of `pack.writebitmaps`. + Configuration ------------- diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt index f373ab48d4..0a02f70657 100644 --- a/Documentation/git-replace.txt +++ b/Documentation/git-replace.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git replace' [-f] <object> <replacement> 'git replace' -d <object>... -'git replace' -l [<pattern>] +'git replace' [--format=<format>] [-l [<pattern>]] DESCRIPTION ----------- @@ -70,6 +70,23 @@ OPTIONS Typing "git replace" without arguments, also lists all replace refs. +--format=<format>:: + When listing, use the specified <format>, which can be one of + 'short', 'medium' and 'long'. When omitted, the format + defaults to 'short'. + +FORMATS +------- + +The following format are available: + +* 'short': + <replaced sha1> +* 'medium': + <replaced sha1> -> <replacement sha1> +* 'long': + <replaced sha1> (<replaced type>) -> <replacement sha1> (<replacement type>) + CREATING REPLACEMENT OBJECTS ---------------------------- diff --git a/Documentation/git-repo-config.txt b/Documentation/git-repo-config.txt deleted file mode 100644 index 9ec115b9e0..0000000000 --- a/Documentation/git-repo-config.txt +++ /dev/null @@ -1,23 +0,0 @@ -git-repo-config(1) -================== - -NAME ----- -git-repo-config - Get and set repository or global options - - -SYNOPSIS --------- -[verse] -'git repo-config' ... - - -DESCRIPTION ------------ - -This is a synonym for linkgit:git-config[1]. Please refer to the -documentation of that command. - -GIT ---- -Part of the linkgit:git[1] suite diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index f445cb38fa..a077ba0ddc 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git reset' [-q] [<tree-ish>] [--] <paths>... 'git reset' (--patch | -p) [<tree-ish>] [--] [<paths>...] -'git reset' [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>] +'git reset' [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>] DESCRIPTION ----------- @@ -60,6 +60,9 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action. ++ +If `-N` is specified, removed paths are marked as intent-to-add (see +linkgit:git-add[1]). --hard:: Resets the index and working tree. Any changes to tracked files in the diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt index 045b37b82e..7a1585def0 100644 --- a/Documentation/git-rev-list.txt +++ b/Documentation/git-rev-list.txt @@ -55,6 +55,7 @@ SYNOPSIS [ \--reverse ] [ \--walk-reflogs ] [ \--no-walk ] [ \--do-walk ] + [ \--use-bitmap-index ] <commit>... [ \-- <paths>... ] DESCRIPTION diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index d068a65377..0d2cdcde55 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -50,6 +50,10 @@ Options for --parseopt the first non-option argument. This can be used to parse sub-commands that take options themselves. +--stuck-long:: + Only meaningful in `--parseopt` mode. Output the options in their + long form if available, and with their arguments stuck. + Options for Filtering ~~~~~~~~~~~~~~~~~~~~~ @@ -173,6 +177,20 @@ shown. If the pattern does not contain a globbing character (`?`, character (`?`, `*`, or `[`), it is turned into a prefix match by appending `/*`. +--exclude=<glob-pattern>:: + Do not include refs matching '<glob-pattern>' that the next `--all`, + `--branches`, `--tags`, `--remotes`, or `--glob` would otherwise + consider. Repetitions of this option accumulate exclusion patterns + up to the next `--all`, `--branches`, `--tags`, `--remotes`, or + `--glob` option (other options or arguments do not clear + accumlated patterns). ++ +The patterns given should not begin with `refs/heads`, `refs/tags`, or +`refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`, +respectively, and they must begin with `refs/` when applied to `--glob` +or `--all`. If a trailing '/{asterisk}' is intended, it must be given +explicitly. + --disambiguate=<prefix>:: Show every object whose name begins with the given prefix. The <prefix> must be at least 4 hexadecimal digits long to @@ -285,7 +303,9 @@ Each line of options has this format: `<flags>` are of `*`, `=`, `?` or `!`. * Use `=` if the option takes an argument. - * Use `?` to mean that the option is optional (though its use is discouraged). + * Use `?` to mean that the option takes an optional argument. You + probably want to use the `--stuck-long` mode to be able to + unambiguously parse the optional argument. * Use `*` to mean that this option should not be listed in the usage generated for the `-h` argument. It's shown for `--help-all` as diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index 2de67a5496..9eb83f01a4 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -8,7 +8,7 @@ git-revert - Revert some existing commits SYNOPSIS -------- [verse] -'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] <commit>... +'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>... 'git revert' --continue 'git revert' --quit 'git revert' --abort @@ -80,6 +80,10 @@ more details. This is useful when reverting more than one commits' effect to your index in a row. +-S[<keyid>]:: +--gpg-sign[=<keyid>]:: + GPG-sign commits. + -s:: --signoff:: Add Signed-off-by line at the end of the commit message. diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt index 9d731b453d..f1efc116eb 100644 --- a/Documentation/git-rm.txt +++ b/Documentation/git-rm.txt @@ -170,6 +170,15 @@ of files and subdirectories under the `Documentation/` directory. (i.e. you are listing the files explicitly), it does not remove `subdir/git-foo.sh`. +BUGS +---- +Each time a superproject update removes a populated submodule +(e.g. when switching between commits before and after the removal) a +stale submodule checkout will remain in the old location. Removing the +old directory is only safe when it uses a gitfile, as otherwise the +history of the submodule will be deleted too. This step will be +obsolete when recursive submodule update has been implemented. + SEE ALSO -------- linkgit:git-add[1] diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt index b0a309b117..ffd1b03a9c 100644 --- a/Documentation/git-show-ref.txt +++ b/Documentation/git-show-ref.txt @@ -175,6 +175,7 @@ FILES SEE ALSO -------- +linkgit:git-for-each-ref[1], linkgit:git-ls-remote[1], linkgit:git-update-ref[1], linkgit:gitrepository-layout[5] diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index db7e803038..375213fe46 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -44,7 +44,7 @@ is also possible). OPTIONS ------- -save [-p|--patch] [--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]:: +save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]:: Save your local modifications to a new 'stash', and run `git reset --hard` to revert them. The <message> part is optional and gives diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index bfef8a0c62..46c1eebb93 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -15,8 +15,8 @@ SYNOPSIS 'git submodule' [--quiet] init [--] [<path>...] 'git submodule' [--quiet] deinit [-f|--force] [--] <path>... 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch] - [-f|--force] [--rebase] [--reference <repository>] [--depth <depth>] - [--merge] [--recursive] [--] [<path>...] + [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] + [--depth <depth>] [--recursive] [--] [<path>...] 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>] [commit] [--] [<path>...] 'git submodule' [--quiet] foreach [--recursive] <command> @@ -155,13 +155,31 @@ it contains local modifications. update:: Update the registered submodules, i.e. clone missing submodules and - checkout the commit specified in the index of the containing repository. - This will make the submodules HEAD be detached unless `--rebase` or - `--merge` is specified or the key `submodule.$name.update` is set to - `rebase`, `merge` or `none`. `none` can be overridden by specifying - `--checkout`. Setting the key `submodule.$name.update` to `!command` - will cause `command` to be run. `command` can be any arbitrary shell - command that takes a single argument, namely the sha1 to update to. + checkout the commit specified in the index of the containing + repository. The update mode defaults to `checkout`, but can be + configured with the `submodule.<name>.update` setting or the + `--rebase`, `--merge`, or `--checkout` options. ++ +For updates that clone missing submodules, checkout-mode updates will +create submodules with detached HEADs; all other modes will create +submodules with a local branch named after `submodule.<path>.branch`. ++ +For updates that do not clone missing submodules, the submodule's HEAD +is only touched when the remote reference does not match the +submodule's HEAD (for none-mode updates, the submodule is never +touched). The remote reference is usually the gitlinked commit from +the superproject's tree, but with `--remote` it is the upstream +subproject's `submodule.<name>.branch`. This remote reference is +integrated with the submodule's HEAD using the specified update mode. +For checkout-mode updates, that will result in a detached HEAD. For +rebase- and merge-mode updates, the commit referenced by the +submodule's HEAD may change, but the symbolic reference will remain +unchanged (i.e. checked-out branches will still be checked-out +branches, and detached HEADs will still be detached HEADs). If none +of the builtin modes fit your needs, set `submodule.<name>.update` to +`!command` to configure a custom integration command. `command` can +be any arbitrary shell command that takes a single argument, namely +the sha1 to update to. + If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the @@ -281,12 +299,31 @@ In order to ensure a current tracking branch state, `update --remote` fetches the submodule's remote repository before calculating the SHA-1. If you don't want to fetch, you should use `submodule update --remote --no-fetch`. ++ +Use this option to integrate changes from the upstream subproject with +your submodule's current HEAD. Alternatively, you can run `git pull` +from the submodule, which is equivalent except for the remote branch +name: `update --remote` uses the default upstream repository and +`submodule.<name>.branch`, while `git pull` uses the submodule's +`branch.<name>.merge`. Prefer `submodule.<name>.branch` if you want +to distribute the default upstream branch with the superproject and +`branch.<name>.merge` if you want a more native feel while working in +the submodule itself. -N:: --no-fetch:: This option is only valid for the update command. Don't fetch new objects from the remote site. +--checkout:: + This option is only valid for the update command. + Checkout the commit recorded in the superproject on a detached HEAD + in the submodule. This is the default behavior, the main use of + this option is to override `submodule.$name.update` when set to + `merge`, `rebase` or `none`. + If the key `submodule.$name.update` is either not explicitly set or + set to `checkout`, this option is implicit. + --merge:: This option is only valid for the update command. Merge the commit recorded in the superproject into the current branch diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 2a3847649d..30c5ee2564 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -124,15 +124,15 @@ This automatically updates the rev_map if needed (see '$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details). --localtime;; - Store Git commit times in the local timezone instead of UTC. This + Store Git commit times in the local time zone instead of UTC. This makes 'git log' (even without --date=local) show the same times - that `svn log` would in the local timezone. + that `svn log` would in the local time zone. + This doesn't interfere with interoperating with the Subversion repository you cloned from, but if you wish for your local Git repository to be able to interoperate with someone else's local Git repository, either don't use this option or you should both use it in -the same local timezone. +the same local time zone. --parent;; Fetch only from the SVN parent of the current HEAD. @@ -175,11 +175,11 @@ Skip "branches" and "tags" of first level directories;; precedence over '--include-paths'. --log-window-size=<n>;; - Fetch <n> log entries per request when scanning Subversion history. - The default is 100. For very large Subversion repositories, larger - values may be needed for 'clone'/'fetch' to complete in reasonable - time. But overly large values may lead to higher memory usage and - request timeouts. + Fetch <n> log entries per request when scanning Subversion history. + The default is 100. For very large Subversion repositories, larger + values may be needed for 'clone'/'fetch' to complete in reasonable + time. But overly large values may lead to higher memory usage and + request timeouts. 'clone':: Runs 'init' and 'fetch'. It will automatically create a @@ -275,7 +275,7 @@ first have already been pushed into SVN. For each patch, one may answer "yes" (accept this patch), "no" (discard this patch), "all" (accept all patches), or "quit". + - 'git svn dcommit' returns immediately if answer is "no" or "quit", without + 'git svn dcommit' returns immediately if answer is "no" or "quit", without committing anything to SVN. 'branch':: @@ -366,12 +366,12 @@ environment). This command has the same behaviour. Any other arguments are passed directly to 'git log' 'blame':: - Show what revision and author last modified each line of a file. The - output of this mode is format-compatible with the output of - `svn blame' by default. Like the SVN blame command, - local uncommitted changes in the working tree are ignored; - the version of the file in the HEAD revision is annotated. Unknown - arguments are passed directly to 'git blame'. + Show what revision and author last modified each line of a file. The + output of this mode is format-compatible with the output of + `svn blame' by default. Like the SVN blame command, + local uncommitted changes in the working tree are ignored; + the version of the file in the HEAD revision is annotated. Unknown + arguments are passed directly to 'git blame'. + --git-format;; Produce output in the same format as 'git blame', but with @@ -830,7 +830,7 @@ Tracking and contributing to an entire Subversion-managed project # View all branches and tags you have cloned: git branch -r # Create a new branch in SVN - git svn branch waldo + git svn branch waldo # Reset your master to trunk (or any other branch, replacing 'trunk' # with the appropriate name): git reset --hard svn/trunk diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index c418c44d40..404257df9f 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -103,8 +103,9 @@ OPTIONS + This option is only applicable when listing tags without annotation lines. ---contains <commit>:: - Only list tags which contain the specified commit. +--contains [<commit>]:: + Only list tags which contain the specified commit (HEAD if not + specified). --points-at <object>:: Only list tags of the given object. diff --git a/Documentation/git-tar-tree.txt b/Documentation/git-tar-tree.txt deleted file mode 100644 index f7362dc2d1..0000000000 --- a/Documentation/git-tar-tree.txt +++ /dev/null @@ -1,82 +0,0 @@ -git-tar-tree(1) -=============== - -NAME ----- -git-tar-tree - Create a tar archive of the files in the named tree object - - -SYNOPSIS --------- -[verse] -'git tar-tree' [--remote=<repo>] <tree-ish> [ <base> ] - -DESCRIPTION ------------ -THIS COMMAND IS DEPRECATED. Use 'git archive' with `--format=tar` -option instead (and move the <base> argument to `--prefix=base/`). - -Creates a tar archive containing the tree structure for the named tree. -When <base> is specified it is added as a leading path to the files in the -generated tar archive. - -'git tar-tree' behaves differently when given a tree ID versus when given -a commit ID or tag ID. In the first case the current time is used as -modification time of each file in the archive. In the latter case the -commit time as recorded in the referenced commit object is used instead. -Additionally the commit ID is stored in a global extended pax header. -It can be extracted using 'git get-tar-commit-id'. - -OPTIONS -------- - -<tree-ish>:: - The tree or commit to produce tar archive for. If it is - the object name of a commit object. - -<base>:: - Leading path to the files in the resulting tar archive. - ---remote=<repo>:: - Instead of making a tar archive from local repository, - retrieve a tar archive from a remote repository. - -CONFIGURATION -------------- - -tar.umask:: - This variable can be used to restrict the permission bits of - tar archive entries. The default is 0002, which turns off the - world write bit. The special value "user" indicates that the - archiving user's umask will be used instead. See umask(2) for - details. - -EXAMPLES --------- -`git tar-tree HEAD junk | (cd /var/tmp/ && tar xf -)`:: - - Create a tar archive that contains the contents of the - latest commit on the current branch, and extracts it in - `/var/tmp/junk` directory. - -`git tar-tree v1.4.0 git-1.4.0 | gzip >git-1.4.0.tar.gz`:: - - Create a tarball for v1.4.0 release. - -`git tar-tree v1.4.0^{tree} git-1.4.0 | gzip >git-1.4.0.tar.gz`:: - - Create a tarball for v1.4.0 release, but without a - global extended pax header. - -`git tar-tree --remote=example.com:git.git v1.4.0 >git-1.4.0.tar`:: - - Get a tarball v1.4.0 from example.com. - -`git tar-tree HEAD:Documentation/ git-docs > git-1.4.0-docs.tar`:: - - Put everything in the current head's Documentation/ directory - into 'git-1.4.0-docs.tar', with the prefix 'git-docs/'. - -GIT ---- -Part of the linkgit:git[1] suite diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.txt index ff23494e70..12cb108b85 100644 --- a/Documentation/git-unpack-objects.txt +++ b/Documentation/git-unpack-objects.txt @@ -9,7 +9,7 @@ git-unpack-objects - Unpack objects from a packed archive SYNOPSIS -------- [verse] -'git unpack-objects' [-n] [-q] [-r] [--strict] <pack-file +'git unpack-objects' [-n] [-q] [-r] [--strict] < <pack-file> DESCRIPTION diff --git a/Documentation/git-upload-archive.txt b/Documentation/git-upload-archive.txt index d09bbb52b1..cbef61ba88 100644 --- a/Documentation/git-upload-archive.txt +++ b/Documentation/git-upload-archive.txt @@ -20,6 +20,38 @@ This command is usually not invoked directly by the end user. The UI for the protocol is on the 'git archive' side, and the program pair is meant to be used to get an archive from a remote repository. +SECURITY +-------- + +In order to protect the privacy of objects that have been removed from +history but may not yet have been pruned, `git-upload-archive` avoids +serving archives for commits and trees that are not reachable from the +repository's refs. However, because calculating object reachability is +computationally expensive, `git-upload-archive` implements a stricter +but easier-to-check set of rules: + + 1. Clients may request a commit or tree that is pointed to directly by + a ref. E.g., `git archive --remote=origin v1.0`. + + 2. Clients may request a sub-tree within a commit or tree using the + `ref:path` syntax. E.g., `git archive --remote=origin v1.0:Documentation`. + + 3. Clients may _not_ use other sha1 expressions, even if the end + result is reachable. E.g., neither a relative commit like `master^` + nor a literal sha1 like `abcd1234` is allowed, even if the result + is reachable from the refs. + +Note that rule 3 disallows many cases that do not have any privacy +implications. These rules are subject to change in future versions of +git, and the server accessed by `git archive --remote` may or may not +follow these exact rules. + +If the config option `uploadArchive.allowUnreachable` is true, these +rules are ignored, and clients may use arbitrary sha1 expressions. +This is useful if you do not care about the privacy of unreachable +objects, or if your object database is already publicly available for +access via non-smart-http. + OPTIONS ------- <directory>:: diff --git a/Documentation/git-web--browse.txt b/Documentation/git-web--browse.txt index 5aec4ecffb..2de575f5be 100644 --- a/Documentation/git-web--browse.txt +++ b/Documentation/git-web--browse.txt @@ -35,6 +35,7 @@ The following browsers (or commands) are currently supported: * open (this is the default under Mac OS X GUI) * start (this is the default under MinGW) * cygstart (this is the default under Cygwin) +* xdg-open Custom commands may also be specified. diff --git a/Documentation/git.txt b/Documentation/git.txt index 4f7e07f2e0..27a199ca1a 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,28 @@ unreleased) version of Git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.8.4.1/git.html[documentation for release 1.8.4.1] +* link:v1.9.0/git.html[documentation for release 1.9.0] * release notes for + link:RelNotes/1.9.0.txt[1.9.0]. + +* link:v1.8.5.5/git.html[documentation for release 1.8.5.5] + +* release notes for + link:RelNotes/1.8.5.5.txt[1.8.5.5], + link:RelNotes/1.8.5.4.txt[1.8.5.4], + link:RelNotes/1.8.5.3.txt[1.8.5.3], + link:RelNotes/1.8.5.2.txt[1.8.5.2], + link:RelNotes/1.8.5.1.txt[1.8.5.1], + link:RelNotes/1.8.5.txt[1.8.5]. + +* link:v1.8.4.5/git.html[documentation for release 1.8.4.5] + +* release notes for + link:RelNotes/1.8.4.5.txt[1.8.4.5], + link:RelNotes/1.8.4.4.txt[1.8.4.4], + link:RelNotes/1.8.4.3.txt[1.8.4.3], + link:RelNotes/1.8.4.2.txt[1.8.4.2], link:RelNotes/1.8.4.1.txt[1.8.4.1], link:RelNotes/1.8.4.txt[1.8.4]. @@ -701,6 +720,11 @@ Git so take care if using Cogito etc. index file. If not specified, the default of `$GIT_DIR/index` is used. +'GIT_INDEX_VERSION':: + This environment variable allows the specification of an index + version for new repositories. It won't affect existing index + files. By default index file version [23] is used. + 'GIT_OBJECT_DIRECTORY':: If the object storage directory is specified via this environment variable then the sha1 directories are created @@ -796,6 +820,15 @@ temporary file --- it is removed when 'GIT_EXTERNAL_DIFF' exits. + For a path that is unmerged, 'GIT_EXTERNAL_DIFF' is called with 1 parameter, <path>. ++ +For each path 'GIT_EXTERNAL_DIFF' is called, two environment variables, +'GIT_DIFF_PATH_COUNTER' and 'GIT_DIFF_PATH_TOTAL' are set. + +'GIT_DIFF_PATH_COUNTER':: + A 1-based counter incremented by one for every path. + +'GIT_DIFF_PATH_TOTAL':: + The total number of paths. other ~~~~~ diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index b322a2666c..643c1ba929 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -930,9 +930,12 @@ state. DEFINING MACRO ATTRIBUTES ------------------------- -Custom macro attributes can be defined only in the `.gitattributes` -file at the toplevel (i.e. not in any subdirectory). The built-in -macro attribute "binary" is equivalent to: +Custom macro attributes can be defined only in top-level gitattributes +files (`$GIT_DIR/info/attributes`, the `.gitattributes` file at the +top level of the working tree, or the global or system-wide +gitattributes files), not in `.gitattributes` files in working tree +subdirectories. The built-in macro attribute "binary" is equivalent +to: ------------ [attr]binary -diff -merge -text diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt index 3146413cce..1c3e109cb3 100644 --- a/Documentation/gitcli.txt +++ b/Documentation/gitcli.txt @@ -28,7 +28,7 @@ arguments. Here are the rules: they can be disambiguated by placing `--` between them. E.g. `git diff -- HEAD` is, "I have a file called HEAD in my work tree. Please show changes between the version I staged in the index - and what I have in the work tree for that file". not "show difference + and what I have in the work tree for that file", not "show difference between the HEAD commit and the work tree as a whole". You can say `git diff HEAD --` to ask for the latter. @@ -72,23 +72,23 @@ scripting Git: * splitting short options to separate words (prefer `git foo -a -b` to `git foo -ab`, the latter may not even work). - * when a command line option takes an argument, use the 'sticked' form. In + * when a command line option takes an argument, use the 'stuck' form. In other words, write `git foo -oArg` instead of `git foo -o Arg` for short options, and `git foo --long-opt=Arg` instead of `git foo --long-opt Arg` for long options. An option that takes optional option-argument must be - written in the 'sticked' form. + written in the 'stuck' form. * when you give a revision parameter to a command, make sure the parameter is not ambiguous with a name of a file in the work tree. E.g. do not write `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 + * 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 + 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", + new option whose name shares the same prefix, e.g. `--optimize`, to make a short prefix that used to be unique no longer unique. @@ -149,7 +149,7 @@ 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. +e.g. `git commit --amenity` option. Separating argument from the option @@ -165,7 +165,7 @@ $ git foo -o Arg ---------------------------- However, this is *NOT* allowed for switches with an optional value, where the -'sticked' form must be used: +'stuck' form must be used: ---------------------------- $ git describe --abbrev HEAD # correct $ git describe --abbrev=10 HEAD # correct diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index 058a352980..d2d7c213dd 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -1443,7 +1443,7 @@ Although Git is a truly distributed system, it is often convenient to organize your project with an informal hierarchy of developers. Linux kernel development is run this way. There is a nice illustration (page 17, "Merges to Mainline") in -link:http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation]. +http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation]. It should be stressed that this hierarchy is purely *informal*. There is nothing fundamental in Git that enforces the "chain of diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt index 5ea94cbceb..5f4e89005c 100644 --- a/Documentation/gitcvs-migration.txt +++ b/Documentation/gitcvs-migration.txt @@ -117,7 +117,7 @@ Importing a CVS archive ----------------------- First, install version 2.1 or higher of cvsps from -link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make +http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make sure it is in your path. Then cd to a checked out CVS working directory of the project you are interested in and run linkgit:git-cvsimport[1]: diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt index d48bf4d6fa..d954bf6ba8 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -251,7 +251,7 @@ three parameters: - the name of the ref being updated, - the old object name stored in the ref, - - and the new objectname to be stored in the ref. + - and the new object name to be stored in the ref. A zero exit from the update hook allows the ref to be updated. Exiting with a non-zero status prevents 'git-receive-pack' diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 54e334e3af..8734c1566c 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -7,7 +7,7 @@ gitignore - Specifies intentionally untracked files to ignore SYNOPSIS -------- -$GIT_DIR/info/exclude, .gitignore +$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore DESCRIPTION ----------- @@ -77,10 +77,15 @@ PATTERN FORMAT Put a backslash ("`\`") in front of the first hash for patterns that begin with a hash. + - Trailing spaces are ignored unless they are quoted with backlash + ("`\`"). + - 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. + included again. It is not possible to re-include a file if a parent + directory of that file is excluded. Git doesn't list excluded + directories for performance reasons, so any patterns on contained + files have no effect, no matter where they are defined. Put a backslash ("`\`") in front of the first "`!`" for patterns that begin with a literal "`!`", for example, "`\!important!.txt`". @@ -113,12 +118,12 @@ full pathname may have special meaning: - A leading "`**`" followed by a slash means match in all directories. For example, "`**/foo`" matches file or directory - "`foo`" anywhere, the same as pattern "`foo`". "**/foo/bar" + "`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`" matches file or directory "`bar`" anywhere that is directly under directory "`foo`". - - A trailing "/**" matches everything inside. For example, - "abc/**" matches all files inside directory "abc", relative + - A trailing "`/**`" matches everything inside. For example, + "`abc/**`" matches all files inside directory "`abc`", relative to the location of the `.gitignore` file, with infinite depth. - A slash followed by two consecutive asterisks then a slash @@ -182,6 +187,19 @@ Another example: The second .gitignore prevents Git from ignoring `arch/foo/kernel/vmlinux.lds.S`. +Example to exclude everything except a specific directory `foo/bar` +(note the `/*` - without the slash, the wildcard would also exclude +everything within `foo/bar`): + +-------------------------------------------------------------- + $ cat .gitignore + # exclude everything except directory foo/bar + /* + !/foo + /foo/* + !/foo/bar +-------------------------------------------------------------- + SEE ALSO -------- linkgit:git-rm[1], diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt index c17e760184..1e9e38ae40 100644 --- a/Documentation/gitk.txt +++ b/Documentation/gitk.txt @@ -8,7 +8,7 @@ gitk - The Git repository browser SYNOPSIS -------- [verse] -'gitk' [<option>...] [<revs>] [--] [<path>...] +'gitk' [<options>] [<revision range>] [\--] [<path>...] DESCRIPTION ----------- @@ -16,21 +16,38 @@ Displays changes in a repository or a selected set of commits. This includes visualizing the commit graph, showing information related to each commit, and the files in the trees of each revision. -Historically, gitk was the first repository browser. It's written in tcl/tk -and started off in a separate repository but was later merged into the main -Git repository. - OPTIONS ------- -To control which revisions to show, the command takes options applicable to -the 'git rev-list' command (see linkgit:git-rev-list[1]). -This manual page describes only the most -frequently used options. --n <number>:: ---max-count=<number>:: +To control which revisions to show, gitk supports most options +applicable to the 'git rev-list' command. It also supports a few +options applicable to the 'git diff-*' commands to control how the +changes each commit introduces are shown. Finally, it supports some +gitk-specific options. + +gitk generally only understands options with arguments in the +'sticked' form (see linkgit:gitcli[7]) due to limitations in the +command line parser. + +rev-list options and arguments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This manual page describes only the most frequently used options. See +linkgit:git-rev-list[1] for a complete list. + +--all:: + + Show all refs (branches, tags, etc.). + +--branches[=<pattern>]:: +--tags[=<pattern>]:: +--remotes[=<pattern>]:: - Limits the number of commits to show. + Pretend as if all the branches (tags, remote branches, resp.) + are listed on the command line as '<commit>'. If '<pattern>' + is given, limit refs to ones matching given shell glob. If + pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the + end is implied. --since=<date>:: @@ -40,9 +57,9 @@ frequently used options. Show commits older than a specific date. ---all:: +--date-order:: - Show all branches. + Sort commits by date when possible. --merge:: @@ -51,19 +68,53 @@ frequently used options. that modify the conflicted files and do not exist on all the heads being merged. ---argscmd=<command>:: - Command to be run each time gitk has to determine the list of - <revs> to show. The command is expected to print on its standard - output a list of additional revs to be shown, one per line. - Use this instead of explicitly specifying <revs> if the set of - commits to show may vary between refreshes. +--left-right:: ---select-commit=<ref>:: + Mark which side of a symmetric diff a commit is reachable + from. Commits from the left side are prefixed with a `<` + symbol and those from the right with a `>` symbol. - Automatically select the specified commit after loading the graph. - Default behavior is equivalent to specifying '--select-commit=HEAD'. +--full-history:: + + When filtering history with '<path>...', does not prune some + history. (See "History simplification" in linkgit:git-log[1] + for a more detailed explanation.) + +--simplify-merges:: + + Additional option to '--full-history' to remove some needless + merges from the resulting history, as there are no selected + commits contributing to this merge. (See "History + simplification" in linkgit:git-log[1] for a more detailed + explanation.) -<revs>:: +--ancestry-path:: + + When given a range of commits to display + (e.g. 'commit1..commit2' or 'commit2 {caret}commit1'), only + display commits that exist directly on the ancestry chain + between the 'commit1' and 'commit2', i.e. commits that are + both descendants of 'commit1', and ancestors of 'commit2'. + (See "History simplification" in linkgit:git-log[1] for a more + detailed explanation.) + +-L<start>,<end>:<file>:: +-L:<regex>:<file>:: + + Trace the evolution of the line range given by "<start>,<end>" + (or the funcname regex <regex>) within the <file>. You may + not give any pathspec limiters. This is currently limited to + a walk starting from a single revision, i.e., you may only + give zero or one positive revision arguments. + You can specify this option more than once. ++ +*Note:* gitk (unlike linkgit:git-log[1]) currently only understands +this option if you specify it "glued together" with its argument. Do +*not* put a space after `-L`. ++ +include::line-range-format.txt[] + +<revision range>:: Limit the revisions to show. This can be either a single revision meaning show from the given revision and back, or it can be a range in @@ -78,6 +129,23 @@ frequently used options. avoid ambiguity with respect to revision names use "--" to separate the paths from any preceding options. +gitk-specific options +~~~~~~~~~~~~~~~~~~~~~ + +--argscmd=<command>:: + + Command to be run each time gitk has to determine the revision + range to show. The command is expected to print on its + standard output a list of additional revisions to be shown, + one per line. Use this instead of explicitly specifying a + '<revision range>' if the set of commits to show may vary + between refreshes. + +--select-commit=<ref>:: + + Select the specified commit after loading the graph. + Default behavior is equivalent to specifying '--select-commit=HEAD'. + Examples -------- gitk v2.6.12.. include/scsi drivers/scsi:: @@ -101,6 +169,13 @@ Files Gitk creates the .gitk file in your $HOME directory to store preferences such as display options, font, and colors. +History +------- +Gitk was the first graphical repository browser. It's written in +tcl/tk and started off in a separate repository but was later merged +into the main Git repository. + + SEE ALSO -------- 'qgit(1)':: diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index f7be93f631..f539e3f66a 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -35,6 +35,8 @@ submodule.<name>.url:: linkgit:git-clone[1] or (if it begins with ./ or ../) a location relative to the superproject's origin repository. +In addition, there are a number of optional keys: + submodule.<name>.update:: Defines what to do when the submodule is updated by the superproject. If 'checkout' (the default), the new commit specified in the @@ -53,6 +55,10 @@ submodule.<name>.branch:: A remote branch name for tracking updates in the upstream submodule. If the option is not specified, it defaults to 'master'. See the `--remote` documentation in linkgit:git-submodule[1] for details. ++ +This branch name is also used for the local branch created by +non-checkout cloning updates. See the `update` documentation in +linkgit:git-submodule[1] for details. submodule.<name>.fetchRecurseSubmodules:: This option can be used to control recursive fetching of this diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt index e75699ce1f..64f7ad26b4 100644 --- a/Documentation/gitremote-helpers.txt +++ b/Documentation/gitremote-helpers.txt @@ -441,6 +441,13 @@ set by Git if the remote helper has the 'option' capability. Request the helper to perform a force update. Defaults to 'false'. +'option cloning \{'true'|'false'\}:: + Notify the helper this is a clone request (i.e. the current + repository is guaranteed empty). + +'option update-shallow \{'true'|'false'\}:: + Allow to extend .git/shallow if the new refs require it. + SEE ALSO -------- linkgit:git-remote[1] diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt index 305db633cc..952f503afb 100644 --- a/Documentation/gitweb.conf.txt +++ b/Documentation/gitweb.conf.txt @@ -630,13 +630,13 @@ need to set this element to empty list i.e. `[]`. override:: If this field has a true value then the given feature is - overriddable, which means that it can be configured + overridable, which means that it can be configured (or enabled/disabled) on a per-repository basis. + Usually given "<feature>" is configurable via the `gitweb.<feature>` config variable in the per-repository Git configuration file. + -*Note* that no feature is overriddable by default. +*Note* that no feature is overridable by default. sub:: Internal detail of implementation. What is important is that @@ -822,18 +822,18 @@ timed:: Project specific override is not supported. javascript-timezone:: - Enable and configure the ability to change a common timezone for dates + Enable and configure the ability to change a common time zone for dates in gitweb output via JavaScript. Dates in gitweb output include authordate and committerdate in "commit", "commitdiff" and "log" views, and taggerdate in "tag" view. Enabled by default. + -The value is a list of three values: a default timezone (for if the client -hasn't selected some other timezone and saved it in a cookie), a name of cookie -where to store selected timezone, and a CSS class used to mark up +The value is a list of three values: a default time zone (for if the client +hasn't selected some other time zone and saved it in a cookie), a name of cookie +where to store selected time zone, and a CSS class used to mark up dates for manipulation. If you want to turn this feature off, set "default" to empty list: `[]`. + -Typical gitweb config files will only change starting (default) timezone, +Typical gitweb config files will only change starting (default) time zone, and leave other elements at their default values: + --------------------------------------------------------------------------- @@ -843,12 +843,49 @@ $feature{'javascript-timezone'}{'default'}[0] = "utc"; The example configuration presented here is guaranteed to be backwards and forward compatible. + -Timezone values can be "local" (for local timezone that browser uses), "utc" +Time zone values can be "local" (for local time zone that browser uses), "utc" (what gitweb uses when JavaScript or this feature is disabled), or numerical -timezones in the form of "+/-HHMM", such as "+0200". +time zones in the form of "+/-HHMM", such as "+0200". + Project specific override is not supported. +extra-branch-refs:: + List of additional directories under "refs" which are going to + be used as branch refs. For example if you have a gerrit setup + where all branches under refs/heads/ are official, + push-after-review ones and branches under refs/sandbox/, + refs/wip and refs/other are user ones where permissions are + much wider, then you might want to set this variable as + follows: ++ +-------------------------------------------------------------------------------- +$feature{'extra-branch-refs'}{'default'} = + ['sandbox', 'wip', 'other']; +-------------------------------------------------------------------------------- ++ +This feature can be configured on per-repository basis after setting +$feature{'extra-branch-refs'}{'override'} to true, via repository's +`gitweb.extraBranchRefs` configuration variable, which contains a +space separated list of refs. An example: ++ +-------------------------------------------------------------------------------- +[gitweb] + extraBranchRefs = sandbox wip other +-------------------------------------------------------------------------------- ++ +The gitweb.extraBranchRefs is actually a multi-valued configuration +variable, so following example is also correct and the result is the +same as of the snippet above: ++ +-------------------------------------------------------------------------------- +[gitweb] + extraBranchRefs = sandbox + extraBranchRefs = wip other +-------------------------------------------------------------------------------- ++ +It is an error to specify a ref that does not pass "git check-ref-format" +scrutiny. Duplicated values are filtered. + EXAMPLES -------- diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.txt index cca14b8cc3..cd9c8951b2 100644 --- a/Documentation/gitweb.txt +++ b/Documentation/gitweb.txt @@ -84,7 +84,7 @@ separator (rules for Perl's "`split(" ", $line)`"). * Fields use modified URI encoding, defined in RFC 3986, section 2.1 (Percent-Encoding), or rather "Query string encoding" (see -link:http://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference +http://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference being that SP (" ") can be encoded as "{plus}" (and therefore "{plus}" has to be also percent-encoded). + diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt index e4706615be..378306f581 100644 --- a/Documentation/glossary-content.txt +++ b/Documentation/glossary-content.txt @@ -323,24 +323,26 @@ including Documentation/chapter_1/figure_1.jpg. A pathspec that begins with a colon `:` has special meaning. In the short form, the leading colon `:` is followed by zero or more "magic signature" letters (which optionally is terminated by another colon `:`), -and the remainder is the pattern to match against the path. The optional -colon that terminates the "magic signature" can be omitted if the pattern -begins with a character that cannot be a "magic signature" and is not a -colon. +and the remainder is the pattern to match against the path. +The "magic signature" consists of ASCII symbols that are neither +alphanumeric, glob, regex special charaters nor colon. +The optional colon that terminates the "magic signature" can be +omitted if the pattern begins with a character that does not belong to +"magic signature" symbol set and is not a colon. + In the long form, the leading colon `:` is followed by a open parenthesis `(`, a comma-separated list of zero or more "magic words", and a close parentheses `)`, and the remainder is the pattern to match against the path. + -The "magic signature" consists of an ASCII symbol that is not -alphanumeric. +A pathspec with only a colon means "there is no pathspec". This form +should not be combined with other pathspec. + -- -top `/`;; - The magic word `top` (mnemonic: `/`) makes the pattern match - from the root of the working tree, even when you are running - the command from inside a subdirectory. +top;; + The magic word `top` (magic signature: `/`) makes the pattern + match from the root of the working tree, even when you are + running the command from inside a subdirectory. literal;; Wildcards in the pattern such as `*` or `?` are treated @@ -362,12 +364,12 @@ full pathname may have special meaning: - A leading "`**`" followed by a slash means match in all directories. For example, "`**/foo`" matches file or directory - "`foo`" anywhere, the same as pattern "`foo`". "**/foo/bar" + "`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`" matches file or directory "`bar`" anywhere that is directly under directory "`foo`". - - A trailing "/**" matches everything inside. For example, - "abc/**" matches all files inside directory "abc", relative + - A trailing "`/**`" matches everything inside. For example, + "`abc/**`" matches all files inside directory "abc", relative to the location of the `.gitignore` file, with infinite depth. - A slash followed by two consecutive asterisks then a slash @@ -377,14 +379,12 @@ full pathname may have special meaning: - Other consecutive asterisks are considered invalid. + Glob magic is incompatible with literal magic. + +exclude;; + After a path matches any non-exclude pathspec, it will be run + through all exclude pathspec (magic signature: `!`). If it + matches, the path is ignored. -- -+ -Currently only the slash `/` is recognized as the "magic signature", -but it is envisioned that we will support more types of magic in later -versions of Git. -+ -A pathspec with only a colon means "there is no pathspec". This form -should not be combined with other pathspec. [[def_parent]]parent:: A <<def_commit_object,commit object>> contains a (possibly empty) list diff --git a/Documentation/howto/maintain-git.txt b/Documentation/howto/maintain-git.txt index 33ae69c11f..ca4378740c 100644 --- a/Documentation/howto/maintain-git.txt +++ b/Documentation/howto/maintain-git.txt @@ -39,26 +39,26 @@ The policy on Integration is informally mentioned in "A Note from the maintainer" message, which is periodically posted to this mailing list after each feature release is made. - - Feature releases are numbered as vX.Y.Z and are meant to + - Feature releases are numbered as vX.Y.0 and are meant to contain bugfixes and enhancements in any area, including functionality, performance and usability, without regression. - One release cycle for a feature release is expected to last for eight to ten weeks. - - Maintenance releases are numbered as vX.Y.Z.W and are meant - to contain only bugfixes for the corresponding vX.Y.Z feature - release and earlier maintenance releases vX.Y.Z.V (V < W). + - Maintenance releases are numbered as vX.Y.Z and are meant + to contain only bugfixes for the corresponding vX.Y.0 feature + release and earlier maintenance releases vX.Y.W (W < Z). - 'master' branch is used to prepare for the next feature release. In other words, at some point, the tip of 'master' - branch is tagged with vX.Y.Z. + branch is tagged with vX.Y.0. - 'maint' branch is used to prepare for the next maintenance - release. After the feature release vX.Y.Z is made, the tip + release. After the feature release vX.Y.0 is made, the tip of 'maint' branch is set to that release, and bugfixes will accumulate on the branch, and at some point, the tip of the - branch is tagged with vX.Y.Z.1, vX.Y.Z.2, and so on. + branch is tagged with vX.Y.1, vX.Y.2, and so on. - 'next' branch is used to publish changes (both enhancements and fixes) that (1) have worthwhile goal, (2) are in a fairly @@ -86,6 +86,10 @@ this mailing list after each feature release is made. users are encouraged to test it so that regressions and bugs are found before new topics are merged to 'master'. +Note that before v1.9.0 release, the version numbers used to be +structured slightly differently. vX.Y.Z were feature releases while +vX.Y.Z.W were maintenance releases for vX.Y.Z. + A Typical Git Day ----------------- diff --git a/Documentation/howto/recover-corrupted-object-harder.txt b/Documentation/howto/recover-corrupted-object-harder.txt new file mode 100644 index 0000000000..6f33dac0e0 --- /dev/null +++ b/Documentation/howto/recover-corrupted-object-harder.txt @@ -0,0 +1,242 @@ +Date: Wed, 16 Oct 2013 04:34:01 -0400 +From: Jeff King <peff@peff.net> +Subject: pack corruption post-mortem +Abstract: Recovering a corrupted object when no good copy is available. +Content-type: text/asciidoc + +How to recover an object from scratch +===================================== + +I was recently presented with a repository with a corrupted packfile, +and was asked if the data was recoverable. This post-mortem describes +the steps I took to investigate and fix the problem. I thought others +might find the process interesting, and it might help somebody in the +same situation. + +******************************** +Note: In this case, no good copy of the repository was available. For +the much easier case where you can get the corrupted object from +elsewhere, see link:recover-corrupted-blob-object.html[this howto]. +******************************** + +I started with an fsck, which found a problem with exactly one object +(I've used $pack and $obj below to keep the output readable, and also +because I'll refer to them later): + +----------- + $ git fsck + error: $pack SHA1 checksum mismatch + error: index CRC mismatch for object $obj from $pack at offset 51653873 + error: inflate: data stream error (incorrect data check) + error: cannot unpack $obj from $pack at offset 51653873 +----------- + +The pack checksum failing means a byte is munged somewhere, and it is +presumably in the object mentioned (since both the index checksum and +zlib were failing). + +Reading the zlib source code, I found that "incorrect data check" means +that the adler-32 checksum at the end of the zlib data did not match the +inflated data. So stepping the data through zlib would not help, as it +did not fail until the very end, when we realize the crc does not match. +The problematic bytes could be anywhere in the object data. + +The first thing I did was pull the broken data out of the packfile. I +needed to know how big the object was, which I found out with: + +------------ + $ git show-index <$idx | cut -d' ' -f1 | sort -n | grep -A1 51653873 + 51653873 + 51664736 +------------ + +Show-index gives us the list of objects and their offsets. We throw away +everything but the offsets, and then sort them so that our interesting +offset (which we got from the fsck output above) is followed immediately +by the offset of the next object. Now we know that the object data is +10863 bytes long, and we can grab it with: + +------------ + dd if=$pack of=object bs=1 skip=51653873 count=10863 +------------ + +I inspected a hexdump of the data, looking for any obvious bogosity +(e.g., a 4K run of zeroes would be a good sign of filesystem +corruption). But everything looked pretty reasonable. + +Note that the "object" file isn't fit for feeding straight to zlib; it +has the git packed object header, which is variable-length. We want to +strip that off so we can start playing with the zlib data directly. You +can either work your way through it manually (the format is described in +link:../technical/pack-format.html[Documentation/technical/pack-format.txt]), +or you can walk through it in a debugger. I did the latter, creating a +valid pack like: + +------------ + # pack magic and version + printf 'PACK\0\0\0\2' >tmp.pack + # pack has one object + printf '\0\0\0\1' >>tmp.pack + # now add our object data + cat object >>tmp.pack + # and then append the pack trailer + /path/to/git.git/test-sha1 -b <tmp.pack >trailer + cat trailer >>tmp.pack +------------ + +and then running "git index-pack tmp.pack" in the debugger (stop at +unpack_raw_entry). Doing this, I found that there were 3 bytes of header +(and the header itself had a sane type and size). So I stripped those +off with: + +------------ + dd if=object of=zlib bs=1 skip=3 +------------ + +I ran the result through zlib's inflate using a custom C program. And +while it did report the error, I did get the right number of output +bytes (i.e., it matched git's size header that we decoded above). But +feeding the result back to "git hash-object" didn't produce the same +sha1. So there were some wrong bytes, but I didn't know which. The file +happened to be C source code, so I hoped I could notice something +obviously wrong with it, but I didn't. I even got it to compile! + +I also tried comparing it to other versions of the same path in the +repository, hoping that there would be some part of the diff that didn't +make sense. Unfortunately, this happened to be the only revision of this +particular file in the repository, so I had nothing to compare against. + +So I took a different approach. Working under the guess that the +corruption was limited to a single byte, I wrote a program to munge each +byte individually, and try inflating the result. Since the object was +only 10K compressed, that worked out to about 2.5M attempts, which took +a few minutes. + +The program I used is here: + +---------------------------------------------- +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <signal.h> +#include <zlib.h> + +static int try_zlib(unsigned char *buf, int len) +{ + /* make this absurdly large so we don't have to loop */ + static unsigned char out[1024*1024]; + z_stream z; + int ret; + + memset(&z, 0, sizeof(z)); + inflateInit(&z); + + z.next_in = buf; + z.avail_in = len; + z.next_out = out; + z.avail_out = sizeof(out); + + ret = inflate(&z, 0); + inflateEnd(&z); + return ret >= 0; +} + +/* eye candy */ +static int counter = 0; +static void progress(int sig) +{ + fprintf(stderr, "\r%d", counter); + alarm(1); +} + +int main(void) +{ + /* oversized so we can read the whole buffer in */ + unsigned char buf[1024*1024]; + int len; + unsigned i, j; + + signal(SIGALRM, progress); + alarm(1); + + len = read(0, buf, sizeof(buf)); + for (i = 0; i < len; i++) { + unsigned char c = buf[i]; + for (j = 0; j <= 0xff; j++) { + buf[i] = j; + + counter++; + if (try_zlib(buf, len)) + printf("i=%d, j=%x\n", i, j); + } + buf[i] = c; + } + + alarm(0); + fprintf(stderr, "\n"); + return 0; +} +---------------------------------------------- + +I compiled and ran with: + +------- + gcc -Wall -Werror -O3 munge.c -o munge -lz + ./munge <zlib +------- + + +There were a few false positives early on (if you write "no data" in the +zlib header, zlib thinks it's just fine :) ). But I got a hit about +halfway through: + +------- + i=5642, j=c7 +------- + +I let it run to completion, and got a few more hits at the end (where it +was munging the crc to match our broken data). So there was a good +chance this middle hit was the source of the problem. + +I confirmed by tweaking the byte in a hex editor, zlib inflating the +result (no errors!), and then piping the output into "git hash-object", +which reported the sha1 of the broken object. Success! + +I fixed the packfile itself with: + +------- + chmod +w $pack + printf '\xc7' | dd of=$pack bs=1 seek=51659518 conv=notrunc + chmod -w $pack +------- + +The `\xc7` comes from the replacement byte our "munge" program found. +The offset 51659518 is derived by taking the original object offset +(51653873), adding the replacement offset found by "munge" (5642), and +then adding back in the 3 bytes of git header we stripped. + +After that, "git fsck" ran clean. + +As for the corruption itself, I was lucky that it was indeed a single +byte. In fact, it turned out to be a single bit. The byte 0xc7 was +corrupted to 0xc5. So presumably it was caused by faulty hardware, or a +cosmic ray. + +And the aborted attempt to look at the inflated output to see what was +wrong? I could have looked forever and never found it. Here's the diff +between what the corrupted data inflates to, versus the real data: + +-------------- + - cp = strtok (arg, "+"); + + cp = strtok (arg, "."); +-------------- + +It tweaked one byte and still ended up as valid, readable C that just +happened to do something totally different! One takeaway is that on a +less unlucky day, looking at the zlib output might have actually been +helpful, as most random changes would actually break the C code. + +But more importantly, git's hashing and checksumming noticed a problem +that easily could have gone undetected in another system. The result +still compiled, but would have caused an interesting bug (that would +have been blamed on some random commit). diff --git a/Documentation/howto/setup-git-server-over-http.txt b/Documentation/howto/setup-git-server-over-http.txt index 981cbddc86..6de4f3c487 100644 --- a/Documentation/howto/setup-git-server-over-http.txt +++ b/Documentation/howto/setup-git-server-over-http.txt @@ -6,6 +6,10 @@ Content-type: text/asciidoc How to setup Git server over http ================================= +NOTE: This document is from 2006. A lot has happened since then, and this +document is now relevant mainly if your web host is not CGI capable. +Almost everyone else should instead look at linkgit:git-http-backend[1]. + Since Apache is one of those packages people like to compile themselves while others prefer the bureaucrat's dream Debian, it is impossible to give guidelines which will work for everyone. Just send diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt index afba8d4f3b..e1343155fa 100644 --- a/Documentation/merge-options.txt +++ b/Documentation/merge-options.txt @@ -14,9 +14,12 @@ inspect and further tweak the merge result before committing. further edit the auto-generated merge message, so that the user can explain and justify the merge. The `--no-edit` option can be used to accept the auto-generated message (this is generally - discouraged). The `--edit` (or `-e`) option is still useful if you are - giving a draft message with the `-m` option from the command line - and want to edit it in the editor. + discouraged). +ifndef::git-pull[] +The `--edit` (or `-e`) option is still useful if you are +giving a draft message with the `-m` option from the command line +and want to edit it in the editor. +endif::git-pull[] + Older scripts may depend on the historical behaviour of not allowing the user to edit the merge log message. They will see an editor opened when diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt index 49a9a7d53f..350949810e 100644 --- a/Documentation/merge-strategies.txt +++ b/Documentation/merge-strategies.txt @@ -20,7 +20,7 @@ recursive:: merged tree of the common ancestors and uses that as the reference tree for the 3-way merge. This has been reported to result in fewer merge conflicts without - causing mis-merges by tests done on actual merge commits + causing mismerges by tests done on actual merge commits taken from Linux 2.6 kernel development history. Additionally this can detect and handle merges involving renames. This is the default merge strategy when @@ -113,3 +113,11 @@ subtree:: match the tree structure of A, instead of reading the trees at the same level. This adjustment is also done to the common ancestor tree. + +With the strategies that use 3-way merge (including the default, 'recursive'), +if a change is made on both branches, but later reverted on one of the +branches, that change will be present in the merged result; some people find +this behavior confusing. It occurs because only the heads and the merge base +are considered when performing a merge, not the individual commits. The merge +algorithm therefore considers the reverted change as no change at all, and +substitutes the changed version instead. diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 5bdfb42852..9a3da3646e 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -18,33 +18,27 @@ ordering and formatting options, such as `--reverse`. -<number>:: -n <number>:: --max-count=<number>:: - Limit the number of commits to output. --skip=<number>:: - Skip 'number' commits before starting to show the commit output. --since=<date>:: --after=<date>:: - Show commits more recent than a specific date. --until=<date>:: --before=<date>:: - Show commits older than a specific date. ifdef::git-rev-list[] --max-age=<timestamp>:: --min-age=<timestamp>:: - Limit the commits output to specified time range. endif::git-rev-list[] --author=<pattern>:: --committer=<pattern>:: - Limit the commits output to ones with author/committer header lines that match the specified pattern (regular expression). With more than one `--author=<pattern>`, @@ -52,7 +46,6 @@ endif::git-rev-list[] 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 @@ -60,7 +53,6 @@ endif::git-rev-list[] 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). With more than one `--grep=<pattern>`, commits whose message @@ -71,46 +63,39 @@ 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, + Limit the commits output to ones that match all given `--grep`, instead of ones that match at least one. -i:: --regexp-ignore-case:: - - Match the regexp limiting patterns without regard to letters case. + Match the regular expression limiting patterns without regard to letter + case. --basic-regexp:: - Consider the limiting patterns to be basic regular expressions; this is the default. -E:: --extended-regexp:: - Consider the limiting patterns to be extended regular expressions instead of the default basic regular expressions. -F:: --fixed-strings:: - Consider the limiting patterns to be fixed strings (don't interpret pattern as a regular expression). --perl-regexp:: - - Consider the limiting patterns to be Perl-compatible regexp. + Consider the limiting patterns to be Perl-compatible regular expressions. Requires libpcre to be compiled in. --remove-empty:: - Stop when a given path disappears from the tree. --merges:: - Print only merge commits. This is exactly the same as `--min-parents=2`. --no-merges:: - Do not print commits with more than one parent. This is exactly the same as `--max-parents=1`. @@ -118,7 +103,6 @@ if it is part of the log message. --max-parents=<number>:: --no-min-parents:: --no-max-parents:: - Show only commits which have at least (or at most) that many parent commits. In particular, `--max-parents=1` is the same as `--no-merges`, `--min-parents=2` is the same as `--merges`. `--max-parents=0` @@ -138,31 +122,26 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit). brought in to your history by such a merge. --not:: - Reverses the meaning of the '{caret}' prefix (or lack thereof) - for all following revision specifiers, up to the next '--not'. + for all following revision specifiers, up to the next `--not`. --all:: - Pretend as if all the refs in `refs/` are listed on the command line as '<commit>'. --branches[=<pattern>]:: - Pretend as if all the refs in `refs/heads` are listed on the command line as '<commit>'. If '<pattern>' is given, limit branches to ones matching given shell glob. If pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the end is implied. --tags[=<pattern>]:: - Pretend as if all the refs in `refs/tags` are listed on the command line as '<commit>'. If '<pattern>' is given, limit tags to ones matching given shell glob. If pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the end is implied. --remotes[=<pattern>]:: - Pretend as if all the refs in `refs/remotes` are listed on the command line as '<commit>'. If '<pattern>' is given, limit remote-tracking branches to ones matching given shell glob. @@ -174,14 +153,27 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit). is automatically prepended if missing. If pattern lacks '?', '{asterisk}', or '[', '/{asterisk}' at the end is implied. ---ignore-missing:: +--exclude=<glob-pattern>:: + + Do not include refs matching '<glob-pattern>' that the next `--all`, + `--branches`, `--tags`, `--remotes`, or `--glob` would otherwise + consider. Repetitions of this option accumulate exclusion patterns + up to the next `--all`, `--branches`, `--tags`, `--remotes`, or + `--glob` option (other options or arguments do not clear + accumlated patterns). ++ +The patterns given should not begin with `refs/heads`, `refs/tags`, or +`refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`, +respectively, and they must begin with `refs/` when applied to `--glob` +or `--all`. If a trailing '/{asterisk}' is intended, it must be given +explicitly. +--ignore-missing:: Upon seeing an invalid object name in the input, pretend as if the bad input was not given. ifndef::git-rev-list[] --bisect:: - Pretend as if the bad bisection ref `refs/bisect/bad` was listed and as if it was followed by `--not` and the good bisection refs `refs/bisect/good-*` on the command @@ -189,7 +181,6 @@ ifndef::git-rev-list[] endif::git-rev-list[] --stdin:: - In addition to the '<commit>' listed on the command line, read them from the standard input. If a '--' separator is seen, stop reading commits and start reading paths to limit the @@ -197,36 +188,32 @@ endif::git-rev-list[] ifdef::git-rev-list[] --quiet:: - Don't print anything to standard output. This form is primarily meant to allow the caller to test the exit status to see if a range of objects is fully connected (or not). It is faster than redirecting stdout - to /dev/null as the output does not have to be formatted. + to `/dev/null` as the output does not have to be formatted. endif::git-rev-list[] --cherry-mark:: - Like `--cherry-pick` (see below) but mark equivalent commits with `=` rather than omitting them, and inequivalent ones with `+`. --cherry-pick:: - Omit any commit that introduces the same change as - another commit on the "other side" when the set of + another commit on the ``other side'' when the set of commits are limited with symmetric difference. + For example, if you have two branches, `A` and `B`, a usual way to list all commits on only one side of them is with `--left-right` (see the example below in the description of -the `--left-right` option). It however shows the commits that were cherry-picked -from the other branch (for example, "3rd on b" may be cherry-picked -from branch A). With this option, such pairs of commits are +the `--left-right` option). However, it shows the commits that were +cherry-picked from the other branch (for example, ``3rd on b'' may be +cherry-picked from branch A). With this option, such pairs of commits are excluded from the output. --left-only:: --right-only:: - List only commits on the respective side of a symmetric range, i.e. only those which would be marked `<` resp. `>` by `--left-right`. @@ -238,7 +225,6 @@ More precisely, `--cherry-pick --right-only --no-merges` gives the exact list. --cherry:: - A synonym for `--right-only --cherry-mark --no-merges`; useful to limit the output to the commits on our side and mark those that have been applied to the other side of a forked history with @@ -247,33 +233,38 @@ list. -g:: --walk-reflogs:: - Instead of walking the commit ancestry chain, walk reflog entries from the most recent one to older ones. When this option is used you cannot specify commits to exclude (that is, '{caret}commit', 'commit1..commit2', nor 'commit1\...commit2' notations cannot be used). + -With '\--pretty' format other than oneline (for obvious reasons), +With `--pretty` format other than `oneline` (for obvious reasons), this causes the output to have two extra lines of information taken from the reflog. By default, 'commit@\{Nth}' notation is used in the output. When the starting commit is specified as 'commit@\{now}', output also uses 'commit@\{timestamp}' notation -instead. Under '\--pretty=oneline', the commit message is +instead. Under `--pretty=oneline`, the commit message is prefixed with this information on the same line. -This option cannot be combined with '\--reverse'. +This option cannot be combined with `--reverse`. See also linkgit:git-reflog[1]. --merge:: - After a failed merge, show refs that touch files having a conflict and don't exist on all heads to merge. --boundary:: - Output excluded boundary commits. Boundary commits are prefixed with `-`. +ifdef::git-rev-list[] +--use-bitmap-index:: + + Try to speed up the traversal using the pack bitmap index (if + one is available). Note that when traversing with `--objects`, + trees and blobs will not have their associated path printed. +endif::git-rev-list[] + -- History Simplification @@ -287,11 +278,9 @@ is how to do it, as there are various strategies to simplify the history. The following options select the commits to be shown: <paths>:: - Commits modifying the given <paths> are selected. --simplify-by-decoration:: - Commits that are referred by some branch or tag are selected. Note that extra commits can be shown to give a meaningful history. @@ -299,33 +288,27 @@ Note that extra commits can be shown to give a meaningful history. The following options affect the way the simplification is performed: Default mode:: - Simplifies the history to the simplest history explaining the final state of the tree. Simplest because it prunes some side branches if the end result is the same (i.e. merging branches with the same content) --full-history:: - Same as the default mode, but does not prune some history. --dense:: - Only the selected commits are shown, plus some to have a meaningful history. --sparse:: - All commits in the simplified history are shown. --simplify-merges:: - - Additional option to '--full-history' to remove some needless + Additional option to `--full-history` to remove some needless merges from the resulting history, as there are no selected commits contributing to this merge. --ancestry-path:: - When given a range of commits to display (e.g. 'commit1..commit2' or 'commit2 {caret}commit1'), only display commits that exist directly on the ancestry chain between the 'commit1' and @@ -352,36 +335,35 @@ The horizontal line of history A---Q is taken to be the first parent of each merge. The commits are: * `I` is the initial commit, in which `foo` exists with contents - "asdf", and a file `quux` exists with contents "quux". Initial + ``asdf'', and a file `quux` exists with contents ``quux''. Initial commits are compared to an empty tree, so `I` is !TREESAME. -* In `A`, `foo` contains just "foo". +* In `A`, `foo` contains just ``foo''. * `B` contains the same change as `A`. Its merge `M` is trivial and hence TREESAME to all parents. -* `C` does not change `foo`, but its merge `N` changes it to "foobar", +* `C` does not change `foo`, but its merge `N` changes it to ``foobar'', so it is not TREESAME to any parent. -* `D` sets `foo` to "baz". Its merge `O` combines the strings from - `N` and `D` to "foobarbaz"; i.e., it is not TREESAME to any parent. +* `D` sets `foo` to ``baz''. Its merge `O` combines the strings from + `N` and `D` to ``foobarbaz''; i.e., it is not TREESAME to any parent. -* `E` changes `quux` to "xyzzy", and its merge `P` combines the - strings to "quux xyzzy". `P` is TREESAME to `O`, but not to `E`. +* `E` changes `quux` to ``xyzzy'', and its merge `P` combines the + strings to ``quux xyzzy''. `P` is TREESAME to `O`, but not to `E`. * `X` is an independent root commit that added a new file `side`, and `Y` modified it. `Y` is TREESAME to `X`. Its merge `Q` added `side` to `P`, and `Q` is TREESAME to `P`, but not to `Y`. -'rev-list' walks backwards through history, including or excluding -commits based on whether '\--full-history' and/or parent rewriting -(via '\--parents' or '\--children') are used. The following settings +`rev-list` walks backwards through history, including or excluding +commits based on whether `--full-history` and/or parent rewriting +(via `--parents` or `--children`) are used. The following settings are available. Default mode:: - Commits are included if they are not TREESAME to any parent - (though this can be changed, see '\--sparse' below). If the + (though this can be changed, see `--sparse` below). If the commit was a merge, and it was TREESAME to one parent, follow only that parent. (Even if there are several TREESAME parents, follow only one of them.) Otherwise, follow all @@ -400,12 +382,11 @@ available, removed `B` from consideration entirely. `C` was considered via `N`, but is TREESAME. Root commits are compared to an empty tree, so `I` is !TREESAME. + -Parent/child relations are only visible with --parents, but that does +Parent/child relations are only visible with `--parents`, but that does not affect the commits selected in default mode, so we have shown the parent lines. --full-history without parent rewriting:: - This mode differs from the default in one point: always follow all parents of a merge, even if it is TREESAME to one of them. Even if more than one side of the merge has commits that are @@ -425,9 +406,8 @@ about the parent/child relationships between the commits, so we show them disconnected. --full-history with parent rewriting:: - Ordinary commits are only included if they are !TREESAME - (though this can be changed, see '\--sparse' below). + (though this can be changed, see `--sparse` below). + Merges are always included. However, their parent list is rewritten: Along each parent, prune away commits that are not included @@ -441,7 +421,7 @@ themselves. This results in `-------------' ----------------------------------------------------------------------- + -Compare to '\--full-history' without rewriting above. Note that `E` +Compare to `--full-history` without rewriting above. Note that `E` was pruned away because it is TREESAME, but the parent list of P was rewritten to contain `E`'s parent `I`. The same happened for `C` and `N`, and `X`, `Y` and `Q`. @@ -450,22 +430,19 @@ In addition to the above settings, you can change whether TREESAME affects inclusion: --dense:: - Commits that are walked are included if they are not TREESAME to any parent. --sparse:: - All commits that are walked are included. + -Note that without '\--full-history', this still simplifies merges: if +Note that without `--full-history`, this still simplifies merges: if one of the parents is TREESAME, we follow only that one, so the other sides of the merge are never walked. --simplify-merges:: - First, build a history graph in the same way that - '\--full-history' with parent rewriting does (see above). + `--full-history` with parent rewriting does (see above). + Then simplify each commit `C` to its replacement `C'` in the final history according to the following rules: @@ -484,7 +461,7 @@ history according to the following rules: -- + The effect of this is best shown by way of comparing to -'\--full-history' with parent rewriting. The example turns into: +`--full-history` with parent rewriting. The example turns into: + ----------------------------------------------------------------------- .-A---M---N---O @@ -494,7 +471,7 @@ The effect of this is best shown by way of comparing to `---------' ----------------------------------------------------------------------- + -Note the major differences in `N`, `P` and `Q` over '--full-history': +Note the major differences in `N`, `P`, and `Q` over `--full-history`: + -- * `N`'s parent list had `I` removed, because it is an ancestor of the @@ -511,11 +488,10 @@ Note the major differences in `N`, `P` and `Q` over '--full-history': Finally, there is a fifth simplification mode available: --ancestry-path:: - Limit the displayed commits to those directly on the ancestry - chain between the "from" and "to" commits in the given commit - range. I.e. only display commits that are ancestor of the "to" - commit, and descendants of the "from" commit. + chain between the ``from'' and ``to'' commits in the given commit + range. I.e. only display commits that are ancestor of the ``to'' + commit and descendants of the ``from'' commit. + As an example use case, consider the following commit history: + @@ -530,14 +506,14 @@ As an example use case, consider the following commit history: A regular 'D..M' computes the set of commits that are ancestors of `M`, but excludes the ones that are ancestors of `D`. This is useful to see what happened to the history leading to `M` since `D`, in the sense -that "what does `M` have that did not exist in `D`". The result in this +that ``what does `M` have that did not exist in `D`''. The result in this example would be all the commits, except `A` and `B` (and `D` itself, of course). + When we want to find out what commits in `M` are contaminated with the bug introduced by `D` and need fixing, however, we might want to view only the subset of 'D..M' that are actually descendants of `D`, i.e. -excluding `C` and `K`. This is exactly what the '--ancestry-path' +excluding `C` and `K`. This is exactly what the `--ancestry-path` option does. Applied to the 'D..M' range, it results in: + ----------------------------------------------------------------------- @@ -548,7 +524,7 @@ option does. Applied to the 'D..M' range, it results in: L--M ----------------------------------------------------------------------- -The '\--simplify-by-decoration' option allows you to view only the +The `--simplify-by-decoration` option allows you to view only the big picture of the topology of the history, by omitting commits that are not referenced by tags. Commits are marked as !TREESAME (in other words, kept after history simplification rules described @@ -561,50 +537,47 @@ Bisection Helpers ~~~~~~~~~~~~~~~~~ --bisect:: - -Limit output to the one commit object which is roughly halfway between -included and excluded commits. Note that the bad bisection ref -`refs/bisect/bad` is added to the included commits (if it -exists) and the good bisection refs `refs/bisect/good-*` are -added to the excluded commits (if they exist). Thus, supposing there -are no refs in `refs/bisect/`, if - + Limit output to the one commit object which is roughly halfway between + included and excluded commits. Note that the bad bisection ref + `refs/bisect/bad` is added to the included commits (if it + exists) and the good bisection refs `refs/bisect/good-*` are + added to the excluded commits (if they exist). Thus, supposing there + are no refs in `refs/bisect/`, if ++ ----------------------------------------------------------------------- $ git rev-list --bisect foo ^bar ^baz ----------------------------------------------------------------------- - ++ outputs 'midpoint', the output of the two commands - ++ ----------------------------------------------------------------------- $ git rev-list foo ^midpoint $ git rev-list midpoint ^bar ^baz ----------------------------------------------------------------------- - ++ would be of roughly the same length. Finding the change which introduces a regression is thus reduced to a binary search: repeatedly generate and test new 'midpoint's until the commit chain is of length one. --bisect-vars:: - -This calculates the same as `--bisect`, except that refs in -`refs/bisect/` are not used, and except that this outputs -text ready to be eval'ed by the shell. These lines will assign the -name of the midpoint revision to the variable `bisect_rev`, and the -expected number of commits to be tested after `bisect_rev` is tested -to `bisect_nr`, the expected number of commits to be tested if -`bisect_rev` turns out to be good to `bisect_good`, the expected -number of commits to be tested if `bisect_rev` turns out to be bad to -`bisect_bad`, and the number of commits we are bisecting right now to -`bisect_all`. + This calculates the same as `--bisect`, except that refs in + `refs/bisect/` are not used, and except that this outputs + text ready to be eval'ed by the shell. These lines will assign the + name of the midpoint revision to the variable `bisect_rev`, and the + expected number of commits to be tested after `bisect_rev` is tested + to `bisect_nr`, the expected number of commits to be tested if + `bisect_rev` turns out to be good to `bisect_good`, the expected + number of commits to be tested if `bisect_rev` turns out to be bad to + `bisect_bad`, and the number of commits we are bisecting right now to + `bisect_all`. --bisect-all:: - -This outputs all the commit objects between the included and excluded -commits, ordered by their distance to the included and excluded -commits. Refs in `refs/bisect/` are not used. The farthest -from them is displayed first. (This is the only one displayed by -`--bisect`.) + This outputs all the commit objects between the included and excluded + commits, ordered by their distance to the included and excluded + commits. Refs in `refs/bisect/` are not used. The farthest + from them is displayed first. (This is the only one displayed by + `--bisect`.) + This is useful because it makes it easy to choose a good commit to test when you want to avoid to test some of them for some reason (they @@ -654,9 +627,8 @@ avoid showing the commits from two parallel development track mixed together. --reverse:: - Output the commits in reverse order. - Cannot be combined with '\--walk-reflogs'. + Cannot be combined with `--walk-reflogs`. Object Traversal ~~~~~~~~~~~~~~~~ @@ -664,37 +636,32 @@ Object Traversal These options are mostly targeted for packing of Git repositories. --objects:: - Print the object IDs of any object referenced by the listed - commits. '--objects foo ^bar' thus means "send me + commits. `--objects foo ^bar` thus means ``send me all object IDs which I need to download if I have the commit - object 'bar', but not 'foo'". + object _bar_ but not _foo_''. --objects-edge:: - - Similar to '--objects', but also print the IDs of excluded - commits prefixed with a "-" character. This is used by - linkgit:git-pack-objects[1] to build "thin" pack, which records + Similar to `--objects`, but also print the IDs of excluded + commits prefixed with a ``-'' character. This is used by + linkgit:git-pack-objects[1] to build ``thin'' pack, which records objects in deltified form based on objects contained in these excluded commits to reduce network traffic. --unpacked:: - - Only useful with '--objects'; print the object IDs that are not + Only useful with `--objects`; print the object IDs that are not in packs. --no-walk[=(sorted|unsorted)]:: - 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 + `unsorted` is given, the commits are shown in the order they were + given on the command line. Otherwise (if `sorted` or no argument + was given), the commits are shown in reverse chronological order by commit time. --do-walk:: - - Overrides a previous --no-walk. + Overrides a previous `--no-walk`. Commit Formatting ~~~~~~~~~~~~~~~~~ @@ -708,46 +675,41 @@ endif::git-rev-list[] include::pretty-options.txt[] --relative-date:: - Synonym for `--date=relative`. --date=(relative|local|default|iso|rfc|short|raw):: - Only takes effect for dates shown in human-readable format, such - as when using "--pretty". `log.date` config variable sets a default - value for log command's --date option. + as when using `--pretty`. `log.date` config variable sets a default + value for the log command's `--date` option. + `--date=relative` shows dates relative to the current time, -e.g. "2 hours ago". +e.g. ``2 hours ago''. + -`--date=local` shows timestamps in user's local timezone. +`--date=local` shows timestamps in user's local time zone. + `--date=iso` (or `--date=iso8601`) shows timestamps in ISO 8601 format. + `--date=rfc` (or `--date=rfc2822`) shows timestamps in RFC 2822 -format, often found in E-mail messages. +format, often found in email messages. + -`--date=short` shows only date but not time, in `YYYY-MM-DD` format. +`--date=short` shows only the date, but not the time, in `YYYY-MM-DD` format. + `--date=raw` shows the date in the internal raw Git format `%s %z` format. + -`--date=default` shows timestamps in the original timezone +`--date=default` shows timestamps in the original time zone (either committer's or author's). ifdef::git-rev-list[] --header:: - Print the contents of the commit in raw-format; each record is separated with a NUL character. endif::git-rev-list[] --parents:: - Print also the parents of the commit (in the form "commit parent..."). Also enables parent rewriting, see 'History Simplification' below. --children:: - Print also the children of the commit (in the form "commit child..."). Also enables parent rewriting, see 'History Simplification' below. @@ -757,7 +719,6 @@ ifdef::git-rev-list[] endif::git-rev-list[] --left-right:: - Mark which side of a symmetric diff a commit is reachable from. Commits from the left side are prefixed with `<` and those from the right with `>`. If combined with `--boundary`, those @@ -787,7 +748,6 @@ you would get an output like this: ----------------------------------------------------------------------- --graph:: - Draw a text-based graphical representation of the commit history on the left hand side of the output. This may cause extra lines to be printed in between commits, in order for the graph history @@ -795,31 +755,29 @@ you would get an output like this: + This enables parent rewriting, see 'History Simplification' below. + -This implies the '--topo-order' option by default, but the -'--date-order' option may also be specified. +This implies the `--topo-order` option by default, but the +`--date-order` option may also be specified. ifdef::git-rev-list[] --count:: Print a number stating how many commits would have been listed, and suppress all other output. When used together - with '--left-right', instead print the counts for left and + with `--left-right`, instead print the counts for left and right commits, separated by a tab. When used together with - '--cherry-mark', omit patch equivalent commits from these + `--cherry-mark`, omit patch equivalent commits from these counts and print the count for equivalent commits separated by a tab. endif::git-rev-list[] - ifndef::git-rev-list[] Diff Formatting ~~~~~~~~~~~~~~~ -Below are listed options that control the formatting of diff output. +Listed below are options that control the formatting of diff output. Some of them are specific to linkgit:git-rev-list[1], however other diff options may be given. See linkgit:git-diff-files[1] for more options. -c:: - With this option, diff output for a merge commit shows the differences from each of the parents to the merge result simultaneously instead of showing pairwise diff between a parent @@ -827,26 +785,22 @@ options may be given. See linkgit:git-diff-files[1] for more options. which were modified from all parents. --cc:: - - This flag implies the '-c' option and further compresses the + This flag implies the `-c` option and further compresses the patch output by omitting uninteresting hunks whose contents in the parents have only two variants and the merge result picks one of them without modification. -m:: - This flag makes the merge commits show the full diff like regular commits; for each merge parent, a separate log entry and diff is generated. An exception is that only diff against - the first parent is shown when '--first-parent' option is given; + the first parent is shown when `--first-parent` option is given; in that case, the output represents the changes the merge brought _into_ the then-current branch. -r:: - Show recursive diffs. -t:: - - Show the tree objects in the diff output. This implies '-r'. + Show the tree objects in the diff output. This implies `-r`. endif::git-rev-list[] diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index 2c06ed34ad..5a286d0d61 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -88,7 +88,7 @@ some output processing may assume ref names in UTF-8. branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'. '@\{-<n>\}', e.g. '@\{-1\}':: - The construct '@\{-<n>\}' means the <n>th branch checked out + The construct '@\{-<n>\}' means the <n>th branch/commit checked out before the current one. '<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}':: diff --git a/Documentation/technical/api-builtin.txt b/Documentation/technical/api-builtin.txt index f3c1357b7c..e3d6e7a79a 100644 --- a/Documentation/technical/api-builtin.txt +++ b/Documentation/technical/api-builtin.txt @@ -14,8 +14,8 @@ Git: . Add the external declaration for the function to `builtin.h`. -. Add the command to `commands[]` table in `handle_internal_command()`, - defined in `git.c`. The entry should look like: +. Add the command to the `commands[]` table defined in `git.c`. + The entry should look like: { "foo", cmd_foo, <options> }, + diff --git a/Documentation/technical/api-hash.txt b/Documentation/technical/api-hash.txt deleted file mode 100644 index e5061e0677..0000000000 --- a/Documentation/technical/api-hash.txt +++ /dev/null @@ -1,52 +0,0 @@ -hash API -======== - -The hash API is a collection of simple hash table functions. Users are expected -to implement their own hashing. - -Data Structures ---------------- - -`struct hash_table`:: - - The hash table structure. The `array` member points to the hash table - entries. The `size` member counts the total number of valid and invalid - entries in the table. The `nr` member keeps track of the number of - valid entries. - -`struct hash_table_entry`:: - - An opaque structure representing an entry in the hash table. The `hash` - member is the entry's hash key and the `ptr` member is the entry's - value. - -Functions ---------- - -`init_hash`:: - - Initialize the hash table. - -`free_hash`:: - - Release memory associated with the hash table. - -`insert_hash`:: - - Insert a pointer into the hash table. If an entry with that hash - already exists, a pointer to the existing entry's value is returned. - Otherwise NULL is returned. This allows callers to implement - chaining, etc. - -`lookup_hash`:: - - Lookup an entry in the hash table. If an entry with that hash exists - the entry's value is returned. Otherwise NULL is returned. - -`for_each_hash`:: - - Call a function for each entry in the hash table. The function is - expected to take the entry's value as its only argument and return an - int. If the function returns a negative int the loop is aborted - immediately. Otherwise, the return value is accumulated and the sum - returned upon completion of the loop. diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt new file mode 100644 index 0000000000..42ca2347ed --- /dev/null +++ b/Documentation/technical/api-hashmap.txt @@ -0,0 +1,235 @@ +hashmap API +=========== + +The hashmap API is a generic implementation of hash-based key-value mappings. + +Data Structures +--------------- + +`struct hashmap`:: + + The hash table structure. ++ +The `size` member keeps track of the total number of entries. The `cmpfn` +member is a function used to compare two entries for equality. The `table` and +`tablesize` members store the hash table and its size, respectively. + +`struct hashmap_entry`:: + + An opaque structure representing an entry in the hash table, which must + be used as first member of user data structures. Ideally it should be + followed by an int-sized member to prevent unused memory on 64-bit + systems due to alignment. ++ +The `hash` member is the entry's hash code and the `next` member points to the +next entry in case of collisions (i.e. if multiple entries map to the same +bucket). + +`struct hashmap_iter`:: + + An iterator structure, to be used with hashmap_iter_* functions. + +Types +----- + +`int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key, const void *keydata)`:: + + User-supplied function to test two hashmap entries for equality. Shall + return 0 if the entries are equal. ++ +This function is always called with non-NULL `entry` / `entry_or_key` +parameters that have the same hash code. When looking up an entry, the `key` +and `keydata` parameters to hashmap_get and hashmap_remove are always passed +as second and third argument, respectively. Otherwise, `keydata` is NULL. + +Functions +--------- + +`unsigned int strhash(const char *buf)`:: +`unsigned int strihash(const char *buf)`:: +`unsigned int memhash(const void *buf, size_t len)`:: +`unsigned int memihash(const void *buf, size_t len)`:: + + Ready-to-use hash functions for strings, using the FNV-1 algorithm (see + http://www.isthe.com/chongo/tech/comp/fnv). ++ +`strhash` and `strihash` take 0-terminated strings, while `memhash` and +`memihash` operate on arbitrary-length memory. ++ +`strihash` and `memihash` are case insensitive versions. + +`void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function, size_t initial_size)`:: + + Initializes a hashmap structure. ++ +`map` is the hashmap to initialize. ++ +The `equals_function` can be specified to compare two entries for equality. +If NULL, entries are considered equal if their hash codes are equal. ++ +If the total number of entries is known in advance, the `initial_size` +parameter may be used to preallocate a sufficiently large table and thus +prevent expensive resizing. If 0, the table is dynamically resized. + +`void hashmap_free(struct hashmap *map, int free_entries)`:: + + Frees a hashmap structure and allocated memory. ++ +`map` is the hashmap to free. ++ +If `free_entries` is true, each hashmap_entry in the map is freed as well +(using stdlib's free()). + +`void hashmap_entry_init(void *entry, unsigned int hash)`:: + + Initializes a hashmap_entry structure. ++ +`entry` points to the entry to initialize. ++ +`hash` is the hash code of the entry. + +`void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata)`:: + + Returns the hashmap entry for the specified key, or NULL if not found. ++ +`map` is the hashmap structure. ++ +`key` is a hashmap_entry structure (or user data structure that starts with +hashmap_entry) that has at least been initialized with the proper hash code +(via `hashmap_entry_init`). ++ +If an entry with matching hash code is found, `key` and `keydata` are passed +to `hashmap_cmp_fn` to decide whether the entry matches the key. + +`void *hashmap_get_next(const struct hashmap *map, const void *entry)`:: + + Returns the next equal hashmap entry, or NULL if not found. This can be + used to iterate over duplicate entries (see `hashmap_add`). ++ +`map` is the hashmap structure. ++ +`entry` is the hashmap_entry to start the search from, obtained via a previous +call to `hashmap_get` or `hashmap_get_next`. + +`void hashmap_add(struct hashmap *map, void *entry)`:: + + Adds a hashmap entry. This allows to add duplicate entries (i.e. + separate values with the same key according to hashmap_cmp_fn). ++ +`map` is the hashmap structure. ++ +`entry` is the entry to add. + +`void *hashmap_put(struct hashmap *map, void *entry)`:: + + Adds or replaces a hashmap entry. If the hashmap contains duplicate + entries equal to the specified entry, only one of them will be replaced. ++ +`map` is the hashmap structure. ++ +`entry` is the entry to add or replace. ++ +Returns the replaced entry, or NULL if not found (i.e. the entry was added). + +`void *hashmap_remove(struct hashmap *map, const void *key, const void *keydata)`:: + + Removes a hashmap entry matching the specified key. If the hashmap + contains duplicate entries equal to the specified key, only one of + them will be removed. ++ +`map` is the hashmap structure. ++ +`key` is a hashmap_entry structure (or user data structure that starts with +hashmap_entry) that has at least been initialized with the proper hash code +(via `hashmap_entry_init`). ++ +If an entry with matching hash code is found, `key` and `keydata` are +passed to `hashmap_cmp_fn` to decide whether the entry matches the key. ++ +Returns the removed entry, or NULL if not found. + +`void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter)`:: +`void *hashmap_iter_next(struct hashmap_iter *iter)`:: +`void *hashmap_iter_first(struct hashmap *map, struct hashmap_iter *iter)`:: + + Used to iterate over all entries of a hashmap. ++ +`hashmap_iter_init` initializes a `hashmap_iter` structure. ++ +`hashmap_iter_next` returns the next hashmap_entry, or NULL if there are no +more entries. ++ +`hashmap_iter_first` is a combination of both (i.e. initializes the iterator +and returns the first entry, if any). + +Usage example +------------- + +Here's a simple usage example that maps long keys to double values. +[source,c] +------------ +struct hashmap map; + +struct long2double { + struct hashmap_entry ent; /* must be the first member! */ + long key; + double value; +}; + +static int long2double_cmp(const struct long2double *e1, const struct long2double *e2, const void *unused) +{ + return !(e1->key == e2->key); +} + +void long2double_init(void) +{ + hashmap_init(&map, (hashmap_cmp_fn) long2double_cmp, 0); +} + +void long2double_free(void) +{ + hashmap_free(&map, 1); +} + +static struct long2double *find_entry(long key) +{ + struct long2double k; + hashmap_entry_init(&k, memhash(&key, sizeof(long))); + k.key = key; + return hashmap_get(&map, &k, NULL); +} + +double get_value(long key) +{ + struct long2double *e = find_entry(key); + return e ? e->value : 0; +} + +void set_value(long key, double value) +{ + struct long2double *e = find_entry(key); + if (!e) { + e = malloc(sizeof(struct long2double)); + hashmap_entry_init(e, memhash(&key, sizeof(long))); + e->key = key; + hashmap_add(&map, e); + } + e->value = value; +} +------------ + +Using variable-sized keys +------------------------- + +The `hashmap_entry_get` and `hashmap_entry_remove` functions expect an ordinary +`hashmap_entry` structure as key to find the correct entry. If the key data is +variable-sized (e.g. a FLEX_ARRAY string) or quite large, it is undesirable +to create a full-fledged entry structure on the heap and copy all the key data +into the structure. + +In this case, the `keydata` parameter can be used to pass +variable-sized key data directly to the comparison function, and the `key` +parameter can be a stripped-down, fixed size entry structure allocated on the +stack. + +See test-hashmap.c for an example using arbitrary-length strings as keys. diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt index 0be2b5159f..be50cf4de3 100644 --- a/Documentation/technical/api-parse-options.txt +++ b/Documentation/technical/api-parse-options.txt @@ -29,9 +29,9 @@ that allow to change the behavior of a command. The parse-options API allows: -* 'sticked' and 'separate form' of options with arguments. - `-oArg` is sticked, `-o Arg` is separate form. - `--option=Arg` is sticked, `--option Arg` is separate form. +* 'stuck' and 'separate form' of options with arguments. + `-oArg` is stuck, `-o Arg` is separate form. + `--option=Arg` is stuck, `--option Arg` is separate form. * Long options may be 'abbreviated', as long as the abbreviation is unambiguous. diff --git a/Documentation/technical/api-ref-iteration.txt b/Documentation/technical/api-ref-iteration.txt index aa1c50f181..02adfd45d3 100644 --- a/Documentation/technical/api-ref-iteration.txt +++ b/Documentation/technical/api-ref-iteration.txt @@ -50,10 +50,10 @@ submodules object database. You can do this by a code-snippet like this: const char *path = "path/to/submodule" - if (!add_submodule_odb(path)) + if (add_submodule_odb(path)) die("Error submodule '%s' not populated.", path); -`add_submodule_odb()` will return an non-zero value on success. If you +`add_submodule_odb()` will return zero on success. If you do not do this you will get an error for each ref that it does not point to a valid object. diff --git a/Documentation/technical/api-remote.txt b/Documentation/technical/api-remote.txt index 4be87768f6..5d245aa9d1 100644 --- a/Documentation/technical/api-remote.txt +++ b/Documentation/technical/api-remote.txt @@ -58,16 +58,16 @@ default remote, given the current branch and configuration. struct refspec -------------- -A struct refspec holds the parsed interpretation of a refspec. If it -will force updates (starts with a '+'), force is true. If it is a -pattern (sides end with '*') pattern is true. src and dest are the two -sides (if a pattern, only the part outside of the wildcards); if there -is only one side, it is src, and dst is NULL; if sides exist but are -empty (i.e., the refspec either starts or ends with ':'), the -corresponding side is "". - -This parsing can be done to an array of strings to give an array of -struct refpsecs with parse_ref_spec(). +A struct refspec holds the parsed interpretation of a refspec. If it +will force updates (starts with a '+'), force is true. If it is a +pattern (sides end with '*') pattern is true. src and dest are the +two sides (including '*' characters if present); if there is only one +side, it is src, and dst is NULL; if sides exist but are empty (i.e., +the refspec either starts or ends with ':'), the corresponding side is +"". + +An array of strings can be parsed into an array of struct refspecs +using parse_fetch_refspec() or parse_push_refspec(). remote_find_tracking(), given a remote and a struct refspec with either src or dst filled out, will fill out the other such that the diff --git a/Documentation/technical/bitmap-format.txt b/Documentation/technical/bitmap-format.txt new file mode 100644 index 0000000000..f8c18a0f7a --- /dev/null +++ b/Documentation/technical/bitmap-format.txt @@ -0,0 +1,164 @@ +GIT bitmap v1 format +==================== + + - A header appears at the beginning: + + 4-byte signature: {'B', 'I', 'T', 'M'} + + 2-byte version number (network byte order) + The current implementation only supports version 1 + of the bitmap index (the same one as JGit). + + 2-byte flags (network byte order) + + The following flags are supported: + + - BITMAP_OPT_FULL_DAG (0x1) REQUIRED + This flag must always be present. It implies that the bitmap + index has been generated for a packfile with full closure + (i.e. where every single object in the packfile can find + its parent links inside the same packfile). This is a + requirement for the bitmap index format, also present in JGit, + that greatly reduces the complexity of the implementation. + + - BITMAP_OPT_HASH_CACHE (0x4) + If present, the end of the bitmap file contains + `N` 32-bit name-hash values, one per object in the + pack. The format and meaning of the name-hash is + described below. + + 4-byte entry count (network byte order) + + The total count of entries (bitmapped commits) in this bitmap index. + + 20-byte checksum + + The SHA1 checksum of the pack this bitmap index belongs to. + + - 4 EWAH bitmaps that act as type indexes + + Type indexes are serialized after the hash cache in the shape + of four EWAH bitmaps stored consecutively (see Appendix A for + the serialization format of an EWAH bitmap). + + There is a bitmap for each Git object type, stored in the following + order: + + - Commits + - Trees + - Blobs + - Tags + + In each bitmap, the `n`th bit is set to true if the `n`th object + in the packfile is of that type. + + The obvious consequence is that the OR of all 4 bitmaps will result + in a full set (all bits set), and the AND of all 4 bitmaps will + result in an empty bitmap (no bits set). + + - N entries with compressed bitmaps, one for each indexed commit + + Where `N` is the total amount of entries in this bitmap index. + Each entry contains the following: + + - 4-byte object position (network byte order) + The position **in the index for the packfile** where the + bitmap for this commit is found. + + - 1-byte XOR-offset + The xor offset used to compress this bitmap. For an entry + in position `x`, a XOR offset of `y` means that the actual + bitmap representing this commit is composed by XORing the + bitmap for this entry with the bitmap in entry `x-y` (i.e. + the bitmap `y` entries before this one). + + Note that this compression can be recursive. In order to + XOR this entry with a previous one, the previous entry needs + to be decompressed first, and so on. + + The hard-limit for this offset is 160 (an entry can only be + xor'ed against one of the 160 entries preceding it). This + number is always positive, and hence entries are always xor'ed + with **previous** bitmaps, not bitmaps that will come afterwards + in the index. + + - 1-byte flags for this bitmap + At the moment the only available flag is `0x1`, which hints + that this bitmap can be re-used when rebuilding bitmap indexes + for the repository. + + - The compressed bitmap itself, see Appendix A. + +== Appendix A: Serialization format for an EWAH bitmap + +Ewah bitmaps are serialized in the same protocol as the JAVAEWAH +library, making them backwards compatible with the JGit +implementation: + + - 4-byte number of bits of the resulting UNCOMPRESSED bitmap + + - 4-byte number of words of the COMPRESSED bitmap, when stored + + - N x 8-byte words, as specified by the previous field + + This is the actual content of the compressed bitmap. + + - 4-byte position of the current RLW for the compressed + bitmap + +All words are stored in network byte order for their corresponding +sizes. + +The compressed bitmap is stored in a form of run-length encoding, as +follows. It consists of a concatenation of an arbitrary number of +chunks. Each chunk consists of one or more 64-bit words + + H L_1 L_2 L_3 .... L_M + +H is called RLW (run length word). It consists of (from lower to higher +order bits): + + - 1 bit: the repeated bit B + + - 32 bits: repetition count K (unsigned) + + - 31 bits: literal word count M (unsigned) + +The bitstream represented by the above chunk is then: + + - K repetitions of B + + - The bits stored in `L_1` through `L_M`. Within a word, bits at + lower order come earlier in the stream than those at higher + order. + +The next word after `L_M` (if any) must again be a RLW, for the next +chunk. For efficient appending to the bitstream, the EWAH stores a +pointer to the last RLW in the stream. + + +== Appendix B: Optional Bitmap Sections + +These sections may or may not be present in the `.bitmap` file; their +presence is indicated by the header flags section described above. + +Name-hash cache +--------------- + +If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap contains +a cache of 32-bit values, one per object in the pack. The value at +position `i` is the hash of the pathname at which the `i`th object +(counting in index order) in the pack can be found. This can be fed +into the delta heuristics to compare objects with similar pathnames. + +The hash algorithm used is: + + hash = 0; + while ((c = *name++)) + if (!isspace(c)) + hash = (hash >> 2) + (c << 24); + +Note that this hashing scheme is tied to the BITMAP_OPT_HASH_CACHE flag. +If implementations want to choose a different hashing scheme, they are +free to do so, but MUST allocate a new header flag (because comparing +hashes made under two different schemes would be pointless). diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt index caf941a1c5..20525d98bb 100644 --- a/Documentation/technical/http-protocol.txt +++ b/Documentation/technical/http-protocol.txt @@ -20,13 +20,13 @@ URL syntax documented by RFC 1738, so they are of the form: http://<host>:<port>/<path>?<searchpart> -Within this documentation the placeholder $GIT_URL will stand for +Within this documentation the placeholder `$GIT_URL` will stand for the http:// repository URL entered by the end-user. -Servers SHOULD handle all requests to locations matching $GIT_URL, as +Servers SHOULD handle all requests to locations matching `$GIT_URL`, as both the "smart" and "dumb" HTTP protocols used by Git operate by appending additional path components onto the end of the user -supplied $GIT_URL string. +supplied `$GIT_URL` string. An example of a dumb client requesting for a loose object: @@ -43,10 +43,10 @@ An example of a request to a submodule: $GIT_URL: http://example.com/git/repo.git/path/submodule.git URL request: http://example.com/git/repo.git/path/submodule.git/info/refs -Clients MUST strip a trailing '/', if present, from the user supplied -$GIT_URL string to prevent empty path tokens ('//') from appearing +Clients MUST strip a trailing `/`, if present, from the user supplied +`$GIT_URL` string to prevent empty path tokens (`//`) from appearing in any URL sent to a server. Compatible clients MUST expand -'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'. +`$GIT_URL/info/refs` as `foo/info/refs` and not `foo//info/refs`. Authentication @@ -103,14 +103,14 @@ Except where noted, all standard HTTP behavior SHOULD be assumed by both client and server. This includes (but is not necessarily limited to): -If there is no repository at $GIT_URL, or the resource pointed to by a -location matching $GIT_URL does not exist, the server MUST NOT respond -with '200 OK' response. A server SHOULD respond with -'404 Not Found', '410 Gone', or any other suitable HTTP status code +If there is no repository at `$GIT_URL`, or the resource pointed to by a +location matching `$GIT_URL` does not exist, the server MUST NOT respond +with `200 OK` response. A server SHOULD respond with +`404 Not Found`, `410 Gone`, or any other suitable HTTP status code which does not imply the resource exists as requested. -If there is a repository at $GIT_URL, but access is not currently -permitted, the server MUST respond with the '403 Forbidden' HTTP +If there is a repository at `$GIT_URL`, but access is not currently +permitted, the server MUST respond with the `403 Forbidden` HTTP status code. Servers SHOULD support both HTTP 1.0 and HTTP 1.1. @@ -126,9 +126,9 @@ Servers MAY return ETag and/or Last-Modified headers. Clients MAY revalidate cached entities by including If-Modified-Since and/or If-None-Match request headers. -Servers MAY return '304 Not Modified' if the relevant headers appear +Servers MAY return `304 Not Modified` if the relevant headers appear in the request and the entity has not changed. Clients MUST treat -'304 Not Modified' identical to '200 OK' by reusing the cached entity. +`304 Not Modified` identical to `200 OK` by reusing the cached entity. Clients MAY reuse a cached entity without revalidation if the Cache-Control and/or Expires header permits caching. Clients and @@ -148,7 +148,7 @@ HTTP clients that only support the "dumb" protocol MUST discover references by making a request for the special info/refs file of the repository. -Dumb HTTP clients MUST make a GET request to $GIT_URL/info/refs, +Dumb HTTP clients MUST make a `GET` request to `$GIT_URL/info/refs`, without any search/query parameters. C: GET $GIT_URL/info/refs HTTP/1.0 @@ -161,21 +161,21 @@ without any search/query parameters. S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{} The Content-Type of the returned info/refs entity SHOULD be -"text/plain; charset=utf-8", but MAY be any content type. +`text/plain; charset=utf-8`, but MAY be any content type. Clients MUST NOT attempt to validate the returned Content-Type. Dumb servers MUST NOT return a return type starting with -"application/x-git-". +`application/x-git-`. Cache-Control headers MAY be returned to disable caching of the returned entity. When examining the response clients SHOULD only examine the HTTP -status code. Valid responses are '200 OK', or '304 Not Modified'. +status code. Valid responses are `200 OK`, or `304 Not Modified`. The returned content is a UNIX formatted text file describing each ref and its known value. The file SHOULD be sorted by name according to the C locale ordering. The file SHOULD NOT include -the default ref named 'HEAD'. +the default ref named `HEAD`. info_refs = *( ref_record ) ref_record = any_ref / peeled_ref @@ -192,13 +192,14 @@ HTTP clients that support the "smart" protocol (or both the a parameterized request for the info/refs file of the repository. The request MUST contain exactly one query parameter, -'service=$servicename', where $servicename MUST be the service +`service=$servicename`, where `$servicename` MUST be the service name the client wishes to contact to complete the operation. The request MUST NOT contain additional query parameters. C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0 - dumb server reply: +dumb server reply: + S: 200 OK S: S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint @@ -206,7 +207,8 @@ The request MUST NOT contain additional query parameters. S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0 S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{} - smart server reply: +smart server reply: + S: 200 OK S: Content-Type: application/x-git-upload-pack-advertisement S: Cache-Control: no-cache @@ -228,7 +230,7 @@ Smart Server Response ^^^^^^^^^^^^^^^^^^^^^ If the server does not recognize the requested service name, or the requested service name has been disabled by the server administrator, -the server MUST respond with the '403 Forbidden' HTTP status code. +the server MUST respond with the `403 Forbidden` HTTP status code. Otherwise, smart servers MUST respond with the smart server reply format for the requested service name. @@ -236,35 +238,35 @@ format for the requested service name. Cache-Control headers SHOULD be used to disable caching of the returned entity. -The Content-Type MUST be 'application/x-$servicename-advertisement'. +The Content-Type MUST be `application/x-$servicename-advertisement`. Clients SHOULD fall back to the dumb protocol if another content type is returned. When falling back to the dumb protocol clients -SHOULD NOT make an additional request to $GIT_URL/info/refs, but +SHOULD NOT make an additional request to `$GIT_URL/info/refs`, but instead SHOULD use the response already in hand. Clients MUST NOT continue if they do not support the dumb protocol. -Clients MUST validate the status code is either '200 OK' or -'304 Not Modified'. +Clients MUST validate the status code is either `200 OK` or +`304 Not Modified`. Clients MUST validate the first five bytes of the response entity -matches the regex "^[0-9a-f]{4}#". If this test fails, clients +matches the regex `^[0-9a-f]{4}#`. If this test fails, clients MUST NOT continue. Clients MUST parse the entire response as a sequence of pkt-line records. -Clients MUST verify the first pkt-line is "# service=$servicename". +Clients MUST verify the first pkt-line is `# service=$servicename`. Servers MUST set $servicename to be the request parameter value. Servers SHOULD include an LF at the end of this line. Clients MUST ignore an LF at the end of the line. -Servers MUST terminate the response with the magic "0000" end +Servers MUST terminate the response with the magic `0000` end pkt-line marker. The returned response is a pkt-line stream describing each ref and its known value. The stream SHOULD be sorted by name according to the C locale ordering. The stream SHOULD include the default ref -named 'HEAD' as the first ref. The stream MUST include capability +named `HEAD` as the first ref. The stream MUST include capability declarations behind a NUL on the first ref. smart_reply = PKT-LINE("# service=$servicename" LF) @@ -286,12 +288,13 @@ declarations behind a NUL on the first ref. peeled_ref = PKT-LINE(obj-id SP name LF) PKT-LINE(obj-id SP name "^{}" LF + Smart Service git-upload-pack ------------------------------ -This service reads from the repository pointed to by $GIT_URL. +This service reads from the repository pointed to by `$GIT_URL`. Clients MUST first perform ref discovery with -'$GIT_URL/info/refs?service=git-upload-pack'. +`$GIT_URL/info/refs?service=git-upload-pack`. C: POST $GIT_URL/git-upload-pack HTTP/1.0 C: Content-Type: application/x-git-upload-pack-request @@ -307,16 +310,16 @@ Clients MUST first perform ref discovery with S: ....ACK %s, continue S: ....NAK -Clients MUST NOT reuse or revalidate a cached reponse. +Clients MUST NOT reuse or revalidate a cached response. Servers MUST include sufficient Cache-Control headers to prevent caching of the response. Servers SHOULD support all capabilities defined here. -Clients MUST send at least one 'want' command in the request body. -Clients MUST NOT reference an id in a 'want' command which did not +Clients MUST send at least one "want" command in the request body. +Clients MUST NOT reference an id in a "want" command which did not appear in the response obtained through ref discovery unless the -server advertises capability "allow-tip-sha1-in-want". +server advertises capability `allow-tip-sha1-in-want`. compute_request = want_list have_list @@ -332,128 +335,128 @@ server advertises capability "allow-tip-sha1-in-want". have_list = *PKT-LINE("have" SP id LF) TODO: Document this further. -TODO: Don't use uppercase for variable names below. The Negotiation Algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~ The computation to select the minimal pack proceeds as follows -(c = client, s = server): +(C = client, S = server): + +'init step:' + +C: Use ref discovery to obtain the advertised refs. + +C: Place any object seen into set `advertised`. - init step: - (c) Use ref discovery to obtain the advertised refs. - (c) Place any object seen into set ADVERTISED. +C: Build an empty set, `common`, to hold the objects that are later + determined to be on both ends. - (c) Build an empty set, COMMON, to hold the objects that are later - determined to be on both ends. - (c) Build a set, WANT, of the objects from ADVERTISED the client - wants to fetch, based on what it saw during ref discovery. +C: Build a set, `want`, of the objects from `advertised` the client + wants to fetch, based on what it saw during ref discovery. - (c) Start a queue, C_PENDING, ordered by commit time (popping newest - first). Add all client refs. When a commit is popped from - the queue its parents SHOULD be automatically inserted back. - Commits MUST only enter the queue once. +C: Start a queue, `c_pending`, ordered by commit time (popping newest + first). Add all client refs. When a commit is popped from + the queue its parents SHOULD be automatically inserted back. + Commits MUST only enter the queue once. - one compute step: - (c) Send one $GIT_URL/git-upload-pack request: +'one compute step:' - C: 0032want <WANT #1>............................... - C: 0032want <WANT #2>............................... +C: Send one `$GIT_URL/git-upload-pack` request: + + C: 0032want <want #1>............................... + C: 0032want <want #2>............................... .... - C: 0032have <COMMON #1>............................. - C: 0032have <COMMON #2>............................. + C: 0032have <common #1>............................. + C: 0032have <common #2>............................. .... - C: 0032have <HAVE #1>............................... - C: 0032have <HAVE #2>............................... + C: 0032have <have #1>............................... + C: 0032have <have #2>............................... .... C: 0000 - The stream is organized into "commands", with each command - appearing by itself in a pkt-line. Within a command line - the text leading up to the first space is the command name, - and the remainder of the line to the first LF is the value. - Command lines are terminated with an LF as the last byte of - the pkt-line value. +The stream is organized into "commands", with each command +appearing by itself in a pkt-line. Within a command line +the text leading up to the first space is the command name, +and the remainder of the line to the first LF is the value. +Command lines are terminated with an LF as the last byte of +the pkt-line value. - Commands MUST appear in the following order, if they appear - at all in the request stream: +Commands MUST appear in the following order, if they appear +at all in the request stream: - * want - * have +* "want" +* "have" - The stream is terminated by a pkt-line flush ("0000"). +The stream is terminated by a pkt-line flush (`0000`). - A single "want" or "have" command MUST have one hex formatted - SHA-1 as its value. Multiple SHA-1s MUST be sent by sending - multiple commands. +A single "want" or "have" command MUST have one hex formatted +SHA-1 as its value. Multiple SHA-1s MUST be sent by sending +multiple commands. - The HAVE list is created by popping the first 32 commits - from C_PENDING. Less can be supplied if C_PENDING empties. +The `have` list is created by popping the first 32 commits +from `c_pending`. Less can be supplied if `c_pending` empties. - If the client has sent 256 HAVE commits and has not yet - received one of those back from S_COMMON, or the client has - emptied C_PENDING it SHOULD include a "done" command to let - the server know it won't proceed: +If the client has sent 256 "have" commits and has not yet +received one of those back from `s_common`, or the client has +emptied `c_pending` it SHOULD include a "done" command to let +the server know it won't proceed: C: 0009done - (s) Parse the git-upload-pack request: - - Verify all objects in WANT are directly reachable from refs. - - The server MAY walk backwards through history or through - the reflog to permit slightly stale requests. +S: Parse the git-upload-pack request: - If no WANT objects are received, send an error: +Verify all objects in `want` are directly reachable from refs. -TODO: Define error if no want lines are requested. +The server MAY walk backwards through history or through +the reflog to permit slightly stale requests. - If any WANT object is not reachable, send an error: +If no "want" objects are received, send an error: +TODO: Define error if no "want" lines are requested. -TODO: Define error if an invalid want is requested. +If any "want" object is not reachable, send an error: +TODO: Define error if an invalid "want" is requested. - Create an empty list, S_COMMON. +Create an empty list, `s_common`. - If 'have' was sent: +If "have" was sent: - Loop through the objects in the order supplied by the client. - For each object, if the server has the object reachable from - a ref, add it to S_COMMON. If a commit is added to S_COMMON, - do not add any ancestors, even if they also appear in HAVE. +Loop through the objects in the order supplied by the client. - (s) Send the git-upload-pack response: +For each object, if the server has the object reachable from +a ref, add it to `s_common`. If a commit is added to `s_common`, +do not add any ancestors, even if they also appear in `have`. - If the server has found a closed set of objects to pack or the - request ends with "done", it replies with the pack. +S: Send the git-upload-pack response: +If the server has found a closed set of objects to pack or the +request ends with "done", it replies with the pack. TODO: Document the pack based response - S: PACK... - The returned stream is the side-band-64k protocol supported - by the git-upload-pack service, and the pack is embedded into - stream 1. Progress messages from the server side MAY appear - in stream 2. + S: PACK... - Here a "closed set of objects" is defined to have at least - one path from every WANT to at least one COMMON object. +The returned stream is the side-band-64k protocol supported +by the git-upload-pack service, and the pack is embedded into +stream 1. Progress messages from the server side MAY appear +in stream 2. - If the server needs more information, it replies with a - status continue response: +Here a "closed set of objects" is defined to have at least +one path from every "want" to at least one "common" object. +If the server needs more information, it replies with a +status continue response: TODO: Document the non-pack response - (c) Parse the upload-pack response: - -TODO: Document parsing response +C: Parse the upload-pack response: + TODO: Document parsing response - Do another compute step. +'Do another compute step.' Smart Service git-receive-pack ------------------------------ -This service reads from the repository pointed to by $GIT_URL. +This service reads from the repository pointed to by `$GIT_URL`. Clients MUST first perform ref discovery with -'$GIT_URL/info/refs?service=git-receive-pack'. +`$GIT_URL/info/refs?service=git-receive-pack`. C: POST $GIT_URL/git-receive-pack HTTP/1.0 C: Content-Type: application/x-git-receive-pack-request @@ -468,7 +471,7 @@ Clients MUST first perform ref discovery with S: S: .... -Clients MUST NOT reuse or revalidate a cached reponse. +Clients MUST NOT reuse or revalidate a cached response. Servers MUST include sufficient Cache-Control headers to prevent caching of the response. @@ -497,7 +500,7 @@ TODO: Document this further. References ---------- -link:http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)] -link:http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1] +http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)] +http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1] link:technical/pack-protocol.html link:technical/protocol-capabilities.html diff --git a/Documentation/technical/pack-heuristics.txt b/Documentation/technical/pack-heuristics.txt index b7bd95152e..95a07db6e8 100644 --- a/Documentation/technical/pack-heuristics.txt +++ b/Documentation/technical/pack-heuristics.txt @@ -1,5 +1,5 @@ - Concerning Git's Packing Heuristics - =================================== +Concerning Git's Packing Heuristics +=================================== Oh, here's a really stupid question: diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt index b898e97988..39c64105a6 100644 --- a/Documentation/technical/pack-protocol.txt +++ b/Documentation/technical/pack-protocol.txt @@ -161,6 +161,7 @@ MUST peel the ref if it's an annotated tag. ---- advertised-refs = (no-refs / list-of-refs) + *shallow flush-pkt no-refs = PKT-LINE(zero-id SP "capabilities^{}" @@ -174,6 +175,8 @@ MUST peel the ref if it's an annotated tag. other-tip = obj-id SP refname LF other-peeled = obj-id SP refname "^{}" LF + shallow = PKT-LINE("shallow" SP obj-id) + capability-list = capability *(SP capability) capability = 1*(LC_ALPHA / DIGIT / "-" / "_") LC_ALPHA = %x61-7A @@ -335,7 +338,8 @@ during a prior round. This helps to ensure that at least one common ancestor is found before we give up entirely. Once the 'done' line is read from the client, the server will either -send a final 'ACK obj-id' or it will send a 'NAK'. The server only sends +send a final 'ACK obj-id' or it will send a 'NAK'. 'obj-id' is the object +name of the last commit determined to be common. The server only sends ACK after 'done' if there is at least one common base and multi_ack or multi_ack_detailed is enabled. The server always sends NAK after 'done' if there is no common base found. @@ -461,7 +465,9 @@ contain all the objects that the server will need to complete the new references. ---- - update-request = command-list [pack-file] + update-request = *shallow command-list [pack-file] + + shallow = PKT-LINE("shallow" SP obj-id) command-list = PKT-LINE(command NUL capability-list LF) *PKT-LINE(command LF) diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt index fd8ffa5df3..e174343847 100644 --- a/Documentation/technical/protocol-capabilities.txt +++ b/Documentation/technical/protocol-capabilities.txt @@ -69,17 +69,50 @@ ends. Without multi_ack the client would have sent that c-b-a chain anyway, interleaved with S-R-Q. +multi_ack_detailed +------------------ +This is an extension of multi_ack that permits client to better +understand the server's in-memory state. See pack-protocol.txt, +section "Packfile Negotiation" for more information. + +no-done +------- +This capability should only be used with the smart HTTP protocol. If +multi_ack_detailed and no-done are both present, then the sender is +free to immediately send a pack following its first "ACK obj-id ready" +message. + +Without no-done in the smart HTTP protocol, the server session would +end and the client has to make another trip to send "done" before +the server can send the pack. no-done removes the last round and +thus slightly reduces latency. + thin-pack --------- -This capability means that the server can send a 'thin' pack, a pack -which does not contain base objects; if those base objects are available -on client side. Client requests 'thin-pack' capability when it -understands how to "thicken" it by adding required delta bases making -it self-contained. - -Client MUST NOT request 'thin-pack' capability if it cannot turn a thin -pack into a self-contained pack. +A thin pack is one with deltas which reference base objects not +contained within the pack (but are known to exist at the receiving +end). This can reduce the network traffic significantly, but it +requires the receiving end to know how to "thicken" these packs by +adding the missing bases to the pack. + +The upload-pack server advertises 'thin-pack' when it can generate +and send a thin pack. A client requests the 'thin-pack' capability +when it understands how to "thicken" it, notifying the server that +it can receive such a pack. A client MUST NOT request the +'thin-pack' capability if it cannot turn a thin pack into a +self-contained pack. + +Receive-pack, on the other hand, is assumed by default to be able to +handle thin packs, but can ask the client not to use the feature by +advertising the 'no-thin' capability. A client MUST NOT send a thin +pack if the server advertises the 'no-thin' capability. + +The reasons for this asymmetry are historical. The receive-pack +program did not exist until after the invention of thin packs, so +historically the reference implementation of receive-pack always +understood thin packs. Adding 'no-thin' later allowed receive-pack +to disable the feature in a backwards-compatible manner. side-band, side-band-64k diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index cbb01a1ea2..d4f9804462 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1,5 +1,5 @@ Git User Manual -_______________ +=============== Git is a fast distributed revision control system. @@ -3795,7 +3795,7 @@ like so: $ git update-index filename ------------------------------------------------- -but to avoid common mistakes with filename globbing etc, the command +but to avoid common mistakes with filename globbing etc., the command will not normally add totally new entries or remove old entries, i.e. it will normally just update existing cache entries. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index b444c18f17..a651d68656 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.8.4.GIT +DEF_VER=v1.9.0.GIT LF=' ' @@ -101,14 +101,6 @@ all:: # # Define NO_MKSTEMPS if you don't have mkstemps in the C library. # -# Define NO_FNMATCH if you don't have fnmatch in the C library. -# -# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the -# FNM_CASEFOLD GNU extension. -# -# Define NO_WILDMATCH if you do not want to use Git's wildmatch -# implementation as fnmatch -# # Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd # in the C library. # @@ -342,6 +334,10 @@ all:: # Define DEFAULT_HELP_FORMAT to "man", "info" or "html" # (defaults to "man") if you want to have a different default when # "git help" is called without a parameter specifying the format. +# +# Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite +# with a different indexfile format version. If it isn't set the index +# file format used is index-v[23]. GIT-VERSION-FILE: FORCE @$(SHELL_PATH) ./GIT-VERSION-GEN @@ -452,7 +448,6 @@ SCRIPT_SH += git-am.sh SCRIPT_SH += git-bisect.sh SCRIPT_SH += git-difftool--helper.sh SCRIPT_SH += git-filter-branch.sh -SCRIPT_SH += git-lost-found.sh SCRIPT_SH += git-merge-octopus.sh SCRIPT_SH += git-merge-one-file.sh SCRIPT_SH += git-merge-resolve.sh @@ -556,6 +551,7 @@ TEST_PROGRAMS_NEED_X += test-date TEST_PROGRAMS_NEED_X += test-delta TEST_PROGRAMS_NEED_X += test-dump-cache-tree TEST_PROGRAMS_NEED_X += test-genrandom +TEST_PROGRAMS_NEED_X += test-hashmap TEST_PROGRAMS_NEED_X += test-index-version TEST_PROGRAMS_NEED_X += test-line-buffer TEST_PROGRAMS_NEED_X += test-match-trees @@ -587,11 +583,8 @@ BUILT_INS += git-cherry$X BUILT_INS += git-cherry-pick$X BUILT_INS += git-format-patch$X BUILT_INS += git-fsck-objects$X -BUILT_INS += git-get-tar-commit-id$X BUILT_INS += git-init$X BUILT_INS += git-merge-subtree$X -BUILT_INS += git-peek-remote$X -BUILT_INS += git-repo-config$X BUILT_INS += git-show$X BUILT_INS += git-stage$X BUILT_INS += git-status$X @@ -667,6 +660,8 @@ LIB_H += diff.h LIB_H += diffcore.h LIB_H += dir.h LIB_H += exec_cmd.h +LIB_H += ewah/ewok.h +LIB_H += ewah/ewok_rlw.h LIB_H += fetch-pack.h LIB_H += fmt-merge-msg.h LIB_H += fsck.h @@ -675,7 +670,7 @@ LIB_H += git-compat-util.h LIB_H += gpg-interface.h LIB_H += graph.h LIB_H += grep.h -LIB_H += hash.h +LIB_H += hashmap.h LIB_H += help.h LIB_H += http.h LIB_H += kwset.h @@ -694,8 +689,10 @@ LIB_H += notes-merge.h LIB_H += notes-utils.h LIB_H += notes.h LIB_H += object.h +LIB_H += pack-objects.h LIB_H += pack-revindex.h LIB_H += pack.h +LIB_H += pack-bitmap.h LIB_H += parse-options.h LIB_H += patch-ids.h LIB_H += pathspec.h @@ -799,6 +796,10 @@ LIB_OBJS += dir.o LIB_OBJS += editor.o LIB_OBJS += entry.o LIB_OBJS += environment.o +LIB_OBJS += ewah/bitmap.o +LIB_OBJS += ewah/ewah_bitmap.o +LIB_OBJS += ewah/ewah_io.o +LIB_OBJS += ewah/ewah_rlw.o LIB_OBJS += exec_cmd.o LIB_OBJS += fetch-pack.o LIB_OBJS += fsck.o @@ -806,7 +807,7 @@ LIB_OBJS += gettext.o LIB_OBJS += gpg-interface.o LIB_OBJS += graph.o LIB_OBJS += grep.o -LIB_OBJS += hash.o +LIB_OBJS += hashmap.o LIB_OBJS += help.o LIB_OBJS += hex.o LIB_OBJS += ident.o @@ -830,7 +831,10 @@ LIB_OBJS += notes-cache.o LIB_OBJS += notes-merge.o LIB_OBJS += notes-utils.o LIB_OBJS += object.o +LIB_OBJS += pack-bitmap.o +LIB_OBJS += pack-bitmap-write.o LIB_OBJS += pack-check.o +LIB_OBJS += pack-objects.o LIB_OBJS += pack-revindex.o LIB_OBJS += pack-write.o LIB_OBJS += pager.o @@ -932,6 +936,7 @@ BUILTIN_OBJS += builtin/fmt-merge-msg.o BUILTIN_OBJS += builtin/for-each-ref.o BUILTIN_OBJS += builtin/fsck.o BUILTIN_OBJS += builtin/gc.o +BUILTIN_OBJS += builtin/get-tar-commit-id.o BUILTIN_OBJS += builtin/grep.o BUILTIN_OBJS += builtin/hash-object.o BUILTIN_OBJS += builtin/help.o @@ -983,7 +988,6 @@ BUILTIN_OBJS += builtin/show-ref.o BUILTIN_OBJS += builtin/stripspace.o BUILTIN_OBJS += builtin/symbolic-ref.o BUILTIN_OBJS += builtin/tag.o -BUILTIN_OBJS += builtin/tar-tree.o BUILTIN_OBJS += builtin/unpack-file.o BUILTIN_OBJS += builtin/unpack-objects.o BUILTIN_OBJS += builtin/update-index.o @@ -1275,20 +1279,6 @@ endif ifdef NO_STRTOULL COMPAT_CFLAGS += -DNO_STRTOULL endif -ifdef NO_FNMATCH - COMPAT_CFLAGS += -Icompat/fnmatch - COMPAT_CFLAGS += -DNO_FNMATCH - COMPAT_OBJS += compat/fnmatch/fnmatch.o -else -ifdef NO_FNMATCH_CASEFOLD - COMPAT_CFLAGS += -Icompat/fnmatch - COMPAT_CFLAGS += -DNO_FNMATCH_CASEFOLD - COMPAT_OBJS += compat/fnmatch/fnmatch.o -endif -endif -ifndef NO_WILDMATCH - COMPAT_CFLAGS += -DUSE_WILDMATCH -endif ifdef NO_SETENV COMPAT_CFLAGS += -DNO_SETENV COMPAT_OBJS += compat/setenv.o @@ -1588,6 +1578,7 @@ PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH)) PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH)) TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) DIFF_SQ = $(subst ','\'',$(DIFF)) +PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA)) LIBS = $(GITLIBS) $(EXTLIBS) @@ -1776,7 +1767,7 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES git.res: git.rc GIT-VERSION-FILE $(QUIET_RC)$(RC) \ - $(join -DMAJOR= -DMINOR= -DPATCH=, $(wordlist 1,3,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \ + $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \ -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@ ifndef NO_PERL @@ -1792,9 +1783,12 @@ perl/PM.stamp: FORCE perl/perl.mak: GIT-CFLAGS GIT-PREFIX perl/Makefile perl/Makefile.PL $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F) -$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE +PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ) +$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE $(QUIET_GEN)$(RM) $@ $@+ && \ INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \ + INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \ + INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \ sed -e '1{' \ -e ' s|#!.*perl|#!$(PERL_PATH_SQ)|' \ -e ' h' \ @@ -1807,6 +1801,13 @@ $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE chmod +x $@+ && \ mv $@+ $@ +GIT-PERL-DEFINES: FORCE + @FLAGS='$(PERL_DEFINES)'; \ + if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \ + echo >&2 " * new perl-specific parameters"; \ + echo "$$FLAGS" >$@; \ + fi + .PHONY: gitweb gitweb: @@ -2043,10 +2044,10 @@ git-imap-send$X: imap-send.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO) -git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS) +git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) -git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS) +git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) @@ -2215,6 +2216,9 @@ endif ifdef GIT_PERF_MAKE_OPTS @echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@ endif +ifdef TEST_GIT_INDEX_VERSION + @echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@ +endif ### Detect Python interpreter path changes ifndef NO_PYTHON @@ -2472,8 +2476,9 @@ profile-clean: $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) clean: profile-clean coverage-clean - $(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \ - builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB) + $(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o + $(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o + $(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB) $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X $(RM) $(TEST_PROGRAMS) $(NO_INSTALL) $(RM) -r bin-wrappers $(dep_dirs) @@ -2494,7 +2499,8 @@ ifndef NO_TCLTK $(MAKE) -C git-gui clean endif $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS - $(RM) GIT-USER-AGENT GIT-PREFIX GIT-SCRIPT-DEFINES GIT-PYTHON-VARS + $(RM) GIT-USER-AGENT GIT-PREFIX + $(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS .PHONY: all install profile-clean clean strip .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell @@ -1 +1 @@ -Documentation/RelNotes/1.8.5.txt
\ No newline at end of file +Documentation/RelNotes/2.0.0.txt
\ No newline at end of file @@ -110,7 +110,7 @@ static const char *real_path_internal(const char *path, int die_on_error) else goto error_out; } - if (len && !is_dir_sep(buf[len-1])) + if (len && !is_dir_sep(buf[len - 1])) buf[len++] = '/'; strcpy(buf + len, last_elem); free(last_elem); @@ -143,7 +143,7 @@ static const char *real_path_internal(const char *path, int die_on_error) error_out: free(last_elem); if (*cwd && chdir(cwd)) - die_errno ("Could not change back to '%s'", cwd); + die_errno("Could not change back to '%s'", cwd); return retval; } @@ -201,7 +201,7 @@ const char *absolute_path(const char *path) if (!cwd) die_errno("Cannot determine the current working directory"); len = strlen(cwd); - fmt = (len > 0 && is_dir_sep(cwd[len-1])) ? "%s%s" : "%s/%s"; + fmt = (len > 0 && is_dir_sep(cwd[len - 1])) ? "%s%s" : "%s/%s"; if (snprintf(buf, PATH_MAX, fmt, cwd, path) >= PATH_MAX) die("Too long path: %.*s", 60, path); } @@ -215,23 +215,25 @@ const char *absolute_path(const char *path) */ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg) { - static char path[PATH_MAX]; + static struct strbuf path = STRBUF_INIT; #ifndef GIT_WINDOWS_NATIVE if (!pfx_len || is_absolute_path(arg)) return arg; - memcpy(path, pfx, pfx_len); - strcpy(path + pfx_len, arg); + strbuf_reset(&path); + strbuf_add(&path, pfx, pfx_len); + strbuf_addstr(&path, arg); #else char *p; /* don't add prefix to absolute paths, but still replace '\' by '/' */ + strbuf_reset(&path); if (is_absolute_path(arg)) pfx_len = 0; else if (pfx_len) - memcpy(path, pfx, pfx_len); - strcpy(path + pfx_len, arg); - for (p = path + pfx_len; *p; p++) + strbuf_add(&path, pfx, pfx_len); + strbuf_addstr(&path, arg); + for (p = path.buf + pfx_len; *p; p++) if (*p == '\\') *p = '/'; #endif - return path; + return path.buf; } @@ -2,7 +2,6 @@ int advice_push_update_rejected = 1; int advice_push_non_ff_current = 1; -int advice_push_non_ff_default = 1; int advice_push_non_ff_matching = 1; int advice_push_already_exists = 1; int advice_push_fetch_first = 1; @@ -23,7 +22,6 @@ static struct { } advice_config[] = { { "pushupdaterejected", &advice_push_update_rejected }, { "pushnonffcurrent", &advice_push_non_ff_current }, - { "pushnonffdefault", &advice_push_non_ff_default }, { "pushnonffmatching", &advice_push_non_ff_matching }, { "pushalreadyexists", &advice_push_already_exists }, { "pushfetchfirst", &advice_push_fetch_first }, @@ -5,7 +5,6 @@ extern int advice_push_update_rejected; extern int advice_push_non_ff_current; -extern int advice_push_non_ff_default; extern int advice_push_non_ff_matching; extern int advice_push_already_exists; extern int advice_push_fetch_first; @@ -5,7 +5,7 @@ static char *alias_val; static int alias_lookup_cb(const char *k, const char *v, void *cb) { - if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) { + if (starts_with(k, "alias.") && !strcmp(k + 6, alias_key)) { if (!v) return config_error_nonbool(k); alias_val = xstrdup(v); @@ -34,7 +34,7 @@ int split_cmdline(char *cmdline, const char ***argv) int src, dst, count = 0, size = 16; char quoted = 0; - *argv = xmalloc(sizeof(char *) * size); + *argv = xmalloc(sizeof(**argv) * size); /* split alias_string */ (*argv)[count++] = cmdline; @@ -45,7 +45,7 @@ int split_cmdline(char *cmdline, const char ***argv) while (cmdline[++src] && isspace(cmdline[src])) ; /* skip */ - ALLOC_GROW(*argv, count+1, size); + ALLOC_GROW(*argv, count + 1, size); (*argv)[count++] = cmdline + dst; } else if (!quoted && (c == '\'' || c == '"')) { quoted = c; @@ -76,12 +76,13 @@ int split_cmdline(char *cmdline, const char ***argv) return -SPLIT_CMDLINE_UNCLOSED_QUOTE; } - ALLOC_GROW(*argv, count+1, size); + ALLOC_GROW(*argv, count + 1, size); (*argv)[count] = NULL; return count; } -const char *split_cmdline_strerror(int split_cmdline_errno) { - return split_cmdline_errors[-split_cmdline_errno-1]; +const char *split_cmdline_strerror(int split_cmdline_errno) +{ + return split_cmdline_errors[-split_cmdline_errno - 1]; } @@ -58,7 +58,7 @@ static void report(const char *name, unsigned int count, size_t size) } #define REPORT(name) \ - report(#name, name##_allocs, name##_allocs*sizeof(struct name) >> 10) + report(#name, name##_allocs, name##_allocs * sizeof(struct name) >> 10) void alloc_report(void) { @@ -17,6 +17,7 @@ static char const * const archive_usage[] = { static const struct archiver **archivers; static int nr_archivers; static int alloc_archivers; +static int remote_allow_unreachable; void register_archiver(struct archiver *ar) { @@ -257,7 +258,7 @@ static void parse_treeish_arg(const char **argv, unsigned char sha1[20]; /* Remotes are only allowed to fetch actual refs */ - if (remote) { + if (remote && !remote_allow_unreachable) { char *ref = NULL; const char *colon = strchr(name, ':'); int refnamelen = colon ? colon - name : strlen(name); @@ -401,6 +402,14 @@ static int parse_archive_args(int argc, const char **argv, return argc; } +static int git_default_archive_config(const char *var, const char *value, + void *cb) +{ + if (!strcmp(var, "uploadarchive.allowunreachable")) + remote_allow_unreachable = git_config_bool(var, value); + return git_default_config(var, value, cb); +} + int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix, const char *name_hint, int remote) { @@ -411,7 +420,7 @@ int write_archive(int argc, const char **argv, const char *prefix, if (setup_prefix && prefix == NULL) prefix = setup_git_directory_gently(&nongit); - git_config(git_default_config, NULL); + git_config(git_default_archive_config, NULL); init_tar_archiver(); init_zip_archiver(); @@ -440,7 +449,7 @@ static int match_extension(const char *filename, const char *ext) * prefix is non-empty (k.e., we don't match .tar.gz with no actual * filename). */ - if (prefixlen < 2 || filename[prefixlen-1] != '.') + if (prefixlen < 2 || filename[prefixlen - 1] != '.') return 0; return !strcmp(filename + prefixlen, ext); } @@ -211,7 +211,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, name = cp; namelen = strcspn(name, blank); if (strlen(ATTRIBUTE_MACRO_PREFIX) < namelen && - !prefixcmp(name, ATTRIBUTE_MACRO_PREFIX)) { + starts_with(name, ATTRIBUTE_MACRO_PREFIX)) { if (!macro_ok) { fprintf(stderr, "%s not allowed: %s:%d\n", name, src, lineno); @@ -41,7 +41,7 @@ int decode_85(char *dst, const char *buffer, int len) { prep_base85(); - say2("decode 85 <%.*s>", len/4*5, buffer); + say2("decode 85 <%.*s>", len / 4 * 5, buffer); while (len) { unsigned acc = 0; int de, cnt = 4; @@ -406,9 +406,9 @@ static int register_ref(const char *refname, const unsigned char *sha1, if (!strcmp(refname, "bad")) { current_bad_sha1 = xmalloc(20); hashcpy(current_bad_sha1, sha1); - } else if (!prefixcmp(refname, "good-")) { + } else if (starts_with(refname, "good-")) { sha1_array_append(&good_revs, sha1); - } else if (!prefixcmp(refname, "skip-")) { + } else if (starts_with(refname, "skip-")) { sha1_array_append(&skipped_revs, sha1); } @@ -685,7 +685,6 @@ static void mark_expected_rev(char *bisect_rev_hex) static int bisect_checkout(char *bisect_rev_hex, int no_checkout) { - int res; mark_expected_rev(bisect_rev_hex); @@ -696,6 +695,7 @@ static int bisect_checkout(char *bisect_rev_hex, int no_checkout) die("update-ref --no-deref HEAD failed on %s", bisect_rev_hex); } else { + int res; res = run_command_v_opt(argv_checkout, RUN_GIT_CMD); if (res) exit(res); diff --git a/block-sha1/sha1.c b/block-sha1/sha1.c index a8d4bf9301..22b125cf8c 100644 --- a/block-sha1/sha1.c +++ b/block-sha1/sha1.c @@ -62,38 +62,6 @@ #define setW(x, val) (W(x) = (val)) #endif -/* - * Performance might be improved if the CPU architecture is OK with - * unaligned 32-bit loads and a fast ntohl() is available. - * Otherwise fall back to byte loads and shifts which is portable, - * and is faster on architectures with memory alignment issues. - */ - -#if defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64) || \ - defined(__ppc__) || defined(__ppc64__) || \ - defined(__powerpc__) || defined(__powerpc64__) || \ - defined(__s390__) || defined(__s390x__) - -#define get_be32(p) ntohl(*(unsigned int *)(p)) -#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) - -#else - -#define get_be32(p) ( \ - (*((unsigned char *)(p) + 0) << 24) | \ - (*((unsigned char *)(p) + 1) << 16) | \ - (*((unsigned char *)(p) + 2) << 8) | \ - (*((unsigned char *)(p) + 3) << 0) ) -#define put_be32(p, v) do { \ - unsigned int __v = (v); \ - *((unsigned char *)(p) + 0) = __v >> 24; \ - *((unsigned char *)(p) + 1) = __v >> 16; \ - *((unsigned char *)(p) + 2) = __v >> 8; \ - *((unsigned char *)(p) + 3) = __v >> 0; } while (0) - -#endif - /* This "rolls" over the 512-bit array */ #define W(x) (array[(x)&15]) @@ -274,10 +242,10 @@ void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx) padlen[1] = htonl((uint32_t)(ctx->size << 3)); i = ctx->size & 63; - blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i))); + blk_SHA1_Update(ctx, pad, 1 + (63 & (55 - i))); blk_SHA1_Update(ctx, padlen, 8); /* Output hash */ for (i = 0; i < 5; i++) - put_be32(hashout + i*4, ctx->H[i]); + put_be32(hashout + i * 4, ctx->H[i]); } @@ -50,7 +50,7 @@ static int should_setup_rebase(const char *origin) void install_branch_config(int flag, const char *local, const char *origin, const char *remote) { const char *shortname = remote + 11; - int remote_is_branch = !prefixcmp(remote, "refs/heads/"); + int remote_is_branch = starts_with(remote, "refs/heads/"); struct strbuf key = STRBUF_INIT; int rebasing = should_setup_rebase(origin); @@ -272,7 +272,7 @@ void create_branch(const char *head, break; case 1: /* Unique completion -- good, only if it is a real branch */ - if (prefixcmp(real_ref, "refs/heads/") && + if (!starts_with(real_ref, "refs/heads/") && validate_remote_tracking_branch(real_ref)) { if (explicit_tracking) die(_(upstream_not_branch), start_name); @@ -27,6 +27,8 @@ extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out, extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, int sha1_valid, char **buf, unsigned long *buf_size); +extern int is_builtin(const char *s); + extern int cmd_add(int argc, const char **argv, const char *prefix); extern int cmd_annotate(int argc, const char **argv, const char *prefix); extern int cmd_apply(int argc, const char **argv, const char *prefix); @@ -103,7 +105,6 @@ extern int cmd_remote(int argc, const char **argv, const char *prefix); extern int cmd_remote_ext(int argc, const char **argv, const char *prefix); extern int cmd_remote_fd(int argc, const char **argv, const char *prefix); extern int cmd_repack(int argc, const char **argv, const char *prefix); -extern int cmd_repo_config(int argc, const char **argv, const char *prefix); extern int cmd_rerere(int argc, const char **argv, const char *prefix); extern int cmd_reset(int argc, const char **argv, const char *prefix); extern int cmd_rev_list(int argc, const char **argv, const char *prefix); diff --git a/builtin/add.c b/builtin/add.c index 226f758869..4b045bace1 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -26,55 +26,8 @@ static int take_worktree_changes; struct update_callback_data { int flags; int add_errors; - const char *implicit_dot; - size_t implicit_dot_len; - - /* only needed for 2.0 transition preparation */ - int warn_add_would_remove; }; -static const char *option_with_implicit_dot; -static const char *short_option_with_implicit_dot; - -static void warn_pathless_add(void) -{ - static int shown; - assert(option_with_implicit_dot && short_option_with_implicit_dot); - - if (shown) - return; - shown = 1; - - /* - * To be consistent with "git add -p" and most Git - * commands, we should default to being tree-wide, but - * this is not the original behavior and can't be - * changed until users trained themselves not to type - * "git add -u" or "git add -A". For now, we warn and - * keep the old behavior. Later, the behavior can be changed - * to tree-wide, keeping the warning for a while, and - * eventually we can drop the warning. - */ - warning(_("The behavior of 'git add %s (or %s)' with no path argument from a\n" - "subdirectory of the tree will change in Git 2.0 and should not be used anymore.\n" - "To add content for the whole tree, run:\n" - "\n" - " git add %s :/\n" - " (or git add %s :/)\n" - "\n" - "To restrict the command to the current directory, run:\n" - "\n" - " git add %s .\n" - " (or git add %s .)\n" - "\n" - "With the current Git version, the command is restricted to " - "the current directory.\n" - ""), - option_with_implicit_dot, short_option_with_implicit_dot, - option_with_implicit_dot, short_option_with_implicit_dot, - option_with_implicit_dot, short_option_with_implicit_dot); -} - static int fix_unmerged_status(struct diff_filepair *p, struct update_callback_data *data) { @@ -96,49 +49,15 @@ static int fix_unmerged_status(struct diff_filepair *p, return DIFF_STATUS_MODIFIED; } -static const char *add_would_remove_warning = N_( - "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n" -"whose behaviour will change in Git 2.0 with respect to paths you removed.\n" -"Paths like '%s' that are\n" -"removed from your working tree are ignored with this version of Git.\n" -"\n" -"* 'git add --ignore-removal <pathspec>', which is the current default,\n" -" ignores paths you removed from your working tree.\n" -"\n" -"* 'git add --all <pathspec>' will let you also record the removals.\n" -"\n" -"Run 'git status' to check the paths you removed from your working tree.\n"); - -static void warn_add_would_remove(const char *path) -{ - warning(_(add_would_remove_warning), path); -} - static void update_callback(struct diff_queue_struct *q, struct diff_options *opt, void *cbdata) { int i; struct update_callback_data *data = cbdata; - const char *implicit_dot = data->implicit_dot; - size_t implicit_dot_len = data->implicit_dot_len; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; - /* - * Check if "git add -A" or "git add -u" was run from a - * subdirectory with a modified file outside that directory, - * and warn if so. - * - * "git add -u" will behave like "git add -u :/" instead of - * "git add -u ." in the future. This warning prepares for - * that change. - */ - if (implicit_dot && - strncmp_icase(path, implicit_dot, implicit_dot_len)) { - warn_pathless_add(); - continue; - } switch (fix_unmerged_status(p, data)) { default: die(_("unexpected diff status %c"), p->status); @@ -151,10 +70,6 @@ static void update_callback(struct diff_queue_struct *q, } break; case DIFF_STATUS_DELETED: - if (data->warn_add_would_remove) { - warn_add_would_remove(path); - data->warn_add_would_remove = 0; - } if (data->flags & ADD_CACHE_IGNORE_REMOVAL) break; if (!(data->flags & ADD_CACHE_PRETEND)) @@ -166,37 +81,28 @@ static void update_callback(struct diff_queue_struct *q, } } -static void update_files_in_cache(const char *prefix, - const struct pathspec *pathspec, - struct update_callback_data *data) +int add_files_to_cache(const char *prefix, + const struct pathspec *pathspec, int flags) { + struct update_callback_data data; struct rev_info rev; + memset(&data, 0, sizeof(data)); + data.flags = flags; + init_revisions(&rev, prefix); setup_revisions(0, NULL, &rev, NULL); if (pathspec) copy_pathspec(&rev.prune_data, pathspec); rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; rev.diffopt.format_callback = update_callback; - rev.diffopt.format_callback_data = data; + rev.diffopt.format_callback_data = &data; rev.max_count = 0; /* do not compare unmerged paths with stage #2 */ run_diff_files(&rev, DIFF_RACY_IS_MODIFIED); -} - -int add_files_to_cache(const char *prefix, - const struct pathspec *pathspec, int flags) -{ - struct update_callback_data data; - - memset(&data, 0, sizeof(data)); - data.flags = flags; - update_files_in_cache(prefix, pathspec, &data); return !!data.add_errors; } -#define WARN_IMPLICIT_DOT (1u << 0) -static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, - int prefix, unsigned flag) +static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix) { char *seen; int i; @@ -208,19 +114,8 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, i = dir->nr; while (--i >= 0) { struct dir_entry *entry = *src++; - if (match_pathspec_depth(pathspec, entry->name, entry->len, - prefix, seen)) + if (dir_path_match(entry, pathspec, prefix, seen)) *dst++ = entry; - else if (flag & WARN_IMPLICIT_DOT) - /* - * "git add -A" was run from a subdirectory with a - * new file outside that directory. - * - * "git add -A" will behave like "git add -A :/" - * instead of "git add -A ." in the future. - * Warn about the coming behavior change. - */ - warn_pathless_add(); } dir->nr = dst - dir->entries; add_pathspec_matches_against_index(pathspec, seen); @@ -339,7 +234,7 @@ N_("The following paths are ignored by one of your .gitignore files:\n"); static int verbose, show_only, ignored_too, refresh_only; static int ignore_add_errors, intent_to_add, ignore_missing; -#define ADDREMOVE_DEFAULT 0 /* Change to 1 in Git 2.0 */ +#define ADDREMOVE_DEFAULT 1 static int addremove = ADDREMOVE_DEFAULT; static int addremove_explicit = -1; /* unspecified */ @@ -412,8 +307,6 @@ int cmd_add(int argc, const char **argv, const char *prefix) int add_new_files; int require_pathspec; char *seen = NULL; - int implicit_dot = 0; - struct update_callback_data update_data; git_config(add_config, NULL); @@ -437,36 +330,17 @@ int cmd_add(int argc, const char **argv, const char *prefix) if (addremove && take_worktree_changes) die(_("-A and -u are mutually incompatible")); - /* - * Warn when "git add pathspec..." was given without "-u" or "-A" - * and pathspec... covers a removed path. - */ - memset(&update_data, 0, sizeof(update_data)); - if (!take_worktree_changes && addremove_explicit < 0) - update_data.warn_add_would_remove = 1; - if (!take_worktree_changes && addremove_explicit < 0 && argc) - /* - * Turn "git add pathspec..." to "git add -A pathspec..." - * in Git 2.0 but not yet - */ - ; /* addremove = 1; */ + /* Turn "git add pathspec..." to "git add -A pathspec..." */ + addremove = 1; if (!show_only && ignore_missing) die(_("Option --ignore-missing can only be used together with --dry-run")); - if (addremove) { - option_with_implicit_dot = "--all"; - short_option_with_implicit_dot = "-A"; - } - if (take_worktree_changes) { - option_with_implicit_dot = "--update"; - short_option_with_implicit_dot = "-u"; - } - if (option_with_implicit_dot && !argc) { - static const char *here[2] = { ".", NULL }; + + if ((0 < addremove_explicit || take_worktree_changes) && !argc) { + static const char *whole[2] = { ":/", NULL }; argc = 1; - argv = here; - implicit_dot = 1; + argv = whole; } add_new_files = !take_worktree_changes && !refresh_only; @@ -479,8 +353,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) (intent_to_add ? ADD_CACHE_INTENT : 0) | (ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) | (!(addremove || take_worktree_changes) - ? ADD_CACHE_IGNORE_REMOVAL : 0)) | - (implicit_dot ? ADD_CACHE_IMPLICIT_DOT : 0); + ? ADD_CACHE_IGNORE_REMOVAL : 0)); if (require_pathspec && argc == 0) { fprintf(stderr, _("Nothing specified, nothing added.\n")); @@ -514,18 +387,15 @@ int cmd_add(int argc, const char **argv, const char *prefix) memset(&empty_pathspec, 0, sizeof(empty_pathspec)); /* This picks up the paths that are not tracked */ - baselen = fill_directory(&dir, implicit_dot ? &empty_pathspec : &pathspec); + baselen = fill_directory(&dir, &pathspec); if (pathspec.nr) - seen = prune_directory(&dir, &pathspec, baselen, - implicit_dot ? WARN_IMPLICIT_DOT : 0); + seen = prune_directory(&dir, &pathspec, baselen); } if (refresh_only) { refresh(verbose, &pathspec); goto finish; } - if (implicit_dot && prefix) - refresh_cache(REFRESH_QUIET); if (pathspec.nr) { int i; @@ -540,11 +410,14 @@ int cmd_add(int argc, const char **argv, const char *prefix) PATHSPEC_FROMTOP | PATHSPEC_LITERAL | PATHSPEC_GLOB | - PATHSPEC_ICASE); + PATHSPEC_ICASE | + PATHSPEC_EXCLUDE); for (i = 0; i < pathspec.nr; i++) { const char *path = pathspec.items[i].match; - if (!seen[i] && + if (pathspec.items[i].magic & PATHSPEC_EXCLUDE) + continue; + if (!seen[i] && path[0] && ((pathspec.items[i].magic & (PATHSPEC_GLOB | PATHSPEC_ICASE)) || !file_exists(path))) { @@ -562,21 +435,8 @@ int cmd_add(int argc, const char **argv, const char *prefix) plug_bulk_checkin(); - if ((flags & ADD_CACHE_IMPLICIT_DOT) && prefix) { - /* - * Check for modified files throughout the worktree so - * update_callback has a chance to warn about changes - * outside the cwd. - */ - update_data.implicit_dot = prefix; - update_data.implicit_dot_len = strlen(prefix); - free_pathspec(&pathspec); - memset(&pathspec, 0, sizeof(pathspec)); - } - update_data.flags = flags & ~ADD_CACHE_IMPLICIT_DOT; - update_files_in_cache(prefix, &pathspec, &update_data); + exit_status |= add_files_to_cache(prefix, &pathspec, flags); - exit_status |= !!update_data.add_errors; if (add_new_files) exit_status |= add_files(&dir, flags); diff --git a/builtin/apply.c b/builtin/apply.c index ef32e4f624..0189523798 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -1409,10 +1409,10 @@ static void recount_diff(const char *line, int size, struct fragment *fragment) case '\\': continue; case '@': - ret = size < 3 || prefixcmp(line, "@@ "); + ret = size < 3 || !starts_with(line, "@@ "); break; case 'd': - ret = size < 5 || prefixcmp(line, "diff "); + ret = size < 5 || !starts_with(line, "diff "); break; default: ret = -1; @@ -1798,11 +1798,11 @@ static struct fragment *parse_binary_hunk(char **buf_p, *status_p = 0; - if (!prefixcmp(buffer, "delta ")) { + if (starts_with(buffer, "delta ")) { patch_method = BINARY_DELTA_DEFLATED; origlen = strtoul(buffer + 6, NULL, 10); } - else if (!prefixcmp(buffer, "literal ")) { + else if (starts_with(buffer, "literal ")) { patch_method = BINARY_LITERAL_DEFLATED; origlen = strtoul(buffer + 8, NULL, 10); } @@ -1943,13 +1943,7 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch) size - offset - hdrsize, patch); if (!patchsize) { - static const char *binhdr[] = { - "Binary files ", - "Files ", - NULL, - }; static const char git_binary[] = "GIT binary patch\n"; - int i; int hd = hdrsize + offset; unsigned long llen = linelen(buffer + hd, size - hd); @@ -1965,6 +1959,12 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch) patchsize = 0; } else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) { + static const char *binhdr[] = { + "Binary files ", + "Files ", + NULL, + }; + int i; for (i = 0; binhdr[i]; i++) { int len = strlen(binhdr[i]); if (len < size - hd && @@ -3627,12 +3627,12 @@ static int preimage_sha1_in_gitlink_patch(struct patch *p, unsigned char sha1[20 hunk->oldpos == 1 && hunk->oldlines == 1 && /* does preimage begin with the heading? */ (preimage = memchr(hunk->patch, '\n', hunk->size)) != NULL && - !prefixcmp(++preimage, heading) && + starts_with(++preimage, heading) && /* does it record full SHA-1? */ !get_sha1_hex(preimage + sizeof(heading) - 1, sha1) && preimage[sizeof(heading) + 40 - 1] == '\n' && /* does the abbreviated name on the index line agree with it? */ - !prefixcmp(preimage + sizeof(heading) - 1, p->old_sha1_prefix)) + starts_with(preimage + sizeof(heading) - 1, p->old_sha1_prefix)) return 0; /* it all looks fine */ /* we may have full object name on the index line */ @@ -4152,7 +4152,7 @@ static int use_patch(struct patch *p) /* See if it matches any of exclude/include rule */ for (i = 0; i < limit_by_name.nr; i++) { struct string_list_item *it = &limit_by_name.items[i]; - if (!fnmatch(it->string, pathname, 0)) + if (!wildmatch(it->string, pathname, 0, NULL)) return (it->util != NULL); } diff --git a/builtin/archive.c b/builtin/archive.c index 49178f159e..a1e3b940c2 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -57,9 +57,9 @@ static int run_remote_archiver(int argc, const char **argv, if (!buf) die(_("git archive: expected ACK/NAK, got EOF")); if (strcmp(buf, "ACK")) { - if (!prefixcmp(buf, "NACK ")) + if (starts_with(buf, "NACK ")) die(_("git archive: NACK %s"), buf + 5); - if (!prefixcmp(buf, "ERR ")) + if (starts_with(buf, "ERR ")) die(_("remote error: %s"), buf + 4); die(_("git archive: protocol error")); } diff --git a/builtin/blame.c b/builtin/blame.c index 6da7233968..e5b5d71bad 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -197,7 +197,6 @@ static void drop_origin_blob(struct origin *o) * scoreboard structure, sorted by the target line number. */ struct blame_entry { - struct blame_entry *prev; struct blame_entry *next; /* the first line of this group in the final image; @@ -256,15 +255,6 @@ struct scoreboard { int *lineno; }; -static inline int same_suspect(struct origin *a, struct origin *b) -{ - if (a == b) - return 1; - if (a->commit != b->commit) - return 0; - return !strcmp(a->path, b->path); -} - static void sanity_check_refcnt(struct scoreboard *); /* @@ -277,13 +267,11 @@ static void coalesce(struct scoreboard *sb) struct blame_entry *ent, *next; for (ent = sb->ent; ent && (next = ent->next); ent = next) { - if (same_suspect(ent->suspect, next->suspect) && + if (ent->suspect == next->suspect && ent->guilty == next->guilty && ent->s_lno + ent->num_lines == next->s_lno) { ent->num_lines += next->num_lines; ent->next = next->next; - if (ent->next) - ent->next->prev = ent; origin_decref(next->suspect); free(next); ent->score = 0; @@ -409,7 +397,9 @@ static struct origin *find_origin(struct scoreboard *sb, paths[0] = origin->path; paths[1] = NULL; - parse_pathspec(&diff_opts.pathspec, PATHSPEC_ALL_MAGIC, 0, "", paths); + parse_pathspec(&diff_opts.pathspec, + PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL, + PATHSPEC_LITERAL_PATH, "", paths); diff_setup_done(&diff_opts); if (is_null_sha1(origin->commit->object.sha1)) @@ -532,7 +522,7 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e) prev = ent; /* prev, if not NULL, is the last one that is below e */ - e->prev = prev; + if (prev) { e->next = prev->next; prev->next = e; @@ -541,8 +531,6 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e) e->next = sb->ent; sb->ent = e; } - if (e->next) - e->next->prev = e; } /* @@ -553,14 +541,12 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e) */ static void dup_entry(struct blame_entry *dst, struct blame_entry *src) { - struct blame_entry *p, *n; + struct blame_entry *n; - p = dst->prev; n = dst->next; origin_incref(src->suspect); origin_decref(dst->suspect); memcpy(dst, src, sizeof(*src)); - dst->prev = p; dst->next = n; dst->score = 0; } @@ -740,7 +726,7 @@ static int find_last_in_target(struct scoreboard *sb, struct origin *target) int last_in_target = -1; for (e = sb->ent; e; e = e->next) { - if (e->guilty || !same_suspect(e->suspect, target)) + if (e->guilty || e->suspect != target) continue; if (last_in_target < e->s_lno + e->num_lines) last_in_target = e->s_lno + e->num_lines; @@ -760,7 +746,7 @@ static void blame_chunk(struct scoreboard *sb, struct blame_entry *e; for (e = sb->ent; e; e = e->next) { - if (e->guilty || !same_suspect(e->suspect, target)) + if (e->guilty || e->suspect != target) continue; if (same <= e->s_lno) continue; @@ -937,7 +923,6 @@ static void find_copy_in_blob(struct scoreboard *sb, mmfile_t *file_p) { const char *cp; - int cnt; mmfile_t file_o; struct handle_split_cb_data d; @@ -948,13 +933,7 @@ static void find_copy_in_blob(struct scoreboard *sb, */ cp = nth_line(sb, ent->lno); file_o.ptr = (char *) cp; - cnt = ent->num_lines; - - while (cnt && cp < sb->final_buf + sb->final_buf_size) { - if (*cp++ == '\n') - cnt--; - } - file_o.size = cp - file_o.ptr; + file_o.size = nth_line(sb, ent->lno + ent->num_lines) - cp; /* * file_o is a part of final image we are annotating. @@ -990,7 +969,7 @@ static int find_move_in_parent(struct scoreboard *sb, while (made_progress) { made_progress = 0; for (e = sb->ent; e; e = e->next) { - if (e->guilty || !same_suspect(e->suspect, target) || + if (e->guilty || e->suspect != target || ent_score(sb, e) < blame_move_score) continue; find_copy_in_blob(sb, e, parent, split, &file_p); @@ -1025,14 +1004,14 @@ static struct blame_list *setup_blame_list(struct scoreboard *sb, for (e = sb->ent, num_ents = 0; e; e = e->next) if (!e->scanned && !e->guilty && - same_suspect(e->suspect, target) && + e->suspect == target && min_score < ent_score(sb, e)) num_ents++; if (num_ents) { blame_list = xcalloc(num_ents, sizeof(struct blame_list)); for (e = sb->ent, i = 0; e; e = e->next) if (!e->scanned && !e->guilty && - same_suspect(e->suspect, target) && + e->suspect == target && min_score < ent_score(sb, e)) blame_list[i++].ent = e; } @@ -1176,7 +1155,7 @@ static void pass_whole_blame(struct scoreboard *sb, origin->file.ptr = NULL; } for (e = sb->ent; e; e = e->next) { - if (!same_suspect(e->suspect, origin)) + if (e->suspect != origin) continue; origin_incref(porigin); origin_decref(e->suspect); @@ -1549,8 +1528,7 @@ static void assign_blame(struct scoreboard *sb, int opt) */ origin_incref(suspect); commit = suspect->commit; - if (!commit->object.parsed) - parse_commit(commit); + parse_commit(commit); if (reverse || (!(commit->object.flags & UNINTERESTING) && !(revs->max_age != -1 && commit->date < revs->max_age))) @@ -1566,7 +1544,7 @@ static void assign_blame(struct scoreboard *sb, int opt) /* Take responsibility for the remaining entries */ for (ent = sb->ent; ent; ent = ent->next) - if (same_suspect(ent->suspect, suspect)) + if (ent->suspect == suspect) found_guilty_entry(ent); origin_decref(suspect); @@ -1579,14 +1557,14 @@ static const char *format_time(unsigned long time, const char *tz_str, int show_raw_time) { static char time_buf[128]; - const char *time_str; - int time_len; - int tz; if (show_raw_time) { snprintf(time_buf, sizeof(time_buf), "%lu %s", time, tz_str); } else { + const char *time_str; + int time_len; + int tz; tz = atoi(tz_str); time_str = show_date(time, tz, blame_date_mode); time_len = strlen(time_str); @@ -1771,25 +1749,41 @@ static int prepare_lines(struct scoreboard *sb) { const char *buf = sb->final_buf; unsigned long len = sb->final_buf_size; - int num = 0, incomplete = 0, bol = 1; + const char *end = buf + len; + const char *p; + int *lineno; + int num = 0, incomplete = 0; - if (len && buf[len-1] != '\n') - incomplete++; /* incomplete line at the end */ - while (len--) { - if (bol) { - sb->lineno = xrealloc(sb->lineno, - sizeof(int *) * (num + 1)); - sb->lineno[num] = buf - sb->final_buf; - bol = 0; - } - if (*buf++ == '\n') { + for (p = buf;;) { + p = memchr(p, '\n', end - p); + if (p) { + p++; num++; - bol = 1; + continue; } + break; + } + + if (len && end[-1] != '\n') + incomplete++; /* incomplete line at the end */ + + sb->lineno = xmalloc(sizeof(*sb->lineno) * (num + incomplete + 1)); + lineno = sb->lineno; + + *lineno++ = 0; + for (p = buf;;) { + p = memchr(p, '\n', end - p); + if (p) { + p++; + *lineno++ = p - buf; + continue; + } + break; } - sb->lineno = xrealloc(sb->lineno, - sizeof(int *) * (num + incomplete + 1)); - sb->lineno[num + incomplete] = buf - sb->final_buf; + + if (incomplete) + *lineno++ = len; + sb->num_lines = num + incomplete; return sb->num_lines; } @@ -1802,17 +1796,17 @@ static int prepare_lines(struct scoreboard *sb) static int read_ancestry(const char *graft_file) { FILE *fp = fopen(graft_file, "r"); - char buf[1024]; + struct strbuf buf = STRBUF_INIT; if (!fp) return -1; - while (fgets(buf, sizeof(buf), fp)) { + while (!strbuf_getwholeline(&buf, fp, '\n')) { /* The format is just "Commit Parent1 Parent2 ...\n" */ - int len = strlen(buf); - struct commit_graft *graft = read_graft_line(buf, len); + struct commit_graft *graft = read_graft_line(buf.buf, buf.len); if (graft) register_commit_graft(graft, 0); } fclose(fp); + strbuf_release(&buf); return 0; } @@ -2501,8 +2495,6 @@ parse_done: ent->suspect = o; ent->s_lno = bottom; ent->next = next; - if (next) - next->prev = ent; origin_incref(o); } origin_decref(o); diff --git a/builtin/branch.c b/builtin/branch.c index ad0f86de54..652b1d2d14 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -81,13 +81,13 @@ static int parse_branch_color_slot(const char *var, int ofs) static int git_branch_config(const char *var, const char *value, void *cb) { - if (!prefixcmp(var, "column.")) + if (starts_with(var, "column.")) return git_column_config(var, value, "branch", &colopts); if (!strcmp(var, "color.branch")) { branch_use_color = git_config_colorbool(var, value); return 0; } - if (!prefixcmp(var, "color.branch.")) { + if (starts_with(var, "color.branch.")) { int slot = parse_branch_color_slot(var, 13); if (slot < 0) return 0; @@ -315,7 +315,7 @@ static int match_patterns(const char **pattern, const char *refname) if (!*pattern) return 1; /* no pattern always matches */ while (*pattern) { - if (!fnmatch(*pattern, refname, 0)) + if (!wildmatch(*pattern, refname, 0, NULL)) return 1; pattern++; } @@ -424,6 +424,7 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name, struct branch *branch = branch_get(branch_name); struct strbuf fancy = STRBUF_INIT; int upstream_is_gone = 0; + int added_decoration = 1; switch (stat_tracking_info(branch, &ours, &theirs)) { case 0: @@ -451,9 +452,13 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name, if (upstream_is_gone) { if (show_upstream_ref) strbuf_addf(stat, _("[%s: gone]"), fancy.buf); + else + added_decoration = 0; } else if (!ours && !theirs) { if (show_upstream_ref) strbuf_addf(stat, _("[%s]"), fancy.buf); + else + added_decoration = 0; } else if (!ours) { if (show_upstream_ref) strbuf_addf(stat, _("[%s: behind %d]"), fancy.buf, theirs); @@ -474,7 +479,8 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name, ours, theirs); } strbuf_release(&fancy); - strbuf_addch(stat, ' '); + if (added_decoration) + strbuf_addch(stat, ' '); free(ref); } @@ -496,7 +502,7 @@ static void add_verbose_info(struct strbuf *out, struct ref_item *item, const char *sub = _(" **** invalid ref ****"); struct commit *commit = item->commit; - if (commit && !parse_commit(commit)) { + if (!parse_commit(commit)) { pp_commit_easy(CMIT_FMT_ONELINE, commit, &subject); sub = subject.buf; } @@ -862,7 +868,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) if (!strcmp(head, "HEAD")) { detached = 1; } else { - if (prefixcmp(head, "refs/heads/")) + if (!starts_with(head, "refs/heads/")) die(_("HEAD not found below refs/heads!")); head += 11; } @@ -975,9 +981,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix) die(_("no such branch '%s'"), argv[0]); } - if (!branch_has_merge_config(branch)) { + 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); diff --git a/builtin/cat-file.c b/builtin/cat-file.c index b2ca775a80..d5a93e0e91 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -118,6 +118,7 @@ struct expand_data { unsigned long size; unsigned long disk_size; const char *rest; + unsigned char delta_base_sha1[20]; /* * If mark_query is true, we do not expand anything, but rather @@ -174,6 +175,11 @@ static void expand_atom(struct strbuf *sb, const char *atom, int len, data->split_on_whitespace = 1; else if (data->rest) strbuf_addstr(sb, data->rest); + } else if (is_atom("deltabase", atom, len)) { + if (data->mark_query) + data->info.delta_base_sha1 = data->delta_base_sha1; + else + strbuf_addstr(sb, sha1_to_hex(data->delta_base_sha1)); } else die("unknown format element: %.*s", len, atom); } @@ -193,25 +199,28 @@ static size_t expand_format(struct strbuf *sb, const char *start, void *data) return end - start + 1; } -static void print_object_or_die(int fd, const unsigned char *sha1, - enum object_type type, unsigned long size) +static void print_object_or_die(int fd, struct expand_data *data) { - if (type == OBJ_BLOB) { + const unsigned char *sha1 = data->sha1; + + assert(data->info.typep); + + if (data->type == OBJ_BLOB) { if (stream_blob_to_fd(fd, sha1, NULL, 0) < 0) die("unable to stream %s to stdout", sha1_to_hex(sha1)); } else { - enum object_type rtype; - unsigned long rsize; + enum object_type type; + unsigned long size; void *contents; - contents = read_sha1_file(sha1, &rtype, &rsize); + contents = read_sha1_file(sha1, &type, &size); if (!contents) die("object %s disappeared", sha1_to_hex(sha1)); - if (rtype != type) + if (type != data->type) die("object %s changed type!?", sha1_to_hex(sha1)); - if (rsize != size) - die("object %s change size!?", sha1_to_hex(sha1)); + if (data->info.sizep && size != data->size) + die("object %s changed size!?", sha1_to_hex(sha1)); write_or_die(fd, contents, size); free(contents); @@ -238,7 +247,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt, return 0; } - if (sha1_object_info_extended(data->sha1, &data->info) < 0) { + if (sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) { printf("%s missing\n", obj_name); fflush(stdout); return 0; @@ -250,7 +259,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt, strbuf_release(&buf); if (opt->print_contents) { - print_object_or_die(1, data->sha1, data->type, data->size); + print_object_or_die(1, data); write_or_die(1, "\n", 1); } return 0; @@ -275,6 +284,13 @@ static int batch_objects(struct batch_options *opt) data.mark_query = 0; /* + * If we are printing out the object, then always fill in the type, + * since we will want to decide whether or not to stream. + */ + if (opt->print_contents) + data.info.typep = &data.type; + + /* * We are going to call get_sha1 on a potentially very large number of * objects. In most large cases, these will be actual object sha1s. The * cost to double-check that each one is not also a ref (just so we can diff --git a/builtin/check-attr.c b/builtin/check-attr.c index e9af7b2bfb..5600ec3f61 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -102,6 +102,9 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix) struct git_attr_check *check; int cnt, i, doubledash, filei; + if (!is_bare_repository()) + setup_work_tree(); + git_config(git_default_config, NULL); argc = parse_options(argc, argv, prefix, check_attr_options, diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 69e167b16c..61e75eb60c 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -14,7 +14,7 @@ static int line_termination = '\n'; static int checkout_stage; /* default to checkout stage0 */ static int to_tempfile; -static char topath[4][PATH_MAX + 1]; +static char topath[4][TEMPORARY_FILENAME_LENGTH + 1]; static struct checkout state; diff --git a/builtin/checkout.c b/builtin/checkout.c index 0f57397037..ada51fa70f 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -297,8 +297,7 @@ static int checkout_paths(const struct checkout_opts *opts, * match_pathspec() for _all_ entries when * opts->source_tree != NULL. */ - if (match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce), - 0, ps_matched)) + if (ce_path_match(ce, &opts->pathspec, ps_matched)) ce->ce_flags |= CE_MATCHED; } @@ -380,8 +379,8 @@ static void show_local_changes(struct object *head, static void describe_detached_head(const char *msg, struct commit *commit) { struct strbuf sb = STRBUF_INIT; - parse_commit(commit); - pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb); + if (!parse_commit(commit)) + pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb); fprintf(stderr, "%s %s... %s\n", msg, find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf); strbuf_release(&sb); @@ -677,12 +676,12 @@ static int add_pending_uninteresting_ref(const char *refname, static void describe_one_orphan(struct strbuf *sb, struct commit *commit) { - parse_commit(commit); strbuf_addstr(sb, " "); strbuf_addstr(sb, find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV)); strbuf_addch(sb, ' '); - pp_commit_easy(CMIT_FMT_ONELINE, commit, sb); + if (!parse_commit(commit)) + pp_commit_easy(CMIT_FMT_ONELINE, commit, sb); strbuf_addch(sb, '\n'); } @@ -781,7 +780,7 @@ static int switch_branches(const struct checkout_opts *opts, if (!(flag & REF_ISSYMREF)) old.path = NULL; - if (old.path && !prefixcmp(old.path, "refs/heads/")) + if (old.path && starts_with(old.path, "refs/heads/")) old.name = old.path + strlen("refs/heads/"); if (!new->name) { @@ -789,7 +788,7 @@ static int switch_branches(const struct checkout_opts *opts, new->commit = old.commit; if (!new->commit) die(_("You are on a branch yet to be born")); - parse_commit(new->commit); + parse_commit_or_die(new->commit); } ret = merge_working_tree(opts, &old, new, &writeout_error); @@ -816,7 +815,7 @@ static int git_checkout_config(const char *var, const char *value, void *cb) return 0; } - if (!prefixcmp(var, "submodule.")) + if (starts_with(var, "submodule.")) return parse_submodule_config_option(var, value); return git_xmerge_config(var, value, NULL); @@ -873,7 +872,9 @@ static int parse_branchname_arg(int argc, const char **argv, int argcount = 0; unsigned char branch_rev[20]; const char *arg; - int has_dash_dash; + int dash_dash_pos; + int has_dash_dash = 0; + int i; /* * case 1: git checkout <ref> -- [<paths>] @@ -885,20 +886,30 @@ static int parse_branchname_arg(int argc, const char **argv, * * everything after the '--' must be paths. * - * case 3: git checkout <something> [<paths>] + * case 3: git checkout <something> [--] * - * With no paths, if <something> is a commit, that is to - * switch to the branch or detach HEAD at it. As a special case, - * if <something> is A...B (missing A or B means HEAD but you can - * omit at most one side), and if there is a unique merge base - * between A and B, A...B names that merge base. + * (a) If <something> is a commit, that is to + * switch to the branch or detach HEAD at it. As a special case, + * if <something> is A...B (missing A or B means HEAD but you can + * omit at most one side), and if there is a unique merge base + * between A and B, A...B names that merge base. * - * With no paths, if <something> is _not_ a commit, no -t nor -b - * was given, and there is a tracking branch whose name is - * <something> in one and only one remote, then this is a short-hand - * to fork local <something> from that remote-tracking branch. + * (b) If <something> is _not_ a commit, either "--" is present + * or <something> is not a path, no -t nor -b was given, and + * and there is a tracking branch whose name is <something> + * in one and only one remote, then this is a short-hand to + * fork local <something> from that remote-tracking branch. * - * Otherwise <something> shall not be ambiguous. + * (c) Otherwise, if "--" is present, treat it like case (1). + * + * (d) Otherwise : + * - if it's a reference, treat it like case (1) + * - else if it's a path, treat it like case (2) + * - else: fail. + * + * case 4: git checkout <something> <paths> + * + * The first argument must not be ambiguous. * - If it's *only* a reference, treat it like case (1). * - If it's only a path, treat it like case (2). * - else: fail. @@ -907,28 +918,59 @@ static int parse_branchname_arg(int argc, const char **argv, if (!argc) return 0; - if (!strcmp(argv[0], "--")) /* case (2) */ - return 1; - arg = argv[0]; - has_dash_dash = (argc > 1) && !strcmp(argv[1], "--"); + dash_dash_pos = -1; + for (i = 0; i < argc; i++) { + if (!strcmp(argv[i], "--")) { + dash_dash_pos = i; + break; + } + } + if (dash_dash_pos == 0) + return 1; /* case (2) */ + else if (dash_dash_pos == 1) + has_dash_dash = 1; /* case (3) or (1) */ + else if (dash_dash_pos >= 2) + die(_("only one reference expected, %d given."), dash_dash_pos); if (!strcmp(arg, "-")) arg = "@{-1}"; if (get_sha1_mb(arg, rev)) { - if (has_dash_dash) /* case (1) */ - die(_("invalid reference: %s"), arg); - if (dwim_new_local_branch_ok && - !check_filename(NULL, arg) && - argc == 1) { + /* + * Either case (3) or (4), with <something> not being + * a commit, or an attempt to use case (1) with an + * invalid ref. + * + * It's likely an error, but we need to find out if + * we should auto-create the branch, case (3).(b). + */ + int recover_with_dwim = dwim_new_local_branch_ok; + + if (check_filename(NULL, arg) && !has_dash_dash) + recover_with_dwim = 0; + /* + * Accept "git checkout foo" and "git checkout foo --" + * as candidates for dwim. + */ + if (!(argc == 1 && !has_dash_dash) && + !(argc == 2 && has_dash_dash)) + recover_with_dwim = 0; + + if (recover_with_dwim) { const char *remote = unique_tracking_name(arg, rev); - if (!remote) - return argcount; - *new_branch = arg; - arg = remote; - /* DWIMmed to create local branch */ - } else { + if (remote) { + *new_branch = arg; + arg = remote; + /* DWIMmed to create local branch, case (3).(b) */ + } else { + recover_with_dwim = 0; + } + } + + if (!recover_with_dwim) { + if (has_dash_dash) + die(_("invalid reference: %s"), arg); return argcount; } } @@ -952,13 +994,13 @@ static int parse_branchname_arg(int argc, const char **argv, /* not a commit */ *source_tree = parse_tree_indirect(rev); } else { - parse_commit(new->commit); + parse_commit_or_die(new->commit); *source_tree = new->commit->tree; } if (!*source_tree) /* case (1): want a tree */ die(_("reference is not a tree: %s"), arg); - if (!has_dash_dash) {/* case (3 -> 1) */ + if (!has_dash_dash) {/* case (3).(d) -> (1) */ /* * Do not complain the most common case * git checkout branch @@ -1108,9 +1150,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) const char *argv0 = argv[0]; if (!argc || !strcmp(argv0, "--")) die (_("--track needs a branch name")); - if (!prefixcmp(argv0, "refs/")) + if (starts_with(argv0, "refs/")) argv0 += 5; - if (!prefixcmp(argv0, "remotes/")) + if (starts_with(argv0, "remotes/")) argv0 += 8; argv0 = strchr(argv0, '/'); if (!argv0 || !argv0[1]) diff --git a/builtin/clean.c b/builtin/clean.c index 615cd57caf..cf76b1f412 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -100,7 +100,7 @@ static int parse_clean_color_slot(const char *var) static int git_clean_config(const char *var, const char *value, void *cb) { - if (!prefixcmp(var, "column.")) + if (starts_with(var, "column.")) return git_column_config(var, value, "clean", &colopts); /* honors the color.interactive* config variables which also @@ -109,7 +109,7 @@ static int git_clean_config(const char *var, const char *value, void *cb) clean_use_color = git_config_colorbool(var, value); return 0; } - if (!prefixcmp(var, "color.interactive.")) { + if (starts_with(var, "color.interactive.")) { int slot = parse_clean_color_slot(var + strlen("color.interactive.")); if (slot < 0) @@ -154,7 +154,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag, DIR *dir; struct strbuf quoted = STRBUF_INIT; struct dirent *e; - int res = 0, ret = 0, gone = 1, original_len = path->len, len, i; + int res = 0, ret = 0, gone = 1, original_len = path->len, len; unsigned char submodule_head[20]; struct string_list dels = STRING_LIST_INIT_DUP; @@ -242,6 +242,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag, } if (!*dir_gone && !quiet) { + int i; for (i = 0; i < dels.nr; i++) printf(dry_run ? _(msg_would_remove) : _(msg_remove), dels.items[i].string); } @@ -933,48 +934,28 @@ int cmd_clean(int argc, const char **argv, const char *prefix) for (i = 0; i < dir.nr; i++) { struct dir_entry *ent = dir.entries[i]; - int len, pos; int matches = 0; - const struct cache_entry *ce; struct stat st; const char *rel; - /* - * Remove the '/' at the end that directory - * walking adds for directory entries. - */ - len = ent->len; - if (len && ent->name[len-1] == '/') - len--; - pos = cache_name_pos(ent->name, len); - if (0 <= pos) - continue; /* exact match */ - pos = -pos - 1; - if (pos < active_nr) { - ce = active_cache[pos]; - if (ce_namelen(ce) == len && - !memcmp(ce->name, ent->name, len)) - continue; /* Yup, this one exists unmerged */ - } + if (!cache_name_is_other(ent->name, ent->len)) + continue; if (lstat(ent->name, &st)) die_errno("Cannot lstat '%s'", ent->name); if (pathspec.nr) - matches = match_pathspec_depth(&pathspec, ent->name, - len, 0, NULL); + matches = dir_path_match(ent, &pathspec, 0, NULL); - if (S_ISDIR(st.st_mode)) { - if (remove_directories || (matches == MATCHED_EXACTLY)) { - rel = relative_path(ent->name, prefix, &buf); - string_list_append(&del_list, rel); - } - } else { - if (pathspec.nr && !matches) - continue; - rel = relative_path(ent->name, prefix, &buf); - string_list_append(&del_list, rel); - } + if (pathspec.nr && !matches) + continue; + + if (S_ISDIR(st.st_mode) && !remove_directories && + matches != MATCHED_EXACTLY) + continue; + + rel = relative_path(ent->name, prefix, &buf); + string_list_append(&del_list, rel); } if (interactive && del_list.nr > 0) diff --git a/builtin/clone.c b/builtin/clone.c index 874e0fd0b6..43e772ccdb 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -252,6 +252,12 @@ static int add_one_reference(struct string_list_item *item, void *cb_data) die(_("reference repository '%s' is not a local repository."), item->string); + if (!access(mkpath("%s/shallow", ref_git), F_OK)) + die(_("reference repository '%s' is shallow"), item->string); + + if (!access(mkpath("%s/info/grafts", ref_git), F_OK)) + die(_("reference repository '%s' is grafted"), item->string); + strbuf_addf(&alternate, "%s/objects", ref_git); add_to_alternates_file(alternate.buf); strbuf_release(&alternate); @@ -508,9 +514,9 @@ static void write_followtags(const struct ref *refs, const char *msg) { const struct ref *ref; for (ref = refs; ref; ref = ref->next) { - if (prefixcmp(ref->name, "refs/tags/")) + if (!starts_with(ref->name, "refs/tags/")) continue; - if (!suffixcmp(ref->name, "^{}")) + if (ends_with(ref->name, "^{}")) continue; if (!has_sha1_file(ref->old_sha1)) continue; @@ -578,7 +584,7 @@ static void update_remote_refs(const struct ref *refs, static void update_head(const struct ref *our, const struct ref *remote, const char *msg) { - if (our && !prefixcmp(our->name, "refs/heads/")) { + if (our && starts_with(our->name, "refs/heads/")) { /* Local default branch link */ create_symref("HEAD", our->name, NULL); if (!option_bare) { @@ -625,7 +631,7 @@ static int checkout(void) if (advice_detached_head) detach_advice(sha1_to_hex(sha1)); } else { - if (prefixcmp(head, "refs/heads/")) + if (!starts_with(head, "refs/heads/")) die(_("HEAD not found below refs/heads!")); } free(head); @@ -791,11 +797,22 @@ int cmd_clone(int argc, const char **argv, const char *prefix) else repo = repo_name; is_local = option_local != 0 && path && !is_bundle; - if (is_local && option_depth) - warning(_("--depth is ignored in local clones; use file:// instead.")); + if (is_local) { + if (option_depth) + warning(_("--depth is ignored in local clones; use file:// instead.")); + if (!access(mkpath("%s/shallow", path), F_OK)) { + if (option_local > 0) + warning(_("source repository is shallow, ignoring --local")); + is_local = 0; + } + } if (option_local > 0 && !is_local) warning(_("--local is ignored")); + /* no need to be strict, transport_set_option() will validate it again */ + if (option_depth && atoi(option_depth) < 1) + die(_("depth %s is not a positive number"), option_depth); + if (argc == 2) dir = xstrdup(argv[1]); else @@ -883,6 +900,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) remote = remote_get(option_origin); transport = transport_get(remote, remote->url[0]); + transport->cloning = 1; if (!transport->get_refs_list || (!is_local && !transport->fetch)) die(_("Don't know how to clone %s"), transport->url); diff --git a/builtin/column.c b/builtin/column.c index e125a55fc9..75818520e1 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -34,7 +34,7 @@ int cmd_column(int argc, const char **argv, const char *prefix) }; /* This one is special and must be the first one */ - if (argc > 1 && !prefixcmp(argv[1], "--command=")) { + if (argc > 1 && starts_with(argv[1], "--command=")) { command = argv[1] + 10; git_config(column_config, (void *)command); } else diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c index f641ff2a89..987a4c3d73 100644 --- a/builtin/commit-tree.c +++ b/builtin/commit-tree.c @@ -12,6 +12,8 @@ static const char commit_tree_usage[] = "git commit-tree [(-p <sha1>)...] [-S[<keyid>]] [-m <message>] [-F <file>] <sha1> <changelog"; +static const char *sign_commit; + static void new_parent(struct commit *parent, struct commit_list **parents_p) { unsigned char *sha1 = parent->object.sha1; @@ -31,6 +33,10 @@ static int commit_tree_config(const char *var, const char *value, void *cb) int status = git_gpg_config(var, value, NULL); if (status) return status; + if (!strcmp(var, "commit.gpgsign")) { + sign_commit = git_config_bool(var, value) ? "" : NULL; + return 0; + } return git_default_config(var, value, cb); } @@ -41,7 +47,6 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix) unsigned char tree_sha1[20]; unsigned char commit_sha1[20]; struct strbuf buffer = STRBUF_INIT; - const char *sign_commit = NULL; git_config(commit_tree_config, NULL); @@ -66,6 +71,11 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix) continue; } + if (!strcmp(arg, "--no-gpg-sign")) { + sign_commit = NULL; + continue; + } + if (!strcmp(arg, "-m")) { if (argc <= ++i) usage(commit_tree_usage); diff --git a/builtin/commit.c b/builtin/commit.c index 6ab4605cf5..3783bcadcd 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -234,7 +234,7 @@ static int list_paths(struct string_list *list, const char *with_tree, if (ce->ce_flags & CE_UPDATE) continue; - if (!match_pathspec_depth(pattern, ce->name, ce_namelen(ce), 0, m)) + if (!ce_path_match(ce, pattern, m)) continue; item = string_list_insert(list, ce->name); if (ce_skip_worktree(ce)) @@ -307,7 +307,6 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int fd; struct string_list partial; struct pathspec pathspec; - char *old_index_env = NULL; int refresh_flags = REFRESH_QUIET; if (is_status) @@ -320,6 +319,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, die(_("index file corrupt")); if (interactive) { + char *old_index_env = NULL; fd = hold_locked_index(&index_lock, 1); refresh_cache_or_die(refresh_flags); @@ -600,12 +600,10 @@ static int prepare_to_commit(const char *index_file, const char *prefix, { struct stat statbuf; struct strbuf committer_ident = STRBUF_INIT; - int commitable, saved_color_setting; + int commitable; struct strbuf sb = STRBUF_INIT; - char *buffer; const char *hook_arg1 = NULL; const char *hook_arg2 = NULL; - int ident_shown = 0; int clean_message_contents = (cleanup_mode != CLEANUP_NONE); int old_display_comment_prefix; @@ -649,6 +647,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, logfile); hook_arg1 = "message"; } else if (use_message) { + char *buffer; buffer = strstr(use_message_buffer, "\n\n"); if (!use_editor && (!buffer || buffer[2] == '\0')) die(_("commit has empty message")); @@ -733,7 +732,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, eol = nl - sb.buf; else eol = sb.len; - if (!prefixcmp(sb.buf + previous, "\nConflicts:\n")) { + if (starts_with(sb.buf + previous, "\nConflicts:\n")) { ignore_footer = sb.len - previous; break; } @@ -753,6 +752,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix, /* This checks if committer ident is explicitly given */ strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT)); if (use_editor && include_status) { + int ident_shown = 0; + int saved_color_setting; char *ai_tmp, *ci_tmp; if (whence != FROM_COMMIT) status_printf_ln(s, GIT_COLOR_NORMAL, @@ -904,7 +905,7 @@ static int rest_is_empty(struct strbuf *sb, int start) eol = sb->len; if (strlen(sign_off_header) <= eol - i && - !prefixcmp(sb->buf + i, sign_off_header)) { + starts_with(sb->buf + i, sign_off_header)) { i = eol; continue; } @@ -1183,7 +1184,7 @@ static int git_status_config(const char *k, const char *v, void *cb) { struct wt_status *s = cb; - if (!prefixcmp(k, "column.")) + if (starts_with(k, "column.")) return git_column_config(k, v, "status", &s->colopts); if (!strcmp(k, "status.submodulesummary")) { int is_bool; @@ -1211,7 +1212,7 @@ static int git_status_config(const char *k, const char *v, void *cb) s->display_comment_prefix = git_config_bool(k, v); return 0; } - if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) { + if (starts_with(k, "status.color.") || starts_with(k, "color.status.")) { int slot = parse_status_slot(k, 13); if (slot < 0) return 0; @@ -1338,7 +1339,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1, commit = lookup_commit(sha1); if (!commit) die(_("couldn't look up newly created commit")); - if (!commit || parse_commit(commit)) + if (parse_commit(commit)) die(_("could not parse newly created commit")); strbuf_addstr(&format, "format:%h] %s"); @@ -1377,7 +1378,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1, head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL); printf("[%s%s ", - !prefixcmp(head, "refs/heads/") ? + starts_with(head, "refs/heads/") ? head + 11 : !strcmp(head, "HEAD") ? _("detached HEAD") : @@ -1406,6 +1407,10 @@ static int git_commit_config(const char *k, const char *v, void *cb) } if (!strcmp(k, "commit.cleanup")) return git_config_string(&cleanup_arg, k, v); + if (!strcmp(k, "commit.gpgsign")) { + sign_commit = git_config_bool(k, v) ? "" : NULL; + return 0; + } status = git_gpg_config(k, v, NULL); if (status) @@ -1505,12 +1510,11 @@ int cmd_commit(int argc, const char **argv, const char *prefix) struct strbuf sb = STRBUF_INIT; struct strbuf author_ident = STRBUF_INIT; const char *index_file, *reflog_msg; - char *nl, *p; + char *nl; unsigned char sha1[20]; struct ref_lock *ref_lock; struct commit_list *parents = NULL, **pptr = &parents; struct stat statbuf; - int allow_fast_forward = 1; struct commit *current_head = NULL; struct commit_extra_header *extra = NULL; @@ -1525,7 +1529,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) current_head = NULL; else { current_head = lookup_commit_or_die(sha1, "HEAD"); - if (!current_head || parse_commit(current_head)) + if (parse_commit(current_head)) die(_("could not parse HEAD commit")); } argc = parse_and_validate_options(argc, argv, builtin_commit_options, @@ -1558,6 +1562,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) } else if (whence == FROM_MERGE) { struct strbuf m = STRBUF_INIT; FILE *fp; + int allow_fast_forward = 1; if (!reflog_msg) reflog_msg = "commit (merge)"; @@ -1601,11 +1606,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix) } /* Truncate the message just before the diff, if any. */ - if (verbose) { - p = strstr(sb.buf, "\ndiff --git "); - if (p != NULL) - strbuf_setlen(&sb, p - sb.buf + 1); - } + if (verbose) + wt_status_truncate_message_at_cut_line(&sb); if (cleanup_mode != CLEANUP_NONE) stripspace(&sb, cleanup_mode == CLEANUP_ALL); diff --git a/builtin/config.c b/builtin/config.c index 20e89fe4e0..5677c942b6 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -21,8 +21,7 @@ static char key_delim = ' '; static char term = '\n'; static int use_global_config, use_system_config, use_local_config; -static const char *given_config_file; -static const char *given_config_blob; +static struct git_config_source given_config_source; static int actions, types; static const char *get_color_slot, *get_colorbool_slot; static int end_null; @@ -55,8 +54,8 @@ static struct option builtin_config_options[] = { OPT_BOOL(0, "global", &use_global_config, N_("use global config file")), OPT_BOOL(0, "system", &use_system_config, N_("use system config file")), OPT_BOOL(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_STRING(0, "blob", &given_config_blob, N_("blob-id"), N_("read config from given blob object")), + OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")), + OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object")), 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), @@ -224,8 +223,7 @@ static int get_value(const char *key_, const char *regex_) } git_config_with_options(collect_config, &values, - given_config_file, given_config_blob, - respect_includes); + &given_config_source, respect_includes); ret = !values.nr; @@ -309,8 +307,7 @@ static void get_color(const char *def_color) get_color_found = 0; parsed_color[0] = '\0'; git_config_with_options(git_get_color_config, NULL, - given_config_file, given_config_blob, - respect_includes); + &given_config_source, respect_includes); if (!get_color_found && def_color) color_parse(def_color, "command line", parsed_color); @@ -339,8 +336,7 @@ static int get_colorbool(int print) get_diff_color_found = -1; get_color_ui_found = -1; git_config_with_options(git_get_colorbool_config, NULL, - given_config_file, given_config_blob, - respect_includes); + &given_config_source, respect_includes); if (get_colorbool_found < 0) { if (!strcmp(get_colorbool_slot, "color.diff")) @@ -362,9 +358,12 @@ static int get_colorbool(int print) return get_colorbool_found ? 0 : 1; } -static void check_blob_write(void) +static void check_write(void) { - if (given_config_blob) + if (given_config_source.use_stdin) + die("writing to stdin is not supported"); + + if (given_config_source.blob) die("writing config blobs is not supported"); } @@ -435,7 +434,7 @@ static int get_urlmatch(const char *var, const char *url) } git_config_with_options(urlmatch_config_entry, &config, - given_config_file, NULL, respect_includes); + &given_config_source, respect_includes); for_each_string_list_item(item, &values) { struct urlmatch_current_candidate_value *matched = item->util; @@ -464,18 +463,24 @@ int cmd_config(int argc, const char **argv, const char *prefix) int nongit = !startup_info->have_repository; char *value; - given_config_file = getenv(CONFIG_ENVIRONMENT); + given_config_source.file = getenv(CONFIG_ENVIRONMENT); argc = parse_options(argc, argv, prefix, builtin_config_options, builtin_config_usage, PARSE_OPT_STOP_AT_NON_OPTION); if (use_global_config + use_system_config + use_local_config + - !!given_config_file + !!given_config_blob > 1) { + !!given_config_source.file + !!given_config_source.blob > 1) { error("only one config file at a time."); usage_with_options(builtin_config_usage, builtin_config_options); } + if (given_config_source.file && + !strcmp(given_config_source.file, "-")) { + given_config_source.file = NULL; + given_config_source.use_stdin = 1; + } + if (use_global_config) { char *user_config = NULL; char *xdg_config = NULL; @@ -493,24 +498,24 @@ int cmd_config(int argc, const char **argv, const char *prefix) if (access_or_warn(user_config, R_OK, 0) && xdg_config && !access_or_warn(xdg_config, R_OK, 0)) - given_config_file = xdg_config; + given_config_source.file = xdg_config; else - given_config_file = user_config; + given_config_source.file = user_config; } else if (use_system_config) - given_config_file = git_etc_gitconfig(); + given_config_source.file = git_etc_gitconfig(); else if (use_local_config) - given_config_file = git_pathdup("config"); - else if (given_config_file) { - if (!is_absolute_path(given_config_file) && prefix) - given_config_file = + given_config_source.file = git_pathdup("config"); + else if (given_config_source.file) { + if (!is_absolute_path(given_config_source.file) && prefix) + given_config_source.file = xstrdup(prefix_filename(prefix, strlen(prefix), - given_config_file)); + given_config_source.file)); } if (respect_includes == -1) - respect_includes = !given_config_file; + respect_includes = !given_config_source.file; if (end_null) { term = '\0'; @@ -549,57 +554,58 @@ int cmd_config(int argc, const char **argv, const char *prefix) if (actions == ACTION_LIST) { check_argc(argc, 0, 0); if (git_config_with_options(show_all_config, NULL, - given_config_file, - given_config_blob, + &given_config_source, respect_includes) < 0) { - if (given_config_file) + if (given_config_source.file) die_errno("unable to read config file '%s'", - given_config_file); + given_config_source.file); else die("error processing config file(s)"); } } else if (actions == ACTION_EDIT) { check_argc(argc, 0, 0); - if (!given_config_file && nongit) + if (!given_config_source.file && nongit) die("not in a git directory"); - if (given_config_blob) + if (given_config_source.use_stdin) + die("editing stdin is not supported"); + if (given_config_source.blob) die("editing blobs is not supported"); git_config(git_default_config, NULL); - launch_editor(given_config_file ? - given_config_file : git_path("config"), + launch_editor(given_config_source.file ? + given_config_source.file : git_path("config"), NULL, NULL); } else if (actions == ACTION_SET) { int ret; - check_blob_write(); + check_write(); check_argc(argc, 2, 2); value = normalize_value(argv[0], argv[1]); - ret = git_config_set_in_file(given_config_file, argv[0], value); + ret = git_config_set_in_file(given_config_source.file, argv[0], value); if (ret == CONFIG_NOTHING_SET) error("cannot overwrite multiple values with a single value\n" " Use a regexp, --add or --replace-all to change %s.", argv[0]); return ret; } else if (actions == ACTION_SET_ALL) { - check_blob_write(); + check_write(); check_argc(argc, 2, 3); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_file, + return git_config_set_multivar_in_file(given_config_source.file, argv[0], value, argv[2], 0); } else if (actions == ACTION_ADD) { - check_blob_write(); + check_write(); check_argc(argc, 2, 2); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_file, + return git_config_set_multivar_in_file(given_config_source.file, argv[0], value, "^$", 0); } else if (actions == ACTION_REPLACE_ALL) { - check_blob_write(); + check_write(); check_argc(argc, 2, 3); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_file, + return git_config_set_multivar_in_file(given_config_source.file, argv[0], value, argv[2], 1); } else if (actions == ACTION_GET) { @@ -623,26 +629,26 @@ int cmd_config(int argc, const char **argv, const char *prefix) return get_urlmatch(argv[0], argv[1]); } else if (actions == ACTION_UNSET) { - check_blob_write(); + check_write(); check_argc(argc, 1, 2); if (argc == 2) - return git_config_set_multivar_in_file(given_config_file, + return git_config_set_multivar_in_file(given_config_source.file, argv[0], NULL, argv[1], 0); else - return git_config_set_in_file(given_config_file, + return git_config_set_in_file(given_config_source.file, argv[0], NULL); } else if (actions == ACTION_UNSET_ALL) { - check_blob_write(); + check_write(); check_argc(argc, 1, 2); - return git_config_set_multivar_in_file(given_config_file, + return git_config_set_multivar_in_file(given_config_source.file, argv[0], NULL, argv[1], 1); } else if (actions == ACTION_RENAME_SECTION) { int ret; - check_blob_write(); + check_write(); check_argc(argc, 2, 2); - ret = git_config_rename_section_in_file(given_config_file, + ret = git_config_rename_section_in_file(given_config_source.file, argv[0], argv[1]); if (ret < 0) return ret; @@ -651,9 +657,9 @@ int cmd_config(int argc, const char **argv, const char *prefix) } else if (actions == ACTION_REMOVE_SECTION) { int ret; - check_blob_write(); + check_write(); check_argc(argc, 1, 1); - ret = git_config_rename_section_in_file(given_config_file, + ret = git_config_rename_section_in_file(given_config_source.file, argv[0], NULL); if (ret < 0) return ret; @@ -671,9 +677,3 @@ int cmd_config(int argc, const char **argv, const char *prefix) return 0; } - -int cmd_repo_config(int argc, const char **argv, const char *prefix) -{ - fprintf(stderr, "WARNING: git repo-config is deprecated in favor of git config.\n"); - return cmd_config(argc, argv, prefix); -} diff --git a/builtin/describe.c b/builtin/describe.c index b9d3603704..24d740c8b1 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -6,10 +6,10 @@ #include "exec_cmd.h" #include "parse-options.h" #include "diff.h" -#include "hash.h" +#include "hashmap.h" #include "argv-array.h" -#define SEEN (1u<<0) +#define SEEN (1u << 0) #define MAX_TAGS (FLAG_BITS - 1) static const char * const describe_usage[] = { @@ -25,7 +25,7 @@ static int longformat; static int first_parent; static int abbrev = -1; /* unspecified */ static int max_candidates = 10; -static struct hash_table names; +static struct hashmap names; static int have_util; static const char *pattern; static int always; @@ -36,9 +36,8 @@ static const char *diff_index_args[] = { "diff-index", "--quiet", "HEAD", "--", NULL }; - struct commit_name { - struct commit_name *next; + struct hashmap_entry entry; unsigned char peeled[20]; struct tag *tag; unsigned prio:2; /* annotated tag = 2, tag = 1, head = 0 */ @@ -46,10 +45,17 @@ struct commit_name { unsigned char sha1[20]; char *path; }; + static const char *prio_names[] = { "head", "lightweight", "annotated", }; +static int commit_name_cmp(const struct commit_name *cn1, + const struct commit_name *cn2, const void *peeled) +{ + return hashcmp(cn1->peeled, peeled ? peeled : cn2->peeled); +} + static inline unsigned int hash_sha1(const unsigned char *sha1) { unsigned int hash; @@ -59,21 +65,9 @@ static inline unsigned int hash_sha1(const unsigned char *sha1) static inline struct commit_name *find_commit_name(const unsigned char *peeled) { - struct commit_name *n = lookup_hash(hash_sha1(peeled), &names); - while (n && !!hashcmp(peeled, n->peeled)) - n = n->next; - return n; -} - -static int set_util(void *chain, void *data) -{ - struct commit_name *n; - for (n = chain; n; n = n->next) { - struct commit *c = lookup_commit_reference_gently(n->peeled, 1); - if (c) - c->util = n; - } - return 0; + struct commit_name key; + hashmap_entry_init(&key, hash_sha1(peeled)); + return hashmap_get(&names, &key, peeled); } static int replace_name(struct commit_name *e, @@ -118,16 +112,10 @@ static void add_to_known_names(const char *path, struct tag *tag = NULL; if (replace_name(e, prio, sha1, &tag)) { if (!e) { - void **pos; e = xmalloc(sizeof(struct commit_name)); hashcpy(e->peeled, peeled); - pos = insert_hash(hash_sha1(peeled), e, &names); - if (pos) { - e->next = *pos; - *pos = e; - } else { - e->next = NULL; - } + hashmap_entry_init(e, hash_sha1(peeled)); + hashmap_add(&names, e); e->path = NULL; } e->tag = tag; @@ -141,7 +129,7 @@ static void add_to_known_names(const char *path, static int get_name(const char *path, const unsigned char *sha1, int flag, void *cb_data) { - int is_tag = !prefixcmp(path, "refs/tags/"); + int is_tag = starts_with(path, "refs/tags/"); unsigned char peeled[20]; int is_annotated, prio; @@ -150,7 +138,7 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void return 0; /* Accept only tags that match the pattern, if given */ - if (pattern && (!is_tag || fnmatch(pattern, path + 10, 0))) + if (pattern && (!is_tag || wildmatch(pattern, path + 10, 0, NULL))) return 0; /* Is it annotated? */ @@ -292,7 +280,14 @@ static void describe(const char *arg, int last_one) fprintf(stderr, _("searching to describe %s\n"), arg); if (!have_util) { - for_each_hash(&names, set_util, NULL); + struct hashmap_iter iter; + struct commit *c; + struct commit_name *n = hashmap_iter_first(&names, &iter); + for (; n; n = hashmap_iter_next(&iter)) { + c = lookup_commit_reference_gently(n->peeled, 1); + if (c) + c->util = n; + } have_util = 1; } @@ -463,9 +458,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix) return cmd_name_rev(args.argc, args.argv, prefix); } - init_hash(&names); + hashmap_init(&names, (hashmap_cmp_fn) commit_name_cmp, 0); for_each_rawref(get_name, NULL); - if (!names.nr && !always) + if (!names.size && !always) die(_("No names found, cannot describe anything.")); if (argc == 0) { @@ -488,9 +483,8 @@ int cmd_describe(int argc, const char **argv, const char *prefix) } else if (dirty) { die(_("--dirty is incompatible with commit-ishes")); } else { - while (argc-- > 0) { + while (argc-- > 0) describe(*argv++, argc == 0); - } } return 0; } diff --git a/builtin/diff.c b/builtin/diff.c index 2fb8c5dc0b..0f247d2400 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -16,6 +16,9 @@ #include "submodule.h" #include "sha1-array.h" +#define DIFF_NO_INDEX_EXPLICIT 1 +#define DIFF_NO_INDEX_IMPLICIT 2 + struct blobinfo { unsigned char sha1[20]; const char *name; @@ -64,15 +67,18 @@ static void stuff_change(struct diff_options *opt, static int builtin_diff_b_f(struct rev_info *revs, int argc, const char **argv, - struct blobinfo *blob, - const char *path) + struct blobinfo *blob) { /* Blob vs file in the working tree*/ struct stat st; + const char *path; if (argc > 1) usage(builtin_diff_usage); + GUARD_PATHSPEC(&revs->prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL); + path = revs->prune_data.items[0].match; + if (lstat(path, &st)) die_errno(_("failed to stat '%s'"), path); if (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))) @@ -169,7 +175,7 @@ static int builtin_diff_tree(struct rev_info *revs, if (ent1->item->flags & UNINTERESTING) swap = 1; sha1[swap] = ent0->item->sha1; - sha1[1-swap] = ent1->item->sha1; + sha1[1 - swap] = ent1->item->sha1; diff_tree_sha1(sha1[0], sha1[1], "", &revs->diffopt); log_tree_diff_flush(revs); return 0; @@ -255,9 +261,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix) struct rev_info rev; struct object_array ent = OBJECT_ARRAY_INIT; int blobs = 0, paths = 0; - const char *path = NULL; struct blobinfo blob[2]; - int nongit; + int nongit = 0, no_index = 0; int result = 0; /* @@ -283,14 +288,59 @@ int cmd_diff(int argc, const char **argv, const char *prefix) * Other cases are errors. */ - prefix = setup_git_directory_gently(&nongit); - gitmodules_config(); + /* Were we asked to do --no-index explicitly? */ + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--")) { + i++; + break; + } + if (!strcmp(argv[i], "--no-index")) + no_index = DIFF_NO_INDEX_EXPLICIT; + if (argv[i][0] != '-') + break; + } + + if (!no_index) + prefix = setup_git_directory_gently(&nongit); + + /* + * Treat git diff with at least one path outside of the + * repo the same as if the command would have been executed + * outside of a git repository. In this case it behaves + * the same way as "git diff --no-index <a> <b>", which acts + * as a colourful "diff" replacement. + */ + if (nongit || ((argc == i + 2) && + (!path_inside_repo(prefix, argv[i]) || + !path_inside_repo(prefix, argv[i + 1])))) + no_index = DIFF_NO_INDEX_IMPLICIT; + + if (!no_index) + gitmodules_config(); git_config(git_diff_ui_config, NULL); init_revisions(&rev, prefix); - /* If this is a no-index diff, just run it and exit there. */ - diff_no_index(&rev, argc, argv, nongit, prefix); + if (no_index && argc != i + 2) { + if (no_index == DIFF_NO_INDEX_IMPLICIT) { + /* + * There was no --no-index and there were not two + * paths. It is possible that the user intended + * to do an inside-repository operation. + */ + fprintf(stderr, "Not a git repository\n"); + fprintf(stderr, + "To compare two paths outside a working tree:\n"); + } + /* Give the usage message for non-repository usage and exit. */ + usagef("git diff %s <path> <path>", + no_index == DIFF_NO_INDEX_EXPLICIT ? + "--no-index" : "[--no-index]"); + + } + if (no_index) + /* If this is a no-index diff, just run it and exit there. */ + diff_no_index(&rev, argc, argv, prefix); /* Otherwise, we are doing the usual "git" diff */ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index; @@ -366,13 +416,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix) die(_("unhandled object '%s' given."), name); } } - if (rev.prune_data.nr) { - /* builtin_diff_b_f() */ - GUARD_PATHSPEC(&rev.prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL); - if (!path) - path = rev.prune_data.items[0].match; + if (rev.prune_data.nr) paths += rev.prune_data.nr; - } /* * Now, do the arguments look reasonable? @@ -385,7 +430,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) case 1: if (paths != 1) usage(builtin_diff_usage); - result = builtin_diff_b_f(&rev, argc, argv, blob, path); + result = builtin_diff_b_f(&rev, argc, argv, blob); break; case 2: if (paths) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 78250eab08..b8d8a3aaf9 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -287,7 +287,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev) rev->diffopt.output_format = DIFF_FORMAT_CALLBACK; - parse_commit(commit); + parse_commit_or_die(commit); author = strstr(commit->buffer, "\nauthor "); if (!author) die ("Could not find author in commit %s", @@ -308,7 +308,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev) if (commit->parents && get_object_mark(&commit->parents->item->object) != 0 && !full_tree) { - parse_commit(commit->parents->item); + parse_commit_or_die(commit->parents->item); diff_tree_sha1(commit->parents->item->tree->object.sha1, commit->tree->object.sha1, "", &rev->diffopt); } @@ -476,7 +476,7 @@ static void handle_tag(const char *name, struct tag *tag) } } - if (!prefixcmp(name, "refs/tags/")) + if (starts_with(name, "refs/tags/")) name += 10; printf("tag %s\nfrom :%d\n%.*s%sdata %d\n%.*s\n", name, tagged_mark, diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index c8e858232a..1262b405f8 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -3,16 +3,24 @@ #include "fetch-pack.h" #include "remote.h" #include "connect.h" +#include "sha1-array.h" static const char fetch_pack_usage[] = "git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] " "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] " -"[--no-progress] [-v] [<host>:]<directory> [<refs>...]"; +"[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]"; static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc, const char *name, int namelen) { struct ref *ref = xcalloc(1, sizeof(*ref) + namelen + 1); + unsigned char sha1[20]; + + if (namelen > 41 && name[40] == ' ' && !get_sha1_hex(name, sha1)) { + hashcpy(ref->old_sha1, sha1); + name += 41; + namelen -= 41; + } memcpy(ref->name, name, namelen); ref->name[namelen] = '\0'; @@ -39,6 +47,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) char **pack_lockfile_ptr = NULL; struct child_process *conn; struct fetch_pack_args args; + struct sha1_array shallow = SHA1_ARRAY_INIT; packet_trace_identity("fetch-pack"); @@ -48,11 +57,11 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) for (i = 1; i < argc && *argv[i] == '-'; i++) { const char *arg = argv[i]; - if (!prefixcmp(arg, "--upload-pack=")) { + if (starts_with(arg, "--upload-pack=")) { args.uploadpack = arg + 14; continue; } - if (!prefixcmp(arg, "--exec=")) { + if (starts_with(arg, "--exec=")) { args.uploadpack = arg + 7; continue; } @@ -81,11 +90,15 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) args.stdin_refs = 1; continue; } + if (!strcmp("--diag-url", arg)) { + args.diag_url = 1; + continue; + } if (!strcmp("-v", arg)) { args.verbose = 1; continue; } - if (!prefixcmp(arg, "--depth=")) { + if (starts_with(arg, "--depth=")) { args.depth = strtol(arg + 8, NULL, 0); continue; } @@ -106,6 +119,14 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) args.check_self_contained_and_connected = 1; continue; } + if (!strcmp("--cloning", arg)) { + args.cloning = 1; + continue; + } + if (!strcmp("--update-shallow", arg)) { + args.update_shallow = 1; + continue; + } usage(fetch_pack_usage); } @@ -146,14 +167,18 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) fd[0] = 0; fd[1] = 1; } else { + int flags = args.verbose ? CONNECT_VERBOSE : 0; + if (args.diag_url) + flags |= CONNECT_DIAG_URL; conn = git_connect(fd, dest, args.uploadpack, - args.verbose ? CONNECT_VERBOSE : 0); + flags); + if (!conn) + return args.diag_url ? 0 : 1; } + get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL, &shallow); - get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL); - - ref = fetch_pack(&args, fd, conn, ref, dest, - sought, nr_sought, pack_lockfile_ptr); + ref = fetch_pack(&args, fd, conn, ref, dest, sought, nr_sought, + &shallow, pack_lockfile_ptr); if (pack_lockfile) { printf("lock %s\n", pack_lockfile); fflush(stdout); diff --git a/builtin/fetch.c b/builtin/fetch.c index bd7a10164f..55f457c04f 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -36,7 +36,7 @@ static int prune = -1; /* unspecified */ static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity; static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT; -static int tags = TAGS_DEFAULT, unshallow; +static int tags = TAGS_DEFAULT, unshallow, update_shallow; static const char *depth; static const char *upload_pack; static struct strbuf default_rla = STRBUF_INIT; @@ -44,6 +44,7 @@ static struct transport *gtransport; static struct transport *gsecondary; static const char *submodule_prefix = ""; static const char *recurse_submodules_default; +static int shown_url = 0; static int option_parse_recurse_submodules(const struct option *opt, const char *arg, int unset) @@ -104,6 +105,8 @@ static struct option builtin_fetch_options[] = { { OPTION_STRING, 0, "recurse-submodules-default", &recurse_submodules_default, NULL, N_("default mode for recursion"), PARSE_OPT_HIDDEN }, + OPT_BOOL(0, "update-shallow", &update_shallow, + N_("accept refs that update .git/shallow")), OPT_END() }; @@ -160,48 +163,156 @@ static void add_merge_config(struct ref **head, } } +static int add_existing(const char *refname, const unsigned char *sha1, + int flag, void *cbdata) +{ + struct string_list *list = (struct string_list *)cbdata; + struct string_list_item *item = string_list_insert(list, refname); + item->util = xmalloc(20); + hashcpy(item->util, sha1); + return 0; +} + +static int will_fetch(struct ref **head, const unsigned char *sha1) +{ + struct ref *rm = *head; + while (rm) { + if (!hashcmp(rm->old_sha1, sha1)) + return 1; + rm = rm->next; + } + return 0; +} + static void find_non_local_tags(struct transport *transport, struct ref **head, - struct ref ***tail); + struct ref ***tail) +{ + struct string_list existing_refs = STRING_LIST_INIT_DUP; + struct string_list remote_refs = STRING_LIST_INIT_NODUP; + const struct ref *ref; + struct string_list_item *item = NULL; + + for_each_ref(add_existing, &existing_refs); + for (ref = transport_get_remote_refs(transport); ref; ref = ref->next) { + if (!starts_with(ref->name, "refs/tags/")) + continue; + + /* + * The peeled ref always follows the matching base + * ref, so if we see a peeled ref that we don't want + * to fetch then we can mark the ref entry in the list + * as one to ignore by setting util to NULL. + */ + if (ends_with(ref->name, "^{}")) { + if (item && !has_sha1_file(ref->old_sha1) && + !will_fetch(head, ref->old_sha1) && + !has_sha1_file(item->util) && + !will_fetch(head, item->util)) + item->util = NULL; + item = NULL; + continue; + } + + /* + * If item is non-NULL here, then we previously saw a + * ref not followed by a peeled reference, so we need + * to check if it is a lightweight tag that we want to + * fetch. + */ + if (item && !has_sha1_file(item->util) && + !will_fetch(head, item->util)) + item->util = NULL; + + item = NULL; + + /* skip duplicates and refs that we already have */ + if (string_list_has_string(&remote_refs, ref->name) || + string_list_has_string(&existing_refs, ref->name)) + continue; + + item = string_list_insert(&remote_refs, ref->name); + item->util = (void *)ref->old_sha1; + } + string_list_clear(&existing_refs, 1); + + /* + * We may have a final lightweight tag that needs to be + * checked to see if it needs fetching. + */ + if (item && !has_sha1_file(item->util) && + !will_fetch(head, item->util)) + item->util = NULL; + + /* + * For all the tags in the remote_refs string list, + * add them to the list of refs to be fetched + */ + for_each_string_list_item(item, &remote_refs) { + /* Unless we have already decided to ignore this item... */ + if (item->util) + { + struct ref *rm = alloc_ref(item->string); + rm->peer_ref = alloc_ref(item->string); + hashcpy(rm->old_sha1, item->util); + **tail = rm; + *tail = &rm->next; + } + } + + string_list_clear(&remote_refs, 0); +} static struct ref *get_ref_map(struct transport *transport, - struct refspec *refs, int ref_count, int tags, - int *autotags) + struct refspec *refspecs, int refspec_count, + int tags, int *autotags) { int i; struct ref *rm; struct ref *ref_map = NULL; struct ref **tail = &ref_map; - const struct ref *remote_refs = transport_get_remote_refs(transport); + /* opportunistically-updated references: */ + struct ref *orefs = NULL, **oref_tail = &orefs; - if (ref_count || tags == TAGS_SET) { - struct ref **old_tail; + const struct ref *remote_refs = transport_get_remote_refs(transport); - for (i = 0; i < ref_count; i++) { - get_fetch_map(remote_refs, &refs[i], &tail, 0); - if (refs[i].dst && refs[i].dst[0]) + if (refspec_count) { + for (i = 0; i < refspec_count; i++) { + get_fetch_map(remote_refs, &refspecs[i], &tail, 0); + if (refspecs[i].dst && refspecs[i].dst[0]) *autotags = 1; } - /* Merge everything on the command line, but not --tags */ + /* Merge everything on the command line (but not --tags) */ for (rm = ref_map; rm; rm = rm->next) rm->fetch_head_status = FETCH_HEAD_MERGE; - if (tags == TAGS_SET) - get_fetch_map(remote_refs, tag_refspec, &tail, 0); /* - * For any refs that we happen to be fetching via command-line - * arguments, take the opportunity to update their configured - * counterparts. However, we do not want to mention these - * entries in FETCH_HEAD at all, as they would simply be - * duplicates of existing entries. + * For any refs that we happen to be fetching via + * command-line arguments, the destination ref might + * have been missing or have been different than the + * remote-tracking ref that would be derived from the + * configured refspec. In these cases, we want to + * take the opportunity to update their configured + * remote-tracking reference. However, we do not want + * to mention these entries in FETCH_HEAD at all, as + * they would simply be duplicates of existing + * entries, so we set them FETCH_HEAD_IGNORE below. + * + * We compute these entries now, based only on the + * refspecs specified on the command line. But we add + * them to the list following the refspecs resulting + * from the tags option so that one of the latter, + * which has FETCH_HEAD_NOT_FOR_MERGE, is not removed + * by ref_remove_duplicates() in favor of one of these + * opportunistic entries with FETCH_HEAD_IGNORE. */ - old_tail = tail; for (i = 0; i < transport->remote->fetch_refspec_nr; i++) get_fetch_map(ref_map, &transport->remote->fetch[i], - &tail, 1); - for (rm = *old_tail; rm; rm = rm->next) - rm->fetch_head_status = FETCH_HEAD_IGNORE; + &oref_tail, 1); + + if (tags == TAGS_SET) + get_fetch_map(remote_refs, tag_refspec, &tail, 0); } else { /* Use the defaults */ struct remote *remote = transport->remote; @@ -238,11 +349,21 @@ static struct ref *get_ref_map(struct transport *transport, tail = &ref_map->next; } } - if (tags == TAGS_DEFAULT && *autotags) + + if (tags == TAGS_SET) + /* also fetch all tags */ + get_fetch_map(remote_refs, tag_refspec, &tail, 0); + else if (tags == TAGS_DEFAULT && *autotags) find_non_local_tags(transport, &ref_map, &tail); - ref_remove_duplicates(ref_map); - return ref_map; + /* Now append any refs to be updated opportunistically: */ + *tail = orefs; + for (rm = orefs; rm; rm = rm->next) { + rm->fetch_head_status = FETCH_HEAD_IGNORE; + tail = &rm->next; + } + + return ref_remove_duplicates(ref_map); } #define STORE_REF_ERROR_OTHER 1 @@ -313,7 +434,7 @@ static int update_local_ref(struct ref *ref, } if (!is_null_sha1(ref->old_sha1) && - !prefixcmp(ref->name, "refs/tags/")) { + starts_with(ref->name, "refs/tags/")) { int r; r = s_update_ref("updating tag", ref, 0); strbuf_addf(display, "%c %-*s %-*s -> %s%s", @@ -336,10 +457,10 @@ static int update_local_ref(struct ref *ref, * more likely to follow a standard layout. */ const char *name = remote_ref ? remote_ref->name : ""; - if (!prefixcmp(name, "refs/tags/")) { + if (starts_with(name, "refs/tags/")) { msg = "storing tag"; what = _("[new tag]"); - } else if (!prefixcmp(name, "refs/heads/")) { + } else if (starts_with(name, "refs/heads/")) { msg = "storing head"; what = _("[new branch]"); } else { @@ -405,6 +526,8 @@ static int iterate_ref_map(void *cb_data, unsigned char sha1[20]) struct ref **rm = cb_data; struct ref *ref = *rm; + while (ref && ref->status == REF_STATUS_REJECT_SHALLOW) + ref = ref->next; if (!ref) return -1; /* end of the list */ *rm = ref->next; @@ -417,7 +540,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name, { FILE *fp; struct commit *commit; - int url_len, i, shown_url = 0, rc = 0; + int url_len, i, rc = 0; struct strbuf note = STRBUF_INIT; const char *what, *kind; struct ref *rm; @@ -451,6 +574,13 @@ static int store_updated_refs(const char *raw_url, const char *remote_name, struct ref *ref = NULL; const char *merge_status_marker = ""; + if (rm->status == REF_STATUS_REJECT_SHALLOW) { + if (want_status == FETCH_HEAD_MERGE) + warning(_("reject %s because shallow roots are not allowed to be updated"), + rm->peer_ref ? rm->peer_ref->name : rm->name); + continue; + } + commit = lookup_commit_reference_gently(rm->old_sha1, 1); if (!commit) rm->fetch_head_status = FETCH_HEAD_NOT_FOR_MERGE; @@ -471,15 +601,15 @@ static int store_updated_refs(const char *raw_url, const char *remote_name, kind = ""; what = ""; } - else if (!prefixcmp(rm->name, "refs/heads/")) { + else if (starts_with(rm->name, "refs/heads/")) { kind = "branch"; what = rm->name + 11; } - else if (!prefixcmp(rm->name, "refs/tags/")) { + else if (starts_with(rm->name, "refs/tags/")) { kind = "tag"; what = rm->name + 10; } - else if (!prefixcmp(rm->name, "refs/remotes/")) { + else if (starts_with(rm->name, "refs/remotes/")) { kind = "remote-tracking branch"; what = rm->name + 13; } @@ -590,17 +720,36 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map) return ret; } -static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map) +static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map, + const char *raw_url) { - int result = 0; + int url_len, i, result = 0; struct ref *ref, *stale_refs = get_stale_heads(refs, ref_count, ref_map); + char *url; const char *dangling_msg = dry_run ? _(" (%s will become dangling)") : _(" (%s has become dangling)"); + if (raw_url) + url = transport_anonymize_url(raw_url); + else + url = xstrdup("foreign"); + + url_len = strlen(url); + for (i = url_len - 1; url[i] == '/' && 0 <= i; i--) + ; + + url_len = i + 1; + if (4 < i && !strncmp(".git", url + i - 3, 4)) + url_len = i - 3; + for (ref = stale_refs; ref; ref = ref->next) { if (!dry_run) result |= delete_ref(ref->name, NULL, 0); + if (verbosity >= 0 && !shown_url) { + fprintf(stderr, _("From %.*s\n"), url_len, url); + shown_url = 1; + } if (verbosity >= 0) { fprintf(stderr, " x %-*s %-*s -> %s\n", TRANSPORT_SUMMARY(_("[deleted]")), @@ -608,110 +757,11 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map) warn_dangling_symref(stderr, dangling_msg, ref->name); } } + free(url); free_refs(stale_refs); return result; } -static int add_existing(const char *refname, const unsigned char *sha1, - int flag, void *cbdata) -{ - struct string_list *list = (struct string_list *)cbdata; - struct string_list_item *item = string_list_insert(list, refname); - item->util = xmalloc(20); - hashcpy(item->util, sha1); - return 0; -} - -static int will_fetch(struct ref **head, const unsigned char *sha1) -{ - struct ref *rm = *head; - while (rm) { - if (!hashcmp(rm->old_sha1, sha1)) - return 1; - rm = rm->next; - } - return 0; -} - -static void find_non_local_tags(struct transport *transport, - struct ref **head, - struct ref ***tail) -{ - struct string_list existing_refs = STRING_LIST_INIT_DUP; - struct string_list remote_refs = STRING_LIST_INIT_NODUP; - const struct ref *ref; - struct string_list_item *item = NULL; - - for_each_ref(add_existing, &existing_refs); - for (ref = transport_get_remote_refs(transport); ref; ref = ref->next) { - if (prefixcmp(ref->name, "refs/tags/")) - continue; - - /* - * The peeled ref always follows the matching base - * ref, so if we see a peeled ref that we don't want - * to fetch then we can mark the ref entry in the list - * as one to ignore by setting util to NULL. - */ - if (!suffixcmp(ref->name, "^{}")) { - if (item && !has_sha1_file(ref->old_sha1) && - !will_fetch(head, ref->old_sha1) && - !has_sha1_file(item->util) && - !will_fetch(head, item->util)) - item->util = NULL; - item = NULL; - continue; - } - - /* - * If item is non-NULL here, then we previously saw a - * ref not followed by a peeled reference, so we need - * to check if it is a lightweight tag that we want to - * fetch. - */ - if (item && !has_sha1_file(item->util) && - !will_fetch(head, item->util)) - item->util = NULL; - - item = NULL; - - /* skip duplicates and refs that we already have */ - if (string_list_has_string(&remote_refs, ref->name) || - string_list_has_string(&existing_refs, ref->name)) - continue; - - item = string_list_insert(&remote_refs, ref->name); - item->util = (void *)ref->old_sha1; - } - string_list_clear(&existing_refs, 1); - - /* - * We may have a final lightweight tag that needs to be - * checked to see if it needs fetching. - */ - if (item && !has_sha1_file(item->util) && - !will_fetch(head, item->util)) - item->util = NULL; - - /* - * For all the tags in the remote_refs string list, - * add them to the list of refs to be fetched - */ - for_each_string_list_item(item, &remote_refs) { - /* Unless we have already decided to ignore this item... */ - if (item->util) - { - struct ref *rm = alloc_ref(item->string); - rm->peer_ref = alloc_ref(item->string); - hashcpy(rm->old_sha1, item->util); - **tail = rm; - *tail = &rm->next; - } - } - - string_list_clear(&remote_refs, 0); -} - static void check_not_current_branch(struct ref *ref_map) { struct branch *current_branch = branch_get(NULL); @@ -759,6 +809,8 @@ static struct transport *prepare_transport(struct remote *remote) set_option(transport, TRANS_OPT_KEEP, "yes"); if (depth) set_option(transport, TRANS_OPT_DEPTH, depth); + if (update_shallow) + set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes"); return transport; } @@ -824,39 +876,26 @@ static int do_fetch(struct transport *transport, if (tags == TAGS_DEFAULT && autotags) transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1"); - if (fetch_refs(transport, ref_map)) { - free_refs(ref_map); - retcode = 1; - goto cleanup; - } if (prune) { /* - * If --tags was specified, pretend that the user gave us - * the canonical tags refspec + * We only prune based on refspecs specified + * explicitly (via command line or configuration); we + * don't care whether --tags was specified. */ - if (tags == TAGS_SET) { - const char *tags_str = "refs/tags/*:refs/tags/*"; - struct refspec *tags_refspec, *refspec; - - /* Copy the refspec and add the tags to it */ - refspec = xcalloc(ref_count + 1, sizeof(struct refspec)); - tags_refspec = parse_fetch_refspec(1, &tags_str); - memcpy(refspec, refs, ref_count * sizeof(struct refspec)); - memcpy(&refspec[ref_count], tags_refspec, sizeof(struct refspec)); - ref_count++; - - prune_refs(refspec, ref_count, ref_map); - - ref_count--; - /* The rest of the strings belong to fetch_one */ - free_refspec(1, tags_refspec); - free(refspec); - } else if (ref_count) { - prune_refs(refs, ref_count, ref_map); + if (ref_count) { + prune_refs(refs, ref_count, ref_map, transport->url); } else { - prune_refs(transport->remote->fetch, transport->remote->fetch_refspec_nr, ref_map); + prune_refs(transport->remote->fetch, + transport->remote->fetch_refspec_nr, + ref_map, + transport->url); } } + if (fetch_refs(transport, ref_map)) { + free_refs(ref_map); + retcode = 1; + goto cleanup; + } free_refs(ref_map); /* if neither --no-tags nor --tags was specified, do automated tag @@ -892,7 +931,7 @@ static int get_remote_group(const char *key, const char *value, void *priv) { struct remote_group_data *g = priv; - if (!prefixcmp(key, "remotes.") && + if (starts_with(key, "remotes.") && !strcmp(key + 8, g->name)) { /* split list by white space */ int space = strcspn(value, " \t\n"); @@ -930,8 +969,8 @@ static void add_options_to_argv(struct argv_array *argv) { if (dry_run) argv_array_push(argv, "--dry-run"); - if (prune > 0) - argv_array_push(argv, "--prune"); + if (prune != -1) + argv_array_push(argv, prune ? "--prune" : "--no-prune"); if (update_head_ok) argv_array_push(argv, "--update-head-ok"); if (force) @@ -987,7 +1026,6 @@ static int fetch_multiple(struct string_list *list) static int fetch_one(struct remote *remote, int argc, const char **argv) { - int i; static const char **refs = NULL; struct refspec *refspec; int ref_nr = 0; @@ -1011,6 +1049,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv) if (argc > 0) { int j = 0; + int i; refs = xcalloc(argc + 1, sizeof(const char *)); for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "tag")) { @@ -1075,6 +1114,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) } } + /* no need to be strict, transport_set_option() will validate it again */ + if (depth && atoi(depth) < 1) + die(_("depth %s is not a positive number"), depth); + if (recurse_submodules != RECURSE_SUBMODULES_OFF) { if (recurse_submodules_default) { int arg = parse_fetch_recurse_submodules_arg("--recurse-submodules-default", recurse_submodules_default); diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index 1c04070869..3906eda877 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -109,7 +109,7 @@ static int handle_line(char *line, struct merge_parents *merge_parents) if (len < 43 || line[40] != '\t') return 1; - if (!prefixcmp(line + 41, "not-for-merge")) + if (starts_with(line + 41, "not-for-merge")) return 0; if (line[41] != '\t') @@ -155,16 +155,16 @@ static int handle_line(char *line, struct merge_parents *merge_parents) if (pulling_head) { origin = src; src_data->head_status |= 1; - } else if (!prefixcmp(line, "branch ")) { + } else if (starts_with(line, "branch ")) { origin_data->is_local_branch = 1; origin = line + 7; string_list_append(&src_data->branch, origin); src_data->head_status |= 2; - } else if (!prefixcmp(line, "tag ")) { + } else if (starts_with(line, "tag ")) { origin = line; string_list_append(&src_data->tag, origin + 4); src_data->head_status |= 2; - } else if (!prefixcmp(line, "remote-tracking branch ")) { + } else if (starts_with(line, "remote-tracking branch ")) { origin = line + strlen("remote-tracking branch "); string_list_append(&src_data->r_branch, origin); src_data->head_status |= 2; @@ -605,7 +605,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out, resolve_refdup("HEAD", head_sha1, 1, NULL); if (!current_branch) die("No current branch"); - if (!prefixcmp(current_branch, "refs/heads/")) + if (starts_with(current_branch, "refs/heads/")) current_branch += 11; find_merge_parents(&merge_parents, in, head_sha1); diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 1d4083c2dd..3e1d5c3334 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -9,6 +9,7 @@ #include "quote.h" #include "parse-options.h" #include "remote.h" +#include "color.h" /* Quoting styles */ #define QUOTE_NONE 0 @@ -75,6 +76,8 @@ static struct { { "upstream" }, { "symref" }, { "flag" }, + { "HEAD" }, + { "color" }, }; /* @@ -89,7 +92,8 @@ static struct { */ static const char **used_atom; static cmp_type *used_atom_type; -static int used_atom_cnt, sort_atom_limit, need_tagged, need_symref; +static int used_atom_cnt, need_tagged, need_symref; +static int need_color_reset_at_eol; /* * Used to parse format string and sort specifiers @@ -176,13 +180,21 @@ static const char *find_next(const char *cp) static int verify_format(const char *format) { const char *cp, *sp; + static const char color_reset[] = "color:reset"; + + need_color_reset_at_eol = 0; for (cp = format; *cp && (sp = find_next(cp)); ) { const char *ep = strchr(sp, ')'); + int at; + if (!ep) return error("malformed format string %s", sp); /* sp points at "%(" and ep points at the closing ")" */ - parse_atom(sp + 2, ep); + at = parse_atom(sp + 2, ep); cp = ep + 1; + + if (!memcmp(used_atom[at], "color:", 6)) + need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset); } return 0; } @@ -205,6 +217,22 @@ static void *get_obj(const unsigned char *sha1, struct object **obj, unsigned lo return buf; } +static int grab_objectname(const char *name, const unsigned char *sha1, + struct atom_value *v) +{ + if (!strcmp(name, "objectname")) { + char *s = xmalloc(41); + strcpy(s, sha1_to_hex(sha1)); + v->s = s; + return 1; + } + if (!strcmp(name, "objectname:short")) { + v->s = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); + return 1; + } + return 0; +} + /* See grab_values */ static void grab_common_values(struct atom_value *val, int deref, struct object *obj, void *buf, unsigned long sz) { @@ -225,15 +253,8 @@ static void grab_common_values(struct atom_value *val, int deref, struct object v->ul = sz; v->s = s; } - else if (!strcmp(name, "objectname")) { - char *s = xmalloc(41); - strcpy(s, sha1_to_hex(obj->sha1)); - v->s = s; - } - else if (!strcmp(name, "objectname:short")) { - v->s = xstrdup(find_unique_abbrev(obj->sha1, - DEFAULT_ABBREV)); - } + else if (deref) + grab_objectname(name, obj->sha1, v); } } @@ -432,7 +453,7 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru if (name[wholen] != 0 && strcmp(name + wholen, "name") && strcmp(name + wholen, "email") && - prefixcmp(name + wholen, "date")) + !starts_with(name + wholen, "date")) continue; if (!wholine) wholine = find_wholine(who, wholen, buf, sz); @@ -444,7 +465,7 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru v->s = copy_name(wholine); else if (!strcmp(name + wholen, "email")) v->s = copy_email(wholine); - else if (!prefixcmp(name + wholen, "date")) + else if (starts_with(name + wholen, "date")) grab_date(wholine, v, name); } @@ -466,7 +487,7 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru if (deref) name++; - if (!prefixcmp(name, "creatordate")) + if (starts_with(name, "creatordate")) grab_date(wholine, v, name); else if (!strcmp(name, "creator")) v->s = copy_line(wholine); @@ -640,20 +661,20 @@ static void populate_value(struct refinfo *ref) int deref = 0; const char *refname; const char *formatp; + struct branch *branch = NULL; if (*name == '*') { deref = 1; name++; } - if (!prefixcmp(name, "refname")) + if (starts_with(name, "refname")) refname = ref->refname; - else if (!prefixcmp(name, "symref")) + else if (starts_with(name, "symref")) refname = ref->symref ? ref->symref : ""; - else if (!prefixcmp(name, "upstream")) { - struct branch *branch; + else if (starts_with(name, "upstream")) { /* only local branches may have an upstream */ - if (prefixcmp(ref->refname, "refs/heads/")) + if (!starts_with(ref->refname, "refs/heads/")) continue; branch = branch_get(ref->refname + 11); @@ -661,8 +682,13 @@ static void populate_value(struct refinfo *ref) !branch->merge[0]->dst) continue; refname = branch->merge[0]->dst; - } - else if (!strcmp(name, "flag")) { + } else if (starts_with(name, "color:")) { + char color[COLOR_MAXLEN] = ""; + + color_parse(name + 6, "--format", color); + v->s = xstrdup(color); + continue; + } else if (!strcmp(name, "flag")) { char buf[256], *cp = buf; if (ref->flag & REF_ISSYMREF) cp = copy_advance(cp, ",symref"); @@ -675,18 +701,62 @@ static void populate_value(struct refinfo *ref) v->s = xstrdup(buf + 1); } continue; - } - else + } else if (!deref && grab_objectname(name, ref->objectname, v)) { + continue; + } else if (!strcmp(name, "HEAD")) { + const char *head; + unsigned char sha1[20]; + + head = resolve_ref_unsafe("HEAD", sha1, 1, NULL); + if (!strcmp(ref->refname, head)) + v->s = "*"; + else + v->s = " "; + continue; + } else continue; formatp = strchr(name, ':'); - /* look for "short" refname format */ if (formatp) { + int num_ours, num_theirs; + formatp++; if (!strcmp(formatp, "short")) refname = shorten_unambiguous_ref(refname, warn_ambiguous_refs); - else + else if (!strcmp(formatp, "track") && + starts_with(name, "upstream")) { + char buf[40]; + + stat_tracking_info(branch, &num_ours, &num_theirs); + if (!num_ours && !num_theirs) + v->s = ""; + else if (!num_ours) { + sprintf(buf, "[behind %d]", num_theirs); + v->s = xstrdup(buf); + } else if (!num_theirs) { + sprintf(buf, "[ahead %d]", num_ours); + v->s = xstrdup(buf); + } else { + sprintf(buf, "[ahead %d, behind %d]", + num_ours, num_theirs); + v->s = xstrdup(buf); + } + continue; + } else if (!strcmp(formatp, "trackshort") && + starts_with(name, "upstream")) { + assert(branch); + stat_tracking_info(branch, &num_ours, &num_theirs); + if (!num_ours && !num_theirs) + v->s = "="; + else if (!num_ours) + v->s = "<"; + else if (!num_theirs) + v->s = ">"; + else + v->s = "<>"; + continue; + } else die("unknown %.*s format %s", (int)(formatp - name), name, formatp); } @@ -794,7 +864,7 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f refname[plen] == '/' || p[plen-1] == '/')) break; - if (!fnmatch(p, refname, FNM_PATHNAME)) + if (!wildmatch(p, refname, WM_PATHNAME, NULL)) break; } if (!*pattern) @@ -864,11 +934,9 @@ static void sort_refs(struct ref_sort *sort, struct refinfo **refs, int num_refs qsort(refs, num_refs, sizeof(struct refinfo *), compare_refs); } -static void print_value(struct refinfo *ref, int atom, int quote_style) +static void print_value(struct atom_value *v, int quote_style) { - struct atom_value *v; struct strbuf sb = STRBUF_INIT; - get_value(ref, atom, &v); switch (quote_style) { case QUOTE_NONE: fputs(v->s, stdout); @@ -935,15 +1003,26 @@ static void show_ref(struct refinfo *info, const char *format, int quote_style) const char *cp, *sp, *ep; for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) { + struct atom_value *atomv; + ep = strchr(sp, ')'); if (cp < sp) emit(cp, sp); - print_value(info, parse_atom(sp + 2, ep), quote_style); + get_value(info, parse_atom(sp + 2, ep), &atomv); + print_value(atomv, quote_style); } if (*cp) { sp = cp + strlen(cp); emit(cp, sp); } + if (need_color_reset_at_eol) { + struct atom_value resetv; + char color[COLOR_MAXLEN] = ""; + + color_parse("reset", "--format", color); + resetv.s = color; + print_value(&resetv, quote_style); + } putchar('\n'); } @@ -1026,7 +1105,6 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) if (!sort) sort = default_sort(); - sort_atom_limit = used_atom_cnt; /* for warn_ambiguous_refs */ git_config(git_default_config, NULL); diff --git a/builtin/fsck.c b/builtin/fsck.c index 97ce678c6b..fc150c8821 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -144,7 +144,7 @@ static int traverse_reachable(void) unsigned int nr = 0; int result = 0; if (show_progress) - progress = start_progress_delay("Checking connectivity", 0, 0, 2); + progress = start_progress_delay(_("Checking connectivity"), 0, 0, 2); while (pending.nr) { struct object_array_entry *entry; struct object *obj; @@ -442,7 +442,7 @@ static void fsck_dir(int i, char *path) add_sha1_list(sha1, DIRENT_SORT_HINT(de)); continue; } - if (!prefixcmp(de->d_name, "tmp_obj_")) + if (starts_with(de->d_name, "tmp_obj_")) continue; fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name); } @@ -484,7 +484,7 @@ static int fsck_handle_reflog(const char *logname, const unsigned char *sha1, in static int is_branch(const char *refname) { - return !strcmp(refname, "HEAD") || !prefixcmp(refname, "refs/heads/"); + return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/"); } static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) @@ -541,7 +541,7 @@ static void fsck_object_dir(const char *path) fprintf(stderr, "Checking object directory\n"); if (show_progress) - progress = start_progress("Checking object directories", 256); + progress = start_progress(_("Checking object directories"), 256); for (i = 0; i < 256; i++) { static char dir[4096]; sprintf(dir, "%s/%02x", path, i); @@ -566,7 +566,7 @@ static int fsck_head_link(void) if (!strcmp(head_points_at, "HEAD")) /* detached HEAD */ null_is_error = 1; - else if (prefixcmp(head_points_at, "refs/heads/")) + else if (!starts_with(head_points_at, "refs/heads/")) return error("HEAD points to something strange (%s)", head_points_at); if (is_null_sha1(head_sha1)) { @@ -630,7 +630,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) struct alternate_object_database *alt; errors_found = 0; - read_replace_refs = 0; + check_replace_refs = 0; argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0); @@ -670,7 +670,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) total += p->num_objects; } - progress = start_progress("Checking objects", total); + progress = start_progress(_("Checking objects"), total); } for (p = packed_git; p; p = p->next) { /* verify gives error messages itself */ diff --git a/builtin/gc.c b/builtin/gc.c index 891a2c2ecb..63d400bcb2 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -14,7 +14,9 @@ #include "cache.h" #include "parse-options.h" #include "run-command.h" +#include "sigchain.h" #include "argv-array.h" +#include "commit.h" #define FAILED_RUN "failed to run %s" @@ -27,6 +29,7 @@ static int pack_refs = 1; static int aggressive_window = 250; static int gc_auto_threshold = 6700; static int gc_auto_pack_limit = 50; +static int detach_auto = 1; static const char *prune_expire = "2.weeks.ago"; static struct argv_array pack_refs_cmd = ARGV_ARRAY_INIT; @@ -35,6 +38,21 @@ static struct argv_array repack = ARGV_ARRAY_INIT; static struct argv_array prune = ARGV_ARRAY_INIT; static struct argv_array rerere = ARGV_ARRAY_INIT; +static char *pidfile; + +static void remove_pidfile(void) +{ + if (pidfile) + unlink(pidfile); +} + +static void remove_pidfile_on_signal(int signo) +{ + remove_pidfile(); + sigchain_pop(signo); + raise(signo); +} + static int gc_config(const char *var, const char *value, void *cb) { if (!strcmp(var, "gc.packrefs")) { @@ -56,6 +74,10 @@ static int gc_config(const char *var, const char *value, void *cb) gc_auto_pack_limit = git_config_int(var, value); return 0; } + if (!strcmp(var, "gc.autodetach")) { + detach_auto = git_config_bool(var, value); + return 0; + } if (!strcmp(var, "gc.pruneexpire")) { if (value && strcmp(value, "now")) { unsigned long now = approxidate("now"); @@ -171,13 +193,16 @@ static int need_to_gc(void) static const char *lock_repo_for_gc(int force, pid_t* ret_pid) { static struct lock_file lock; - static char locking_host[128]; char my_host[128]; struct strbuf sb = STRBUF_INIT; struct stat st; uintmax_t pid; FILE *fp; - int fd, should_exit; + int fd; + + if (pidfile) + /* already locked */ + return NULL; if (gethostname(my_host, sizeof(my_host))) strcpy(my_host, "unknown"); @@ -185,6 +210,8 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid) fd = hold_lock_file_for_update(&lock, git_path("gc.pid"), LOCK_DIE_ON_ERROR); if (!force) { + static char locking_host[128]; + int should_exit; fp = fopen(git_path("gc.pid"), "r"); memset(locking_host, 0, sizeof(locking_host)); should_exit = @@ -202,7 +229,7 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid) time(NULL) - st.st_mtime <= 12 * 3600 && fscanf(fp, "%"PRIuMAX" %127c", &pid, locking_host) == 2 && /* be gentle to concurrent "gc" on remote hosts */ - (strcmp(locking_host, my_host) || !kill(pid, 0)); + (strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM); if (fp != NULL) fclose(fp); if (should_exit) { @@ -219,6 +246,10 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid) strbuf_release(&sb); commit_lock_file(&lock); + pidfile = git_pathdup("gc.pid"); + sigchain_push_common(remove_pidfile_on_signal); + atexit(remove_pidfile); + return NULL; } @@ -276,11 +307,19 @@ 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. You may also\n" - "run \"git gc\" manually. See " - "\"git help gc\" for more information.\n")); + if (!quiet) { + if (detach_auto) + fprintf(stderr, _("Auto packing the repository in background for optimum performance.\n")); + else + fprintf(stderr, _("Auto packing the repository for optimum performance.\n")); + fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n")); + } + if (detach_auto) + /* + * failure to daemonize is ok, we'll continue + * in foreground + */ + daemonize(); } else add_repack_all_option(); diff --git a/builtin/get-tar-commit-id.c b/builtin/get-tar-commit-id.c new file mode 100644 index 0000000000..aa72596083 --- /dev/null +++ b/builtin/get-tar-commit-id.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2005, 2006 Rene Scharfe + */ +#include "cache.h" +#include "commit.h" +#include "tar.h" +#include "builtin.h" +#include "quote.h" + +static const char builtin_get_tar_commit_id_usage[] = +"git get-tar-commit-id < <tarfile>"; + +/* ustar header + extended global header content */ +#define RECORDSIZE (512) +#define HEADERSIZE (2 * RECORDSIZE) + +int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix) +{ + char buffer[HEADERSIZE]; + struct ustar_header *header = (struct ustar_header *)buffer; + char *content = buffer + RECORDSIZE; + ssize_t n; + + if (argc != 1) + usage(builtin_get_tar_commit_id_usage); + + n = read_in_full(0, buffer, HEADERSIZE); + if (n < HEADERSIZE) + die("git get-tar-commit-id: read error"); + if (header->typeflag[0] != 'g') + return 1; + if (memcmp(content, "52 comment=", 11)) + return 1; + + n = write_in_full(1, content + 11, 41); + if (n < 41) + die_errno("git get-tar-commit-id: write error"); + + return 0; +} diff --git a/builtin/grep.c b/builtin/grep.c index 63f86032d9..69ac2d8797 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -379,7 +379,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int const struct cache_entry *ce = active_cache[nr]; if (!S_ISREG(ce->ce_mode)) continue; - if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL)) + if (!ce_path_match(ce, pathspec, NULL)) continue; /* * If CE_VALID is on, we assume worktree file and its cache entry @@ -524,9 +524,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec, fill_directory(&dir, pathspec); for (i = 0; i < dir.nr; i++) { - const char *name = dir.entries[i]->name; - int namelen = strlen(name); - if (!match_pathspec_depth(pathspec, name, namelen, 0, NULL)) + if (!dir_path_match(dir.entries[i], pathspec, 0, NULL)) continue; hit |= grep_file(opt, dir.entries[i]->name); if (hit && opt->status_only) diff --git a/builtin/help.c b/builtin/help.c index f1e236b912..1fdefeb686 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -100,7 +100,7 @@ static int check_emacsclient_version(void) */ finish_command(&ec_process); - if (prefixcmp(buffer.buf, "emacsclient")) { + if (!starts_with(buffer.buf, "emacsclient")) { strbuf_release(&buffer); return error(_("Failed to parse emacsclient version.")); } @@ -258,7 +258,7 @@ static int add_man_viewer_info(const char *var, const char *value) static int git_help_config(const char *var, const char *value, void *cb) { - if (!prefixcmp(var, "column.")) + if (starts_with(var, "column.")) return git_column_config(var, value, "help", &colopts); if (!strcmp(var, "help.format")) { if (!value) @@ -278,7 +278,7 @@ static int git_help_config(const char *var, const char *value, void *cb) add_man_viewer(value); return 0; } - if (!prefixcmp(var, "man.")) + if (starts_with(var, "man.")) return add_man_viewer_info(var, value); return git_default_config(var, value, cb); @@ -288,6 +288,10 @@ static struct cmdnames main_cmds, other_cmds; static int is_git_command(const char *s) { + if (is_builtin(s)) + return 1; + + load_command_list("git-", &main_cmds, &other_cmds); return is_in_cmdlist(&main_cmds, s) || is_in_cmdlist(&other_cmds, s); } @@ -306,7 +310,7 @@ static const char *cmd_to_page(const char *git_cmd) { if (!git_cmd) return "git"; - else if (!prefixcmp(git_cmd, "git")) + else if (starts_with(git_cmd, "git")) return git_cmd; else if (is_git_command(git_cmd)) return prepend("git-", git_cmd); @@ -449,7 +453,6 @@ int cmd_help(int argc, const char **argv, const char *prefix) int nongit; const char *alias; enum help_format parsed_help_format; - load_command_list("git-", &main_cmds, &other_cmds); argc = parse_options(argc, argv, prefix, builtin_help_options, builtin_help_usage, 0); @@ -458,6 +461,7 @@ int cmd_help(int argc, const char **argv, const char *prefix) if (show_all) { git_config(git_help_config, NULL); printf(_("usage: %s%s"), _(git_usage_string), "\n\n"); + load_command_list("git-", &main_cmds, &other_cmds); list_commands(colopts, &main_cmds, &other_cmds); } diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 9e9eb4b74e..a6b1c17996 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1502,7 +1502,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (argc == 2 && !strcmp(argv[1], "-h")) usage(index_pack_usage); - read_replace_refs = 0; + check_replace_refs = 0; reset_pack_idx_option(&opts); git_config(git_index_pack_config, &opts); @@ -1534,9 +1534,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) stat_only = 1; } else if (!strcmp(arg, "--keep")) { keep_msg = ""; - } else if (!prefixcmp(arg, "--keep=")) { + } else if (starts_with(arg, "--keep=")) { keep_msg = arg + 7; - } else if (!prefixcmp(arg, "--threads=")) { + } else if (starts_with(arg, "--threads=")) { char *end; nr_threads = strtoul(arg+10, &end, 0); if (!arg[10] || *end || nr_threads < 0) @@ -1547,7 +1547,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) "ignoring %s"), arg); nr_threads = 1; #endif - } else if (!prefixcmp(arg, "--pack_header=")) { + } else if (starts_with(arg, "--pack_header=")) { struct pack_header *hdr; char *c; @@ -1566,7 +1566,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (index_name || (i+1) >= argc) usage(index_pack_usage); index_name = argv[++i]; - } else if (!prefixcmp(arg, "--index-version=")) { + } else if (starts_with(arg, "--index-version=")) { char *c; opts.version = strtoul(arg + 16, &c, 10); if (opts.version > 2) diff --git a/builtin/init-db.c b/builtin/init-db.c index 78aa3872dd..c7c76bbf21 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -266,7 +266,7 @@ static int create_default_files(const char *template_path) /* allow template config file to override the default */ if (log_all_ref_updates == -1) git_config_set("core.logallrefupdates", "true"); - if (prefixcmp(git_dir, work_tree) || + if (!starts_with(git_dir, work_tree) || strcmp(git_dir + strlen(work_tree), "/.git")) { git_config_set("core.worktree", work_tree); } @@ -515,13 +515,14 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) saved = shared_repository; shared_repository = 0; switch (safe_create_leading_directories_const(argv[0])) { - case -3: + case SCLD_OK: + case SCLD_PERMS: + break; + case SCLD_EXISTS: errno = EEXIST; /* fallthru */ - case -1: - die_errno(_("cannot mkdir %s"), argv[0]); - break; default: + die_errno(_("cannot mkdir %s"), argv[0]); break; } shared_repository = saved; diff --git a/builtin/log.c b/builtin/log.c index b708517a35..b97373da3b 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -391,7 +391,7 @@ static int git_log_config(const char *var, const char *value, void *cb) default_show_root = git_config_bool(var, value); return 0; } - if (!prefixcmp(var, "color.decorate.")) + if (starts_with(var, "color.decorate.")) return parse_decorate_color_config(var, 15, value); if (!strcmp(var, "log.mailmap")) { use_mailmap_config = git_config_bool(var, value); @@ -477,7 +477,7 @@ static int show_tag_object(const unsigned char *sha1, struct rev_info *rev) int new_offset = offset + 1; while (new_offset < size && buf[new_offset++] != '\n') ; /* do nothing */ - if (!prefixcmp(buf + offset, "tagger ")) + if (starts_with(buf + offset, "tagger ")) show_tagger(buf + offset + 7, new_offset - offset - 7, rev); offset = new_offset; @@ -882,7 +882,7 @@ static char *find_branch_name(struct rev_info *rev) ref = rev->cmdline.rev[positive].name; tip_sha1 = rev->cmdline.rev[positive].item->sha1; if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) && - !prefixcmp(full_ref, "refs/heads/") && + starts_with(full_ref, "refs/heads/") && !hashcmp(tip_sha1, branch_sha1)) branch = xstrdup(full_ref + strlen("refs/heads/")); free(full_ref); @@ -1388,7 +1388,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) unsigned char sha1[20]; const char *ref; ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL); - if (ref && !prefixcmp(ref, "refs/heads/")) + if (ref && starts_with(ref, "refs/heads/")) branch_name = xstrdup(ref + strlen("refs/heads/")); else branch_name = xstrdup(""); /* no branch */ diff --git a/builtin/ls-files.c b/builtin/ls-files.c index e1cf6d8547..47c38808a2 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -64,7 +64,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent) if (len >= ent->len) die("git ls-files: internal error - directory entry not superset of prefix"); - if (!match_pathspec_depth(&pathspec, ent->name, ent->len, len, ps_matched)) + if (!dir_path_match(ent, &pathspec, len, ps_matched)) return; fputs(tag, stdout); @@ -139,7 +139,9 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce) if (len >= ce_namelen(ce)) die("git ls-files: internal error - cache entry not superset of prefix"); - if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), len, ps_matched)) + if (!match_pathspec(&pathspec, ce->name, ce_namelen(ce), + len, ps_matched, + S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode))) return; if (tag && *tag && show_valid_bit && @@ -195,7 +197,8 @@ static void show_ru_info(void) len = strlen(path); if (len < max_prefix_len) continue; /* outside of the prefix */ - if (!match_pathspec_depth(&pathspec, path, len, max_prefix_len, ps_matched)) + if (!match_pathspec(&pathspec, path, len, + max_prefix_len, ps_matched, 0)) continue; /* uninterested */ for (i = 0; i < 3; i++) { if (!ui->mode[i]) diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index 25e83cfe9d..3e9eefb091 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -22,7 +22,7 @@ static int tail_match(const char **pattern, const char *path) if (snprintf(pathbuf, sizeof(pathbuf), "/%s", path) > sizeof(pathbuf)) return error("insanely long ref %.*s...", 20, path); while ((p = *(pattern++)) != NULL) { - if (!fnmatch(p, pathbuf, 0)) + if (!wildmatch(p, pathbuf, 0, NULL)) return 1; } return 0; @@ -50,11 +50,11 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) const char *arg = argv[i]; if (*arg == '-') { - if (!prefixcmp(arg, "--upload-pack=")) { + if (starts_with(arg, "--upload-pack=")) { uploadpack = arg + 14; continue; } - if (!prefixcmp(arg, "--exec=")) { + if (starts_with(arg, "--exec=")) { uploadpack = arg + 7; continue; } diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index 65ec931846..51184dfa2e 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -171,7 +171,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) * show_recursive() rolls its own matching code and is * generally ignorant of 'struct pathspec'. The magic mask * cannot be lifted until it is converted to use - * match_pathspec_depth() or tree_entry_interesting() + * match_pathspec() or tree_entry_interesting() */ parse_pathspec(&pathspec, PATHSPEC_GLOB | PATHSPEC_ICASE, PATHSPEC_PREFER_CWD, diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index 24a772d8e1..2c3cd8eab7 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -328,11 +328,11 @@ static int check_header(const struct strbuf *line, } /* for inbody stuff */ - if (!prefixcmp(line->buf, ">From") && isspace(line->buf[5])) { + if (starts_with(line->buf, ">From") && isspace(line->buf[5])) { ret = 1; /* Should this return 0? */ goto check_header_out; } - if (!prefixcmp(line->buf, "[PATCH]") && isspace(line->buf[7])) { + if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) { for (i = 0; header[i]; i++) { if (!memcmp("Subject", header[i], 7)) { handle_header(&hdr_data[i], line); @@ -361,7 +361,7 @@ static int is_rfc2822_header(const struct strbuf *line) char *cp = line->buf; /* Count mbox From headers as headers */ - if (!prefixcmp(cp, "From ") || !prefixcmp(cp, ">From ")) + if (starts_with(cp, "From ") || starts_with(cp, ">From ")) return 1; while ((ch = *cp++)) { @@ -671,11 +671,11 @@ static inline int patchbreak(const struct strbuf *line) size_t i; /* Beginning of a "diff -" header? */ - if (!prefixcmp(line->buf, "diff -")) + if (starts_with(line->buf, "diff -")) return 1; /* CVS "Index: " line? */ - if (!prefixcmp(line->buf, "Index: ")) + if (starts_with(line->buf, "Index: ")) return 1; /* @@ -685,7 +685,7 @@ static inline int patchbreak(const struct strbuf *line) if (line->len < 4) return 0; - if (!prefixcmp(line->buf, "---")) { + if (starts_with(line->buf, "---")) { /* space followed by a filename? */ if (line->buf[3] == ' ' && !isspace(line->buf[4])) return 1; @@ -986,7 +986,7 @@ static int mailinfo(FILE *in, FILE *out, const char *msg, const char *patch) static int git_mailinfo_config(const char *var, const char *value, void *unused) { - if (prefixcmp(var, "mailinfo.")) + if (!starts_with(var, "mailinfo.")) return git_default_config(var, value, unused); if (!strcmp(var, "mailinfo.scissors")) { use_scissors = git_config_bool(var, value); @@ -1020,7 +1020,7 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix) metainfo_charset = def_charset; else if (!strcmp(argv[1], "-n")) metainfo_charset = NULL; - else if (!prefixcmp(argv[1], "--encoding=")) + else if (starts_with(argv[1], "--encoding=")) metainfo_charset = argv[1] + 11; else if (!strcmp(argv[1], "--scissors")) use_scissors = 1; diff --git a/builtin/merge-base.c b/builtin/merge-base.c index e88eb93f14..0ecde8da30 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -1,6 +1,9 @@ #include "builtin.h" #include "cache.h" #include "commit.h" +#include "refs.h" +#include "diff.h" +#include "revision.h" #include "parse-options.h" static int show_merge_base(struct commit **rev, int rev_nr, int show_all) @@ -27,6 +30,7 @@ static const char * const merge_base_usage[] = { N_("git merge-base [-a|--all] --octopus <commit>..."), N_("git merge-base --independent <commit>..."), N_("git merge-base --is-ancestor <commit> <commit>"), + N_("git merge-base --fork-point <ref> [<commit>]"), NULL }; @@ -44,19 +48,36 @@ static struct commit *get_commit_reference(const char *arg) return r; } -static int handle_octopus(int count, const char **args, int reduce, int show_all) +static int handle_independent(int count, const char **args) { struct commit_list *revs = NULL; struct commit_list *result; int i; - if (reduce) - show_all = 1; + for (i = count - 1; i >= 0; i--) + commit_list_insert(get_commit_reference(args[i]), &revs); + + result = reduce_heads(revs); + if (!result) + return 1; + + while (result) { + printf("%s\n", sha1_to_hex(result->item->object.sha1)); + result = result->next; + } + return 0; +} + +static int handle_octopus(int count, const char **args, int show_all) +{ + struct commit_list *revs = NULL; + struct commit_list *result; + int i; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); - result = reduce ? reduce_heads(revs) : get_octopus_merge_bases(revs); + result = reduce_heads(get_octopus_merge_bases(revs)); if (!result) return 1; @@ -85,37 +106,151 @@ static int handle_is_ancestor(int argc, const char **argv) return 1; } +struct rev_collect { + struct commit **commit; + int nr; + int alloc; + unsigned int initial : 1; +}; + +static void add_one_commit(unsigned char *sha1, struct rev_collect *revs) +{ + struct commit *commit; + + if (is_null_sha1(sha1)) + return; + + commit = lookup_commit(sha1); + if (!commit || + (commit->object.flags & TMP_MARK) || + parse_commit(commit)) + return; + + ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc); + revs->commit[revs->nr++] = commit; + commit->object.flags |= TMP_MARK; +} + +static int collect_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1, + const char *ident, unsigned long timestamp, + int tz, const char *message, void *cbdata) +{ + struct rev_collect *revs = cbdata; + + if (revs->initial) { + revs->initial = 0; + add_one_commit(osha1, revs); + } + add_one_commit(nsha1, revs); + return 0; +} + +static int handle_fork_point(int argc, const char **argv) +{ + unsigned char sha1[20]; + char *refname; + const char *commitname; + struct rev_collect revs; + struct commit *derived; + struct commit_list *bases; + int i, ret = 0; + + switch (dwim_ref(argv[0], strlen(argv[0]), sha1, &refname)) { + case 0: + die("No such ref: '%s'", argv[0]); + case 1: + break; /* good */ + default: + die("Ambiguous refname: '%s'", argv[0]); + } + + commitname = (argc == 2) ? argv[1] : "HEAD"; + if (get_sha1(commitname, sha1)) + die("Not a valid object name: '%s'", commitname); + + derived = lookup_commit_reference(sha1); + memset(&revs, 0, sizeof(revs)); + revs.initial = 1; + for_each_reflog_ent(refname, collect_one_reflog_ent, &revs); + + for (i = 0; i < revs.nr; i++) + revs.commit[i]->object.flags &= ~TMP_MARK; + + bases = get_merge_bases_many(derived, revs.nr, revs.commit, 0); + + /* + * There should be one and only one merge base, when we found + * a common ancestor among reflog entries. + */ + if (!bases || bases->next) { + ret = 1; + goto cleanup_return; + } + + /* And the found one must be one of the reflog entries */ + for (i = 0; i < revs.nr; i++) + if (&bases->item->object == &revs.commit[i]->object) + break; /* found */ + if (revs.nr <= i) { + ret = 1; /* not found */ + goto cleanup_return; + } + + printf("%s\n", sha1_to_hex(bases->item->object.sha1)); + +cleanup_return: + free_commit_list(bases); + return ret; +} + int cmd_merge_base(int argc, const char **argv, const char *prefix) { struct commit **rev; int rev_nr = 0; int show_all = 0; - int octopus = 0; - int reduce = 0; - int is_ancestor = 0; + int cmdmode = 0; struct option options[] = { OPT_BOOL('a', "all", &show_all, N_("output all common ancestors")), - OPT_BOOL(0, "octopus", &octopus, N_("find ancestors for a single n-way merge")), - OPT_BOOL(0, "independent", &reduce, N_("list revs not reachable from others")), - OPT_BOOL(0, "is-ancestor", &is_ancestor, - N_("is the first one ancestor of the other?")), + OPT_CMDMODE(0, "octopus", &cmdmode, + N_("find ancestors for a single n-way merge"), 'o'), + OPT_CMDMODE(0, "independent", &cmdmode, + N_("list revs not reachable from others"), 'r'), + OPT_CMDMODE(0, "is-ancestor", &cmdmode, + N_("is the first one ancestor of the other?"), 'a'), + OPT_CMDMODE(0, "fork-point", &cmdmode, + N_("find where <commit> forked from reflog of <ref>"), 'f'), OPT_END() }; git_config(git_default_config, NULL); 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) + + if (cmdmode == 'a') { + if (argc < 2) + usage_with_options(merge_base_usage, options); + if (show_all) + die("--is-ancestor cannot be used with --all"); return handle_is_ancestor(argc, argv); - if (reduce && (show_all || octopus)) - die("--independent cannot be used with other options"); + } - if (octopus || reduce) - return handle_octopus(argc, argv, reduce, show_all); + if (cmdmode == 'r' && show_all) + die("--independent cannot be used with --all"); + + if (cmdmode == 'o') + return handle_octopus(argc, argv, show_all); + + if (cmdmode == 'r') + return handle_independent(argc, argv); + + if (cmdmode == 'f') { + if (argc < 1 || 2 < argc) + usage_with_options(merge_base_usage, options); + return handle_fork_point(argc, argv); + } + + if (argc < 2) + usage_with_options(merge_base_usage, options); rev = xmalloc(argc * sizeof(*rev)); while (argc-- > 0) diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c index 3a64f5d0bd..a90f28f34d 100644 --- a/builtin/merge-recursive.c +++ b/builtin/merge-recursive.c @@ -29,7 +29,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) struct commit *result; init_merge_options(&o); - if (argv[0] && !suffixcmp(argv[0], "-subtree")) + if (argv[0] && ends_with(argv[0], "-subtree")) o.subtree_shift = ""; if (argc < 4) @@ -38,7 +38,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) for (i = 1; i < argc; ++i) { const char *arg = argv[i]; - if (!prefixcmp(arg, "--")) { + if (starts_with(arg, "--")) { if (!arg[2]) break; if (parse_merge_opt(&o, arg + 2)) diff --git a/builtin/merge.c b/builtin/merge.c index 02a69c14e6..f0cf1205fa 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -186,13 +186,6 @@ static int option_parse_n(const struct option *opt, return 0; } -static int option_parse_ff_only(const struct option *opt, - const char *arg, int unset) -{ - fast_forward = FF_ONLY; - return 0; -} - static struct option builtin_merge_options[] = { { OPTION_CALLBACK, 'n', NULL, NULL, NULL, N_("do not show a diffstat at the end of the merge"), @@ -210,9 +203,9 @@ static struct option builtin_merge_options[] = { OPT_BOOL('e', "edit", &option_edit, N_("edit message before committing")), OPT_SET_INT(0, "ff", &fast_forward, N_("allow fast-forward (default)"), FF_ALLOW), - { OPTION_CALLBACK, 0, "ff-only", NULL, NULL, + { OPTION_SET_INT, 0, "ff-only", &fast_forward, NULL, N_("abort if fast-forward is not possible"), - PARSE_OPT_NOARG | PARSE_OPT_NONEG, option_parse_ff_only }, + PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, FF_ONLY }, OPT_RERERE_AUTOUPDATE(&allow_rerere_auto), OPT_BOOL(0, "verify-signatures", &verify_signatures, N_("Verify that the named commit has a valid GPG signature")), @@ -374,7 +367,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead sha1_to_hex(commit->object.sha1)); pretty_print_commit(&ctx, commit, &out); } - if (write(fd, out.buf, out.len) < 0) + if (write_in_full(fd, out.buf, out.len) != out.len) die_errno(_("Writing SQUASH_MSG")); if (close(fd)) die_errno(_("Finishing SQUASH_MSG")); @@ -453,17 +446,17 @@ static void merge_name(const char *remote, struct strbuf *msg) die(_("'%s' does not point to a commit"), remote); if (dwim_ref(remote, strlen(remote), branch_head, &found_ref) > 0) { - if (!prefixcmp(found_ref, "refs/heads/")) { + if (starts_with(found_ref, "refs/heads/")) { strbuf_addf(msg, "%s\t\tbranch '%s' of .\n", sha1_to_hex(branch_head), remote); goto cleanup; } - if (!prefixcmp(found_ref, "refs/tags/")) { + if (starts_with(found_ref, "refs/tags/")) { strbuf_addf(msg, "%s\t\ttag '%s' of .\n", sha1_to_hex(branch_head), remote); goto cleanup; } - if (!prefixcmp(found_ref, "refs/remotes/")) { + if (starts_with(found_ref, "refs/remotes/")) { strbuf_addf(msg, "%s\t\tremote-tracking branch '%s' of .\n", sha1_to_hex(branch_head), remote); goto cleanup; @@ -577,8 +570,8 @@ static int git_merge_config(const char *k, const char *v, void *cb) { int status; - if (branch && !prefixcmp(k, "branch.") && - !prefixcmp(k + 7, branch) && + if (branch && starts_with(k, "branch.") && + starts_with(k + 7, branch) && !strcmp(k + 7 + strlen(branch), ".mergeoptions")) { free(branch_mergeoptions); branch_mergeoptions = xstrdup(v); @@ -604,6 +597,9 @@ static int git_merge_config(const char *k, const char *v, void *cb) } else if (!strcmp(k, "merge.defaulttoupstream")) { default_to_upstream = git_config_bool(k, v); return 0; + } else if (!strcmp(k, "commit.gpgsign")) { + sign_commit = git_config_bool(k, v) ? "" : NULL; + return 0; } status = fmt_merge_msg_config(k, v, cb); @@ -1113,7 +1109,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * current branch. */ branch = branch_to_free = resolve_refdup("HEAD", head_sha1, 0, &flag); - if (branch && !prefixcmp(branch, "refs/heads/")) + if (branch && starts_with(branch, "refs/heads/")) branch += 11; if (!branch || is_null_sha1(head_sha1)) head_commit = NULL; diff --git a/builtin/mv.c b/builtin/mv.c index aec79d1838..7e26eb5229 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = { NULL }; +#define DUP_BASENAME 1 +#define KEEP_TRAILING_SLASH 2 + static const char **internal_copy_pathspec(const char *prefix, const char **pathspec, - int count, int base_name) + int count, unsigned flags) { int i; const char **result = xmalloc((count + 1) * sizeof(const char *)); @@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix, for (i = 0; i < count; i++) { int length = strlen(result[i]); int to_copy = length; - while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1])) + while (!(flags & KEEP_TRAILING_SLASH) && + to_copy > 0 && is_dir_sep(result[i][to_copy - 1])) to_copy--; - if (to_copy != length || base_name) { + if (to_copy != length || flags & DUP_BASENAME) { char *it = xmemdupz(result[i], to_copy); - if (base_name) { + if (flags & DUP_BASENAME) { result[i] = xstrdup(basename(it)); free(it); } else @@ -55,6 +59,7 @@ static const char *add_slash(const char *path) } static struct lock_file lock_file; +#define SUBMODULE_WITH_GITDIR ((const char *)1) int cmd_mv(int argc, const char **argv, const char *prefix) { @@ -86,16 +91,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix) source = internal_copy_pathspec(prefix, argv, argc, 0); modes = xcalloc(argc, sizeof(enum update_mode)); - dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0); + /* + * Keep trailing slash, needed to let + * "git mv file no-such-dir/" error out. + */ + dest_path = internal_copy_pathspec(prefix, argv + argc, 1, + KEEP_TRAILING_SLASH); submodule_gitfile = xcalloc(argc, sizeof(char *)); if (dest_path[0][0] == '\0') /* special case: "." was normalized to "" */ - destination = internal_copy_pathspec(dest_path[0], argv, argc, 1); + destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME); else if (!lstat(dest_path[0], &st) && S_ISDIR(st.st_mode)) { dest_path[0] = add_slash(dest_path[0]); - destination = internal_copy_pathspec(dest_path[0], argv, argc, 1); + destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME); } else { if (argc != 1) die("destination '%s' is not a directory", dest_path[0]); @@ -132,6 +142,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix) submodule_gitfile[i] = read_gitfile(submodule_dotgit.buf); if (submodule_gitfile[i]) submodule_gitfile[i] = xstrdup(submodule_gitfile[i]); + else + submodule_gitfile[i] = SUBMODULE_WITH_GITDIR; strbuf_release(&submodule_dotgit); } else { const char *src_w_slash = add_slash(src); @@ -150,7 +162,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix) if (strncmp(path, src_w_slash, len_w_slash)) break; } - free((char *)src_w_slash); + if (src_w_slash != src) + free((char *)src_w_slash); if (last - first < 1) bad = _("source directory is empty"); @@ -202,6 +215,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix) } } else if (string_list_has_string(&src_for_dst, dst)) bad = _("multiple sources for the same target"); + else if (is_dir_sep(dst[strlen(dst) - 1])) + bad = _("destination directory does not exist"); else string_list_insert(&src_for_dst, dst); @@ -230,10 +245,12 @@ int cmd_mv(int argc, const char **argv, const char *prefix) if (!show_only && mode != INDEX) { if (rename(src, dst) < 0 && !ignore_errors) die_errno (_("renaming '%s' failed"), src); - if (submodule_gitfile[i]) - connect_work_tree_and_git_dir(dst, submodule_gitfile[i]); - if (!update_path_in_gitmodules(src, dst)) - gitmodules_modified = 1; + if (submodule_gitfile[i]) { + if (submodule_gitfile[i] != SUBMODULE_WITH_GITDIR) + connect_work_tree_and_git_dir(dst, submodule_gitfile[i]); + if (!update_path_in_gitmodules(src, dst)) + gitmodules_modified = 1; + } } if (mode == WORKING_DIRECTORY) diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 20fcf8c696..c824d4ec5f 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -27,8 +27,7 @@ static void name_rev(struct commit *commit, struct commit_list *parents; int parent_number = 1; - if (!commit->object.parsed) - parse_commit(commit); + parse_commit(commit); if (commit->date < cutoff) return; @@ -88,7 +87,7 @@ static int subpath_matches(const char *path, const char *filter) const char *subpath = path; while (subpath) { - if (!fnmatch(filter, subpath, 0)) + if (!wildmatch(filter, subpath, 0, NULL)) return subpath - path; subpath = strchr(subpath, '/'); if (subpath) @@ -101,9 +100,9 @@ static const char *name_ref_abbrev(const char *refname, int shorten_unambiguous) { if (shorten_unambiguous) refname = shorten_unambiguous_ref(refname, 0); - else if (!prefixcmp(refname, "refs/heads/")) + else if (starts_with(refname, "refs/heads/")) refname = refname + 11; - else if (!prefixcmp(refname, "refs/")) + else if (starts_with(refname, "refs/")) refname = refname + 5; return refname; } @@ -149,7 +148,7 @@ static int name_ref(const char *path, const unsigned char *sha1, int flags, void int can_abbreviate_output = data->tags_only && data->name_only; int deref = 0; - if (data->tags_only && prefixcmp(path, "refs/tags/")) + if (data->tags_only && !starts_with(path, "refs/tags/")) return 0; if (data->ref_filter) { diff --git a/builtin/notes.c b/builtin/notes.c index d459e23c42..bb89930373 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -269,7 +269,11 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset) die(_("Failed to resolve '%s' as a valid ref."), arg); if (!(buf = read_sha1_file(object, &type, &len)) || !len) { free(buf); - die(_("Failed to read object '%s'."), arg);; + die(_("Failed to read object '%s'."), arg); + } + if (type != OBJ_BLOB) { + free(buf); + die(_("Cannot read note data from non-blob object '%s'."), arg); } strbuf_add(&(msg->buf), buf, len); free(buf); @@ -347,7 +351,7 @@ static struct notes_tree *init_notes_check(const char *subcommand) init_notes(NULL, NULL, NULL, 0); t = &default_notes_tree; - if (prefixcmp(t->ref, "refs/notes/")) + if (!starts_with(t->ref, "refs/notes/")) die("Refusing to %s notes in %s (outside of refs/notes/)", subcommand, t->ref); return t; diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 36273dd6f0..1fb972f45a 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -14,10 +14,12 @@ #include "diff.h" #include "revision.h" #include "list-objects.h" +#include "pack-objects.h" #include "progress.h" #include "refs.h" #include "streaming.h" #include "thread-utils.h" +#include "pack-bitmap.h" static const char *pack_usage[] = { N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"), @@ -25,42 +27,15 @@ static const char *pack_usage[] = { NULL }; -struct object_entry { - struct pack_idx_entry idx; - unsigned long size; /* uncompressed size */ - struct packed_git *in_pack; /* already in pack */ - off_t in_pack_offset; - struct object_entry *delta; /* delta base object */ - struct object_entry *delta_child; /* deltified objects who bases me */ - struct object_entry *delta_sibling; /* other deltified objects who - * uses the same base as me - */ - void *delta_data; /* cached delta (uncompressed) */ - unsigned long delta_size; /* delta data size (uncompressed) */ - unsigned long z_delta_size; /* delta data size (compressed) */ - enum object_type type; - enum object_type in_pack_type; /* could be delta */ - uint32_t hash; /* name hint hash */ - unsigned char in_pack_header_size; - unsigned preferred_base:1; /* - * we do not pack this, but is available - * to be used as the base object to delta - * objects against. - */ - unsigned no_try_delta:1; - unsigned tagged:1; /* near the very tip of refs */ - unsigned filled:1; /* assigned write-order */ -}; - /* - * Objects we are going to pack are collected in objects array (dynamically - * expanded). nr_objects & nr_alloc controls this array. They are stored - * in the order we see -- typically rev-list --objects order that gives us - * nice "minimum seek" order. + * Objects we are going to pack are collected in the `to_pack` structure. + * It contains an array (dynamically expanded) of the object data, and a map + * that can resolve SHA1s to their position in the array. */ -static struct object_entry *objects; +static struct packing_data to_pack; + static struct pack_idx_entry **written_list; -static uint32_t nr_objects, nr_alloc, nr_result, nr_written; +static uint32_t nr_result, nr_written; static int non_empty; static int reuse_delta = 1, reuse_object = 1; @@ -83,6 +58,14 @@ static struct progress *progress_state; static int pack_compression_level = Z_DEFAULT_COMPRESSION; static int pack_compression_seen; +static struct packed_git *reuse_packfile; +static uint32_t reuse_packfile_objects; +static off_t reuse_packfile_offset; + +static int use_bitmap_index = 1; +static int write_bitmap_index; +static uint16_t write_bitmap_options; + static unsigned long delta_cache_size = 0; static unsigned long max_delta_cache_size = 256 * 1024 * 1024; static unsigned long cache_max_small_delta_size = 1000; @@ -90,20 +73,28 @@ static unsigned long cache_max_small_delta_size = 1000; static unsigned long window_memory_limit = 0; /* - * The object names in objects array are hashed with this hashtable, - * to help looking up the entry by object name. - * This hashtable is built after all the objects are seen. - */ -static int *object_ix; -static int object_ix_hashsz; -static struct object_entry *locate_object_entry(const unsigned char *sha1); - -/* * stats */ static uint32_t written, written_delta; static uint32_t reused, reused_delta; +/* + * Indexed commits + */ +static struct commit **indexed_commits; +static unsigned int indexed_commits_nr; +static unsigned int indexed_commits_alloc; + +static void index_commit_for_bitmap(struct commit *commit) +{ + if (indexed_commits_nr >= indexed_commits_alloc) { + indexed_commits_alloc = (indexed_commits_alloc + 32) * 2; + indexed_commits = xrealloc(indexed_commits, + indexed_commits_alloc * sizeof(struct commit *)); + } + + indexed_commits[indexed_commits_nr++] = commit; +} static void *get_delta(struct object_entry *entry) { @@ -553,12 +544,12 @@ static int mark_tagged(const char *path, const unsigned char *sha1, int flag, void *cb_data) { unsigned char peeled[20]; - struct object_entry *entry = locate_object_entry(sha1); + struct object_entry *entry = packlist_find(&to_pack, sha1, NULL); if (entry) entry->tagged = 1; if (!peel_ref(path, peeled)) { - entry = locate_object_entry(peeled); + entry = packlist_find(&to_pack, peeled, NULL); if (entry) entry->tagged = 1; } @@ -633,9 +624,10 @@ static struct object_entry **compute_write_order(void) { unsigned int i, wo_end, last_untagged; - struct object_entry **wo = xmalloc(nr_objects * sizeof(*wo)); + struct object_entry **wo = xmalloc(to_pack.nr_objects * sizeof(*wo)); + struct object_entry *objects = to_pack.objects; - for (i = 0; i < nr_objects; i++) { + for (i = 0; i < to_pack.nr_objects; i++) { objects[i].tagged = 0; objects[i].filled = 0; objects[i].delta_child = NULL; @@ -647,7 +639,7 @@ static struct object_entry **compute_write_order(void) * Make sure delta_sibling is sorted in the original * recency order. */ - for (i = nr_objects; i > 0;) { + for (i = to_pack.nr_objects; i > 0;) { struct object_entry *e = &objects[--i]; if (!e->delta) continue; @@ -665,7 +657,7 @@ static struct object_entry **compute_write_order(void) * Give the objects in the original recency order until * we see a tagged tip. */ - for (i = wo_end = 0; i < nr_objects; i++) { + for (i = wo_end = 0; i < to_pack.nr_objects; i++) { if (objects[i].tagged) break; add_to_write_order(wo, &wo_end, &objects[i]); @@ -675,7 +667,7 @@ static struct object_entry **compute_write_order(void) /* * Then fill all the tagged tips. */ - for (; i < nr_objects; i++) { + for (; i < to_pack.nr_objects; i++) { if (objects[i].tagged) add_to_write_order(wo, &wo_end, &objects[i]); } @@ -683,7 +675,7 @@ static struct object_entry **compute_write_order(void) /* * And then all remaining commits and tags. */ - for (i = last_untagged; i < nr_objects; i++) { + for (i = last_untagged; i < to_pack.nr_objects; i++) { if (objects[i].type != OBJ_COMMIT && objects[i].type != OBJ_TAG) continue; @@ -693,7 +685,7 @@ static struct object_entry **compute_write_order(void) /* * And then all the trees. */ - for (i = last_untagged; i < nr_objects; i++) { + for (i = last_untagged; i < to_pack.nr_objects; i++) { if (objects[i].type != OBJ_TREE) continue; add_to_write_order(wo, &wo_end, &objects[i]); @@ -702,17 +694,57 @@ static struct object_entry **compute_write_order(void) /* * Finally all the rest in really tight order */ - for (i = last_untagged; i < nr_objects; i++) { + for (i = last_untagged; i < to_pack.nr_objects; i++) { if (!objects[i].filled) add_family_to_write_order(wo, &wo_end, &objects[i]); } - if (wo_end != nr_objects) - die("ordered %u objects, expected %"PRIu32, wo_end, nr_objects); + if (wo_end != to_pack.nr_objects) + die("ordered %u objects, expected %"PRIu32, wo_end, to_pack.nr_objects); return wo; } +static off_t write_reused_pack(struct sha1file *f) +{ + unsigned char buffer[8192]; + off_t to_write; + int fd; + + if (!is_pack_valid(reuse_packfile)) + die("packfile is invalid: %s", reuse_packfile->pack_name); + + fd = git_open_noatime(reuse_packfile->pack_name); + if (fd < 0) + die_errno("unable to open packfile for reuse: %s", + reuse_packfile->pack_name); + + if (lseek(fd, sizeof(struct pack_header), SEEK_SET) == -1) + die_errno("unable to seek in reused packfile"); + + if (reuse_packfile_offset < 0) + reuse_packfile_offset = reuse_packfile->pack_size - 20; + + to_write = reuse_packfile_offset - sizeof(struct pack_header); + + while (to_write) { + int read_pack = xread(fd, buffer, sizeof(buffer)); + + if (read_pack <= 0) + die_errno("unable to read from reused packfile"); + + if (read_pack > to_write) + read_pack = to_write; + + sha1write(f, buffer, read_pack); + to_write -= read_pack; + } + + close(fd); + written += reuse_packfile_objects; + return reuse_packfile_offset - sizeof(struct pack_header); +} + static void write_pack_file(void) { uint32_t i = 0, j; @@ -723,8 +755,8 @@ static void write_pack_file(void) struct object_entry **write_order; if (progress > pack_to_stdout) - progress_state = start_progress("Writing objects", nr_result); - written_list = xmalloc(nr_objects * sizeof(*written_list)); + progress_state = start_progress(_("Writing objects"), nr_result); + written_list = xmalloc(to_pack.nr_objects * sizeof(*written_list)); write_order = compute_write_order(); do { @@ -737,10 +769,17 @@ static void write_pack_file(void) f = create_tmp_packfile(&pack_tmp_name); offset = write_pack_header(f, nr_remaining); - if (!offset) - die_errno("unable to write pack header"); + + if (reuse_packfile) { + off_t packfile_size; + assert(pack_to_stdout); + + packfile_size = write_reused_pack(f); + offset += packfile_size; + } + nr_written = 0; - for (; i < nr_objects; i++) { + for (; i < to_pack.nr_objects; i++) { struct object_entry *e = write_order[i]; if (write_one(f, e, &offset) == WRITE_ONE_BREAK) break; @@ -784,16 +823,38 @@ static void write_pack_file(void) utb.modtime = --last_mtime; if (utime(pack_tmp_name, &utb) < 0) warning("failed utime() on %s: %s", - tmpname, strerror(errno)); + pack_tmp_name, strerror(errno)); } /* Enough space for "-<sha-1>.pack"? */ if (sizeof(tmpname) <= strlen(base_name) + 50) die("pack base name '%s' too long", base_name); snprintf(tmpname, sizeof(tmpname), "%s-", base_name); + + if (write_bitmap_index) { + bitmap_writer_set_checksum(sha1); + bitmap_writer_build_type_index(written_list, nr_written); + } + finish_tmp_packfile(tmpname, pack_tmp_name, written_list, nr_written, &pack_idx_opts, sha1); + + if (write_bitmap_index) { + char *end_of_name_prefix = strrchr(tmpname, 0); + sprintf(end_of_name_prefix, "%s.bitmap", sha1_to_hex(sha1)); + + stop_progress(&progress_state); + + bitmap_writer_show_progress(progress); + bitmap_writer_reuse_bitmaps(&to_pack); + bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1); + bitmap_writer_build(&to_pack); + bitmap_writer_finish(written_list, nr_written, + tmpname, write_bitmap_options); + write_bitmap_index = 0; + } + free(pack_tmp_name); puts(sha1_to_hex(sha1)); } @@ -803,7 +864,7 @@ static void write_pack_file(void) written_list[j]->offset = (off_t)-1; } nr_remaining -= nr_written; - } while (nr_remaining && i < nr_objects); + } while (nr_remaining && i < to_pack.nr_objects); free(written_list); free(write_order); @@ -813,73 +874,6 @@ static void write_pack_file(void) written, nr_result); } -static int locate_object_entry_hash(const unsigned char *sha1) -{ - int i; - unsigned int ui; - memcpy(&ui, sha1, sizeof(unsigned int)); - i = ui % object_ix_hashsz; - while (0 < object_ix[i]) { - if (!hashcmp(sha1, objects[object_ix[i] - 1].idx.sha1)) - return i; - if (++i == object_ix_hashsz) - i = 0; - } - return -1 - i; -} - -static struct object_entry *locate_object_entry(const unsigned char *sha1) -{ - int i; - - if (!object_ix_hashsz) - return NULL; - - i = locate_object_entry_hash(sha1); - if (0 <= i) - return &objects[object_ix[i]-1]; - return NULL; -} - -static void rehash_objects(void) -{ - uint32_t i; - struct object_entry *oe; - - object_ix_hashsz = nr_objects * 3; - if (object_ix_hashsz < 1024) - object_ix_hashsz = 1024; - object_ix = xrealloc(object_ix, sizeof(int) * object_ix_hashsz); - memset(object_ix, 0, sizeof(int) * object_ix_hashsz); - for (i = 0, oe = objects; i < nr_objects; i++, oe++) { - int ix = locate_object_entry_hash(oe->idx.sha1); - if (0 <= ix) - continue; - ix = -1 - ix; - object_ix[ix] = i + 1; - } -} - -static uint32_t name_hash(const char *name) -{ - uint32_t c, hash = 0; - - if (!name) - return 0; - - /* - * This effectively just creates a sortable number from the - * last sixteen non-whitespace characters. Last characters - * count "most", so things that end in ".c" sort together. - */ - while ((c = *name++) != 0) { - if (isspace(c)) - continue; - hash = (hash >> 2) + (c << 24); - } - return hash; -} - static void setup_delta_attr_check(struct git_attr_check *check) { static struct git_attr *attr_delta; @@ -902,42 +896,69 @@ static int no_try_delta(const char *path) return 0; } -static int add_object_entry(const unsigned char *sha1, enum object_type type, - const char *name, int exclude) +/* + * When adding an object, check whether we have already added it + * to our packing list. If so, we can skip. However, if we are + * being asked to excludei t, but the previous mention was to include + * it, make sure to adjust its flags and tweak our numbers accordingly. + * + * As an optimization, we pass out the index position where we would have + * found the item, since that saves us from having to look it up again a + * few lines later when we want to add the new entry. + */ +static int have_duplicate_entry(const unsigned char *sha1, + int exclude, + uint32_t *index_pos) { struct object_entry *entry; - struct packed_git *p, *found_pack = NULL; - off_t found_offset = 0; - int ix; - uint32_t hash = name_hash(name); - - ix = nr_objects ? locate_object_entry_hash(sha1) : -1; - if (ix >= 0) { - if (exclude) { - entry = objects + object_ix[ix] - 1; - if (!entry->preferred_base) - nr_result--; - entry->preferred_base = 1; - } + + entry = packlist_find(&to_pack, sha1, index_pos); + if (!entry) return 0; + + if (exclude) { + if (!entry->preferred_base) + nr_result--; + entry->preferred_base = 1; } + return 1; +} + +/* + * Check whether we want the object in the pack (e.g., we do not want + * objects found in non-local stores if the "--local" option was used). + * + * As a side effect of this check, we will find the packed version of this + * object, if any. We therefore pass out the pack information to avoid having + * to look it up again later. + */ +static int want_object_in_pack(const unsigned char *sha1, + int exclude, + struct packed_git **found_pack, + off_t *found_offset) +{ + struct packed_git *p; + if (!exclude && local && has_loose_object_nonlocal(sha1)) return 0; + *found_pack = NULL; + *found_offset = 0; + for (p = packed_git; p; p = p->next) { off_t offset = find_pack_entry_one(sha1, p); if (offset) { - if (!found_pack) { + if (!*found_pack) { if (!is_pack_valid(p)) { warning("packfile %s cannot be accessed", p->pack_name); continue; } - found_offset = offset; - found_pack = p; + *found_offset = offset; + *found_pack = p; } if (exclude) - break; + return 1; if (incremental) return 0; if (local && !p->pack_local) @@ -947,14 +968,21 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type, } } - if (nr_objects >= nr_alloc) { - nr_alloc = (nr_alloc + 1024) * 3 / 2; - objects = xrealloc(objects, nr_alloc * sizeof(*entry)); - } + return 1; +} + +static void create_object_entry(const unsigned char *sha1, + enum object_type type, + uint32_t hash, + int exclude, + int no_try_delta, + uint32_t index_pos, + struct packed_git *found_pack, + off_t found_offset) +{ + struct object_entry *entry; - entry = objects + nr_objects++; - memset(entry, 0, sizeof(*entry)); - hashcpy(entry->idx.sha1, sha1); + entry = packlist_alloc(&to_pack, sha1, index_pos); entry->hash = hash; if (type) entry->type = type; @@ -967,16 +995,43 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type, entry->in_pack_offset = found_offset; } - if (object_ix_hashsz * 3 <= nr_objects * 4) - rehash_objects(); - else - object_ix[-1 - ix] = nr_objects; + entry->no_try_delta = no_try_delta; +} + +static int add_object_entry(const unsigned char *sha1, enum object_type type, + const char *name, int exclude) +{ + struct packed_git *found_pack; + off_t found_offset; + uint32_t index_pos; - display_progress(progress_state, nr_objects); + if (have_duplicate_entry(sha1, exclude, &index_pos)) + return 0; + + if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) + return 0; - if (name && no_try_delta(name)) - entry->no_try_delta = 1; + create_object_entry(sha1, type, pack_name_hash(name), + exclude, name && no_try_delta(name), + index_pos, found_pack, found_offset); + display_progress(progress_state, to_pack.nr_objects); + return 1; +} + +static int add_object_entry_from_bitmap(const unsigned char *sha1, + enum object_type type, + int flags, uint32_t name_hash, + struct packed_git *pack, off_t offset) +{ + uint32_t index_pos; + + if (have_duplicate_entry(sha1, 0, &index_pos)) + return 0; + + create_object_entry(sha1, type, name_hash, 0, 0, index_pos, pack, offset); + + display_progress(progress_state, to_pack.nr_objects); return 1; } @@ -1177,7 +1232,7 @@ static void add_preferred_base_object(const char *name) { struct pbase_tree *it; int cmplen; - unsigned hash = name_hash(name); + unsigned hash = pack_name_hash(name); if (!num_preferred_base || check_pbase_path(hash)) return; @@ -1329,7 +1384,7 @@ static void check_object(struct object_entry *entry) break; } - if (base_ref && (base_entry = locate_object_entry(base_ref))) { + if (base_ref && (base_entry = packlist_find(&to_pack, base_ref, NULL))) { /* * If base_ref was set above that means we wish to * reuse delta data, and we even found that base @@ -1403,12 +1458,12 @@ static void get_object_details(void) uint32_t i; struct object_entry **sorted_by_offset; - sorted_by_offset = xcalloc(nr_objects, sizeof(struct object_entry *)); - for (i = 0; i < nr_objects; i++) - sorted_by_offset[i] = objects + i; - qsort(sorted_by_offset, nr_objects, sizeof(*sorted_by_offset), pack_offset_sort); + sorted_by_offset = xcalloc(to_pack.nr_objects, sizeof(struct object_entry *)); + for (i = 0; i < to_pack.nr_objects; i++) + sorted_by_offset[i] = to_pack.objects + i; + qsort(sorted_by_offset, to_pack.nr_objects, sizeof(*sorted_by_offset), pack_offset_sort); - for (i = 0; i < nr_objects; i++) { + for (i = 0; i < to_pack.nr_objects; i++) { struct object_entry *entry = sorted_by_offset[i]; check_object(entry); if (big_file_threshold < entry->size) @@ -2032,9 +2087,9 @@ static int add_ref_tag(const char *path, const unsigned char *sha1, int flag, vo { unsigned char peeled[20]; - if (!prefixcmp(path, "refs/tags/") && /* is a tag? */ + if (starts_with(path, "refs/tags/") && /* is a tag? */ !peel_ref(path, peeled) && /* peelable? */ - locate_object_entry(peeled)) /* object packed? */ + packlist_find(&to_pack, peeled, NULL)) /* object packed? */ add_object_entry(sha1, OBJ_TAG, NULL, 0); return 0; } @@ -2057,14 +2112,14 @@ static void prepare_pack(int window, int depth) if (!pack_to_stdout) do_check_packed_object_crc = 1; - if (!nr_objects || !window || !depth) + if (!to_pack.nr_objects || !window || !depth) return; - delta_list = xmalloc(nr_objects * sizeof(*delta_list)); + delta_list = xmalloc(to_pack.nr_objects * sizeof(*delta_list)); nr_deltas = n = 0; - for (i = 0; i < nr_objects; i++) { - struct object_entry *entry = objects + i; + for (i = 0; i < to_pack.nr_objects; i++) { + struct object_entry *entry = to_pack.objects + i; if (entry->delta) /* This happens if we decided to reuse existing @@ -2099,7 +2154,7 @@ static void prepare_pack(int window, int depth) if (nr_deltas && n > 1) { unsigned nr_done = 0; if (progress) - progress_state = start_progress("Compressing objects", + progress_state = start_progress(_("Compressing objects"), nr_deltas); qsort(delta_list, n, sizeof(*delta_list), type_size_sort); ll_find_deltas(delta_list, n, window+1, depth, &nr_done); @@ -2142,6 +2197,20 @@ static int git_pack_config(const char *k, const char *v, void *cb) cache_max_small_delta_size = git_config_int(k, v); return 0; } + if (!strcmp(k, "pack.writebitmaps")) { + write_bitmap_index = git_config_bool(k, v); + return 0; + } + if (!strcmp(k, "pack.writebitmaphashcache")) { + if (git_config_bool(k, v)) + write_bitmap_options |= BITMAP_OPT_HASH_CACHE; + else + write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE; + } + if (!strcmp(k, "pack.usebitmaps")) { + use_bitmap_index = git_config_bool(k, v); + return 0; + } if (!strcmp(k, "pack.threads")) { delta_search_threads = git_config_int(k, v); if (delta_search_threads < 0) @@ -2200,6 +2269,9 @@ static void show_commit(struct commit *commit, void *data) { add_object_entry(commit->object.sha1, OBJ_COMMIT, NULL, 0); commit->object.flags |= OBJECT_ADDED; + + if (write_bitmap_index) + index_commit_for_bitmap(commit); } static void show_object(struct object *obj, @@ -2342,7 +2414,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs) for (i = 0; i < p->num_objects; i++) { sha1 = nth_packed_object_sha1(p, i); - if (!locate_object_entry(sha1) && + if (!packlist_find(&to_pack, sha1, NULL) && !has_sha1_pack_kept_or_nonlocal(sha1)) if (force_object_loose(sha1, p->mtime)) die("unable to force loose object"); @@ -2350,6 +2422,29 @@ static void loosen_unused_packed_objects(struct rev_info *revs) } } +static int get_object_list_from_bitmap(struct rev_info *revs) +{ + if (prepare_bitmap_walk(revs) < 0) + return -1; + + if (!reuse_partial_packfile_from_bitmap( + &reuse_packfile, + &reuse_packfile_objects, + &reuse_packfile_offset)) { + assert(reuse_packfile_objects); + nr_result += reuse_packfile_objects; + + if (progress) { + fprintf(stderr, "Reusing existing pack: %d, done.\n", + reuse_packfile_objects); + fflush(stderr); + } + } + + traverse_bitmap_commit_list(&add_object_entry_from_bitmap); + return 0; +} + static void get_object_list(int ac, const char **av) { struct rev_info revs; @@ -2369,6 +2464,7 @@ static void get_object_list(int ac, const char **av) if (*line == '-') { if (!strcmp(line, "--not")) { flags ^= UNINTERESTING; + write_bitmap_index = 0; continue; } die("not a rev '%s'", line); @@ -2377,6 +2473,9 @@ static void get_object_list(int ac, const char **av) die("bad revision '%s'", line); } + if (use_bitmap_index && !get_object_list_from_bitmap(&revs)) + return; + if (prepare_revision_walk(&revs)) die("revision walk setup failed"); mark_edges_uninteresting(&revs, show_edge); @@ -2506,10 +2605,14 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) N_("pack compression level")), OPT_SET_INT(0, "keep-true-parents", &grafts_replace_parents, N_("do not hide commits by grafts"), 0), + OPT_BOOL(0, "use-bitmap-index", &use_bitmap_index, + N_("use a bitmap index if available to speed up counting objects")), + OPT_BOOL(0, "write-bitmap-index", &write_bitmap_index, + N_("write a bitmap index together with the pack index")), OPT_END(), }; - read_replace_refs = 0; + check_replace_refs = 0; reset_pack_idx_option(&pack_idx_opts); git_config(git_pack_config, NULL); @@ -2572,13 +2675,19 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) if (keep_unreachable && unpack_unreachable) die("--keep-unreachable and --unpack-unreachable are incompatible."); + if (!use_internal_rev_list || !pack_to_stdout || is_repository_shallow()) + use_bitmap_index = 0; + + if (pack_to_stdout || !rev_list_all) + write_bitmap_index = 0; + if (progress && all_progress_implied) progress = 2; prepare_packed_git(); if (progress) - progress_state = start_progress("Counting objects", 0); + progress_state = start_progress(_("Counting objects"), 0); if (!use_internal_rev_list) read_object_list_from_stdin(); else { diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c index fa6ce42f44..6879468c46 100644 --- a/builtin/prune-packed.c +++ b/builtin/prune-packed.c @@ -10,58 +10,62 @@ static const char * const prune_packed_usage[] = { static struct progress *progress; -static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts) +static void prune_dir(int i, DIR *dir, struct strbuf *pathname, int opts) { struct dirent *de; char hex[40]; + int top_len = pathname->len; sprintf(hex, "%02x", i); while ((de = readdir(dir)) != NULL) { unsigned char sha1[20]; if (strlen(de->d_name) != 38) continue; - memcpy(hex+2, de->d_name, 38); + memcpy(hex + 2, de->d_name, 38); if (get_sha1_hex(hex, sha1)) continue; if (!has_sha1_pack(sha1)) continue; - memcpy(pathname + len, de->d_name, 38); + + strbuf_add(pathname, de->d_name, 38); if (opts & PRUNE_PACKED_DRY_RUN) - printf("rm -f %s\n", pathname); + printf("rm -f %s\n", pathname->buf); else - unlink_or_warn(pathname); + unlink_or_warn(pathname->buf); display_progress(progress, i + 1); + strbuf_setlen(pathname, top_len); } } void prune_packed_objects(int opts) { int i; - static char pathname[PATH_MAX]; const char *dir = get_object_directory(); - int len = strlen(dir); + struct strbuf pathname = STRBUF_INIT; + int top_len; + strbuf_addstr(&pathname, dir); if (opts & PRUNE_PACKED_VERBOSE) - progress = start_progress_delay("Removing duplicate objects", + progress = start_progress_delay(_("Removing duplicate objects"), 256, 95, 2); - if (len > PATH_MAX - 42) - die("impossible object directory"); - memcpy(pathname, dir, len); - if (len && pathname[len-1] != '/') - pathname[len++] = '/'; + if (pathname.len && pathname.buf[pathname.len - 1] != '/') + strbuf_addch(&pathname, '/'); + + top_len = pathname.len; for (i = 0; i < 256; i++) { DIR *d; display_progress(progress, i + 1); - sprintf(pathname + len, "%02x/", i); - d = opendir(pathname); + strbuf_setlen(&pathname, top_len); + strbuf_addf(&pathname, "%02x/", i); + d = opendir(pathname.buf); if (!d) continue; - prune_dir(i, d, pathname, len + 3, opts); + prune_dir(i, d, &pathname, opts); closedir(d); - pathname[len + 2] = '\0'; - rmdir(pathname); + strbuf_setlen(&pathname, top_len + 2); + rmdir(pathname.buf); } stop_progress(&progress); } diff --git a/builtin/prune.c b/builtin/prune.c index 6366917c6d..144a3bdb33 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -17,9 +17,8 @@ static int verbose; static unsigned long expire; static int show_progress = -1; -static int prune_tmp_object(const char *path, const char *filename) +static int prune_tmp_file(const char *fullpath) { - const char *fullpath = mkpath("%s/%s", path, filename); struct stat st; if (lstat(fullpath, &st)) return error("Could not stat '%s'", fullpath); @@ -32,9 +31,8 @@ static int prune_tmp_object(const char *path, const char *filename) return 0; } -static int prune_object(char *path, const char *filename, const unsigned char *sha1) +static int prune_object(const char *fullpath, const unsigned char *sha1) { - const char *fullpath = mkpath("%s/%s", path, filename); struct stat st; if (lstat(fullpath, &st)) return error("Could not stat '%s'", fullpath); @@ -50,9 +48,10 @@ static int prune_object(char *path, const char *filename, const unsigned char *s return 0; } -static int prune_dir(int i, char *path) +static int prune_dir(int i, struct strbuf *path) { - DIR *dir = opendir(path); + size_t baselen = path->len; + DIR *dir = opendir(path->buf); struct dirent *de; if (!dir) @@ -77,28 +76,39 @@ static int prune_dir(int i, char *path) if (lookup_object(sha1)) continue; - prune_object(path, de->d_name, sha1); + strbuf_addf(path, "/%s", de->d_name); + prune_object(path->buf, sha1); + strbuf_setlen(path, baselen); continue; } - if (!prefixcmp(de->d_name, "tmp_obj_")) { - prune_tmp_object(path, de->d_name); + if (starts_with(de->d_name, "tmp_obj_")) { + strbuf_addf(path, "/%s", de->d_name); + prune_tmp_file(path->buf); + strbuf_setlen(path, baselen); continue; } - fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name); + fprintf(stderr, "bad sha1 file: %s/%s\n", path->buf, de->d_name); } closedir(dir); if (!show_only) - rmdir(path); + rmdir(path->buf); return 0; } static void prune_object_dir(const char *path) { + struct strbuf buf = STRBUF_INIT; + size_t baselen; int i; + + strbuf_addstr(&buf, path); + strbuf_addch(&buf, '/'); + baselen = buf.len; + for (i = 0; i < 256; i++) { - static char dir[4096]; - sprintf(dir, "%s/%02x", path, i); - prune_dir(i, dir); + strbuf_addf(&buf, "%02x", i); + prune_dir(i, &buf); + strbuf_setlen(&buf, baselen); } } @@ -119,8 +129,8 @@ static void remove_temporary_files(const char *path) return; } while ((de = readdir(dir)) != NULL) - if (!prefixcmp(de->d_name, "tmp_")) - prune_tmp_object(path, de->d_name); + if (starts_with(de->d_name, "tmp_")) + prune_tmp_file(mkpath("%s/%s", path, de->d_name)); closedir(dir); } @@ -140,7 +150,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) expire = ULONG_MAX; save_commit_buffer = 0; - read_replace_refs = 0; + check_replace_refs = 0; init_revisions(&revs, prefix); argc = parse_options(argc, argv, prefix, options, prune_usage, 0); @@ -159,7 +169,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) if (show_progress == -1) show_progress = isatty(2); if (show_progress) - progress = start_progress_delay("Checking connectivity", 0, 0, 2); + progress = start_progress_delay(_("Checking connectivity"), 0, 0, 2); mark_reachable_objects(&revs, 1, progress); stop_progress(&progress); @@ -170,5 +180,9 @@ int cmd_prune(int argc, const char **argv, const char *prefix) s = mkpathdup("%s/pack", get_object_directory()); remove_temporary_files(s); free(s); + + if (is_repository_shallow()) + prune_shallow(show_only); + return 0; } diff --git a/builtin/push.c b/builtin/push.c index 7b1b66c36a..f8dfea41e1 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -26,7 +26,6 @@ static struct push_cas_option cas; static const char **refspec; static int refspec_nr; static int refspec_alloc; -static int default_matching_used; static void add_refspec(const char *ref) { @@ -35,35 +34,75 @@ static void add_refspec(const char *ref) refspec[refspec_nr-1] = ref; } -static void set_refspecs(const char **refs, int nr) +static const char *map_refspec(const char *ref, + struct remote *remote, struct ref *local_refs) { + struct ref *matched = NULL; + + /* Does "ref" uniquely name our ref? */ + if (count_refspec_match(ref, local_refs, &matched) != 1) + return ref; + + if (remote->push) { + struct refspec query; + memset(&query, 0, sizeof(struct refspec)); + query.src = matched->name; + if (!query_refspecs(remote->push, remote->push_refspec_nr, &query) && + query.dst) { + struct strbuf buf = STRBUF_INIT; + strbuf_addf(&buf, "%s%s:%s", + query.force ? "+" : "", + query.src, query.dst); + return strbuf_detach(&buf, NULL); + } + } + + if (push_default == PUSH_DEFAULT_UPSTREAM && + starts_with(matched->name, "refs/heads/")) { + struct branch *branch = branch_get(matched->name + 11); + if (branch->merge_nr == 1 && branch->merge[0]->src) { + struct strbuf buf = STRBUF_INIT; + strbuf_addf(&buf, "%s:%s", + ref, branch->merge[0]->src); + return strbuf_detach(&buf, NULL); + } + } + + return ref; +} + +static void set_refspecs(const char **refs, int nr, const char *repo) +{ + struct remote *remote = NULL; + struct ref *local_refs = NULL; int i; + for (i = 0; i < nr; i++) { const char *ref = refs[i]; if (!strcmp("tag", ref)) { - char *tag; - int len; + struct strbuf tagref = STRBUF_INIT; if (nr <= ++i) die(_("tag shorthand without <tag>")); - len = strlen(refs[i]) + 11; - if (deleterefs) { - tag = xmalloc(len+1); - strcpy(tag, ":refs/tags/"); - } else { - tag = xmalloc(len); - strcpy(tag, "refs/tags/"); + ref = refs[i]; + if (deleterefs) + strbuf_addf(&tagref, ":refs/tags/%s", ref); + else + strbuf_addf(&tagref, "refs/tags/%s", ref); + ref = strbuf_detach(&tagref, NULL); + } else if (deleterefs) { + struct strbuf delref = STRBUF_INIT; + if (strchr(ref, ':')) + die(_("--delete only accepts plain target ref names")); + strbuf_addf(&delref, ":%s", ref); + ref = strbuf_detach(&delref, NULL); + } else if (!strchr(ref, ':')) { + if (!remote) { + /* lazily grab remote and local_refs */ + remote = remote_get(repo); + local_refs = get_local_heads(); } - strcat(tag, refs[i]); - ref = tag; - } else if (deleterefs && !strchr(ref, ':')) { - char *delref; - int len = strlen(ref)+1; - delref = xmalloc(len+1); - strcpy(delref, ":"); - strcat(delref, ref); - ref = delref; - } else if (deleterefs) - die(_("--delete only accepts plain target ref names")); + ref = map_refspec(ref, remote, local_refs); + } add_refspec(ref); } } @@ -164,9 +203,9 @@ static void setup_push_current(struct remote *remote, struct branch *branch) } static char warn_unspecified_push_default_msg[] = -N_("push.default is unset; its implicit value is changing in\n" +N_("push.default is unset; its implicit value has changed in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" - "and maintain the current behavior after the default changes, use:\n" + "and maintain the traditional behavior, use:\n" "\n" " git config --global push.default matching\n" "\n" @@ -174,6 +213,13 @@ N_("push.default is unset; its implicit value is changing in\n" "\n" " git config --global push.default simple\n" "\n" + "When push.default is set to 'matching', git will push local branches\n" + "to the remote branches that already exist with the same name.\n" + "\n" + "Since Git 2.0, Git defaults to the more conservative 'simple'\n" + "behavior, which only pushes the current branch to the corresponding\n" + "remote branch that 'git pull' uses to update the current branch.\n" + "\n" "See 'git help config' and search for 'push.default' for further information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" "'current' instead of 'simple' if you sometimes use older versions of Git)"); @@ -200,14 +246,14 @@ 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(":"); break; + case PUSH_DEFAULT_UNSPECIFIED: + warn_unspecified_push_default_configuration(); + /* fallthru */ + case PUSH_DEFAULT_SIMPLE: if (triangular) setup_push_current(remote, branch); @@ -236,12 +282,6 @@ static const char message_advice_pull_before_push[] = "'git pull ...') before pushing again.\n" "See the 'Note about fast-forwards' in 'git push --help' for details."); -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 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" "counterpart. Check out this branch and integrate the remote changes\n" @@ -270,13 +310,6 @@ static void advise_pull_before_push(void) advise(_(message_advice_pull_before_push)); } -static void advise_use_upstream(void) -{ - if (!advice_push_non_ff_default || !advice_push_update_rejected) - return; - advise(_(message_advice_use_upstream)); -} - static void advise_checkout_pull_push(void) { if (!advice_push_non_ff_matching || !advice_push_update_rejected) @@ -338,10 +371,7 @@ static int push_with_options(struct transport *transport, int flags) if (reject_reasons & REJECT_NON_FF_HEAD) { advise_pull_before_push(); } else if (reject_reasons & REJECT_NON_FF_OTHER) { - if (default_matching_used) - advise_use_upstream(); - else - advise_checkout_pull_push(); + advise_checkout_pull_push(); } else if (reject_reasons & REJECT_ALREADY_EXISTS) { advise_ref_already_exists(); } else if (reject_reasons & REJECT_FETCH_FIRST) { @@ -494,7 +524,7 @@ int cmd_push(int argc, const char **argv, const char *prefix) if (argc > 0) { repo = argv[0]; - set_refspecs(argv + 1, argc - 1); + set_refspecs(argv + 1, argc - 1, repo); } rc = do_push(repo, flags); diff --git a/builtin/read-tree.c b/builtin/read-tree.c index 0f5d7fe23f..0d7ef847a7 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -178,7 +178,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) if (1 < opts.index_only + opts.update) die("-u and -i at the same time makes no sense"); - if ((opts.update||opts.index_only) && !opts.merge) + if ((opts.update || opts.index_only) && !opts.merge) die("%s is meaningless without -m, --reset, or --prefix", opts.update ? "-u" : "-i"); if ((opts.dir && !opts.update)) diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 67ce1ef105..85bba356fa 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -13,6 +13,7 @@ #include "string-list.h" #include "sha1-array.h" #include "connected.h" +#include "argv-array.h" #include "version.h" static const char receive_pack_usage[] = "git receive-pack <git-dir>"; @@ -43,6 +44,8 @@ static int fix_thin = 1; static const char *head_name; static void *head_name_to_free; static int sent_capabilities; +static int shallow_update; +static const char *alt_shallow_file; static enum deny_action parse_deny_action(const char *var, const char *value) { @@ -121,6 +124,11 @@ static int receive_pack_config(const char *var, const char *value, void *cb) return 0; } + if (strcmp(var, "receive.shallowupdate") == 0) { + shallow_update = git_config_bool(var, value); + return 0; + } + return git_default_config(var, value, cb); } @@ -178,6 +186,8 @@ static void write_head_info(void) if (!sent_capabilities) show_ref("capabilities^{}", null_sha1); + advertise_shallow_grafts(1); + /* EOF */ packet_flush(1); } @@ -187,6 +197,7 @@ struct command { const char *error_string; unsigned int skip_update:1, did_not_exist:1; + int index; unsigned char old_sha1[20]; unsigned char new_sha1[20]; char ref_name[FLEX_ARRAY]; /* more */ @@ -418,7 +429,46 @@ static void refuse_unconfigured_deny_delete_current(void) rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]); } -static const char *update(struct command *cmd) +static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]); +static int update_shallow_ref(struct command *cmd, struct shallow_info *si) +{ + static struct lock_file shallow_lock; + struct sha1_array extra = SHA1_ARRAY_INIT; + const char *alt_file; + uint32_t mask = 1 << (cmd->index % 32); + int i; + + trace_printf_key("GIT_TRACE_SHALLOW", + "shallow: update_shallow_ref %s\n", cmd->ref_name); + for (i = 0; i < si->shallow->nr; i++) + if (si->used_shallow[i] && + (si->used_shallow[i][cmd->index / 32] & mask) && + !delayed_reachability_test(si, i)) + sha1_array_append(&extra, si->shallow->sha1[i]); + + setup_alternate_shallow(&shallow_lock, &alt_file, &extra); + if (check_shallow_connected(command_singleton_iterator, + 0, cmd, alt_file)) { + rollback_lock_file(&shallow_lock); + sha1_array_clear(&extra); + return -1; + } + + commit_lock_file(&shallow_lock); + + /* + * Make sure setup_alternate_shallow() for the next ref does + * not lose these new roots.. + */ + for (i = 0; i < extra.nr; i++) + register_shallow(extra.sha1[i]); + + si->shallow_ref[cmd->index] = 0; + sha1_array_clear(&extra); + return 0; +} + +static const char *update(struct command *cmd, struct shallow_info *si) { const char *name = cmd->ref_name; struct strbuf namespaced_name_buf = STRBUF_INIT; @@ -428,7 +478,7 @@ static const char *update(struct command *cmd) struct ref_lock *lock; /* only refs/... are allowed */ - if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) { + if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) { rp_error("refusing to create funny ref '%s' remotely", name); return "funny refname"; } @@ -459,7 +509,7 @@ static const char *update(struct command *cmd) } if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) { - if (deny_deletes && !prefixcmp(name, "refs/heads/")) { + if (deny_deletes && starts_with(name, "refs/heads/")) { rp_error("denying ref deletion for %s", name); return "deletion prohibited"; } @@ -483,7 +533,7 @@ static const char *update(struct command *cmd) if (deny_non_fast_forwards && !is_null_sha1(new_sha1) && !is_null_sha1(old_sha1) && - !prefixcmp(name, "refs/heads/")) { + starts_with(name, "refs/heads/")) { struct object *old_object, *new_object; struct commit *old_commit, *new_commit; @@ -526,6 +576,10 @@ static const char *update(struct command *cmd) return NULL; /* good */ } else { + if (shallow_update && si->shallow_ref[cmd->index] && + update_shallow_ref(cmd, si)) + return "shallow error"; + lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0, NULL); if (!lock) { @@ -666,12 +720,16 @@ static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]) return 0; } -static void set_connectivity_errors(struct command *commands) +static void set_connectivity_errors(struct command *commands, + struct shallow_info *si) { struct command *cmd; for (cmd = commands; cmd; cmd = cmd->next) { struct command *singleton = cmd; + if (shallow_update && si->shallow_ref[cmd->index]) + /* to be checked in update_shallow_ref() */ + continue; if (!check_everything_connected(command_singleton_iterator, 0, &singleton)) continue; @@ -679,18 +737,26 @@ static void set_connectivity_errors(struct command *commands) } } +struct iterate_data { + struct command *cmds; + struct shallow_info *si; +}; + static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20]) { - struct command **cmd_list = cb_data; + struct iterate_data *data = cb_data; + struct command **cmd_list = &data->cmds; struct command *cmd = *cmd_list; - while (cmd) { - if (!is_null_sha1(cmd->new_sha1)) { + for (; cmd; cmd = cmd->next) { + if (shallow_update && data->si->shallow_ref[cmd->index]) + /* to be checked in update_shallow_ref() */ + continue; + if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) { hashcpy(sha1, cmd->new_sha1); *cmd_list = cmd->next; return 0; } - cmd = cmd->next; } *cmd_list = NULL; return -1; /* end of list */ @@ -710,10 +776,14 @@ static void reject_updates_to_hidden(struct command *commands) } } -static void execute_commands(struct command *commands, const char *unpacker_error) +static void execute_commands(struct command *commands, + const char *unpacker_error, + struct shallow_info *si) { + int checked_connectivity; struct command *cmd; unsigned char sha1[20]; + struct iterate_data data; if (unpacker_error) { for (cmd = commands; cmd; cmd = cmd->next) @@ -721,10 +791,10 @@ static void execute_commands(struct command *commands, const char *unpacker_erro return; } - cmd = commands; - if (check_everything_connected(iterate_receive_command_list, - 0, &cmd)) - set_connectivity_errors(commands); + data.cmds = commands; + data.si = si; + if (check_everything_connected(iterate_receive_command_list, 0, &data)) + set_connectivity_errors(commands, si); reject_updates_to_hidden(commands); @@ -741,6 +811,7 @@ static void execute_commands(struct command *commands, const char *unpacker_erro free(head_name_to_free); head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL); + checked_connectivity = 1; for (cmd = commands; cmd; cmd = cmd->next) { if (cmd->error_string) continue; @@ -748,11 +819,26 @@ static void execute_commands(struct command *commands, const char *unpacker_erro if (cmd->skip_update) continue; - cmd->error_string = update(cmd); + cmd->error_string = update(cmd, si); + if (shallow_update && !cmd->error_string && + si->shallow_ref[cmd->index]) { + error("BUG: connectivity check has not been run on ref %s", + cmd->ref_name); + checked_connectivity = 0; + } + } + + if (shallow_update) { + if (!checked_connectivity) + error("BUG: run 'git fsck' for safety.\n" + "If there are errors, try to remove " + "the reported refs above"); + if (alt_shallow_file && *alt_shallow_file) + unlink(alt_shallow_file); } } -static struct command *read_head_info(void) +static struct command *read_head_info(struct sha1_array *shallow) { struct command *commands = NULL; struct command **p = &commands; @@ -766,6 +852,14 @@ static struct command *read_head_info(void) line = packet_read_line(0, &len); if (!line) break; + + if (len == 48 && starts_with(line, "shallow ")) { + if (get_sha1_hex(line + 8, old_sha1)) + die("protocol error: expected shallow sha, got '%s'", line + 8); + sha1_array_append(shallow, old_sha1); + continue; + } + if (len < 83 || line[40] != ' ' || line[81] != ' ' || @@ -817,11 +911,14 @@ static const char *parse_pack_header(struct pack_header *hdr) static const char *pack_lockfile; -static const char *unpack(int err_fd) +static const char *unpack(int err_fd, struct shallow_info *si) { struct pack_header hdr; + struct argv_array av = ARGV_ARRAY_INIT; const char *hdr_err; + int status; char hdr_arg[38]; + struct child_process child; int fsck_objects = (receive_fsck_objects >= 0 ? receive_fsck_objects : transfer_fsck_objects >= 0 @@ -838,72 +935,63 @@ static const char *unpack(int err_fd) "--pack_header=%"PRIu32",%"PRIu32, ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries)); + if (si->nr_ours || si->nr_theirs) { + alt_shallow_file = setup_temporary_shallow(si->shallow); + argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL); + } + + memset(&child, 0, sizeof(child)); if (ntohl(hdr.hdr_entries) < unpack_limit) { - int code, i = 0; - struct child_process child; - const char *unpacker[5]; - unpacker[i++] = "unpack-objects"; + argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL); if (quiet) - unpacker[i++] = "-q"; + argv_array_push(&av, "-q"); if (fsck_objects) - unpacker[i++] = "--strict"; - unpacker[i++] = hdr_arg; - unpacker[i++] = NULL; - memset(&child, 0, sizeof(child)); - child.argv = unpacker; + argv_array_push(&av, "--strict"); + child.argv = av.argv; 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"; + status = run_command(&child); + if (status) + return "unpack-objects abnormal exit"; } else { - const char *keeper[7]; - int s, status, i = 0; + int s; char keep_arg[256]; - struct child_process ip; s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid()); if (gethostname(keep_arg + s, sizeof(keep_arg) - s)) strcpy(keep_arg + s, "localhost"); - keeper[i++] = "index-pack"; - keeper[i++] = "--stdin"; + argv_array_pushl(&av, "index-pack", + "--stdin", hdr_arg, keep_arg, NULL); if (fsck_objects) - keeper[i++] = "--strict"; + argv_array_push(&av, "--strict"); if (fix_thin) - keeper[i++] = "--fix-thin"; - keeper[i++] = hdr_arg; - keeper[i++] = keep_arg; - keeper[i++] = NULL; - 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) { + argv_array_push(&av, "--fix-thin"); + child.argv = av.argv; + child.out = -1; + child.err = err_fd; + child.git_cmd = 1; + status = start_command(&child); + if (status) return "index-pack fork failed"; - } - pack_lockfile = index_pack_lockfile(ip.out); - close(ip.out); - status = finish_command(&ip); - if (!status) { - reprepare_packed_git(); - return NULL; - } - return "index-pack abnormal exit"; + pack_lockfile = index_pack_lockfile(child.out); + close(child.out); + status = finish_command(&child); + if (status) + return "index-pack abnormal exit"; + reprepare_packed_git(); } + return NULL; } -static const char *unpack_with_sideband(void) +static const char *unpack_with_sideband(struct shallow_info *si) { struct async muxer; const char *ret; if (!use_sideband) - return unpack(0); + return unpack(0, si); memset(&muxer, 0, sizeof(muxer)); muxer.proc = copy_to_sideband; @@ -911,12 +999,101 @@ static const char *unpack_with_sideband(void) if (start_async(&muxer)) return NULL; - ret = unpack(muxer.in); + ret = unpack(muxer.in, si); finish_async(&muxer); return ret; } +static void prepare_shallow_update(struct command *commands, + struct shallow_info *si) +{ + int i, j, k, bitmap_size = (si->ref->nr + 31) / 32; + + si->used_shallow = xmalloc(sizeof(*si->used_shallow) * + si->shallow->nr); + assign_shallow_commits_to_refs(si, si->used_shallow, NULL); + + si->need_reachability_test = + xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test)); + si->reachable = + xcalloc(si->shallow->nr, sizeof(*si->reachable)); + si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref)); + + for (i = 0; i < si->nr_ours; i++) + si->need_reachability_test[si->ours[i]] = 1; + + for (i = 0; i < si->shallow->nr; i++) { + if (!si->used_shallow[i]) + continue; + for (j = 0; j < bitmap_size; j++) { + if (!si->used_shallow[i][j]) + continue; + si->need_reachability_test[i]++; + for (k = 0; k < 32; k++) + if (si->used_shallow[i][j] & (1 << k)) + si->shallow_ref[j * 32 + k]++; + } + + /* + * true for those associated with some refs and belong + * in "ours" list aka "step 7 not done yet" + */ + si->need_reachability_test[i] = + si->need_reachability_test[i] > 1; + } + + /* + * keep hooks happy by forcing a temporary shallow file via + * env variable because we can't add --shallow-file to every + * command. check_everything_connected() will be done with + * true .git/shallow though. + */ + setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1); +} + +static void update_shallow_info(struct command *commands, + struct shallow_info *si, + struct sha1_array *ref) +{ + struct command *cmd; + int *ref_status; + remove_nonexistent_theirs_shallow(si); + if (!si->nr_ours && !si->nr_theirs) { + shallow_update = 0; + return; + } + + for (cmd = commands; cmd; cmd = cmd->next) { + if (is_null_sha1(cmd->new_sha1)) + continue; + sha1_array_append(ref, cmd->new_sha1); + cmd->index = ref->nr - 1; + } + si->ref = ref; + + if (shallow_update) { + prepare_shallow_update(commands, si); + return; + } + + ref_status = xmalloc(sizeof(*ref_status) * ref->nr); + assign_shallow_commits_to_refs(si, NULL, ref_status); + for (cmd = commands; cmd; cmd = cmd->next) { + if (is_null_sha1(cmd->new_sha1)) + continue; + if (ref_status[cmd->index]) { + cmd->error_string = "shallow update not allowed"; + cmd->skip_update = 1; + } + } + if (alt_shallow_file && *alt_shallow_file) { + unlink(alt_shallow_file); + alt_shallow_file = NULL; + } + free(ref_status); +} + static void report(struct command *commands, const char *unpack_status) { struct command *cmd; @@ -958,6 +1135,9 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) int i; char *dir = NULL; struct command *commands; + struct sha1_array shallow = SHA1_ARRAY_INIT; + struct sha1_array ref = SHA1_ARRAY_INIT; + struct shallow_info si; packet_trace_identity("receive-pack"); @@ -998,9 +1178,6 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) if (!enter_repo(dir, 0)) die("'%s' does not appear to be a git repository", dir); - if (is_repository_shallow()) - die("attempt to push into a shallow repository"); - git_config(receive_pack_config, NULL); if (0 <= transfer_unpack_limit) @@ -1014,12 +1191,17 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) if (advertise_refs) return 0; - if ((commands = read_head_info()) != NULL) { + if ((commands = read_head_info(&shallow)) != NULL) { const char *unpack_status = NULL; - if (!delete_only(commands)) - unpack_status = unpack_with_sideband(); - execute_commands(commands, unpack_status); + prepare_shallow_info(&si, &shallow); + if (!si.nr_ours && !si.nr_theirs) + shallow_update = 0; + if (!delete_only(commands)) { + unpack_status = unpack_with_sideband(&si); + update_shallow_info(commands, &si, &ref); + } + execute_commands(commands, unpack_status, &si); if (pack_lockfile) unlink_or_warn(pack_lockfile); if (report_status) @@ -1035,8 +1217,11 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) } if (auto_update_server_info) update_server_info(0); + clear_shallow_info(&si); } if (use_sideband) packet_flush(1); + sha1_array_clear(&shallow); + sha1_array_clear(&ref); return 0; } diff --git a/builtin/reflog.c b/builtin/reflog.c index 6eb24c8da2..c12a9784e6 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -561,7 +561,7 @@ static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, c return; /* both given explicitly -- nothing to tweak */ for (ent = reflog_expire_cfg; ent; ent = ent->next) { - if (!fnmatch(ent->pattern, ref, 0)) { + if (!wildmatch(ent->pattern, ref, 0, NULL)) { if (!(slot & EXPIRE_TOTAL)) cb->expire_total = ent->expire_total; if (!(slot & EXPIRE_UNREACH)) @@ -610,12 +610,12 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) const char *arg = argv[i]; if (!strcmp(arg, "--dry-run") || !strcmp(arg, "-n")) cb.dry_run = 1; - else if (!prefixcmp(arg, "--expire=")) { + else if (starts_with(arg, "--expire=")) { if (parse_expiry_date(arg + 9, &cb.expire_total)) die(_("'%s' is not a valid timestamp"), arg); explicit_expiry |= EXPIRE_TOTAL; } - else if (!prefixcmp(arg, "--expire-unreachable=")) { + else if (starts_with(arg, "--expire-unreachable=")) { if (parse_expiry_date(arg + 21, &cb.expire_unreachable)) die(_("'%s' is not a valid timestamp"), arg); explicit_expiry |= EXPIRE_UNREACH; diff --git a/builtin/remote.c b/builtin/remote.c index 4e14891095..b3ab4cf8f6 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -6,6 +6,7 @@ #include "strbuf.h" #include "run-command.h" #include "refs.h" +#include "argv-array.h" static const char * const builtin_remote_usage[] = { N_("git remote [-v | --verbose]"), @@ -77,17 +78,6 @@ static const char * const builtin_remote_seturl_usage[] = { static int verbose; -static int show_all(void); -static int prune_remote(const char *remote, int dry_run); - -static inline int postfixcmp(const char *string, const char *postfix) -{ - int len1 = strlen(string), len2 = strlen(postfix); - if (len1 < len2) - return 1; - return strcmp(string + len1 - len2, postfix); -} - static int fetch_remote(const char *name) { const char *argv[] = { "fetch", name, NULL, NULL }; @@ -269,7 +259,7 @@ static const char *abbrev_ref(const char *name, const char *prefix) static int config_read_branches(const char *key, const char *value, void *cb) { - if (!prefixcmp(key, "branch.")) { + if (starts_with(key, "branch.")) { const char *orig_key = key; char *name; struct string_list_item *item; @@ -277,13 +267,13 @@ static int config_read_branches(const char *key, const char *value, void *cb) enum { REMOTE, MERGE, REBASE } type; key += 7; - if (!postfixcmp(key, ".remote")) { + if (ends_with(key, ".remote")) { name = xstrndup(key, strlen(key) - 7); type = REMOTE; - } else if (!postfixcmp(key, ".merge")) { + } else if (ends_with(key, ".merge")) { name = xstrndup(key, strlen(key) - 6); type = MERGE; - } else if (!postfixcmp(key, ".rebase")) { + } else if (ends_with(key, ".rebase")) { name = xstrndup(key, strlen(key) - 7); type = REBASE; } else @@ -309,8 +299,13 @@ static int config_read_branches(const char *key, const char *value, void *cb) space = strchr(value, ' '); } string_list_append(&info->merge, xstrdup(value)); - } else - info->rebase = git_config_bool(orig_key, value); + } else { + int v = git_config_maybe_bool(orig_key, value); + if (v >= 0) + info->rebase = v; + else if (!strcmp(value, "preserve")) + info->rebase = 1; + } } return 0; } @@ -534,9 +529,9 @@ static int add_branch_for_removal(const char *refname, } /* don't delete non-remote-tracking refs */ - if (prefixcmp(refname, "refs/remotes/")) { + if (!starts_with(refname, "refs/remotes/")) { /* advise user how to delete local branches */ - if (!prefixcmp(refname, "refs/heads/")) + if (starts_with(refname, "refs/heads/")) string_list_append(branches->skipped, abbrev_branch(refname)); /* silently skip over other non-remote refs */ @@ -571,7 +566,7 @@ static int read_remote_branches(const char *refname, const char *symref; strbuf_addf(&buf, "refs/remotes/%s/", rename->old); - if (!prefixcmp(refname, buf.buf)) { + if (starts_with(refname, buf.buf)) { item = string_list_append(rename->remote_branches, xstrdup(refname)); symref = resolve_ref_unsafe(refname, orig_sha1, 1, &flag); if (flag & REF_ISSYMREF) @@ -1084,6 +1079,64 @@ static int show_push_info_item(struct string_list_item *item, void *cb_data) return 0; } +static int get_one_entry(struct remote *remote, void *priv) +{ + struct string_list *list = priv; + struct strbuf url_buf = STRBUF_INIT; + const char **url; + int i, url_nr; + + if (remote->url_nr > 0) { + strbuf_addf(&url_buf, "%s (fetch)", remote->url[0]); + string_list_append(list, remote->name)->util = + strbuf_detach(&url_buf, NULL); + } else + string_list_append(list, remote->name)->util = NULL; + if (remote->pushurl_nr) { + url = remote->pushurl; + url_nr = remote->pushurl_nr; + } else { + url = remote->url; + url_nr = remote->url_nr; + } + for (i = 0; i < url_nr; i++) + { + strbuf_addf(&url_buf, "%s (push)", url[i]); + string_list_append(list, remote->name)->util = + strbuf_detach(&url_buf, NULL); + } + + return 0; +} + +static int show_all(void) +{ + struct string_list list = STRING_LIST_INIT_NODUP; + int result; + + list.strdup_strings = 1; + result = for_each_remote(get_one_entry, &list); + + if (!result) { + int i; + + sort_string_list(&list); + for (i = 0; i < list.nr; i++) { + struct string_list_item *item = list.items + i; + if (verbose) + printf("%s\t%s\n", item->string, + item->util ? (const char *)item->util : ""); + else { + if (i && !strcmp((item - 1)->string, item->string)) + continue; + printf("%s\n", item->string); + } + } + } + string_list_clear(&list, 1); + return result; +} + static int show(int argc, const char **argv) { int no_query = 0, result = 0, query_flag = 0; @@ -1246,26 +1299,6 @@ static int set_head(int argc, const char **argv) return result; } -static int prune(int argc, const char **argv) -{ - int dry_run = 0, result = 0; - struct option options[] = { - OPT__DRY_RUN(&dry_run, N_("dry run")), - OPT_END() - }; - - argc = parse_options(argc, argv, NULL, options, builtin_remote_prune_usage, - 0); - - if (argc < 1) - usage_with_options(builtin_remote_prune_usage, options); - - for (; argc; argc--, argv++) - result |= prune_remote(*argv, dry_run); - - return result; -} - static int prune_remote(const char *remote, int dry_run) { int result = 0, i; @@ -1304,6 +1337,26 @@ static int prune_remote(const char *remote, int dry_run) return result; } +static int prune(int argc, const char **argv) +{ + int dry_run = 0, result = 0; + struct option options[] = { + OPT__DRY_RUN(&dry_run, N_("dry run")), + OPT_END() + }; + + argc = parse_options(argc, argv, NULL, options, builtin_remote_prune_usage, + 0); + + if (argc < 1) + usage_with_options(builtin_remote_prune_usage, options); + + for (; argc; argc--, argv++) + result |= prune_remote(*argv, dry_run); + + return result; +} + static int get_remote_default(const char *key, const char *value, void *priv) { if (strcmp(key, "remotes.default") == 0) { @@ -1315,42 +1368,42 @@ static int get_remote_default(const char *key, const char *value, void *priv) static int update(int argc, const char **argv) { - int i, prune = 0; + int i, prune = -1; struct option options[] = { OPT_BOOL('p', "prune", &prune, N_("prune remotes after fetching")), OPT_END() }; - const char **fetch_argv; - int fetch_argc = 0; + struct argv_array fetch_argv = ARGV_ARRAY_INIT; int default_defined = 0; - - fetch_argv = xmalloc(sizeof(char *) * (argc+5)); + int retval; argc = parse_options(argc, argv, NULL, options, builtin_remote_update_usage, PARSE_OPT_KEEP_ARGV0); - fetch_argv[fetch_argc++] = "fetch"; + argv_array_push(&fetch_argv, "fetch"); - if (prune) - fetch_argv[fetch_argc++] = "--prune"; + if (prune != -1) + argv_array_push(&fetch_argv, prune ? "--prune" : "--no-prune"); if (verbose) - fetch_argv[fetch_argc++] = "-v"; - fetch_argv[fetch_argc++] = "--multiple"; + argv_array_push(&fetch_argv, "-v"); + argv_array_push(&fetch_argv, "--multiple"); if (argc < 2) - fetch_argv[fetch_argc++] = "default"; + argv_array_push(&fetch_argv, "default"); for (i = 1; i < argc; i++) - fetch_argv[fetch_argc++] = argv[i]; + argv_array_push(&fetch_argv, argv[i]); - if (strcmp(fetch_argv[fetch_argc-1], "default") == 0) { + if (strcmp(fetch_argv.argv[fetch_argv.argc-1], "default") == 0) { git_config(get_remote_default, &default_defined); - if (!default_defined) - fetch_argv[fetch_argc-1] = "--all"; + if (!default_defined) { + argv_array_pop(&fetch_argv); + argv_array_push(&fetch_argv, "--all"); + } } - fetch_argv[fetch_argc] = NULL; - - return run_command_v_opt(fetch_argv, RUN_GIT_CMD); + retval = run_command_v_opt(fetch_argv.argv, RUN_GIT_CMD); + argv_array_clear(&fetch_argv); + return retval; } static int remove_all_fetch_refspecs(const char *remote, const char *key) @@ -1505,64 +1558,6 @@ static int set_url(int argc, const char **argv) return 0; } -static int get_one_entry(struct remote *remote, void *priv) -{ - struct string_list *list = priv; - struct strbuf url_buf = STRBUF_INIT; - const char **url; - int i, url_nr; - - if (remote->url_nr > 0) { - strbuf_addf(&url_buf, "%s (fetch)", remote->url[0]); - string_list_append(list, remote->name)->util = - strbuf_detach(&url_buf, NULL); - } else - string_list_append(list, remote->name)->util = NULL; - if (remote->pushurl_nr) { - url = remote->pushurl; - url_nr = remote->pushurl_nr; - } else { - url = remote->url; - url_nr = remote->url_nr; - } - for (i = 0; i < url_nr; i++) - { - strbuf_addf(&url_buf, "%s (push)", url[i]); - string_list_append(list, remote->name)->util = - strbuf_detach(&url_buf, NULL); - } - - return 0; -} - -static int show_all(void) -{ - struct string_list list = STRING_LIST_INIT_NODUP; - int result; - - list.strdup_strings = 1; - result = for_each_remote(get_one_entry, &list); - - if (!result) { - int i; - - sort_string_list(&list); - for (i = 0; i < list.nr; i++) { - struct string_list_item *item = list.items + i; - if (verbose) - printf("%s\t%s\n", item->string, - item->util ? (const char *)item->util : ""); - else { - if (i && !strcmp((item - 1)->string, item->string)) - continue; - printf("%s\n", item->string); - } - } - } - string_list_clear(&list, 1); - return result; -} - int cmd_remote(int argc, const char **argv, const char *prefix) { struct option options[] = { diff --git a/builtin/repack.c b/builtin/repack.c index a0ff5c704f..49f5857627 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -78,7 +78,7 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list) return; while ((e = readdir(dir)) != NULL) { - if (suffixcmp(e->d_name, ".pack")) + if (!ends_with(e->d_name, ".pack")) continue; len = strlen(e->d_name) - strlen(".pack"); @@ -94,7 +94,7 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list) static void remove_redundant_pack(const char *dir_name, const char *base_name) { - const char *exts[] = {".pack", ".idx", ".keep"}; + const char *exts[] = {".pack", ".idx", ".keep", ".bitmap"}; int i; struct strbuf buf = STRBUF_INIT; size_t plen; @@ -115,7 +115,14 @@ static void remove_redundant_pack(const char *dir_name, const char *base_name) int cmd_repack(int argc, const char **argv, const char *prefix) { - const char *exts[2] = {".pack", ".idx"}; + struct { + const char *name; + unsigned optional:1; + } exts[] = { + {".pack"}, + {".idx"}, + {".bitmap", 1}, + }; struct child_process cmd; struct string_list_item *item; struct argv_array cmd_args = ARGV_ARRAY_INIT; @@ -123,20 +130,21 @@ int cmd_repack(int argc, const char **argv, const char *prefix) struct string_list rollback = STRING_LIST_INIT_NODUP; struct string_list existing_packs = STRING_LIST_INIT_DUP; struct strbuf line = STRBUF_INIT; - int nr_packs, ext, ret, failed; + int ext, ret, failed; FILE *out; /* variables to be filled by option parsing */ int pack_everything = 0; int delete_redundant = 0; - char *unpack_unreachable = NULL; - int window = 0, window_memory = 0; - int depth = 0; - int max_pack_size = 0; + const char *unpack_unreachable = NULL; + const char *window = NULL, *window_memory = NULL; + const char *depth = NULL; + const char *max_pack_size = NULL; int no_reuse_delta = 0, no_reuse_object = 0; int no_update_server_info = 0; int quiet = 0; int local = 0; + int write_bitmap = -1; struct option builtin_repack_options[] = { OPT_BIT('a', NULL, &pack_everything, @@ -155,15 +163,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix) OPT__QUIET(&quiet, N_("be quiet")), OPT_BOOL('l', "local", &local, N_("pass --local to git-pack-objects")), + OPT_BOOL('b', "write-bitmap-index", &write_bitmap, + N_("write bitmap index")), OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"), N_("with -A, do not loosen objects older than this")), - OPT_INTEGER(0, "window", &window, + OPT_STRING(0, "window", &window, N_("n"), N_("size of the window used for delta compression")), - OPT_INTEGER(0, "window-memory", &window_memory, + OPT_STRING(0, "window-memory", &window_memory, N_("bytes"), N_("same as the above, but limit memory size instead of entries count")), - OPT_INTEGER(0, "depth", &depth, + OPT_STRING(0, "depth", &depth, N_("n"), N_("limits the maximum delta depth")), - OPT_INTEGER(0, "max-pack-size", &max_pack_size, + OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"), N_("maximum size of each packfile")), OPT_END() }; @@ -185,17 +195,20 @@ int cmd_repack(int argc, const char **argv, const char *prefix) argv_array_push(&cmd_args, "--all"); argv_array_push(&cmd_args, "--reflog"); if (window) - argv_array_pushf(&cmd_args, "--window=%u", window); + argv_array_pushf(&cmd_args, "--window=%s", window); if (window_memory) - argv_array_pushf(&cmd_args, "--window-memory=%u", window_memory); + argv_array_pushf(&cmd_args, "--window-memory=%s", window_memory); if (depth) - argv_array_pushf(&cmd_args, "--depth=%u", depth); + argv_array_pushf(&cmd_args, "--depth=%s", depth); if (max_pack_size) - argv_array_pushf(&cmd_args, "--max_pack_size=%u", max_pack_size); + argv_array_pushf(&cmd_args, "--max-pack-size=%s", max_pack_size); if (no_reuse_delta) argv_array_pushf(&cmd_args, "--no-reuse-delta"); if (no_reuse_object) argv_array_pushf(&cmd_args, "--no-reuse-object"); + if (write_bitmap >= 0) + argv_array_pushf(&cmd_args, "--%swrite-bitmap-index", + write_bitmap ? "" : "no-"); if (pack_everything & ALL_INTO_ONE) { get_non_kept_pack_filenames(&existing_packs); @@ -233,13 +246,11 @@ int cmd_repack(int argc, const char **argv, const char *prefix) if (ret) return ret; - nr_packs = 0; out = xfdopen(cmd.out, "r"); while (strbuf_getline(&line, out, '\n') != EOF) { if (line.len != 40) die("repack: Expecting 40 character sha1 lines only from pack-objects."); string_list_append(&names, line.buf); - nr_packs++; } fclose(out); ret = finish_command(&cmd); @@ -247,7 +258,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) return ret; argv_array_clear(&cmd_args); - if (!nr_packs && !quiet) + if (!names.nr && !quiet) printf("Nothing new to pack.\n"); /* @@ -258,17 +269,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix) */ failed = 0; for_each_string_list_item(item, &names) { - for (ext = 0; ext < 2; ext++) { + for (ext = 0; ext < ARRAY_SIZE(exts); ext++) { char *fname, *fname_old; - fname = mkpathdup("%s/%s%s", packdir, - item->string, exts[ext]); + fname = mkpathdup("%s/pack-%s%s", packdir, + item->string, exts[ext].name); if (!file_exists(fname)) { free(fname); continue; } fname_old = mkpath("%s/old-%s%s", packdir, - item->string, exts[ext]); + item->string, exts[ext].name); if (file_exists(fname_old)) if (unlink(fname_old)) failed = 1; @@ -315,19 +326,23 @@ int cmd_repack(int argc, const char **argv, const char *prefix) /* Now the ones with the same name are out of the way... */ for_each_string_list_item(item, &names) { - for (ext = 0; ext < 2; ext++) { + for (ext = 0; ext < ARRAY_SIZE(exts); ext++) { char *fname, *fname_old; struct stat statbuffer; + int exists = 0; fname = mkpathdup("%s/pack-%s%s", - packdir, item->string, exts[ext]); + packdir, item->string, exts[ext].name); fname_old = mkpathdup("%s-%s%s", - packtmp, item->string, exts[ext]); + packtmp, item->string, exts[ext].name); if (!stat(fname_old, &statbuffer)) { statbuffer.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); chmod(fname_old, statbuffer.st_mode); + exists = 1; + } + if (exists || !exts[ext].optional) { + if (rename(fname_old, fname)) + die_errno(_("renaming '%s' failed"), fname_old); } - if (rename(fname_old, fname)) - die_errno(_("renaming '%s' failed"), fname_old); free(fname); free(fname_old); } @@ -335,12 +350,12 @@ int cmd_repack(int argc, const char **argv, const char *prefix) /* Remove the "old-" files */ for_each_string_list_item(item, &names) { - for (ext = 0; ext < 2; ext++) { + for (ext = 0; ext < ARRAY_SIZE(exts); ext++) { char *fname; - fname = mkpath("%s/old-pack-%s%s", + fname = mkpath("%s/old-%s%s", packdir, item->string, - exts[ext]); + exts[ext].name); if (remove_path(fname)) warning(_("removing '%s' failed"), fname); } diff --git a/builtin/replace.c b/builtin/replace.c index b1bd3ef994..b62420a01a 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -16,27 +16,69 @@ static const char * const git_replace_usage[] = { N_("git replace [-f] <object> <replacement>"), N_("git replace -d <object>..."), - N_("git replace -l [<pattern>]"), + N_("git replace [--format=<format>] [-l [<pattern>]]"), NULL }; +enum replace_format { + REPLACE_FORMAT_SHORT, + REPLACE_FORMAT_MEDIUM, + REPLACE_FORMAT_LONG +}; + +struct show_data { + const char *pattern; + enum replace_format format; +}; + static int show_reference(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { - const char *pattern = cb_data; + struct show_data *data = cb_data; - if (!fnmatch(pattern, refname, 0)) - printf("%s\n", refname); + if (!wildmatch(data->pattern, refname, 0, NULL)) { + if (data->format == REPLACE_FORMAT_SHORT) + printf("%s\n", refname); + else if (data->format == REPLACE_FORMAT_MEDIUM) + printf("%s -> %s\n", refname, sha1_to_hex(sha1)); + else { /* data->format == REPLACE_FORMAT_LONG */ + unsigned char object[20]; + enum object_type obj_type, repl_type; + + if (get_sha1(refname, object)) + return error("Failed to resolve '%s' as a valid ref.", refname); + + obj_type = sha1_object_info(object, NULL); + repl_type = sha1_object_info(sha1, NULL); + + printf("%s (%s) -> %s (%s)\n", refname, typename(obj_type), + sha1_to_hex(sha1), typename(repl_type)); + } + } return 0; } -static int list_replace_refs(const char *pattern) +static int list_replace_refs(const char *pattern, const char *format) { + struct show_data data; + if (pattern == NULL) pattern = "*"; + data.pattern = pattern; - for_each_replace_ref(show_reference, (void *) pattern); + if (format == NULL || *format == '\0' || !strcmp(format, "short")) + data.format = REPLACE_FORMAT_SHORT; + else if (!strcmp(format, "medium")) + data.format = REPLACE_FORMAT_MEDIUM; + else if (!strcmp(format, "long")) + data.format = REPLACE_FORMAT_LONG; + else + die("invalid replace format '%s'\n" + "valid formats are 'short', 'medium' and 'long'\n", + format); + + for_each_replace_ref(show_reference, (void *) &data); return 0; } @@ -127,19 +169,27 @@ static int replace_object(const char *object_ref, const char *replace_ref, int cmd_replace(int argc, const char **argv, const char *prefix) { int list = 0, delete = 0, force = 0; + const char *format = NULL; struct option options[] = { OPT_BOOL('l', "list", &list, N_("list replace refs")), OPT_BOOL('d', "delete", &delete, N_("delete replace refs")), OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")), + OPT_STRING(0, "format", &format, N_("format"), N_("use this format")), OPT_END() }; + check_replace_refs = 0; + argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0); if (list && delete) usage_msg_opt("-l and -d cannot be used together", git_replace_usage, options); + if (format && delete) + usage_msg_opt("--format and -d cannot be used together", + git_replace_usage, options); + if (force && (list || delete)) usage_msg_opt("-f cannot be used with -d or -l", git_replace_usage, options); @@ -157,6 +207,9 @@ int cmd_replace(int argc, const char **argv, const char *prefix) if (argc != 2) usage_msg_opt("bad number of arguments", git_replace_usage, options); + if (format) + usage_msg_opt("--format cannot be used when not listing", + git_replace_usage, options); return replace_object(argv[0], argv[1], force); } @@ -168,5 +221,5 @@ int cmd_replace(int argc, const char **argv, const char *prefix) usage_msg_opt("-f needs some arguments", git_replace_usage, options); - return list_replace_refs(argv[0]); + return list_replace_refs(argv[0], format); } diff --git a/builtin/reset.c b/builtin/reset.c index f2f9d55392..f4e087596b 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -116,25 +116,34 @@ static void update_index_from_diff(struct diff_queue_struct *q, struct diff_options *opt, void *data) { int i; + int intent_to_add = *(int *)data; for (i = 0; i < q->nr; i++) { struct diff_filespec *one = q->queue[i]->one; - if (one->mode && !is_null_sha1(one->sha1)) { - struct cache_entry *ce; - ce = make_cache_entry(one->mode, one->sha1, one->path, - 0, 0); - if (!ce) - die(_("make_cache_entry failed for path '%s'"), - one->path); - add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | - ADD_CACHE_OK_TO_REPLACE); - } else + int is_missing = !(one->mode && !is_null_sha1(one->sha1)); + struct cache_entry *ce; + + if (is_missing && !intent_to_add) { remove_file_from_cache(one->path); + continue; + } + + ce = make_cache_entry(one->mode, one->sha1, one->path, + 0, 0); + if (!ce) + die(_("make_cache_entry failed for path '%s'"), + one->path); + if (is_missing) { + ce->ce_flags |= CE_INTENT_TO_ADD; + set_object_name_for_intent_to_add_entry(ce); + } + add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); } } static int read_from_tree(const struct pathspec *pathspec, - unsigned char *tree_sha1) + unsigned char *tree_sha1, + int intent_to_add) { struct diff_options opt; @@ -142,6 +151,7 @@ static int read_from_tree(const struct pathspec *pathspec, copy_pathspec(&opt.pathspec, pathspec); opt.output_format = DIFF_FORMAT_CALLBACK; opt.format_callback = update_index_from_diff; + opt.format_callback_data = &intent_to_add; if (do_diff_cache(tree_sha1, &opt)) return 1; @@ -258,6 +268,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) const char *rev; unsigned char sha1[20]; struct pathspec pathspec; + int intent_to_add = 0; const struct option options[] = { OPT__QUIET(&quiet, N_("be quiet, only report errors")), OPT_SET_INT(0, "mixed", &reset_type, @@ -270,6 +281,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix) OPT_SET_INT(0, "keep", &reset_type, N_("reset HEAD but keep local changes"), KEEP), OPT_BOOL('p', "patch", &patch_mode, N_("select hunks interactively")), + OPT_BOOL('N', "intent-to-add", &intent_to_add, + N_("record only the fact that removed paths will be added later")), OPT_END() }; @@ -304,7 +317,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (patch_mode) { if (reset_type != NONE) die(_("--patch is incompatible with --{hard,mixed,soft}")); - return run_add_interactive(sha1_to_hex(sha1), "--patch=reset", &pathspec); + return run_add_interactive(rev, "--patch=reset", &pathspec); } /* git reset tree [--] paths... can be used to @@ -320,13 +333,16 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type == NONE) reset_type = MIXED; /* by default */ - if (reset_type != SOFT && reset_type != MIXED) + if (reset_type != SOFT && (reset_type != MIXED || get_git_work_tree())) setup_work_tree(); if (reset_type == MIXED && is_bare_repository()) die(_("%s reset is not allowed in a bare repository"), _(reset_type_names[reset_type])); + if (intent_to_add && reset_type != MIXED) + die(_("-N can only be used with --mixed")); + /* Soft reset does not touch the index file nor the working tree * at all, but requires them in a good order. Other resets reset * the index file to the tree object we are switching to. */ @@ -338,10 +354,11 @@ int cmd_reset(int argc, const char **argv, const char *prefix) int newfd = hold_locked_index(lock, 1); if (reset_type == MIXED) { int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN; - if (read_from_tree(&pathspec, sha1)) + if (read_from_tree(&pathspec, sha1, intent_to_add)) return 1; - refresh_index(&the_index, flags, NULL, NULL, - _("Unstaged changes after reset:")); + if (get_git_work_tree()) + refresh_index(&the_index, flags, NULL, NULL, + _("Unstaged changes after reset:")); } else { int err = reset_index(sha1, reset_type, quiet); if (reset_type == KEEP && !err) diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 4fc1616637..9f92905379 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -3,6 +3,8 @@ #include "diff.h" #include "revision.h" #include "list-objects.h" +#include "pack.h" +#include "pack-bitmap.h" #include "builtin.h" #include "log-tree.h" #include "graph.h" @@ -257,6 +259,18 @@ static int show_bisect_vars(struct rev_list_info *info, int reaches, int all) return 0; } +static int show_object_fast( + const unsigned char *sha1, + enum object_type type, + int exclude, + uint32_t name_hash, + struct packed_git *found_pack, + off_t found_offset) +{ + fprintf(stdout, "%s\n", sha1_to_hex(sha1)); + return 1; +} + int cmd_rev_list(int argc, const char **argv, const char *prefix) { struct rev_info revs; @@ -265,6 +279,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) int bisect_list = 0; int bisect_show_vars = 0; int bisect_find_all = 0; + int use_bitmap_index = 0; git_config(git_default_config, NULL); init_revisions(&revs, prefix); @@ -306,6 +321,14 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) bisect_show_vars = 1; continue; } + if (!strcmp(arg, "--use-bitmap-index")) { + use_bitmap_index = 1; + continue; + } + if (!strcmp(arg, "--test-bitmap")) { + test_bitmap_walk(&revs); + return 0; + } usage(rev_list_usage); } @@ -322,7 +345,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) revs.commit_format = CMIT_FMT_RAW; if ((!revs.commits && - (!(revs.tag_objects||revs.tree_objects||revs.blob_objects) && + (!(revs.tag_objects || revs.tree_objects || revs.blob_objects) && !revs.pending.nr)) || revs.diff) usage(rev_list_usage); @@ -333,6 +356,22 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) if (bisect_list) revs.limited = 1; + if (use_bitmap_index) { + if (revs.count && !revs.left_right && !revs.cherry_mark) { + uint32_t commit_count; + if (!prepare_bitmap_walk(&revs)) { + count_bitmap_commit_list(&commit_count, NULL, NULL, NULL); + printf("%d\n", commit_count); + return 0; + } + } else if (revs.tag_objects && revs.tree_objects && revs.blob_objects) { + if (!prepare_bitmap_walk(&revs)) { + traverse_bitmap_commit_list(&show_object_fast); + return 0; + } + } + } + if (prepare_revision_walk(&revs)) die("revision walk setup failed"); if (revs.tree_objects) diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index c76b89dc5b..45901df371 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -9,6 +9,8 @@ #include "quote.h" #include "builtin.h" #include "parse-options.h" +#include "diff.h" +#include "revision.h" #define DO_REVS 1 #define DO_NOREV 2 @@ -30,6 +32,9 @@ static int abbrev_ref; static int abbrev_ref_strict; static int output_sq; +static int stuck_long; +static struct string_list *ref_excludes; + /* * Some arguments are relevant "revision" arguments, * others are about output format or other details. @@ -185,6 +190,8 @@ static int show_default(void) static int show_reference(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { + if (ref_excluded(ref_excludes, refname)) + return 0; show_rev(NORMAL, sha1, refname); return 0; } @@ -279,6 +286,7 @@ static int try_difference(const char *arg) exclude = n; } } + *dotdot = '.'; return 1; } *dotdot = '.'; @@ -302,8 +310,10 @@ static int try_parent_shorthands(const char *arg) return 0; *dotdot = 0; - if (get_sha1_committish(arg, sha1)) + if (get_sha1_committish(arg, sha1)) { + *dotdot = '^'; return 0; + } if (!parents_only) show_rev(NORMAL, sha1, arg); @@ -312,6 +322,7 @@ static int try_parent_shorthands(const char *arg) show_rev(parents_only ? NORMAL : REVERSED, parents->item->object.sha1, arg); + *dotdot = '^'; return 1; } @@ -320,12 +331,15 @@ static int parseopt_dump(const struct option *o, const char *arg, int unset) struct strbuf *parsed = o->value; if (unset) strbuf_addf(parsed, " --no-%s", o->long_name); - else if (o->short_name) + else if (o->short_name && (o->long_name == NULL || !stuck_long)) strbuf_addf(parsed, " -%c", o->short_name); else strbuf_addf(parsed, " --%s", o->long_name); if (arg) { - strbuf_addch(parsed, ' '); + if (!stuck_long) + strbuf_addch(parsed, ' '); + else if (o->long_name) + strbuf_addch(parsed, '='); sq_quote_buf(parsed, arg); } return 0; @@ -351,6 +365,8 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) OPT_BOOL(0, "stop-at-non-option", &stop_at_non_option, N_("stop parsing after the " "first non-option argument")), + OPT_BOOL(0, "stuck-long", &stuck_long, + N_("output in stuck long form")), OPT_END(), }; @@ -476,6 +492,7 @@ N_("git rev-parse --parseopt [options] -- [<args>...]\n" int cmd_rev_parse(int argc, const char **argv, const char *prefix) { int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0; + int has_dashdash = 0; int output_prefix = 0; unsigned char sha1[20]; const char *name = NULL; @@ -489,6 +506,13 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) if (argc > 1 && !strcmp("-h", argv[1])) usage(builtin_rev_parse_usage); + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--")) { + has_dashdash = 1; + break; + } + } + prefix = setup_git_directory(); git_config(git_default_config, NULL); for (i = 1; i < argc; i++) { @@ -508,7 +532,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) } continue; } - if (!prefixcmp(arg, "-n")) { + if (starts_with(arg, "-n")) { if ((filter & DO_FLAGS) && (filter & DO_REVS)) show(arg); continue; @@ -523,15 +547,17 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--default")) { - def = argv[i+1]; - i++; + def = argv[++i]; + if (!def) + die("--default requires an argument"); continue; } if (!strcmp(arg, "--prefix")) { - prefix = argv[i+1]; + prefix = argv[++i]; + if (!prefix) + die("--prefix requires an argument"); startup_info->prefix = prefix; output_prefix = 1; - i++; continue; } if (!strcmp(arg, "--revs-only")) { @@ -560,7 +586,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--short") || - !prefixcmp(arg, "--short=")) { + starts_with(arg, "--short=")) { filter &= ~(DO_FLAGS|DO_NOREV); verify = 1; abbrev = DEFAULT_ABBREV; @@ -588,7 +614,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) symbolic = SHOW_SYMBOLIC_FULL; continue; } - if (!prefixcmp(arg, "--abbrev-ref") && + if (starts_with(arg, "--abbrev-ref") && (!arg[12] || arg[12] == '=')) { abbrev_ref = 1; abbrev_ref_strict = warn_ambiguous_refs; @@ -606,7 +632,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) for_each_ref(show_reference, NULL); continue; } - if (!prefixcmp(arg, "--disambiguate=")) { + if (starts_with(arg, "--disambiguate=")) { for_each_abbrev(arg + 15, show_abbrev, NULL); continue; } @@ -615,35 +641,46 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) for_each_ref_in("refs/bisect/good", anti_reference, NULL); continue; } - if (!prefixcmp(arg, "--branches=")) { + if (starts_with(arg, "--branches=")) { for_each_glob_ref_in(show_reference, arg + 11, "refs/heads/", NULL); + clear_ref_exclusion(&ref_excludes); continue; } if (!strcmp(arg, "--branches")) { for_each_branch_ref(show_reference, NULL); + clear_ref_exclusion(&ref_excludes); continue; } - if (!prefixcmp(arg, "--tags=")) { + if (starts_with(arg, "--tags=")) { for_each_glob_ref_in(show_reference, arg + 7, "refs/tags/", NULL); + clear_ref_exclusion(&ref_excludes); continue; } if (!strcmp(arg, "--tags")) { for_each_tag_ref(show_reference, NULL); + clear_ref_exclusion(&ref_excludes); continue; } - if (!prefixcmp(arg, "--glob=")) { + if (starts_with(arg, "--glob=")) { for_each_glob_ref(show_reference, arg + 7, NULL); + clear_ref_exclusion(&ref_excludes); continue; } - if (!prefixcmp(arg, "--remotes=")) { + if (starts_with(arg, "--remotes=")) { for_each_glob_ref_in(show_reference, arg + 10, "refs/remotes/", NULL); + clear_ref_exclusion(&ref_excludes); continue; } if (!strcmp(arg, "--remotes")) { for_each_remote_ref(show_reference, NULL); + clear_ref_exclusion(&ref_excludes); + continue; + } + if (starts_with(arg, "--exclude=")) { + add_ref_exclusion(&ref_excludes, arg + 10); continue; } if (!strcmp(arg, "--local-env-vars")) { @@ -703,9 +740,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--resolve-git-dir")) { - const char *gitdir = resolve_gitdir(argv[i+1]); + const char *gitdir = argv[++i]; + if (!gitdir) + die("--resolve-git-dir requires an argument"); + gitdir = resolve_gitdir(gitdir); if (!gitdir) - die("not a gitdir '%s'", argv[i+1]); + die("not a gitdir '%s'", argv[i]); puts(gitdir); continue; } @@ -724,19 +764,19 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) : "false"); continue; } - if (!prefixcmp(arg, "--since=")) { + if (starts_with(arg, "--since=")) { show_datestring("--max-age=", arg+8); continue; } - if (!prefixcmp(arg, "--after=")) { + if (starts_with(arg, "--after=")) { show_datestring("--max-age=", arg+8); continue; } - if (!prefixcmp(arg, "--before=")) { + if (starts_with(arg, "--before=")) { show_datestring("--min-age=", arg+9); continue; } - if (!prefixcmp(arg, "--until=")) { + if (starts_with(arg, "--until=")) { show_datestring("--min-age=", arg+8); continue; } @@ -765,6 +805,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) } if (verify) die_no_single_rev(quiet); + if (has_dashdash) + die("bad revision '%s'", arg); as_is = 1; if (!show_file(arg, output_prefix)) continue; diff --git a/builtin/revert.c b/builtin/revert.c index 87659c9fdb..065d88dd05 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -89,6 +89,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) 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), + { OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key id"), + N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, OPT_END(), OPT_END(), OPT_END(), diff --git a/builtin/rm.c b/builtin/rm.c index 3a0e0eaab7..960634dd0c 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -308,10 +308,10 @@ int cmd_rm(int argc, const char **argv, const char *prefix) for (i = 0; i < active_nr; i++) { const struct cache_entry *ce = active_cache[i]; - if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), 0, seen)) + if (!ce_path_match(ce, &pathspec, seen)) continue; ALLOC_GROW(list.entry, list.nr + 1, list.alloc); - list.entry[list.nr].name = ce->name; + list.entry[list.nr].name = xstrdup(ce->name); list.entry[list.nr].is_submodule = S_ISGITLINK(ce->ce_mode); if (list.entry[list.nr++].is_submodule && !is_staging_gitmodules_ok()) diff --git a/builtin/send-pack.c b/builtin/send-pack.c index 4482f16efb..f420b74665 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -10,6 +10,7 @@ #include "quote.h" #include "transport.h" #include "version.h" +#include "sha1-array.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" @@ -99,7 +100,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) const char *dest = NULL; int fd[2]; struct child_process *conn; - struct extra_have_objects extra_have; + struct sha1_array extra_have = SHA1_ARRAY_INIT; + struct sha1_array shallow = SHA1_ARRAY_INIT; struct ref *remote_refs, *local_refs; int ret; int helper_status = 0; @@ -115,15 +117,15 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) const char *arg = *argv; if (*arg == '-') { - if (!prefixcmp(arg, "--receive-pack=")) { + if (starts_with(arg, "--receive-pack=")) { receivepack = arg + 15; continue; } - if (!prefixcmp(arg, "--exec=")) { + if (starts_with(arg, "--exec=")) { receivepack = arg + 7; continue; } - if (!prefixcmp(arg, "--remote=")) { + if (starts_with(arg, "--remote=")) { remote_name = arg + 9; continue; } @@ -181,7 +183,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) exit(1); continue; } - if (!prefixcmp(arg, "--" CAS_OPT_NAME "=")) { + if (starts_with(arg, "--" CAS_OPT_NAME "=")) { if (parse_push_cas_option(&cas, strchr(arg, '=') + 1, 0) < 0) exit(1); @@ -228,9 +230,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) args.verbose ? CONNECT_VERBOSE : 0); } - memset(&extra_have, 0, sizeof(extra_have)); - - get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL, &extra_have); + get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL, + &extra_have, &shallow); transport_verify_remote_names(nr_refspecs, refspecs); diff --git a/builtin/shortlog.c b/builtin/shortlog.c index c226f767aa..4b7e53623f 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -65,7 +65,7 @@ static void insert_one_record(struct shortlog *log, eol = strchr(oneline, '\n'); if (!eol) eol = oneline + strlen(oneline); - if (!prefixcmp(oneline, "[PATCH")) { + if (starts_with(oneline, "[PATCH")) { char *eob = strchr(oneline, ']'); if (eob && (!eol || eob < eol)) oneline = eob + 1; @@ -95,7 +95,7 @@ static void read_from_stdin(struct shortlog *log) while (fgets(author, sizeof(author), stdin) != NULL) { if (!(author[0] == 'A' || author[0] == 'a') || - prefixcmp(author + 1, "uthor: ")) + !starts_with(author + 1, "uthor: ")) continue; while (fgets(oneline, sizeof(oneline), stdin) && oneline[0] != '\n') @@ -123,7 +123,7 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit) else eol++; - if (!prefixcmp(buffer, "author ")) + if (starts_with(buffer, "author ")) author = buffer + 7; buffer = eol; } diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 001f29ca1b..d87317290c 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -227,8 +227,7 @@ static void join_revs(struct commit_list **list_p, parents = parents->next; if ((this_flag & flags) == flags) continue; - if (!p->object.parsed) - parse_commit(p); + parse_commit(p); if (mark_seen(p, seen_p) && !still_interesting) extra--; p->object.flags |= flags; @@ -285,7 +284,7 @@ static void show_one_commit(struct commit *commit, int no_name) pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty); pretty_str = pretty.buf; } - if (!prefixcmp(pretty_str, "[PATCH] ")) + if (starts_with(pretty_str, "[PATCH] ")) pretty_str += 8; if (!no_name) { @@ -396,7 +395,7 @@ static int append_head_ref(const char *refname, const unsigned char *sha1, int f { unsigned char tmp[20]; int ofs = 11; - if (prefixcmp(refname, "refs/heads/")) + if (!starts_with(refname, "refs/heads/")) return 0; /* If both heads/foo and tags/foo exists, get_sha1 would * get confused. @@ -410,7 +409,7 @@ static int append_remote_ref(const char *refname, const unsigned char *sha1, int { unsigned char tmp[20]; int ofs = 13; - if (prefixcmp(refname, "refs/remotes/")) + if (!starts_with(refname, "refs/remotes/")) return 0; /* If both heads/foo and tags/foo exists, get_sha1 would * get confused. @@ -422,7 +421,7 @@ static int append_remote_ref(const char *refname, const unsigned char *sha1, int static int append_tag_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { - if (prefixcmp(refname, "refs/tags/")) + if (!starts_with(refname, "refs/tags/")) return 0; return append_ref(refname + 5, sha1, 0); } @@ -451,11 +450,11 @@ static int append_matching_ref(const char *refname, const unsigned char *sha1, i slash--; if (!*tail) return 0; - if (fnmatch(match_ref_pattern, tail, 0)) + if (wildmatch(match_ref_pattern, tail, 0, NULL)) return 0; - if (!prefixcmp(refname, "refs/heads/")) + if (starts_with(refname, "refs/heads/")) return append_head_ref(refname, sha1, flag, cb_data); - if (!prefixcmp(refname, "refs/tags/")) + if (starts_with(refname, "refs/tags/")) return append_tag_ref(refname, sha1, flag, cb_data); return append_ref(refname, sha1, 0); } @@ -480,11 +479,11 @@ static int rev_is_head(char *head, int headlen, char *name, if ((!head[0]) || (head_sha1 && sha1 && hashcmp(head_sha1, sha1))) return 0; - if (!prefixcmp(head, "refs/heads/")) + if (starts_with(head, "refs/heads/")) head += 11; - if (!prefixcmp(name, "refs/heads/")) + if (starts_with(name, "refs/heads/")) name += 11; - else if (!prefixcmp(name, "heads/")) + else if (starts_with(name, "heads/")) name += 6; return !strcmp(head, name); } @@ -813,7 +812,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) has_head++; } if (!has_head) { - int offset = !prefixcmp(head, "refs/heads/") ? 11 : 0; + int offset = starts_with(head, "refs/heads/") ? 11 : 0; append_one_rev(head + offset); } } diff --git a/builtin/show-ref.c b/builtin/show-ref.c index 9f3f5e370b..5ba1f30838 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -37,8 +37,8 @@ static int show_ref(const char *refname, const unsigned char *sha1, int flag, vo if (tags_only || heads_only) { int match; - match = heads_only && !prefixcmp(refname, "refs/heads/"); - match |= tags_only && !prefixcmp(refname, "refs/tags/"); + match = heads_only && starts_with(refname, "refs/heads/"); + match |= tags_only && starts_with(refname, "refs/tags/"); if (!match) return 0; } @@ -210,7 +210,7 @@ int cmd_show_ref(int argc, const char **argv, const char *prefix) while (*pattern) { unsigned char sha1[20]; - if (!prefixcmp(*pattern, "refs/") && + if (starts_with(*pattern, "refs/") && !read_ref(*pattern, sha1)) { if (!quiet) show_one(*pattern, sha1); diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index f481959421..b6a711d319 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -47,7 +47,7 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) git_config(git_default_config, NULL); argc = parse_options(argc, argv, prefix, options, git_symbolic_ref_usage, 0); - if (msg &&!*msg) + if (msg && !*msg) die("Refusing to perform update with empty message"); if (delete) { @@ -65,7 +65,7 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) break; case 2: if (!strcmp(argv[0], "HEAD") && - prefixcmp(argv[1], "refs/")) + !starts_with(argv[1], "refs/")) die("Refusing to point HEAD outside of refs/"); create_symref(argv[0], argv[1], msg); break; diff --git a/builtin/tag.c b/builtin/tag.c index ea55f1d1bd..169c676636 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -42,7 +42,7 @@ static int match_pattern(const char **patterns, const char *ref) if (!*patterns) return 1; for (; *patterns; patterns++) - if (!fnmatch(*patterns, ref, 0)) + if (!wildmatch(*patterns, ref, 0, NULL)) return 1; return 0; } @@ -259,7 +259,7 @@ static int git_tag_config(const char *var, const char *value, void *cb) int status = git_gpg_config(var, value, cb); if (status) return status; - if (!prefixcmp(var, "column.")) + if (starts_with(var, "column.")) return git_column_config(var, value, "tag", &colopts); return git_default_config(var, value, cb); } diff --git a/builtin/tar-tree.c b/builtin/tar-tree.c deleted file mode 100644 index ba3ffe69a9..0000000000 --- a/builtin/tar-tree.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2005, 2006 Rene Scharfe - */ -#include "cache.h" -#include "commit.h" -#include "tar.h" -#include "builtin.h" -#include "quote.h" - -static const char tar_tree_usage[] = -"git tar-tree [--remote=<repo>] <tree-ish> [basedir]\n" -"*** Note that this command is now deprecated; use \"git archive\" instead."; - -static const char builtin_get_tar_commit_id_usage[] = -"git get-tar-commit-id < <tarfile>"; - -int cmd_tar_tree(int argc, const char **argv, const char *prefix) -{ - /* - * "git tar-tree" is now a wrapper around "git archive --format=tar" - * - * $0 --remote=<repo> arg... ==> - * git archive --format=tar --remote=<repo> arg... - * $0 tree-ish ==> - * git archive --format=tar tree-ish - * $0 tree-ish basedir ==> - * git archive --format-tar --prefix=basedir tree-ish - */ - const char **nargv = xcalloc(sizeof(*nargv), argc + 3); - struct strbuf sb = STRBUF_INIT; - char *basedir_arg; - int nargc = 0; - - nargv[nargc++] = "archive"; - nargv[nargc++] = "--format=tar"; - - if (2 <= argc && !prefixcmp(argv[1], "--remote=")) { - nargv[nargc++] = argv[1]; - argv++; - argc--; - } - - /* - * Because it's just a compatibility wrapper, tar-tree supports only - * the old behaviour of reading attributes from the work tree. - */ - nargv[nargc++] = "--worktree-attributes"; - - switch (argc) { - default: - usage(tar_tree_usage); - break; - case 3: - /* base-path */ - basedir_arg = xmalloc(strlen(argv[2]) + 11); - sprintf(basedir_arg, "--prefix=%s/", argv[2]); - nargv[nargc++] = basedir_arg; - /* fallthru */ - case 2: - /* tree-ish */ - nargv[nargc++] = argv[1]; - } - nargv[nargc] = NULL; - - fprintf(stderr, - "*** \"git tar-tree\" is now deprecated.\n" - "*** Running \"git archive\" instead.\n***"); - sq_quote_argv(&sb, nargv, 0); - strbuf_addch(&sb, '\n'); - fputs(sb.buf, stderr); - strbuf_release(&sb); - return cmd_archive(nargc, nargv, prefix); -} - -/* ustar header + extended global header content */ -#define RECORDSIZE (512) -#define HEADERSIZE (2 * RECORDSIZE) - -int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix) -{ - char buffer[HEADERSIZE]; - struct ustar_header *header = (struct ustar_header *)buffer; - char *content = buffer + RECORDSIZE; - ssize_t n; - - if (argc != 1) - usage(builtin_get_tar_commit_id_usage); - - n = read_in_full(0, buffer, HEADERSIZE); - if (n < HEADERSIZE) - die("git get-tar-commit-id: read error"); - if (header->typeflag[0] != 'g') - return 1; - if (memcmp(content, "52 comment=", 11)) - return 1; - - n = write_in_full(1, content + 11, 41); - if (n < 41) - die_errno("git get-tar-commit-id: write error"); - - return 0; -} diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 2217d7b3ae..99cde45879 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -480,7 +480,7 @@ static void unpack_all(void) use(sizeof(struct pack_header)); if (!quiet) - progress = start_progress("Unpacking objects", nr_objects); + progress = start_progress(_("Unpacking objects"), nr_objects); obj_list = xcalloc(nr_objects, sizeof(*obj_list)); for (i = 0; i < nr_objects; i++) { unpack_one(i); @@ -497,7 +497,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix) int i; unsigned char sha1[20]; - read_replace_refs = 0; + check_replace_refs = 0; git_config(git_default_config, NULL); @@ -523,7 +523,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix) strict = 1; continue; } - if (!prefixcmp(arg, "--pack_header=")) { + if (starts_with(arg, "--pack_header=")) { struct pack_header *hdr; char *c; diff --git a/builtin/update-index.c b/builtin/update-index.c index e3a10d706d..d12ad95f3e 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -12,6 +12,7 @@ #include "resolve-undo.h" #include "parse-options.h" #include "pathspec.h" +#include "dir.h" /* * Default to not allowing changes to the list of files. The @@ -274,36 +275,32 @@ static void chmod_path(int flip, const char *path) die("git update-index: cannot chmod %cx '%s'", flip, path); } -static void update_one(const char *path, const char *prefix, int prefix_length) +static void update_one(const char *path) { - const char *p = prefix_path(prefix, prefix_length, path); - if (!verify_path(p)) { + if (!verify_path(path)) { fprintf(stderr, "Ignoring path %s\n", path); - goto free_return; + return; } if (mark_valid_only) { - if (mark_ce_flags(p, CE_VALID, mark_valid_only == MARK_FLAG)) + if (mark_ce_flags(path, CE_VALID, mark_valid_only == MARK_FLAG)) die("Unable to mark file %s", path); - goto free_return; + return; } if (mark_skip_worktree_only) { - if (mark_ce_flags(p, CE_SKIP_WORKTREE, mark_skip_worktree_only == MARK_FLAG)) + if (mark_ce_flags(path, CE_SKIP_WORKTREE, mark_skip_worktree_only == MARK_FLAG)) die("Unable to mark file %s", path); - goto free_return; + return; } if (force_remove) { - if (remove_file_from_cache(p)) + if (remove_file_from_cache(path)) die("git update-index: unable to remove %s", path); report("remove '%s'", path); - goto free_return; + return; } - if (process_path(p)) + if (process_path(path)) die("Unable to process path %s", path); report("add '%s'", path); - free_return: - if (p < path || p > path + strlen(path)) - free((char *)p); } static void read_index_info(int line_termination) @@ -563,8 +560,9 @@ static int do_reupdate(int ac, const char **av, const struct cache_entry *ce = active_cache[pos]; struct cache_entry *old = NULL; int save_nr; + char *path; - if (ce_stage(ce) || !ce_path_match(ce, &pathspec)) + if (ce_stage(ce) || !ce_path_match(ce, &pathspec, NULL)) continue; if (has_head) old = read_one_ent(NULL, head_sha1, @@ -579,7 +577,9 @@ static int do_reupdate(int ac, const char **av, * or worse yet 'allow_replace', active_nr may decrease. */ save_nr = active_nr; - update_one(ce->name + prefix_length, prefix, prefix_length); + path = xstrdup(ce->name); + update_one(path); + free(path); if (save_nr != active_nr) goto redo; } @@ -836,11 +836,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) setup_work_tree(); p = prefix_path(prefix, prefix_length, path); - update_one(p, NULL, 0); + update_one(p); if (set_executable_bit) chmod_path(set_executable_bit, p); - if (p < path || p > path + strlen(path)) - free((char *)p); + free((char *)p); ctx.argc--; ctx.argv++; break; @@ -879,11 +878,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) strbuf_swap(&buf, &nbuf); } p = prefix_path(prefix, prefix_length, buf.buf); - update_one(p, NULL, 0); + update_one(p); if (set_executable_bit) chmod_path(set_executable_bit, p); - if (p < buf.buf || p > buf.buf + buf.len) - free((char *)p); + free((char *)p); } strbuf_release(&nbuf); strbuf_release(&buf); diff --git a/builtin/update-ref.c b/builtin/update-ref.c index 702e90db2a..1292cfea11 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -229,15 +229,15 @@ static void update_refs_stdin(void) die("empty command in input"); else if (isspace(*cmd.buf)) die("whitespace before command: %s", cmd.buf); - else if (!prefixcmp(cmd.buf, "update ")) + else if (starts_with(cmd.buf, "update ")) parse_cmd_update(cmd.buf + 7); - else if (!prefixcmp(cmd.buf, "create ")) + else if (starts_with(cmd.buf, "create ")) parse_cmd_create(cmd.buf + 7); - else if (!prefixcmp(cmd.buf, "delete ")) + else if (starts_with(cmd.buf, "delete ")) parse_cmd_delete(cmd.buf + 7); - else if (!prefixcmp(cmd.buf, "verify ")) + else if (starts_with(cmd.buf, "verify ")) parse_cmd_verify(cmd.buf + 7); - else if (!prefixcmp(cmd.buf, "option ")) + else if (starts_with(cmd.buf, "option ")) parse_cmd_option(cmd.buf + 7); else die("unknown command: %s", cmd.buf); diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index af2da35e7d..32ab94cd06 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -37,7 +37,7 @@ int cmd_upload_archive_writer(int argc, const char **argv, const char *prefix) if (sent_argv.argc > MAX_ARGS) die("Too many options (>%d)", MAX_ARGS - 1); - if (prefixcmp(buf, arg_cmd)) + if (!starts_with(buf, arg_cmd)) die("'argument' token or flush expected"); argv_array_push(&sent_argv, buf + strlen(arg_cmd)); } @@ -7,6 +7,7 @@ #include "list-objects.h" #include "run-command.h" #include "refs.h" +#include "argv-array.h" static const char bundle_signature[] = "# v2 git bundle\n"; @@ -234,13 +235,13 @@ static int is_tag_in_date_range(struct object *tag, struct rev_info *revs) } int create_bundle(struct bundle_header *header, const char *path, - int argc, const char **argv) + int argc, const char **argv) { static struct lock_file lock; int bundle_fd = -1; int bundle_to_stdout; - const char **argv_boundary = xmalloc((argc + 4) * sizeof(const char *)); - const char **argv_pack = xmalloc(6 * sizeof(const char *)); + struct argv_array argv_boundary = ARGV_ARRAY_INIT; + struct argv_array argv_pack = ARGV_ARRAY_INIT; int i, ref_count = 0; struct strbuf buf = STRBUF_INIT; struct rev_info revs; @@ -262,13 +263,14 @@ int create_bundle(struct bundle_header *header, const char *path, init_revisions(&revs, NULL); /* write prerequisites */ - memcpy(argv_boundary + 3, argv + 1, argc * sizeof(const char *)); - argv_boundary[0] = "rev-list"; - argv_boundary[1] = "--boundary"; - argv_boundary[2] = "--pretty=oneline"; - argv_boundary[argc + 2] = NULL; + argv_array_pushl(&argv_boundary, + "rev-list", "--boundary", "--pretty=oneline", + NULL); + for (i = 1; i < argc; i++) + argv_array_push(&argv_boundary, argv[i]); + memset(&rls, 0, sizeof(rls)); - rls.argv = argv_boundary; + rls.argv = argv_boundary.argv; rls.out = -1; rls.git_cmd = 1; if (start_command(&rls)) @@ -383,14 +385,12 @@ int create_bundle(struct bundle_header *header, const char *path, write_or_die(bundle_fd, "\n", 1); /* write pack */ - argv_pack[0] = "pack-objects"; - argv_pack[1] = "--all-progress-implied"; - argv_pack[2] = "--stdout"; - argv_pack[3] = "--thin"; - argv_pack[4] = "--delta-base-offset"; - argv_pack[5] = NULL; + argv_array_pushl(&argv_pack, + "pack-objects", "--all-progress-implied", + "--stdout", "--thin", "--delta-base-offset", + NULL); memset(&rls, 0, sizeof(rls)); - rls.argv = argv_pack; + rls.argv = argv_pack.argv; rls.in = -1; rls.out = bundle_fd; rls.git_cmd = 1; @@ -3,7 +3,7 @@ #include "git-compat-util.h" #include "strbuf.h" -#include "hash.h" +#include "hashmap.h" #include "advice.h" #include "gettext.h" #include "convert.h" @@ -130,12 +130,12 @@ struct stat_data { }; struct cache_entry { + struct hashmap_entry ent; struct stat_data ce_stat_data; unsigned int ce_mode; unsigned int ce_flags; unsigned int ce_namelen; unsigned char sha1[20]; - struct cache_entry *next; char name[FLEX_ARRAY]; /* more */ }; @@ -159,7 +159,6 @@ struct cache_entry { #define CE_ADDED (1 << 19) #define CE_HASHED (1 << 20) -#define CE_UNHASHED (1 << 21) #define CE_WT_REMOVE (1 << 22) /* remove in work directory */ #define CE_CONFLICTED (1 << 23) @@ -195,17 +194,18 @@ struct pathspec; * Copy the sha1 and stat state of a cache entry from one to * another. But we never change the name, or the hash state! */ -#define CE_STATE_MASK (CE_HASHED | CE_UNHASHED) static inline void copy_cache_entry(struct cache_entry *dst, const struct cache_entry *src) { - unsigned int state = dst->ce_flags & CE_STATE_MASK; + unsigned int state = dst->ce_flags & CE_HASHED; /* Don't copy hash chain and name */ - memcpy(dst, src, offsetof(struct cache_entry, next)); + memcpy(&dst->ce_stat_data, &src->ce_stat_data, + offsetof(struct cache_entry, name) - + offsetof(struct cache_entry, ce_stat_data)); /* Restore the hash state */ - dst->ce_flags = (dst->ce_flags & ~CE_STATE_MASK) | state; + dst->ce_flags = (dst->ce_flags & ~CE_HASHED) | state; } static inline unsigned create_ce_flags(unsigned stage) @@ -277,8 +277,8 @@ struct index_state { struct cache_time timestamp; unsigned name_hash_initialized : 1, initialized : 1; - struct hash_table name_hash; - struct hash_table dir_hash; + struct hashmap name_hash; + struct hashmap dir_hash; }; extern struct index_state the_index; @@ -316,7 +316,6 @@ extern void free_name_hash(struct index_state *istate); #define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options)) #define cache_dir_exists(name, namelen) index_dir_exists(&the_index, (name), (namelen)) #define cache_file_exists(name, namelen, igncase) index_file_exists(&the_index, (name), (namelen), (igncase)) -#define cache_name_exists(name, namelen, igncase) index_name_exists(&the_index, (name), (namelen), (igncase)) #define cache_name_is_other(name, namelen) index_name_is_other(&the_index, (name), (namelen)) #define resolve_undo_clear() resolve_undo_clear_index(&the_index) #define unmerge_cache_entry_at(at) unmerge_index_entry_at(&the_index, at) @@ -354,6 +353,7 @@ static inline enum object_type object_type(unsigned int mode) #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY" #define INDEX_ENVIRONMENT "GIT_INDEX_FILE" #define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE" +#define GIT_SHALLOW_FILE_ENVIRONMENT "GIT_SHALLOW_FILE" #define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR" #define CONFIG_ENVIRONMENT "GIT_CONFIG" #define CONFIG_DATA_ENVIRONMENT "GIT_CONFIG_PARAMETERS" @@ -398,7 +398,6 @@ extern int is_bare_repository(void); extern int is_inside_git_dir(void); extern char *git_work_tree_cfg; extern int is_inside_work_tree(void); -extern int have_git_dir(void); extern const char *get_git_dir(void); extern int is_git_directory(const char *path); extern char *get_object_directory(void); @@ -434,6 +433,7 @@ extern int set_git_dir_init(const char *git_dir, const char *real_git_dir, int); extern int init_db(const char *template_dir, unsigned int flags); extern void sanitize_stdfds(void); +extern int daemonize(void); #define alloc_nr(x) (((x)+16)*3/2) @@ -467,7 +467,6 @@ extern int unmerged_index(const struct index_state *); extern int verify_path(const char *path); extern struct cache_entry *index_dir_exists(struct index_state *istate, const char *name, int namelen); extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase); -extern struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int igncase); 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 */ @@ -484,11 +483,11 @@ extern int remove_file_from_index(struct index_state *, const char *path); #define ADD_CACHE_IGNORE_ERRORS 4 #define ADD_CACHE_IGNORE_REMOVAL 8 #define ADD_CACHE_INTENT 16 -#define ADD_CACHE_IMPLICIT_DOT 32 /* internal to "git add -u/-A" */ extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags); extern int add_file_to_index(struct index_state *, const char *path, int flags); -extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh); +extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options); extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b); +extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce); extern int index_name_is_other(const struct index_state *, const char *, int); extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *); @@ -498,11 +497,13 @@ extern void *read_blob_data_from_index(struct index_state *, const char *, unsig #define CE_MATCH_RACY_IS_DIRTY 02 /* do stat comparison even if CE_SKIP_WORKTREE is true */ #define CE_MATCH_IGNORE_SKIP_WORKTREE 04 +/* ignore non-existent files during stat update */ +#define CE_MATCH_IGNORE_MISSING 0x08 +/* enable stat refresh */ +#define CE_MATCH_REFRESH 0x10 extern int ie_match_stat(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int); extern int ie_modified(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int); -extern int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec); - #define HASH_WRITE_OBJECT 1 #define HASH_FORMAT_CHECK 2 extern int index_fd(unsigned char *sha1, int fd, struct stat *st, enum object_type type, const char *path, unsigned flags); @@ -580,7 +581,17 @@ extern size_t packed_git_limit; extern size_t delta_base_cache_limit; extern unsigned long big_file_threshold; extern unsigned long pack_size_limit_cfg; -extern int read_replace_refs; + +/* + * Do replace refs need to be checked this run? This variable is + * initialized to true unless --no-replace-object is used or + * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some + * commands that do not want replace references to be active. As an + * optimization it is also set to false if replace references have + * been sought but there were none. + */ +extern int check_replace_refs; + extern int fsync_object_files; extern int core_preload_index; extern int core_apply_sparse_checkout; @@ -659,9 +670,28 @@ extern char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2) extern char *git_path_submodule(const char *path, const char *fmt, ...) __attribute__((format (printf, 2, 3))); -extern char *sha1_file_name(const unsigned char *sha1); +/* + * Return the name of the file in the local object database that would + * be used to store a loose object with the specified sha1. The + * return value is a pointer to a statically allocated buffer that is + * overwritten each time the function is called. + */ +extern const char *sha1_file_name(const unsigned char *sha1); + +/* + * Return the name of the (local) packfile with the specified sha1 in + * its name. The return value is a pointer to memory that is + * overwritten each time this function is called. + */ extern char *sha1_pack_name(const unsigned char *sha1); + +/* + * Return the name of the (local) pack index file with the specified + * sha1 in its name. The return value is a pointer to memory that is + * overwritten each time this function is called. + */ extern char *sha1_pack_index_name(const unsigned char *sha1); + extern const char *find_unique_abbrev(const unsigned char *sha1, int); extern const unsigned char null_sha1[20]; @@ -737,8 +767,29 @@ enum sharedrepo { }; int git_config_perm(const char *var, const char *value); int adjust_shared_perm(const char *path); -int safe_create_leading_directories(char *path); -int safe_create_leading_directories_const(const char *path); + +/* + * Create the directory containing the named path, using care to be + * somewhat safe against races. Return one of the scld_error values + * to indicate success/failure. + * + * SCLD_VANISHED indicates that one of the ancestor directories of the + * path existed at one point during the function call and then + * suddenly vanished, probably because another process pruned the + * directory while we were working. To be robust against this kind of + * race, callers might want to try invoking the function again when it + * returns SCLD_VANISHED. + */ +enum scld_error { + SCLD_OK = 0, + SCLD_FAILED = -1, + SCLD_PERMS = -2, + SCLD_EXISTS = -3, + SCLD_VANISHED = -4 +}; +enum scld_error safe_create_leading_directories(char *path); +enum scld_error safe_create_leading_directories_const(const char *path); + int mkdir_in_gitdir(const char *path); extern void home_config_paths(char **global, char **xdg, char *file); extern char *expand_user_path(const char *path); @@ -751,6 +802,7 @@ int is_directory(const char *); const char *real_path(const char *path); const char *real_path_if_valid(const char *path); const char *absolute_path(const char *path); +const char *remove_leading_path(const char *in, const char *prefix); const char *relative_path(const char *in, const char *prefix, struct strbuf *sb); int normalize_path_copy_len(char *dst, const char *src, int *prefix_len); int normalize_path_copy(char *dst, const char *src); @@ -760,26 +812,46 @@ int daemon_avoid_alias(const char *path); int offset_1st_component(const char *path); /* object replacement */ -#define READ_SHA1_FILE_REPLACE 1 +#define LOOKUP_REPLACE_OBJECT 1 extern void *read_sha1_file_extended(const unsigned char *sha1, enum object_type *type, unsigned long *size, unsigned flag); static inline void *read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size) { - return read_sha1_file_extended(sha1, type, size, READ_SHA1_FILE_REPLACE); + return read_sha1_file_extended(sha1, type, size, LOOKUP_REPLACE_OBJECT); } + +/* + * This internal function is only declared here for the benefit of + * lookup_replace_object(). Please do not call it directly. + */ extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1); + +/* + * If object sha1 should be replaced, return the replacement object's + * name (replaced recursively, if necessary). The return value is + * either sha1 or a pointer to a permanently-allocated value. When + * object replacement is suppressed, always return sha1. + */ static inline const unsigned char *lookup_replace_object(const unsigned char *sha1) { - if (!read_replace_refs) + if (!check_replace_refs) return sha1; return do_lookup_replace_object(sha1); } +static inline const unsigned char *lookup_replace_object_extended(const unsigned char *sha1, unsigned flag) +{ + if (!(flag & LOOKUP_REPLACE_OBJECT)) + return sha1; + return lookup_replace_object(sha1); +} + /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ extern int sha1_object_info(const unsigned char *, unsigned long *); extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1); extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1); extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *); extern int force_object_loose(const unsigned char *sha1, time_t mtime); +extern int git_open_noatime(const char *name); extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size); extern int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz); extern int parse_sha1_header(const char *hdr, unsigned long *sizep); @@ -792,7 +864,19 @@ extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned l extern int move_temp_to_file(const char *tmpfile, const char *filename); extern int has_sha1_pack(const unsigned char *sha1); + +/* + * Return true iff we have an object named sha1, whether local or in + * an alternate object database, and whether packed or loose. This + * function does not respect replace references. + */ extern int has_sha1_file(const unsigned char *sha1); + +/* + * Return true iff an alternate object database has a loose object + * with the specified name. This function does not respect replace + * references. + */ extern int has_loose_object_nonlocal(const unsigned char *sha1); extern int has_pack_index(const unsigned char *sha1); @@ -887,9 +971,12 @@ extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref); extern int interpret_branch_name(const char *str, int len, struct strbuf *); extern int get_sha1_mb(const char *str, unsigned char *sha1); -extern int refname_match(const char *abbrev_name, const char *full_name, const char **rules); -extern const char *ref_rev_parse_rules[]; -#define ref_fetch_rules ref_rev_parse_rules +/* + * Return true iff abbrev_name is a possible abbreviation for + * full_name according to the rules defined by ref_rev_parse_rules in + * refs.c. + */ +extern int refname_match(const char *abbrev_name, const char *full_name); extern int create_symref(const char *ref, const char *refs_heads_master, const char *logmsg); extern int validate_headref(const char *ref); @@ -928,6 +1015,7 @@ void datestamp(char *buf, int bufsize); unsigned long approxidate_careful(const char *, int *); unsigned long approxidate_relative(const char *date, const struct timeval *now); enum date_mode parse_date_format(const char *format); +int date_overflows(unsigned long date); #define IDENT_STRICT 1 #define IDENT_NO_DATE 2 @@ -975,6 +1063,7 @@ struct checkout { refresh_cache:1; }; +#define TEMPORARY_FILENAME_LENGTH 25 extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath); struct cache_def { @@ -1051,17 +1140,46 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1, struct packed_git *packs); extern void pack_report(void); + +/* + * mmap the index file for the specified packfile (if it is not + * already mmapped). Return 0 on success. + */ extern int open_pack_index(struct packed_git *); + +/* + * munmap the index file for the specified packfile (if it is + * currently mmapped). + */ extern void close_pack_index(struct packed_git *); + extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *); extern void close_pack_windows(struct packed_git *); extern void unuse_pack(struct pack_window **); extern void free_pack_by_name(const char *); extern void clear_delta_base_cache(void); extern struct packed_git *add_packed_git(const char *, int, int); -extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t); -extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t); -extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *); + +/* + * Return the SHA-1 of the nth object within the specified packfile. + * Open the index if it is not already open. The return value points + * at the SHA-1 within the mmapped index. Return NULL if there is an + * error. + */ +extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n); + +/* + * Return the offset of the nth object within the specified packfile. + * The index must already be opened. + */ +extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t n); + +/* + * If the object named sha1 is present in the specified packfile, + * return its offset within the packfile; otherwise, return 0. + */ +extern off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *); + extern int is_pack_valid(struct packed_git *); extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *); extern unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep); @@ -1073,6 +1191,7 @@ struct object_info { enum object_type *typep; unsigned long *sizep; unsigned long *disk_sizep; + unsigned char *delta_base_sha1; /* Response */ enum { @@ -1097,7 +1216,7 @@ struct object_info { } packed; } u; }; -extern int sha1_object_info_extended(const unsigned char *, struct object_info *); +extern int sha1_object_info_extended(const unsigned char *, struct object_info *, unsigned flags); /* Dumb servers support */ extern int update_server_info(int); @@ -1113,6 +1232,12 @@ extern int update_server_info(int); #define CONFIG_INVALID_PATTERN 6 #define CONFIG_GENERIC_ERROR 7 +struct git_config_source { + unsigned int use_stdin:1; + const char *file; + const char *blob; +}; + typedef int (*config_fn_t)(const char *, const char *, void *); extern int git_default_config(const char *, const char *, void *); extern int git_config_from_file(config_fn_t fn, const char *, void *); @@ -1122,8 +1247,7 @@ extern void git_config_push_parameter(const char *text); extern int git_config_from_parameters(config_fn_t fn, void *data); extern int git_config(config_fn_t fn, void *); extern int git_config_with_options(config_fn_t fn, void *, - const char *filename, - const char *blob_ref, + struct git_config_source *config_source, int respect_includes); extern int git_config_early(config_fn_t fn, void *, const char *repo_config); extern int git_parse_ulong(const char *, unsigned long *); @@ -1235,6 +1359,8 @@ __attribute__((format (printf, 2, 3))) extern void trace_argv_printf(const char **argv, const char *format, ...); extern void trace_repo_setup(const char *prefix); extern int trace_want(const char *key); +__attribute__((format (printf, 2, 3))) +extern void trace_printf_key(const char *key, const char *fmt, ...); extern void trace_strbuf(const char *key, const struct strbuf *buf); void packet_trace_identity(const char *prog); diff --git a/combine-diff.c b/combine-diff.c index 3b92c44880..24ca7e2334 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -15,11 +15,10 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent) { struct diff_queue_struct *q = &diff_queued_diff; - struct combine_diff_path *p; - int i; + struct combine_diff_path *p, **tail = &curr; + int i, cmp; if (!n) { - struct combine_diff_path *list = NULL, **tail = &list; for (i = 0; i < q->nr; i++) { int len; const char *path; @@ -31,7 +30,6 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, p->path = (char *) &(p->parent[num_parent]); memcpy(p->path, path, len); p->path[len] = 0; - p->len = len; p->next = NULL; memset(p->parent, 0, sizeof(p->parent[0]) * num_parent); @@ -44,31 +42,37 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, *tail = p; tail = &p->next; } - return list; + return curr; } - for (p = curr; p; p = p->next) { - int found = 0; - if (!p->len) + /* + * paths in curr (linked list) and q->queue[] (array) are + * both sorted in the tree order. + */ + i = 0; + while ((p = *tail) != NULL) { + cmp = ((i >= q->nr) + ? -1 : strcmp(p->path, q->queue[i]->two->path)); + + if (cmp < 0) { + /* p->path not in q->queue[]; drop it */ + *tail = p->next; + free(p); continue; - for (i = 0; i < q->nr; i++) { - const char *path; - int len; + } - if (diff_unmodified_pair(q->queue[i])) - continue; - path = q->queue[i]->two->path; - len = strlen(path); - if (len == p->len && !memcmp(path, p->path, len)) { - found = 1; - hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1); - p->parent[n].mode = q->queue[i]->one->mode; - p->parent[n].status = q->queue[i]->status; - break; - } + if (cmp > 0) { + /* q->queue[i] not in p->path; skip it */ + i++; + continue; } - if (!found) - p->len = 0; + + hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1); + p->parent[n].mode = q->queue[i]->one->mode; + p->parent[n].status = q->queue[i]->status; + + tail = &p->next; + i++; } return curr; } @@ -1219,8 +1223,6 @@ void show_combined_diff(struct combine_diff_path *p, { struct diff_options *opt = &rev->diffopt; - if (!p->len) - return; if (opt->output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME | DIFF_FORMAT_NAME_STATUS)) @@ -1284,17 +1286,21 @@ static void handle_combined_callback(struct diff_options *opt, q.queue = xcalloc(num_paths, sizeof(struct diff_filepair *)); q.alloc = num_paths; q.nr = num_paths; - for (i = 0, p = paths; p; p = p->next) { - if (!p->len) - continue; + for (i = 0, p = paths; p; p = p->next) q.queue[i++] = combined_pair(p, num_parent); - } opt->format_callback(&q, opt, opt->format_callback_data); for (i = 0; i < num_paths; i++) free_combined_pair(q.queue[i]); free(q.queue); } +static const char *path_path(void *obj) +{ + struct combine_diff_path *path = (struct combine_diff_path *)obj; + + return path->path; +} + void diff_tree_combined(const unsigned char *sha1, const struct sha1_array *parents, int dense, @@ -1310,6 +1316,8 @@ void diff_tree_combined(const unsigned char *sha1, diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; DIFF_OPT_SET(&diffopts, RECURSIVE); DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL); + /* tell diff_tree to emit paths in sorted (=tree) order */ + diffopts.orderfile = NULL; show_log_first = !!rev->loginfo && !rev->no_commit_id; needsep = 0; @@ -1335,22 +1343,46 @@ void diff_tree_combined(const unsigned char *sha1, printf("%s%c", diff_line_prefix(opt), opt->line_termination); } + + /* if showing diff, show it in requested order */ + if (diffopts.output_format != DIFF_FORMAT_NO_OUTPUT && + opt->orderfile) { + diffcore_order(opt->orderfile); + } + diff_flush(&diffopts); } - /* find out surviving paths */ - for (num_paths = 0, p = paths; p; p = p->next) { - if (p->len) - num_paths++; + /* find out number of surviving paths */ + for (num_paths = 0, p = paths; p; p = p->next) + num_paths++; + + /* order paths according to diffcore_order */ + if (opt->orderfile && num_paths) { + struct obj_order *o; + + o = xmalloc(sizeof(*o) * num_paths); + for (i = 0, p = paths; p; p = p->next, i++) + o[i].obj = p; + order_objects(opt->orderfile, path_path, o, num_paths); + for (i = 0; i < num_paths - 1; i++) { + p = o[i].obj; + p->next = o[i+1].obj; + } + + p = o[num_paths-1].obj; + p->next = NULL; + paths = o[0].obj; + free(o); } + + if (num_paths) { if (opt->output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME | DIFF_FORMAT_NAME_STATUS)) { - for (p = paths; p; p = p->next) { - if (p->len) - show_raw_diff(p, num_parent, rev); - } + for (p = paths; p; p = p->next) + show_raw_diff(p, num_parent, rev); needsep = 1; } else if (opt->output_format & @@ -1363,11 +1395,9 @@ void diff_tree_combined(const unsigned char *sha1, if (needsep) printf("%s%c", diff_line_prefix(opt), opt->line_termination); - for (p = paths; p; p = p->next) { - if (p->len) - show_patch_diff(p, num_parent, dense, - 0, rev); - } + for (p = paths; p; p = p->next) + show_patch_diff(p, num_parent, dense, + 0, rev); } } diff --git a/command-list.txt b/command-list.txt index 08b04e2c66..cf36c3d71e 100644 --- a/command-list.txt +++ b/command-list.txt @@ -64,7 +64,6 @@ git-init mainporcelain common git-instaweb ancillaryinterrogators gitk mainporcelain git-log mainporcelain common -git-lost-found ancillarymanipulators deprecated git-ls-files plumbinginterrogators git-ls-remote plumbinginterrogators git-ls-tree plumbinginterrogators @@ -88,7 +87,6 @@ git-pack-redundant plumbinginterrogators git-pack-refs ancillarymanipulators git-parse-remote synchelpers git-patch-id purehelpers -git-peek-remote purehelpers deprecated git-prune ancillarymanipulators git-prune-packed plumbingmanipulators git-pull mainporcelain common @@ -102,7 +100,6 @@ git-relink ancillarymanipulators git-remote ancillarymanipulators git-repack ancillarymanipulators git-replace ancillarymanipulators -git-repo-config ancillarymanipulators deprecated git-request-pull foreignscminterface git-rerere ancillaryinterrogators git-reset mainporcelain common @@ -127,7 +124,6 @@ git-submodule mainporcelain git-svn foreignscminterface git-symbolic-ref plumbingmanipulators git-tag mainporcelain common -git-tar-tree plumbinginterrogators deprecated git-unpack-file plumbinginterrogators git-unpack-objects plumbingmanipulators git-update-index plumbingmanipulators diff --git a/commit-slab.h b/commit-slab.h index d4c8286470..cc114b53b0 100644 --- a/commit-slab.h +++ b/commit-slab.h @@ -22,8 +22,17 @@ * * Initializes the indegree slab that associates an array of integers * to each commit. 'stride' specifies how big each array is. The slab - * that id initialied by the variant without "_with_stride" associates + * that is initialized by the variant without "_with_stride" associates * each commit with an array of one integer. + * + * - void clear_indegree(struct indegree *); + * + * Empties the slab. The slab can be reused with the same stride + * without calling init_indegree() again or can be reconfigured to a + * different stride by calling init_indegree_with_stride(). + * + * Call this function before the slab falls out of scope to avoid + * leaking memory. */ /* allocate ~512kB at once, allowing for malloc overhead */ @@ -31,6 +40,8 @@ #define COMMIT_SLAB_SIZE (512*1024-32) #endif +#define MAYBE_UNUSED __attribute__((__unused__)) + #define define_commit_slab(slabname, elemtype) \ \ struct slabname { \ @@ -41,8 +52,8 @@ struct slabname { \ }; \ static int stat_ ##slabname## realloc; \ \ -static void init_ ##slabname## _with_stride(struct slabname *s, \ - unsigned stride) \ +static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \ + unsigned stride) \ { \ unsigned int elem_size; \ if (!stride) \ @@ -54,12 +65,12 @@ static void init_ ##slabname## _with_stride(struct slabname *s, \ s->slab = NULL; \ } \ \ -static void init_ ##slabname(struct slabname *s) \ +static MAYBE_UNUSED void init_ ##slabname(struct slabname *s) \ { \ init_ ##slabname## _with_stride(s, 1); \ } \ \ -static void clear_ ##slabname(struct slabname *s) \ +static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \ { \ int i; \ for (i = 0; i < s->slab_count; i++) \ @@ -69,8 +80,8 @@ static void clear_ ##slabname(struct slabname *s) \ s->slab = NULL; \ } \ \ -static elemtype *slabname## _at(struct slabname *s, \ - const struct commit *c) \ +static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \ + const struct commit *c) \ { \ int nth_slab, nth_slot; \ \ @@ -80,7 +91,7 @@ static elemtype *slabname## _at(struct slabname *s, \ if (s->slab_count <= nth_slab) { \ int i; \ s->slab = xrealloc(s->slab, \ - (nth_slab + 1) * sizeof(s->slab)); \ + (nth_slab + 1) * sizeof(*s->slab)); \ stat_ ##slabname## realloc++; \ for (i = s->slab_count; i <= nth_slab; i++) \ s->slab[i] = NULL; \ @@ -94,4 +105,16 @@ static elemtype *slabname## _at(struct slabname *s, \ \ static int stat_ ##slabname## realloc +/* + * Note that this seemingly redundant second declaration is required + * to allow a terminating semicolon, which makes instantiations look + * like function declarations. I.e., the expansion of + * + * define_commit_slab(indegree, int); + * + * ends in 'static int stat_indegreerealloc;'. This would otherwise + * be a syntax error according (at least) to ISO C. It's hard to + * catch because GCC silently parses it by default. + */ + #endif /* COMMIT_SLAB_H */ @@ -79,7 +79,7 @@ struct commit *lookup_commit_reference_by_name(const char *name) if (get_sha1_committish(name, sha1)) return NULL; commit = lookup_commit_reference(sha1); - if (!commit || parse_commit(commit)) + if (parse_commit(commit)) return NULL; return commit; } @@ -196,19 +196,19 @@ bad_graft_data: static int read_graft_file(const char *graft_file) { FILE *fp = fopen(graft_file, "r"); - char buf[1024]; + struct strbuf buf = STRBUF_INIT; if (!fp) return -1; - while (fgets(buf, sizeof(buf), fp)) { + while (!strbuf_getwholeline(&buf, fp, '\n')) { /* The format is just "Commit Parent1 Parent2 ...\n" */ - int len = strlen(buf); - struct commit_graft *graft = read_graft_line(buf, len); + struct commit_graft *graft = read_graft_line(buf.buf, buf.len); if (!graft) continue; if (register_commit_graft(graft, 1)) - error("duplicate graft data: %s", buf); + error("duplicate graft data: %s", buf.buf); } fclose(fp); + strbuf_release(&buf); return 0; } @@ -341,6 +341,13 @@ int parse_commit(struct commit *item) return ret; } +void parse_commit_or_die(struct commit *item) +{ + if (parse_commit(item)) + die("unable to parse commit %s", + item ? sha1_to_hex(item->object.sha1) : "(null)"); +} + int find_commit_subject(const char *commit_buffer, const char **subject) { const char *eol; @@ -541,7 +548,7 @@ define_commit_slab(author_date_slab, unsigned long); static void record_author_date(struct author_date_slab *author_date, struct commit *commit) { - const char *buf, *line_end; + const char *buf, *line_end, *ident_line; char *buffer = NULL; struct ident_split ident; char *date_end; @@ -559,14 +566,14 @@ static void record_author_date(struct author_date_slab *author_date, buf; buf = line_end + 1) { line_end = strchrnul(buf, '\n'); - if (prefixcmp(buf, "author ")) { + ident_line = skip_prefix(buf, "author "); + if (!ident_line) { if (!line_end[0] || line_end[1] == '\n') return; /* end of header */ continue; } if (split_ident_line(&ident, - buf + strlen("author "), - line_end - (buf + strlen("author "))) || + ident_line, line_end - ident_line) || !ident.date_begin || !ident.date_end) goto fail_exit; /* malformed "author" line */ break; @@ -834,26 +841,26 @@ static struct commit_list *merge_bases_many(struct commit *one, int n, struct co struct commit_list *get_octopus_merge_bases(struct commit_list *in) { struct commit_list *i, *j, *k, *ret = NULL; - struct commit_list **pptr = &ret; - for (i = in; i; i = i->next) { - if (!ret) - pptr = &commit_list_insert(i->item, pptr)->next; - else { - struct commit_list *new = NULL, *end = NULL; - - for (j = ret; j; j = j->next) { - struct commit_list *bases; - bases = get_merge_bases(i->item, j->item, 1); - if (!new) - new = bases; - else - end->next = bases; - for (k = bases; k; k = k->next) - end = k; - } - ret = new; + if (!in) + return ret; + + commit_list_insert(in->item, &ret); + + for (i = in->next; i; i = i->next) { + struct commit_list *new = NULL, *end = NULL; + + for (j = ret; j; j = j->next) { + struct commit_list *bases; + bases = get_merge_bases(i->item, j->item, 1); + if (!new) + new = bases; + else + end->next = bases; + for (k = bases; k; k = k->next) + end = k; } + ret = new; } return ret; } @@ -1106,7 +1113,7 @@ int parse_signed_commit(const unsigned char *sha1, next = next ? next + 1 : tail; if (in_signature && line[0] == ' ') sig = line + 1; - else if (!prefixcmp(line, gpg_sig_header) && + else if (starts_with(line, gpg_sig_header) && line[gpg_sig_header_len] == ' ') sig = line + gpg_sig_header_len + 1; if (sig) { @@ -1186,10 +1193,8 @@ static void parse_gpg_output(struct signature_check *sigc) for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_status); i++) { const char *found, *next; - if (!prefixcmp(buf, sigcheck_gpg_status[i].check + 1)) { - /* At the very beginning of the buffer */ - found = buf + strlen(sigcheck_gpg_status[i].check + 1); - } else { + found = skip_prefix(buf, sigcheck_gpg_status[i].check + 1); + if (!found) { found = strstr(buf, sigcheck_gpg_status[i].check); if (!found) continue; @@ -1349,7 +1354,7 @@ void free_commit_extra_headers(struct commit_extra_header *extra) } } -int commit_tree(const struct strbuf *msg, unsigned char *tree, +int commit_tree(const struct strbuf *msg, const unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit) { @@ -1478,7 +1483,7 @@ static const char commit_utf8_warn[] = "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"; -int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, +int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit, struct commit_extra_header *extra) @@ -49,6 +49,7 @@ struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_n int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size); int parse_commit(struct commit *item); +void parse_commit_or_die(struct commit *item); /* Find beginning and length of commit subject. */ int find_commit_subject(const char *commit_buffer, const char **subject); @@ -193,6 +194,8 @@ extern struct commit_list *get_octopus_merge_bases(struct commit_list *in); /* largest positive number a signed 32-bit integer can contain */ #define INFINITE_DEPTH 0x7fffffff +struct sha1_array; +struct ref; extern int register_shallow(const unsigned char *sha1); extern int unregister_shallow(const unsigned char *sha1); extern int for_each_commit_graft(each_commit_graft_fn, void *); @@ -200,11 +203,38 @@ extern int is_repository_shallow(void); extern struct commit_list *get_shallow_commits(struct object_array *heads, int depth, int shallow_flag, int not_shallow_flag); extern void check_shallow_file_for_update(void); -extern void set_alternate_shallow_file(const char *path); -extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol); +extern void set_alternate_shallow_file(const char *path, int override); +extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol, + const struct sha1_array *extra); extern void setup_alternate_shallow(struct lock_file *shallow_lock, - const char **alternate_shallow_file); -extern char *setup_temporary_shallow(void); + const char **alternate_shallow_file, + const struct sha1_array *extra); +extern char *setup_temporary_shallow(const struct sha1_array *extra); +extern void advertise_shallow_grafts(int); + +struct shallow_info { + struct sha1_array *shallow; + int *ours, nr_ours; + int *theirs, nr_theirs; + struct sha1_array *ref; + + /* for receive-pack */ + uint32_t **used_shallow; + int *need_reachability_test; + int *reachable; + int *shallow_ref; + struct commit **commits; + int nr_commits; +}; + +extern void prepare_shallow_info(struct shallow_info *, struct sha1_array *); +extern void clear_shallow_info(struct shallow_info *); +extern void remove_nonexistent_theirs_shallow(struct shallow_info *); +extern void assign_shallow_commits_to_refs(struct shallow_info *info, + uint32_t **used, + int *ref_status); +extern int delayed_reachability_test(struct shallow_info *si, int c); +extern void prune_shallow(int show_only); int is_descendant_of(struct commit *, struct commit_list *); int in_merge_bases(struct commit *, struct commit *); @@ -231,11 +261,11 @@ struct commit_extra_header { extern void append_merge_tag_headers(struct commit_list *parents, struct commit_extra_header ***tail); -extern int commit_tree(const struct strbuf *msg, unsigned char *tree, +extern int commit_tree(const struct strbuf *msg, const unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit); -extern int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, +extern int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit, struct commit_extra_header *); diff --git a/compat/bswap.h b/compat/bswap.h index 5061214f73..120c6c1d37 100644 --- a/compat/bswap.h +++ b/compat/bswap.h @@ -17,7 +17,20 @@ static inline uint32_t default_swab32(uint32_t val) ((val & 0x000000ff) << 24)); } +static inline uint64_t default_bswap64(uint64_t val) +{ + return (((val & (uint64_t)0x00000000000000ffULL) << 56) | + ((val & (uint64_t)0x000000000000ff00ULL) << 40) | + ((val & (uint64_t)0x0000000000ff0000ULL) << 24) | + ((val & (uint64_t)0x00000000ff000000ULL) << 8) | + ((val & (uint64_t)0x000000ff00000000ULL) >> 8) | + ((val & (uint64_t)0x0000ff0000000000ULL) >> 24) | + ((val & (uint64_t)0x00ff000000000000ULL) >> 40) | + ((val & (uint64_t)0xff00000000000000ULL) >> 56)); +} + #undef bswap32 +#undef bswap64 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) @@ -32,15 +45,42 @@ static inline uint32_t git_bswap32(uint32_t x) return result; } +#define bswap64 git_bswap64 +#if defined(__x86_64__) +static inline uint64_t git_bswap64(uint64_t x) +{ + uint64_t result; + if (__builtin_constant_p(x)) + result = default_bswap64(x); + else + __asm__("bswap %q0" : "=r" (result) : "0" (x)); + return result; +} +#else +static inline uint64_t git_bswap64(uint64_t x) +{ + union { uint64_t i64; uint32_t i32[2]; } tmp, result; + if (__builtin_constant_p(x)) + result.i64 = default_bswap64(x); + else { + tmp.i64 = x; + result.i32[0] = git_bswap32(tmp.i32[1]); + result.i32[1] = git_bswap32(tmp.i32[0]); + } + return result.i64; +} +#endif + #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include <stdlib.h> #define bswap32(x) _byteswap_ulong(x) +#define bswap64(x) _byteswap_uint64(x) #endif -#ifdef bswap32 +#if defined(bswap32) #undef ntohl #undef htonl @@ -48,3 +88,73 @@ static inline uint32_t git_bswap32(uint32_t x) #define htonl(x) bswap32(x) #endif + +#if defined(bswap64) + +#undef ntohll +#undef htonll +#define ntohll(x) bswap64(x) +#define htonll(x) bswap64(x) + +#else + +#undef ntohll +#undef htonll + +#if !defined(__BYTE_ORDER) +# if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) +# define __BYTE_ORDER BYTE_ORDER +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __BIG_ENDIAN BIG_ENDIAN +# endif +#endif + +#if !defined(__BYTE_ORDER) +# error "Cannot determine endianness" +#endif + +#if __BYTE_ORDER == __BIG_ENDIAN +# define ntohll(n) (n) +# define htonll(n) (n) +#else +# define ntohll(n) default_bswap64(n) +# define htonll(n) default_bswap64(n) +#endif + +#endif + +/* + * Performance might be improved if the CPU architecture is OK with + * unaligned 32-bit loads and a fast ntohl() is available. + * Otherwise fall back to byte loads and shifts which is portable, + * and is faster on architectures with memory alignment issues. + */ + +#if defined(__i386__) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64) || \ + defined(__ppc__) || defined(__ppc64__) || \ + defined(__powerpc__) || defined(__powerpc64__) || \ + defined(__s390__) || defined(__s390x__) + +#define get_be16(p) ntohs(*(unsigned short *)(p)) +#define get_be32(p) ntohl(*(unsigned int *)(p)) +#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) + +#else + +#define get_be16(p) ( \ + (*((unsigned char *)(p) + 0) << 8) | \ + (*((unsigned char *)(p) + 1) << 0) ) +#define get_be32(p) ( \ + (*((unsigned char *)(p) + 0) << 24) | \ + (*((unsigned char *)(p) + 1) << 16) | \ + (*((unsigned char *)(p) + 2) << 8) | \ + (*((unsigned char *)(p) + 3) << 0) ) +#define put_be32(p, v) do { \ + unsigned int __v = (v); \ + *((unsigned char *)(p) + 0) = __v >> 24; \ + *((unsigned char *)(p) + 1) = __v >> 16; \ + *((unsigned char *)(p) + 2) = __v >> 8; \ + *((unsigned char *)(p) + 3) = __v >> 0; } while (0) + +#endif diff --git a/compat/fnmatch/fnmatch.c b/compat/fnmatch/fnmatch.c deleted file mode 100644 index 378c467401..0000000000 --- a/compat/fnmatch/fnmatch.c +++ /dev/null @@ -1,494 +0,0 @@ -/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#if HAVE_CONFIG_H -# include <config.h> -#endif - -/* Enable GNU extensions in fnmatch.h. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif - -#include <stddef.h> -#include <errno.h> -#include <fnmatch.h> -#include <ctype.h> - -#if HAVE_STRING_H || defined _LIBC -# include <string.h> -#else -# include <strings.h> -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include <stdlib.h> -#endif - -/* For platforms which support the ISO C amendment 1 functionality we - support user defined character classes. */ -#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ -# include <wchar.h> -# include <wctype.h> -#endif - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined NO_FNMATCH || defined NO_FNMATCH_CASEFOLD || \ - defined _LIBC || !defined __GNU_LIBRARY__ - - -# if defined STDC_HEADERS || !defined isascii -# define ISASCII(c) 1 -# else -# define ISASCII(c) isascii(c) -# endif - -# ifdef isblank -# define ISBLANK(c) (ISASCII (c) && isblank (c)) -# else -# define ISBLANK(c) ((c) == ' ' || (c) == '\t') -# endif -# ifdef isgraph -# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) -# else -# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) -# endif - -# define ISPRINT(c) (ISASCII (c) && isprint (c)) -# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) -# define ISALNUM(c) (ISASCII (c) && isalnum (c)) -# define ISALPHA(c) (ISASCII (c) && isalpha (c)) -# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) -# define ISLOWER(c) (ISASCII (c) && islower (c)) -# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) -# define ISSPACE(c) (ISASCII (c) && isspace (c)) -# define ISUPPER(c) (ISASCII (c) && isupper (c)) -# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) - -# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) - -# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -/* The GNU C library provides support for user-defined character classes - and the functions from ISO C amendment 1. */ -# ifdef CHARCLASS_NAME_MAX -# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX -# else -/* This shouldn't happen but some implementation might still have this - problem. Use a reasonable default value. */ -# define CHAR_CLASS_MAX_LENGTH 256 -# endif - -# ifdef _LIBC -# define IS_CHAR_CLASS(string) __wctype (string) -# else -# define IS_CHAR_CLASS(string) wctype (string) -# endif -# else -# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ - -# define IS_CHAR_CLASS(string) \ - (STREQ (string, "alpha") || STREQ (string, "upper") \ - || STREQ (string, "lower") || STREQ (string, "digit") \ - || STREQ (string, "alnum") || STREQ (string, "xdigit") \ - || STREQ (string, "space") || STREQ (string, "print") \ - || STREQ (string, "punct") || STREQ (string, "graph") \ - || STREQ (string, "cntrl") || STREQ (string, "blank")) -# endif - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -# if !defined _LIBC && !defined getenv -extern char *getenv (const char *name); -# endif - -# ifndef errno -extern int errno; -# endif - -# ifndef NULL -# define NULL 0 -# endif - -/* This function doesn't exist on most systems. */ - -# if !defined HAVE___STRCHRNUL && !defined _LIBC -static char * -__strchrnul (const char *s, int c) - - -{ - char *result = strchr (s, c); - if (result == NULL) - result = strchr (s, '\0'); - return result; -} -# endif - -# ifndef internal_function -/* Inside GNU libc we mark some function in a special way. In other - environments simply ignore the marking. */ -# define internal_function -# endif - -/* Match STRING against the filename pattern PATTERN, returning zero if - it matches, nonzero if not. */ -static int internal_fnmatch __P ((const char *pattern, const char *string, - int no_leading_period, int flags)) - internal_function; -static int -internal_function -internal_fnmatch (const char *pattern, const char *string, int no_leading_period, int flags) - - - - -{ - register const char *p = pattern, *n = string; - register unsigned char c; - -/* Note that this evaluates C many times. */ -# ifdef _LIBC -# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c)) -# else -# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) -# endif - - while ((c = *p++) != '\0') - { - c = FOLD (c); - - switch (c) - { - case '?': - if (*n == '\0') - return FNM_NOMATCH; - else if (*n == '/' && (flags & FNM_FILE_NAME)) - return FNM_NOMATCH; - else if (*n == '.' && no_leading_period - && (n == string - || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) - return FNM_NOMATCH; - break; - - case '\\': - if (!(flags & FNM_NOESCAPE)) - { - c = *p++; - if (c == '\0') - /* Trailing \ loses. */ - return FNM_NOMATCH; - c = FOLD (c); - } - if (FOLD ((unsigned char) *n) != c) - return FNM_NOMATCH; - break; - - case '*': - if (*n == '.' && no_leading_period - && (n == string - || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) - return FNM_NOMATCH; - - for (c = *p++; c == '?' || c == '*'; c = *p++) - { - if (*n == '/' && (flags & FNM_FILE_NAME)) - /* A slash does not match a wildcard under FNM_FILE_NAME. */ - return FNM_NOMATCH; - else if (c == '?') - { - /* A ? needs to match one character. */ - if (*n == '\0') - /* There isn't another character; no match. */ - return FNM_NOMATCH; - else - /* One character of the string is consumed in matching - this ? wildcard, so *??? won't match if there are - less than three characters. */ - ++n; - } - } - - if (c == '\0') - /* The wildcard(s) is/are the last element of the pattern. - If the name is a file name and contains another slash - this does mean it cannot match. */ - return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL - ? FNM_NOMATCH : 0); - else - { - const char *endp; - - endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0'); - - if (c == '[') - { - int flags2 = ((flags & FNM_FILE_NAME) - ? flags : (flags & ~FNM_PERIOD)); - - for (--p; n < endp; ++n) - if (internal_fnmatch (p, n, - (no_leading_period - && (n == string - || (n[-1] == '/' - && (flags - & FNM_FILE_NAME)))), - flags2) - == 0) - return 0; - } - else if (c == '/' && (flags & FNM_FILE_NAME)) - { - while (*n != '\0' && *n != '/') - ++n; - if (*n == '/' - && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD, - flags) == 0)) - return 0; - } - else - { - int flags2 = ((flags & FNM_FILE_NAME) - ? flags : (flags & ~FNM_PERIOD)); - - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *p; - c = FOLD (c); - for (--p; n < endp; ++n) - if (FOLD ((unsigned char) *n) == c - && (internal_fnmatch (p, n, - (no_leading_period - && (n == string - || (n[-1] == '/' - && (flags - & FNM_FILE_NAME)))), - flags2) == 0)) - return 0; - } - } - - /* If we come here no match is possible with the wildcard. */ - return FNM_NOMATCH; - - case '[': - { - /* Nonzero if the sense of the character class is inverted. */ - static int posixly_correct; - register int not; - char cold; - - if (posixly_correct == 0) - posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1; - - if (*n == '\0') - return FNM_NOMATCH; - - if (*n == '.' && no_leading_period && (n == string - || (n[-1] == '/' - && (flags - & FNM_FILE_NAME)))) - return FNM_NOMATCH; - - if (*n == '/' && (flags & FNM_FILE_NAME)) - /* `/' cannot be matched. */ - return FNM_NOMATCH; - - not = (*p == '!' || (posixly_correct < 0 && *p == '^')); - if (not) - ++p; - - c = *p++; - for (;;) - { - unsigned char fn = FOLD ((unsigned char) *n); - - if (!(flags & FNM_NOESCAPE) && c == '\\') - { - if (*p == '\0') - return FNM_NOMATCH; - c = FOLD ((unsigned char) *p); - ++p; - - if (c == fn) - goto matched; - } - else if (c == '[' && *p == ':') - { - /* Leave room for the null. */ - char str[CHAR_CLASS_MAX_LENGTH + 1]; - size_t c1 = 0; -# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) - wctype_t wt; -# endif - const char *startp = p; - - for (;;) - { - if (c1 > CHAR_CLASS_MAX_LENGTH) - /* The name is too long and therefore the pattern - is ill-formed. */ - return FNM_NOMATCH; - - c = *++p; - if (c == ':' && p[1] == ']') - { - p += 2; - break; - } - if (c < 'a' || c >= 'z') - { - /* This cannot possibly be a character class name. - Match it as a normal range. */ - p = startp; - c = '['; - goto normal_bracket; - } - str[c1++] = c; - } - str[c1] = '\0'; - -# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) - wt = IS_CHAR_CLASS (str); - if (wt == 0) - /* Invalid character class name. */ - return FNM_NOMATCH; - - if (__iswctype (__btowc ((unsigned char) *n), wt)) - goto matched; -# else - if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n)) - || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n)) - || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n)) - || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n)) - || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n)) - || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n)) - || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n)) - || (STREQ (str, "print") && ISPRINT ((unsigned char) *n)) - || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n)) - || (STREQ (str, "space") && ISSPACE ((unsigned char) *n)) - || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n)) - || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n))) - goto matched; -# endif - } - else if (c == '\0') - /* [ (unterminated) loses. */ - return FNM_NOMATCH; - else - { - normal_bracket: - if (FOLD (c) == fn) - goto matched; - - cold = c; - c = *p++; - - if (c == '-' && *p != ']') - { - /* It is a range. */ - unsigned char cend = *p++; - if (!(flags & FNM_NOESCAPE) && cend == '\\') - cend = *p++; - if (cend == '\0') - return FNM_NOMATCH; - - if (cold <= fn && fn <= FOLD (cend)) - goto matched; - - c = *p++; - } - } - - if (c == ']') - break; - } - - if (!not) - return FNM_NOMATCH; - break; - - matched: - /* Skip the rest of the [...] that already matched. */ - while (c != ']') - { - if (c == '\0') - /* [... (unterminated) loses. */ - return FNM_NOMATCH; - - c = *p++; - if (!(flags & FNM_NOESCAPE) && c == '\\') - { - if (*p == '\0') - return FNM_NOMATCH; - /* XXX 1003.2d11 is unclear if this is right. */ - ++p; - } - else if (c == '[' && *p == ':') - { - do - if (*++p == '\0') - return FNM_NOMATCH; - while (*p != ':' || p[1] == ']'); - p += 2; - c = *p; - } - } - if (not) - return FNM_NOMATCH; - } - break; - - default: - if (c != FOLD ((unsigned char) *n)) - return FNM_NOMATCH; - } - - ++n; - } - - if (*n == '\0') - return 0; - - if ((flags & FNM_LEADING_DIR) && *n == '/') - /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ - return 0; - - return FNM_NOMATCH; - -# undef FOLD -} - - -int -fnmatch (const char *pattern, const char *string, int flags) - - - -{ - return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/compat/fnmatch/fnmatch.h b/compat/fnmatch/fnmatch.h deleted file mode 100644 index cc3ec37940..0000000000 --- a/compat/fnmatch/fnmatch.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _FNMATCH_H -#define _FNMATCH_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 -# if !defined __GLIBC__ || !defined __P -# undef __P -# define __P(protos) protos -# endif -#else /* Not C++ or ANSI C. */ -# undef __P -# define __P(protos) () -/* We can get away without defining `const' here only because in this file - it is used only inside the prototype for `fnmatch', which is elided in - non-ANSI C where `const' is problematical. */ -#endif /* C++ or ANSI C. */ - -#ifndef const -# if (defined __STDC__ && __STDC__) || defined __cplusplus -# define __const const -# else -# define __const -# endif -#endif - -/* We #undef these before defining them because some losing systems - (HP-UX A.08.07 for example) define these in <unistd.h>. */ -#undef FNM_PATHNAME -#undef FNM_NOESCAPE -#undef FNM_PERIOD - -/* Bits set in the FLAGS argument to `fnmatch'. */ -#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ -#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ -#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ - -#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE -# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ -# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ -# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ -#endif - -/* Value returned by `fnmatch' if STRING does not match PATTERN. */ -#define FNM_NOMATCH 1 - -/* This value is returned if the implementation does not support - `fnmatch'. Since this is not the case here it will never be - returned but the conformance test suites still require the symbol - to be defined. */ -#ifdef _XOPEN_SOURCE -# define FNM_NOSYS (-1) -#endif - -/* Match NAME against the filename pattern PATTERN, - returning zero if it matches, FNM_NOMATCH if not. */ -extern int fnmatch __P ((__const char *__pattern, __const char *__name, - int __flags)); - -#ifdef __cplusplus -} -#endif - -#endif /* fnmatch.h */ diff --git a/compat/mingw.c b/compat/mingw.c index fecb98bcff..e9892f8ee4 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -304,23 +304,6 @@ int mingw_open (const char *filename, int oflags, ...) return fd; } -#undef write -ssize_t mingw_write(int fd, const void *buf, size_t count) -{ - /* - * While write() calls to a file on a local disk are translated - * into WriteFile() calls with a maximum size of 64KB on Windows - * XP and 256KB on Vista, no such cap is placed on writes to - * files over the network on Windows XP. Unfortunately, there - * seems to be a limit of 32MB-28KB on X64 and 64MB-32KB on x86; - * bigger writes fail on Windows XP. - * So we cap to a nice 31MB here to avoid write failures over - * the net without changing the number of WriteFile() calls in - * the local case. - */ - return write(fd, buf, min(count, 31 * 1024 * 1024)); -} - static BOOL WINAPI ctrl_ignore(DWORD type) { return TRUE; diff --git a/compat/mingw.h b/compat/mingw.h index 92cd728d3d..e033e720c9 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -180,9 +180,6 @@ int mingw_rmdir(const char *path); int mingw_open (const char *filename, int oflags, ...); #define open mingw_open -ssize_t mingw_write(int fd, const void *buf, size_t count); -#define write mingw_write - int mingw_fgetc(FILE *stream); #define fgetc mingw_fgetc diff --git a/compat/regex/regcomp.c b/compat/regex/regcomp.c index b2c5d465ac..06f3088708 100644 --- a/compat/regex/regcomp.c +++ b/compat/regex/regcomp.c @@ -339,7 +339,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, p = buf; *p++ = dfa->nodes[node].opr.c; while (++node < dfa->nodes_len - && dfa->nodes[node].type == CHARACTER + && dfa->nodes[node].type == CHARACTER && dfa->nodes[node].mb_partial) *p++ = dfa->nodes[node].opr.c; memset (&state, '\0', sizeof (state)); diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl index 4374771df2..4374771df2 100644..100755 --- a/compat/vcbuild/scripts/clink.pl +++ b/compat/vcbuild/scripts/clink.pl diff --git a/compat/vcbuild/scripts/lib.pl b/compat/vcbuild/scripts/lib.pl index d8054e469f..d8054e469f 100644..100755 --- a/compat/vcbuild/scripts/lib.pl +++ b/compat/vcbuild/scripts/lib.pl @@ -21,6 +21,7 @@ struct config_source { } buf; } u; const char *name; + const char *path; int die_on_error; int linenr; int eof; @@ -84,8 +85,12 @@ static int handle_path_include(const char *path, struct config_include_data *inc { int ret = 0; struct strbuf buf = STRBUF_INIT; - char *expanded = expand_user_path(path); + char *expanded; + if (!path) + return config_error_nonbool("include.path"); + + expanded = expand_user_path(path); if (!expanded) return error("Could not expand include path '%s'", path); path = expanded; @@ -97,12 +102,12 @@ static int handle_path_include(const char *path, struct config_include_data *inc if (!is_absolute_path(path)) { char *slash; - if (!cf || !cf->name) + if (!cf || !cf->path) return error("relative config includes must come from files"); - slash = find_last_dir_sep(cf->name); + slash = find_last_dir_sep(cf->path); if (slash) - strbuf_add(&buf, cf->name, slash - cf->name + 1); + strbuf_add(&buf, cf->path, slash - cf->path + 1); strbuf_addstr(&buf, path); path = buf.buf; } @@ -663,20 +668,7 @@ static int git_default_core_config(const char *var, const char *value) trust_ctime = git_config_bool(var, value); return 0; } - if (!strcmp(var, "core.statinfo") || - !strcmp(var, "core.checkstat")) { - /* - * NEEDSWORK: statinfo was a typo in v1.8.2 that has - * never been advertised. we will remove it at Git - * 2.0 boundary. - */ - if (!strcmp(var, "core.statinfo")) { - static int warned; - if (!warned++) { - warning("'core.statinfo' will be removed in Git 2.0; " - "use 'core.checkstat' instead."); - } - } + if (!strcmp(var, "core.checkstat")) { if (!strcasecmp(value, "default")) check_stat = 1; else if (!strcasecmp(value, "minimal")) @@ -969,25 +961,25 @@ static int git_default_mailmap_config(const char *var, const char *value) int git_default_config(const char *var, const char *value, void *dummy) { - if (!prefixcmp(var, "core.")) + if (starts_with(var, "core.")) return git_default_core_config(var, value); - if (!prefixcmp(var, "user.")) + if (starts_with(var, "user.")) return git_ident_config(var, value, dummy); - if (!prefixcmp(var, "i18n.")) + if (starts_with(var, "i18n.")) return git_default_i18n_config(var, value); - if (!prefixcmp(var, "branch.")) + if (starts_with(var, "branch.")) return git_default_branch_config(var, value); - if (!prefixcmp(var, "push.")) + if (starts_with(var, "push.")) return git_default_push_config(var, value); - if (!prefixcmp(var, "mailmap.")) + if (starts_with(var, "mailmap.")) return git_default_mailmap_config(var, value); - if (!prefixcmp(var, "advice.")) + if (starts_with(var, "advice.")) return git_default_advice_config(var, value); if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) { @@ -1030,24 +1022,35 @@ static int do_config_from(struct config_source *top, config_fn_t fn, void *data) return ret; } -int git_config_from_file(config_fn_t fn, const char *filename, void *data) +static int do_config_from_file(config_fn_t fn, + const char *name, const char *path, FILE *f, void *data) { - int ret; - FILE *f = fopen(filename, "r"); + struct config_source top; - ret = -1; - if (f) { - struct config_source top; + top.u.file = f; + top.name = name; + top.path = path; + top.die_on_error = 1; + top.do_fgetc = config_file_fgetc; + top.do_ungetc = config_file_ungetc; + top.do_ftell = config_file_ftell; - top.u.file = f; - top.name = filename; - top.die_on_error = 1; - top.do_fgetc = config_file_fgetc; - top.do_ungetc = config_file_ungetc; - top.do_ftell = config_file_ftell; + return do_config_from(&top, fn, data); +} + +static int git_config_from_stdin(config_fn_t fn, void *data) +{ + return do_config_from_file(fn, "<stdin>", NULL, stdin, data); +} - ret = do_config_from(&top, fn, data); +int git_config_from_file(config_fn_t fn, const char *filename, void *data) +{ + int ret = -1; + FILE *f; + f = fopen(filename, "r"); + if (f) { + ret = do_config_from_file(fn, filename, filename, f, data); fclose(f); } return ret; @@ -1062,6 +1065,7 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf, top.u.buf.len = len; top.u.buf.pos = 0; top.name = name; + top.path = NULL; top.die_on_error = 0; top.do_fgetc = config_buf_fgetc; top.do_ungetc = config_buf_ungetc; @@ -1170,8 +1174,7 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config) } int git_config_with_options(config_fn_t fn, void *data, - const char *filename, - const char *blob_ref, + struct git_config_source *config_source, int respect_includes) { char *repo_config = NULL; @@ -1189,10 +1192,12 @@ int git_config_with_options(config_fn_t fn, void *data, * If we have a specific filename, use it. Otherwise, follow the * regular lookup sequence. */ - if (filename) - return git_config_from_file(fn, filename, data); - else if (blob_ref) - return git_config_from_blob_ref(fn, blob_ref, data); + if (config_source && config_source->use_stdin) + return git_config_from_stdin(fn, data); + else if (config_source && config_source->file) + return git_config_from_file(fn, config_source->file, data); + else if (config_source && config_source->blob) + return git_config_from_blob_ref(fn, config_source->blob, data); repo_config = git_pathdup("config"); ret = git_config_early(fn, data, repo_config); @@ -1203,22 +1208,21 @@ int git_config_with_options(config_fn_t fn, void *data, int git_config(config_fn_t fn, void *data) { - return git_config_with_options(fn, data, NULL, NULL, 1); + return git_config_with_options(fn, data, NULL, 1); } /* * Find all the stuff for git_config_set() below. */ -#define MAX_MATCHES 512 - static struct { int baselen; char *key; int do_not_match; regex_t *value_regex; int multi_replace; - size_t offset[MAX_MATCHES]; + size_t *offset; + unsigned int offset_alloc; enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state; int seen; } store; @@ -1241,11 +1245,11 @@ static int store_aux(const char *key, const char *value, void *cb) if (matches(key, value)) { if (store.seen == 1 && store.multi_replace == 0) { warning("%s has multiple values", key); - } else if (store.seen >= MAX_MATCHES) { - error("too many matches for %s", key); - return 1; } + ALLOC_GROW(store.offset, store.seen + 1, + store.offset_alloc); + store.offset[store.seen] = cf->do_ftell(cf); store.seen++; } @@ -1273,11 +1277,15 @@ static int store_aux(const char *key, const char *value, void *cb) * Do not increment matches: this is no match, but we * just made sure we are in the desired section. */ + ALLOC_GROW(store.offset, store.seen + 1, + store.offset_alloc); store.offset[store.seen] = cf->do_ftell(cf); /* fallthru */ case SECTION_END_SEEN: case START: if (matches(key, value)) { + ALLOC_GROW(store.offset, store.seen + 1, + store.offset_alloc); store.offset[store.seen] = cf->do_ftell(cf); store.state = KEY_SEEN; store.seen++; @@ -1285,6 +1293,9 @@ static int store_aux(const char *key, const char *value, void *cb) if (strrchr(key, '.') - key == store.baselen && !strncmp(key, store.key, store.baselen)) { store.state = SECTION_SEEN; + ALLOC_GROW(store.offset, + store.seen + 1, + store.offset_alloc); store.offset[store.seen] = cf->do_ftell(cf); } } @@ -1583,6 +1594,7 @@ int git_config_set_multivar_in_file(const char *config_filename, } } + ALLOC_GROW(store.offset, 1, store.offset_alloc); store.offset[0] = 0; store.state = START; store.seen = 0; @@ -1872,7 +1884,7 @@ int parse_config_key(const char *var, const char *dot; /* Does it start with "section." ? */ - if (prefixcmp(var, section) || var[section_len] != '.') + if (!starts_with(var, section) || var[section_len] != '.') return -1; /* diff --git a/config.mak.uname b/config.mak.uname index 82d549e48b..6069a44350 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -108,7 +108,6 @@ ifeq ($(uname_S),SunOS) NO_MKDTEMP = YesPlease NO_MKSTEMPS = YesPlease NO_REGEX = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease NO_MSGFMT_EXTENDED_OPTIONS = YesPlease HAVE_DEV_TTY = YesPlease ifeq ($(uname_R),5.6) @@ -198,6 +197,13 @@ ifeq ($(uname_S),OpenBSD) BASIC_LDFLAGS += -L/usr/local/lib HAVE_PATHS_H = YesPlease endif +ifeq ($(uname_S),MirBSD) + NO_STRCASESTR = YesPlease + NO_MEMMEM = YesPlease + USE_ST_TIMESPEC = YesPlease + NEEDS_LIBICONV = YesPlease + HAVE_PATHS_H = YesPlease +endif ifeq ($(uname_S),NetBSD) ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2) NEEDS_LIBICONV = YesPlease @@ -252,7 +258,6 @@ ifeq ($(uname_S),IRIX) # issue, comment out the NO_MMAP statement. NO_MMAP = YesPlease NO_REGEX = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease SNPRINTF_RETURNS_BOGUS = YesPlease SHELL_PATH = /usr/gnu/bin/bash NEEDS_LIBGEN = YesPlease @@ -272,7 +277,6 @@ ifeq ($(uname_S),IRIX64) # issue, comment out the NO_MMAP statement. NO_MMAP = YesPlease NO_REGEX = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease SNPRINTF_RETURNS_BOGUS = YesPlease SHELL_PATH = /usr/gnu/bin/bash NEEDS_LIBGEN = YesPlease @@ -289,7 +293,6 @@ ifeq ($(uname_S),HP-UX) NO_UNSETENV = YesPlease NO_HSTRERROR = YesPlease NO_SYS_SELECT_H = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease SNPRINTF_RETURNS_BOGUS = YesPlease NO_NSEC = YesPlease ifeq ($(uname_R),B.11.00) @@ -320,7 +323,6 @@ ifeq ($(uname_S),Windows) NO_UNSETENV = YesPlease NO_STRCASESTR = YesPlease NO_STRLCPY = YesPlease - NO_FNMATCH = YesPlease NO_MEMMEM = YesPlease # NEEDS_LIBICONV = YesPlease NO_ICONV = YesPlease @@ -382,13 +384,11 @@ ifeq ($(uname_S),Interix) NO_INET_NTOP = YesPlease NO_INET_PTON = YesPlease NO_SOCKADDR_STORAGE = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease endif ifeq ($(uname_R),5.2) NO_INET_NTOP = YesPlease NO_INET_PTON = YesPlease NO_SOCKADDR_STORAGE = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease endif endif ifeq ($(uname_S),Minix) @@ -433,7 +433,6 @@ ifeq ($(uname_S),NONSTOP_KERNEL) 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 @@ -477,7 +476,6 @@ ifneq (,$(findstring MINGW,$(uname_S))) NO_UNSETENV = YesPlease NO_STRCASESTR = YesPlease NO_STRLCPY = YesPlease - NO_FNMATCH = YesPlease NO_MEMMEM = YesPlease NEEDS_LIBICONV = YesPlease NO_STRTOUMAX = YesPlease @@ -531,7 +529,6 @@ ifeq ($(uname_S),QNX) EXPAT_NEEDS_XMLPARSE_H = YesPlease HAVE_STRINGS_H = YesPlease NEEDS_SOCKET = YesPlease - NO_FNMATCH_CASEFOLD = YesPlease NO_GETPAGESIZE = YesPlease NO_ICONV = YesPlease NO_MEMMEM = YesPlease diff --git a/configure.ac b/configure.ac index 2f433939dc..24ab7383ae 100644 --- a/configure.ac +++ b/configure.ac @@ -901,34 +901,6 @@ GIT_CHECK_FUNC(strcasestr, [NO_STRCASESTR=YesPlease]) GIT_CONF_SUBST([NO_STRCASESTR]) # -# Define NO_FNMATCH if you don't have fnmatch -GIT_CHECK_FUNC(fnmatch, -[NO_FNMATCH=], -[NO_FNMATCH=YesPlease]) -GIT_CONF_SUBST([NO_FNMATCH]) -# -# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the -# FNM_CASEFOLD GNU extension. -AC_CACHE_CHECK([whether the fnmatch function supports the FNMATCH_CASEFOLD GNU extension], - [ac_cv_c_excellent_fnmatch], [ -AC_EGREP_CPP(yippeeyeswehaveit, - AC_LANG_PROGRAM([ -#include <fnmatch.h> -], -[#ifdef FNM_CASEFOLD -yippeeyeswehaveit -#endif -]), - [ac_cv_c_excellent_fnmatch=yes], - [ac_cv_c_excellent_fnmatch=no]) -]) -if test $ac_cv_c_excellent_fnmatch = yes; then - NO_FNMATCH_CASEFOLD= -else - NO_FNMATCH_CASEFOLD=YesPlease -fi -GIT_CONF_SUBST([NO_FNMATCH_CASEFOLD]) -# # Define NO_MEMMEM if you don't have memmem. GIT_CHECK_FUNC(memmem, [NO_MEMMEM=], @@ -7,8 +7,11 @@ #include "remote.h" #include "connect.h" #include "url.h" +#include "string-list.h" +#include "sha1-array.h" static char *server_capabilities; +static const char *parse_feature_value(const char *, const char *, int *); static int check_ref(const char *name, int len, unsigned int flags) { @@ -43,13 +46,6 @@ int check_ref_type(const struct ref *ref, int flags) return check_ref(ref->name, strlen(ref->name), flags); } -static void add_extra_have(struct extra_have_objects *extra, unsigned char *sha1) -{ - ALLOC_GROW(extra->array, extra->nr + 1, extra->alloc); - hashcpy(&(extra->array[extra->nr][0]), sha1); - extra->nr++; -} - static void die_initial_contact(int got_at_least_one_head) { if (got_at_least_one_head) @@ -60,13 +56,70 @@ static void die_initial_contact(int got_at_least_one_head) "and the repository exists."); } +static void parse_one_symref_info(struct string_list *symref, const char *val, int len) +{ + char *sym, *target; + struct string_list_item *item; + + if (!len) + return; /* just "symref" */ + /* e.g. "symref=HEAD:refs/heads/master" */ + sym = xmalloc(len + 1); + memcpy(sym, val, len); + sym[len] = '\0'; + target = strchr(sym, ':'); + if (!target) + /* just "symref=something" */ + goto reject; + *(target++) = '\0'; + if (check_refname_format(sym, REFNAME_ALLOW_ONELEVEL) || + check_refname_format(target, REFNAME_ALLOW_ONELEVEL)) + /* "symref=bogus:pair */ + goto reject; + item = string_list_append(symref, sym); + item->util = target; + return; +reject: + free(sym); + return; +} + +static void annotate_refs_with_symref_info(struct ref *ref) +{ + struct string_list symref = STRING_LIST_INIT_DUP; + const char *feature_list = server_capabilities; + + while (feature_list) { + int len; + const char *val; + + val = parse_feature_value(feature_list, "symref", &len); + if (!val) + break; + parse_one_symref_info(&symref, val, len); + feature_list = val + 1; + } + sort_string_list(&symref); + + for (; ref; ref = ref->next) { + struct string_list_item *item; + item = string_list_lookup(&symref, ref->name); + if (!item) + continue; + ref->symref = xstrdup((char *)item->util); + } + string_list_clear(&symref, 0); +} + /* * Read all the refs from the other end */ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, struct ref **list, unsigned int flags, - struct extra_have_objects *extra_have) + struct sha1_array *extra_have, + struct sha1_array *shallow_points) { + struct ref **orig_list = list; int got_at_least_one_head = 0; *list = NULL; @@ -87,9 +140,18 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, if (!len) break; - if (len > 4 && !prefixcmp(buffer, "ERR ")) + if (len > 4 && starts_with(buffer, "ERR ")) die("remote error: %s", buffer + 4); + if (len == 48 && starts_with(buffer, "shallow ")) { + if (get_sha1_hex(buffer + 8, old_sha1)) + die("protocol error: expected shallow sha-1, got '%s'", buffer + 8); + if (!shallow_points) + die("repository on the other end cannot be shallow"); + sha1_array_append(shallow_points, old_sha1); + continue; + } + if (len < 42 || get_sha1_hex(buffer, old_sha1) || buffer[40] != ' ') die("protocol error: expected sha/ref, got '%s'", buffer); name = buffer + 41; @@ -102,7 +164,7 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, if (extra_have && name_len == 5 && !memcmp(".have", name, 5)) { - add_extra_have(extra_have, old_sha1); + sha1_array_append(extra_have, old_sha1); continue; } @@ -114,10 +176,13 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, list = &ref->next; got_at_least_one_head = 1; } + + annotate_refs_with_symref_info(*orig_list); + return list; } -const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp) +static const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp) { int len; @@ -171,10 +236,34 @@ int server_supports(const char *feature) enum protocol { PROTO_LOCAL = 1, + PROTO_FILE, PROTO_SSH, PROTO_GIT }; +int url_is_local_not_ssh(const char *url) +{ + const char *colon = strchr(url, ':'); + const char *slash = strchr(url, '/'); + return !colon || (slash && slash < colon) || + has_dos_drive_prefix(url); +} + +static const char *prot_name(enum protocol protocol) +{ + switch (protocol) { + case PROTO_LOCAL: + case PROTO_FILE: + return "file"; + case PROTO_SSH: + return "ssh"; + case PROTO_GIT: + return "git"; + default: + return "unkown protocol"; + } +} + static enum protocol get_protocol(const char *name) { if (!strcmp(name, "ssh")) @@ -186,7 +275,7 @@ static enum protocol get_protocol(const char *name) if (!strcmp(name, "ssh+git")) return PROTO_SSH; if (!strcmp(name, "file")) - return PROTO_LOCAL; + return PROTO_FILE; die("I don't handle protocol '%s'", name); } @@ -466,55 +555,31 @@ static struct child_process *git_proxy_connect(int fd[2], char *host) return proxy; } -#define MAX_CMD_LEN 1024 - -static char *get_port(char *host) +static const char *get_port_numeric(const char *p) { char *end; - char *p = strchr(host, ':'); - if (p) { long port = strtol(p + 1, &end, 10); if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) { - *p = '\0'; - return p+1; + return p; } } return NULL; } -static struct child_process no_fork; - /* - * This returns a dummy child_process if the transport protocol does not - * need fork(2), or a struct child_process object if it does. Once done, - * finish the connection with finish_connect() with the value returned from - * this function (it is safe to call finish_connect() with NULL to support - * the former case). - * - * If it returns, the connect is successful; it just dies on errors (this - * will hopefully be changed in a libification effort, to return NULL when - * the connection failed). + * Extract protocol and relevant parts from the specified connection URL. + * The caller must free() the returned strings. */ -struct child_process *git_connect(int fd[2], const char *url_orig, - const char *prog, int flags) +static enum protocol parse_connect_url(const char *url_orig, char **ret_host, + char **ret_path) { char *url; char *host, *path; char *end; - int c; - struct child_process *conn = &no_fork; + int separator = '/'; enum protocol protocol = PROTO_LOCAL; - int free_path = 0; - char *port = NULL; - const char **arg; - struct strbuf cmd; - - /* Without this we cannot rely on waitpid() to tell - * what happened to our children. - */ - signal(SIGCHLD, SIG_DFL); if (is_url(url_orig)) url = url_decode(url_orig); @@ -526,40 +591,33 @@ struct child_process *git_connect(int fd[2], const char *url_orig, *host = '\0'; protocol = get_protocol(url); host += 3; - c = '/'; } else { host = url; - c = ':'; + if (!url_is_local_not_ssh(url)) { + protocol = PROTO_SSH; + separator = ':'; + } } /* - * Don't do destructive transforms with git:// as that - * protocol code does '[]' unwrapping of its own. + * Don't do destructive transforms as protocol code does + * '[]' unwrapping in get_host_and_port() */ if (host[0] == '[') { end = strchr(host + 1, ']'); if (end) { - if (protocol != PROTO_GIT) { - *end = 0; - host++; - } end++; } else end = host; } else end = host; - path = strchr(end, c); - if (path && !has_dos_drive_prefix(end)) { - if (c == ':') { - if (host != url || path < strchrnul(host, '/')) { - protocol = PROTO_SSH; - *path++ = '\0'; - } else /* '/' in the host part, assume local path */ - path = end; - } - } else + if (protocol == PROTO_LOCAL) path = end; + else if (protocol == PROTO_FILE && has_dos_drive_prefix(end)) + path = end; /* "file://$(pwd)" may be "file://C:/projects/repo" */ + else + path = strchr(end, separator); if (!path || !*path) die("No path specified. See 'man git-pull' for valid url syntax"); @@ -568,33 +626,67 @@ struct child_process *git_connect(int fd[2], const char *url_orig, * null-terminate hostname and point path to ~ for URL's like this: * ssh://host.xz/~user/repo */ - if (protocol != PROTO_LOCAL && host != url) { - char *ptr = path; + + end = path; /* Need to \0 terminate host here */ + if (separator == ':') + path++; /* path starts after ':' */ + if (protocol == PROTO_GIT || protocol == PROTO_SSH) { if (path[1] == '~') path++; - else { - path = xstrdup(ptr); - free_path = 1; - } - - *ptr = '\0'; } - /* - * Add support for ssh port: ssh://host.xy:<port>/... + path = xstrdup(path); + *end = '\0'; + + *ret_host = xstrdup(host); + *ret_path = path; + free(url); + return protocol; +} + +static struct child_process no_fork; + +/* + * This returns a dummy child_process if the transport protocol does not + * need fork(2), or a struct child_process object if it does. Once done, + * finish the connection with finish_connect() with the value returned from + * this function (it is safe to call finish_connect() with NULL to support + * the former case). + * + * If it returns, the connect is successful; it just dies on errors (this + * will hopefully be changed in a libification effort, to return NULL when + * the connection failed). + */ +struct child_process *git_connect(int fd[2], const char *url, + const char *prog, int flags) +{ + char *hostandport, *path; + struct child_process *conn = &no_fork; + enum protocol protocol; + const char **arg; + struct strbuf cmd = STRBUF_INIT; + + /* Without this we cannot rely on waitpid() to tell + * what happened to our children. */ - if (protocol == PROTO_SSH && host != url) - port = get_port(end); + signal(SIGCHLD, SIG_DFL); - if (protocol == PROTO_GIT) { + protocol = parse_connect_url(url, &hostandport, &path); + if (flags & CONNECT_DIAG_URL) { + printf("Diag: url=%s\n", url ? url : "NULL"); + printf("Diag: protocol=%s\n", prot_name(protocol)); + printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL"); + printf("Diag: path=%s\n", path ? path : "NULL"); + conn = NULL; + } else if (protocol == PROTO_GIT) { /* These underlying connection commands die() if they * cannot connect. */ - char *target_host = xstrdup(host); - if (git_use_proxy(host)) - conn = git_proxy_connect(fd, host); + char *target_host = xstrdup(hostandport); + if (git_use_proxy(hostandport)) + conn = git_proxy_connect(fd, hostandport); else - git_tcp_connect(fd, host, flags); + git_tcp_connect(fd, hostandport, flags); /* * Separate original protocol components prog and path * from extended host header with a NUL byte. @@ -607,55 +699,51 @@ struct child_process *git_connect(int fd[2], const char *url_orig, prog, path, 0, target_host, 0); free(target_host); - free(url); - if (free_path) - free(path); - return conn; - } - - conn = xcalloc(1, sizeof(*conn)); - - strbuf_init(&cmd, MAX_CMD_LEN); - strbuf_addstr(&cmd, prog); - strbuf_addch(&cmd, ' '); - sq_quote_buf(&cmd, path); - if (cmd.len >= MAX_CMD_LEN) - die("command line too long"); - - conn->in = conn->out = -1; - conn->argv = arg = xcalloc(7, sizeof(*arg)); - if (protocol == PROTO_SSH) { - const char *ssh = getenv("GIT_SSH"); - int putty = ssh && strcasestr(ssh, "plink"); - if (!ssh) ssh = "ssh"; - - *arg++ = ssh; - if (putty && !strcasestr(ssh, "tortoiseplink")) - *arg++ = "-batch"; - if (port) { - /* P is for PuTTY, p is for OpenSSH */ - *arg++ = putty ? "-P" : "-p"; - *arg++ = port; + } else { + conn = xcalloc(1, sizeof(*conn)); + + strbuf_addstr(&cmd, prog); + strbuf_addch(&cmd, ' '); + sq_quote_buf(&cmd, path); + + conn->in = conn->out = -1; + conn->argv = arg = xcalloc(7, sizeof(*arg)); + if (protocol == PROTO_SSH) { + const char *ssh = getenv("GIT_SSH"); + int putty = ssh && strcasestr(ssh, "plink"); + char *ssh_host = hostandport; + const char *port = NULL; + get_host_and_port(&ssh_host, &port); + port = get_port_numeric(port); + + if (!ssh) ssh = "ssh"; + + *arg++ = ssh; + if (putty && !strcasestr(ssh, "tortoiseplink")) + *arg++ = "-batch"; + if (port) { + /* P is for PuTTY, p is for OpenSSH */ + *arg++ = putty ? "-P" : "-p"; + *arg++ = port; + } + *arg++ = ssh_host; + } else { + /* remove repo-local variables from the environment */ + conn->env = local_repo_env; + conn->use_shell = 1; } - *arg++ = host; - } - else { - /* remove repo-local variables from the environment */ - conn->env = local_repo_env; - conn->use_shell = 1; - } - *arg++ = cmd.buf; - *arg = NULL; + *arg++ = cmd.buf; + *arg = NULL; - if (start_command(conn)) - die("unable to fork"); + if (start_command(conn)) + die("unable to fork"); - fd[0] = conn->out; /* read from child's stdout */ - fd[1] = conn->in; /* write to child's stdin */ - strbuf_release(&cmd); - free(url); - if (free_path) - free(path); + fd[0] = conn->out; /* read from child's stdout */ + fd[1] = conn->in; /* write to child's stdin */ + strbuf_release(&cmd); + } + free(hostandport); + free(path); return conn; } @@ -2,12 +2,13 @@ #define CONNECT_H #define CONNECT_VERBOSE (1u << 0) +#define CONNECT_DIAG_URL (1u << 1) extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags); extern int finish_connect(struct child_process *conn); extern int git_connection_is_socket(struct child_process *conn); extern int server_supports(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 int url_is_local_not_ssh(const char *url); #endif diff --git a/connected.c b/connected.c index fae8d64c12..be0253e21b 100644 --- a/connected.c +++ b/connected.c @@ -19,17 +19,17 @@ int check_everything_connected(sha1_iterate_fn fn, int quiet, void *cb_data) * * Returns 0 if everything is connected, non-zero otherwise. */ -int check_everything_connected_with_transport(sha1_iterate_fn fn, - int quiet, - void *cb_data, - struct transport *transport) +static int check_everything_connected_real(sha1_iterate_fn fn, + int quiet, + void *cb_data, + struct transport *transport, + const char *shallow_file) { struct child_process rev_list; - const char *argv[] = {"rev-list", "--objects", - "--stdin", "--not", "--all", NULL, NULL}; + const char *argv[9]; char commit[41]; unsigned char sha1[20]; - int err = 0; + int err = 0, ac = 0; struct packed_git *new_pack = NULL; if (fn(cb_data, sha1)) @@ -38,7 +38,7 @@ int check_everything_connected_with_transport(sha1_iterate_fn fn, if (transport && transport->smart_options && transport->smart_options->self_contained_and_connected && transport->pack_lockfile && - !suffixcmp(transport->pack_lockfile, ".keep")) { + ends_with(transport->pack_lockfile, ".keep")) { struct strbuf idx_file = STRBUF_INIT; strbuf_addstr(&idx_file, transport->pack_lockfile); strbuf_setlen(&idx_file, idx_file.len - 5); /* ".keep" */ @@ -47,8 +47,18 @@ int check_everything_connected_with_transport(sha1_iterate_fn fn, strbuf_release(&idx_file); } + if (shallow_file) { + argv[ac++] = "--shallow-file"; + argv[ac++] = shallow_file; + } + argv[ac++] = "rev-list"; + argv[ac++] = "--objects"; + argv[ac++] = "--stdin"; + argv[ac++] = "--not"; + argv[ac++] = "--all"; if (quiet) - argv[5] = "--quiet"; + argv[ac++] = "--quiet"; + argv[ac] = NULL; memset(&rev_list, 0, sizeof(rev_list)); rev_list.argv = argv; @@ -92,3 +102,19 @@ int check_everything_connected_with_transport(sha1_iterate_fn fn, sigchain_pop(SIGPIPE); return finish_command(&rev_list) || err; } + +int check_everything_connected_with_transport(sha1_iterate_fn fn, + int quiet, + void *cb_data, + struct transport *transport) +{ + return check_everything_connected_real(fn, quiet, cb_data, + transport, NULL); +} + +int check_shallow_connected(sha1_iterate_fn fn, int quiet, void *cb_data, + const char *shallow_file) +{ + return check_everything_connected_real(fn, quiet, cb_data, + NULL, shallow_file); +} diff --git a/connected.h b/connected.h index 0b060b7429..071d408f38 100644 --- a/connected.h +++ b/connected.h @@ -18,6 +18,8 @@ typedef int (*sha1_iterate_fn)(void *, unsigned char [20]); * Return 0 if Ok, non zero otherwise (i.e. some missing objects) */ extern int check_everything_connected(sha1_iterate_fn, int quiet, void *cb_data); +extern int check_shallow_connected(sha1_iterate_fn, int quiet, void *cb_data, + const char *shallow_file); extern int check_everything_connected_with_transport(sha1_iterate_fn, int quiet, void *cb_data, struct transport *transport); diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl index 23da787dc5..23da787dc5 100644..100755 --- a/contrib/buildsystems/engine.pl +++ b/contrib/buildsystems/engine.pl diff --git a/contrib/buildsystems/generate b/contrib/buildsystems/generate index bc10f25ff2..bc10f25ff2 100644..100755 --- a/contrib/buildsystems/generate +++ b/contrib/buildsystems/generate diff --git a/contrib/buildsystems/parse.pl b/contrib/buildsystems/parse.pl index c9656ece99..c9656ece99 100644..100755 --- a/contrib/buildsystems/parse.pl +++ b/contrib/buildsystems/parse.pl diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index dba3c15700..87de809d23 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1,5 +1,3 @@ -#!bash -# # bash/zsh completion support for core Git. # # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> @@ -180,9 +178,9 @@ _get_comp_words_by_ref () } fi -__gitcompadd () +__gitcompappend () { - local i=0 + local i=${#COMPREPLY[@]} for x in $1; do if [[ "$x" == "$3"* ]]; then COMPREPLY[i++]="$2$x$4" @@ -190,6 +188,12 @@ __gitcompadd () done } +__gitcompadd () +{ + COMPREPLY=() + __gitcompappend "$@" +} + # Generates completion reply, appending a space to possible completion words, # if necessary. # It accepts 1 to 4 arguments: @@ -220,6 +224,14 @@ __gitcomp () esac } +# Variation of __gitcomp_nl () that appends to the existing list of +# completion candidates, COMPREPLY. +__gitcomp_nl_append () +{ + local IFS=$'\n' + __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }" +} + # Generates completion reply from newline-separated possible completion words # by appending a space to all of them. # It accepts 1 to 4 arguments: @@ -231,8 +243,8 @@ __gitcomp () # appended. __gitcomp_nl () { - local IFS=$'\n' - __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }" + COMPREPLY=() + __gitcomp_nl_append "$@" } # Generates completion reply with compgen from newline-separated possible @@ -673,7 +685,6 @@ __git_list_porcelain_commands () index-pack) : plumbing;; init-db) : deprecated;; local-fetch) : plumbing;; - lost-found) : infrequent;; ls-files) : plumbing;; ls-remote) : plumbing;; ls-tree) : plumbing;; @@ -687,14 +698,12 @@ __git_list_porcelain_commands () pack-refs) : plumbing;; parse-remote) : plumbing;; patch-id) : plumbing;; - peek-remote) : plumbing;; prune) : plumbing;; prune-packed) : plumbing;; quiltimport) : import;; read-tree) : plumbing;; receive-pack) : plumbing;; remote-*) : transport;; - repo-config) : deprecated;; rerere) : plumbing;; rev-list) : plumbing;; rev-parse) : plumbing;; @@ -707,7 +716,6 @@ __git_list_porcelain_commands () ssh-*) : transport;; stripspace) : plumbing;; symbolic-ref) : plumbing;; - tar-tree) : deprecated;; unpack-file) : plumbing;; unpack-objects) : plumbing;; update-index) : plumbing;; @@ -1213,14 +1221,20 @@ _git_difftool () __git_complete_revlist_file } +__git_fetch_recurse_submodules="yes on-demand no" + __git_fetch_options=" --quiet --verbose --append --upload-pack --force --keep --depth= - --tags --no-tags --all --prune --dry-run + --tags --no-tags --all --prune --dry-run --recurse-submodules= " _git_fetch () { case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; --*) __gitcomp "$__git_fetch_options" return @@ -1491,6 +1505,12 @@ _git_mergetool () _git_merge_base () { + case "$cur" in + --*) + __gitcomp "--octopus --independent --is-ancestor --fork-point" + return + ;; + esac __gitcomp_nl "$(__git_refs)" } @@ -1569,6 +1589,10 @@ _git_pull () __git_complete_strategy && return case "$cur" in + --recurse-submodules=*) + __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; --*) __gitcomp " --rebase --no-rebase @@ -1581,6 +1605,8 @@ _git_pull () __git_complete_remote_or_refspec } +__git_push_recurse_submodules="check on-demand" + _git_push () { case "$prev" in @@ -1593,10 +1619,15 @@ _git_push () __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" return ;; + --recurse-submodules=*) + __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}" + return + ;; --*) __gitcomp " --all --mirror --tags --dry-run --force --verbose --receive-pack= --repo= --set-upstream + --recurse-submodules= " return ;; @@ -1623,7 +1654,7 @@ _git_rebase () --preserve-merges --stat --no-stat --committer-date-is-author-date --ignore-date --ignore-whitespace --whitespace= - --autosquash + --autosquash --fork-point --no-fork-point " return @@ -1833,6 +1864,7 @@ _git_config () branch.*) local pfx="${cur%.*}." cur_="${cur#*.}" __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "." + __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_" return ;; guitool.*.*) @@ -1875,6 +1907,7 @@ _git_config () remote.*) local pfx="${cur%.*}." cur_="${cur#*.}" __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." + __gitcomp_nl_append "pushdefault" "$pfx" "$cur_" return ;; url.*.*) @@ -1997,6 +2030,7 @@ _git_config () fetch.unpackLimit format.attach format.cc + format.coverLetter format.headers format.numbered format.pretty diff --git a/contrib/completion/git-completion.tcsh b/contrib/completion/git-completion.tcsh index eaacaf0c3e..6104a42a23 100644 --- a/contrib/completion/git-completion.tcsh +++ b/contrib/completion/git-completion.tcsh @@ -1,5 +1,3 @@ -#!tcsh -# # tcsh completion support for core Git. # # Copyright (C) 2012 Marc Khouzam <marc.khouzam@gmail.com> diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh index fac5e711eb..6b77968572 100644 --- a/contrib/completion/git-completion.zsh +++ b/contrib/completion/git-completion.zsh @@ -30,10 +30,10 @@ if [ -z "$script" ]; then local -a locations local e locations=( + $(dirname ${funcsourcetrace[1]%:*})/git-completion.bash '/etc/bash_completion.d/git' # fedora, old debian '/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian '/usr/share/bash-completion/git' # gentoo - $(dirname ${funcsourcetrace[1]%:*})/git-completion.bash ) for e in $locations; do test -f $e && script="$e" && break @@ -76,6 +76,14 @@ __gitcomp_nl () compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 } +__gitcomp_nl_append () +{ + emulate -L zsh + + local IFS=$'\n' + compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 +} + __gitcomp_file () { emulate -L zsh diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index 202e2e520f..7b732d2aeb 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -111,7 +111,7 @@ __git_ps1_show_upstream () ;; svn-remote.*.url) svn_remote[$((${#svn_remote[@]} + 1))]="$value" - svn_url_pattern+="\\|$value" + svn_url_pattern="$svn_url_pattern\\|$value" upstream=svn+git # default upstream is SVN if available, else git ;; esac diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts index 428cc1a9a1..dbe2abf277 100755 --- a/contrib/contacts/git-contacts +++ b/contrib/contacts/git-contacts @@ -96,8 +96,6 @@ sub scan_patches { next unless $id; if (m{^--- (?:a/(.+)|/dev/null)$}) { $source = $1; - } elsif (/^--- /) { - die "Cannot parse hunk source: $_\n"; } elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) { my $len = defined($2) ? $2 : 1; push @{$sources->{$source}{$id}}, [$1, $len] if $len; diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 635c96bc56..2a317fca44 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -60,7 +60,7 @@ #define gnome_keyring_memory_free gnome_keyring_free_password #define gnome_keyring_memory_strdup g_strdup -static const char* gnome_keyring_result_to_message(GnomeKeyringResult result) +static const char *gnome_keyring_result_to_message(GnomeKeyringResult result) { switch (result) { case GNOME_KEYRING_RESULT_OK: @@ -95,9 +95,9 @@ static const char* gnome_keyring_result_to_message(GnomeKeyringResult result) static void gnome_keyring_done_cb(GnomeKeyringResult result, gpointer user_data) { - gpointer *data = (gpointer*) user_data; - int *done = (int*) data[0]; - GnomeKeyringResult *r = (GnomeKeyringResult*) data[1]; + gpointer *data = (gpointer *)user_data; + int *done = (int *)data[0]; + GnomeKeyringResult *r = (GnomeKeyringResult *)data[1]; *r = result; *done = 1; @@ -130,34 +130,30 @@ static GnomeKeyringResult gnome_keyring_item_delete_sync(const char *keyring, gu /* * This credential struct and API is simplified from git's credential.{h,c} */ -struct credential -{ - char *protocol; - char *host; +struct credential { + char *protocol; + char *host; unsigned short port; - char *path; - char *username; - char *password; + char *path; + char *username; + char *password; }; -#define CREDENTIAL_INIT \ - { NULL,NULL,0,NULL,NULL,NULL } +#define CREDENTIAL_INIT { NULL, NULL, 0, NULL, NULL, NULL } -typedef int (*credential_op_cb)(struct credential*); +typedef int (*credential_op_cb)(struct credential *); -struct credential_operation -{ - char *name; +struct credential_operation { + char *name; credential_op_cb op; }; -#define CREDENTIAL_OP_END \ - { NULL,NULL } +#define CREDENTIAL_OP_END { NULL, NULL } /* ----------------- GNOME Keyring functions ----------------- */ /* create a special keyring option string, if path is given */ -static char* keyring_object(struct credential *c) +static char *keyring_object(struct credential *c) { if (!c->path) return NULL; @@ -170,7 +166,7 @@ static char* keyring_object(struct credential *c) static int keyring_get(struct credential *c) { - char* object = NULL; + char *object = NULL; GList *entries; GnomeKeyringNetworkPasswordData *password_data; GnomeKeyringResult result; @@ -204,7 +200,7 @@ static int keyring_get(struct credential *c) } /* pick the first one from the list */ - password_data = (GnomeKeyringNetworkPasswordData *) entries->data; + password_data = (GnomeKeyringNetworkPasswordData *)entries->data; gnome_keyring_memory_free(c->password); c->password = gnome_keyring_memory_strdup(password_data->password); @@ -221,7 +217,7 @@ static int keyring_get(struct credential *c) static int keyring_store(struct credential *c) { guint32 item_id; - char *object = NULL; + char *object = NULL; GnomeKeyringResult result; /* @@ -262,7 +258,7 @@ static int keyring_store(struct credential *c) static int keyring_erase(struct credential *c) { - char *object = NULL; + char *object = NULL; GList *entries; GnomeKeyringNetworkPasswordData *password_data; GnomeKeyringResult result; @@ -298,22 +294,20 @@ static int keyring_erase(struct credential *c) if (result == GNOME_KEYRING_RESULT_CANCELLED) return EXIT_SUCCESS; - if (result != GNOME_KEYRING_RESULT_OK) - { + if (result != GNOME_KEYRING_RESULT_OK) { g_critical("%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; + 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) - { + if (result != GNOME_KEYRING_RESULT_OK) { g_critical("%s", gnome_keyring_result_to_message(result)); return EXIT_FAILURE; } @@ -325,9 +319,8 @@ static int keyring_erase(struct credential *c) * Table with helper operation callbacks, used by generic * credential helper main function. */ -static struct credential_operation const credential_helper_ops[] = -{ - { "get", keyring_get }, +static struct credential_operation const credential_helper_ops[] = { + { "get", keyring_get }, { "store", keyring_store }, { "erase", keyring_erase }, CREDENTIAL_OP_END @@ -353,24 +346,23 @@ static void credential_clear(struct credential *c) static int credential_read(struct credential *c) { - char *buf; + char *buf; size_t line_len; - char *key; - char *value; + char *key; + char *value; key = buf = gnome_keyring_memory_alloc(1024); - while (fgets(buf, 1024, stdin)) - { + while (fgets(buf, 1024, stdin)) { line_len = strlen(buf); if (line_len && buf[line_len-1] == '\n') - buf[--line_len]='\0'; + buf[--line_len] = '\0'; if (!line_len) break; - value = strchr(buf,'='); + value = strchr(buf, '='); if (!value) { g_warning("invalid credential line: %s", key); gnome_keyring_memory_free(buf); @@ -384,7 +376,7 @@ static int credential_read(struct credential *c) } else if (!strcmp(key, "host")) { g_free(c->host); c->host = g_strdup(value); - value = strrchr(c->host,':'); + value = strrchr(c->host, ':'); if (value) { *value++ = '\0'; c->port = atoi(value); @@ -398,7 +390,8 @@ static int credential_read(struct credential *c) } else if (!strcmp(key, "password")) { gnome_keyring_memory_free(c->password); c->password = gnome_keyring_memory_strdup(value); - while (*value) *value++ = '\0'; + while (*value) + *value++ = '\0'; } /* * Ignore other lines; we don't know what they mean, but @@ -429,16 +422,16 @@ static void credential_write(const struct credential *c) static void usage(const char *name) { struct credential_operation const *try_op = credential_helper_ops; - const char *basename = strrchr(name,'/'); + 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); + fprintf(stderr, "%s", (try_op++)->name); if (try_op->name) - fprintf(stderr,"%s","|"); + fprintf(stderr, "%s", "|"); } - fprintf(stderr,"%s",">\n"); + fprintf(stderr, "%s", ">\n"); } int main(int argc, char *argv[]) @@ -446,7 +439,7 @@ int main(int argc, char *argv[]) int ret = EXIT_SUCCESS; struct credential_operation const *try_op = credential_helper_ops; - struct credential cred = CREDENTIAL_INIT; + struct credential cred = CREDENTIAL_INIT; if (!argv[1]) { usage(argv[0]); diff --git a/contrib/examples/git-whatchanged.sh b/contrib/examples/git-whatchanged.sh index 1fb9feb348..2edbdc6d99 100755 --- a/contrib/examples/git-whatchanged.sh +++ b/contrib/examples/git-whatchanged.sh @@ -9,12 +9,12 @@ case "$0" in *whatchanged) count= test -z "$diff_tree_flags" && - diff_tree_flags=$(git-repo-config --get whatchanged.difftree) + diff_tree_flags=$(git config --get whatchanged.difftree) diff_tree_default_flags='-c -M --abbrev' ;; *show) count=-n1 test -z "$diff_tree_flags" && - diff_tree_flags=$(git-repo-config --get show.difftree) + diff_tree_flags=$(git config --get show.difftree) diff_tree_default_flags='--cc --always' ;; esac test -z "$diff_tree_flags" && diff --git a/contrib/git-resurrect.sh b/contrib/git-resurrect.sh index a4ed4c3c62..d7e97bbc76 100755 --- a/contrib/git-resurrect.sh +++ b/contrib/git-resurrect.sh @@ -10,6 +10,7 @@ is rather slow but allows you to resurrect other people's topic branches." OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG= OPTIONS_SPEC="\ git resurrect $USAGE -- diff --git a/contrib/gitview/gitview b/contrib/gitview/gitview index 4c99dfb903..4e23c650fe 100755 --- a/contrib/gitview/gitview +++ b/contrib/gitview/gitview @@ -1205,7 +1205,7 @@ class GitView(object): #The first parent always continue on the same line try: - # check we alreay have the value + # check we already have the value tmp_node_pos = self.nodepos[commit.parent_sha1[0]] except KeyError: self.colours[commit.parent_sha1[0]] = colour diff --git a/contrib/hooks/post-receive-email b/contrib/hooks/post-receive-email index 8ee410f843..8747b84334 100755 --- a/contrib/hooks/post-receive-email +++ b/contrib/hooks/post-receive-email @@ -22,7 +22,6 @@ # For example, on debian the hook is stored in # /usr/share/git-core/contrib/hooks/post-receive-email: # -# chmod a+x post-receive-email # cd /path/to/your/repository.git # ln -sf /usr/share/git-core/contrib/hooks/post-receive-email hooks/post-receive # diff --git a/contrib/hooks/pre-auto-gc-battery b/contrib/hooks/pre-auto-gc-battery index 1f914c94aa..9d0c2d1990 100644..100755 --- a/contrib/hooks/pre-auto-gc-battery +++ b/contrib/hooks/pre-auto-gc-battery @@ -13,7 +13,6 @@ # For example, if the hook is stored in # /usr/share/git-core/contrib/hooks/pre-auto-gc-battery: # -# chmod a+x pre-auto-gc-battery # cd /path/to/your/repository.git # ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \ # hooks/pre-auto-gc diff --git a/contrib/hooks/setgitperms.perl b/contrib/hooks/setgitperms.perl index 2770a1b1d2..2770a1b1d2 100644..100755 --- a/contrib/hooks/setgitperms.perl +++ b/contrib/hooks/setgitperms.perl diff --git a/contrib/hooks/update-paranoid b/contrib/hooks/update-paranoid index d18b317b2f..d18b317b2f 100644..100755 --- a/contrib/hooks/update-paranoid +++ b/contrib/hooks/update-paranoid diff --git a/contrib/mw-to-git/Makefile b/contrib/mw-to-git/Makefile index f206f9655b..a4b6f7a2cd 100644 --- a/contrib/mw-to-git/Makefile +++ b/contrib/mw-to-git/Makefile @@ -18,9 +18,13 @@ SCRIPT_PERL+=git-mw.perl GIT_ROOT_DIR=../.. HERE=contrib/mw-to-git/ +INSTALL = install + SCRIPT_PERL_FULL=$(patsubst %,$(HERE)/%,$(SCRIPT_PERL)) INSTLIBDIR=$(shell $(MAKE) -C $(GIT_ROOT_DIR)/perl \ -s --no-print-directory instlibdir) +DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) +INSTLIBDIR_SQ = $(subst ','\'',$(INSTLIBDIR)) all: build @@ -30,7 +34,9 @@ test: all check: perlcritic test install_pm: - install $(GIT_MEDIAWIKI_PM) $(INSTLIBDIR)/$(GIT_MEDIAWIKI_PM) + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(INSTLIBDIR_SQ)/Git' + $(INSTALL) -m 644 $(GIT_MEDIAWIKI_PM) \ + '$(DESTDIR_SQ)$(INSTLIBDIR_SQ)/$(GIT_MEDIAWIKI_PM)' build: $(MAKE) -C $(GIT_ROOT_DIR) SCRIPT_PERL="$(SCRIPT_PERL_FULL)" \ @@ -43,7 +49,6 @@ install: install_pm clean: $(MAKE) -C $(GIT_ROOT_DIR) SCRIPT_PERL="$(SCRIPT_PERL_FULL)" \ clean-perl-script - rm $(INSTLIBDIR)/$(GIT_MEDIAWIKI_PM) perlcritic: perlcritic -5 $(SCRIPT_PERL) diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl index 476e0a2bc0..3f8d993afa 100755 --- a/contrib/mw-to-git/git-remote-mediawiki.perl +++ b/contrib/mw-to-git/git-remote-mediawiki.perl @@ -1315,7 +1315,7 @@ sub get_mw_namespace_id { # Store "notANameSpace" as special value for inexisting namespaces my $store_id = ($id || 'notANameSpace'); - # Store explicitely requested namespaces on disk + # Store explicitly requested namespaces on disk if (!exists $cached_mw_namespace_id{$name}) { run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}")); $cached_mw_namespace_id{$name} = 1; diff --git a/contrib/mw-to-git/t/test-gitmw-lib.sh b/contrib/mw-to-git/t/test-gitmw-lib.sh index ca6860ff30..3372b2af34 100755 --- a/contrib/mw-to-git/t/test-gitmw-lib.sh +++ b/contrib/mw-to-git/t/test-gitmw-lib.sh @@ -91,7 +91,7 @@ test_diff_directories () { # Check that <dir> contains exactly <N> files test_contains_N_files () { if test `ls -- "$1" | wc -l` -ne "$2"; then - echo "directory $1 sould contain $2 files" + echo "directory $1 should contain $2 files" echo "it contains these files:" ls "$1" false diff --git a/contrib/mw-to-git/t/test.config b/contrib/mw-to-git/t/test.config index 4cfebe9c69..5ba0684162 100644 --- a/contrib/mw-to-git/t/test.config +++ b/contrib/mw-to-git/t/test.config @@ -12,7 +12,7 @@ SERVER_ADDR=localhost TMP=/tmp DB_FILE=wikidb.sqlite -# If LIGHTTPD is not set to true, the script will use the defaut +# If LIGHTTPD is not set to true, the script will use the default # web server running in WIKI_DIR_INST. WIKI_DIR_INST=/var/www diff --git a/contrib/p4import/README b/contrib/p4import/README deleted file mode 100644 index b9892b6793..0000000000 --- a/contrib/p4import/README +++ /dev/null @@ -1 +0,0 @@ -Please see contrib/fast-import/git-p4 for a better Perforce importer. diff --git a/contrib/p4import/git-p4import.py b/contrib/p4import/git-p4import.py deleted file mode 100644 index 593d6a0682..0000000000 --- a/contrib/p4import/git-p4import.py +++ /dev/null @@ -1,365 +0,0 @@ -#!/usr/bin/env python -# -# This tool is copyright (c) 2006, Sean Estabrooks. -# It is released under the Gnu Public License, version 2. -# -# Import Perforce branches into Git repositories. -# Checking out the files is done by calling the standard p4 -# client which you must have properly configured yourself -# - -import marshal -import os -import sys -import time -import getopt - -if sys.hexversion < 0x02020000: - # The behavior of the marshal module changed significantly in 2.2 - sys.stderr.write("git-p4import.py: requires Python 2.2 or later.\n") - sys.exit(1) - -from signal import signal, \ - SIGPIPE, SIGINT, SIG_DFL, \ - default_int_handler - -signal(SIGPIPE, SIG_DFL) -s = signal(SIGINT, SIG_DFL) -if s != default_int_handler: - signal(SIGINT, s) - -def die(msg, *args): - for a in args: - msg = "%s %s" % (msg, a) - print "git-p4import fatal error:", msg - sys.exit(1) - -def usage(): - print "USAGE: git-p4import [-q|-v] [--authors=<file>] [-t <timezone>] [//p4repo/path <branch>]" - sys.exit(1) - -verbosity = 1 -logfile = "/dev/null" -ignore_warnings = False -stitch = 0 -tagall = True - -def report(level, msg, *args): - global verbosity - global logfile - for a in args: - msg = "%s %s" % (msg, a) - fd = open(logfile, "a") - fd.writelines(msg) - fd.close() - if level <= verbosity: - print msg - -class p4_command: - def __init__(self, _repopath): - try: - global logfile - self.userlist = {} - if _repopath[-1] == '/': - self.repopath = _repopath[:-1] - else: - self.repopath = _repopath - if self.repopath[-4:] != "/...": - self.repopath= "%s/..." % self.repopath - f=os.popen('p4 -V 2>>%s'%logfile, 'rb') - a = f.readlines() - if f.close(): - raise - except: - die("Could not find the \"p4\" command") - - def p4(self, cmd, *args): - global logfile - cmd = "%s %s" % (cmd, ' '.join(args)) - report(2, "P4:", cmd) - f=os.popen('p4 -G %s 2>>%s' % (cmd,logfile), 'rb') - list = [] - while 1: - try: - list.append(marshal.load(f)) - except EOFError: - break - self.ret = f.close() - return list - - def sync(self, id, force=False, trick=False, test=False): - if force: - ret = self.p4("sync -f %s@%s"%(self.repopath, id))[0] - elif trick: - ret = self.p4("sync -k %s@%s"%(self.repopath, id))[0] - elif test: - ret = self.p4("sync -n %s@%s"%(self.repopath, id))[0] - else: - ret = self.p4("sync %s@%s"%(self.repopath, id))[0] - if ret['code'] == "error": - data = ret['data'].upper() - if data.find('VIEW') > 0: - die("Perforce reports %s is not in client view"% self.repopath) - elif data.find('UP-TO-DATE') < 0: - die("Could not sync files from perforce", self.repopath) - - def changes(self, since=0): - try: - list = [] - for rec in self.p4("changes %s@%s,#head" % (self.repopath, since+1)): - list.append(rec['change']) - list.reverse() - return list - except: - return [] - - def authors(self, filename): - f=open(filename) - for l in f.readlines(): - self.userlist[l[:l.find('=')].rstrip()] = \ - (l[l.find('=')+1:l.find('<')].rstrip(),l[l.find('<')+1:l.find('>')]) - f.close() - for f,e in self.userlist.items(): - report(2, f, ":", e[0], " <", e[1], ">") - - def _get_user(self, id): - if not self.userlist.has_key(id): - try: - user = self.p4("users", id)[0] - self.userlist[id] = (user['FullName'], user['Email']) - except: - self.userlist[id] = (id, "") - return self.userlist[id] - - def _format_date(self, ticks): - symbol='+' - name = time.tzname[0] - offset = time.timezone - if ticks[8]: - name = time.tzname[1] - offset = time.altzone - if offset < 0: - offset *= -1 - symbol = '-' - localo = "%s%02d%02d %s" % (symbol, offset / 3600, offset % 3600, name) - tickso = time.strftime("%a %b %d %H:%M:%S %Y", ticks) - return "%s %s" % (tickso, localo) - - def where(self): - try: - return self.p4("where %s" % self.repopath)[-1]['path'] - except: - return "" - - def describe(self, num): - desc = self.p4("describe -s", num)[0] - self.msg = desc['desc'] - self.author, self.email = self._get_user(desc['user']) - self.date = self._format_date(time.localtime(long(desc['time']))) - return self - -class git_command: - def __init__(self): - try: - self.version = self.git("--version")[0][12:].rstrip() - except: - die("Could not find the \"git\" command") - try: - self.gitdir = self.get_single("rev-parse --git-dir") - report(2, "gdir:", self.gitdir) - except: - die("Not a git repository... did you forget to \"git init\" ?") - try: - self.cdup = self.get_single("rev-parse --show-cdup") - if self.cdup != "": - os.chdir(self.cdup) - self.topdir = os.getcwd() - report(2, "topdir:", self.topdir) - except: - die("Could not find top git directory") - - def git(self, cmd): - global logfile - report(2, "GIT:", cmd) - f=os.popen('git %s 2>>%s' % (cmd,logfile), 'rb') - r=f.readlines() - self.ret = f.close() - return r - - def get_single(self, cmd): - return self.git(cmd)[0].rstrip() - - def current_branch(self): - try: - testit = self.git("rev-parse --verify HEAD")[0] - return self.git("symbolic-ref HEAD")[0][11:].rstrip() - except: - return None - - def get_config(self, variable): - try: - return self.git("config --get %s" % variable)[0].rstrip() - except: - return None - - def set_config(self, variable, value): - try: - self.git("config %s %s"%(variable, value) ) - except: - die("Could not set %s to " % variable, value) - - def make_tag(self, name, head): - self.git("tag -f %s %s"%(name,head)) - - def top_change(self, branch): - try: - a=self.get_single("name-rev --tags refs/heads/%s" % branch) - loc = a.find(' tags/') + 6 - if a[loc:loc+3] != "p4/": - raise - return int(a[loc+3:][:-2]) - except: - return 0 - - def update_index(self): - self.git("ls-files -m -d -o -z | git update-index --add --remove -z --stdin") - - def checkout(self, branch): - self.git("checkout %s" % branch) - - def repoint_head(self, branch): - self.git("symbolic-ref HEAD refs/heads/%s" % branch) - - def remove_files(self): - self.git("ls-files | xargs rm") - - def clean_directories(self): - self.git("clean -d") - - def fresh_branch(self, branch): - report(1, "Creating new branch", branch) - self.git("ls-files | xargs rm") - os.remove(".git/index") - self.repoint_head(branch) - self.git("clean -d") - - def basedir(self): - return self.topdir - - def commit(self, author, email, date, msg, id): - self.update_index() - fd=open(".msg", "w") - fd.writelines(msg) - fd.close() - try: - current = self.get_single("rev-parse --verify HEAD") - head = "-p HEAD" - except: - current = "" - head = "" - tree = self.get_single("write-tree") - for r,l in [('DATE',date),('NAME',author),('EMAIL',email)]: - os.environ['GIT_AUTHOR_%s'%r] = l - os.environ['GIT_COMMITTER_%s'%r] = l - commit = self.get_single("commit-tree %s %s < .msg" % (tree,head)) - os.remove(".msg") - self.make_tag("p4/%s"%id, commit) - self.git("update-ref HEAD %s %s" % (commit, current) ) - -try: - opts, args = getopt.getopt(sys.argv[1:], "qhvt:", - ["authors=","help","stitch=","timezone=","log=","ignore","notags"]) -except getopt.GetoptError: - usage() - -for o, a in opts: - if o == "-q": - verbosity = 0 - if o == "-v": - verbosity += 1 - if o in ("--log"): - logfile = a - if o in ("--notags"): - tagall = False - if o in ("-h", "--help"): - usage() - if o in ("--ignore"): - ignore_warnings = True - -git = git_command() -branch=git.current_branch() - -for o, a in opts: - if o in ("-t", "--timezone"): - git.set_config("perforce.timezone", a) - if o in ("--stitch"): - git.set_config("perforce.%s.path" % branch, a) - stitch = 1 - -if len(args) == 2: - branch = args[1] - git.checkout(branch) - if branch == git.current_branch(): - die("Branch %s already exists!" % branch) - report(1, "Setting perforce to ", args[0]) - git.set_config("perforce.%s.path" % branch, args[0]) -elif len(args) != 0: - die("You must specify the perforce //depot/path and git branch") - -p4path = git.get_config("perforce.%s.path" % branch) -if p4path == None: - die("Do not know Perforce //depot/path for git branch", branch) - -p4 = p4_command(p4path) - -for o, a in opts: - if o in ("-a", "--authors"): - p4.authors(a) - -localdir = git.basedir() -if p4.where()[:len(localdir)] != localdir: - report(1, "**WARNING** Appears p4 client is misconfigured") - report(1, " for sync from %s to %s" % (p4.repopath, localdir)) - if ignore_warnings != True: - die("Reconfigure or use \"--ignore\" on command line") - -if stitch == 0: - top = git.top_change(branch) -else: - top = 0 -changes = p4.changes(top) -count = len(changes) -if count == 0: - report(1, "Already up to date...") - sys.exit(0) - -ptz = git.get_config("perforce.timezone") -if ptz: - report(1, "Setting timezone to", ptz) - os.environ['TZ'] = ptz - time.tzset() - -if stitch == 1: - git.remove_files() - git.clean_directories() - p4.sync(changes[0], force=True) -elif top == 0 and branch != git.current_branch(): - p4.sync(changes[0], test=True) - report(1, "Creating new initial commit"); - git.fresh_branch(branch) - p4.sync(changes[0], force=True) -else: - p4.sync(changes[0], trick=True) - -report(1, "processing %s changes from p4 (%s) to git (%s)" % (count, p4.repopath, branch)) -for id in changes: - report(1, "Importing changeset", id) - change = p4.describe(id) - p4.sync(id) - if tagall : - git.commit(change.author, change.email, change.date, change.msg, id) - else: - git.commit(change.author, change.email, change.date, change.msg, "import") - if stitch == 1: - git.clean_directories() - stitch = 0 diff --git a/contrib/p4import/git-p4import.txt b/contrib/p4import/git-p4import.txt deleted file mode 100644 index 9967587fe6..0000000000 --- a/contrib/p4import/git-p4import.txt +++ /dev/null @@ -1,167 +0,0 @@ -git-p4import(1) -=============== - -NAME ----- -git-p4import - Import a Perforce repository into git - - -SYNOPSIS --------- -[verse] -`git-p4import` [-q|-v] [--notags] [--authors <file>] [-t <timezone>] - <//p4repo/path> <branch> -`git-p4import` --stitch <//p4repo/path> -`git-p4import` - - -DESCRIPTION ------------ -Import a Perforce repository into an existing git repository. When -a <//p4repo/path> and <branch> are specified a new branch with the -given name will be created and the initial import will begin. - -Once the initial import is complete you can do an incremental import -of new commits from the Perforce repository. You do this by checking -out the appropriate git branch and then running `git-p4import` without -any options. - -The standard p4 client is used to communicate with the Perforce -repository; it must be configured correctly in order for `git-p4import` -to operate (see below). - - -OPTIONS -------- --q:: - Do not display any progress information. - --v:: - Give extra progress information. - -\--authors:: - Specify an authors file containing a mapping of Perforce user - ids to full names and email addresses (see Notes below). - -\--notags:: - Do not create a tag for each imported commit. - -\--stitch:: - Import the contents of the given perforce branch into the - currently checked out git branch. - -\--log:: - Store debugging information in the specified file. - --t:: - Specify that the remote repository is in the specified timezone. - Timezone must be in the format "US/Pacific" or "Europe/London" - etc. You only need to specify this once, it will be saved in - the git config file for the repository. - -<//p4repo/path>:: - The Perforce path that will be imported into the specified branch. - -<branch>:: - The new branch that will be created to hold the Perforce imports. - - -P4 Client ---------- -You must make the `p4` client command available in your $PATH and -configure it to communicate with the target Perforce repository. -Typically this means you must set the "$P4PORT" and "$P4CLIENT" -environment variables. - -You must also configure a `p4` client "view" which maps the Perforce -branch into the top level of your git repository, for example: - ------------- -Client: myhost - -Root: /home/sean/import - -Options: noallwrite clobber nocompress unlocked modtime rmdir - -View: - //public/jam/... //myhost/jam/... ------------- - -With the above `p4` client setup, you could import the "jam" -perforce branch into a branch named "jammy", like so: - ------------- -$ mkdir -p /home/sean/import/jam -$ cd /home/sean/import/jam -$ git init -$ git p4import //public/jam jammy ------------- - - -Multiple Branches ------------------ -Note that by creating multiple "views" you can use `git-p4import` -to import additional branches into the same git repository. -However, the `p4` client has a limitation in that it silently -ignores all but the last "view" that maps into the same local -directory. So the following will *not* work: - ------------- -View: - //public/jam/... //myhost/jam/... - //public/other/... //myhost/jam/... - //public/guest/... //myhost/jam/... ------------- - -If you want more than one Perforce branch to be imported into the -same directory you must employ a workaround. A simple option is -to adjust your `p4` client before each import to only include a -single view. - -Another option is to create multiple symlinks locally which all -point to the same directory in your git repository and then use -one per "view" instead of listing the actual directory. - - -Tags ----- -A git tag of the form p4/xx is created for every change imported from -the Perforce repository where xx is the Perforce changeset number. -Therefore after the import you can use git to access any commit by its -Perforce number, e.g. git show p4/327. - -The tag associated with the HEAD commit is also how `git-p4import` -determines if there are new changes to incrementally import from the -Perforce repository. - -If you import from a repository with many thousands of changes -you will have an equal number of p4/xxxx git tags. Git tags can -be expensive in terms of disk space and repository operations. -If you don't need to perform further incremental imports, you -may delete the tags. - - -Notes ------ -You can interrupt the import (e.g. ctrl-c) at any time and restart it -without worry. - -Author information is automatically determined by querying the -Perforce "users" table using the id associated with each change. -However, if you want to manually supply these mappings you can do -so with the "--authors" option. It accepts a file containing a list -of mappings with each line containing one mapping in the format: - ------------- - perforce_id = Full Name <email@address.com> ------------- - - -Author ------- -Written by Sean Estabrooks <seanlkml@sympatico.ca> - - -GIT ---- -Part of the gitlink:git[7] suite diff --git a/contrib/remote-helpers/git-remote-bzr b/contrib/remote-helpers/git-remote-bzr index f1ba477fb8..5f4b2e3e16 100755 --- a/contrib/remote-helpers/git-remote-bzr +++ b/contrib/remote-helpers/git-remote-bzr @@ -44,8 +44,8 @@ import StringIO import atexit, shutil, hashlib, urlparse, subprocess NAME_RE = re.compile('^([^<>]+)') -AUTHOR_RE = re.compile('^([^<>]+?)? ?<([^<>]*)>$') -EMAIL_RE = re.compile('^([^<>]+[^ \\\t<>])?\\b(?:[ \\t<>]*?)\\b([^ \\t<>]+@[^ \\t<>]+)') +AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)') +EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)') RAW_AUTHOR_RE = re.compile('^(\w+) (.+)? <(.*)> (\d+) ([+-]\d+)') def die(msg, *args): @@ -193,8 +193,7 @@ def fixup_user(user): else: m = EMAIL_RE.match(user) if m: - name = m.group(1) - mail = m.group(2) + mail = m.group(1) else: m = NAME_RE.match(user) if m: @@ -910,6 +909,16 @@ def main(args): global transports global force + marks = None + is_tmp = False + gitdir = os.environ.get('GIT_DIR', None) + + if len(args) < 3: + die('Not enough arguments.') + + if not gitdir: + die('GIT_DIR not set') + alias = args[1] url = args[2] @@ -918,7 +927,6 @@ def main(args): blob_marks = {} parsed_refs = {} files_cache = {} - marks = None branches = {} peers = {} transports = [] @@ -927,11 +935,8 @@ def main(args): if alias[5:] == url: is_tmp = True alias = hashlib.sha1(alias).hexdigest() - else: - is_tmp = False prefix = 'refs/bzr/%s' % alias - gitdir = os.environ['GIT_DIR'] dirname = os.path.join(gitdir, 'bzr', alias) if not is_tmp: diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index 92d994e470..eb89ef6779 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -51,8 +51,8 @@ import time as ptime # NAME_RE = re.compile('^([^<>]+)') -AUTHOR_RE = re.compile('^([^<>]+?)? ?<([^<>]*)>$') -EMAIL_RE = re.compile('^([^<>]+[^ \\\t<>])?\\b(?:[ \\t<>]*?)\\b([^ \\t<>]+@[^ \\t<>]+)') +AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)') +EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)') AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$') RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)') @@ -316,8 +316,7 @@ def fixup_user_git(user): else: m = EMAIL_RE.match(user) if m: - name = m.group(1) - mail = m.group(2) + mail = m.group(1) else: m = NAME_RE.match(user) if m: @@ -416,6 +415,9 @@ def get_repo(url, alias): local_path = os.path.join(dirname, 'clone') if not os.path.exists(local_path): hg.share(myui, shared_path, local_path, update=False) + else: + # make sure the shared path is always up-to-date + util.writefile(os.path.join(local_path, '.hg', 'sharedpath'), hg_path) repo = hg.repository(myui, local_path) try: @@ -538,7 +540,7 @@ def export_ref(repo, name, kind, head): print "commit %s" % ref print "mark :%d" % (note_mark) - print "committer remote-hg <> %s" % (ptime.strftime('%s %z')) + print "committer remote-hg <> %d %s" % (ptime.time(), gittz(ptime.timezone)) desc = "Notes for %s\n" % (name) print "data %d" % (len(desc)) print desc @@ -703,6 +705,11 @@ def get_merge_files(repo, p1, p2, files): f = { 'ctx' : repo[p1][e] } files[e] = f +def c_style_unescape(string): + if string[0] == string[-1] == '"': + return string.decode('string-escape')[1:-1] + return string + def parse_commit(parser): from_mark = merge_mark = None @@ -742,6 +749,7 @@ def parse_commit(parser): f = { 'deleted' : True } else: die('Unknown file command: %s' % line) + path = c_style_unescape(path) files[path] = f # only export the commits if we are on an internal proxy repo @@ -1159,6 +1167,16 @@ def main(args): global dry_run global notes, alias + marks = None + is_tmp = False + gitdir = os.environ.get('GIT_DIR', None) + + if len(args) < 3: + die('Not enough arguments.') + + if not gitdir: + die('GIT_DIR not set') + alias = args[1] url = args[2] peer = None @@ -1179,16 +1197,12 @@ def main(args): if alias[4:] == url: is_tmp = True alias = hashlib.sha1(alias).hexdigest() - else: - is_tmp = False - gitdir = os.environ['GIT_DIR'] dirname = os.path.join(gitdir, 'hg', alias) branches = {} bmarks = {} blob_marks = {} parsed_refs = {} - marks = None parsed_tags = {} filenodes = {} fake_bmark = None diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh index ae26dbb2e9..4f379c2ab4 100755 --- a/contrib/remote-helpers/test-bzr.sh +++ b/contrib/remote-helpers/test-bzr.sh @@ -5,7 +5,8 @@ test_description='Test remote-bzr' -. ./test-lib.sh +test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t +. "$TEST_DIRECTORY"/test-lib.sh if ! test_have_prereq PYTHON then @@ -398,7 +399,7 @@ test_expect_success 'export utf-8 authors' ' git add content && git commit -m one && git remote add bzr "bzr::../bzrrepo" && - git push bzr + git push bzr master ) && ( diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index aacd8a9528..a933b1e30c 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -8,7 +8,8 @@ test_description='Test remote-hg' -. ./test-lib.sh +test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t +. "$TEST_DIRECTORY"/test-lib.sh if ! test_have_prereq PYTHON then @@ -53,14 +54,14 @@ check_bookmark () { } check_push () { - local expected_ret=$1 ret=0 ref_ret=0 IFS=':' + expected_ret=$1 ret=0 ref_ret=0 shift git push origin "$@" 2>error ret=$? cat error - while read branch kind + while IFS=':' read branch kind do case "$kind" in 'new') @@ -82,7 +83,7 @@ check_push () { test $ref_ret -ne 0 && echo "match for '$branch' failed" && break done - if test $expected_ret -ne $ret -o $ref_ret -ne 0 + if test $expected_ret -ne $ret || test $ref_ret -ne 0 then return 1 fi @@ -205,16 +206,17 @@ test_expect_success 'authors' ' >../expected && author_test alpha "" "H G Wells <wells@example.com>" && - author_test beta "test" "test <unknown>" && - author_test beta "test <test@example.com> (comment)" "test <test@example.com>" && - author_test gamma "<test@example.com>" "Unknown <test@example.com>" && - author_test delta "name<test@example.com>" "name <test@example.com>" && - author_test epsilon "name <test@example.com" "name <test@example.com>" && - author_test zeta " test " "test <unknown>" && - author_test eta "test < test@example.com >" "test <test@example.com>" && - author_test theta "test >test@example.com>" "test <test@example.com>" && - author_test iota "test < test <at> example <dot> com>" "test <unknown>" && - author_test kappa "test@example.com" "Unknown <test@example.com>" + author_test beta "beta" "beta <unknown>" && + author_test gamma "gamma <test@example.com> (comment)" "gamma <test@example.com>" && + author_test delta "<delta@example.com>" "Unknown <delta@example.com>" && + author_test epsilon "epsilon<test@example.com>" "epsilon <test@example.com>" && + author_test zeta "zeta <test@example.com" "zeta <test@example.com>" && + author_test eta " eta " "eta <unknown>" && + author_test theta "theta < test@example.com >" "theta <test@example.com>" && + author_test iota "iota >test@example.com>" "iota <test@example.com>" && + author_test kappa "kappa < test <at> example <dot> com>" "kappa <unknown>" && + author_test lambda "lambda@example.com" "Unknown <lambda@example.com>" && + author_test mu "mu.mu@example.com" "Unknown <mu.mu@example.com>" ) && git clone "hg::hgrepo" gitrepo && @@ -335,6 +337,17 @@ test_expect_success 'remote cloning' ' check gitrepo HEAD zero ' +test_expect_success 'moving remote clone' ' + test_when_finished "rm -rf gitrepo*" && + + ( + git clone "hg::hgrepo" gitrepo && + mv gitrepo gitrepo2 && + cd gitrepo2 && + git fetch + ) +' + test_expect_success 'remote update bookmark' ' test_when_finished "rm -rf gitrepo*" && @@ -442,6 +455,74 @@ test_expect_success 'remote new bookmark multiple branch head' ' # cleanup previous stuff rm -rf hgrepo +test_expect_success 'fetch special filenames' ' + test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" && + + LC_ALL=en_US.UTF-8 + export LC_ALL + + ( + hg init hgrepo && + cd hgrepo && + + echo test >> "æ rø" && + hg add "æ rø" && + echo test >> "ø~?" && + hg add "ø~?" && + hg commit -m add-utf-8 && + echo test >> "æ rø" && + hg commit -m test-utf-8 && + hg rm "ø~?" && + hg mv "æ rø" "ø~?" && + hg commit -m hg-mv-utf-8 + ) && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + git -c core.quotepath=false ls-files > ../actual + ) && + echo "ø~?" > expected && + test_cmp expected actual +' + +test_expect_success 'push special filenames' ' + test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" && + + mkdir -p tmp && cd tmp && + + LC_ALL=en_US.UTF-8 + export LC_ALL + + ( + hg init hgrepo && + cd hgrepo && + + echo one >> content && + hg add content && + hg commit -m one + ) && + + ( + git clone "hg::hgrepo" gitrepo && + cd gitrepo && + + echo test >> "æ rø" && + git add "æ rø" && + git commit -m utf-8 && + + git push + ) && + + (cd hgrepo && + hg update && + hg manifest > ../actual + ) && + + printf "content\næ rø\n" > expected && + test_cmp expected actual +' + setup_big_push () { ( hg init hgrepo && diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile index 435b2dea29..4030a16898 100644 --- a/contrib/subtree/Makefile +++ b/contrib/subtree/Makefile @@ -21,13 +21,14 @@ GIT_SUBTREE := git-subtree GIT_SUBTREE_DOC := git-subtree.1 GIT_SUBTREE_XML := git-subtree.xml GIT_SUBTREE_TXT := git-subtree.txt +GIT_SUBTREE_HTML := git-subtree.html all: $(GIT_SUBTREE) $(GIT_SUBTREE): $(GIT_SUBTREE_SH) cp $< $@ && chmod +x $@ -doc: $(GIT_SUBTREE_DOC) +doc: $(GIT_SUBTREE_DOC) $(GIT_SUBTREE_HTML) install: $(GIT_SUBTREE) $(INSTALL) -d -m 755 $(DESTDIR)$(libexecdir) @@ -46,6 +47,10 @@ $(GIT_SUBTREE_XML): $(GIT_SUBTREE_TXT) asciidoc -b docbook -d manpage -f $(ASCIIDOC_CONF) \ -agit_version=$(gitver) $^ +$(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT) + asciidoc -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \ + -agit_version=$(gitver) $^ + test: $(MAKE) -C t/ test diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 7d7af03274..dc59a91031 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -9,10 +9,10 @@ if [ $# -eq 0 ]; then fi OPTS_SPEC="\ git subtree add --prefix=<prefix> <commit> -git subtree add --prefix=<prefix> <repository> <commit> +git subtree add --prefix=<prefix> <repository> <ref> git subtree merge --prefix=<prefix> <commit> -git subtree pull --prefix=<prefix> <repository> <refspec...> -git subtree push --prefix=<prefix> <repository> <refspec...> +git subtree pull --prefix=<prefix> <repository> <ref> +git subtree push --prefix=<prefix> <repository> <ref> git subtree split --prefix=<prefix> <commit...> -- h,help show the help @@ -489,6 +489,12 @@ ensure_clean() fi } +ensure_valid_ref_format() +{ + git check-ref-format "refs/heads/$1" || + die "'$1' does not look like a ref" +} + cmd_add() { if [ -e "$dir" ]; then @@ -508,8 +514,7 @@ cmd_add() # specified directory. Allowing a refspec might be # misleading because we won't do anything with any other # branches fetched via the refspec. - git rev-parse -q --verify "$2^{commit}" >/dev/null || - die "'$2' does not refer to a commit" + ensure_valid_ref_format "$2" "cmd_add_repository" "$@" else @@ -699,7 +704,11 @@ cmd_merge() cmd_pull() { + if [ $# -ne 2 ]; then + die "You must provide <repository> <ref>" + fi ensure_clean + ensure_valid_ref_format "$2" git fetch "$@" || exit $? revs=FETCH_HEAD set -- $revs @@ -709,8 +718,9 @@ cmd_pull() cmd_push() { if [ $# -ne 2 ]; then - die "You must provide <repository> <refspec>" + die "You must provide <repository> <ref>" fi + ensure_valid_ref_format "$2" if [ -e "$dir" ]; then repository=$1 refspec=$2 diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt index e0957eee55..02669b1534 100644 --- a/contrib/subtree/git-subtree.txt +++ b/contrib/subtree/git-subtree.txt @@ -9,10 +9,10 @@ git-subtree - Merge subtrees together and split repository into subtrees SYNOPSIS -------- [verse] -'git subtree' add -P <prefix> <refspec> -'git subtree' add -P <prefix> <repository> <refspec> -'git subtree' pull -P <prefix> <repository> <refspec...> -'git subtree' push -P <prefix> <repository> <refspec...> +'git subtree' add -P <prefix> <commit> +'git subtree' add -P <prefix> <repository> <ref> +'git subtree' pull -P <prefix> <repository> <ref> +'git subtree' push -P <prefix> <repository> <ref> 'git subtree' merge -P <prefix> <commit> 'git subtree' split -P <prefix> [OPTIONS] [<commit>] @@ -68,7 +68,7 @@ COMMANDS -------- add:: Create the <prefix> subtree by importing its contents - from the given <refspec> or <repository> and remote <refspec>. + from the given <commit> or <repository> and remote <ref>. A new commit is created automatically, joining the imported project's history with your own. With '--squash', imports only a single commit from the subproject, rather than its @@ -90,13 +90,13 @@ merge:: pull:: Exactly like 'merge', but parallels 'git pull' in that - it fetches the given commit from the specified remote + it fetches the given ref from the specified remote repository. push:: Does a 'split' (see below) using the <prefix> supplied and then does a 'git push' to push the result to the - repository and refspec. This can be used to push your + repository and ref. This can be used to push your subtree to different branches of the remote repository. split:: @@ -1121,7 +1121,7 @@ static int is_foreign_ident(const char *str) { int i; - if (prefixcmp(str, "$Id: ")) + if (!starts_with(str, "$Id: ")) return 0; for (i = 5; str[i]; i++) { if (isspace(str[i]) && str[i+1] != '$') diff --git a/csum-file.c b/csum-file.c index 53f5375b6c..b00b215031 100644 --- a/csum-file.c +++ b/csum-file.c @@ -11,7 +11,7 @@ #include "progress.h" #include "csum-file.h" -static void flush(struct sha1file *f, void *buf, unsigned int count) +static void flush(struct sha1file *f, const void *buf, unsigned int count) { if (0 <= f->check_fd && count) { unsigned char check_buffer[8192]; @@ -86,13 +86,13 @@ int sha1close(struct sha1file *f, unsigned char *result, unsigned int flags) return fd; } -int sha1write(struct sha1file *f, void *buf, unsigned int count) +void sha1write(struct sha1file *f, const void *buf, unsigned int count) { while (count) { unsigned offset = f->offset; unsigned left = sizeof(f->buffer) - offset; unsigned nr = count > left ? left : count; - void *data; + const void *data; if (f->do_crc) f->crc32 = crc32(f->crc32, buf, nr); @@ -116,7 +116,6 @@ int sha1write(struct sha1file *f, void *buf, unsigned int count) } f->offset = offset; } - return 0; } struct sha1file *sha1fd(int fd, const char *name) diff --git a/csum-file.h b/csum-file.h index 3b540bdc21..bb543d52f1 100644 --- a/csum-file.h +++ b/csum-file.h @@ -34,7 +34,7 @@ extern struct sha1file *sha1fd(int fd, const char *name); extern struct sha1file *sha1fd_check(const char *name); extern struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp); extern int sha1close(struct sha1file *, unsigned char *, unsigned int); -extern int sha1write(struct sha1file *, void *, unsigned int); +extern void sha1write(struct sha1file *, const void *, unsigned int); extern void sha1flush(struct sha1file *f); extern void crc32_begin(struct sha1file *); extern uint32_t crc32_end(struct sha1file *); @@ -235,7 +235,7 @@ static int service_enabled; static int git_daemon_config(const char *var, const char *value, void *cb) { - if (!prefixcmp(var, "daemon.") && + if (starts_with(var, "daemon.") && !strcmp(var + 7, service_looking_at->config_name)) { service_enabled = git_config_bool(var, value); return 0; @@ -633,7 +633,7 @@ static int execute(void) for (i = 0; i < ARRAY_SIZE(daemon_service); i++) { struct daemon_service *s = &(daemon_service[i]); int namelen = strlen(s->name); - if (!prefixcmp(line, "git-") && + if (starts_with(line, "git-") && !strncmp(s->name, line + 4, namelen) && line[namelen + 4] == ' ') { /* @@ -1056,11 +1056,6 @@ static void drop_privileges(struct credentials *cred) /* nothing */ } -static void daemonize(void) -{ - die("--detach not supported on this platform"); -} - static struct credentials *prepare_credentials(const char *user_name, const char *group_name) { @@ -1102,24 +1097,6 @@ static struct credentials *prepare_credentials(const char *user_name, return &c; } - -static void daemonize(void) -{ - switch (fork()) { - case 0: - break; - case -1: - die_errno("fork failed"); - default: - exit(0); - } - if (setsid() == -1) - die_errno("setsid failed"); - close(0); - close(1); - close(2); - sanitize_stdfds(); -} #endif static void store_pid(const char *path) @@ -1165,11 +1142,11 @@ int main(int argc, char **argv) for (i = 1; i < argc; i++) { char *arg = argv[i]; - if (!prefixcmp(arg, "--listen=")) { + if (starts_with(arg, "--listen=")) { string_list_append(&listen_addr, xstrdup_tolower(arg + 9)); continue; } - if (!prefixcmp(arg, "--port=")) { + if (starts_with(arg, "--port=")) { char *end; unsigned long n; n = strtoul(arg+7, &end, 0); @@ -1199,19 +1176,19 @@ int main(int argc, char **argv) export_all_trees = 1; continue; } - if (!prefixcmp(arg, "--access-hook=")) { + if (starts_with(arg, "--access-hook=")) { access_hook = arg + 14; continue; } - if (!prefixcmp(arg, "--timeout=")) { + if (starts_with(arg, "--timeout=")) { timeout = atoi(arg+10); continue; } - if (!prefixcmp(arg, "--init-timeout=")) { + if (starts_with(arg, "--init-timeout=")) { init_timeout = atoi(arg+15); continue; } - if (!prefixcmp(arg, "--max-connections=")) { + if (starts_with(arg, "--max-connections=")) { max_connections = atoi(arg+18); if (max_connections < 0) max_connections = 0; /* unlimited */ @@ -1221,7 +1198,7 @@ int main(int argc, char **argv) strict_paths = 1; continue; } - if (!prefixcmp(arg, "--base-path=")) { + if (starts_with(arg, "--base-path=")) { base_path = arg+12; continue; } @@ -1229,7 +1206,7 @@ int main(int argc, char **argv) base_path_relaxed = 1; continue; } - if (!prefixcmp(arg, "--interpolated-path=")) { + if (starts_with(arg, "--interpolated-path=")) { interpolated_path = arg+20; continue; } @@ -1241,11 +1218,11 @@ int main(int argc, char **argv) user_path = ""; continue; } - if (!prefixcmp(arg, "--user-path=")) { + if (starts_with(arg, "--user-path=")) { user_path = arg + 12; continue; } - if (!prefixcmp(arg, "--pid-file=")) { + if (starts_with(arg, "--pid-file=")) { pid_file = arg + 11; continue; } @@ -1254,35 +1231,35 @@ int main(int argc, char **argv) log_syslog = 1; continue; } - if (!prefixcmp(arg, "--user=")) { + if (starts_with(arg, "--user=")) { user_name = arg + 7; continue; } - if (!prefixcmp(arg, "--group=")) { + if (starts_with(arg, "--group=")) { group_name = arg + 8; continue; } - if (!prefixcmp(arg, "--enable=")) { + if (starts_with(arg, "--enable=")) { enable_service(arg + 9, 1); continue; } - if (!prefixcmp(arg, "--disable=")) { + if (starts_with(arg, "--disable=")) { enable_service(arg + 10, 0); continue; } - if (!prefixcmp(arg, "--allow-override=")) { + if (starts_with(arg, "--allow-override=")) { make_service_overridable(arg + 17, 1); continue; } - if (!prefixcmp(arg, "--forbid-override=")) { + if (starts_with(arg, "--forbid-override=")) { make_service_overridable(arg + 18, 0); continue; } - if (!prefixcmp(arg, "--informative-errors")) { + if (!strcmp(arg, "--informative-errors")) { informative_errors = 1; continue; } - if (!prefixcmp(arg, "--no-informative-errors")) { + if (!strcmp(arg, "--no-informative-errors")) { informative_errors = 0; continue; } @@ -1333,9 +1310,10 @@ int main(int argc, char **argv) if (inetd_mode || serve_mode) return execute(); - if (detach) - daemonize(); - else + if (detach) { + if (daemonize()) + die("--detach not supported on this platform"); + } else sanitize_stdfds(); if (pid_file) @@ -184,8 +184,10 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode) tz = local_tzoffset(time); tm = time_to_tm(time, tz); - if (!tm) - return NULL; + if (!tm) { + tm = time_to_tm(0, 0); + tz = 0; + } strbuf_reset(&timebuf); if (mode == DATE_SHORT) @@ -907,7 +909,7 @@ static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm const char *end = date; int i; - while (isalpha(*++end)); + while (isalpha(*++end)) ; for (i = 0; i < 12; i++) { @@ -1113,3 +1115,20 @@ unsigned long approxidate_careful(const char *date, int *error_ret) gettimeofday(&tv, NULL); return approxidate_str(date, &tv, error_ret); } + +int date_overflows(unsigned long t) +{ + time_t sys; + + /* If we overflowed our unsigned long, that's bad... */ + if (t == ULONG_MAX) + return 1; + + /* + * ...but we also are going to feed the result to system + * functions that expect time_t, which is often "signed long". + * Make sure that we fit into time_t, as well. + */ + sys = t; + return t != sys || (t < 1) != (sys < 1); +} diff --git a/diff-lib.c b/diff-lib.c index 346cac651d..044872935c 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -11,6 +11,7 @@ #include "unpack-trees.h" #include "refs.h" #include "submodule.h" +#include "dir.h" /* * diff-files @@ -90,9 +91,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option) unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED) ? CE_MATCH_RACY_IS_DIRTY : 0); - if (option & DIFF_SILENT_ON_REMOVED) - handle_deprecated_show_diff_q(&revs->diffopt); - diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/"); if (diff_unmerged_stage < 0) @@ -108,7 +106,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) if (diff_can_quit_early(&revs->diffopt)) break; - if (!ce_path_match(ce, &revs->prune_data)) + if (!ce_path_match(ce, &revs->prune_data, NULL)) continue; if (ce_stage(ce)) { @@ -124,7 +122,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option) dpath->path = (char *) &(dpath->parent[5]); dpath->next = NULL; - dpath->len = path_len; memcpy(dpath->path, ce->name, path_len); dpath->path[path_len] = '\0'; hashclr(dpath->sha1); @@ -326,7 +323,6 @@ static int show_modified(struct rev_info *revs, p = xmalloc(combine_diff_path_size(2, pathlen)); p->path = (char *) &p->parent[2]; p->next = NULL; - p->len = pathlen; memcpy(p->path, new->name, pathlen); p->path[pathlen] = 0; p->mode = mode; @@ -438,7 +434,7 @@ static int oneway_diff(const struct cache_entry * const *src, if (tree == o->df_conflict_entry) tree = NULL; - if (ce_path_match(idx ? idx : tree, &revs->prune_data)) { + if (ce_path_match(idx ? idx : tree, &revs->prune_data, NULL)) { do_oneway_diff(o, idx, tree); if (diff_can_quit_early(&revs->diffopt)) { o->exiting_early = 1; diff --git a/diff-no-index.c b/diff-no-index.c index 00a8eefde9..8e10bff30e 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -183,63 +183,16 @@ static int queue_diff(struct diff_options *o, void diff_no_index(struct rev_info *revs, int argc, const char **argv, - int nongit, const char *prefix) + const char *prefix) { int i, prefixlen; - int no_index = 0; - unsigned deprecated_show_diff_q_option_used = 0; const char *paths[2]; - /* Were we asked to do --no-index explicitly? */ - for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "--")) { - i++; - break; - } - if (!strcmp(argv[i], "--no-index")) - no_index = 1; - if (argv[i][0] != '-') - break; - } - - if (!no_index && !nongit) { - /* - * Inside a git repository, without --no-index. Only - * when a path outside the repository is given, - * e.g. "git diff /var/tmp/[12]", or "git diff - * Makefile /var/tmp/Makefile", allow it to be used as - * a colourful "diff" replacement. - */ - if ((argc != i + 2) || - (path_inside_repo(prefix, argv[i]) && - path_inside_repo(prefix, argv[i+1]))) - return; - } - if (argc != i + 2) { - if (!no_index) { - /* - * There was no --no-index and there were not two - * paths. It is possible that the user intended - * to do an inside-repository operation. - */ - fprintf(stderr, "Not a git repository\n"); - fprintf(stderr, - "To compare two paths outside a working tree:\n"); - } - /* Give the usage message for non-repository usage and exit. */ - usagef("git diff %s <path> <path>", - no_index ? "--no-index" : "[--no-index]"); - } - diff_setup(&revs->diffopt); for (i = 1; i < argc - 2; ) { int j; if (!strcmp(argv[i], "--no-index")) i++; - else if (!strcmp(argv[i], "-q")) { - deprecated_show_diff_q_option_used = 1; - i++; - } else if (!strcmp(argv[i], "--")) i++; else { @@ -272,9 +225,6 @@ void diff_no_index(struct rev_info *revs, revs->max_count = -2; diff_setup_done(&revs->diffopt); - if (deprecated_show_diff_q_option_used) - handle_deprecated_show_diff_q(&revs->diffopt); - setup_diff_pager(&revs->diffopt); DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS); @@ -30,6 +30,7 @@ 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; +static const char *diff_order_file_cfg; int diff_auto_refresh_index = 1; static int diff_mnemonic_prefix; static int diff_no_prefix; @@ -201,6 +202,8 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) return git_config_string(&external_diff_cmd_cfg, var, value); if (!strcmp(var, "diff.wordregex")) return git_config_string(&diff_word_regex_cfg, var, value); + if (!strcmp(var, "diff.orderfile")) + return git_config_pathname(&diff_order_file_cfg, var, value); if (!strcmp(var, "diff.ignoresubmodules")) handle_ignore_submodules_arg(&default_diff_options, value); @@ -235,7 +238,7 @@ int git_diff_basic_config(const char *var, const char *value, void *cb) if (userdiff_config(var, value) < 0) return -1; - if (!prefixcmp(var, "diff.color.") || !prefixcmp(var, "color.diff.")) { + if (starts_with(var, "diff.color.") || starts_with(var, "color.diff.")) { int slot = parse_diff_color_slot(var, 11); if (slot < 0) return 0; @@ -264,7 +267,7 @@ int git_diff_basic_config(const char *var, const char *value, void *cb) return 0; } - if (!prefixcmp(var, "submodule.")) + if (starts_with(var, "submodule.")) return parse_submodule_config_option(var, value); return git_default_config(var, value, cb); @@ -1215,7 +1218,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) diff_words_append(line, len, &ecbdata->diff_words->plus); return; - } else if (!prefixcmp(line, "\\ ")) { + } else if (starts_with(line, "\\ ")) { /* * Eat the "no newline at eof" marker as if we * saw a "+" or "-" line with nothing on it, @@ -2387,9 +2390,9 @@ static void builtin_diff(const char *name_a, xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags); if (!diffopts) ; - else if (!prefixcmp(diffopts, "--unified=")) + else if (starts_with(diffopts, "--unified=")) xecfg.ctxlen = strtoul(diffopts + 10, NULL, 10); - else if (!prefixcmp(diffopts, "-u")) + else if (starts_with(diffopts, "-u")) xecfg.ctxlen = strtoul(diffopts + 2, NULL, 10); if (o->word_diff) init_diff_words_data(&ecbdata, o, one, two); @@ -2842,8 +2845,9 @@ static struct diff_tempfile *prepare_temp_file(const char *name, remove_tempfile_installed = 1; } - if (!one->sha1_valid || - reuse_worktree_file(name, one->sha1, 1)) { + if (!S_ISGITLINK(one->mode) && + (!one->sha1_valid || + reuse_worktree_file(name, one->sha1, 1))) { struct stat st; if (lstat(name, &st) < 0) { if (errno == ENOENT) @@ -2899,11 +2903,16 @@ static void run_external_diff(const char *pgm, struct diff_filespec *one, struct diff_filespec *two, const char *xfrm_msg, - int complete_rewrite) + int complete_rewrite, + struct diff_options *o) { const char *spawn_arg[10]; int retval; const char **arg = &spawn_arg[0]; + struct diff_queue_struct *q = &diff_queued_diff; + const char *env[3] = { NULL }; + char env_counter[50]; + char env_total[50]; if (one && two) { struct diff_tempfile *temp_one, *temp_two; @@ -2928,7 +2937,14 @@ static void run_external_diff(const char *pgm, } *arg = NULL; fflush(NULL); - retval = run_command_v_opt(spawn_arg, RUN_USING_SHELL); + + env[0] = env_counter; + snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d", + ++o->diff_path_counter); + env[1] = env_total; + snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr); + + retval = run_command_v_opt_cd_env(spawn_arg, RUN_USING_SHELL, NULL, env); remove_tempfile(); if (retval) { fprintf(stderr, "external diff died, stopping at %s.\n", name); @@ -3042,7 +3058,7 @@ static void run_diff_cmd(const char *pgm, if (pgm) { run_external_diff(pgm, name, other, one, two, xfrm_msg, - complete_rewrite); + complete_rewrite, o); return; } if (one && two) @@ -3207,6 +3223,8 @@ void diff_setup(struct diff_options *options) options->detect_rename = diff_detect_rename_default; options->xdl_opts |= diff_algorithm; + options->orderfile = diff_order_file_cfg; + if (diff_no_prefix) { options->a_prefix = options->b_prefix = ""; } else if (!diff_mnemonic_prefix) { @@ -3317,6 +3335,8 @@ void diff_setup_done(struct diff_options *options) options->output_format = DIFF_FORMAT_NO_OUTPUT; DIFF_OPT_SET(options, EXIT_WITH_STATUS); } + + options->diff_path_counter = 0; } static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val) @@ -3391,10 +3411,10 @@ int parse_long_opt(const char *opt, const char **argv, if (arg[0] != '-' || arg[1] != '-') return 0; arg += strlen("--"); - if (prefixcmp(arg, opt)) + if (!starts_with(arg, opt)) return 0; arg += strlen(opt); - if (*arg == '=') { /* sticked form: --option=value */ + if (*arg == '=') { /* stuck form: --option=value */ *optarg = arg + 1; return 1; } @@ -3422,7 +3442,7 @@ static int stat_opt(struct diff_options *options, const char **av) switch (*arg) { case '-': - if (!prefixcmp(arg, "-width")) { + if (starts_with(arg, "-width")) { arg += strlen("-width"); if (*arg == '=') width = strtoul(arg + 1, &end, 10); @@ -3432,7 +3452,7 @@ static int stat_opt(struct diff_options *options, const char **av) width = strtoul(av[1], &end, 10); argcount = 2; } - } else if (!prefixcmp(arg, "-name-width")) { + } else if (starts_with(arg, "-name-width")) { arg += strlen("-name-width"); if (*arg == '=') name_width = strtoul(arg + 1, &end, 10); @@ -3442,7 +3462,7 @@ static int stat_opt(struct diff_options *options, const char **av) name_width = strtoul(av[1], &end, 10); argcount = 2; } - } else if (!prefixcmp(arg, "-graph-width")) { + } else if (starts_with(arg, "-graph-width")) { arg += strlen("-graph-width"); if (*arg == '=') graph_width = strtoul(arg + 1, &end, 10); @@ -3452,7 +3472,7 @@ static int stat_opt(struct diff_options *options, const char **av) graph_width = strtoul(av[1], &end, 10); argcount = 2; } - } else if (!prefixcmp(arg, "-count")) { + } else if (starts_with(arg, "-count")) { arg += strlen("-count"); if (*arg == '=') count = strtoul(arg + 1, &end, 10); @@ -3580,14 +3600,6 @@ static int parse_diff_filter_opt(const char *optarg, struct diff_options *opt) return 0; } -/* Used only by "diff-files" and "diff --no-index" */ -void handle_deprecated_show_diff_q(struct diff_options *opt) -{ - warning("'diff -q' and 'diff-files -q' are deprecated."); - warning("Use 'diff --diff-filter=d' instead to ignore deleted filepairs."); - parse_diff_filter_opt("d", opt); -} - static void enable_patch_output(int *fmt) { *fmt &= ~DIFF_FORMAT_NO_OUTPUT; *fmt |= DIFF_FORMAT_PATCH; @@ -3614,15 +3626,15 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->output_format |= DIFF_FORMAT_SHORTSTAT; else if (!strcmp(arg, "-X") || !strcmp(arg, "--dirstat")) return parse_dirstat_opt(options, ""); - else if (!prefixcmp(arg, "-X")) + else if (starts_with(arg, "-X")) return parse_dirstat_opt(options, arg + 2); - else if (!prefixcmp(arg, "--dirstat=")) + else if (starts_with(arg, "--dirstat=")) return parse_dirstat_opt(options, arg + 10); else if (!strcmp(arg, "--cumulative")) return parse_dirstat_opt(options, "cumulative"); else if (!strcmp(arg, "--dirstat-by-file")) return parse_dirstat_opt(options, "files"); - else if (!prefixcmp(arg, "--dirstat-by-file=")) { + else if (starts_with(arg, "--dirstat-by-file=")) { parse_dirstat_opt(options, "files"); return parse_dirstat_opt(options, arg + 18); } @@ -3639,17 +3651,17 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->output_format |= DIFF_FORMAT_NAME_STATUS; else if (!strcmp(arg, "-s") || !strcmp(arg, "--no-patch")) options->output_format |= DIFF_FORMAT_NO_OUTPUT; - else if (!prefixcmp(arg, "--stat")) + else if (starts_with(arg, "--stat")) /* --stat, --stat-width, --stat-name-width, or --stat-count */ return stat_opt(options, av); /* renames options */ - else if (!prefixcmp(arg, "-B") || !prefixcmp(arg, "--break-rewrites=") || + else if (starts_with(arg, "-B") || starts_with(arg, "--break-rewrites=") || !strcmp(arg, "--break-rewrites")) { if ((options->break_opt = diff_scoreopt_parse(arg)) == -1) return error("invalid argument to -B: %s", arg+2); } - else if (!prefixcmp(arg, "-M") || !prefixcmp(arg, "--find-renames=") || + else if (starts_with(arg, "-M") || starts_with(arg, "--find-renames=") || !strcmp(arg, "--find-renames")) { if ((options->rename_score = diff_scoreopt_parse(arg)) == -1) return error("invalid argument to -M: %s", arg+2); @@ -3658,7 +3670,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) else if (!strcmp(arg, "-D") || !strcmp(arg, "--irreversible-delete")) { options->irreversible_delete = 1; } - else if (!prefixcmp(arg, "-C") || !prefixcmp(arg, "--find-copies=") || + else if (starts_with(arg, "-C") || starts_with(arg, "--find-copies=") || !strcmp(arg, "--find-copies")) { if (options->detect_rename == DIFF_DETECT_COPY) DIFF_OPT_SET(options, FIND_COPIES_HARDER); @@ -3674,7 +3686,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) DIFF_OPT_CLR(options, RENAME_EMPTY); else if (!strcmp(arg, "--relative")) DIFF_OPT_SET(options, RELATIVE_NAME); - else if (!prefixcmp(arg, "--relative=")) { + else if (starts_with(arg, "--relative=")) { DIFF_OPT_SET(options, RELATIVE_NAME); options->prefix = arg + 11; } @@ -3727,7 +3739,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) DIFF_OPT_CLR(options, FOLLOW_RENAMES); else if (!strcmp(arg, "--color")) options->use_color = 1; - else if (!prefixcmp(arg, "--color=")) { + else if (starts_with(arg, "--color=")) { int value = git_config_colorbool(NULL, arg+8); if (value < 0) return error("option `color' expects \"always\", \"auto\", or \"never\""); @@ -3739,7 +3751,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->use_color = 1; options->word_diff = DIFF_WORDS_COLOR; } - else if (!prefixcmp(arg, "--color-words=")) { + else if (starts_with(arg, "--color-words=")) { options->use_color = 1; options->word_diff = DIFF_WORDS_COLOR; options->word_regex = arg + 14; @@ -3748,7 +3760,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) if (options->word_diff == DIFF_WORDS_NONE) options->word_diff = DIFF_WORDS_PLAIN; } - else if (!prefixcmp(arg, "--word-diff=")) { + else if (starts_with(arg, "--word-diff=")) { const char *type = arg + 12; if (!strcmp(type, "plain")) options->word_diff = DIFF_WORDS_PLAIN; @@ -3784,12 +3796,12 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) else if (!strcmp(arg, "--ignore-submodules")) { DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG); handle_ignore_submodules_arg(options, "all"); - } else if (!prefixcmp(arg, "--ignore-submodules=")) { + } else if (starts_with(arg, "--ignore-submodules=")) { DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG); handle_ignore_submodules_arg(options, arg + 20); } else if (!strcmp(arg, "--submodule")) DIFF_OPT_SET(options, SUBMODULE_LOG); - else if (!prefixcmp(arg, "--submodule=")) + else if (starts_with(arg, "--submodule=")) return parse_submodule_opt(options, arg + 12); /* misc options */ @@ -3825,7 +3837,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) } else if (!strcmp(arg, "--abbrev")) options->abbrev = DEFAULT_ABBREV; - else if (!prefixcmp(arg, "--abbrev=")) { + else if (starts_with(arg, "--abbrev=")) { options->abbrev = strtoul(arg + 9, NULL, 10); if (options->abbrev < MINIMUM_ABBREV) options->abbrev = MINIMUM_ABBREV; @@ -3907,15 +3919,15 @@ static int diff_scoreopt_parse(const char *opt) cmd = *opt++; if (cmd == '-') { /* convert the long-form arguments into short-form versions */ - if (!prefixcmp(opt, "break-rewrites")) { + if (starts_with(opt, "break-rewrites")) { opt += strlen("break-rewrites"); if (*opt == 0 || *opt++ == '=') cmd = 'B'; - } else if (!prefixcmp(opt, "find-copies")) { + } else if (starts_with(opt, "find-copies")) { opt += strlen("find-copies"); if (*opt == 0 || *opt++ == '=') cmd = 'C'; - } else if (!prefixcmp(opt, "find-renames")) { + } else if (starts_with(opt, "find-renames")) { opt += strlen("find-renames"); if (*opt == 0 || *opt++ == '=') cmd = 'M'; @@ -4120,9 +4132,9 @@ void diff_debug_filespec(struct diff_filespec *s, int x, const char *one) DIFF_FILE_VALID(s) ? "valid" : "invalid", s->mode, s->sha1_valid ? sha1_to_hex(s->sha1) : ""); - fprintf(stderr, "queue[%d] %s size %lu flags %d\n", + fprintf(stderr, "queue[%d] %s size %lu\n", x, one ? one : "", - s->size, s->xfrm_flags); + s->size); } void diff_debug_filepair(const struct diff_filepair *p, int i) @@ -4325,7 +4337,7 @@ static void patch_id_consume(void *priv, char *line, unsigned long len) int new_len; /* Ignore line numbers when computing the SHA1 of the patch */ - if (!prefixcmp(line, "@@ -")) + if (starts_with(line, "@@ -")) return; new_len = remove_space(line, len); @@ -4678,6 +4690,38 @@ static int diff_filespec_is_identical(struct diff_filespec *one, return !memcmp(one->data, two->data, one->size); } +static int diff_filespec_check_stat_unmatch(struct diff_filepair *p) +{ + if (p->done_skip_stat_unmatch) + return p->skip_stat_unmatch_result; + + p->done_skip_stat_unmatch = 1; + p->skip_stat_unmatch_result = 0; + /* + * 1. Entries that come from stat info dirtiness + * always have both sides (iow, not create/delete), + * one side of the object name is unknown, with + * the same mode and size. Keep the ones that + * do not match these criteria. They have real + * differences. + * + * 2. At this point, the file is known to be modified, + * with the same mode and size, and the object + * name of one side is unknown. Need to inspect + * the identical contents. + */ + if (!DIFF_FILE_VALID(p->one) || /* (1) */ + !DIFF_FILE_VALID(p->two) || + (p->one->sha1_valid && p->two->sha1_valid) || + (p->one->mode != p->two->mode) || + diff_populate_filespec(p->one, 1) || + diff_populate_filespec(p->two, 1) || + (p->one->size != p->two->size) || + !diff_filespec_is_identical(p->one, p->two)) /* (2) */ + p->skip_stat_unmatch_result = 1; + return p->skip_stat_unmatch_result; +} + static void diffcore_skip_stat_unmatch(struct diff_options *diffopt) { int i; @@ -4688,27 +4732,7 @@ static void diffcore_skip_stat_unmatch(struct diff_options *diffopt) for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; - /* - * 1. Entries that come from stat info dirtiness - * always have both sides (iow, not create/delete), - * one side of the object name is unknown, with - * the same mode and size. Keep the ones that - * do not match these criteria. They have real - * differences. - * - * 2. At this point, the file is known to be modified, - * with the same mode and size, and the object - * name of one side is unknown. Need to inspect - * the identical contents. - */ - if (!DIFF_FILE_VALID(p->one) || /* (1) */ - !DIFF_FILE_VALID(p->two) || - (p->one->sha1_valid && p->two->sha1_valid) || - (p->one->mode != p->two->mode) || - diff_populate_filespec(p->one, 1) || - diff_populate_filespec(p->two, 1) || - (p->one->size != p->two->size) || - !diff_filespec_is_identical(p->one, p->two)) /* (2) */ + if (diff_filespec_check_stat_unmatch(p)) diff_q(&outq, p); else { /* @@ -4871,6 +4895,7 @@ void diff_change(struct diff_options *options, unsigned old_dirty_submodule, unsigned new_dirty_submodule) { struct diff_filespec *one, *two; + struct diff_filepair *p; if (S_ISGITLINK(old_mode) && S_ISGITLINK(new_mode) && is_submodule_ignored(concatpath, options)) @@ -4897,10 +4922,16 @@ void diff_change(struct diff_options *options, fill_filespec(two, new_sha1, new_sha1_valid, new_mode); one->dirty_submodule = old_dirty_submodule; two->dirty_submodule = new_dirty_submodule; + p = diff_queue(&diff_queued_diff, one, two); - diff_queue(&diff_queued_diff, one, two); - if (!DIFF_OPT_TST(options, DIFF_FROM_CONTENTS)) - DIFF_OPT_SET(options, HAS_CHANGES); + if (DIFF_OPT_TST(options, DIFF_FROM_CONTENTS)) + return; + + if (DIFF_OPT_TST(options, QUICK) && options->skip_stat_unmatch && + !diff_filespec_check_stat_unmatch(p)) + return; + + DIFF_OPT_SET(options, HAS_CHANGES); } struct diff_filepair *diff_unmerge(struct diff_options *options, const char *path) @@ -164,6 +164,8 @@ struct diff_options { diff_prefix_fn_t output_prefix; int output_prefix_length; void *output_prefix_data; + + int diff_path_counter; }; enum color_diff { @@ -196,7 +198,6 @@ extern int diff_root_tree_sha1(const unsigned char *new, const char *base, struct combine_diff_path { struct combine_diff_path *next; - int len; char *path; unsigned int mode; unsigned char sha1[20]; @@ -244,7 +245,7 @@ extern struct diff_filepair *diff_unmerge(struct diff_options *, const char *pat #define DIFF_SETUP_USE_SIZE_CACHE 4 /* - * Poor man's alternative to parse-option, to allow both sticked form + * Poor man's alternative to parse-option, to allow both stuck form * (--option=value) and separate form (--option value). */ extern int parse_long_opt(const char *opt, const char **argv, @@ -330,7 +331,7 @@ extern int diff_flush_patch_id(struct diff_options *, unsigned char *); extern int diff_result_code(struct diff_options *, int); -extern void diff_no_index(struct rev_info *, int, const char **, int, const char *); +extern void diff_no_index(struct rev_info *, int, const char **, const char *); extern int index_differs_from(const char *def, int diff_flags); @@ -344,8 +345,6 @@ extern int parse_rename_score(const char **cp_p); extern long parse_algorithm_value(const char *value); -extern void handle_deprecated_show_diff_q(struct diff_options *); - extern int print_stat_summary(FILE *fp, int files, int insertions, int deletions); extern void setup_diff_pager(struct diff_options *); diff --git a/diffcore-order.c b/diffcore-order.c index 23e93852d8..97dd3d0095 100644 --- a/diffcore-order.c +++ b/diffcore-order.c @@ -10,28 +10,21 @@ static int order_cnt; static void prepare_order(const char *orderfile) { - int fd, cnt, pass; + int cnt, pass; + struct strbuf sb = STRBUF_INIT; void *map; char *cp, *endp; - struct stat st; - size_t sz; + ssize_t sz; if (order) return; - fd = open(orderfile, O_RDONLY); - if (fd < 0) - return; - if (fstat(fd, &st)) { - close(fd); - return; - } - sz = xsize_t(st.st_size); - map = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); - close(fd); - if (map == MAP_FAILED) - return; + sz = strbuf_read_file(&sb, orderfile, 0); + if (sz < 0) + die_errno(_("failed to read orderfile '%s'"), orderfile); + map = strbuf_detach(&sb, NULL); endp = (char *) map + sz; + for (pass = 0; pass < 2; pass++) { cnt = 0; cp = map; @@ -64,24 +57,19 @@ static void prepare_order(const char *orderfile) } } -struct pair_order { - struct diff_filepair *pair; - int orig_order; - int order; -}; - static int match_order(const char *path) { int i; - char p[PATH_MAX]; + static struct strbuf p = STRBUF_INIT; for (i = 0; i < order_cnt; i++) { - strcpy(p, path); - while (p[0]) { + strbuf_reset(&p); + strbuf_addstr(&p, path); + while (p.buf[0]) { char *cp; - if (!fnmatch(order[i], p, 0)) + if (!wildmatch(order[i], p.buf, 0, NULL)) return i; - cp = strrchr(p, '/'); + cp = strrchr(p.buf, '/'); if (!cp) break; *cp = 0; @@ -90,35 +78,54 @@ static int match_order(const char *path) return order_cnt; } -static int compare_pair_order(const void *a_, const void *b_) +static int compare_objs_order(const void *a_, const void *b_) { - struct pair_order const *a, *b; - a = (struct pair_order const *)a_; - b = (struct pair_order const *)b_; + struct obj_order const *a, *b; + a = (struct obj_order const *)a_; + b = (struct obj_order const *)b_; if (a->order != b->order) return a->order - b->order; return a->orig_order - b->orig_order; } +void order_objects(const char *orderfile, obj_path_fn_t obj_path, + struct obj_order *objs, int nr) +{ + int i; + + if (!nr) + return; + + prepare_order(orderfile); + for (i = 0; i < nr; i++) { + objs[i].orig_order = i; + objs[i].order = match_order(obj_path(objs[i].obj)); + } + qsort(objs, nr, sizeof(*objs), compare_objs_order); +} + +static const char *pair_pathtwo(void *obj) +{ + struct diff_filepair *pair = (struct diff_filepair *)obj; + + return pair->two->path; +} + void diffcore_order(const char *orderfile) { struct diff_queue_struct *q = &diff_queued_diff; - struct pair_order *o; + struct obj_order *o; int i; if (!q->nr) return; o = xmalloc(sizeof(*o) * q->nr); - prepare_order(orderfile); - for (i = 0; i < q->nr; i++) { - o[i].pair = q->queue[i]; - o[i].orig_order = i; - o[i].order = match_order(o[i].pair->two->path); - } - qsort(o, q->nr, sizeof(*o), compare_pair_order); for (i = 0; i < q->nr; i++) - q->queue[i] = o[i].pair; + o[i].obj = q->queue[i]; + order_objects(orderfile, pair_pathtwo, o, q->nr); + for (i = 0; i < q->nr; i++) + q->queue[i] = o[i].obj; free(o); return; } diff --git a/diffcore-rename.c b/diffcore-rename.c index 6c7a72fbe7..39effecd84 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -4,7 +4,7 @@ #include "cache.h" #include "diff.h" #include "diffcore.h" -#include "hash.h" +#include "hashmap.h" #include "progress.h" /* Table of rename/copy destinations */ @@ -243,137 +243,82 @@ static int score_compare(const void *a_, const void *b_) } struct file_similarity { - int src_dst, index; + struct hashmap_entry entry; + int index; struct diff_filespec *filespec; - struct file_similarity *next; }; -static int find_identical_files(struct file_similarity *src, - struct file_similarity *dst, +static unsigned int hash_filespec(struct diff_filespec *filespec) +{ + unsigned int hash; + if (!filespec->sha1_valid) { + if (diff_populate_filespec(filespec, 0)) + return 0; + hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1); + } + memcpy(&hash, filespec->sha1, sizeof(hash)); + return hash; +} + +static int find_identical_files(struct hashmap *srcs, + int dst_index, struct diff_options *options) { int renames = 0; + struct diff_filespec *target = rename_dst[dst_index].two; + struct file_similarity *p, *best, dst; + int i = 100, best_score = -1; + /* - * Walk over all the destinations ... + * Find the best source match for specified destination. */ - do { - struct diff_filespec *target = dst->filespec; - struct file_similarity *p, *best; - int i = 100, best_score = -1; - - /* - * .. to find the best source match - */ - best = NULL; - for (p = src; p; p = p->next) { - int score; - struct diff_filespec *source = p->filespec; - - /* False hash collision? */ - if (hashcmp(source->sha1, target->sha1)) - continue; - /* Non-regular files? If so, the modes must match! */ - if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) { - if (source->mode != target->mode) - continue; - } - /* Give higher scores to sources that haven't been used already */ - score = !source->rename_used; - if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY) + best = NULL; + hashmap_entry_init(&dst, hash_filespec(target)); + for (p = hashmap_get(srcs, &dst, NULL); p; p = hashmap_get_next(srcs, p)) { + int score; + struct diff_filespec *source = p->filespec; + + /* False hash collision? */ + if (hashcmp(source->sha1, target->sha1)) + continue; + /* Non-regular files? If so, the modes must match! */ + if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) { + if (source->mode != target->mode) continue; - score += basename_same(source, target); - if (score > best_score) { - best = p; - best_score = score; - if (score == 2) - break; - } - - /* Too many identical alternatives? Pick one */ - if (!--i) - break; } - if (best) { - record_rename_pair(dst->index, best->index, MAX_SCORE); - renames++; + /* Give higher scores to sources that haven't been used already */ + score = !source->rename_used; + if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY) + continue; + score += basename_same(source, target); + if (score > best_score) { + best = p; + best_score = score; + if (score == 2) + break; } - } while ((dst = dst->next) != NULL); - return renames; -} -static void free_similarity_list(struct file_similarity *p) -{ - while (p) { - struct file_similarity *entry = p; - p = p->next; - free(entry); + /* Too many identical alternatives? Pick one */ + if (!--i) + break; } -} - -static int find_same_files(void *ptr, void *data) -{ - int ret; - struct file_similarity *p = ptr; - struct file_similarity *src = NULL, *dst = NULL; - struct diff_options *options = data; - - /* Split the hash list up into sources and destinations */ - do { - struct file_similarity *entry = p; - p = p->next; - if (entry->src_dst < 0) { - entry->next = src; - src = entry; - } else { - entry->next = dst; - dst = entry; - } - } while (p); - - /* - * If we have both sources *and* destinations, see if - * we can match them up - */ - ret = (src && dst) ? find_identical_files(src, dst, options) : 0; - - /* Free the hashes and return the number of renames found */ - free_similarity_list(src); - free_similarity_list(dst); - return ret; -} - -static unsigned int hash_filespec(struct diff_filespec *filespec) -{ - unsigned int hash; - if (!filespec->sha1_valid) { - if (diff_populate_filespec(filespec, 0)) - return 0; - hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1); + if (best) { + record_rename_pair(dst_index, best->index, MAX_SCORE); + renames++; } - memcpy(&hash, filespec->sha1, sizeof(hash)); - return hash; + return renames; } -static void insert_file_table(struct hash_table *table, int src_dst, int index, struct diff_filespec *filespec) +static void insert_file_table(struct hashmap *table, int index, struct diff_filespec *filespec) { - void **pos; - unsigned int hash; struct file_similarity *entry = xmalloc(sizeof(*entry)); - entry->src_dst = src_dst; entry->index = index; entry->filespec = filespec; - entry->next = NULL; - - hash = hash_filespec(filespec); - pos = insert_hash(hash, entry, table); - /* We already had an entry there? */ - if (pos) { - entry->next = *pos; - *pos = entry; - } + hashmap_entry_init(entry, hash_filespec(filespec)); + hashmap_add(table, entry); } /* @@ -385,24 +330,22 @@ static void insert_file_table(struct hash_table *table, int src_dst, int index, */ static int find_exact_renames(struct diff_options *options) { - int i; - struct hash_table file_table; + int i, renames = 0; + struct hashmap file_table; - init_hash(&file_table); - preallocate_hash(&file_table, rename_src_nr + rename_dst_nr); + /* Add all sources to the hash table */ + hashmap_init(&file_table, NULL, rename_src_nr); for (i = 0; i < rename_src_nr; i++) - insert_file_table(&file_table, -1, i, rename_src[i].p->one); + insert_file_table(&file_table, i, rename_src[i].p->one); + /* Walk the destinations and find best source match */ for (i = 0; i < rename_dst_nr; i++) - insert_file_table(&file_table, 1, i, rename_dst[i].two); - - /* Find the renames */ - i = for_each_hash(&file_table, find_same_files, options); + renames += find_identical_files(&file_table, i, options); - /* .. and free the hash data structure */ - free_hash(&file_table); + /* Free the hash data structure and entries */ + hashmap_free(&file_table, 1); - return i; + return renames; } #define NUM_CANDIDATE_PER_DST 4 @@ -579,7 +522,7 @@ void diffcore_rename(struct diff_options *options) if (options->show_rename_progress) { progress = start_progress_delay( - "Performing inexact rename detection", + _("Performing inexact rename detection"), rename_dst_nr * rename_src_nr, 50, 1); } diff --git a/diffcore.h b/diffcore.h index 1c16c8595b..c876dac71a 100644 --- a/diffcore.h +++ b/diffcore.h @@ -29,10 +29,8 @@ struct diff_filespec { char *path; void *data; void *cnt_data; - const char *funcname_pattern_ident; unsigned long size; int count; /* Reference count */ - int xfrm_flags; /* for use by the xfrm */ int rename_used; /* Count of rename users */ unsigned short mode; /* file mode */ unsigned sha1_valid : 1; /* if true, use sha1 and trust mode; @@ -43,13 +41,13 @@ struct diff_filespec { unsigned should_free : 1; /* data should be free()'ed */ unsigned should_munmap : 1; /* data should be munmap()'ed */ unsigned dirty_submodule : 2; /* For submodules: its work tree is dirty */ - unsigned is_stdin : 1; #define DIRTY_SUBMODULE_UNTRACKED 1 #define DIRTY_SUBMODULE_MODIFIED 2 + unsigned is_stdin : 1; unsigned has_more_entries : 1; /* only appear in combined diff */ - struct userdiff_driver *driver; /* data should be considered "binary"; -1 means "don't know yet" */ - int is_binary; + signed int is_binary : 2; + struct userdiff_driver *driver; }; extern struct diff_filespec *alloc_filespec(const char *); @@ -70,6 +68,8 @@ struct diff_filepair { unsigned broken_pair : 1; unsigned renamed_pair : 1; unsigned is_unmerged : 1; + unsigned done_skip_stat_unmatch : 1; + unsigned skip_stat_unmatch_result : 1; }; #define DIFF_PAIR_UNMERGED(p) ((p)->is_unmerged) @@ -111,6 +111,20 @@ extern void diffcore_merge_broken(void); extern void diffcore_pickaxe(struct diff_options *); extern void diffcore_order(const char *orderfile); +/* low-level interface to diffcore_order */ +struct obj_order { + void *obj; /* setup by caller */ + + /* setup/used by order_objects() */ + int orig_order; + int order; +}; + +typedef const char *(*obj_path_fn_t)(void *obj); + +void order_objects(const char *orderfile, obj_path_fn_t obj_path, + struct obj_order *objs, int nr); + #define DIFF_DEBUG 0 #if DIFF_DEBUG void diff_debug_filespec(struct diff_filespec *, int, const char *); @@ -49,7 +49,9 @@ int strncmp_icase(const char *a, const char *b, size_t count) int fnmatch_icase(const char *pattern, const char *string, int flags) { - return fnmatch(pattern, string, flags | (ignore_case ? FNM_CASEFOLD : 0)); + return wildmatch(pattern, string, + flags | (ignore_case ? WM_CASEFOLD : 0), + NULL); } inline int git_fnmatch(const struct pathspec_item *item, @@ -58,7 +60,7 @@ inline int git_fnmatch(const struct pathspec_item *item, { if (prefix > 0) { if (ps_strncmp(item, pattern, string, prefix)) - return FNM_NOMATCH; + return WM_NOMATCH; pattern += prefix; string += prefix; } @@ -76,8 +78,9 @@ inline int git_fnmatch(const struct pathspec_item *item, NULL); else /* wildmatch has not learned no FNM_PATHNAME mode yet */ - return fnmatch(pattern, string, - item->magic & PATHSPEC_ICASE ? FNM_CASEFOLD : 0); + return wildmatch(pattern, string, + item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0, + NULL); } static int fnmatch_icase_mem(const char *pattern, int patternlen, @@ -126,10 +129,13 @@ static size_t common_prefix_len(const struct pathspec *pathspec) PATHSPEC_MAXDEPTH | PATHSPEC_LITERAL | PATHSPEC_GLOB | - PATHSPEC_ICASE); + PATHSPEC_ICASE | + PATHSPEC_EXCLUDE); for (n = 0; n < pathspec->nr; n++) { size_t i = 0, len = 0, item_len; + if (pathspec->items[n].magic & PATHSPEC_EXCLUDE) + continue; if (pathspec->items[n].magic & PATHSPEC_ICASE) item_len = pathspec->items[n].prefix; else @@ -192,6 +198,9 @@ int within_depth(const char *name, int namelen, return 1; } +#define DO_MATCH_EXCLUDE 1 +#define DO_MATCH_DIRECTORY 2 + /* * Does 'match' match the given name? * A match is found if @@ -205,7 +214,7 @@ int within_depth(const char *name, int namelen, * It returns 0 when there is no match. */ static int match_pathspec_item(const struct pathspec_item *item, int prefix, - const char *name, int namelen) + const char *name, int namelen, unsigned flags) { /* name/namelen has prefix cut off by caller */ const char *match = item->match + prefix; @@ -215,7 +224,7 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix, * The normal call pattern is: * 1. prefix = common_prefix_len(ps); * 2. prune something, or fill_directory - * 3. match_pathspec_depth() + * 3. match_pathspec() * * 'prefix' at #1 may be shorter than the command's prefix and * it's ok for #2 to match extra files. Those extras will be @@ -254,7 +263,11 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix, if (match[matchlen-1] == '/' || name[matchlen] == '/') return MATCHED_RECURSIVELY; - } + } else if ((flags & DO_MATCH_DIRECTORY) && + match[matchlen - 1] == '/' && + namelen == matchlen - 1 && + !ps_strncmp(item, match, name, namelen)) + return MATCHED_EXACTLY; if (item->nowildcard_len < item->len && !git_fnmatch(item, match, name, @@ -279,18 +292,20 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix, * pathspec did not match any names, which could indicate that the * user mistyped the nth pathspec. */ -int match_pathspec_depth(const struct pathspec *ps, - const char *name, int namelen, - int prefix, char *seen) +static int do_match_pathspec(const struct pathspec *ps, + const char *name, int namelen, + int prefix, char *seen, + unsigned flags) { - int i, retval = 0; + int i, retval = 0, exclude = flags & DO_MATCH_EXCLUDE; GUARD_PATHSPEC(ps, PATHSPEC_FROMTOP | PATHSPEC_MAXDEPTH | PATHSPEC_LITERAL | PATHSPEC_GLOB | - PATHSPEC_ICASE); + PATHSPEC_ICASE | + PATHSPEC_EXCLUDE); if (!ps->nr) { if (!ps->recursive || @@ -309,9 +324,21 @@ int match_pathspec_depth(const struct pathspec *ps, for (i = ps->nr - 1; i >= 0; i--) { int how; + + if ((!exclude && ps->items[i].magic & PATHSPEC_EXCLUDE) || + ( exclude && !(ps->items[i].magic & PATHSPEC_EXCLUDE))) + continue; + if (seen && seen[i] == MATCHED_EXACTLY) continue; - how = match_pathspec_item(ps->items+i, prefix, name, namelen); + /* + * Make exclude patterns optional and never report + * "pathspec ':(exclude)foo' matches no files" + */ + if (seen && ps->items[i].magic & PATHSPEC_EXCLUDE) + seen[i] = MATCHED_FNMATCH; + how = match_pathspec_item(ps->items+i, prefix, name, + namelen, flags); if (ps->recursive && (ps->magic & PATHSPEC_MAXDEPTH) && ps->max_depth != -1 && @@ -334,6 +361,22 @@ int match_pathspec_depth(const struct pathspec *ps, return retval; } +int match_pathspec(const struct pathspec *ps, + const char *name, int namelen, + int prefix, char *seen, int is_dir) +{ + int positive, negative; + unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0; + positive = do_match_pathspec(ps, name, namelen, + prefix, seen, flags); + if (!(ps->magic & PATHSPEC_EXCLUDE) || !positive) + return positive; + negative = do_match_pathspec(ps, name, namelen, + prefix, seen, + flags | DO_MATCH_EXCLUDE); + return negative ? 0 : positive; +} + /* * Return the length of the "simple" part of a path match limiter. */ @@ -463,6 +506,25 @@ void clear_exclude_list(struct exclude_list *el) el->filebuf = NULL; } +static void trim_trailing_spaces(char *buf) +{ + int i, last_space = -1, nr_spaces, len = strlen(buf); + for (i = 0; i < len; i++) + if (buf[i] == '\\') + i++; + else if (buf[i] == ' ') { + if (last_space == -1) { + last_space = i; + nr_spaces = 1; + } else + nr_spaces++; + } else + last_space = -1; + + if (last_space != -1 && last_space + nr_spaces == len) + buf[last_space] = '\0'; +} + int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, @@ -514,6 +576,7 @@ int add_excludes_from_file_to_list(const char *fname, if (buf[i] == '\n') { if (entry != buf + i && entry[0] != '#') { buf[i - (i && buf[i-1] == '\r')] = 0; + trim_trailing_spaces(entry); add_exclude(entry, base, baselen, el, lineno); } lineno++; @@ -1375,11 +1438,18 @@ int read_directory(struct dir_struct *dir, const char *path, int len, const stru PATHSPEC_MAXDEPTH | PATHSPEC_LITERAL | PATHSPEC_GLOB | - PATHSPEC_ICASE); + PATHSPEC_ICASE | + PATHSPEC_EXCLUDE); if (has_symlink_leading_path(path, len)) return dir->nr; + /* + * exclude patterns are treated like positive ones in + * create_simplify. Usually exclude patterns should be a + * subset of positive ones, which has no impacts on + * create_simplify(). + */ simplify = create_simplify(pathspec ? pathspec->_raw : NULL); if (!len || treat_leading_path(dir, path, len, simplify)) read_directory_recursive(dir, path, len, 0, simplify); @@ -1476,8 +1546,13 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) flag &= ~REMOVE_DIR_KEEP_TOPLEVEL; dir = opendir(path->buf); if (!dir) { - /* an empty dir could be removed even if it is unreadble */ - if (!keep_toplevel) + if (errno == ENOENT) + return keep_toplevel ? -1 : 0; + else if (errno == EACCES && !keep_toplevel) + /* + * An empty dir could be removable even if it + * is unreadable: + */ return rmdir(path->buf); else return -1; @@ -1493,13 +1568,21 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) strbuf_setlen(path, len); strbuf_addstr(path, e->d_name); - if (lstat(path->buf, &st)) - ; /* fall thru */ - else if (S_ISDIR(st.st_mode)) { + if (lstat(path->buf, &st)) { + if (errno == ENOENT) + /* + * file disappeared, which is what we + * wanted anyway + */ + continue; + /* fall thru */ + } else if (S_ISDIR(st.st_mode)) { if (!remove_dir_recurse(path, flag, &kept_down)) continue; /* happy */ - } else if (!only_empty && !unlink(path->buf)) + } else if (!only_empty && + (!unlink(path->buf) || errno == ENOENT)) { continue; /* happy, too */ + } /* path too long, stat fails, or non-directory still exists */ ret = -1; @@ -1509,7 +1592,7 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) strbuf_setlen(path, original_len); if (!ret && !keep_toplevel && !kept_down) - ret = rmdir(path->buf); + ret = (!rmdir(path->buf) || errno == ENOENT) ? 0 : -1; else if (kept_up) /* * report the uplevel that it is not an error that we @@ -132,9 +132,9 @@ struct dir_struct { extern int simple_length(const char *match); extern int no_wildcard(const char *string); extern char *common_prefix(const struct pathspec *pathspec); -extern int match_pathspec_depth(const struct pathspec *pathspec, - const char *name, int namelen, - int prefix, char *seen); +extern int match_pathspec(const struct pathspec *pathspec, + const char *name, int namelen, + int prefix, char *seen, int is_dir); extern int within_depth(const char *name, int namelen, int depth, int max_depth); extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec); @@ -205,4 +205,22 @@ extern int git_fnmatch(const struct pathspec_item *item, const char *pattern, const char *string, int prefix); +static inline int ce_path_match(const struct cache_entry *ce, + const struct pathspec *pathspec, + char *seen) +{ + return match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen, + S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)); +} + +static inline int dir_path_match(const struct dir_entry *ent, + const struct pathspec *pathspec, + int prefix, char *seen) +{ + int has_trailing_dir = ent->len && ent->name[ent->len - 1] == '/'; + int len = has_trailing_dir ? ent->len - 1 : ent->len; + return match_pathspec(pathspec, ent->name, len, prefix, seen, + has_trailing_dir); +} + #endif @@ -234,19 +234,30 @@ static int check_path(const char *path, int len, struct stat *st, int skiplen) return lstat(path, st); } +/* + * Write the contents from ce out to the working tree. + * + * When topath[] is not NULL, instead of writing to the working tree + * file named by ce, a temporary file is created by this function and + * its name is returned in topath[], which must be able to hold at + * least TEMPORARY_FILENAME_LENGTH bytes long. + */ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath) { - static char path[PATH_MAX + 1]; + static struct strbuf path_buf = STRBUF_INIT; + char *path; struct stat st; - int len = state->base_dir_len; + int len; if (topath) return write_entry(ce, topath, state, 1); - memcpy(path, state->base_dir, len); - strcpy(path + len, ce->name); - len += ce_namelen(ce); + strbuf_reset(&path_buf); + strbuf_add(&path_buf, state->base_dir, state->base_dir_len); + strbuf_add(&path_buf, ce->name, ce_namelen(ce)); + path = path_buf.buf; + len = path_buf.len; if (!check_path(path, len, &st, state->base_dir_len)) { unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE); diff --git a/environment.c b/environment.c index 378254c77a..c3c860603d 100644 --- a/environment.c +++ b/environment.c @@ -10,6 +10,7 @@ #include "cache.h" #include "refs.h" #include "fmt-merge-msg.h" +#include "commit.h" int trust_executable_bit = 1; int trust_ctime = 1; @@ -44,7 +45,7 @@ const char *editor_program; const char *askpass_program; const char *excludes_file; enum auto_crlf auto_crlf = AUTO_CRLF_FALSE; -int read_replace_refs = 1; /* NEEDSWORK: rename to use_replace_refs */ +int check_replace_refs = 1; enum eol core_eol = EOL_UNSET; enum safe_crlf safe_crlf = SAFE_CRLF_WARN; unsigned whitespace_rule_cfg = WS_DEFAULT_RULE; @@ -97,6 +98,7 @@ const char * const local_repo_env[] = { INDEX_ENVIRONMENT, NO_REPLACE_OBJECTS_ENVIRONMENT, GIT_PREFIX_ENVIRONMENT, + GIT_SHALLOW_FILE_ENVIRONMENT, NULL }; @@ -124,6 +126,7 @@ static char *expand_namespace(const char *raw_namespace) static void setup_git_env(void) { const char *gitfile; + const char *shallow_file; git_dir = getenv(GIT_DIR_ENVIRONMENT); if (!git_dir) @@ -144,9 +147,12 @@ static void setup_git_env(void) if (!git_graft_file) git_graft_file = git_pathdup("info/grafts"); if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT)) - read_replace_refs = 0; + check_replace_refs = 0; namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT)); namespace_len = strlen(namespace); + shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT); + if (shallow_file) + set_alternate_shallow_file(shallow_file, 0); } int is_bare_repository(void) @@ -155,11 +161,6 @@ int is_bare_repository(void) return is_bare_repository_cfg && !get_git_work_tree(); } -int have_git_dir(void) -{ - return !!git_dir; -} - const char *get_git_dir(void) { if (!git_dir) @@ -176,7 +177,7 @@ const char *get_git_namespace(void) const char *strip_namespace(const char *namespaced_ref) { - if (prefixcmp(namespaced_ref, get_git_namespace()) != 0) + if (!starts_with(namespaced_ref, get_git_namespace())) return NULL; return namespaced_ref + namespace_len; } diff --git a/ewah/bitmap.c b/ewah/bitmap.c new file mode 100644 index 0000000000..710e58c1bf --- /dev/null +++ b/ewah/bitmap.c @@ -0,0 +1,221 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "git-compat-util.h" +#include "ewok.h" + +#define MASK(x) ((eword_t)1 << (x % BITS_IN_WORD)) +#define BLOCK(x) (x / BITS_IN_WORD) + +struct bitmap *bitmap_new(void) +{ + struct bitmap *bitmap = ewah_malloc(sizeof(struct bitmap)); + bitmap->words = ewah_calloc(32, sizeof(eword_t)); + bitmap->word_alloc = 32; + return bitmap; +} + +void bitmap_set(struct bitmap *self, size_t pos) +{ + size_t block = BLOCK(pos); + + if (block >= self->word_alloc) { + size_t old_size = self->word_alloc; + self->word_alloc = block * 2; + self->words = ewah_realloc(self->words, + self->word_alloc * sizeof(eword_t)); + + memset(self->words + old_size, 0x0, + (self->word_alloc - old_size) * sizeof(eword_t)); + } + + self->words[block] |= MASK(pos); +} + +void bitmap_clear(struct bitmap *self, size_t pos) +{ + size_t block = BLOCK(pos); + + if (block < self->word_alloc) + self->words[block] &= ~MASK(pos); +} + +int bitmap_get(struct bitmap *self, size_t pos) +{ + size_t block = BLOCK(pos); + return block < self->word_alloc && + (self->words[block] & MASK(pos)) != 0; +} + +struct ewah_bitmap *bitmap_to_ewah(struct bitmap *bitmap) +{ + struct ewah_bitmap *ewah = ewah_new(); + size_t i, running_empty_words = 0; + eword_t last_word = 0; + + for (i = 0; i < bitmap->word_alloc; ++i) { + if (bitmap->words[i] == 0) { + running_empty_words++; + continue; + } + + if (last_word != 0) + ewah_add(ewah, last_word); + + if (running_empty_words > 0) { + ewah_add_empty_words(ewah, 0, running_empty_words); + running_empty_words = 0; + } + + last_word = bitmap->words[i]; + } + + ewah_add(ewah, last_word); + return ewah; +} + +struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah) +{ + struct bitmap *bitmap = bitmap_new(); + struct ewah_iterator it; + eword_t blowup; + size_t i = 0; + + ewah_iterator_init(&it, ewah); + + while (ewah_iterator_next(&blowup, &it)) { + if (i >= bitmap->word_alloc) { + bitmap->word_alloc *= 1.5; + bitmap->words = ewah_realloc( + bitmap->words, bitmap->word_alloc * sizeof(eword_t)); + } + + bitmap->words[i++] = blowup; + } + + bitmap->word_alloc = i; + return bitmap; +} + +void bitmap_and_not(struct bitmap *self, struct bitmap *other) +{ + const size_t count = (self->word_alloc < other->word_alloc) ? + self->word_alloc : other->word_alloc; + + size_t i; + + for (i = 0; i < count; ++i) + self->words[i] &= ~other->words[i]; +} + +void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other) +{ + size_t original_size = self->word_alloc; + size_t other_final = (other->bit_size / BITS_IN_WORD) + 1; + size_t i = 0; + struct ewah_iterator it; + eword_t word; + + if (self->word_alloc < other_final) { + self->word_alloc = other_final; + self->words = ewah_realloc(self->words, + self->word_alloc * sizeof(eword_t)); + memset(self->words + original_size, 0x0, + (self->word_alloc - original_size) * sizeof(eword_t)); + } + + ewah_iterator_init(&it, other); + + while (ewah_iterator_next(&word, &it)) + self->words[i++] |= word; +} + +void bitmap_each_bit(struct bitmap *self, ewah_callback callback, void *data) +{ + size_t pos = 0, i; + + for (i = 0; i < self->word_alloc; ++i) { + eword_t word = self->words[i]; + uint32_t offset; + + if (word == (eword_t)~0) { + for (offset = 0; offset < BITS_IN_WORD; ++offset) + callback(pos++, data); + } else { + for (offset = 0; offset < BITS_IN_WORD; ++offset) { + if ((word >> offset) == 0) + break; + + offset += ewah_bit_ctz64(word >> offset); + callback(pos + offset, data); + } + pos += BITS_IN_WORD; + } + } +} + +size_t bitmap_popcount(struct bitmap *self) +{ + size_t i, count = 0; + + for (i = 0; i < self->word_alloc; ++i) + count += ewah_bit_popcount64(self->words[i]); + + return count; +} + +int bitmap_equals(struct bitmap *self, struct bitmap *other) +{ + struct bitmap *big, *small; + size_t i; + + if (self->word_alloc < other->word_alloc) { + small = self; + big = other; + } else { + small = other; + big = self; + } + + for (i = 0; i < small->word_alloc; ++i) { + if (small->words[i] != big->words[i]) + return 0; + } + + for (; i < big->word_alloc; ++i) { + if (big->words[i] != 0) + return 0; + } + + return 1; +} + +void bitmap_reset(struct bitmap *bitmap) +{ + memset(bitmap->words, 0x0, bitmap->word_alloc * sizeof(eword_t)); +} + +void bitmap_free(struct bitmap *bitmap) +{ + if (bitmap == NULL) + return; + + free(bitmap->words); + free(bitmap); +} diff --git a/ewah/ewah_bitmap.c b/ewah/ewah_bitmap.c new file mode 100644 index 0000000000..9ced2dadfe --- /dev/null +++ b/ewah/ewah_bitmap.c @@ -0,0 +1,714 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "git-compat-util.h" +#include "ewok.h" +#include "ewok_rlw.h" + +static inline size_t min_size(size_t a, size_t b) +{ + return a < b ? a : b; +} + +static inline size_t max_size(size_t a, size_t b) +{ + return a > b ? a : b; +} + +static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size) +{ + size_t rlw_offset = (uint8_t *)self->rlw - (uint8_t *)self->buffer; + + if (self->alloc_size >= new_size) + return; + + self->alloc_size = new_size; + self->buffer = ewah_realloc(self->buffer, + self->alloc_size * sizeof(eword_t)); + self->rlw = self->buffer + (rlw_offset / sizeof(size_t)); +} + +static inline void buffer_push(struct ewah_bitmap *self, eword_t value) +{ + if (self->buffer_size + 1 >= self->alloc_size) + buffer_grow(self, self->buffer_size * 3 / 2); + + self->buffer[self->buffer_size++] = value; +} + +static void buffer_push_rlw(struct ewah_bitmap *self, eword_t value) +{ + buffer_push(self, value); + self->rlw = self->buffer + self->buffer_size - 1; +} + +static size_t add_empty_words(struct ewah_bitmap *self, int v, size_t number) +{ + size_t added = 0; + eword_t runlen, can_add; + + if (rlw_get_run_bit(self->rlw) != v && rlw_size(self->rlw) == 0) { + rlw_set_run_bit(self->rlw, v); + } else if (rlw_get_literal_words(self->rlw) != 0 || + rlw_get_run_bit(self->rlw) != v) { + buffer_push_rlw(self, 0); + if (v) rlw_set_run_bit(self->rlw, v); + added++; + } + + runlen = rlw_get_running_len(self->rlw); + can_add = min_size(number, RLW_LARGEST_RUNNING_COUNT - runlen); + + rlw_set_running_len(self->rlw, runlen + can_add); + number -= can_add; + + while (number >= RLW_LARGEST_RUNNING_COUNT) { + buffer_push_rlw(self, 0); + added++; + if (v) rlw_set_run_bit(self->rlw, v); + rlw_set_running_len(self->rlw, RLW_LARGEST_RUNNING_COUNT); + number -= RLW_LARGEST_RUNNING_COUNT; + } + + if (number > 0) { + buffer_push_rlw(self, 0); + added++; + + if (v) rlw_set_run_bit(self->rlw, v); + rlw_set_running_len(self->rlw, number); + } + + return added; +} + +size_t ewah_add_empty_words(struct ewah_bitmap *self, int v, size_t number) +{ + if (number == 0) + return 0; + + self->bit_size += number * BITS_IN_WORD; + return add_empty_words(self, v, number); +} + +static size_t add_literal(struct ewah_bitmap *self, eword_t new_data) +{ + eword_t current_num = rlw_get_literal_words(self->rlw); + + if (current_num >= RLW_LARGEST_LITERAL_COUNT) { + buffer_push_rlw(self, 0); + + rlw_set_literal_words(self->rlw, 1); + buffer_push(self, new_data); + return 2; + } + + rlw_set_literal_words(self->rlw, current_num + 1); + + /* sanity check */ + assert(rlw_get_literal_words(self->rlw) == current_num + 1); + + buffer_push(self, new_data); + return 1; +} + +void ewah_add_dirty_words( + struct ewah_bitmap *self, const eword_t *buffer, + size_t number, int negate) +{ + size_t literals, can_add; + + while (1) { + literals = rlw_get_literal_words(self->rlw); + can_add = min_size(number, RLW_LARGEST_LITERAL_COUNT - literals); + + rlw_set_literal_words(self->rlw, literals + can_add); + + if (self->buffer_size + can_add >= self->alloc_size) + buffer_grow(self, (self->buffer_size + can_add) * 3 / 2); + + if (negate) { + size_t i; + for (i = 0; i < can_add; ++i) + self->buffer[self->buffer_size++] = ~buffer[i]; + } else { + memcpy(self->buffer + self->buffer_size, + buffer, can_add * sizeof(eword_t)); + self->buffer_size += can_add; + } + + self->bit_size += can_add * BITS_IN_WORD; + + if (number - can_add == 0) + break; + + buffer_push_rlw(self, 0); + buffer += can_add; + number -= can_add; + } +} + +static size_t add_empty_word(struct ewah_bitmap *self, int v) +{ + int no_literal = (rlw_get_literal_words(self->rlw) == 0); + eword_t run_len = rlw_get_running_len(self->rlw); + + if (no_literal && run_len == 0) { + rlw_set_run_bit(self->rlw, v); + assert(rlw_get_run_bit(self->rlw) == v); + } + + if (no_literal && rlw_get_run_bit(self->rlw) == v && + run_len < RLW_LARGEST_RUNNING_COUNT) { + rlw_set_running_len(self->rlw, run_len + 1); + assert(rlw_get_running_len(self->rlw) == run_len + 1); + return 0; + } else { + buffer_push_rlw(self, 0); + + assert(rlw_get_running_len(self->rlw) == 0); + assert(rlw_get_run_bit(self->rlw) == 0); + assert(rlw_get_literal_words(self->rlw) == 0); + + rlw_set_run_bit(self->rlw, v); + assert(rlw_get_run_bit(self->rlw) == v); + + rlw_set_running_len(self->rlw, 1); + assert(rlw_get_running_len(self->rlw) == 1); + assert(rlw_get_literal_words(self->rlw) == 0); + return 1; + } +} + +size_t ewah_add(struct ewah_bitmap *self, eword_t word) +{ + self->bit_size += BITS_IN_WORD; + + if (word == 0) + return add_empty_word(self, 0); + + if (word == (eword_t)(~0)) + return add_empty_word(self, 1); + + return add_literal(self, word); +} + +void ewah_set(struct ewah_bitmap *self, size_t i) +{ + const size_t dist = + (i + BITS_IN_WORD) / BITS_IN_WORD - + (self->bit_size + BITS_IN_WORD - 1) / BITS_IN_WORD; + + assert(i >= self->bit_size); + + self->bit_size = i + 1; + + if (dist > 0) { + if (dist > 1) + add_empty_words(self, 0, dist - 1); + + add_literal(self, (eword_t)1 << (i % BITS_IN_WORD)); + return; + } + + if (rlw_get_literal_words(self->rlw) == 0) { + rlw_set_running_len(self->rlw, + rlw_get_running_len(self->rlw) - 1); + add_literal(self, (eword_t)1 << (i % BITS_IN_WORD)); + return; + } + + self->buffer[self->buffer_size - 1] |= + ((eword_t)1 << (i % BITS_IN_WORD)); + + /* check if we just completed a stream of 1s */ + if (self->buffer[self->buffer_size - 1] == (eword_t)(~0)) { + self->buffer[--self->buffer_size] = 0; + rlw_set_literal_words(self->rlw, + rlw_get_literal_words(self->rlw) - 1); + add_empty_word(self, 1); + } +} + +void ewah_each_bit(struct ewah_bitmap *self, void (*callback)(size_t, void*), void *payload) +{ + size_t pos = 0; + size_t pointer = 0; + size_t k; + + while (pointer < self->buffer_size) { + eword_t *word = &self->buffer[pointer]; + + if (rlw_get_run_bit(word)) { + size_t len = rlw_get_running_len(word) * BITS_IN_WORD; + for (k = 0; k < len; ++k, ++pos) + callback(pos, payload); + } else { + pos += rlw_get_running_len(word) * BITS_IN_WORD; + } + + ++pointer; + + for (k = 0; k < rlw_get_literal_words(word); ++k) { + int c; + + /* todo: zero count optimization */ + for (c = 0; c < BITS_IN_WORD; ++c, ++pos) { + if ((self->buffer[pointer] & ((eword_t)1 << c)) != 0) + callback(pos, payload); + } + + ++pointer; + } + } +} + +struct ewah_bitmap *ewah_new(void) +{ + struct ewah_bitmap *self; + + self = ewah_malloc(sizeof(struct ewah_bitmap)); + if (self == NULL) + return NULL; + + self->buffer = ewah_malloc(32 * sizeof(eword_t)); + self->alloc_size = 32; + + ewah_clear(self); + return self; +} + +void ewah_clear(struct ewah_bitmap *self) +{ + self->buffer_size = 1; + self->buffer[0] = 0; + self->bit_size = 0; + self->rlw = self->buffer; +} + +void ewah_free(struct ewah_bitmap *self) +{ + if (!self) + return; + + if (self->alloc_size) + free(self->buffer); + + free(self); +} + +static void read_new_rlw(struct ewah_iterator *it) +{ + const eword_t *word = NULL; + + it->literals = 0; + it->compressed = 0; + + while (1) { + word = &it->buffer[it->pointer]; + + it->rl = rlw_get_running_len(word); + it->lw = rlw_get_literal_words(word); + it->b = rlw_get_run_bit(word); + + if (it->rl || it->lw) + return; + + if (it->pointer < it->buffer_size - 1) { + it->pointer++; + } else { + it->pointer = it->buffer_size; + return; + } + } +} + +int ewah_iterator_next(eword_t *next, struct ewah_iterator *it) +{ + if (it->pointer >= it->buffer_size) + return 0; + + if (it->compressed < it->rl) { + it->compressed++; + *next = it->b ? (eword_t)(~0) : 0; + } else { + assert(it->literals < it->lw); + + it->literals++; + it->pointer++; + + assert(it->pointer < it->buffer_size); + + *next = it->buffer[it->pointer]; + } + + if (it->compressed == it->rl && it->literals == it->lw) { + if (++it->pointer < it->buffer_size) + read_new_rlw(it); + } + + return 1; +} + +void ewah_iterator_init(struct ewah_iterator *it, struct ewah_bitmap *parent) +{ + it->buffer = parent->buffer; + it->buffer_size = parent->buffer_size; + it->pointer = 0; + + it->lw = 0; + it->rl = 0; + it->compressed = 0; + it->literals = 0; + it->b = 0; + + if (it->pointer < it->buffer_size) + read_new_rlw(it); +} + +void ewah_not(struct ewah_bitmap *self) +{ + size_t pointer = 0; + + while (pointer < self->buffer_size) { + eword_t *word = &self->buffer[pointer]; + size_t literals, k; + + rlw_xor_run_bit(word); + ++pointer; + + literals = rlw_get_literal_words(word); + for (k = 0; k < literals; ++k) { + self->buffer[pointer] = ~self->buffer[pointer]; + ++pointer; + } + } +} + +void ewah_xor( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out) +{ + struct rlw_iterator rlw_i; + struct rlw_iterator rlw_j; + size_t literals; + + rlwit_init(&rlw_i, ewah_i); + rlwit_init(&rlw_j, ewah_j); + + while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) { + while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) { + struct rlw_iterator *prey, *predator; + size_t index; + int negate_words; + + if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) { + prey = &rlw_i; + predator = &rlw_j; + } else { + prey = &rlw_j; + predator = &rlw_i; + } + + negate_words = !!predator->rlw.running_bit; + index = rlwit_discharge(prey, out, + predator->rlw.running_len, negate_words); + + ewah_add_empty_words(out, negate_words, + predator->rlw.running_len - index); + + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } + + literals = min_size( + rlw_i.rlw.literal_words, + rlw_j.rlw.literal_words); + + if (literals) { + size_t k; + + for (k = 0; k < literals; ++k) { + ewah_add(out, + rlw_i.buffer[rlw_i.literal_word_start + k] ^ + rlw_j.buffer[rlw_j.literal_word_start + k] + ); + } + + rlwit_discard_first_words(&rlw_i, literals); + rlwit_discard_first_words(&rlw_j, literals); + } + } + + if (rlwit_word_size(&rlw_i) > 0) + rlwit_discharge(&rlw_i, out, ~0, 0); + else + rlwit_discharge(&rlw_j, out, ~0, 0); + + out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size); +} + +void ewah_and( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out) +{ + struct rlw_iterator rlw_i; + struct rlw_iterator rlw_j; + size_t literals; + + rlwit_init(&rlw_i, ewah_i); + rlwit_init(&rlw_j, ewah_j); + + while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) { + while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) { + struct rlw_iterator *prey, *predator; + + if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) { + prey = &rlw_i; + predator = &rlw_j; + } else { + prey = &rlw_j; + predator = &rlw_i; + } + + if (predator->rlw.running_bit == 0) { + ewah_add_empty_words(out, 0, + predator->rlw.running_len); + rlwit_discard_first_words(prey, + predator->rlw.running_len); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } else { + size_t index = rlwit_discharge(prey, out, + predator->rlw.running_len, 0); + ewah_add_empty_words(out, 0, + predator->rlw.running_len - index); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } + } + + literals = min_size( + rlw_i.rlw.literal_words, + rlw_j.rlw.literal_words); + + if (literals) { + size_t k; + + for (k = 0; k < literals; ++k) { + ewah_add(out, + rlw_i.buffer[rlw_i.literal_word_start + k] & + rlw_j.buffer[rlw_j.literal_word_start + k] + ); + } + + rlwit_discard_first_words(&rlw_i, literals); + rlwit_discard_first_words(&rlw_j, literals); + } + } + + if (rlwit_word_size(&rlw_i) > 0) + rlwit_discharge_empty(&rlw_i, out); + else + rlwit_discharge_empty(&rlw_j, out); + + out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size); +} + +void ewah_and_not( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out) +{ + struct rlw_iterator rlw_i; + struct rlw_iterator rlw_j; + size_t literals; + + rlwit_init(&rlw_i, ewah_i); + rlwit_init(&rlw_j, ewah_j); + + while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) { + while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) { + struct rlw_iterator *prey, *predator; + + if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) { + prey = &rlw_i; + predator = &rlw_j; + } else { + prey = &rlw_j; + predator = &rlw_i; + } + + if ((predator->rlw.running_bit && prey == &rlw_i) || + (!predator->rlw.running_bit && prey != &rlw_i)) { + ewah_add_empty_words(out, 0, + predator->rlw.running_len); + rlwit_discard_first_words(prey, + predator->rlw.running_len); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } else { + size_t index; + int negate_words; + + negate_words = (&rlw_i != prey); + index = rlwit_discharge(prey, out, + predator->rlw.running_len, negate_words); + ewah_add_empty_words(out, negate_words, + predator->rlw.running_len - index); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } + } + + literals = min_size( + rlw_i.rlw.literal_words, + rlw_j.rlw.literal_words); + + if (literals) { + size_t k; + + for (k = 0; k < literals; ++k) { + ewah_add(out, + rlw_i.buffer[rlw_i.literal_word_start + k] & + ~(rlw_j.buffer[rlw_j.literal_word_start + k]) + ); + } + + rlwit_discard_first_words(&rlw_i, literals); + rlwit_discard_first_words(&rlw_j, literals); + } + } + + if (rlwit_word_size(&rlw_i) > 0) + rlwit_discharge(&rlw_i, out, ~0, 0); + else + rlwit_discharge_empty(&rlw_j, out); + + out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size); +} + +void ewah_or( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out) +{ + struct rlw_iterator rlw_i; + struct rlw_iterator rlw_j; + size_t literals; + + rlwit_init(&rlw_i, ewah_i); + rlwit_init(&rlw_j, ewah_j); + + while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) { + while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) { + struct rlw_iterator *prey, *predator; + + if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) { + prey = &rlw_i; + predator = &rlw_j; + } else { + prey = &rlw_j; + predator = &rlw_i; + } + + if (predator->rlw.running_bit) { + ewah_add_empty_words(out, 0, + predator->rlw.running_len); + rlwit_discard_first_words(prey, + predator->rlw.running_len); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } else { + size_t index = rlwit_discharge(prey, out, + predator->rlw.running_len, 0); + ewah_add_empty_words(out, 0, + predator->rlw.running_len - index); + rlwit_discard_first_words(predator, + predator->rlw.running_len); + } + } + + literals = min_size( + rlw_i.rlw.literal_words, + rlw_j.rlw.literal_words); + + if (literals) { + size_t k; + + for (k = 0; k < literals; ++k) { + ewah_add(out, + rlw_i.buffer[rlw_i.literal_word_start + k] | + rlw_j.buffer[rlw_j.literal_word_start + k] + ); + } + + rlwit_discard_first_words(&rlw_i, literals); + rlwit_discard_first_words(&rlw_j, literals); + } + } + + if (rlwit_word_size(&rlw_i) > 0) + rlwit_discharge(&rlw_i, out, ~0, 0); + else + rlwit_discharge(&rlw_j, out, ~0, 0); + + out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size); +} + + +#define BITMAP_POOL_MAX 16 +static struct ewah_bitmap *bitmap_pool[BITMAP_POOL_MAX]; +static size_t bitmap_pool_size; + +struct ewah_bitmap *ewah_pool_new(void) +{ + if (bitmap_pool_size) + return bitmap_pool[--bitmap_pool_size]; + + return ewah_new(); +} + +void ewah_pool_free(struct ewah_bitmap *self) +{ + if (self == NULL) + return; + + if (bitmap_pool_size == BITMAP_POOL_MAX || + self->alloc_size == 0) { + ewah_free(self); + return; + } + + ewah_clear(self); + bitmap_pool[bitmap_pool_size++] = self; +} + +uint32_t ewah_checksum(struct ewah_bitmap *self) +{ + const uint8_t *p = (uint8_t *)self->buffer; + uint32_t crc = (uint32_t)self->bit_size; + size_t size = self->buffer_size * sizeof(eword_t); + + while (size--) + crc = (crc << 5) - crc + (uint32_t)*p++; + + return crc; +} diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c new file mode 100644 index 0000000000..f7f700ef51 --- /dev/null +++ b/ewah/ewah_io.c @@ -0,0 +1,204 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "git-compat-util.h" +#include "ewok.h" + +int ewah_serialize_native(struct ewah_bitmap *self, int fd) +{ + uint32_t write32; + size_t to_write = self->buffer_size * 8; + + /* 32 bit -- bit size for the map */ + write32 = (uint32_t)self->bit_size; + if (write(fd, &write32, 4) != 4) + return -1; + + /** 32 bit -- number of compressed 64-bit words */ + write32 = (uint32_t)self->buffer_size; + if (write(fd, &write32, 4) != 4) + return -1; + + if (write(fd, self->buffer, to_write) != to_write) + return -1; + + /** 32 bit -- position for the RLW */ + write32 = self->rlw - self->buffer; + if (write(fd, &write32, 4) != 4) + return -1; + + return (3 * 4) + to_write; +} + +int ewah_serialize_to(struct ewah_bitmap *self, + int (*write_fun)(void *, const void *, size_t), + void *data) +{ + size_t i; + eword_t dump[2048]; + const size_t words_per_dump = sizeof(dump) / sizeof(eword_t); + uint32_t bitsize, word_count, rlw_pos; + + const eword_t *buffer; + size_t words_left; + + /* 32 bit -- bit size for the map */ + bitsize = htonl((uint32_t)self->bit_size); + if (write_fun(data, &bitsize, 4) != 4) + return -1; + + /** 32 bit -- number of compressed 64-bit words */ + word_count = htonl((uint32_t)self->buffer_size); + if (write_fun(data, &word_count, 4) != 4) + return -1; + + /** 64 bit x N -- compressed words */ + buffer = self->buffer; + words_left = self->buffer_size; + + while (words_left >= words_per_dump) { + for (i = 0; i < words_per_dump; ++i, ++buffer) + dump[i] = htonll(*buffer); + + if (write_fun(data, dump, sizeof(dump)) != sizeof(dump)) + return -1; + + words_left -= words_per_dump; + } + + if (words_left) { + for (i = 0; i < words_left; ++i, ++buffer) + dump[i] = htonll(*buffer); + + if (write_fun(data, dump, words_left * 8) != words_left * 8) + return -1; + } + + /** 32 bit -- position for the RLW */ + rlw_pos = (uint8_t*)self->rlw - (uint8_t *)self->buffer; + rlw_pos = htonl(rlw_pos / sizeof(eword_t)); + + if (write_fun(data, &rlw_pos, 4) != 4) + return -1; + + return (3 * 4) + (self->buffer_size * 8); +} + +static int write_helper(void *fd, const void *buf, size_t len) +{ + return write((intptr_t)fd, buf, len); +} + +int ewah_serialize(struct ewah_bitmap *self, int fd) +{ + return ewah_serialize_to(self, write_helper, (void *)(intptr_t)fd); +} + +int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len) +{ + uint8_t *ptr = map; + size_t i; + + self->bit_size = get_be32(ptr); + ptr += sizeof(uint32_t); + + self->buffer_size = self->alloc_size = get_be32(ptr); + ptr += sizeof(uint32_t); + + self->buffer = ewah_realloc(self->buffer, + self->alloc_size * sizeof(eword_t)); + + if (!self->buffer) + return -1; + + /* + * Copy the raw data for the bitmap as a whole chunk; + * if we're in a little-endian platform, we'll perform + * the endianness conversion in a separate pass to ensure + * we're loading 8-byte aligned words. + */ + memcpy(self->buffer, ptr, self->buffer_size * sizeof(uint64_t)); + ptr += self->buffer_size * sizeof(uint64_t); + + for (i = 0; i < self->buffer_size; ++i) + self->buffer[i] = ntohll(self->buffer[i]); + + self->rlw = self->buffer + get_be32(ptr); + + return (3 * 4) + (self->buffer_size * 8); +} + +int ewah_deserialize(struct ewah_bitmap *self, int fd) +{ + size_t i; + eword_t dump[2048]; + const size_t words_per_dump = sizeof(dump) / sizeof(eword_t); + uint32_t bitsize, word_count, rlw_pos; + + eword_t *buffer = NULL; + size_t words_left; + + ewah_clear(self); + + /* 32 bit -- bit size for the map */ + if (read(fd, &bitsize, 4) != 4) + return -1; + + self->bit_size = (size_t)ntohl(bitsize); + + /** 32 bit -- number of compressed 64-bit words */ + if (read(fd, &word_count, 4) != 4) + return -1; + + self->buffer_size = self->alloc_size = (size_t)ntohl(word_count); + self->buffer = ewah_realloc(self->buffer, + self->alloc_size * sizeof(eword_t)); + + if (!self->buffer) + return -1; + + /** 64 bit x N -- compressed words */ + buffer = self->buffer; + words_left = self->buffer_size; + + while (words_left >= words_per_dump) { + if (read(fd, dump, sizeof(dump)) != sizeof(dump)) + return -1; + + for (i = 0; i < words_per_dump; ++i, ++buffer) + *buffer = ntohll(dump[i]); + + words_left -= words_per_dump; + } + + if (words_left) { + if (read(fd, dump, words_left * 8) != words_left * 8) + return -1; + + for (i = 0; i < words_left; ++i, ++buffer) + *buffer = ntohll(dump[i]); + } + + /** 32 bit -- position for the RLW */ + if (read(fd, &rlw_pos, 4) != 4) + return -1; + + self->rlw = self->buffer + ntohl(rlw_pos); + return 0; +} diff --git a/ewah/ewah_rlw.c b/ewah/ewah_rlw.c new file mode 100644 index 0000000000..c723f1aefd --- /dev/null +++ b/ewah/ewah_rlw.c @@ -0,0 +1,115 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "git-compat-util.h" +#include "ewok.h" +#include "ewok_rlw.h" + +static inline int next_word(struct rlw_iterator *it) +{ + if (it->pointer >= it->size) + return 0; + + it->rlw.word = &it->buffer[it->pointer]; + it->pointer += rlw_get_literal_words(it->rlw.word) + 1; + + it->rlw.literal_words = rlw_get_literal_words(it->rlw.word); + it->rlw.running_len = rlw_get_running_len(it->rlw.word); + it->rlw.running_bit = rlw_get_run_bit(it->rlw.word); + it->rlw.literal_word_offset = 0; + + return 1; +} + +void rlwit_init(struct rlw_iterator *it, struct ewah_bitmap *from_ewah) +{ + it->buffer = from_ewah->buffer; + it->size = from_ewah->buffer_size; + it->pointer = 0; + + next_word(it); + + it->literal_word_start = rlwit_literal_words(it) + + it->rlw.literal_word_offset; +} + +void rlwit_discard_first_words(struct rlw_iterator *it, size_t x) +{ + while (x > 0) { + size_t discard; + + if (it->rlw.running_len > x) { + it->rlw.running_len -= x; + return; + } + + x -= it->rlw.running_len; + it->rlw.running_len = 0; + + discard = (x > it->rlw.literal_words) ? it->rlw.literal_words : x; + + it->literal_word_start += discard; + it->rlw.literal_words -= discard; + x -= discard; + + if (x > 0 || rlwit_word_size(it) == 0) { + if (!next_word(it)) + break; + + it->literal_word_start = + rlwit_literal_words(it) + it->rlw.literal_word_offset; + } + } +} + +size_t rlwit_discharge( + struct rlw_iterator *it, struct ewah_bitmap *out, size_t max, int negate) +{ + size_t index = 0; + + while (index < max && rlwit_word_size(it) > 0) { + size_t pd, pl = it->rlw.running_len; + + if (index + pl > max) + pl = max - index; + + ewah_add_empty_words(out, it->rlw.running_bit ^ negate, pl); + index += pl; + + pd = it->rlw.literal_words; + if (pd + index > max) + pd = max - index; + + ewah_add_dirty_words(out, + it->buffer + it->literal_word_start, pd, negate); + + rlwit_discard_first_words(it, pd + pl); + index += pd; + } + + return index; +} + +void rlwit_discharge_empty(struct rlw_iterator *it, struct ewah_bitmap *out) +{ + while (rlwit_word_size(it) > 0) { + ewah_add_empty_words(out, 0, rlwit_word_size(it)); + rlwit_discard_first_words(it, rlwit_word_size(it)); + } +} diff --git a/ewah/ewok.h b/ewah/ewok.h new file mode 100644 index 0000000000..43adeb5c68 --- /dev/null +++ b/ewah/ewok.h @@ -0,0 +1,233 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __EWOK_BITMAP_H__ +#define __EWOK_BITMAP_H__ + +#ifndef ewah_malloc +# define ewah_malloc xmalloc +#endif +#ifndef ewah_realloc +# define ewah_realloc xrealloc +#endif +#ifndef ewah_calloc +# define ewah_calloc xcalloc +#endif + +typedef uint64_t eword_t; +#define BITS_IN_WORD (sizeof(eword_t) * 8) + +/** + * Do not use __builtin_popcountll. The GCC implementation + * is notoriously slow on all platforms. + * + * See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36041 + */ +static inline uint32_t ewah_bit_popcount64(uint64_t x) +{ + x = (x & 0x5555555555555555ULL) + ((x >> 1) & 0x5555555555555555ULL); + x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL); + x = (x & 0x0F0F0F0F0F0F0F0FULL) + ((x >> 4) & 0x0F0F0F0F0F0F0F0FULL); + return (x * 0x0101010101010101ULL) >> 56; +} + +#ifdef __GNUC__ +#define ewah_bit_ctz64(x) __builtin_ctzll(x) +#else +static inline int ewah_bit_ctz64(uint64_t x) +{ + int n = 0; + if ((x & 0xffffffff) == 0) { x >>= 32; n += 32; } + if ((x & 0xffff) == 0) { x >>= 16; n += 16; } + if ((x & 0xff) == 0) { x >>= 8; n += 8; } + if ((x & 0xf) == 0) { x >>= 4; n += 4; } + if ((x & 0x3) == 0) { x >>= 2; n += 2; } + if ((x & 0x1) == 0) { x >>= 1; n += 1; } + return n + !x; +} +#endif + +struct ewah_bitmap { + eword_t *buffer; + size_t buffer_size; + size_t alloc_size; + size_t bit_size; + eword_t *rlw; +}; + +typedef void (*ewah_callback)(size_t pos, void *); + +struct ewah_bitmap *ewah_pool_new(void); +void ewah_pool_free(struct ewah_bitmap *self); + +/** + * Allocate a new EWAH Compressed bitmap + */ +struct ewah_bitmap *ewah_new(void); + +/** + * Clear all the bits in the bitmap. Does not free or resize + * memory. + */ +void ewah_clear(struct ewah_bitmap *self); + +/** + * Free all the memory of the bitmap + */ +void ewah_free(struct ewah_bitmap *self); + +int ewah_serialize_to(struct ewah_bitmap *self, + int (*write_fun)(void *out, const void *buf, size_t len), + void *out); +int ewah_serialize(struct ewah_bitmap *self, int fd); +int ewah_serialize_native(struct ewah_bitmap *self, int fd); + +int ewah_deserialize(struct ewah_bitmap *self, int fd); +int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len); +int ewah_read_mmap_native(struct ewah_bitmap *self, void *map, size_t len); + +uint32_t ewah_checksum(struct ewah_bitmap *self); + +/** + * Logical not (bitwise negation) in-place on the bitmap + * + * This operation is linear time based on the size of the bitmap. + */ +void ewah_not(struct ewah_bitmap *self); + +/** + * Call the given callback with the position of every single bit + * that has been set on the bitmap. + * + * This is an efficient operation that does not fully decompress + * the bitmap. + */ +void ewah_each_bit(struct ewah_bitmap *self, ewah_callback callback, void *payload); + +/** + * Set a given bit on the bitmap. + * + * The bit at position `pos` will be set to true. Because of the + * way that the bitmap is compressed, a set bit cannot be unset + * later on. + * + * Furthermore, since the bitmap uses streaming compression, bits + * can only set incrementally. + * + * E.g. + * ewah_set(bitmap, 1); // ok + * ewah_set(bitmap, 76); // ok + * ewah_set(bitmap, 77); // ok + * ewah_set(bitmap, 8712800127); // ok + * ewah_set(bitmap, 25); // failed, assert raised + */ +void ewah_set(struct ewah_bitmap *self, size_t i); + +struct ewah_iterator { + const eword_t *buffer; + size_t buffer_size; + + size_t pointer; + eword_t compressed, literals; + eword_t rl, lw; + int b; +}; + +/** + * Initialize a new iterator to run through the bitmap in uncompressed form. + * + * The iterator can be stack allocated. The underlying bitmap must not be freed + * before the iteration is over. + * + * E.g. + * + * struct ewah_bitmap *bitmap = ewah_new(); + * struct ewah_iterator it; + * + * ewah_iterator_init(&it, bitmap); + */ +void ewah_iterator_init(struct ewah_iterator *it, struct ewah_bitmap *parent); + +/** + * Yield every single word in the bitmap in uncompressed form. This is: + * yield single words (32-64 bits) where each bit represents an actual + * bit from the bitmap. + * + * Return: true if a word was yield, false if there are no words left + */ +int ewah_iterator_next(eword_t *next, struct ewah_iterator *it); + +void ewah_or( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out); + +void ewah_and_not( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out); + +void ewah_xor( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out); + +void ewah_and( + struct ewah_bitmap *ewah_i, + struct ewah_bitmap *ewah_j, + struct ewah_bitmap *out); + +/** + * Direct word access + */ +size_t ewah_add_empty_words(struct ewah_bitmap *self, int v, size_t number); +void ewah_add_dirty_words( + struct ewah_bitmap *self, const eword_t *buffer, size_t number, int negate); +size_t ewah_add(struct ewah_bitmap *self, eword_t word); + + +/** + * Uncompressed, old-school bitmap that can be efficiently compressed + * into an `ewah_bitmap`. + */ +struct bitmap { + eword_t *words; + size_t word_alloc; +}; + +struct bitmap *bitmap_new(void); +void bitmap_set(struct bitmap *self, size_t pos); +void bitmap_clear(struct bitmap *self, size_t pos); +int bitmap_get(struct bitmap *self, size_t pos); +void bitmap_reset(struct bitmap *self); +void bitmap_free(struct bitmap *self); +int bitmap_equals(struct bitmap *self, struct bitmap *other); +int bitmap_is_subset(struct bitmap *self, struct bitmap *super); + +struct ewah_bitmap * bitmap_to_ewah(struct bitmap *bitmap); +struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah); + +void bitmap_and_not(struct bitmap *self, struct bitmap *other); +void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other); +void bitmap_or(struct bitmap *self, const struct bitmap *other); + +void bitmap_each_bit(struct bitmap *self, ewah_callback callback, void *data); +size_t bitmap_popcount(struct bitmap *self); + +#endif diff --git a/ewah/ewok_rlw.h b/ewah/ewok_rlw.h new file mode 100644 index 0000000000..63efdf9698 --- /dev/null +++ b/ewah/ewok_rlw.h @@ -0,0 +1,114 @@ +/** + * Copyright 2013, GitHub, Inc + * Copyright 2009-2013, Daniel Lemire, Cliff Moon, + * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __EWOK_RLW_H__ +#define __EWOK_RLW_H__ + +#define RLW_RUNNING_BITS (sizeof(eword_t) * 4) +#define RLW_LITERAL_BITS (sizeof(eword_t) * 8 - 1 - RLW_RUNNING_BITS) + +#define RLW_LARGEST_RUNNING_COUNT (((eword_t)1 << RLW_RUNNING_BITS) - 1) +#define RLW_LARGEST_LITERAL_COUNT (((eword_t)1 << RLW_LITERAL_BITS) - 1) + +#define RLW_LARGEST_RUNNING_COUNT_SHIFT (RLW_LARGEST_RUNNING_COUNT << 1) + +#define RLW_RUNNING_LEN_PLUS_BIT (((eword_t)1 << (RLW_RUNNING_BITS + 1)) - 1) + +static int rlw_get_run_bit(const eword_t *word) +{ + return *word & (eword_t)1; +} + +static inline void rlw_set_run_bit(eword_t *word, int b) +{ + if (b) { + *word |= (eword_t)1; + } else { + *word &= (eword_t)(~1); + } +} + +static inline void rlw_xor_run_bit(eword_t *word) +{ + if (*word & 1) { + *word &= (eword_t)(~1); + } else { + *word |= (eword_t)1; + } +} + +static inline void rlw_set_running_len(eword_t *word, eword_t l) +{ + *word |= RLW_LARGEST_RUNNING_COUNT_SHIFT; + *word &= (l << 1) | (~RLW_LARGEST_RUNNING_COUNT_SHIFT); +} + +static inline eword_t rlw_get_running_len(const eword_t *word) +{ + return (*word >> 1) & RLW_LARGEST_RUNNING_COUNT; +} + +static inline eword_t rlw_get_literal_words(const eword_t *word) +{ + return *word >> (1 + RLW_RUNNING_BITS); +} + +static inline void rlw_set_literal_words(eword_t *word, eword_t l) +{ + *word |= ~RLW_RUNNING_LEN_PLUS_BIT; + *word &= (l << (RLW_RUNNING_BITS + 1)) | RLW_RUNNING_LEN_PLUS_BIT; +} + +static inline eword_t rlw_size(const eword_t *self) +{ + return rlw_get_running_len(self) + rlw_get_literal_words(self); +} + +struct rlw_iterator { + const eword_t *buffer; + size_t size; + size_t pointer; + size_t literal_word_start; + + struct { + const eword_t *word; + int literal_words; + int running_len; + int literal_word_offset; + int running_bit; + } rlw; +}; + +void rlwit_init(struct rlw_iterator *it, struct ewah_bitmap *bitmap); +void rlwit_discard_first_words(struct rlw_iterator *it, size_t x); +size_t rlwit_discharge( + struct rlw_iterator *it, struct ewah_bitmap *out, size_t max, int negate); +void rlwit_discharge_empty(struct rlw_iterator *it, struct ewah_bitmap *out); + +static inline size_t rlwit_word_size(struct rlw_iterator *it) +{ + return it->rlw.running_len + it->rlw.literal_words; +} + +static inline size_t rlwit_literal_words(struct rlw_iterator *it) +{ + return it->pointer - it->rlw.literal_words; +} + +#endif diff --git a/fast-import.c b/fast-import.c index f4d9969e5c..4fd18a3574 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1877,8 +1877,8 @@ static int read_next_command(void) return EOF; if (!seen_data_command - && prefixcmp(command_buf.buf, "feature ") - && prefixcmp(command_buf.buf, "option ")) { + && !starts_with(command_buf.buf, "feature ") + && !starts_with(command_buf.buf, "option ")) { parse_argv(); } @@ -1898,7 +1898,7 @@ static int read_next_command(void) rc->prev->next = rc; cmd_tail = rc; } - if (!prefixcmp(command_buf.buf, "cat-blob ")) { + if (starts_with(command_buf.buf, "cat-blob ")) { parse_cat_blob(); continue; } @@ -1917,7 +1917,7 @@ static void skip_optional_lf(void) static void parse_mark(void) { - if (!prefixcmp(command_buf.buf, "mark :")) { + if (starts_with(command_buf.buf, "mark :")) { next_mark = strtoumax(command_buf.buf + 6, NULL, 10); read_next_command(); } @@ -1929,10 +1929,10 @@ static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res) { strbuf_reset(sb); - if (prefixcmp(command_buf.buf, "data ")) + if (!starts_with(command_buf.buf, "data ")) die("Expected 'data n' command, found: %s", command_buf.buf); - if (!prefixcmp(command_buf.buf + 5, "<<")) { + if (starts_with(command_buf.buf + 5, "<<")) { char *term = xstrdup(command_buf.buf + 5 + 2); size_t term_len = command_buf.len - 5 - 2; @@ -2306,7 +2306,7 @@ static void file_change_m(struct branch *b) if (*p == ':') { oe = find_mark(parse_mark_ref_space(&p)); hashcpy(sha1, oe->idx.sha1); - } else if (!prefixcmp(p, "inline ")) { + } else if (starts_with(p, "inline ")) { inline_data = 1; oe = NULL; /* not used with inline_data, but makes gcc happy */ p += strlen("inline"); /* advance to space */ @@ -2479,7 +2479,7 @@ static void note_change_n(struct branch *b, unsigned char *old_fanout) if (*p == ':') { oe = find_mark(parse_mark_ref_space(&p)); hashcpy(sha1, oe->idx.sha1); - } else if (!prefixcmp(p, "inline ")) { + } else if (starts_with(p, "inline ")) { inline_data = 1; oe = NULL; /* not used with inline_data, but makes gcc happy */ p += strlen("inline"); /* advance to space */ @@ -2590,7 +2590,7 @@ static int parse_from(struct branch *b) const char *from; struct branch *s; - if (prefixcmp(command_buf.buf, "from ")) + if (!starts_with(command_buf.buf, "from ")) return 0; if (b->branch_tree.tree) { @@ -2636,7 +2636,7 @@ static struct hash_list *parse_merge(unsigned int *count) struct branch *s; *count = 0; - while (!prefixcmp(command_buf.buf, "merge ")) { + while (starts_with(command_buf.buf, "merge ")) { from = strchr(command_buf.buf, ' ') + 1; n = xmalloc(sizeof(*n)); s = lookup_branch(from); @@ -2687,11 +2687,11 @@ static void parse_new_commit(void) read_next_command(); parse_mark(); - if (!prefixcmp(command_buf.buf, "author ")) { + if (starts_with(command_buf.buf, "author ")) { author = parse_ident(command_buf.buf + 7); read_next_command(); } - if (!prefixcmp(command_buf.buf, "committer ")) { + if (starts_with(command_buf.buf, "committer ")) { committer = parse_ident(command_buf.buf + 10); read_next_command(); } @@ -2712,19 +2712,19 @@ static void parse_new_commit(void) /* file_change* */ while (command_buf.len > 0) { - if (!prefixcmp(command_buf.buf, "M ")) + if (starts_with(command_buf.buf, "M ")) file_change_m(b); - else if (!prefixcmp(command_buf.buf, "D ")) + else if (starts_with(command_buf.buf, "D ")) file_change_d(b); - else if (!prefixcmp(command_buf.buf, "R ")) + else if (starts_with(command_buf.buf, "R ")) file_change_cr(b, 1); - else if (!prefixcmp(command_buf.buf, "C ")) + else if (starts_with(command_buf.buf, "C ")) file_change_cr(b, 0); - else if (!prefixcmp(command_buf.buf, "N ")) + else if (starts_with(command_buf.buf, "N ")) note_change_n(b, &prev_fanout); else if (!strcmp("deleteall", command_buf.buf)) file_change_deleteall(b); - else if (!prefixcmp(command_buf.buf, "ls ")) + else if (starts_with(command_buf.buf, "ls ")) parse_ls(b); else { unread_command_buf = 1; @@ -2793,7 +2793,7 @@ static void parse_new_tag(void) read_next_command(); /* from ... */ - if (prefixcmp(command_buf.buf, "from ")) + if (!starts_with(command_buf.buf, "from ")) die("Expected from command, got %s", command_buf.buf); from = strchr(command_buf.buf, ' ') + 1; s = lookup_branch(from); @@ -2821,7 +2821,7 @@ static void parse_new_tag(void) read_next_command(); /* tagger ... */ - if (!prefixcmp(command_buf.buf, "tagger ")) { + if (starts_with(command_buf.buf, "tagger ")) { tagger = parse_ident(command_buf.buf + 7); read_next_command(); } else @@ -3209,7 +3209,7 @@ static void option_export_pack_edges(const char *edges) static int parse_one_option(const char *option) { - if (!prefixcmp(option, "max-pack-size=")) { + if (starts_with(option, "max-pack-size=")) { unsigned long v; if (!git_parse_ulong(option + 14, &v)) return 0; @@ -3221,20 +3221,20 @@ static int parse_one_option(const char *option) v = 1024 * 1024; } max_packsize = v; - } else if (!prefixcmp(option, "big-file-threshold=")) { + } else if (starts_with(option, "big-file-threshold=")) { unsigned long v; if (!git_parse_ulong(option + 19, &v)) return 0; big_file_threshold = v; - } else if (!prefixcmp(option, "depth=")) { + } else if (starts_with(option, "depth=")) { option_depth(option + 6); - } else if (!prefixcmp(option, "active-branches=")) { + } else if (starts_with(option, "active-branches=")) { option_active_branches(option + 16); - } else if (!prefixcmp(option, "export-pack-edges=")) { + } else if (starts_with(option, "export-pack-edges=")) { option_export_pack_edges(option + 18); - } else if (!prefixcmp(option, "quiet")) { + } else if (starts_with(option, "quiet")) { show_stats = 0; - } else if (!prefixcmp(option, "stats")) { + } else if (starts_with(option, "stats")) { show_stats = 1; } else { return 0; @@ -3245,14 +3245,14 @@ static int parse_one_option(const char *option) static int parse_one_feature(const char *feature, int from_stream) { - if (!prefixcmp(feature, "date-format=")) { + if (starts_with(feature, "date-format=")) { option_date_format(feature + 12); - } else if (!prefixcmp(feature, "import-marks=")) { + } else if (starts_with(feature, "import-marks=")) { option_import_marks(feature + 13, from_stream, 0); - } else if (!prefixcmp(feature, "import-marks-if-exists=")) { + } else if (starts_with(feature, "import-marks-if-exists=")) { option_import_marks(feature + strlen("import-marks-if-exists="), from_stream, 1); - } else if (!prefixcmp(feature, "export-marks=")) { + } else if (starts_with(feature, "export-marks=")) { option_export_marks(feature + 13); } else if (!strcmp(feature, "cat-blob")) { ; /* Don't die - this feature is supported */ @@ -3350,7 +3350,7 @@ static void parse_argv(void) if (parse_one_feature(a + 2, 0)) continue; - if (!prefixcmp(a + 2, "cat-blob-fd=")) { + if (starts_with(a + 2, "cat-blob-fd=")) { option_cat_blob_fd(a + 2 + strlen("cat-blob-fd=")); continue; } @@ -3404,25 +3404,25 @@ int main(int argc, char **argv) while (read_next_command() != EOF) { if (!strcmp("blob", command_buf.buf)) parse_new_blob(); - else if (!prefixcmp(command_buf.buf, "ls ")) + else if (starts_with(command_buf.buf, "ls ")) parse_ls(NULL); - else if (!prefixcmp(command_buf.buf, "commit ")) + else if (starts_with(command_buf.buf, "commit ")) parse_new_commit(); - else if (!prefixcmp(command_buf.buf, "tag ")) + else if (starts_with(command_buf.buf, "tag ")) parse_new_tag(); - else if (!prefixcmp(command_buf.buf, "reset ")) + else if (starts_with(command_buf.buf, "reset ")) parse_reset_branch(); else if (!strcmp("checkpoint", command_buf.buf)) parse_checkpoint(); else if (!strcmp("done", command_buf.buf)) break; - else if (!prefixcmp(command_buf.buf, "progress ")) + else if (starts_with(command_buf.buf, "progress ")) parse_progress(); - else if (!prefixcmp(command_buf.buf, "feature ")) + else if (starts_with(command_buf.buf, "feature ")) parse_feature(); - else if (!prefixcmp(command_buf.buf, "option git ")) + else if (starts_with(command_buf.buf, "option git ")) parse_option(); - else if (!prefixcmp(command_buf.buf, "option ")) + else if (starts_with(command_buf.buf, "option ")) /* ignore non-git options*/; else die("Unsupported command: %s", command_buf.buf); diff --git a/fetch-pack.c b/fetch-pack.c index a0e0350ae6..f061f1fe85 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -13,6 +13,7 @@ #include "transport.h" #include "version.h" #include "prio-queue.h" +#include "sha1-array.h" static int transfer_unpack_limit = -1; static int fetch_unpack_limit = -1; @@ -47,9 +48,8 @@ static void rev_list_push(struct commit *commit, int mark) if (!(commit->object.flags & mark)) { commit->object.flags |= mark; - if (!(commit->object.parsed)) - if (parse_commit(commit)) - return; + if (parse_commit(commit)) + return; prio_queue_put(&rev_list, commit); @@ -128,8 +128,7 @@ static const unsigned char *get_rev(void) return NULL; commit = prio_queue_get(&rev_list); - if (!commit->object.parsed) - parse_commit(commit); + parse_commit(commit); parents = commit->parents; commit->object.flags |= POPPED; @@ -176,9 +175,9 @@ static void consume_shallow_list(struct fetch_pack_args *args, int fd) */ char *line; while ((line = packet_read_line(fd, NULL))) { - if (!prefixcmp(line, "shallow ")) + if (starts_with(line, "shallow ")) continue; - if (!prefixcmp(line, "unshallow ")) + if (starts_with(line, "unshallow ")) continue; die("git fetch-pack: expected shallow list"); } @@ -194,7 +193,7 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1) die("git fetch-pack: expected ACK/NAK, got EOF"); if (!strcmp(line, "NAK")) return NAK; - if (!prefixcmp(line, "ACK ")) { + if (starts_with(line, "ACK ")) { if (!get_sha1_hex(line+4, result_sha1)) { if (len < 45) return ACK; @@ -311,7 +310,7 @@ static int find_common(struct fetch_pack_args *args, } if (is_repository_shallow()) - write_shallow_commits(&req_buf, 1); + write_shallow_commits(&req_buf, 1, NULL); if (args->depth > 0) packet_buf_write(&req_buf, "deepen %d", args->depth); packet_buf_flush(&req_buf); @@ -323,13 +322,13 @@ static int find_common(struct fetch_pack_args *args, send_request(args, fd[1], &req_buf); while ((line = packet_read_line(fd[0], NULL))) { - if (!prefixcmp(line, "shallow ")) { + if (starts_with(line, "shallow ")) { if (get_sha1_hex(line + 8, sha1)) die("invalid shallow line: %s", line); register_shallow(sha1); continue; } - if (!prefixcmp(line, "unshallow ")) { + if (starts_with(line, "unshallow ")) { if (get_sha1_hex(line + 10, sha1)) die("invalid unshallow line: %s", line); if (!lookup_object(sha1)) @@ -440,7 +439,8 @@ done: } strbuf_release(&req_buf); - consume_shallow_list(args, fd[0]); + if (!got_ready || !no_done) + consume_shallow_list(args, fd[0]); while (flushes || multi_ack) { int ack = get_ack(fd[0], result_sha1); if (ack) { @@ -507,7 +507,7 @@ static void filter_refs(struct fetch_pack_args *args, next = ref->next; if (!memcmp(ref->name, "refs/", 5) && - check_refname_format(ref->name + 5, 0)) + check_refname_format(ref->name, 0)) ; /* trash */ else { while (i < nr_sought) { @@ -523,7 +523,7 @@ static void filter_refs(struct fetch_pack_args *args, } if (!keep && args->fetch_all && - (!args->depth || prefixcmp(ref->name, "refs/tags/"))) + (!args->depth || !starts_with(ref->name, "refs/tags/"))) keep = 1; if (keep) { @@ -747,6 +747,10 @@ static int get_pack(struct fetch_pack_args *args, close(cmd.out); } + if (!use_sideband) + /* Closed by start_command() */ + xd[0] = -1; + ret = finish_command(&cmd); if (!ret || (args->check_self_contained_and_connected && ret == 1)) args->self_contained_and_connected = @@ -770,6 +774,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, int fd[2], const struct ref *orig_ref, struct ref **sought, int nr_sought, + struct shallow_info *si, char **pack_lockfile) { struct ref *ref = copy_ref_list(orig_ref); @@ -846,7 +851,10 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, if (args->stateless_rpc) packet_flush(fd[1]); if (args->depth > 0) - setup_alternate_shallow(&shallow_lock, &alternate_shallow_file); + setup_alternate_shallow(&shallow_lock, &alternate_shallow_file, + NULL); + else if (si->nr_ours || si->nr_theirs) + alternate_shallow_file = setup_temporary_shallow(si->shallow); else alternate_shallow_file = NULL; if (get_pack(args, fd, pack_lockfile)) @@ -920,14 +928,121 @@ static int remove_duplicates_in_refs(struct ref **ref, int nr) return dst; } +static void update_shallow(struct fetch_pack_args *args, + struct ref **sought, int nr_sought, + struct shallow_info *si) +{ + struct sha1_array ref = SHA1_ARRAY_INIT; + int *status; + int i; + + if (args->depth > 0 && alternate_shallow_file) { + if (*alternate_shallow_file == '\0') { /* --unshallow */ + unlink_or_warn(git_path("shallow")); + rollback_lock_file(&shallow_lock); + } else + commit_lock_file(&shallow_lock); + return; + } + + if (!si->shallow || !si->shallow->nr) + return; + + if (alternate_shallow_file) { + /* + * The temporary shallow file is only useful for + * index-pack and unpack-objects because it may + * contain more roots than we want. Delete it. + */ + if (*alternate_shallow_file) + unlink(alternate_shallow_file); + free((char *)alternate_shallow_file); + } + + if (args->cloning) { + /* + * remote is shallow, but this is a clone, there are + * no objects in repo to worry about. Accept any + * shallow points that exist in the pack (iow in repo + * after get_pack() and reprepare_packed_git()) + */ + struct sha1_array extra = SHA1_ARRAY_INIT; + unsigned char (*sha1)[20] = si->shallow->sha1; + for (i = 0; i < si->shallow->nr; i++) + if (has_sha1_file(sha1[i])) + sha1_array_append(&extra, sha1[i]); + if (extra.nr) { + setup_alternate_shallow(&shallow_lock, + &alternate_shallow_file, + &extra); + commit_lock_file(&shallow_lock); + } + sha1_array_clear(&extra); + return; + } + + if (!si->nr_ours && !si->nr_theirs) + return; + + remove_nonexistent_theirs_shallow(si); + if (!si->nr_ours && !si->nr_theirs) + return; + for (i = 0; i < nr_sought; i++) + sha1_array_append(&ref, sought[i]->old_sha1); + si->ref = &ref; + + if (args->update_shallow) { + /* + * remote is also shallow, .git/shallow may be updated + * so all refs can be accepted. Make sure we only add + * shallow roots that are actually reachable from new + * refs. + */ + struct sha1_array extra = SHA1_ARRAY_INIT; + unsigned char (*sha1)[20] = si->shallow->sha1; + assign_shallow_commits_to_refs(si, NULL, NULL); + if (!si->nr_ours && !si->nr_theirs) { + sha1_array_clear(&ref); + return; + } + for (i = 0; i < si->nr_ours; i++) + sha1_array_append(&extra, sha1[si->ours[i]]); + for (i = 0; i < si->nr_theirs; i++) + sha1_array_append(&extra, sha1[si->theirs[i]]); + setup_alternate_shallow(&shallow_lock, + &alternate_shallow_file, + &extra); + commit_lock_file(&shallow_lock); + sha1_array_clear(&extra); + sha1_array_clear(&ref); + return; + } + + /* + * remote is also shallow, check what ref is safe to update + * without updating .git/shallow + */ + status = xcalloc(nr_sought, sizeof(*status)); + assign_shallow_commits_to_refs(si, NULL, status); + if (si->nr_ours || si->nr_theirs) { + for (i = 0; i < nr_sought; i++) + if (status[i]) + sought[i]->status = REF_STATUS_REJECT_SHALLOW; + } + free(status); + sha1_array_clear(&ref); +} + struct ref *fetch_pack(struct fetch_pack_args *args, int fd[], struct child_process *conn, const struct ref *ref, const char *dest, struct ref **sought, int nr_sought, + struct sha1_array *shallow, char **pack_lockfile) { struct ref *ref_cpy; + struct shallow_info si; fetch_pack_setup(); if (nr_sought) @@ -937,16 +1052,11 @@ struct ref *fetch_pack(struct fetch_pack_args *args, packet_flush(fd[1]); die("no matching remote head"); } - ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, pack_lockfile); - - if (args->depth > 0 && alternate_shallow_file) { - if (*alternate_shallow_file == '\0') { /* --unshallow */ - unlink_or_warn(git_path("shallow")); - rollback_lock_file(&shallow_lock); - } else - commit_lock_file(&shallow_lock); - } - + prepare_shallow_info(&si, shallow); + ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, + &si, pack_lockfile); reprepare_packed_git(); + update_shallow(args, sought, nr_sought, &si); + clear_shallow_info(&si); return ref_cpy; } diff --git a/fetch-pack.h b/fetch-pack.h index 461cbf39b2..bb7fd76e59 100644 --- a/fetch-pack.h +++ b/fetch-pack.h @@ -4,22 +4,27 @@ #include "string-list.h" #include "run-command.h" +struct sha1_array; + struct fetch_pack_args { const char *uploadpack; int unpacklimit; int depth; - unsigned quiet:1, - keep_pack:1, - lock_pack:1, - use_thin_pack:1, - fetch_all:1, - stdin_refs:1, - verbose:1, - no_progress:1, - include_tag:1, - stateless_rpc:1, - check_self_contained_and_connected:1, - self_contained_and_connected:1; + unsigned quiet:1; + unsigned keep_pack:1; + unsigned lock_pack:1; + unsigned use_thin_pack:1; + unsigned fetch_all:1; + unsigned stdin_refs:1; + unsigned diag_url:1; + unsigned verbose:1; + unsigned no_progress:1; + unsigned include_tag:1; + unsigned stateless_rpc:1; + unsigned check_self_contained_and_connected:1; + unsigned self_contained_and_connected:1; + unsigned cloning:1; + unsigned update_shallow:1; }; /* @@ -33,6 +38,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args, const char *dest, struct ref **sought, int nr_sought, + struct sha1_array *shallow, char **pack_lockfile); #endif @@ -245,6 +245,8 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func) static int fsck_ident(char **ident, struct object *obj, fsck_error error_func) { + char *end; + if (**ident == '<') return error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before email"); *ident += strcspn(*ident, "<>\n"); @@ -264,10 +266,11 @@ static int fsck_ident(char **ident, struct object *obj, fsck_error error_func) (*ident)++; if (**ident == '0' && (*ident)[1] != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - zero-padded date"); - *ident += strspn(*ident, "0123456789"); - if (**ident != ' ') + if (date_overflows(strtoul(*ident, &end, 10))) + return error_func(obj, FSCK_ERROR, "invalid author/committer line - date causes integer overflow"); + if (end == *ident || *end != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - bad date"); - (*ident)++; + *ident = end + 1; if ((**ident != '+' && **ident != '-') || !isdigit((*ident)[1]) || !isdigit((*ident)[2]) || @@ -287,9 +290,6 @@ static int fsck_commit(struct commit *commit, fsck_error error_func) int parents = 0; int err; - if (commit->date == ULONG_MAX) - return error_func(&commit->object, FSCK_ERROR, "invalid author/committer line"); - if (memcmp(buffer, "tree ", 5)) return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line"); if (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\n') @@ -29,6 +29,17 @@ int use_gettext_poison(void) #endif #ifndef NO_GETTEXT +static int test_vsnprintf(const char *fmt, ...) +{ + char buf[26]; + int ret; + va_list ap; + va_start(ap, fmt); + ret = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return ret; +} + static const char *charset; static void init_gettext_charset(const char *domain) { @@ -99,9 +110,7 @@ static void init_gettext_charset(const char *domain) $ LANGUAGE= LANG=de_DE.utf8 ./test test: Kein passendes Ger?t gefunden - In the long term we should probably see about getting that - vsnprintf bug in glibc fixed, and audit our code so it won't - fall apart under a non-C locale. + The vsnprintf bug has been fixed since glibc 2.17. Then we could simply set LC_CTYPE from the environment, which would make things like the external perror(3) messages work. @@ -115,7 +124,9 @@ static void init_gettext_charset(const char *domain) setlocale(LC_CTYPE, ""); charset = locale_charset(); bind_textdomain_codeset(domain, charset); - setlocale(LC_CTYPE, "C"); + /* the string is taken from v0.99.6~1 */ + if (test_vsnprintf("%.*s", 13, "David_K\345gedal") < 0) + setlocale(LC_CTYPE, "C"); } void git_setup_gettext(void) diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 51563840f4..d3bca12611 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -58,6 +58,9 @@ if ($repo->config_bool("interactive.singlekey")) { Term::ReadKey->import; $use_readkey = 1; }; + if (!$use_readkey) { + print STDERR "missing Term::ReadKey, disabling interactive.singlekey\n"; + } eval { require Term::Cap; my $termcap = Term::Cap->Tgetent; @@ -263,6 +266,17 @@ sub get_empty_tree { return '4b825dc642cb6eb9a060e54bf8d69288fbee4904'; } +sub get_diff_reference { + my $ref = shift; + if (defined $ref and $ref ne 'HEAD') { + return $ref; + } elsif (is_initial_commit()) { + return get_empty_tree(); + } else { + return 'HEAD'; + } +} + # Returns list of hashes, contents of each of which are: # VALUE: pathname # BINARY: is a binary path @@ -286,14 +300,7 @@ sub list_modified { return if (!@tracked); } - my $reference; - if (defined $patch_mode_revision and $patch_mode_revision ne 'HEAD') { - $reference = $patch_mode_revision; - } elsif (is_initial_commit()) { - $reference = get_empty_tree(); - } else { - $reference = 'HEAD'; - } + my $reference = get_diff_reference($patch_mode_revision); for (run_cmd_pipe(qw(git diff-index --cached --numstat --summary), $reference, '--', @tracked)) { @@ -737,7 +744,7 @@ sub parse_diff { splice @diff_cmd, 1, 0, "--diff-algorithm=${diff_algorithm}"; } if (defined $patch_mode_revision) { - push @diff_cmd, $patch_mode_revision; + push @diff_cmd, get_diff_reference($patch_mode_revision); } my @diff = run_cmd_pipe("git", @diff_cmd, "--", $path); my @colored = (); @@ -4,6 +4,7 @@ SUBDIRECTORY_OK=Yes OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG=t OPTIONS_SPEC="\ git am [options] [(<mbox>|<Maildir>)...] git am [options] (--continue | --skip | --abort) @@ -37,6 +38,7 @@ abort restore the original branch and abort the patching operation. committer-date-is-author-date lie about committer date ignore-date use current timestamp for author date rerere-autoupdate update the index with reused conflict resolution if possible +S,gpg-sign? GPG-sign commits rebasing* (internal use for git-rebase)" . git-sh-setup @@ -302,7 +304,7 @@ split_patches () { # not starting with Author, From or Date is the # subject, and the body starts with the next nonempty # line not starting with Author, From or Date - perl -ne 'BEGIN { $subject = 0 } + @@PERL@@ -ne 'BEGIN { $subject = 0 } if ($subject > 1) { print ; } elsif (/^\s+$/) { next ; } elsif (/^Author:/) { s/Author/From/ ; print ;} @@ -334,7 +336,7 @@ split_patches () { # Since we cannot guarantee that the commit message is in # git-friendly format, we put no Subject: line and just consume # all of the message as the body - LANG=C LC_ALL=C perl -M'POSIX qw(strftime)' -ne 'BEGIN { $subject = 0 } + LANG=C LC_ALL=C @@PERL@@ -M'POSIX qw(strftime)' -ne 'BEGIN { $subject = 0 } if ($subject) { print ; } elsif (/^\# User /) { s/\# User/From:/ ; print ; } elsif (/^\# Date /) { @@ -374,6 +376,7 @@ git_apply_opt= committer_date_is_author_date= ignore_date= allow_rerere_autoupdate= +gpg_sign_opt= if test "$(git config --bool --get am.keepcr)" = true then @@ -413,14 +416,14 @@ it will be removed. Please do not use it anymore." abort=t ;; --rebasing) rebasing=t threeway=t ;; - --resolvemsg) - shift; resolvemsg=$1 ;; - --whitespace|--directory|--exclude|--include) - git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;; - -C|-p) - git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;; - --patch-format) - shift ; patch_format="$1" ;; + --resolvemsg=*) + resolvemsg="${1#--resolvemsg=}" ;; + --whitespace=*|--directory=*|--exclude=*|--include=*) + git_apply_opt="$git_apply_opt $(sq "$1")" ;; + -C*|-p*) + git_apply_opt="$git_apply_opt $(sq "$1")" ;; + --patch-format=*) + patch_format="${1#--patch-format=}" ;; --reject|--ignore-whitespace|--ignore-space-change) git_apply_opt="$git_apply_opt $1" ;; --committer-date-is-author-date) @@ -435,6 +438,10 @@ it will be removed. Please do not use it anymore." keepcr=t ;; --no-keep-cr) keepcr=f ;; + --gpg-sign) + gpg_sign_opt=-S ;; + --gpg-sign=*) + gpg_sign_opt="-S${1#--gpg-sign=}" ;; --) shift; break ;; *) @@ -899,7 +906,8 @@ did you forget to use 'git add'?" GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" export GIT_COMMITTER_DATE fi && - git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit" + git commit-tree ${parent:+-p} $parent ${gpg_sign_opt:+"$gpg_sign_opt"} $tree \ + <"$dotest/final-commit" ) && git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent || stop_here $this diff --git a/git-bisect.sh b/git-bisect.sh index 9f064b6f4f..af4d04c3be 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -137,7 +137,7 @@ bisect_start() { # cogito usage, and cogito users should understand # it relates to cg-seek. [ -s "$GIT_DIR/head-name" ] && - die "$(gettext "won't bisect on seeked tree")" + die "$(gettext "won't bisect on cg-seek'ed tree")" start_head="${head#refs/heads/}" ;; *) @@ -365,7 +365,7 @@ bisect_reset() { } case "$#" in 0) branch=$(cat "$GIT_DIR/BISECT_START") ;; - 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || { + 1) git rev-parse --quiet --verify "$1^{commit}" >/dev/null || { invalid="$1" die "$(eval_gettext "'\$invalid' is not a valid commit")" } @@ -458,13 +458,13 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2 fi # We have to use a subshell because "bisect_state" can exit. - ( bisect_state $state > "$GIT_DIR/BISECT_RUN" ) + ( bisect_state $state >"$GIT_DIR/BISECT_RUN" ) res=$? cat "$GIT_DIR/BISECT_RUN" if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \ - > /dev/null + >/dev/null then gettextln "bisect run cannot continue any more" >&2 exit $res @@ -477,7 +477,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2 exit $res fi - if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null + if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" >/dev/null then gettextln "bisect run success" exit 0; diff --git a/git-compat-util.h b/git-compat-util.h index 7776f126d3..585ef8a79b 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -75,7 +75,7 @@ # endif #elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \ !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \ - !defined(__TANDEM) && !defined(__QNX__) + !defined(__TANDEM) && !defined(__QNX__) && !defined(__MirBSD__) #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 @@ -116,9 +116,6 @@ #include <sys/time.h> #include <time.h> #include <signal.h> -#ifndef USE_WILDMATCH -#include <fnmatch.h> -#endif #include <assert.h> #include <regex.h> #include <utime.h> @@ -304,16 +301,7 @@ extern char *gitbasename(char *); #include "compat/bswap.h" -#ifdef USE_WILDMATCH #include "wildmatch.h" -#define FNM_PATHNAME WM_PATHNAME -#define FNM_CASEFOLD WM_CASEFOLD -#define FNM_NOMATCH WM_NOMATCH -static inline int fnmatch(const char *pattern, const char *string, int flags) -{ - return wildmatch(pattern, string, flags, NULL); -} -#endif /* General helper functions */ extern void vreportf(const char *prefix, const char *err, va_list params); @@ -350,8 +338,8 @@ extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_lis extern void set_error_routine(void (*routine)(const char *err, va_list params)); extern void set_die_is_recursing_routine(int (*routine)(void)); -extern int prefixcmp(const char *str, const char *prefix); -extern int suffixcmp(const char *str, const char *suffix); +extern int starts_with(const char *str, const char *prefix); +extern int ends_with(const char *str, const char *suffix); static inline const char *skip_prefix(const char *str, const char *prefix) { @@ -478,9 +466,15 @@ extern FILE *git_fopen(const char*, const char*); #endif #ifdef SNPRINTF_RETURNS_BOGUS +#ifdef snprintf +#undef snprintf +#endif #define snprintf git_snprintf extern int git_snprintf(char *str, size_t maxsize, const char *format, ...); +#ifdef vsnprintf +#undef vsnprintf +#endif #define vsnprintf git_vsnprintf extern int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap); diff --git a/git-cvsserver.perl b/git-cvsserver.perl index 74d1cc7db0..95e69b19a7 100755 --- a/git-cvsserver.perl +++ b/git-cvsserver.perl @@ -430,10 +430,10 @@ sub req_validrequests $log->debug("req_validrequests"); - $log->debug("SEND : Valid-requests " . join(" ",keys %$methods)); + $log->debug("SEND : Valid-requests " . join(" ",sort keys %$methods)); $log->debug("SEND : ok"); - print "Valid-requests " . join(" ",keys %$methods) . "\n"; + print "Valid-requests " . join(" ",sort keys %$methods) . "\n"; print "ok\n"; } @@ -2124,7 +2124,7 @@ sub req_diff print "M retrieving revision $meta2->{revision}\n" } print "M diff "; - foreach my $opt ( keys %{$state->{opt}} ) + foreach my $opt ( sort keys %{$state->{opt}} ) { if ( ref $state->{opt}{$opt} eq "ARRAY" ) { @@ -4050,7 +4050,7 @@ sub update close FILELIST; # Detect deleted files - foreach my $file ( keys %$head ) + foreach my $file ( sort keys %$head ) { unless ( exists $seen_files->{$file} or $head->{$file}{filehash} eq "deleted" ) { @@ -4078,7 +4078,7 @@ sub update } $self->delete_head(); - foreach my $file ( keys %$head ) + foreach my $file ( sort keys %$head ) { $self->insert_head( $file, diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh index b00ed95dba..7ef36b9482 100755 --- a/git-difftool--helper.sh +++ b/git-difftool--helper.sh @@ -40,7 +40,8 @@ launch_merge_tool () { # the user with the real $MERGED name before launching $merge_tool. if should_prompt then - printf "\nViewing: '%s'\n" "$MERGED" + printf "\nViewing (%s/%s): '%s'\n" "$GIT_DIFF_PATH_COUNTER" \ + "$GIT_DIFF_PATH_TOTAL" "$MERGED" if use_ext_cmd then printf "Launch '%s' [Y/n]: " \ diff --git a/git-difftool.perl b/git-difftool.perl index e57d3d1295..18ca61e8d0 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -39,24 +39,10 @@ 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. - my $worktree; - my $env_worktree = $ENV{GIT_WORK_TREE}; - my $core_worktree = Git::config('core.worktree'); - - if (defined($env_worktree) and (length($env_worktree) > 0)) { - $worktree = $env_worktree; - } elsif (defined($core_worktree) and (length($core_worktree) > 0)) { - $worktree = $core_worktree; - } else { - $worktree = $repo->wc_path(); - } - - return $worktree; + return Git::command_oneline('rev-parse', '--show-toplevel'); } sub print_tool_help @@ -418,7 +404,7 @@ sub dir_diff my $rc; my $error = 0; my $repo = Git->repository(); - my $workdir = find_worktree($repo); + my $workdir = find_worktree(); my ($a, $b, $tmpdir, @worktree) = setup_dir_diff($repo, $workdir, $symlinks); diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index 0a1f8d4f8a..a9ea21826a 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.18.GITGUI +DEF_VER=0.19.GITGUI LF=' ' diff --git a/git-gui/Makefile b/git-gui/Makefile index e9c2bc347d..cde8b2ea31 100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@ -4,7 +4,7 @@ all:: # # Define NO_MSGFMT if you do not have msgfmt from the GNU gettext # package and want to use our rough pure Tcl po->msg translator. -# TCL_PATH must be vaild for this to work. +# TCL_PATH must be valid for this to work. # GIT-VERSION-FILE: FORCE diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index 153f85da06..cf2209b4f2 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -894,6 +894,7 @@ set default_config(gui.textconv) true set default_config(gui.pruneduringfetch) false set default_config(gui.trustmtime) false set default_config(gui.fastcopyblame) false +set default_config(gui.maxrecentrepo) 10 set default_config(gui.copyblamethreshold) 40 set default_config(gui.blamehistoryctx) 7 set default_config(gui.diffcontext) 5 @@ -912,6 +913,7 @@ set font_descs { {fontdiff font_diff {mc "Diff/Console Font"}} } set default_config(gui.stageuntracked) ask +set default_config(gui.displayuntracked) true ###################################################################### ## @@ -1282,7 +1284,11 @@ apply_config # v1.7.0 introduced --show-toplevel to return the canonical work-tree if {[package vsatisfies $_git_version 1.7.0]} { - set _gitworktree [git rev-parse --show-toplevel] + if { [is_Cygwin] } { + catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]} + } else { + set _gitworktree [git rev-parse --show-toplevel] + } } else { # try to set work tree from environment, core.worktree or use # cdup to obtain a relative path to the top of the worktree. If @@ -1550,18 +1556,23 @@ proc rescan_stage2 {fd after} { set buf_rdf {} set buf_rlo {} - set rescan_active 3 + set rescan_active 2 ui_status [mc "Scanning for modified files ..."] set fd_di [git_read diff-index --cached -z [PARENT]] set fd_df [git_read diff-files -z] - set fd_lo [eval git_read ls-files --others -z $ls_others] fconfigure $fd_di -blocking 0 -translation binary -encoding binary fconfigure $fd_df -blocking 0 -translation binary -encoding binary - fconfigure $fd_lo -blocking 0 -translation binary -encoding binary + fileevent $fd_di readable [list read_diff_index $fd_di $after] fileevent $fd_df readable [list read_diff_files $fd_df $after] - fileevent $fd_lo readable [list read_ls_others $fd_lo $after] + + if {[is_config_true gui.displayuntracked]} { + set fd_lo [eval git_read ls-files --others -z $ls_others] + fconfigure $fd_lo -blocking 0 -translation binary -encoding binary + fileevent $fd_lo readable [list read_ls_others $fd_lo $after] + incr rescan_active + } } proc load_message {file {encoding {}}} { @@ -2654,6 +2665,16 @@ if {![is_bare]} { .mbar.repository add command \ -label [mc "Explore Working Copy"] \ -command {do_explore} +} + +if {[is_Windows]} { + .mbar.repository add command \ + -label [mc "Git Bash"] \ + -command {eval exec [auto_execok start] \ + [list "Git Bash" bash --login -l &]} +} + +if {[is_Windows] || ![is_bare]} { .mbar.repository add separator } @@ -3203,13 +3224,29 @@ unset i # -- Diff and Commit Area # -${NS}::frame .vpane.lower -height 300 -width 400 -${NS}::frame .vpane.lower.commarea -${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -pack .vpane.lower.diff -fill both -expand 1 -pack .vpane.lower.commarea -side bottom -fill x -.vpane add .vpane.lower -if {!$use_ttk} {.vpane paneconfigure .vpane.lower -sticky nsew} +if {$have_tk85} { + ${NS}::panedwindow .vpane.lower -orient vertical + ${NS}::frame .vpane.lower.commarea + ${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500 + .vpane.lower add .vpane.lower.diff + .vpane.lower add .vpane.lower.commarea + .vpane add .vpane.lower + if {$use_ttk} { + .vpane.lower pane .vpane.lower.diff -weight 1 + .vpane.lower pane .vpane.lower.commarea -weight 0 + } else { + .vpane.lower paneconfigure .vpane.lower.diff -stretch always + .vpane.lower paneconfigure .vpane.lower.commarea -stretch never + } +} else { + frame .vpane.lower -height 300 -width 400 + frame .vpane.lower.commarea + frame .vpane.lower.diff -relief sunken -borderwidth 1 + pack .vpane.lower.diff -fill both -expand 1 + pack .vpane.lower.commarea -side bottom -fill x + .vpane add .vpane.lower + .vpane paneconfigure .vpane.lower -sticky nsew +} # -- Commit Area Buttons # diff --git a/git-gui/lib/blame.tcl b/git-gui/lib/blame.tcl index 324f7744c4..b1d15f4621 100644 --- a/git-gui/lib/blame.tcl +++ b/git-gui/lib/blame.tcl @@ -5,7 +5,7 @@ class blame { image create photo ::blame::img_back_arrow -data {R0lGODlhGAAYAIUAAPwCBEzKXFTSZIz+nGzmhGzqfGTidIT+nEzGXHTqhGzmfGzifFzadETCVES+VARWDFzWbHzyjAReDGTadFTOZDSyRDyyTCymPARaFGTedFzSbDy2TCyqRCyqPARaDAyCHES6VDy6VCyiPAR6HCSeNByWLARyFARiDARqFGTifARiFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAYABgAAAajQIBwSCwaj8ikcsk0BppJwRPqHEypQwHBis0WDAdEFyBIKBaMAKLBdjQeSkFBYTBAIvgEoS6JmhUTEwIUDQ4VFhcMGEhyCgoZExoUaxsWHB0THkgfAXUGAhoBDSAVFR0XBnCbDRmgog0hpSIiDJpJIyEQhBUcJCIlwA22SSYVogknEg8eD82qSigdDSknY0IqJQXPYxIl1dZCGNvWw+Dm510GQQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} -# Persistant data (survives loads) +# Persistent data (survives loads) # field history {}; # viewer history: {commit path} field header ; # array commit,key -> header field diff --git a/git-gui/lib/choose_repository.tcl b/git-gui/lib/choose_repository.tcl index ee58981f53..3c10bc656d 100644 --- a/git-gui/lib/choose_repository.tcl +++ b/git-gui/lib/choose_repository.tcl @@ -24,6 +24,10 @@ field sorted_recent ; # recent repositories (sorted) constructor pick {} { global M1T M1B use_ttk NS + if {[set maxrecent [get_config gui.maxrecentrepo]] eq {}} { + set maxrecent 10 + } + make_dialog top w wm title $top [mc "Git Gui"] @@ -148,7 +152,7 @@ constructor pick {} { -background [get_bg_color $w_body.recentlabel] \ -wrap none \ -width 50 \ - -height 10 + -height $maxrecent $w_recentlist tag conf link \ -foreground blue \ -underline 1 @@ -264,7 +268,11 @@ proc _append_recentrepos {path} { git config --global --add gui.recentrepo $path load_config 1 - while {[llength $recent] > 10} { + if {[set maxrecent [get_config gui.maxrecentrepo]] eq {}} { + set maxrecent 10 + } + + while {[llength $recent] > $maxrecent} { _unset_recentrepo [lindex $recent 0] set recent [lrange $recent 1 end] } diff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl index 8efbbdde21..74a81a7b42 100644 --- a/git-gui/lib/index.tcl +++ b/git-gui/lib/index.tcl @@ -414,7 +414,7 @@ proc revert_helper {txt paths} { # such distinction is needed in some languages. Previously, the # code used "Revert changes in" for both, but that can't work # in languages where 'in' must be combined with word from - # rest of string (in diffrent way for both cases of course). + # rest of string (in different way for both cases of course). # # FIXME: Unfortunately, even that isn't enough in some languages # as they have quite complex plural-form rules. Unfortunately, diff --git a/git-gui/lib/option.tcl b/git-gui/lib/option.tcl index 0cf1da1d7e..23c9ae72a4 100644 --- a/git-gui/lib/option.tcl +++ b/git-gui/lib/option.tcl @@ -150,6 +150,7 @@ proc do_options {} { {b gui.matchtrackingbranch {mc "Match Tracking Branches"}} {b gui.textconv {mc "Use Textconv For Diffs and Blames"}} {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}} + {i-0..100 gui.maxrecentrepo {mc "Maximum Length of Recent Repositories List"}} {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} {i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}} @@ -159,6 +160,7 @@ proc do_options {} { {c gui.encoding {mc "Default File Contents Encoding"}} {b gui.warndetachedcommit {mc "Warn before committing to a detached head"}} {s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}} + {b gui.displayuntracked {mc "Show untracked files"}} } { set type [lindex $option 0] set name [lindex $option 1] diff --git a/git-gui/lib/spellcheck.tcl b/git-gui/lib/spellcheck.tcl index e6120303e9..538d61c792 100644 --- a/git-gui/lib/spellcheck.tcl +++ b/git-gui/lib/spellcheck.tcl @@ -14,7 +14,7 @@ field w_menu ; # context menu for the widget field s_menuidx 0 ; # last index of insertion into $w_menu field s_i {} ; # timer registration for _run callbacks -field s_clear 0 ; # did we erase mispelled tags yet? +field s_clear 0 ; # did we erase misspelled tags yet? field s_seen [list] ; # lines last seen from $w_text in _run field s_checked [list] ; # lines already checked field s_pending [list] ; # [$line $data] sent to ispell/aspell @@ -259,7 +259,7 @@ method _run {} { if {$n == $cur_line && ![regexp {^\W$} [$w_text get $cur_pos insert]]} { - # If the current word is mispelled remove the tag + # If the current word is misspelled remove the tag # but force a spellcheck later. # set tags [$w_text tag names $cur_pos] diff --git a/git-gui/macosx/Info.plist b/git-gui/macosx/Info.plist index b3bf15fa1c..1ade121c4c 100644 --- a/git-gui/macosx/Info.plist +++ b/git-gui/macosx/Info.plist @@ -24,5 +24,7 @@ <string>GITg</string> <key>CFBundleVersion</key> <string>@@GITGUI_VERSION@@</string> + <key>NSHighResolutionCapable</key> + <true/> </dict> </plist> diff --git a/git-gui/po/bg.po b/git-gui/po/bg.po new file mode 100644 index 0000000000..89b3a4e53d --- /dev/null +++ b/git-gui/po/bg.po @@ -0,0 +1,2694 @@ +# Bulgarian translation of git-gui po-file. +# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: git-gui master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-13 20:45+0200\n" +"PO-Revision-Date: 2014-01-13 21:31+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: git-gui.sh:859 +#, tcl-format +msgid "Invalid font specified in %s:" +msgstr "Указан е неправилен шрифт в %s:" + +#: git-gui.sh:912 +msgid "Main Font" +msgstr "ОÑновен шрифт" + +#: git-gui.sh:913 +msgid "Diff/Console Font" +msgstr "Шрифт за разликите/конзолата" + +#: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045 +#: git-gui.sh:1064 git-gui.sh:3115 +msgid "git-gui: fatal error" +msgstr "git-gui: фатална грешка" + +#: git-gui.sh:929 +msgid "Cannot find git in PATH." +msgstr "Командата git липÑва в Ð¿ÑŠÑ‚Ñ (PATH)." + +#: git-gui.sh:956 +msgid "Cannot parse Git version string:" +msgstr "Ðизът Ñ Ð²ÐµÑ€ÑиÑта на Git не може да бъде интерпретиран:" + +#: git-gui.sh:981 +#, tcl-format +msgid "" +"Git version cannot be determined.\n" +"\n" +"%s claims it is version '%s'.\n" +"\n" +"%s requires at least Git 1.5.0 or later.\n" +"\n" +"Assume '%s' is version 1.5.0?\n" +msgstr "" +"ВерÑиÑта на Git не може да бъде определена.\n" +"\n" +"ВерÑиÑта на %s изглежда, че е „%s“.\n" +"\n" +"%s изиÑква Git, верÑÐ¸Ñ Ð¿Ð¾Ð½Ðµ 1.5.0.\n" +"\n" +"Да Ñе приеме ли, че „%s“ е верÑÐ¸Ñ 1.5.0?\n" + +#: git-gui.sh:1278 +msgid "Git directory not found:" +msgstr "ДиректориÑта на Git не е открита:" + +#: git-gui.sh:1312 +msgid "Cannot move to top of working directory:" +msgstr "Ðе може да Ñе премине към родителÑката директориÑ." + +#: git-gui.sh:1320 +msgid "Cannot use bare repository:" +msgstr "Голо хранилище не може да Ñе използва:" + +#: git-gui.sh:1328 +msgid "No working directory" +msgstr "Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð»Ð¸Ð¿Ñва" + +#: git-gui.sh:1500 lib/checkout_op.tcl:306 +msgid "Refreshing file status..." +msgstr "ОбновÑване на ÑÑŠÑтоÑнието на файла…" + +#: git-gui.sh:1560 +msgid "Scanning for modified files ..." +msgstr "Проверка за променени файлове…" + +#: git-gui.sh:1632 +msgid "Calling prepare-commit-msg hook..." +msgstr "Куката prepare-commit-msg Ñе изпълнÑва в момента…" + +#: git-gui.sh:1649 +msgid "Commit declined by prepare-commit-msg hook." +msgstr "Подаването е отхвърлено от куката prepare-commit-msg." + +#: git-gui.sh:1807 lib/browser.tcl:252 +msgid "Ready." +msgstr "Готово." + +#: git-gui.sh:1965 +#, tcl-format +msgid "Displaying only %s of %s files." +msgstr "Показване на Ñамо %s от %s файла." + +#: git-gui.sh:2091 +msgid "Unmodified" +msgstr "Ðепроменен" + +#: git-gui.sh:2093 +msgid "Modified, not staged" +msgstr "Променен, но не е в индекÑа" + +#: git-gui.sh:2094 git-gui.sh:2106 +msgid "Staged for commit" +msgstr "Ð’ индекÑа за подаване" + +#: git-gui.sh:2095 git-gui.sh:2107 +msgid "Portions staged for commit" +msgstr "ЧаÑти Ñа в индекÑа за подаване" + +#: git-gui.sh:2096 git-gui.sh:2108 +msgid "Staged for commit, missing" +msgstr "Ð’ индекÑа за подаване, но липÑва" + +#: git-gui.sh:2098 +msgid "File type changed, not staged" +msgstr "Видът на файла е Ñменен, но не е в индекÑа" + +#: git-gui.sh:2099 git-gui.sh:2100 +msgid "File type changed, old type staged for commit" +msgstr "Видът на файла е Ñменен, в индекÑа е ÑтариÑÑ‚" + +#: git-gui.sh:2101 +msgid "File type changed, staged" +msgstr "Видът на файла е Ñменен и е в индекÑа" + +#: git-gui.sh:2102 +msgid "File type change staged, modification not staged" +msgstr "Видът на файла е Ñменен, промÑната не е в индекÑа" + +#: git-gui.sh:2103 +msgid "File type change staged, file missing" +msgstr "Видът на файла е Ñменен, файлът липÑва" + +#: git-gui.sh:2105 +msgid "Untracked, not staged" +msgstr "ÐеÑледен" + +#: git-gui.sh:2110 +msgid "Missing" +msgstr "ЛипÑващ" + +#: git-gui.sh:2111 +msgid "Staged for removal" +msgstr "Ð’ индекÑа за изтриване" + +#: git-gui.sh:2112 +msgid "Staged for removal, still present" +msgstr "Ð’ индекÑа за изтриване, но още го има" + +#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117 +#: git-gui.sh:2118 git-gui.sh:2119 +msgid "Requires merge resolution" +msgstr "ИзиÑква коригиране при Ñливане" + +#: git-gui.sh:2154 +msgid "Starting gitk... please wait..." +msgstr "Стартиране на gitk…, изчакайте…" + +#: git-gui.sh:2166 +msgid "Couldn't find gitk in PATH" +msgstr "Ð’ пътищата, определени от променливата PATH, липÑва изпълним gitk" + +#: git-gui.sh:2225 +msgid "Couldn't find git gui in PATH" +msgstr "Ð’ пътищата, определени от променливата PATH, липÑва изпълним git gui" + +#: git-gui.sh:2644 lib/choose_repository.tcl:40 +msgid "Repository" +msgstr "Хранилище" + +#: git-gui.sh:2645 +msgid "Edit" +msgstr "Редактиране" + +#: git-gui.sh:2647 lib/choose_rev.tcl:567 +msgid "Branch" +msgstr "Клон" + +#: git-gui.sh:2650 lib/choose_rev.tcl:554 +msgid "Commit@@noun" +msgstr "Подаване" + +#: git-gui.sh:2653 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 +msgid "Merge" +msgstr "Сливане" + +#: git-gui.sh:2654 lib/choose_rev.tcl:563 +msgid "Remote" +msgstr "Отдалечено хранилище" + +#: git-gui.sh:2657 +msgid "Tools" +msgstr "Команди" + +#: git-gui.sh:2666 +msgid "Explore Working Copy" +msgstr "Разглеждане на работното копие" + +#: git-gui.sh:2672 +msgid "Git Bash" +msgstr "Bash на Git" + +#: git-gui.sh:2682 +msgid "Browse Current Branch's Files" +msgstr "Разглеждане на файловете в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: git-gui.sh:2686 +msgid "Browse Branch Files..." +msgstr "Разглеждане на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: git-gui.sh:2691 +msgid "Visualize Current Branch's History" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: git-gui.sh:2695 +msgid "Visualize All Branch History" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на вÑички клонове" + +#: git-gui.sh:2702 +#, tcl-format +msgid "Browse %s's Files" +msgstr "Разглеждане на файловете в %s" + +#: git-gui.sh:2704 +#, tcl-format +msgid "Visualize %s's History" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на %s" + +#: git-gui.sh:2709 lib/database.tcl:40 lib/database.tcl:66 +msgid "Database Statistics" +msgstr "СтатиÑтика на базата от данни" + +#: git-gui.sh:2712 lib/database.tcl:33 +msgid "Compress Database" +msgstr "КомпреÑиране на базата от данни" + +#: git-gui.sh:2715 +msgid "Verify Database" +msgstr "Проверка на базата от данни" + +#: git-gui.sh:2722 git-gui.sh:2726 git-gui.sh:2730 lib/shortcut.tcl:8 +#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 +msgid "Create Desktop Icon" +msgstr "ДобавÑне на икона на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚" + +#: git-gui.sh:2738 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200 +msgid "Quit" +msgstr "Спиране на програмата" + +#: git-gui.sh:2746 +msgid "Undo" +msgstr "ОтмÑна" + +#: git-gui.sh:2749 +msgid "Redo" +msgstr "Повторение" + +#: git-gui.sh:2753 git-gui.sh:3348 +msgid "Cut" +msgstr "ОтрÑзване" + +#: git-gui.sh:2756 git-gui.sh:3351 git-gui.sh:3425 git-gui.sh:3510 +#: lib/console.tcl:69 +msgid "Copy" +msgstr "Копиране" + +#: git-gui.sh:2759 git-gui.sh:3354 +msgid "Paste" +msgstr "ПоÑтавÑне" + +#: git-gui.sh:2762 git-gui.sh:3357 lib/remote_branch_delete.tcl:39 +#: lib/branch_delete.tcl:28 +msgid "Delete" +msgstr "Изтриване" + +#: git-gui.sh:2766 git-gui.sh:3361 git-gui.sh:3514 lib/console.tcl:71 +msgid "Select All" +msgstr "Избиране на вÑичко" + +#: git-gui.sh:2775 +msgid "Create..." +msgstr "Създаване…" + +#: git-gui.sh:2781 +msgid "Checkout..." +msgstr "ИзтеглÑне…" + +#: git-gui.sh:2787 +msgid "Rename..." +msgstr "Преименуване…" + +#: git-gui.sh:2792 +msgid "Delete..." +msgstr "Изтриване…" + +#: git-gui.sh:2797 +msgid "Reset..." +msgstr "ОтмÑна на промените…" + +#: git-gui.sh:2807 +msgid "Done" +msgstr "Готово" + +#: git-gui.sh:2809 +msgid "Commit@@verb" +msgstr "Подаване" + +#: git-gui.sh:2818 git-gui.sh:3289 +msgid "New Commit" +msgstr "Подаване" + +#: git-gui.sh:2826 git-gui.sh:3296 +msgid "Amend Last Commit" +msgstr "ПоправÑне на поÑледното подаване" + +#: git-gui.sh:2836 git-gui.sh:3250 lib/remote_branch_delete.tcl:101 +msgid "Rescan" +msgstr "ОбновÑване" + +#: git-gui.sh:2842 +msgid "Stage To Commit" +msgstr "Към индекÑа за подаване" + +#: git-gui.sh:2848 +msgid "Stage Changed Files To Commit" +msgstr "Ð’Ñички променени файлове към индекÑа за подаване" + +#: git-gui.sh:2854 +msgid "Unstage From Commit" +msgstr "Изваждане от индекÑа за подаване" + +#: git-gui.sh:2860 lib/index.tcl:442 +msgid "Revert Changes" +msgstr "Връщане на оригинала" + +#: git-gui.sh:2868 git-gui.sh:3561 git-gui.sh:3592 +msgid "Show Less Context" +msgstr "По-малко контекÑÑ‚" + +#: git-gui.sh:2872 git-gui.sh:3565 git-gui.sh:3596 +msgid "Show More Context" +msgstr "Повече контекÑÑ‚" + +#: git-gui.sh:2879 git-gui.sh:3263 git-gui.sh:3372 +msgid "Sign Off" +msgstr "ПодпиÑване" + +#: git-gui.sh:2895 +msgid "Local Merge..." +msgstr "Локално Ñливане…" + +#: git-gui.sh:2900 +msgid "Abort Merge..." +msgstr "ПреуÑтановÑване на Ñливане…" + +#: git-gui.sh:2912 git-gui.sh:2940 +msgid "Add..." +msgstr "ДобавÑне…" + +#: git-gui.sh:2916 +msgid "Push..." +msgstr "Избутване…" + +#: git-gui.sh:2920 +msgid "Delete Branch..." +msgstr "Изтриване на клон…" + +#: git-gui.sh:2930 git-gui.sh:3543 +msgid "Options..." +msgstr "Опции…" + +#: git-gui.sh:2941 +msgid "Remove..." +msgstr "Премахване…" + +#: git-gui.sh:2950 lib/choose_repository.tcl:54 +msgid "Help" +msgstr "Помощ" + +#: git-gui.sh:2954 git-gui.sh:2958 lib/choose_repository.tcl:48 +#: lib/choose_repository.tcl:57 lib/about.tcl:14 +#, tcl-format +msgid "About %s" +msgstr "ОтноÑно %s" + +#: git-gui.sh:2982 +msgid "Online Documentation" +msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð² Интернет" + +#: git-gui.sh:2985 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60 +msgid "Show SSH Key" +msgstr "Показване на ключа за SSH" + +#: git-gui.sh:3004 git-gui.sh:3136 +msgid "Usage" +msgstr "Употреба" + +#: git-gui.sh:3085 lib/blame.tcl:573 +msgid "Error" +msgstr "Грешка" + +#: git-gui.sh:3116 +#, tcl-format +msgid "fatal: cannot stat path %s: No such file or directory" +msgstr "" +"фатално: пътÑÑ‚ %s не може да бъде открит: такъв файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ñма" + +#: git-gui.sh:3149 +msgid "Current Branch:" +msgstr "Текущ клон:" + +#: git-gui.sh:3175 +msgid "Staged Changes (Will Commit)" +msgstr "Промени в индекÑа (за подаване)" + +#: git-gui.sh:3195 +msgid "Unstaged Changes" +msgstr "Промени извън индекÑа" + +#: git-gui.sh:3256 +msgid "Stage Changed" +msgstr "ИндекÑÑŠÑ‚ е променен" + +#: git-gui.sh:3275 lib/transport.tcl:137 lib/transport.tcl:229 +msgid "Push" +msgstr "ИзтлаÑкване" + +#: git-gui.sh:3310 +msgid "Initial Commit Message:" +msgstr "Първоначално Ñъобщение при подаване:" + +#: git-gui.sh:3311 +msgid "Amended Commit Message:" +msgstr "Поправено Ñъобщение при подаване:" + +#: git-gui.sh:3312 +msgid "Amended Initial Commit Message:" +msgstr "Поправено първоначално Ñъобщение при подаване:" + +#: git-gui.sh:3313 +msgid "Amended Merge Commit Message:" +msgstr "Поправено Ñъобщение при подаване ÑÑŠÑ Ñливане:" + +#: git-gui.sh:3314 +msgid "Merge Commit Message:" +msgstr "Съобщение при подаване ÑÑŠÑ Ñливане:" + +#: git-gui.sh:3315 +msgid "Commit Message:" +msgstr "Съобщение при подаване:" + +#: git-gui.sh:3364 git-gui.sh:3518 lib/console.tcl:73 +msgid "Copy All" +msgstr "Копиране на вÑичко" + +#: git-gui.sh:3388 lib/blame.tcl:105 +msgid "File:" +msgstr "Файл:" + +#: git-gui.sh:3506 +msgid "Refresh" +msgstr "ОбновÑване" + +#: git-gui.sh:3527 +msgid "Decrease Font Size" +msgstr "По-едър шрифт" + +#: git-gui.sh:3531 +msgid "Increase Font Size" +msgstr "По-дребен шрифт" + +#: git-gui.sh:3539 lib/blame.tcl:294 +msgid "Encoding" +msgstr "Кодиране" + +#: git-gui.sh:3550 +msgid "Apply/Reverse Hunk" +msgstr "Прилагане/връщане на парче" + +#: git-gui.sh:3555 +msgid "Apply/Reverse Line" +msgstr "Прилагане/връщане на ред" + +#: git-gui.sh:3574 +msgid "Run Merge Tool" +msgstr "Изпълнение на програмата за Ñливане" + +#: git-gui.sh:3579 +msgid "Use Remote Version" +msgstr "ВерÑÐ¸Ñ Ð¾Ñ‚ отдалеченото хранилище" + +#: git-gui.sh:3583 +msgid "Use Local Version" +msgstr "Локална верÑиÑ" + +#: git-gui.sh:3587 +msgid "Revert To Base" +msgstr "Връщане към родителÑката верÑиÑ" + +#: git-gui.sh:3605 +msgid "Visualize These Changes In The Submodule" +msgstr "Визуализиране на промените в подмодула" + +#: git-gui.sh:3609 +msgid "Visualize Current Branch History In The Submodule" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ в иÑториÑта за подмодула" + +#: git-gui.sh:3613 +msgid "Visualize All Branch History In The Submodule" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на вÑички клони в иÑториÑта за подмодула" + +#: git-gui.sh:3618 +msgid "Start git gui In The Submodule" +msgstr "Стартиране на „git gui“ за подмодула" + +#: git-gui.sh:3653 +msgid "Unstage Hunk From Commit" +msgstr "Изваждане на парчето от подаването" + +#: git-gui.sh:3655 +msgid "Unstage Lines From Commit" +msgstr "Изваждане на редовете от подаването" + +#: git-gui.sh:3657 +msgid "Unstage Line From Commit" +msgstr "Изваждане на реда от подаването" + +#: git-gui.sh:3660 +msgid "Stage Hunk For Commit" +msgstr "ДобавÑне на парчето за подаване" + +#: git-gui.sh:3662 +msgid "Stage Lines For Commit" +msgstr "ДобавÑне на редовете за подаване" + +#: git-gui.sh:3664 +msgid "Stage Line For Commit" +msgstr "ДобавÑне на реда за подаване" + +#: git-gui.sh:3689 +msgid "Initializing..." +msgstr "Инициализиране…" + +#: git-gui.sh:3832 +#, tcl-format +msgid "" +"Possible environment issues exist.\n" +"\n" +"The following environment variables are probably\n" +"going to be ignored by any Git subprocess run\n" +"by %s:\n" +"\n" +msgstr "" +"Възможно е да има проблем ÑÑŠÑ Ñредата.\n" +"\n" +"Ðай-вероÑтно Ñледните променливи нÑма да бъдат\n" +"взети под внимание от подпроцеÑите Git изпълнени\n" +"от %s:\n" +"\n" + +#: git-gui.sh:3861 +msgid "" +"\n" +"This is due to a known issue with the\n" +"Tcl binary distributed by Cygwin." +msgstr "" +"\n" +"Това е познат проблем и Ñе дължи на\n" +"верÑиÑта на Tcl включена в Cygwin." + +#: git-gui.sh:3866 +#, tcl-format +msgid "" +"\n" +"\n" +"A good replacement for %s\n" +"is placing values for the user.name and\n" +"user.email settings into your personal\n" +"~/.gitconfig file.\n" +msgstr "" +"\n" +"\n" +"Добър замеÑтител на %s\n" +"е да поÑтавите наÑтройките user.name и\n" +"user.email в Ð»Ð¸Ñ‡Ð½Ð¸Ñ Ñи файл ~/.gitconfig.\n" + +#: lib/spellcheck.tcl:57 +msgid "Unsupported spell checker" +msgstr "Тази програма за проверка на правопиÑа не Ñе поддържа" + +#: lib/spellcheck.tcl:65 +msgid "Spell checking is unavailable" +msgstr "ЛипÑва програма за проверка на правопиÑа" + +#: lib/spellcheck.tcl:68 +msgid "Invalid spell checking configuration" +msgstr "Ðеправилни наÑтройки на проверката на правопиÑа" + +#: lib/spellcheck.tcl:70 +#, tcl-format +msgid "Reverting dictionary to %s." +msgstr "Ползване на речник за език „%s“." + +#: lib/spellcheck.tcl:73 +msgid "Spell checker silently failed on startup" +msgstr "Програмата за Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð´Ð°Ð¶Ðµ не Ñтартира уÑпешно." + +#: lib/spellcheck.tcl:80 +msgid "Unrecognized spell checker" +msgstr "Ðепозната програма за проверка на правопиÑа" + +#: lib/spellcheck.tcl:186 +msgid "No Suggestions" +msgstr "ÐÑма предложениÑ" + +#: lib/spellcheck.tcl:388 +msgid "Unexpected EOF from spell checker" +msgstr "Ðеочакван край на файл от програмата за проверка на правопиÑа" + +#: lib/spellcheck.tcl:392 +msgid "Spell Checker Failed" +msgstr "Грешка в програмата за проверка на правопиÑа" + +#: lib/remote_add.tcl:20 +msgid "Add Remote" +msgstr "ДобавÑне на отдалечено хранилище" + +#: lib/remote_add.tcl:25 +msgid "Add New Remote" +msgstr "ДобавÑне на отдалечено хранилище" + +#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 +msgid "Add" +msgstr "ДобавÑне" + +#: lib/remote_add.tcl:34 lib/browser.tcl:292 lib/branch_checkout.tcl:30 +#: lib/transport.tcl:141 lib/branch_rename.tcl:32 lib/choose_font.tcl:45 +#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 +#: lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43 +#: lib/checkout_op.tcl:579 lib/branch_create.tcl:37 lib/branch_delete.tcl:34 +#: lib/merge.tcl:174 +msgid "Cancel" +msgstr "Отказване" + +#: lib/remote_add.tcl:39 +msgid "Remote Details" +msgstr "Данни за отдалеченото хранилище" + +#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44 +msgid "Name:" +msgstr "Име:" + +#: lib/remote_add.tcl:50 +msgid "Location:" +msgstr "МеÑтоположение:" + +#: lib/remote_add.tcl:60 +msgid "Further Action" +msgstr "Следващо дейÑтвие" + +#: lib/remote_add.tcl:63 +msgid "Fetch Immediately" +msgstr "Ðезабавно доÑтавÑне" + +#: lib/remote_add.tcl:69 +msgid "Initialize Remote Repository and Push" +msgstr "Инициализиране на отдалеченото хранилище и изтлаÑкване на промените" + +#: lib/remote_add.tcl:75 +msgid "Do Nothing Else Now" +msgstr "Да не Ñе прави нищо" + +#: lib/remote_add.tcl:100 +msgid "Please supply a remote name." +msgstr "Задайте име за отдалеченото хранилище." + +#: lib/remote_add.tcl:113 +#, tcl-format +msgid "'%s' is not an acceptable remote name." +msgstr "Отдалечено хранилище не може да Ñе казва „%s“." + +#: lib/remote_add.tcl:124 +#, tcl-format +msgid "Failed to add remote '%s' of location '%s'." +msgstr "ÐеуÑпешно добавÑне на отдалеченото хранилище „%s“ от Ð°Ð´Ñ€ÐµÑ â€ž%s“." + +#: lib/remote_add.tcl:132 lib/transport.tcl:6 +#, tcl-format +msgid "fetch %s" +msgstr "доÑтавÑне на „%s“" + +#: lib/remote_add.tcl:133 +#, tcl-format +msgid "Fetching the %s" +msgstr "ДоÑтавÑне на „%s“" + +#: lib/remote_add.tcl:156 +#, tcl-format +msgid "Do not know how to initialize repository at location '%s'." +msgstr "Хранилището Ñ Ð¼ÐµÑтоположение „%s“ не може да бъде инициализирано." + +#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92 +#: lib/transport.tcl:110 +#, tcl-format +msgid "push %s" +msgstr "изтлаÑкване на „%s“" + +#: lib/remote_add.tcl:163 +#, tcl-format +msgid "Setting up the %s (at %s)" +msgstr "ДобавÑне на хранилище „%s“ (Ñ Ð°Ð´Ñ€ÐµÑ â€ž%s“)" + +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "Стартиране…" + +#: lib/browser.tcl:27 +msgid "File Browser" +msgstr "Файлов браузър" + +#: lib/browser.tcl:132 lib/browser.tcl:149 +#, tcl-format +msgid "Loading %s..." +msgstr "Зареждане на „%s“…" + +#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[Към родителÑ]" + +#: lib/browser.tcl:275 lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Разглеждане на файловете в клона" + +#: lib/browser.tcl:288 lib/choose_repository.tcl:406 +#: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502 +#: lib/choose_repository.tcl:1029 +msgid "Browse" +msgstr "Разглеждане" + +#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321 +msgid "Revision" +msgstr "ВерÑиÑ" + +#: lib/tools.tcl:75 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "За изпълнението на „%s“ трÑбва да изберете файл." + +#: lib/tools.tcl:91 +#, tcl-format +msgid "Are you sure you want to run %1$s on file \"%2$s\"?" +msgstr "Сигурни ли Ñте, че иÑкате да Ñтартирате „%1$s“ върху „%2$s“?" + +#: lib/tools.tcl:95 +#, tcl-format +msgid "Are you sure you want to run %s?" +msgstr "Сигурни ли Ñте, че иÑкате да Ñтартирате „%s“?" + +#: lib/tools.tcl:116 +#, tcl-format +msgid "Tool: %s" +msgstr "Команда: %s" + +#: lib/tools.tcl:117 +#, tcl-format +msgid "Running: %s" +msgstr "Изпълнение: %s" + +#: lib/tools.tcl:155 +#, tcl-format +msgid "Tool completed successfully: %s" +msgstr "Командата завърши уÑпешно: %s" + +#: lib/tools.tcl:157 +#, tcl-format +msgid "Tool failed: %s" +msgstr "Командата върна грешка: %s" + +#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 +msgid "Checkout Branch" +msgstr "Клон за изтеглÑне" + +#: lib/branch_checkout.tcl:26 +msgid "Checkout" +msgstr "ИзтеглÑне" + +#: lib/branch_checkout.tcl:39 lib/option.tcl:309 lib/branch_create.tcl:69 +msgid "Options" +msgstr "Опции" + +#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 +msgid "Fetch Tracking Branch" +msgstr "ИзтеглÑне на промените от ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: lib/branch_checkout.tcl:47 +msgid "Detach From Local Branch" +msgstr "Изтриване от Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: lib/transport.tcl:7 +#, tcl-format +msgid "Fetching new changes from %s" +msgstr "ДоÑтавÑне на промените от %s" + +#: lib/transport.tcl:18 +#, tcl-format +msgid "remote prune %s" +msgstr "окаÑтрÑне на ÑледÑщите клони към „%s“" + +#: lib/transport.tcl:19 +#, tcl-format +msgid "Pruning tracking branches deleted from %s" +msgstr "ОкаÑтрÑне на ÑледÑщите клони на изтритите клони от „%s“" + +#: lib/transport.tcl:25 +msgid "fetch all remotes" +msgstr "доÑтавÑне на вÑички хранилища" + +#: lib/transport.tcl:26 +msgid "Fetching new changes from all remotes" +msgstr "ДоÑтавÑне на промените от вÑички отдалечени хранилища" + +#: lib/transport.tcl:40 +msgid "remote prune all remotes" +msgstr "окаÑтрÑне на вÑички клони ÑледÑщи изтрити клони" + +#: lib/transport.tcl:41 +msgid "Pruning tracking branches deleted from all remotes" +msgstr "" +"ОкаÑтрÑне на ÑледÑщите клони на изтритите клони от вÑички отдалечени " +"хранилища" + +#: lib/transport.tcl:55 +#, tcl-format +msgid "Pushing changes to %s" +msgstr "ИзтлаÑкване на промените към %s" + +#: lib/transport.tcl:93 +#, tcl-format +msgid "Mirroring to %s" +msgstr "ИзтлаÑкване на вÑичко към „%s“" + +#: lib/transport.tcl:111 +#, tcl-format +msgid "Pushing %s %s to %s" +msgstr "ИзтлаÑкване на %s %s към %s" + +#: lib/transport.tcl:132 +msgid "Push Branches" +msgstr "Клони за изтлаÑкване" + +#: lib/transport.tcl:147 +msgid "Source Branches" +msgstr "Клони-източници" + +#: lib/transport.tcl:162 +msgid "Destination Repository" +msgstr "Целево хранилище" + +#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51 +msgid "Remote:" +msgstr "Отдалечено хранилище:" + +#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72 +msgid "Arbitrary Location:" +msgstr "Произволно меÑтоположение:" + +#: lib/transport.tcl:205 +msgid "Transfer Options" +msgstr "ÐаÑтройки при пренаÑÑнето" + +#: lib/transport.tcl:207 +msgid "Force overwrite existing branch (may discard changes)" +msgstr "" +"Изрично презапиÑване на ÑъщеÑтвуващ клон (нÑкои промени може да бъдат " +"загубени)" + +#: lib/transport.tcl:211 +msgid "Use thin pack (for slow network connections)" +msgstr "МакÑимална компреÑÐ¸Ñ (за бавни мрежови връзки)" + +#: lib/transport.tcl:215 +msgid "Include tags" +msgstr "Включване на етикетите" + +#: lib/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s… %*i от общо %*i %s (%3i%%)" + +#: lib/remote.tcl:200 +msgid "Push to" +msgstr "ИзтлаÑкване към" + +#: lib/remote.tcl:218 +msgid "Remove Remote" +msgstr "Премахване на отдалечено хранилище" + +#: lib/remote.tcl:223 +msgid "Prune from" +msgstr "ОкаÑтрÑне от" + +#: lib/remote.tcl:228 +msgid "Fetch from" +msgstr "ДоÑтавÑне от" + +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Ðе Ñа открити ключове." + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Открит е публичен ключ в „%s“" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Генериране на ключ" + +#: lib/sshkey.tcl:55 lib/checkout_op.tcl:146 lib/console.tcl:81 +#: lib/database.tcl:30 +msgid "Close" +msgstr "ЗатварÑне" + +#: lib/sshkey.tcl:58 +msgid "Copy To Clipboard" +msgstr "Копиране към ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€" + +#: lib/sshkey.tcl:72 +msgid "Your OpenSSH Public Key" +msgstr "ПубличниÑÑ‚ ви ключ за OpenSSH" + +#: lib/sshkey.tcl:80 +msgid "Generating..." +msgstr "Генериране…" + +#: lib/sshkey.tcl:86 +#, tcl-format +msgid "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Програмата „ssh-keygen“ не може да бъде Ñтартирана:\n" +"\n" +"%s" + +#: lib/sshkey.tcl:113 +msgid "Generation failed." +msgstr "ÐеуÑпешно генериране." + +#: lib/sshkey.tcl:120 +msgid "Generation succeeded, but no keys found." +msgstr "Генерирането завърши уÑпешно, а не Ñа намерени ключове." + +#: lib/sshkey.tcl:123 +#, tcl-format +msgid "Your key is in: %s" +msgstr "Ключът ви е в „%s“" + +#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 +msgid "Rename Branch" +msgstr "Преименуване на клон" + +#: lib/branch_rename.tcl:28 +msgid "Rename" +msgstr "Преименуване" + +#: lib/branch_rename.tcl:38 +msgid "Branch:" +msgstr "Клон:" + +#: lib/branch_rename.tcl:46 +msgid "New Name:" +msgstr "Ðово име:" + +#: lib/branch_rename.tcl:81 +msgid "Please select a branch to rename." +msgstr "Изберете клон за преименуване." + +#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154 +msgid "Please supply a branch name." +msgstr "Дайте име на клона." + +#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202 +#, tcl-format +msgid "Branch '%s' already exists." +msgstr "Клонът „%s“ вече ÑъщеÑтвува." + +#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165 +#, tcl-format +msgid "'%s' is not an acceptable branch name." +msgstr "„%s“ не може да Ñе използва за име на клон." + +#: lib/branch_rename.tcl:123 +#, tcl-format +msgid "Failed to rename '%s'." +msgstr "ÐеуÑпешно преименуване на „%s“." + +#: lib/choose_font.tcl:41 +msgid "Select" +msgstr "Избор" + +#: lib/choose_font.tcl:55 +msgid "Font Family" +msgstr "Шрифт" + +#: lib/choose_font.tcl:76 +msgid "Font Size" +msgstr "Размер" + +#: lib/choose_font.tcl:93 +msgid "Font Example" +msgstr "МоÑтра" + +#: lib/choose_font.tcl:105 +msgid "" +"This is example text.\n" +"If you like this text, it can be your font." +msgstr "" +"Това е примерен текÑÑ‚.\n" +"Ðко ви хареÑва как изглежда, изберете този шрифт." + +#: lib/option.tcl:11 +#, tcl-format +msgid "Invalid global encoding '%s'" +msgstr "Ðеправилно глобално кодиране „%s“" + +#: lib/option.tcl:19 +#, tcl-format +msgid "Invalid repo encoding '%s'" +msgstr "Ðеправилно кодиране „%s“ на хранилището" + +#: lib/option.tcl:119 +msgid "Restore Defaults" +msgstr "Стандартни наÑтройки" + +#: lib/option.tcl:123 +msgid "Save" +msgstr "Запазване" + +#: lib/option.tcl:133 +#, tcl-format +msgid "%s Repository" +msgstr "Хранилище „%s“" + +#: lib/option.tcl:134 +msgid "Global (All Repositories)" +msgstr "Глобално (за вÑички хранилища)" + +#: lib/option.tcl:140 +msgid "User Name" +msgstr "ПотребителÑко име" + +#: lib/option.tcl:141 +msgid "Email Address" +msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð° е-поща" + +#: lib/option.tcl:143 +msgid "Summarize Merge Commits" +msgstr "Обобщаване на подаваниÑта при Ñливане" + +#: lib/option.tcl:144 +msgid "Merge Verbosity" +msgstr "ПодробноÑти при ÑливаниÑта" + +#: lib/option.tcl:145 +msgid "Show Diffstat After Merge" +msgstr "Извеждане на ÑтатиÑтика Ñлед ÑливаниÑта" + +#: lib/option.tcl:146 +msgid "Use Merge Tool" +msgstr "Използване на програма за Ñливане" + +#: lib/option.tcl:148 +msgid "Trust File Modification Timestamps" +msgstr "Доверие във времето на промÑна на файловете" + +#: lib/option.tcl:149 +msgid "Prune Tracking Branches During Fetch" +msgstr "ОкаÑтрÑне на ÑледÑщите клонове при доÑтавÑне" + +#: lib/option.tcl:150 +msgid "Match Tracking Branches" +msgstr "ÐапаÑване на ÑледÑщите клонове" + +#: lib/option.tcl:151 +msgid "Use Textconv For Diffs and Blames" +msgstr "Използване на „textconv“ за разликите и анотациите" + +#: lib/option.tcl:152 +msgid "Blame Copy Only On Changed Files" +msgstr "Ðнотиране на копието Ñамо по променените файлове" + +#: lib/option.tcl:153 +msgid "Maximum Length of Recent Repositories List" +msgstr "МакÑимален брой Ñкоро ползвани хранилища" + +#: lib/option.tcl:154 +msgid "Minimum Letters To Blame Copy On" +msgstr "Минимален брой знаци за анотиране на копието" + +#: lib/option.tcl:155 +msgid "Blame History Context Radius (days)" +msgstr "ИÑторичеÑки обхват за анотиране в дни" + +#: lib/option.tcl:156 +msgid "Number of Diff Context Lines" +msgstr "Брой редове за контекÑта при извеждане на разликите" + +#: lib/option.tcl:157 +msgid "Additional Diff Parameters" +msgstr "Допълнителни параметри за разликите" + +#: lib/option.tcl:158 +msgid "Commit Message Text Width" +msgstr "Широчина на текÑта на Ñъобщението при подаване" + +#: lib/option.tcl:159 +msgid "New Branch Name Template" +msgstr "Шаблон за името на новите клони" + +#: lib/option.tcl:160 +msgid "Default File Contents Encoding" +msgstr "Стандартно кодиране на файловете" + +#: lib/option.tcl:161 +msgid "Warn before committing to a detached head" +msgstr "Предупреждение при подаване към неÑвързан връх" + +#: lib/option.tcl:162 +msgid "Staging of untracked files" +msgstr "ДобавÑне на неÑледените файлове към индекÑа" + +#: lib/option.tcl:163 +msgid "Show untracked files" +msgstr "Показване на неÑледените файлове" + +#: lib/option.tcl:209 +msgid "Change" +msgstr "СмÑна" + +#: lib/option.tcl:253 +msgid "Spelling Dictionary:" +msgstr "ПравопиÑен речник:" + +#: lib/option.tcl:283 +msgid "Change Font" +msgstr "СмÑна на шрифта" + +#: lib/option.tcl:287 +#, tcl-format +msgid "Choose %s" +msgstr "Избор на „%s“" + +#: lib/option.tcl:293 +msgid "pt." +msgstr "тчк." + +#: lib/option.tcl:307 +msgid "Preferences" +msgstr "ÐаÑтройки" + +#: lib/option.tcl:344 +msgid "Failed to completely save options:" +msgstr "ÐеуÑпешно запазване на наÑтройките:" + +#: lib/mergetool.tcl:8 +msgid "Force resolution to the base version?" +msgstr "Да Ñе използва базовата верÑиÑ" + +#: lib/mergetool.tcl:9 +msgid "Force resolution to this branch?" +msgstr "Да Ñе използва верÑиÑта от този клон" + +#: lib/mergetool.tcl:10 +msgid "Force resolution to the other branch?" +msgstr "Да Ñе използва верÑиÑта от Ð´Ñ€ÑƒÐ³Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: lib/mergetool.tcl:14 +#, tcl-format +msgid "" +"Note that the diff shows only conflicting changes.\n" +"\n" +"%s will be overwritten.\n" +"\n" +"This operation can be undone only by restarting the merge." +msgstr "" +"Разликата показва Ñамо разликите Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚.\n" +"\n" +"Файлът „%s“ ще бъде презапиÑан.\n" +"\n" +"Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да бъде отменена Ñамо чрез започване на Ñливането наново." + +#: lib/mergetool.tcl:45 +#, tcl-format +msgid "File %s seems to have unresolved conflicts, still stage?" +msgstr "" +"Изглежда, че във файла „%s“ вÑе още има некоригирани конфликти. Да Ñе добави " +"ли файлът към индекÑа?" + +#: lib/mergetool.tcl:60 +#, tcl-format +msgid "Adding resolution for %s" +msgstr "ДобавÑне на ÐºÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° конфликтите в „%s“" + +#: lib/mergetool.tcl:141 +msgid "Cannot resolve deletion or link conflicts using a tool" +msgstr "" +"Конфликтите при Ñимволни връзки или изтриване не могат да бъдат коригирани Ñ " +"външна програма." + +#: lib/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "Файлът, в който е конфликтът, не ÑъщеÑтвува" + +#: lib/mergetool.tcl:246 +#, tcl-format +msgid "Not a GUI merge tool: '%s'" +msgstr "Това не е графична програма за Ñливане: „%s“" + +#: lib/mergetool.tcl:275 +#, tcl-format +msgid "Unsupported merge tool '%s'" +msgstr "Ðеподдържана програма за Ñливане: „%s“" + +#: lib/mergetool.tcl:310 +msgid "Merge tool is already running, terminate it?" +msgstr "Програмата за Ñливане вече е Ñтартирана. Да бъде ли изключена?" + +#: lib/mergetool.tcl:330 +#, tcl-format +msgid "" +"Error retrieving versions:\n" +"%s" +msgstr "" +"Грешка при изтеглÑнето на верÑии:\n" +"%s" + +#: lib/mergetool.tcl:350 +#, tcl-format +msgid "" +"Could not start the merge tool:\n" +"\n" +"%s" +msgstr "" +"Програмата за Ñливане не може да бъде Ñтартирана:\n" +"\n" +"%s" + +#: lib/mergetool.tcl:354 +msgid "Running merge tool..." +msgstr "Стартиране на програмата за Ñливане…" + +#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 +msgid "Merge tool failed." +msgstr "Грешка в програмата за Ñливане." + +#: lib/tools_dlg.tcl:22 +msgid "Add Tool" +msgstr "ДобавÑне на команда" + +#: lib/tools_dlg.tcl:28 +msgid "Add New Tool Command" +msgstr "ДобавÑне на команда" + +#: lib/tools_dlg.tcl:34 +msgid "Add globally" +msgstr "Глобално добавÑне" + +#: lib/tools_dlg.tcl:46 +msgid "Tool Details" +msgstr "ПодробноÑти за командата" + +#: lib/tools_dlg.tcl:49 +msgid "Use '/' separators to create a submenu tree:" +msgstr "За Ñъздаване на подменюта използвайте за разделител знака „/“:" + +#: lib/tools_dlg.tcl:60 +msgid "Command:" +msgstr "Команда:" + +#: lib/tools_dlg.tcl:71 +msgid "Show a dialog before running" +msgstr "Преди изпълнение да Ñе извежда диалогов прозорец" + +#: lib/tools_dlg.tcl:77 +msgid "Ask the user to select a revision (sets $REVISION)" +msgstr "ПотребителÑÑ‚ да укаже верÑÐ¸Ñ (задаване на променливата $REVISION)" + +#: lib/tools_dlg.tcl:82 +msgid "Ask the user for additional arguments (sets $ARGS)" +msgstr "" +"ПотребителÑÑ‚ да укаже допълнителни аргументи (задаване на променливата $ARGS)" + +#: lib/tools_dlg.tcl:89 +msgid "Don't show the command output window" +msgstr "Без показване на прозорец Ñ Ð¸Ð·Ñ…Ð¾Ð´Ð° от командата" + +#: lib/tools_dlg.tcl:94 +msgid "Run only if a diff is selected ($FILENAME not empty)" +msgstr "" +"Стартиране Ñамо Ñлед избор на разлика (променливата $FILENAME не е празна)" + +#: lib/tools_dlg.tcl:118 +msgid "Please supply a name for the tool." +msgstr "Задайте име за командата." + +#: lib/tools_dlg.tcl:126 +#, tcl-format +msgid "Tool '%s' already exists." +msgstr "Командата „%s“ вече ÑъщеÑтвува." + +#: lib/tools_dlg.tcl:148 +#, tcl-format +msgid "" +"Could not add tool:\n" +"%s" +msgstr "" +"Командата не може да бъде добавена:\n" +"%s" + +#: lib/tools_dlg.tcl:187 +msgid "Remove Tool" +msgstr "Премахване на команда" + +#: lib/tools_dlg.tcl:193 +msgid "Remove Tool Commands" +msgstr "Премахване на команди" + +#: lib/tools_dlg.tcl:198 +msgid "Remove" +msgstr "Премахване" + +#: lib/tools_dlg.tcl:231 +msgid "(Blue denotes repository-local tools)" +msgstr "(команди към локалното хранилище Ñа обозначени в Ñиньо)" + +#: lib/tools_dlg.tcl:292 +#, tcl-format +msgid "Run Command: %s" +msgstr "Изпълнение на командата „%s“" + +#: lib/tools_dlg.tcl:306 +msgid "Arguments" +msgstr "Ðргументи" + +#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166 +msgid "Visualize" +msgstr "ВизуализациÑ" + +#: lib/tools_dlg.tcl:341 +msgid "OK" +msgstr "Добре" + +#: lib/search.tcl:48 +msgid "Find:" +msgstr "ТърÑене:" + +#: lib/search.tcl:50 +msgid "Next" +msgstr "Следваща поÑва" + +#: lib/search.tcl:51 +msgid "Prev" +msgstr "Предишна поÑва" + +#: lib/search.tcl:52 +msgid "RegExp" +msgstr "Рег. изр." + +#: lib/search.tcl:54 +msgid "Case" +msgstr "РегиÑтър" + +#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 +msgid "Cannot write shortcut:" +msgstr "Клавишната ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена:" + +#: lib/shortcut.tcl:137 +msgid "Cannot write icon:" +msgstr "Иконата не може да бъде запазена:" + +#: lib/diff.tcl:64 +#, tcl-format +msgid "" +"No differences detected.\n" +"\n" +"%s has no changes.\n" +"\n" +"The modification date of this file was updated by another application, but " +"the content within the file was not changed.\n" +"\n" +"A rescan will be automatically started to find other files which may have " +"the same state." +msgstr "" +"Ðе Ñа открити разлики.\n" +"\n" +"ÐÑма промени в „%s“.\n" +"\n" +"Времето на промÑна на файла е бил зададен от друга програма, но Ñъдържанието " +"му не е променено.\n" +"\n" +"Ðвтоматично ще започне нова проверка дали нÑма други файлове в това " +"ÑÑŠÑтоÑние." + +#: lib/diff.tcl:104 +#, tcl-format +msgid "Loading diff of %s..." +msgstr "Зареждане на разликите в „%s“…" + +#: lib/diff.tcl:125 +msgid "" +"LOCAL: deleted\n" +"REMOTE:\n" +msgstr "" +"ЛОКÐЛÐО: изтрит\n" +"ОТДÐЛЕЧЕÐО:\n" + +#: lib/diff.tcl:130 +msgid "" +"REMOTE: deleted\n" +"LOCAL:\n" +msgstr "" +"ОТДÐЛЕЧЕÐО: изтрит\n" +"ЛОКÐЛÐО:\n" + +#: lib/diff.tcl:137 +msgid "LOCAL:\n" +msgstr "ЛОКÐЛÐО:\n" + +#: lib/diff.tcl:140 +msgid "REMOTE:\n" +msgstr "ОТДÐЛЕЧЕÐО:\n" + +#: lib/diff.tcl:202 lib/diff.tcl:337 +#, tcl-format +msgid "Unable to display %s" +msgstr "Ðе може да бъде показан файлът „%s“" + +#: lib/diff.tcl:203 +msgid "Error loading file:" +msgstr "Грешка при зареждане на файл:" + +#: lib/diff.tcl:210 +msgid "Git Repository (subproject)" +msgstr "Хранилище на Git (подпроект)" + +#: lib/diff.tcl:222 +msgid "* Binary file (not showing content)." +msgstr "⃠Двоичен файл (Ñъдържанието не Ñе показва)." + +#: lib/diff.tcl:227 +#, tcl-format +msgid "" +"* Untracked file is %d bytes.\n" +"* Showing only first %d bytes.\n" +msgstr "" +"⃠ÐеÑледениÑÑ‚ файл е %d байта.\n" +"⃠Показват Ñе Ñамо първите %d байта.\n" + +#: lib/diff.tcl:233 +#, tcl-format +msgid "" +"\n" +"* Untracked file clipped here by %s.\n" +"* To see the entire file, use an external editor.\n" +msgstr "" +"\n" +"⃠ÐеÑледениÑÑ‚ файл е отрÑзан дотук %s.\n" +"⃠Използвайте външен редактор, за да видите Ñ†ÐµÐ»Ð¸Ñ Ñ„Ð°Ð¹Ð».\n" + +#: lib/diff.tcl:338 lib/blame.tcl:1128 +msgid "Error loading diff:" +msgstr "Грешка при зареждане на разлика:" + +#: lib/diff.tcl:557 +msgid "Failed to unstage selected hunk." +msgstr "Избраното парче не може да бъде извадено от индекÑа." + +#: lib/diff.tcl:564 +msgid "Failed to stage selected hunk." +msgstr "Избраното парче не може да бъде добавен към индекÑа." + +#: lib/diff.tcl:643 +msgid "Failed to unstage selected line." +msgstr "ИзбраниÑÑ‚ ред не може да бъде изваден от индекÑа." + +#: lib/diff.tcl:651 +msgid "Failed to stage selected line." +msgstr "ИзбраниÑÑ‚ ред не може да бъде добавен към индекÑа." + +#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "Изтриване на Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: lib/remote_branch_delete.tcl:48 +msgid "From Repository" +msgstr "От хранилище" + +#: lib/remote_branch_delete.tcl:88 +msgid "Branches" +msgstr "Клонове" + +#: lib/remote_branch_delete.tcl:110 +msgid "Delete Only If" +msgstr "Изтриване, Ñамо ако" + +#: lib/remote_branch_delete.tcl:112 +msgid "Merged Into:" +msgstr "СлÑÑ‚ в:" + +#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53 +msgid "Always (Do not perform merge checks)" +msgstr "Винаги (без проверка за Ñливане)" + +#: lib/remote_branch_delete.tcl:153 +msgid "A branch is required for 'Merged Into'." +msgstr "За данните „СлÑÑ‚ в“ е необходимо да зададете клон." + +#: lib/remote_branch_delete.tcl:185 +#, tcl-format +msgid "" +"The following branches are not completely merged into %s:\n" +"\n" +" - %s" +msgstr "" +"Следните клони не Ñа Ñлети напълно в „%s“:\n" +"\n" +" ⃠%s" + +#: lib/remote_branch_delete.tcl:190 +#, tcl-format +msgid "" +"One or more of the merge tests failed because you have not fetched the " +"necessary commits. Try fetching from %s first." +msgstr "" +"Поне една от пробите за Ñливане е неуÑпешна, защото не Ñте доÑтавили вÑички " +"необходими подаваниÑ. Пробвайте първо да доÑтавите подаваниÑта от „%s“." + +#: lib/remote_branch_delete.tcl:208 +msgid "Please select one or more branches to delete." +msgstr "Изберете поне един клон за изтриване." + +#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 +msgid "" +"Recovering deleted branches is difficult.\n" +"\n" +"Delete the selected branches?" +msgstr "" +"ВъзÑтановÑването на изтрити клони може да е трудно.\n" +"\n" +"Сигурни ли Ñте, че иÑкате да триете?" + +#: lib/remote_branch_delete.tcl:227 +#, tcl-format +msgid "Deleting branches from %s" +msgstr "Изтриване на клони от „%s“" + +#: lib/remote_branch_delete.tcl:300 +msgid "No repository selected." +msgstr "Ðе е избрано хранилище." + +#: lib/remote_branch_delete.tcl:305 +#, tcl-format +msgid "Scanning %s..." +msgstr "ПретърÑване на „%s“…" + +#: lib/choose_repository.tcl:32 +msgid "Git Gui" +msgstr "ГПИ на Git" + +#: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396 +msgid "Create New Repository" +msgstr "Създаване на ново хранилище" + +#: lib/choose_repository.tcl:97 +msgid "New..." +msgstr "Ðово…" + +#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480 +msgid "Clone Existing Repository" +msgstr "Клониране на ÑъщеÑтвуващо хранилище" + +#: lib/choose_repository.tcl:115 +msgid "Clone..." +msgstr "Клониране…" + +#: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019 +msgid "Open Existing Repository" +msgstr "ОтварÑне на ÑъщеÑтвуващо хранилище" + +#: lib/choose_repository.tcl:128 +msgid "Open..." +msgstr "ОтварÑне…" + +#: lib/choose_repository.tcl:141 +msgid "Recent Repositories" +msgstr "Скоро ползвани" + +#: lib/choose_repository.tcl:147 +msgid "Open Recent Repository:" +msgstr "ОтварÑне на хранилище ползвано наÑкоро:" + +#: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322 +#: lib/choose_repository.tcl:329 +#, tcl-format +msgid "Failed to create repository %s:" +msgstr "ÐеуÑпешно Ñъздаване на хранилището „%s“:" + +#: lib/choose_repository.tcl:391 lib/branch_create.tcl:33 +msgid "Create" +msgstr "Създаване" + +#: lib/choose_repository.tcl:401 +msgid "Directory:" +msgstr "ДиректориÑ:" + +#: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552 +#: lib/choose_repository.tcl:1053 +msgid "Git Repository" +msgstr "Хранилище на Git" + +#: lib/choose_repository.tcl:456 +#, tcl-format +msgid "Directory %s already exists." +msgstr "Вече ÑъщеÑтвува Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ â€ž%s“." + +#: lib/choose_repository.tcl:460 +#, tcl-format +msgid "File %s already exists." +msgstr "Вече ÑъщеÑтвува файл „%s“." + +#: lib/choose_repository.tcl:475 +msgid "Clone" +msgstr "Клониране" + +#: lib/choose_repository.tcl:488 +msgid "Source Location:" +msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð° източника:" + +#: lib/choose_repository.tcl:497 +msgid "Target Directory:" +msgstr "Целева директориÑ:" + +#: lib/choose_repository.tcl:507 +msgid "Clone Type:" +msgstr "Вид клониране:" + +#: lib/choose_repository.tcl:512 +msgid "Standard (Fast, Semi-Redundant, Hardlinks)" +msgstr "Стандартно (бързо, чаÑтично ÑподелÑне на файлове, твърди връзки)" + +#: lib/choose_repository.tcl:517 +msgid "Full Copy (Slower, Redundant Backup)" +msgstr "Пълно (бавно, пълноценно резервно копие)" + +#: lib/choose_repository.tcl:522 +msgid "Shared (Fastest, Not Recommended, No Backup)" +msgstr "Споделено (най-бързо, не Ñе препоръчва, не прави резервно копие)" + +#: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605 +#: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821 +#: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067 +#, tcl-format +msgid "Not a Git repository: %s" +msgstr "Това не е хранилище на Git: %s" + +#: lib/choose_repository.tcl:594 +msgid "Standard only available for local repository." +msgstr "Само локални хранилища могат да Ñе клонират Ñтандартно" + +#: lib/choose_repository.tcl:598 +msgid "Shared only available for local repository." +msgstr "Само локални хранилища могат да Ñе клонират Ñподелено" + +#: lib/choose_repository.tcl:619 +#, tcl-format +msgid "Location %s already exists." +msgstr "Вече ÑъщеÑтвува меÑтоположението „%s“." + +#: lib/choose_repository.tcl:630 +msgid "Failed to configure origin" +msgstr "ÐеуÑпешно наÑтройване на хранилището-източник" + +#: lib/choose_repository.tcl:642 +msgid "Counting objects" +msgstr "ПреброÑване на обекти" + +#: lib/choose_repository.tcl:643 +msgid "buckets" +msgstr "клетки" + +#: lib/choose_repository.tcl:667 +#, tcl-format +msgid "Unable to copy objects/info/alternates: %s" +msgstr "Обектите/информациÑта/Ñинонимите не могат да бъдат копирани: %s" + +#: lib/choose_repository.tcl:703 +#, tcl-format +msgid "Nothing to clone from %s." +msgstr "ÐÑма какво да Ñе клонира от „%s“." + +#: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919 +#: lib/choose_repository.tcl:931 +msgid "The 'master' branch has not been initialized." +msgstr "ОÑновниÑÑ‚ клон — „master“ не е инициализиран." + +#: lib/choose_repository.tcl:718 +msgid "Hardlinks are unavailable. Falling back to copying." +msgstr "Ðе Ñе поддържат твърди връзки. Преминава Ñе към копиране." + +#: lib/choose_repository.tcl:730 +#, tcl-format +msgid "Cloning from %s" +msgstr "Клониране на „%s“" + +#: lib/choose_repository.tcl:761 +msgid "Copying objects" +msgstr "Копиране на обекти" + +#: lib/choose_repository.tcl:762 +msgid "KiB" +msgstr "KiB" + +#: lib/choose_repository.tcl:786 +#, tcl-format +msgid "Unable to copy object: %s" +msgstr "ÐеуÑпешно копиране на обект: %s" + +#: lib/choose_repository.tcl:796 +msgid "Linking objects" +msgstr "Създаване на връзки към обектите" + +#: lib/choose_repository.tcl:797 +msgid "objects" +msgstr "обекти" + +#: lib/choose_repository.tcl:805 +#, tcl-format +msgid "Unable to hardlink object: %s" +msgstr "ÐеуÑпешно Ñъздаване на твърда връзка към обект: %s" + +#: lib/choose_repository.tcl:860 +msgid "Cannot fetch branches and objects. See console output for details." +msgstr "" +"Клоните и обектите не могат да бъдат изтеглени. За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ " +"погледнете изхода на конзолата." + +#: lib/choose_repository.tcl:871 +msgid "Cannot fetch tags. See console output for details." +msgstr "" +"Етикетите не могат да бъдат изтеглени. За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ‚Ðµ " +"изхода на конзолата." + +#: lib/choose_repository.tcl:895 +msgid "Cannot determine HEAD. See console output for details." +msgstr "" +"Върхът HEAD не може да бъде определен. За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ‚Ðµ " +"изхода на конзолата." + +#: lib/choose_repository.tcl:904 +#, tcl-format +msgid "Unable to cleanup %s" +msgstr "Ðе може да Ñе зачиÑти „%s“" + +#: lib/choose_repository.tcl:910 +msgid "Clone failed." +msgstr "ÐеуÑпешно клониране." + +#: lib/choose_repository.tcl:917 +msgid "No default branch obtained." +msgstr "Ðе е получен клон по подразбиране." + +#: lib/choose_repository.tcl:928 +#, tcl-format +msgid "Cannot resolve %s as a commit." +msgstr "ÐÑма подаване отговарÑщо на „%s“." + +#: lib/choose_repository.tcl:940 +msgid "Creating working directory" +msgstr "Създаване на работната директориÑ" + +#: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136 +#: lib/index.tcl:207 +msgid "files" +msgstr "файлове" + +#: lib/choose_repository.tcl:970 +msgid "Initial file checkout failed." +msgstr "ÐеуÑпешно първоначално изтеглÑне." + +#: lib/choose_repository.tcl:1014 +msgid "Open" +msgstr "ОтварÑне" + +#: lib/choose_repository.tcl:1024 +msgid "Repository:" +msgstr "Хранилище:" + +#: lib/choose_repository.tcl:1073 +#, tcl-format +msgid "Failed to open repository %s:" +msgstr "ÐеуÑпешно отварÑне на хранилището „%s“:" + +#: lib/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "git-gui — графичен Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð° Git." + +#: lib/checkout_op.tcl:85 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "ДоÑтавÑне на „%s“ от „%s“" + +#: lib/checkout_op.tcl:133 +#, tcl-format +msgid "fatal: Cannot resolve %s" +msgstr "фатална грешка: „%s“ не може да Ñе открие" + +#: lib/checkout_op.tcl:175 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Клонът „%s“ не ÑъщеÑтвува." + +#: lib/checkout_op.tcl:194 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "ÐеуÑпешно наÑтройване на опроÑтен git-pull за „%s“." + +#: lib/checkout_op.tcl:229 +#, tcl-format +msgid "" +"Branch '%s' already exists.\n" +"\n" +"It cannot fast-forward to %s.\n" +"A merge is required." +msgstr "" +"Клонът „%s“ ÑъщеÑтвува.\n" +"\n" +"Той не може да бъде тривиално превъртÑн до %s.\n" +"Ðеобходимо е Ñливане." + +#: lib/checkout_op.tcl:243 +#, tcl-format +msgid "Merge strategy '%s' not supported." +msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ð·Ð° Ñливане „%s“ не Ñе поддържа." + +#: lib/checkout_op.tcl:262 +#, tcl-format +msgid "Failed to update '%s'." +msgstr "ÐеуÑпешно обновÑване на „%s“." + +#: lib/checkout_op.tcl:274 +msgid "Staging area (index) is already locked." +msgstr "ИндекÑÑŠÑ‚ вече е заключен." + +#: lib/checkout_op.tcl:289 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before the current branch can be changed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"СъÑтоÑнието при поÑледната проверка не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° ÑÑŠÑтоÑнието на " +"хранилището.\n" +"\n" +"ÐÑкой друг Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° Git е променил хранилището междувременно. СъÑтоÑнието " +"трÑбва да бъде проверено, преди да Ñе премине към нов клон.\n" +"\n" +"Ðвтоматично ще започне нова проверка.\n" + +#: lib/checkout_op.tcl:345 +#, tcl-format +msgid "Updating working directory to '%s'..." +msgstr "Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñе привежда към „%s“…" + +#: lib/checkout_op.tcl:346 +msgid "files checked out" +msgstr "файла Ñа изтеглени" + +#: lib/checkout_op.tcl:376 +#, tcl-format +msgid "Aborted checkout of '%s' (file level merging is required)." +msgstr "" +"ПреуÑтановÑване на изтеглÑнето на „%s“ (необходимо е пофайлово Ñливане)." + +#: lib/checkout_op.tcl:377 +msgid "File level merge required." +msgstr "Ðеобходимо е пофайлово Ñливане." + +#: lib/checkout_op.tcl:381 +#, tcl-format +msgid "Staying on branch '%s'." +msgstr "ОÑтаване върху клона „%s“." + +#: lib/checkout_op.tcl:452 +msgid "" +"You are no longer on a local branch.\n" +"\n" +"If you wanted to be on a branch, create one now starting from 'This Detached " +"Checkout'." +msgstr "" +"Вече не Ñте на локален клон.\n" +"\n" +"Ðко иÑкате да Ñте на клон, Ñъздайте базиран на „Това неÑвързано изтеглÑне“." + +#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 +#, tcl-format +msgid "Checked out '%s'." +msgstr "„%s“ е изтеглен." + +#: lib/checkout_op.tcl:535 +#, tcl-format +msgid "Resetting '%s' to '%s' will lose the following commits:" +msgstr "" +"ЗанулÑването на „%s“ към „%s“ ще доведе до загубването на Ñледните подаваниÑ:" + +#: lib/checkout_op.tcl:557 +msgid "Recovering lost commits may not be easy." +msgstr "ВъзÑтановÑването на загубените Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да е трудно." + +#: lib/checkout_op.tcl:562 +#, tcl-format +msgid "Reset '%s'?" +msgstr "ЗанулÑване на „%s“?" + +#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 +msgid "Reset" +msgstr "Отначало" + +#: lib/checkout_op.tcl:635 +#, tcl-format +msgid "" +"Failed to set current branch.\n" +"\n" +"This working directory is only partially switched. We successfully updated " +"your files, but failed to update an internal Git file.\n" +"\n" +"This should not have occurred. %s will now close and give up." +msgstr "" +"ÐеуÑпешно задаване на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½.\n" +"\n" +"Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ðµ Ñамо чаÑтично обновена: файловете Ñа обновени " +"уÑпешно, но нÑкой от вътрешните, Ñлужебни файлове на Git не е бил.\n" +"\n" +"Това ÑÑŠÑтоÑние е аварийно и не трÑбва да Ñе Ñлучва. Програмата „%s“ ще " +"преуÑтанови работа." + +#: lib/branch_create.tcl:23 +msgid "Create Branch" +msgstr "Създаване на клон" + +#: lib/branch_create.tcl:28 +msgid "Create New Branch" +msgstr "Създаване на нов клон" + +#: lib/branch_create.tcl:42 +msgid "Branch Name" +msgstr "Име на клона" + +#: lib/branch_create.tcl:57 +msgid "Match Tracking Branch Name" +msgstr "Съвпадане по името на ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "Ðачална верÑиÑ" + +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "ОбновÑване на ÑъщеÑтвуващ клон:" + +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "Ðе" + +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "Само тривиално превъртащо Ñливане" + +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "Преминаване към клона Ñлед Ñъздаването му" + +#: lib/branch_create.tcl:132 +msgid "Please select a tracking branch." +msgstr "Изберете клон за Ñледени." + +#: lib/branch_create.tcl:141 +#, tcl-format +msgid "Tracking branch %s is not a branch in the remote repository." +msgstr "Клонът, който Ñе Ñледи „%s“ не ÑъщеÑтвува в отдалеченото хранилище." + +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "Ð’ момента Ñе извършва дейÑтвие, изчакайте…" + +#: lib/console.tcl:186 +msgid "Success" +msgstr "УÑпех" + +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Грешка: неуÑпешно изпълнение на команда" + +#: lib/choose_rev.tcl:52 +msgid "This Detached Checkout" +msgstr "Това неÑвързано изтеглÑне" + +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" +msgstr "Израз за верÑиÑ" + +#: lib/choose_rev.tcl:72 +msgid "Local Branch" +msgstr "Локален клон" + +#: lib/choose_rev.tcl:77 +msgid "Tracking Branch" +msgstr "СледÑщ клон" + +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 +msgid "Tag" +msgstr "Етикет" + +#: lib/choose_rev.tcl:321 +#, tcl-format +msgid "Invalid revision: %s" +msgstr "Ðеправилна верÑиÑ: %s" + +#: lib/choose_rev.tcl:342 +msgid "No revision selected." +msgstr "Ðе е избрана верÑиÑ." + +#: lib/choose_rev.tcl:350 +msgid "Revision expression is empty." +msgstr "Изразът за верÑÐ¸Ñ Ðµ празен." + +#: lib/choose_rev.tcl:537 +msgid "Updated" +msgstr "Обновен" + +#: lib/choose_rev.tcl:565 +msgid "URL" +msgstr "ÐдреÑ" + +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "Към ред:" + +#: lib/line.tcl:23 +msgid "Go" +msgstr "Придвижване" + +#: lib/commit.tcl:9 +msgid "" +"There is nothing to amend.\n" +"\n" +"You are about to create the initial commit. There is no commit before this " +"to amend.\n" +msgstr "" +"ÐÑма какво да Ñе поправи.\n" +"\n" +"Ще Ñъздадете първоначалното подаване. Преди него нÑма други подаваниÑ, които " +"да поправите.\n" + +#: lib/commit.tcl:18 +msgid "" +"Cannot amend while merging.\n" +"\n" +"You are currently in the middle of a merge that has not been fully " +"completed. You cannot amend the prior commit unless you first abort the " +"current merge activity.\n" +msgstr "" +"По време на Ñливане не може да поправÑте.\n" +"\n" +"Ð’ момента вÑе още не Ñте завършили Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾ Ñливане. Ðе може да поправите " +"предишното подаване, оÑвен ако първо не преуÑтановите текущото Ñливане.\n" + +#: lib/commit.tcl:48 +msgid "Error loading commit data for amend:" +msgstr "Грешка при зареждане на данните от подаване, които да Ñе поправÑÑ‚:" + +#: lib/commit.tcl:75 +msgid "Unable to obtain your identity:" +msgstr "ИдентификациÑта ви не може да бъде определена:" + +#: lib/commit.tcl:80 +msgid "Invalid GIT_COMMITTER_IDENT:" +msgstr "Ðеправилно поле GIT_COMMITTER_IDENT:" + +#: lib/commit.tcl:129 +#, tcl-format +msgid "warning: Tcl does not support encoding '%s'." +msgstr "предупреждение: Tcl не поддържа кодирането „%s“." + +#: lib/commit.tcl:149 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before another commit can be created.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"СъÑтоÑнието при поÑледната проверка не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° ÑÑŠÑтоÑнието на " +"хранилището.\n" +"\n" +"ÐÑкой друг Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° Git е променил хранилището междувременно. СъÑтоÑнието " +"трÑбва да бъде проверено преди ново подаване.\n" +"\n" +"Ðвтоматично ще започне нова проверка.\n" + +#: lib/commit.tcl:173 +#, tcl-format +msgid "" +"Unmerged files cannot be committed.\n" +"\n" +"File %s has merge conflicts. You must resolve them and stage the file " +"before committing.\n" +msgstr "" +"ÐеÑлетите файлове не могат да бъдат подавани.\n" +"\n" +"Във файла „%s“ има конфликти при Ñливане. За да го подадете, трÑбва първо да " +"коригирате конфликтите и да добавите файла към индекÑа за подаване.\n" + +#: lib/commit.tcl:181 +#, tcl-format +msgid "" +"Unknown file state %s detected.\n" +"\n" +"File %s cannot be committed by this program.\n" +msgstr "" +"Ðепознато ÑÑŠÑтоÑние на файл „%s“.\n" +"\n" +"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n" + +#: lib/commit.tcl:189 +msgid "" +"No changes to commit.\n" +"\n" +"You must stage at least 1 file before you can commit.\n" +msgstr "" +"ÐÑма промени за подаване.\n" +"\n" +"ТрÑбва да добавите поне 1 файл към индекÑа, преди да подадете.\n" + +#: lib/commit.tcl:204 +msgid "" +"Please supply a commit message.\n" +"\n" +"A good commit message has the following format:\n" +"\n" +"- First line: Describe in one sentence what you did.\n" +"- Second line: Blank\n" +"- Remaining lines: Describe why this change is good.\n" +msgstr "" +"Задайте добро Ñъобщение при подаване.\n" +"\n" +"Използвайте ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚:\n" +"\n" +"⃠Първи ред: опиÑание в едно изречение на промÑната.\n" +"⃠Втори ред: празен.\n" +"⃠ОÑтаналите редове: опишете защо Ñе налага тази промÑна.\n" + +#: lib/commit.tcl:235 +msgid "Calling pre-commit hook..." +msgstr "ИзпълнÑване на куката преди подаване…" + +#: lib/commit.tcl:250 +msgid "Commit declined by pre-commit hook." +msgstr "Подаването е отхвърлено от куката преди подаване." + +#: lib/commit.tcl:269 +msgid "" +"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 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" +" Do you really want to proceed with your Commit?" +msgstr "" +"Ще подадете към неÑвързан връх. Това дейÑтвие е опаÑно, защото при " +"преминаването към който и да е клон ще загубите промените Ñи и не е Ñигурно, " +"че ще можете по-къÑно да ги възÑтановите чрез журнала на указателите. Ðай-" +"вероÑтно трÑбва първо да Ñъздадете клон базиран на текущото ÑÑŠÑтоÑние и да " +"подадете към него.\n" +" \n" +"Сигурни ли Ñте, че иÑкате да подадете точно Ñега?" + +#: lib/commit.tcl:290 +msgid "Calling commit-msg hook..." +msgstr "ИзпълнÑване на куката за Ñъобщението при подаване…" + +#: lib/commit.tcl:305 +msgid "Commit declined by commit-msg hook." +msgstr "Подаването е отхвърлено от куката за Ñъобщението при подаване." + +#: lib/commit.tcl:318 +msgid "Committing changes..." +msgstr "Подаване на промените." + +#: lib/commit.tcl:334 +msgid "write-tree failed:" +msgstr "неуÑпешно запазване на дървото (write-tree):" + +#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 +msgid "Commit failed." +msgstr "ÐеуÑпешно подаване." + +#: lib/commit.tcl:352 +#, tcl-format +msgid "Commit %s appears to be corrupt" +msgstr "Подаването „%s“ изглежда повредено" + +#: lib/commit.tcl:357 +msgid "" +"No changes to commit.\n" +"\n" +"No files were modified by this commit and it was not a merge commit.\n" +"\n" +"A rescan will be automatically started now.\n" +msgstr "" +"ÐÑма промени за подаване.\n" +"\n" +"Ð’ това подаване не Ñа променÑни никакви файлове, а и не е подаване ÑÑŠÑ " +"Ñливане.\n" +"\n" +"Ðвтоматично ще започне нова проверка.\n" + +#: lib/commit.tcl:364 +msgid "No changes to commit." +msgstr "ÐÑма промени за подаване." + +#: lib/commit.tcl:378 +msgid "commit-tree failed:" +msgstr "неуÑпешно подаване на дървото (commit-tree):" + +#: lib/commit.tcl:399 +msgid "update-ref failed:" +msgstr "неуÑпешно обновÑване на указателите (update-ref):" + +#: lib/commit.tcl:492 +#, tcl-format +msgid "Created commit %s: %s" +msgstr "УÑпешно подаване %s: %s" + +#: lib/branch_delete.tcl:16 +msgid "Delete Branch" +msgstr "Изтриване на клон" + +#: lib/branch_delete.tcl:21 +msgid "Delete Local Branch" +msgstr "Изтриване на локален клон" + +#: lib/branch_delete.tcl:39 +msgid "Local Branches" +msgstr "Локални клони" + +#: lib/branch_delete.tcl:51 +msgid "Delete Only If Merged Into" +msgstr "Изтриване, Ñамо ако промените Ñа Ñлети и другаде" + +#: lib/branch_delete.tcl:103 +#, tcl-format +msgid "The following branches are not completely merged into %s:" +msgstr "Ðе вÑички промени в клоните Ñа Ñлети в %s:" + +#: lib/branch_delete.tcl:141 +#, tcl-format +msgid "" +"Failed to delete branches:\n" +"%s" +msgstr "" +"ÐеуÑпешно триене на клони:\n" +"%s" + +#: lib/blame.tcl:73 +msgid "File Viewer" +msgstr "Преглед на файлове" + +#: lib/blame.tcl:79 +msgid "Commit:" +msgstr "Подаване:" + +#: lib/blame.tcl:280 +msgid "Copy Commit" +msgstr "Копиране на подаване" + +#: lib/blame.tcl:284 +msgid "Find Text..." +msgstr "ТърÑене на текÑт…" + +#: lib/blame.tcl:288 +msgid "Goto Line..." +msgstr "Към ред…" + +#: lib/blame.tcl:297 +msgid "Do Full Copy Detection" +msgstr "Пълно търÑене на копиране" + +#: lib/blame.tcl:301 +msgid "Show History Context" +msgstr "Показване на контекÑта от иÑториÑта" + +#: lib/blame.tcl:304 +msgid "Blame Parent Commit" +msgstr "Ðнотиране на родителÑкото подаване" + +#: lib/blame.tcl:466 +#, tcl-format +msgid "Reading %s..." +msgstr "%s Ñе чете…" + +#: lib/blame.tcl:594 +msgid "Loading copy/move tracking annotations..." +msgstr "Зареждане на анотациите за проÑледÑване на копирането/премеÑтването…" + +#: lib/blame.tcl:614 +msgid "lines annotated" +msgstr "реда анотирани" + +#: lib/blame.tcl:806 +msgid "Loading original location annotations..." +msgstr "Зареждане на анотациите за първоначалното меÑтоположение…" + +#: lib/blame.tcl:809 +msgid "Annotation complete." +msgstr "Ðнотирането завърши." + +#: lib/blame.tcl:839 +msgid "Busy" +msgstr "ОперациÑта не е завършила" + +#: lib/blame.tcl:840 +msgid "Annotation process is already running." +msgstr "Ð’ момента тече Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° анотиране." + +#: lib/blame.tcl:879 +msgid "Running thorough copy detection..." +msgstr "ИзпълнÑва Ñе цÑлоÑтен Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° откриване на копиране…" + +#: lib/blame.tcl:947 +msgid "Loading annotation..." +msgstr "Зареждане на анотации…" + +#: lib/blame.tcl:1000 +msgid "Author:" +msgstr "Ðвтор:" + +#: lib/blame.tcl:1004 +msgid "Committer:" +msgstr "Подал:" + +#: lib/blame.tcl:1009 +msgid "Original File:" +msgstr "Първоначален файл:" + +#: lib/blame.tcl:1057 +msgid "Cannot find HEAD commit:" +msgstr "Подаването за връх HEAD не може да Ñе открие:" + +#: lib/blame.tcl:1112 +msgid "Cannot find parent commit:" +msgstr "РодителÑкото подаване не може да бъде открито" + +#: lib/blame.tcl:1127 +msgid "Unable to display parent" +msgstr "РодителÑÑ‚ не може да бъде показан" + +#: lib/blame.tcl:1269 +msgid "Originally By:" +msgstr "Първоначално от:" + +#: lib/blame.tcl:1275 +msgid "In File:" +msgstr "Във файл:" + +#: lib/blame.tcl:1280 +msgid "Copied Or Moved Here By:" +msgstr "Копирано или премеÑтено тук от:" + +#: lib/index.tcl:6 +msgid "Unable to unlock the index." +msgstr "ИндекÑÑŠÑ‚ не може да бъде отключен." + +#: lib/index.tcl:17 +msgid "Index Error" +msgstr "Грешка в индекÑа" + +#: lib/index.tcl:19 +msgid "" +"Updating the Git index failed. A rescan will be automatically started to " +"resynchronize git-gui." +msgstr "" +"ÐеуÑпешно обновÑване на индекÑа на Git. Ðвтоматично ще започне нова проверка " +"за Ñинхронизирането на git-gui." + +#: lib/index.tcl:30 +msgid "Continue" +msgstr "Продължаване" + +#: lib/index.tcl:33 +msgid "Unlock Index" +msgstr "Отключване на индекÑа" + +#: lib/index.tcl:298 +#, tcl-format +msgid "Unstaging %s from commit" +msgstr "Изваждане на %s от подаването" + +#: lib/index.tcl:337 +msgid "Ready to commit." +msgstr "ГотовноÑÑ‚ за подаване." + +#: lib/index.tcl:350 +#, tcl-format +msgid "Adding %s" +msgstr "ДобавÑне на „%s“" + +#: lib/index.tcl:380 +#, tcl-format +msgid "Stage %d untracked files?" +msgstr "Да Ñе добавÑÑ‚ ли %d на брой неÑледени файла към индекÑа?" + +#: lib/index.tcl:428 +#, tcl-format +msgid "Revert changes in file %s?" +msgstr "Да Ñе махнат ли промените във файла „%s“?" + +#: lib/index.tcl:430 +#, tcl-format +msgid "Revert changes in these %i files?" +msgstr "Да Ñе махнат ли промените в тези %i файла?" + +#: lib/index.tcl:438 +msgid "Any unstaged changes will be permanently lost by the revert." +msgstr "" +"Ð’Ñички промени, които не Ñа били вкарани в индекÑа, ще бъдат безвъзвратно " +"загубени." + +#: lib/index.tcl:441 +msgid "Do Nothing" +msgstr "Ðищо да не Ñе прави" + +#: lib/index.tcl:459 +msgid "Reverting selected files" +msgstr "Махане на промените в избраните файлове" + +#: lib/index.tcl:463 +#, tcl-format +msgid "Reverting %s" +msgstr "Махане на промените в „%s“" + +#: lib/encoding.tcl:443 +msgid "Default" +msgstr "Стандартното" + +#: lib/encoding.tcl:448 +#, tcl-format +msgid "System (%s)" +msgstr "СиÑтемното (%s)" + +#: lib/encoding.tcl:459 lib/encoding.tcl:465 +msgid "Other" +msgstr "Друго" + +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Ðеправилни данни от Git: %s" + +#: lib/database.tcl:42 +msgid "Number of loose objects" +msgstr "Брой непакетирани обекти" + +#: lib/database.tcl:43 +msgid "Disk space used by loose objects" +msgstr "ДиÑково проÑтранÑтво заето от непакетирани обекти" + +#: lib/database.tcl:44 +msgid "Number of packed objects" +msgstr "Брой пакетирани обекти" + +#: lib/database.tcl:45 +msgid "Number of packs" +msgstr "Брой пакети" + +#: lib/database.tcl:46 +msgid "Disk space used by packed objects" +msgstr "ДиÑково проÑтранÑтво заето от пакетирани обекти" + +#: lib/database.tcl:47 +msgid "Packed objects waiting for pruning" +msgstr "Пакетирани обекти за окаÑтрÑне" + +#: lib/database.tcl:48 +msgid "Garbage files" +msgstr "Файлове за боклука" + +#: lib/database.tcl:72 +msgid "Compressing the object database" +msgstr "КомпреÑиране на базата Ñ Ð´Ð°Ð½Ð½Ð¸ за обектите" + +#: lib/database.tcl:83 +msgid "Verifying the object database with fsck-objects" +msgstr "Проверка на базата Ñ Ð´Ð°Ð½Ð½Ð¸ за обектите Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð°Ñ‚Ð° fsck-objects" + +#: lib/database.tcl:107 +#, tcl-format +msgid "" +"This repository currently has approximately %i loose objects.\n" +"\n" +"To maintain optimal performance it is strongly recommended that you compress " +"the database.\n" +"\n" +"Compress the database now?" +msgstr "" +"Ð’ това хранилище в момента има към %i непакетирани обекти.\n" +"\n" +"Зd добра производителноÑÑ‚ Ñе препоръчва да компреÑирате базата Ñ Ð´Ð°Ð½Ð½Ð¸ за " +"обектите.\n" +"\n" +"Да Ñе започне ли компреÑирането?" + +#: lib/error.tcl:20 lib/error.tcl:116 +msgid "error" +msgstr "грешка" + +#: lib/error.tcl:36 +msgid "warning" +msgstr "предупреждение" + +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." +msgstr "Преди да можете да подадете, оправете горните грешки." + +#: lib/merge.tcl:13 +msgid "" +"Cannot merge while amending.\n" +"\n" +"You must finish amending this commit before starting any type of merge.\n" +msgstr "" +"По време на поправÑне не може да Ñливане.\n" +"\n" +"ТрÑбва да завършите поправÑнето на текущото подаване, преди да започнете " +"Ñливане.\n" + +#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"ПоÑледно уÑтановеното ÑÑŠÑтоÑние не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° това в хранилището.\n" +"\n" +"ÐÑкой друг Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° Git е променил хранилището междувременно. СъÑтоÑнието " +"трÑбва да бъде проверено, преди да Ñе извърши Ñливане.\n" +"\n" +"Ðвтоматично ще започне нова проверка.\n" +"\n" + +#: lib/merge.tcl:45 +#, tcl-format +msgid "" +"You are in the middle of a conflicted merge.\n" +"\n" +"File %s has merge conflicts.\n" +"\n" +"You must resolve them, stage the file, and commit to complete the current " +"merge. Only then can you begin another merge.\n" +msgstr "" +"Ð’ момента тече Ñливане, но има конфликти.\n" +"\n" +"Погледнете файла „%s“.\n" +"\n" +"ТрÑбва да коригирате конфликтите в него, да го добавите към индекÑа и да " +"завършите текущото Ñливане чрез подаване. Чак тогава може да започнете ново " +"Ñливане.\n" + +#: lib/merge.tcl:55 +#, tcl-format +msgid "" +"You are in the middle of a change.\n" +"\n" +"File %s is modified.\n" +"\n" +"You should complete the current commit before starting a merge. Doing so " +"will help you abort a failed merge, should the need arise.\n" +msgstr "" +"Ð’ момента тече подаване.\n" +"\n" +"Файлът „%s“ е променен.\n" +"\n" +"ТрÑбва да завършите текущото подаване, преди да започнете Ñливане. Така ще " +"можете леÑно да преуÑтановите Ñливането, ако възникне нужда.\n" + +#: lib/merge.tcl:108 +#, tcl-format +msgid "%s of %s" +msgstr "%s от общо %s" + +#: lib/merge.tcl:122 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "Сливане на „%s“ и „%s“…" + +#: lib/merge.tcl:133 +msgid "Merge completed successfully." +msgstr "Сливането завърши уÑпешно." + +#: lib/merge.tcl:135 +msgid "Merge failed. Conflict resolution is required." +msgstr "ÐеуÑпешно Ñливане — има конфликти за коригиране." + +#: lib/merge.tcl:160 +#, tcl-format +msgid "Merge Into %s" +msgstr "Сливане в „%s“" + +#: lib/merge.tcl:179 +msgid "Revision To Merge" +msgstr "ВерÑÐ¸Ñ Ð·Ð° Ñливане" + +#: lib/merge.tcl:214 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"ПоправÑнето не може да бъде преуÑтановено.\n" +"\n" +"ТрÑбва да завършите поправката на това подаване.\n" + +#: lib/merge.tcl:224 +msgid "" +"Abort merge?\n" +"\n" +"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with aborting the current merge?" +msgstr "" +"Да Ñе преуÑтанови ли Ñливането?\n" +"\n" +"Ð’ такъв Ñлучай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"ÐаиÑтина ли да Ñе преуÑтанови Ñливането?" + +#: lib/merge.tcl:230 +msgid "" +"Reset changes?\n" +"\n" +"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with resetting the current changes?" +msgstr "" +"Да Ñе занулÑÑ‚ ли промените?\n" +"\n" +"Ð’ такъв Ñлучай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"ÐаиÑтина ли да Ñе занулÑÑ‚ промените?" + +#: lib/merge.tcl:241 +msgid "Aborting" +msgstr "ПреуÑтановÑване" + +#: lib/merge.tcl:241 +msgid "files reset" +msgstr "файла ÑÑŠÑ Ð·Ð°Ð½ÑƒÐ»ÐµÐ½Ð¸ промени" + +#: lib/merge.tcl:269 +msgid "Abort failed." +msgstr "ÐеуÑпешно преуÑтановÑване." + +#: lib/merge.tcl:271 +msgid "Abort completed. Ready." +msgstr "УÑпешно преуÑтановÑване. ГотовноÑÑ‚ за Ñледващо дейÑтвие." diff --git a/git-gui/po/glossary/bg.po b/git-gui/po/glossary/bg.po new file mode 100644 index 0000000000..8b71fad9a5 --- /dev/null +++ b/git-gui/po/glossary/bg.po @@ -0,0 +1,287 @@ +# Bulgarian translation of git-gui-glossary po-file. +# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: git-gui-glossary master\n" +"POT-Creation-Date: 2014-01-13 21:39+0200\n" +"PO-Revision-Date: 2014-01-13 21:39+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" +msgid "" +"English Term (Dear translator: This file will never be visible to the user!)" +msgstr "Термин" + +#. "" +msgid "amend" +msgstr "поправÑм" + +#. "" +msgid "annotate" +msgstr "анотирам" + +#. "A 'branch' is an active line of development." +msgid "branch [noun]" +msgstr "клон, разклонение [ÑъщеÑтвително]" + +#. "" +msgid "branch [verb]" +msgstr "разклонÑвам [глагол]" + +#. "" +msgid "checkout [noun]" +msgstr "изтеглÑне [ÑъщеÑтвително]" + +#. "The action of updating the working tree to a revision which was stored in the object database." +msgid "checkout [verb]" +msgstr "изтеглÑне [глагол]" + +#. "" +msgid "clone [verb]" +msgstr "клонирам [глагол]" + +#. "A single point in the git history." +msgid "commit [noun]" +msgstr "подаване [ÑъщеÑтвително]" + +#. "The action of storing a new snapshot of the project's state in the git history." +msgid "commit [verb]" +msgstr "подавам [ÑъщеÑтвително]" + +#. "" +msgid "diff [noun]" +msgstr "разлика/промени [ÑъщеÑтвително]" + +#. "" +msgid "diff [verb]" +msgstr "изчиÑлÑвам разлика/промени [глагол]" + +#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." +msgid "fast forward merge" +msgstr "превъртащо/директно/тривиално Ñливане" + +#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." +msgid "fetch" +msgstr "доÑтавÑне" + +#. "One context of consecutive lines in a whole patch, which consists of many such hunks" +msgid "hunk" +msgstr "парче" + +#. "A collection of files. The index is a stored version of your working tree." +msgid "index (in git-gui: staging area)" +msgstr "Ñкеле/индекÑ/изба" + +#. "A successful merge results in the creation of a new commit representing the result of the merge." +msgid "merge [noun]" +msgstr "Ñливане/обединÑване [ÑъщеÑтвително]" + +#. "To bring the contents of another branch into the current branch." +msgid "merge [verb]" +msgstr "Ñливам/обединÑвам [глагол]" + +#. "" +msgid "message" +msgstr "Ñъобщение" + +#. "Deletes all stale tracking branches under <name>. These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in 'remotes/<name>'." +msgid "prune" +msgstr "окаÑтрÑм" + +#. "Pulling a branch means to fetch it and merge it." +msgid "pull" +msgstr "издърпвам" + +#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" +msgid "push" +msgstr "изтлаÑквам" + +#. "" +msgid "redo" +msgstr "повтарÑм/Ð¿Ñ€Ð°Ð²Ñ Ð½Ð°Ð½Ð¾Ð²Ð¾" + +#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks." +msgid "remote" +msgstr "отдалечено хранилище" + +#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" +msgid "repository" +msgstr "хранилище" + +#. "" +msgid "reset" +msgstr "занулÑвам/отменÑм" + +#. "" +msgid "revert" +msgstr "връщам/отменÑм" + +#. "A particular state of files and directories which was stored in the object database." +msgid "revision" +msgstr "верÑиÑ" + +#. "" +msgid "sign off" +msgstr "подпиÑвам" + +#. "" +msgid "staging area" +msgstr "Ñкеле/индекÑ/изба" + +#. "" +msgid "status" +msgstr "ÑÑŠÑтоÑние" + +#. "A ref pointing to a tag or commit object" +msgid "tag [noun]" +msgstr "етикет [ÑъщеÑтвително]" + +#. "" +msgid "tag [verb]" +msgstr "задавам етикет [глагол]" + +#. "A regular git branch that is used to follow changes from another repository." +msgid "tracking branch" +msgstr "ÑледÑщ клон" + +#. "" +msgid "undo" +msgstr "отменÑм" + +#. "" +msgid "update" +msgstr "обновÑвам" + +#. "" +msgid "verify" +msgstr "проверÑвам" + +#. "The tree of actual checked out files." +msgid "working copy, working tree" +msgstr "работно копие/работно дърво" + +#. "a commit that succeeds the current one in git's graph of commits (not necessarily directly)" +msgid "ancestor" +msgstr "предшеÑтвеник" + +#. "prematurely stop and abandon an operation" +msgid "abort" +msgstr "преуÑтановÑвам" + +#. "a repository with only .git directory, without working directory" +msgid "bare repository" +msgstr "голо хранилище" + +#. "a parent version of the current file" +msgid "base" +msgstr "родителÑка верÑиÑ" + +#. "get the authors responsible for each line in a file" +msgid "blame" +msgstr "анотирам/анотиране" + +#. "to select and apply a single commit without merging" +msgid "cherry-pick" +msgstr "отбирам" + +#. "a commit that directly succeeds the current one in git's graph of commits" +msgid "child" +msgstr "дете" + +#. "clean the state of the git repository, often after manually stopped operation" +msgid "cleanup" +msgstr "зачиÑтвам" + +#. "a message that gets attached with any commit" +msgid "commit message" +msgstr "Ñъобщение при подаване" + +#. "a commit that precedes the current one in git's graph of commits (not necessarily directly)" +msgid "descendant" +msgstr "наÑледник" + +#. "checkout of a revision rather than a some head" +msgid "detached checkout" +msgstr "неÑвързано изтеглÑне" + +#. "any merge strategy that works on a file by file basis" +msgid "file level merging" +msgstr "пофайлово Ñливане" + +#. "the last revision in a branch" +msgid "head" +msgstr "глава/връх (на клон, разработка)" + +#. "script that gets executed automatically on some event" +msgid "hook" +msgstr "кука/автоматичен Ñкрипт" + +#. "the first checkout during a clone operation" +msgid "initial checkout" +msgstr "първоначално изтеглÑне" + +#. "a branch that resides in the local git repository" +msgid "local branch" +msgstr "локален клон" + +#. "a Git object that is not part of any pack" +msgid "loose object" +msgstr "непакетиран обект" + +#. "a branch called by convention 'master' that exists in a newly created git repository" +msgid "master branch" +msgstr "оÑновен клон" + +#. "a remote called by convention 'origin' that the current git repository has been cloned from" +msgid "origin" +msgstr "хранилище-източник" + +#. "a file containing many git objects packed together" +msgid "pack [noun]" +msgstr "етикет" + +#. "a Git object part of some pack" +msgid "packed object" +msgstr "пакетиран обект" + +#. "a commit that directly precedes the current one in git's graph of commits" +msgid "parent" +msgstr "родител" + +#. "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)" +msgid "reflog" +msgstr "журнал на указателите" + +#. "decide which changes from alternative versions of a file should persist in Git" +msgid "resolve (a conflict)" +msgstr "коригирам (конфликт)" + +#. "abandon changes and go to pristine version" +msgid "revert changes" +msgstr "връщане на оригинала" + +#. "expression that signifies a revision in git" +msgid "revision expression" +msgstr "израз за верÑиÑ" + +#. "add some content of files and directories to the staging area in preparation for a commit" +msgid "stage/unstage" +msgstr "(добавÑне) към Ñкелето за подаване/изваждане от Ñкелето за подаване" + +#. "temporarily save changes in a stack without committing" +msgid "stash" +msgstr "Ñкатавам промени" + +#. "file whose content is tracked/not tracked by git" +msgid "tracked/untracked" +msgstr "Ñледен/неÑледен" diff --git a/git-gui/po/glossary/git-gui-glossary.txt b/git-gui/po/glossary/git-gui-glossary.txt index 9b31f69152..409304692d 100644 --- a/git-gui/po/glossary/git-gui-glossary.txt +++ b/git-gui/po/glossary/git-gui-glossary.txt @@ -36,3 +36,32 @@ "update" "" "verify" "" "working copy, working tree" "The tree of actual checked out files." +"ancestor" "a commit that succeeds the current one in git's graph of commits (not necessarily directly)" +"abort" "prematurely stop and abandon an operation" +"bare repository" "a repository with only .git directory, without working directory" +"base" "a parent version of the current file" +"blame" "get the authors responsible for each line in a file" +"cherry-pick" "to select and apply a single commit without merging" +"child" "a commit that directly succeeds the current one in git's graph of commits" +"cleanup" "clean the state of the git repository, often after manually stopped operation" +"commit message" "a message that gets attached with any commit" +"descendant" "a commit that precedes the current one in git's graph of commits (not necessarily directly)" +"detached checkout" "checkout of a revision rather than a some head" +"file level merging" "any merge strategy that works on a file by file basis" +"head" "the last revision in a branch" +"hook" "script that gets executed automatically on some event" +"initial checkout" "the first checkout during a clone operation" +"local branch" "a branch that resides in the local git repository" +"loose object" "a Git object that is not part of any pack" +"master branch" "a branch called by convention 'master' that exists in a newly created git repository" +"origin" "a remote called by convention 'origin' that the current git repository has been cloned from" +"pack [noun]" "a file containing many git objects packed together" +"packed object" "a Git object part of some pack" +"parent" "a commit that directly precedes the current one in git's graph of commits" +"reflog" "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)" +"resolve (a conflict)" "decide which changes from alternative versions of a file should persist in Git" +"revert changes" "abandon changes and go to pristine version" +"revision expression" "expression that signifies a revision in git" +"stage/unstage" "add some content of files and directories to the staging area in preparation for a commit" +"stash" "temporarily save changes in a stack without committing" +"tracked/untracked" "file whose content is tracked/not tracked by git" diff --git a/git-gui/po/po2msg.sh b/git-gui/po/po2msg.sh index 1e9f992528..1e9f992528 100644..100755 --- a/git-gui/po/po2msg.sh +++ b/git-gui/po/po2msg.sh diff --git a/git-gui/windows/git-gui.sh b/git-gui/windows/git-gui.sh index b1845c5055..b1845c5055 100644..100755 --- a/git-gui/windows/git-gui.sh +++ b/git-gui/windows/git-gui.sh diff --git a/git-instaweb.sh b/git-instaweb.sh index 01a1b05e6b..4aa3eb80fd 100755 --- a/git-instaweb.sh +++ b/git-instaweb.sh @@ -5,6 +5,7 @@ PERL='@@PERL@@' OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG= OPTIONS_SPEC="\ git instaweb [options] (--start | --stop | --restart) -- @@ -581,7 +582,7 @@ EOF gitweb_conf() { cat > "$fqgitdir/gitweb/gitweb_config.perl" <<EOF -#!/usr/bin/perl +#!@@PERL@@ our \$projectroot = "$(dirname "$fqgitdir")"; our \$git_temp = "$fqgitdir/gitweb/tmp"; our \$projects_list = \$projectroot; diff --git a/git-lost-found.sh b/git-lost-found.sh deleted file mode 100755 index 0b3e8c7a86..0000000000 --- a/git-lost-found.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -USAGE='' -SUBDIRECTORY_OK='Yes' -OPTIONS_SPEC= -. git-sh-setup - -echo "WARNING: '$0' is deprecated in favor of 'git fsck --lost-found'" >&2 - -if [ "$#" != "0" ] -then - usage -fi - -laf="$GIT_DIR/lost-found" -rm -fr "$laf" && mkdir -p "$laf/commit" "$laf/other" || exit - -git fsck --full --no-reflogs | -while read dangling type sha1 -do - case "$dangling" in - dangling) - if git rev-parse -q --verify "$sha1^0" >/dev/null - then - dir="$laf/commit" - git show-branch "$sha1" - else - dir="$laf/other" - fi - echo "$sha1" >"$dir/$sha1" - ;; - esac -done diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index a280f49817..c45a020301 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -1,5 +1,4 @@ -#!/bin/sh -# git-mergetool--lib is a library for common merge tool functions +# git-mergetool--lib is a shell library for common merge tool functions : ${MERGE_TOOLS_DIR=$(git --exec-path)/mergetools} @@ -310,8 +310,8 @@ def split_p4_type(p4type): # # return the raw p4 type of a file (text, text+ko, etc) # -def p4_type(file): - results = p4CmdList(["fstat", "-T", "headType", file]) +def p4_type(f): + results = p4CmdList(["fstat", "-T", "headType", wildcard_encode(f)]) return results[0]['headType'] # @@ -1220,7 +1220,7 @@ class P4Submit(Command, P4UserMap): editor = os.environ.get("P4EDITOR") else: editor = read_pipe("git var GIT_EDITOR").strip() - system(editor + " " + template_file) + system([editor, template_file]) # If the file was not saved, prompt to see if this patch should # be skipped. But skip this verification step if configured so. @@ -1311,7 +1311,7 @@ class P4Submit(Command, P4UserMap): else: die("unknown modifier %s for %s" % (modifier, path)) - diffcmd = "git format-patch -k --stdout \"%s^\"..\"%s\"" % (id, id) + diffcmd = "git diff-tree -p \"%s\"" % (id) patchcmd = diffcmd + " | git apply " tryPatchCmd = patchcmd + "--check -" applyPatchCmd = patchcmd + "--check --apply -" @@ -1871,7 +1871,7 @@ class View(object): # assume error is "... file(s) not in client view" continue if "clientFile" not in res: - die("No clientFile from 'p4 where %s'" % depot_path) + die("No clientFile in 'p4 where' output") if "unmap" in res: # it will list all of them, but only one not unmap-ped continue @@ -2075,7 +2075,14 @@ class P4Sync(Command, P4UserMap): # p4 print on a symlink sometimes contains "target\n"; # if it does, remove the newline data = ''.join(contents) - if data[-1] == '\n': + if not data: + # Some version of p4 allowed creating a symlink that pointed + # to nothing. This causes p4 errors when checking out such + # a change, and errors here too. Work around it by ignoring + # the bad symlink; hopefully a future change fixes it. + print "\nIgnoring empty symlink in %s" % file['depotFile'] + return + elif data[-1] == '\n': contents = [data[:-1]] else: contents = [data] diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 0e87e0915e..55fe8d56c9 100644 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -1,4 +1,6 @@ -#!/bin/sh +# This is a shell library to calculate the remote repository and +# upstream branch that should be pulled by "git pull" from the current +# branch. # git-ls-remote could be called from outside a git managed repository; # this would fail in that case and would issue an error message. diff --git a/git-pull.sh b/git-pull.sh index b946fd975b..6cd8ebc534 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -4,7 +4,7 @@ # # Fetch one or more remote refs and merge it/them into the current HEAD. -USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [--[no-]rebase|--rebase=preserve] [-s strategy]... [<fetch-options>] <repo> <head>...' +USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff|--ff-only] [--[no-]rebase|--rebase=preserve] [-s strategy]... [<fetch-options>] <repo> <head>...' LONG_USAGE='Fetch one or more remote refs and integrate it/them with the current HEAD.' SUBDIRECTORY_OK=Yes OPTIONS_SPEC= @@ -52,6 +52,21 @@ if test -z "$rebase" then rebase=$(bool_or_string_config pull.rebase) fi + +# Setup default fast-forward options via `pull.ff` +pull_ff=$(git config pull.ff) +case "$pull_ff" in +false) + no_ff=--no-ff + break + ;; +only) + ff_only=--ff-only + break + ;; +esac + + dry_run= while : do @@ -138,6 +153,15 @@ do --no-verify-signatures) verify_signatures=--no-verify-signatures ;; + --gpg-sign|-S) + gpg_sign_args=-S + ;; + --gpg-sign=*) + gpg_sign_args=$(git rev-parse --sq-quote "-S${1#--gpg-sign=}") + ;; + -S*) + gpg_sign_args=$(git rev-parse --sq-quote "$1") + ;; --d|--dr|--dry|--dry-|--dry-r|--dry-ru|--dry-run) dry_run=--dry-run ;; @@ -172,7 +196,7 @@ error_on_no_merge_candidates () { do case "$opt" in -t|--t|--ta|--tag|--tags) - echo "Fetching tags only, you probably meant:" + echo "It doesn't make sense to pull all tags; you probably meant:" echo " git fetch --tags" exit 1 esac @@ -229,15 +253,7 @@ test true = "$rebase" && { test -n "$curr_branch" && . git-parse-remote && remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && - oldremoteref="$(git rev-parse -q --verify "$remoteref")" && - for reflog in $(git rev-list -g $remoteref 2>/dev/null) - do - if test "$reflog" = "$(git merge-base $reflog $curr_branch)" - then - oldremoteref="$reflog" - break - fi - done + oldremoteref=$(git merge-base --fork-point "$remoteref" $curr_branch 2>/dev/null) } orig_head=$(git rev-parse -q --verify HEAD) git fetch $verbosity $progress $dry_run $recurse_submodules --update-head-ok "$@" || exit 1 @@ -313,11 +329,13 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit case "$rebase" in true) eval="git-rebase $diffstat $strategy_args $merge_args $rebase_args $verbosity" + eval="$eval $gpg_sign_args" eval="$eval --onto $merge_head ${oldremoteref:-$merge_head}" ;; *) eval="git-merge $diffstat $no_commit $verify_signatures $edit $squash $no_ff $ff_only" - eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress" + eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress" + eval="$eval $gpg_sign_args" eval="$eval \"\$merge_name\" HEAD $merge_head" ;; esac diff --git a/git-quiltimport.sh b/git-quiltimport.sh index 8e17525dd8..167d79fea8 100755 --- a/git-quiltimport.sh +++ b/git-quiltimport.sh @@ -1,5 +1,6 @@ #!/bin/sh OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG= OPTIONS_SPEC="\ git quiltimport [options] -- diff --git a/git-rebase--am.sh b/git-rebase--am.sh index 34e3102fcb..df46f4ca96 100644 --- a/git-rebase--am.sh +++ b/git-rebase--am.sh @@ -1,11 +1,13 @@ -#!/bin/sh +# This shell script fragment is sourced by git-rebase to implement +# its default, fast, patch-based, non-interactive mode. # # Copyright (c) 2010 Junio C Hamano. # case "$action" in continue) - git am --resolved --resolvemsg="$resolvemsg" && + git am --resolved --resolvemsg="$resolvemsg" \ + ${gpg_sign_opt:+"$gpg_sign_opt"} && move_to_original_branch return ;; @@ -25,7 +27,7 @@ then # empty commits and even if it didn't the format doesn't really lend # itself well to recording empty patches. fortunately, cherry-pick # makes this easy - git cherry-pick --allow-empty "$revisions" + git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty "$revisions" ret=$? else rm -f "$GIT_DIR/rebased-patches" @@ -59,7 +61,8 @@ else return $? fi - git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" <"$GIT_DIR/rebased-patches" + git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" \ + ${gpg_sign_opt:+"$gpg_sign_opt"} <"$GIT_DIR/rebased-patches" ret=$? rm -f "$GIT_DIR/rebased-patches" diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 3c6bed9a28..a1adae8313 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -1,11 +1,8 @@ -#!/bin/sh +# This shell script fragment is sourced by git-rebase to implement +# its interactive mode. "git rebase --interactive" makes it easy +# to fix up commits in the middle of a series and rearrange commits. # # Copyright (c) 2006 Johannes E. Schindelin - -# SHORT DESCRIPTION -# -# This script makes it easy to fix up commits in the middle of a series, -# and rearrange commits. # # The original idea comes from Eric W. Biederman, in # http://article.gmane.org/gmane.comp.version-control.git/22407 @@ -182,9 +179,10 @@ exit_with_patch () { echo "$1" > "$state_dir"/stopped-sha make_patch $1 git rev-parse --verify HEAD > "$amend" + gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} warn "You can amend the commit now, with" warn - warn " git commit --amend" + warn " git commit --amend $gpg_sign_opt_quoted" warn warn "Once you are satisfied with your changes, run" warn @@ -251,7 +249,9 @@ pick_one () { test -d "$rewritten" && pick_one_preserving_merges "$@" && return - output eval git cherry-pick "$strategy_args" $empty_args $ff "$@" + output eval git cherry-pick \ + ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \ + "$strategy_args" $empty_args $ff "$@" } pick_one_preserving_merges () { @@ -354,7 +354,8 @@ pick_one_preserving_merges () { new_parents=${new_parents# $first_parent} merge_args="--no-log --no-ff" if ! do_with_author output eval \ - 'git merge $merge_args $strategy_args -m "$msg_content" $new_parents' + 'git merge ${gpg_sign_opt:+"$gpg_sign_opt"} \ + $merge_args $strategy_args -m "$msg_content" $new_parents' then printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG die_with_patch $sha1 "Error redoing merge $sha1" @@ -362,7 +363,9 @@ pick_one_preserving_merges () { echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list" ;; *) - output eval git cherry-pick "$strategy_args" "$@" || + output eval git cherry-pick \ + ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \ + "$strategy_args" "$@" || die_with_patch $sha1 "Could not pick $sha1" ;; esac @@ -473,7 +476,8 @@ do_pick () { --no-post-rewrite -n -q -C $1 && pick_one -n $1 && git commit --allow-empty --allow-empty-message \ - --amend --no-post-rewrite -n -q -C $1 || + --amend --no-post-rewrite -n -q -C $1 \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die_with_patch $1 "Could not apply $1... $2" else pick_one $1 || @@ -500,7 +504,7 @@ do_next () { mark_action_done do_pick $sha1 "$rest" - git commit --amend --no-post-rewrite || { + git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} || { warn "Could not amend commit after successfully picking $sha1... $rest" warn "This is most likely due to an empty commit message, or the pre-commit hook" warn "failed. If the pre-commit hook failed, you may need to resolve the issue before" @@ -545,19 +549,22 @@ do_next () { squash|s|fixup|f) # This is an intermediate commit; its message will only be # used in case of trouble. So use the long version: - do_with_author output git commit --amend --no-verify -F "$squash_msg" || + do_with_author output git commit --amend --no-verify -F "$squash_msg" \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die_failed_squash $sha1 "$rest" ;; *) # This is the final command of this squash/fixup group if test -f "$fixup_msg" then - do_with_author git commit --amend --no-verify -F "$fixup_msg" || + do_with_author git commit --amend --no-verify -F "$fixup_msg" \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die_failed_squash $sha1 "$rest" else cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit rm -f "$GIT_DIR"/MERGE_MSG - do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e || + do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die_failed_squash $sha1 "$rest" fi rm -f "$squash_msg" "$fixup_msg" @@ -822,14 +829,15 @@ continue) else if ! test -f "$author_script" then + gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} die "You have staged changes in your working tree. If these changes are meant to be squashed into the previous commit, run: - git commit --amend + git commit --amend $gpg_sign_opt_quoted If they are meant to go into a new commit, run: - git commit + git commit $gpg_sign_opt_quoted In both case, once you're done, continue with: @@ -845,10 +853,12 @@ In both case, once you're done, continue with: die "\ You have uncommitted changes in your working tree. Please, commit them first and then run 'git rebase --continue' again." - do_with_author git commit --amend --no-verify -F "$msg" -e || + do_with_author git commit --amend --no-verify -F "$msg" -e \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die "Could not commit staged changes." else - do_with_author git commit --no-verify -F "$msg" -e || + do_with_author git commit --no-verify -F "$msg" -e \ + ${gpg_sign_opt:+"$gpg_sign_opt"} || die "Could not commit staged changes." fi fi diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh index 16d18176ec..5381857c59 100644 --- a/git-rebase--merge.sh +++ b/git-rebase--merge.sh @@ -1,4 +1,6 @@ -#!/bin/sh +# This shell script fragment is sourced by git-rebase to implement +# its merge-based non-interactive mode that copes well with renamed +# files. # # Copyright (c) 2010 Junio C Hamano. # @@ -25,7 +27,7 @@ continue_merge () { cmt=`cat "$state_dir/current"` if ! git diff-index --quiet --ignore-submodules HEAD -- then - if ! git commit --no-verify -C "$cmt" + if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} --no-verify -C "$cmt" then echo "Commit failed, please do not call \"git commit\"" echo "directly, but instead do one of the following: " diff --git a/git-rebase.sh b/git-rebase.sh index 226752fbff..5f6732bf3d 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -5,6 +5,7 @@ SUBDIRECTORY_OK=Yes OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG=t OPTIONS_SPEC="\ git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>] git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>] @@ -14,6 +15,7 @@ git-rebase --continue | --abort | --skip | --edit-todo v,verbose! display a diffstat of what changed upstream q,quiet! be quiet. implies --no-stat autostash! automatically stash/stash pop before and after +fork-point use 'merge-base --fork-point' to refine upstream onto=! rebase onto given branch instead of upstream p,preserve-merges! try to recreate merges instead of ignoring them s,strategy=! use the given merge strategy @@ -35,6 +37,7 @@ ignore-date! passed to 'git am' whitespace=! passed to 'git apply' ignore-whitespace! passed to 'git apply' C=! passed to 'git apply' +S,gpg-sign? GPG-sign commits Actions: continue! continue abort! abort and check out the original branch @@ -66,6 +69,7 @@ verbose= diffstat= test "$(git config --bool rebase.stat)" = true && diffstat=t autostash="$(git config --bool rebase.autostash || echo false)" +fork_point=auto git_am_opt= rebase_root= force_rebase= @@ -82,6 +86,7 @@ preserve_merges= autosquash= keep_empty= test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t +gpg_sign_opt= read_basic_state () { test -f "$state_dir/head-name" && @@ -104,6 +109,8 @@ read_basic_state () { strategy_opts="$(cat "$state_dir"/strategy_opts)" test -f "$state_dir"/allow_rerere_autoupdate && allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)" + test -f "$state_dir"/gpg_sign_opt && + gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)" } write_basic_state () { @@ -117,6 +124,7 @@ write_basic_state () { "$state_dir"/strategy_opts test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \ "$state_dir"/allow_rerere_autoupdate + test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt } output () { @@ -234,23 +242,19 @@ do test $total_argc -eq 2 || usage action=${1##--} ;; - --onto) - test 2 -le "$#" || usage - onto="$2" - shift + --onto=*) + onto="${1#--onto=}" ;; - -x) - test 2 -le "$#" || usage - cmd="${cmd}exec $2${LF}" - shift + --exec=*) + cmd="${cmd}exec ${1#--exec=}${LF}" ;; - -i) + --interactive) interactive_rebase=explicit ;; - -k) + --keep-empty) keep_empty=yes ;; - -p) + --preserve-merges) preserve_merges=t test -z "$interactive_rebase" && interactive_rebase=implied ;; @@ -260,21 +264,25 @@ do --no-autosquash) autosquash= ;; - -M|-m) + --fork-point) + fork_point=t + ;; + --no-fork-point) + fork_point= + ;; + --merge) do_merge=t ;; - -X) - shift - strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")" + --strategy-option=*) + strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")" do_merge=t test -z "$strategy" && strategy=recursive ;; - -s) - shift - strategy="$1" + --strategy=*) + strategy="${1#--strategy=}" do_merge=t ;; - -n) + --no-stat) diffstat= ;; --stat) @@ -283,21 +291,20 @@ do --autostash) autostash=true ;; - -v) + --verbose) verbose=t diffstat=t GIT_QUIET= ;; - -q) + --quiet) GIT_QUIET=t git_am_opt="$git_am_opt -q" verbose= diffstat= ;; - --whitespace) - shift - git_am_opt="$git_am_opt --whitespace=$1" - case "$1" in + --whitespace=*) + git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}" + case "${1#--whitespace=}" in fix|strip) force_rebase=t ;; @@ -310,19 +317,24 @@ do git_am_opt="$git_am_opt $1" force_rebase=t ;; - -C) - shift - git_am_opt="$git_am_opt -C$1" + -C*) + git_am_opt="$git_am_opt $1" ;; --root) rebase_root=t ;; - -f|--no-ff) + --force-rebase|--no-ff) force_rebase=t ;; --rerere-autoupdate|--no-rerere-autoupdate) allow_rerere_autoupdate="$1" ;; + --gpg-sign) + gpg_sign_opt=-S + ;; + --gpg-sign=*) + gpg_sign_opt="-S${1#--gpg-sign=}" + ;; --) shift break @@ -437,6 +449,8 @@ then error_on_missing_default_upstream "rebase" "rebase" \ "against" "git rebase <branch>" fi + + test "$fork_point" = auto && fork_point=t ;; *) upstream_name="$1" shift @@ -522,6 +536,16 @@ case "$#" in ;; esac +if test "$fork_point" = t +then + new_upstream=$(git merge-base --fork-point "$upstream_name" \ + "${switch_to:-HEAD}") + if test -n "$new_upstream" + then + upstream=$new_upstream + fi +fi + if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null then stash_sha1=$(git stash create "autostash") || diff --git a/git-request-pull.sh b/git-request-pull.sh index ebf1269d29..cf4f1505a5 100755 --- a/git-request-pull.sh +++ b/git-request-pull.sh @@ -9,6 +9,7 @@ LONG_USAGE='Summarizes the changes between two commits to the standard output, and includes the given URL in the generated summary.' SUBDIRECTORY_OK='Yes' OPTIONS_KEEPDASHDASH= +OPTIONS_STUCKLONG= OPTIONS_SPEC='git request-pull [options] start url [end] -- p show patch text as well @@ -106,7 +107,7 @@ find_matching_ref=' } ' -ref=$(git ls-remote "$url" | perl -e "$find_matching_ref" "$head" "$headrev" "$tag_name") +ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "$head" "$headrev" "$tag_name") url=$(git ls-remote --get-url "$url") diff --git a/git-send-email.perl b/git-send-email.perl index 3782c3b0cb..fdb0029b59 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -291,7 +291,7 @@ my $rc = GetOptions("h" => \$help, "smtp-pass:s" => \$smtp_authpass, "smtp-ssl" => sub { $smtp_encryption = 'ssl' }, "smtp-encryption=s" => \$smtp_encryption, - "smtp-ssl-cert-path" => \$smtp_ssl_cert_path, + "smtp-ssl-cert-path=s" => \$smtp_ssl_cert_path, "smtp-debug:i" => \$debug_net_smtp, "smtp-domain:s" => \$smtp_domain, "identity=s" => \$identity, @@ -1095,7 +1095,8 @@ sub ssl_verify_params { } if (!defined $smtp_ssl_cert_path) { - $smtp_ssl_cert_path = "/etc/ssl/certs"; + # use the OpenSSL defaults + return (SSL_verify_mode => SSL_VERIFY_PEER()); } if ($smtp_ssl_cert_path eq "") { @@ -1214,10 +1215,14 @@ X-Mailer: git-send-email $gitversion $smtp_server_port ||= 465; # ssmtp require Net::SMTP::SSL; $smtp_domain ||= maildomain(); + require IO::Socket::SSL; + # Net::SMTP::SSL->new() does not forward any SSL options + IO::Socket::SSL::set_client_defaults( + ssl_verify_params()); $smtp ||= Net::SMTP::SSL->new($smtp_server, Hello => $smtp_domain, Port => $smtp_server_port, - ssl_verify_params()); + Debug => $debug_net_smtp); } else { require Net::SMTP; diff --git a/git-sh-i18n.sh b/git-sh-i18n.sh index 6a27f68136..e6c3116e18 100644 --- a/git-sh-i18n.sh +++ b/git-sh-i18n.sh @@ -1,9 +1,8 @@ -#!/bin/sh +# This shell library is Git's interface to gettext.sh. See po/README +# for usage instructions. # # Copyright (c) 2010 Ævar Arnfjörð Bjarmason # -# This is Git's interface to gettext.sh. See po/README for usage -# instructions. # Export the TEXTDOMAIN* data that we need for Git TEXTDOMAIN=git diff --git a/git-sh-setup.sh b/git-sh-setup.sh index ebfe8f7a4d..5f28b32dc7 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -1,9 +1,6 @@ -#!/bin/sh -# -# This is included in commands that either have to be run from the toplevel -# of the repository, or with GIT_DIR environment variable properly. -# If the GIT_DIR does not look like the right correct git-repository, -# it dies. +# This shell scriplet is meant to be included by other shell scripts +# to set up some variables pointing at the normal git directories and +# a few helper shell functions. # Having this variable in your environment would break scripts because # you would cause "cd" to be taken to unexpected places. If you @@ -75,6 +72,8 @@ if test -n "$OPTIONS_SPEC"; then parseopt_extra= [ -n "$OPTIONS_KEEPDASHDASH" ] && parseopt_extra="--keep-dashdash" + [ -n "$OPTIONS_STUCKLONG" ] && + parseopt_extra="$parseopt_extra --stuck-long" eval "$( echo "$OPTIONS_SPEC" | @@ -162,7 +161,8 @@ git_pager() { GIT_PAGER=cat fi : ${LESS=-FRSX} - export LESS + : ${LV=-c} + export LESS LV eval "$GIT_PAGER" '"$@"' } diff --git a/git-stash.sh b/git-stash.sh index 1e541a2125..f0a94abf14 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -358,7 +358,7 @@ parse_flags_and_rev() i_tree= u_tree= - REV=$(git rev-parse --no-flags --symbolic "$@") || exit 1 + REV=$(git rev-parse --no-flags --symbolic --sq "$@") || exit 1 FLAGS= for opt @@ -376,7 +376,7 @@ parse_flags_and_rev() esac done - set -- $REV + eval set -- $REV case $# in 0) @@ -391,13 +391,13 @@ parse_flags_and_rev() ;; esac - REV=$(git rev-parse --quiet --symbolic --verify $1 2>/dev/null) || { + REV=$(git rev-parse --quiet --symbolic --verify "$1" 2>/dev/null) || { reference="$1" die "$(eval_gettext "\$reference is not valid reference")" } - i_commit=$(git rev-parse --quiet --verify $REV^2 2>/dev/null) && - set -- $(git rev-parse $REV $REV^1 $REV: $REV^1: $REV^2: 2>/dev/null) && + i_commit=$(git rev-parse --quiet --verify "$REV^2" 2>/dev/null) && + set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) && s=$1 && w_commit=$1 && b_commit=$2 && @@ -408,8 +408,8 @@ parse_flags_and_rev() test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" && IS_STASH_REF=t - u_commit=$(git rev-parse --quiet --verify $REV^3 2>/dev/null) && - u_tree=$(git rev-parse $REV^3: 2>/dev/null) + u_commit=$(git rev-parse --quiet --verify "$REV^3" 2>/dev/null) && + u_tree=$(git rev-parse "$REV^3:" 2>/dev/null) } is_stash_like() diff --git a/git-submodule.sh b/git-submodule.sh index 896f1c9b82..6135cfa912 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -9,7 +9,7 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...] or: $dashless [--quiet] init [--] [<path>...] or: $dashless [--quiet] deinit [-f|--force] [--] <path>... - or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...] + or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] [--recursive] [--] [<path>...] or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...] or: $dashless [--quiet] foreach [--recursive] <command> or: $dashless [--quiet] sync [--recursive] [--] [<path>...]" @@ -156,7 +156,7 @@ module_list() git ls-files -z --error-unmatch --stage -- "$@" || echo "unmatched pathspec exists" ) | - perl -e ' + @@PERL@@ -e ' my %unmerged = (); my ($null_sha1) = ("0" x 40); my @out = (); @@ -241,6 +241,15 @@ module_name() # # Clone a submodule # +# $1 = submodule path +# $2 = submodule name +# $3 = URL to clone +# $4 = reference repository to reuse (empty for independent) +# $5 = depth argument for shallow clones (empty for deep) +# $6 = (remote-tracking) starting point for the local branch (empty for HEAD) +# $7 = local branch to create (empty for a detached HEAD, unless $6 is +# also empty, in which case the local branch is left unchanged) +# # Prior to calling, cmd_update checks that a possibly existing # path is not a git repository. # Likewise, cmd_add checks that path does not exist at all, @@ -253,6 +262,8 @@ module_clone() url=$3 reference="$4" depth="$5" + start_point="$6" + local_branch="$7" quiet= if test -n "$GIT_QUIET" then @@ -306,7 +317,16 @@ module_clone() echo "gitdir: $rel/$a" >"$sm_path/.git" rel=$(echo $a | sed -e 's|[^/][^/]*|..|g') - (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b") + ( + clear_local_git_env + cd "$sm_path" && + GIT_WORK_TREE=. git config core.worktree "$rel/$b" && + # ash fails to wordsplit ${local_branch:+-B "$local_branch"...} + case "$local_branch" in + '') git checkout -f -q ${start_point:+"$start_point"} ;; + ?*) git checkout -f -q -B "$local_branch" ${start_point:+"$start_point"} ;; + esac + ) || die "$(eval_gettext "Unable to setup cloned submodule '\$sm_path'")" } isnumber() @@ -469,16 +489,15 @@ Use -f if you really want to add it." >&2 echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")" fi fi - module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit - ( - clear_local_git_env - cd "$sm_path" && - # ash fails to wordsplit ${branch:+-b "$branch"...} - case "$branch" in - '') git checkout -f -q ;; - ?*) git checkout -f -q -B "$branch" "origin/$branch" ;; - esac - ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")" + if test -n "$branch" + then + start_point="origin/$branch" + local_branch="$branch" + else + start_point="" + local_branch="" + fi + module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" "$start_point" "$local_branch" || exit fi git config submodule."$sm_name".url "$realrepo" @@ -545,7 +564,12 @@ cmd_foreach() sm_path=$(relative_path "$sm_path") && # we make $path available to scripts ... path=$sm_path && - eval "$@" && + if test $# -eq 1 + then + eval "$1" + else + "$@" + fi && if test -n "$recursive" then cmd_foreach "--recursive" "$@" @@ -612,11 +636,21 @@ cmd_init() fi # Copy "update" setting when it is not set yet - upd="$(git config -f .gitmodules submodule."$name".update)" - test -z "$upd" || - test -n "$(git config submodule."$name".update)" || - git config submodule."$name".update "$upd" || - die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")" + if upd="$(git config -f .gitmodules submodule."$name".update)" && + test -n "$upd" && + test -z "$(git config submodule."$name".update)" + then + case "$upd" in + checkout | rebase | merge | none) + ;; # known modes of updating + *) + echo >&2 "warning: unknown update mode '$upd' suggested for submodule '$name'" + upd=none + ;; + esac + git config submodule."$name".update "$upd" || + die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")" + fi done } @@ -706,7 +740,6 @@ cmd_deinit() cmd_update() { # parse $args after "submodule ... update". - orig_flags= while test $# -ne 0 do case "$1" in @@ -731,7 +764,6 @@ cmd_update() --reference) case "$2" in '') usage ;; esac reference="--reference=$2" - orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")" shift ;; --reference=*) @@ -765,7 +797,6 @@ cmd_update() break ;; esac - orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")" shift done @@ -787,21 +818,35 @@ cmd_update() fi name=$(module_name "$sm_path") || exit url=$(git config submodule."$name".url) - branch=$(get_submodule_config "$name" branch master) + config_branch=$(get_submodule_config "$name" branch) + branch="${config_branch:-master}" + local_branch="$branch" if ! test -z "$update" then update_module=$update else update_module=$(git config submodule."$name".update) + if test -z "$update_module" + then + update_module="checkout" + fi fi displaypath=$(relative_path "$prefix$sm_path") - if test "$update_module" = "none" - then + case "$update_module" in + none) echo "Skipping submodule '$displaypath'" continue - fi + ;; + checkout) + local_branch="" + ;; + rebase | merge | !*) + ;; + *) + die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")" + esac if test -z "$url" then @@ -815,7 +860,8 @@ Maybe you want to use 'update --init'?")" if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git then - module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit + start_point="origin/${branch}" + module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$start_point" "$local_branch" || exit cloned_modules="$cloned_modules;$name" subsha1= else @@ -861,11 +907,16 @@ Maybe you want to use 'update --init'?")" case ";$cloned_modules;" in *";$name;"*) # then there is no local change to integrate - update_module= ;; + update_module='!git reset --hard -q' esac must_die_on_failure= case "$update_module" in + checkout) + command="git checkout $subforce -q" + die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")" + say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")" + ;; rebase) command="git rebase" die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$displaypath'")" @@ -885,10 +936,7 @@ Maybe you want to use 'update --init'?")" must_die_on_failure=yes ;; *) - command="git checkout $subforce -q" - die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")" - say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")" - ;; + die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")" esac if (clear_local_git_env; cd "$sm_path" && $command "$sha1") @@ -909,7 +957,7 @@ Maybe you want to use 'update --init'?")" prefix="$prefix$sm_path/" clear_local_git_env cd "$sm_path" && - eval cmd_update "$orig_flags" + eval cmd_update ) res=$? if test $res -gt 0 diff --git a/git-web--browse.sh b/git-web--browse.sh index 1d72ec760e..ebdfba6c94 100755 --- a/git-web--browse.sh +++ b/git-web--browse.sh @@ -34,7 +34,7 @@ valid_tool() { firefox | iceweasel | seamonkey | iceape | \ chrome | google-chrome | chromium | chromium-browser | \ konqueror | opera | w3m | elinks | links | lynx | dillo | open | \ - start | cygstart) + start | cygstart | xdg-open) ;; # happy *) valid_custom_tool "$1" || return 1 @@ -112,7 +112,7 @@ fi if test -z "$browser" ; then if test -n "$DISPLAY"; then - browser_candidates="firefox iceweasel google-chrome chrome chromium chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo" + browser_candidates="firefox iceweasel google-chrome chrome chromium chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo xdg-open" if test "$KDE_FULL_SESSION" = "true"; then browser_candidates="konqueror $browser_candidates" fi @@ -179,7 +179,7 @@ konqueror) ;; esac ;; -w3m|elinks|links|lynx|open|cygstart) +w3m|elinks|links|lynx|open|cygstart|xdg-open) "$browser_path" "$@" ;; start) @@ -54,7 +54,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) /* * Check remaining flags. */ - if (!prefixcmp(cmd, "--exec-path")) { + if (starts_with(cmd, "--exec-path")) { cmd += 11; if (*cmd == '=') git_set_argv_exec_path(cmd + 1); @@ -78,7 +78,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--no-replace-objects")) { - read_replace_refs = 0; + check_replace_refs = 0; setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1); if (envchanged) *envchanged = 1; @@ -92,7 +92,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) *envchanged = 1; (*argv)++; (*argc)--; - } else if (!prefixcmp(cmd, "--git-dir=")) { + } else if (starts_with(cmd, "--git-dir=")) { setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1); if (envchanged) *envchanged = 1; @@ -106,7 +106,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) *envchanged = 1; (*argv)++; (*argc)--; - } else if (!prefixcmp(cmd, "--namespace=")) { + } else if (starts_with(cmd, "--namespace=")) { setenv(GIT_NAMESPACE_ENVIRONMENT, cmd + 12, 1); if (envchanged) *envchanged = 1; @@ -120,7 +120,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) *envchanged = 1; (*argv)++; (*argc)--; - } else if (!prefixcmp(cmd, "--work-tree=")) { + } else if (starts_with(cmd, "--work-tree=")) { setenv(GIT_WORK_TREE_ENVIRONMENT, cmd + 12, 1); if (envchanged) *envchanged = 1; @@ -162,7 +162,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) } else if (!strcmp(cmd, "--shallow-file")) { (*argv)++; (*argc)--; - set_alternate_shallow_file((*argv)[0]); + set_alternate_shallow_file((*argv)[0], 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "-C")) { @@ -332,127 +332,136 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) return 0; } -static void handle_internal_command(int argc, const char **argv) +static struct cmd_struct commands[] = { + { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE }, + { "annotate", cmd_annotate, RUN_SETUP }, + { "apply", cmd_apply, RUN_SETUP_GENTLY }, + { "archive", cmd_archive }, + { "bisect--helper", cmd_bisect__helper, RUN_SETUP }, + { "blame", cmd_blame, RUN_SETUP }, + { "branch", cmd_branch, RUN_SETUP }, + { "bundle", cmd_bundle, RUN_SETUP_GENTLY }, + { "cat-file", cmd_cat_file, RUN_SETUP }, + { "check-attr", cmd_check_attr, RUN_SETUP }, + { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE }, + { "check-mailmap", cmd_check_mailmap, RUN_SETUP }, + { "check-ref-format", cmd_check_ref_format }, + { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE }, + { "checkout-index", cmd_checkout_index, + RUN_SETUP | NEED_WORK_TREE}, + { "cherry", cmd_cherry, RUN_SETUP }, + { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, + { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, + { "clone", cmd_clone }, + { "column", cmd_column, RUN_SETUP_GENTLY }, + { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, + { "commit-tree", cmd_commit_tree, RUN_SETUP }, + { "config", cmd_config, RUN_SETUP_GENTLY }, + { "count-objects", cmd_count_objects, RUN_SETUP }, + { "credential", cmd_credential, RUN_SETUP_GENTLY }, + { "describe", cmd_describe, RUN_SETUP }, + { "diff", cmd_diff }, + { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE }, + { "diff-index", cmd_diff_index, RUN_SETUP }, + { "diff-tree", cmd_diff_tree, RUN_SETUP }, + { "fast-export", cmd_fast_export, RUN_SETUP }, + { "fetch", cmd_fetch, RUN_SETUP }, + { "fetch-pack", cmd_fetch_pack, RUN_SETUP }, + { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP }, + { "for-each-ref", cmd_for_each_ref, RUN_SETUP }, + { "format-patch", cmd_format_patch, RUN_SETUP }, + { "fsck", cmd_fsck, RUN_SETUP }, + { "fsck-objects", cmd_fsck, RUN_SETUP }, + { "gc", cmd_gc, RUN_SETUP }, + { "get-tar-commit-id", cmd_get_tar_commit_id }, + { "grep", cmd_grep, RUN_SETUP_GENTLY }, + { "hash-object", cmd_hash_object }, + { "help", cmd_help }, + { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY }, + { "init", cmd_init_db }, + { "init-db", cmd_init_db }, + { "log", cmd_log, RUN_SETUP }, + { "ls-files", cmd_ls_files, RUN_SETUP }, + { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, + { "ls-tree", cmd_ls_tree, RUN_SETUP }, + { "mailinfo", cmd_mailinfo }, + { "mailsplit", cmd_mailsplit }, + { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, + { "merge-base", cmd_merge_base, RUN_SETUP }, + { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY }, + { "merge-index", cmd_merge_index, RUN_SETUP }, + { "merge-ours", cmd_merge_ours, RUN_SETUP }, + { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, + { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, + { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, + { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, + { "merge-tree", cmd_merge_tree, RUN_SETUP }, + { "mktag", cmd_mktag, RUN_SETUP }, + { "mktree", cmd_mktree, RUN_SETUP }, + { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE }, + { "name-rev", cmd_name_rev, RUN_SETUP }, + { "notes", cmd_notes, RUN_SETUP }, + { "pack-objects", cmd_pack_objects, RUN_SETUP }, + { "pack-redundant", cmd_pack_redundant, RUN_SETUP }, + { "pack-refs", cmd_pack_refs, RUN_SETUP }, + { "patch-id", cmd_patch_id }, + { "pickaxe", cmd_blame, RUN_SETUP }, + { "prune", cmd_prune, RUN_SETUP }, + { "prune-packed", cmd_prune_packed, RUN_SETUP }, + { "push", cmd_push, RUN_SETUP }, + { "read-tree", cmd_read_tree, RUN_SETUP }, + { "receive-pack", cmd_receive_pack }, + { "reflog", cmd_reflog, RUN_SETUP }, + { "remote", cmd_remote, RUN_SETUP }, + { "remote-ext", cmd_remote_ext }, + { "remote-fd", cmd_remote_fd }, + { "repack", cmd_repack, RUN_SETUP }, + { "replace", cmd_replace, RUN_SETUP }, + { "rerere", cmd_rerere, RUN_SETUP }, + { "reset", cmd_reset, RUN_SETUP }, + { "rev-list", cmd_rev_list, RUN_SETUP }, + { "rev-parse", cmd_rev_parse }, + { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE }, + { "rm", cmd_rm, RUN_SETUP }, + { "send-pack", cmd_send_pack, RUN_SETUP }, + { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER }, + { "show", cmd_show, RUN_SETUP }, + { "show-branch", cmd_show_branch, RUN_SETUP }, + { "show-ref", cmd_show_ref, RUN_SETUP }, + { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE }, + { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE }, + { "stripspace", cmd_stripspace }, + { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP }, + { "tag", cmd_tag, RUN_SETUP }, + { "unpack-file", cmd_unpack_file, RUN_SETUP }, + { "unpack-objects", cmd_unpack_objects, RUN_SETUP }, + { "update-index", cmd_update_index, RUN_SETUP }, + { "update-ref", cmd_update_ref, RUN_SETUP }, + { "update-server-info", cmd_update_server_info, RUN_SETUP }, + { "upload-archive", cmd_upload_archive }, + { "upload-archive--writer", cmd_upload_archive_writer }, + { "var", cmd_var, RUN_SETUP_GENTLY }, + { "verify-pack", cmd_verify_pack }, + { "verify-tag", cmd_verify_tag, RUN_SETUP }, + { "version", cmd_version }, + { "whatchanged", cmd_whatchanged, RUN_SETUP }, + { "write-tree", cmd_write_tree, RUN_SETUP }, +}; + +int is_builtin(const char *s) +{ + int i; + for (i = 0; i < ARRAY_SIZE(commands); i++) { + struct cmd_struct *p = commands+i; + if (!strcmp(s, p->cmd)) + return 1; + } + return 0; +} + +static void handle_builtin(int argc, const char **argv) { const char *cmd = argv[0]; - static struct cmd_struct commands[] = { - { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE }, - { "annotate", cmd_annotate, RUN_SETUP }, - { "apply", cmd_apply, RUN_SETUP_GENTLY }, - { "archive", cmd_archive }, - { "bisect--helper", cmd_bisect__helper, RUN_SETUP }, - { "blame", cmd_blame, RUN_SETUP }, - { "branch", cmd_branch, RUN_SETUP }, - { "bundle", cmd_bundle, RUN_SETUP_GENTLY }, - { "cat-file", cmd_cat_file, RUN_SETUP }, - { "check-attr", cmd_check_attr, RUN_SETUP }, - { "check-ignore", cmd_check_ignore, RUN_SETUP | NEED_WORK_TREE }, - { "check-mailmap", cmd_check_mailmap, RUN_SETUP }, - { "check-ref-format", cmd_check_ref_format }, - { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE }, - { "checkout-index", cmd_checkout_index, - RUN_SETUP | NEED_WORK_TREE}, - { "cherry", cmd_cherry, RUN_SETUP }, - { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, - { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, - { "clone", cmd_clone }, - { "column", cmd_column, RUN_SETUP_GENTLY }, - { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, - { "commit-tree", cmd_commit_tree, RUN_SETUP }, - { "config", cmd_config, RUN_SETUP_GENTLY }, - { "count-objects", cmd_count_objects, RUN_SETUP }, - { "credential", cmd_credential, RUN_SETUP_GENTLY }, - { "describe", cmd_describe, RUN_SETUP }, - { "diff", cmd_diff }, - { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE }, - { "diff-index", cmd_diff_index, RUN_SETUP }, - { "diff-tree", cmd_diff_tree, RUN_SETUP }, - { "fast-export", cmd_fast_export, RUN_SETUP }, - { "fetch", cmd_fetch, RUN_SETUP }, - { "fetch-pack", cmd_fetch_pack, RUN_SETUP }, - { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP }, - { "for-each-ref", cmd_for_each_ref, RUN_SETUP }, - { "format-patch", cmd_format_patch, RUN_SETUP }, - { "fsck", cmd_fsck, RUN_SETUP }, - { "fsck-objects", cmd_fsck, RUN_SETUP }, - { "gc", cmd_gc, RUN_SETUP }, - { "get-tar-commit-id", cmd_get_tar_commit_id }, - { "grep", cmd_grep, RUN_SETUP_GENTLY }, - { "hash-object", cmd_hash_object }, - { "help", cmd_help }, - { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY }, - { "init", cmd_init_db }, - { "init-db", cmd_init_db }, - { "log", cmd_log, RUN_SETUP }, - { "ls-files", cmd_ls_files, RUN_SETUP }, - { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, - { "ls-tree", cmd_ls_tree, RUN_SETUP }, - { "mailinfo", cmd_mailinfo }, - { "mailsplit", cmd_mailsplit }, - { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, - { "merge-base", cmd_merge_base, RUN_SETUP }, - { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY }, - { "merge-index", cmd_merge_index, RUN_SETUP }, - { "merge-ours", cmd_merge_ours, RUN_SETUP }, - { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, - { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, - { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, - { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, - { "merge-tree", cmd_merge_tree, RUN_SETUP }, - { "mktag", cmd_mktag, RUN_SETUP }, - { "mktree", cmd_mktree, RUN_SETUP }, - { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE }, - { "name-rev", cmd_name_rev, RUN_SETUP }, - { "notes", cmd_notes, RUN_SETUP }, - { "pack-objects", cmd_pack_objects, RUN_SETUP }, - { "pack-redundant", cmd_pack_redundant, RUN_SETUP }, - { "pack-refs", cmd_pack_refs, RUN_SETUP }, - { "patch-id", cmd_patch_id }, - { "peek-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, - { "pickaxe", cmd_blame, RUN_SETUP }, - { "prune", cmd_prune, RUN_SETUP }, - { "prune-packed", cmd_prune_packed, RUN_SETUP }, - { "push", cmd_push, RUN_SETUP }, - { "read-tree", cmd_read_tree, RUN_SETUP }, - { "receive-pack", cmd_receive_pack }, - { "reflog", cmd_reflog, RUN_SETUP }, - { "remote", cmd_remote, RUN_SETUP }, - { "remote-ext", cmd_remote_ext }, - { "remote-fd", cmd_remote_fd }, - { "repack", cmd_repack, RUN_SETUP }, - { "replace", cmd_replace, RUN_SETUP }, - { "repo-config", cmd_repo_config, RUN_SETUP_GENTLY }, - { "rerere", cmd_rerere, RUN_SETUP }, - { "reset", cmd_reset, RUN_SETUP }, - { "rev-list", cmd_rev_list, RUN_SETUP }, - { "rev-parse", cmd_rev_parse }, - { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE }, - { "rm", cmd_rm, RUN_SETUP }, - { "send-pack", cmd_send_pack, RUN_SETUP }, - { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER }, - { "show", cmd_show, RUN_SETUP }, - { "show-branch", cmd_show_branch, RUN_SETUP }, - { "show-ref", cmd_show_ref, RUN_SETUP }, - { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE }, - { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE }, - { "stripspace", cmd_stripspace }, - { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP }, - { "tag", cmd_tag, RUN_SETUP }, - { "tar-tree", cmd_tar_tree }, - { "unpack-file", cmd_unpack_file, RUN_SETUP }, - { "unpack-objects", cmd_unpack_objects, RUN_SETUP }, - { "update-index", cmd_update_index, RUN_SETUP }, - { "update-ref", cmd_update_ref, RUN_SETUP }, - { "update-server-info", cmd_update_server_info, RUN_SETUP }, - { "upload-archive", cmd_upload_archive }, - { "upload-archive--writer", cmd_upload_archive_writer }, - { "var", cmd_var, RUN_SETUP_GENTLY }, - { "verify-pack", cmd_verify_pack }, - { "verify-tag", cmd_verify_tag, RUN_SETUP }, - { "version", cmd_version }, - { "whatchanged", cmd_whatchanged, RUN_SETUP }, - { "write-tree", cmd_write_tree, RUN_SETUP }, - }; int i; static const char ext[] = STRIP_EXTENSION; @@ -520,8 +529,8 @@ static int run_argv(int *argcp, const char ***argv) int done_alias = 0; while (1) { - /* See if it's an internal command */ - handle_internal_command(*argcp, *argv); + /* See if it's a builtin */ + handle_builtin(*argcp, *argv); /* .. then try the external ones */ execv_dashed_external(*argv); @@ -566,14 +575,14 @@ int main(int argc, char **av) * - cannot execute it externally (since it would just do * the same thing over again) * - * So we just directly call the internal command handler, and - * die if that one cannot handle it. + * So we just directly call the builtin handler, and die if + * that one cannot handle it. */ - if (!prefixcmp(cmd, "git-")) { + if (starts_with(cmd, "git-")) { cmd += 4; argv[0] = cmd; - handle_internal_command(argc, argv); - die("cannot handle %s internally", cmd); + handle_builtin(argc, argv); + die("cannot handle %s as a builtin", cmd); } /* Look for flags.. */ @@ -581,7 +590,7 @@ int main(int argc, char **av) argc--; handle_options(&argv, &argc, NULL); if (argc > 0) { - if (!prefixcmp(argv[0], "--")) + if (starts_with(argv[0], "--")) argv[0] += 2; } else { /* The user didn't specify a command; give them help */ @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION MAJOR,MINOR,PATCH,0 -PRODUCTVERSION MAJOR,MINOR,PATCH,0 +FILEVERSION MAJOR,MINOR,0,0 +PRODUCTVERSION MAJOR,MINOR,0,0 BEGIN BLOCK "StringFileInfo" BEGIN diff --git a/gitk-git/gitk b/gitk-git/gitk index 5cd00d80fe..90764e8948 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -2,7 +2,7 @@ # Tcl ignores the next line -*- tcl -*- \ exec wish "$0" -- "$@" -# Copyright © 2005-2011 Paul Mackerras. All rights reserved. +# Copyright © 2005-2014 Paul Mackerras. All rights reserved. # This program is free software; it may be used, copied, modified # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. @@ -156,10 +156,12 @@ proc unmerged_files {files} { proc parseviewargs {n arglist} { global vdatemode vmergeonly vflags vdflags vrevs vfiltered vorigargs env + global vinlinediff global worddiff git_version set vdatemode($n) 0 set vmergeonly($n) 0 + set vinlinediff($n) 0 set glflags {} set diffargs {} set nextisval 0 @@ -227,12 +229,20 @@ proc parseviewargs {n arglist} { "--until=*" - "--before=*" - "--max-age=*" - "--min-age=*" - "--author=*" - "--committer=*" - "--grep=*" - "-[iE]" - "--remove-empty" - "--first-parent" - "--cherry-pick" - - "-S*" - "--pickaxe-all" - "--pickaxe-regex" - + "-S*" - "-G*" - "--pickaxe-all" - "--pickaxe-regex" - "--simplify-by-decoration" { # These mean that we get a subset of the commits set filtered 1 lappend glflags $arg } + "-L*" { + # Line-log with 'stuck' argument (unstuck form is + # not supported) + set filtered 1 + set vinlinediff($n) 1 + set allknown 0 + lappend glflags $arg + } "-n" { # This appears to be the only one that has a value as a # separate word following it @@ -1704,8 +1714,17 @@ proc parsecommit {id contents listed} { set comment $newcomment } set hasnote [string first "\nNotes:\n" $contents] + set diff "" + # If there is diff output shown in the git-log stream, split it + # out. But get rid of the empty line that always precedes the + # diff. + set i [string first "\n\ndiff" $comment] + if {$i >= 0} { + set diff [string range $comment $i+1 end] + set comment [string range $comment 0 $i-1] + } set commitinfo($id) [list $headline $auname $audate \ - $comname $comdate $comment $hasnote] + $comname $comdate $comment $hasnote $diff] } proc getcommit {id} { @@ -2244,9 +2263,35 @@ proc makewindow {} { # build up the bottom bar of upper window ${NS}::label .tf.lbar.flabel -text "[mc "Find"] " - ${NS}::button .tf.lbar.fnext -text [mc "next"] -command {dofind 1 1} - ${NS}::button .tf.lbar.fprev -text [mc "prev"] -command {dofind -1 1} + + set bm_down_data { + #define down_width 16 + #define down_height 16 + static unsigned char down_bits[] = { + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x87, 0xe1, 0x8e, 0x71, 0x9c, 0x39, 0xb8, 0x1d, + 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}; + } + image create bitmap bm-down -data $bm_down_data -foreground $uifgcolor + ${NS}::button .tf.lbar.fnext -width 26 -command {dofind 1 1} + .tf.lbar.fnext configure -image bm-down + + set bm_up_data { + #define up_width 16 + #define up_height 16 + static unsigned char up_bits[] = { + 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, + 0xb8, 0x1d, 0x9c, 0x39, 0x8e, 0x71, 0x87, 0xe1, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}; + } + image create bitmap bm-up -data $bm_up_data -foreground $uifgcolor + ${NS}::button .tf.lbar.fprev -width 26 -command {dofind -1 1} + .tf.lbar.fprev configure -image bm-up + ${NS}::label .tf.lbar.flab2 -text " [mc "commit"] " + pack .tf.lbar.flabel .tf.lbar.fnext .tf.lbar.fprev .tf.lbar.flab2 \ -side left -fill y set gdttype [mc "containing:"] @@ -2384,7 +2429,8 @@ proc makewindow {} { $ctext tag conf msep -font textfontbold $ctext tag conf found -back $foundbgcolor $ctext tag conf currentsearchhit -back $currentsearchhitbgcolor - $ctext tag conf wwrap -wrap word + $ctext tag conf wwrap -wrap word -lmargin2 1c + $ctext tag conf bold -font textfontbold .pwbottom add .bleft if {!$use_ttk} { @@ -2741,14 +2787,17 @@ proc savestuff {w} { global linkfgcolor circleoutlinecolor global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk global hideremotes want_ttk maxrefs + global config_file config_file_tmp if {$stuffsaved} return if {![winfo viewable .]} return catch { - if {[file exists ~/.gitk-new]} {file delete -force ~/.gitk-new} - set f [open "~/.gitk-new" w] + if {[file exists $config_file_tmp]} { + file delete -force $config_file_tmp + } + set f [open $config_file_tmp w] if {$::tcl_platform(platform) eq {windows}} { - file attributes "~/.gitk-new" -hidden true + file attributes $config_file_tmp -hidden true } puts $f [list set mainfont $mainfont] puts $f [list set textfont $textfont] @@ -2825,7 +2874,7 @@ proc savestuff {w} { } puts $f "}" close $f - file rename -force "~/.gitk-new" "~/.gitk" + file rename -force $config_file_tmp $config_file } set stuffsaved 1 } @@ -2927,7 +2976,7 @@ proc about {} { message $w.m -text [mc " Gitk - a commit viewer for git -Copyright \u00a9 2005-2011 Paul Mackerras +Copyright \u00a9 2005-2014 Paul Mackerras Use and redistribute under the terms of the GNU General Public License"] \ -justify center -aspect 400 -border 2 -bg white -relief groove @@ -6387,6 +6436,25 @@ proc bindline {t id} { $canv bind $t <Button-1> "lineclick %x %y $id 1" } +proc graph_pane_width {} { + global use_ttk + + if {$use_ttk} { + set g [.tf.histframe.pwclist sashpos 0] + } else { + set g [.tf.histframe.pwclist sash coord 0] + } + return [lindex $g 0] +} + +proc totalwidth {l font extra} { + set tot 0 + foreach str $l { + set tot [expr {$tot + [font measure $font $str] + $extra}] + } + return $tot +} + proc drawtags {id x xt y1} { global idtags idheads idotherrefs mainhead global linespc lthickness @@ -6398,9 +6466,27 @@ proc drawtags {id x xt y1} { set marks {} set ntags 0 set nheads 0 + set singletag 0 + set maxtags 3 + set maxtagpct 25 + set maxwidth [expr {[graph_pane_width] * $maxtagpct / 100}] + set delta [expr {int(0.5 * ($linespc - $lthickness))}] + set extra [expr {$delta + $lthickness + $linespc}] + if {[info exists idtags($id)]} { set marks $idtags($id) set ntags [llength $marks] + if {$ntags > $maxtags || + [totalwidth $marks mainfont $extra] > $maxwidth} { + # show just a single "n tags..." tag + set singletag 1 + if {$ntags == 1} { + set marks [list "tag..."] + } else { + set marks [list [format "%d tags..." $ntags]] + } + set ntags 1 + } } if {[info exists idheads($id)]} { set marks [concat $marks $idheads($id)] @@ -6413,7 +6499,6 @@ proc drawtags {id x xt y1} { return $xt } - set delta [expr {int(0.5 * ($linespc - $lthickness))}] set yt [expr {$y1 - 0.5 * $linespc}] set yb [expr {$yt + $linespc - 1}] set xvals {} @@ -6428,7 +6513,7 @@ proc drawtags {id x xt y1} { } lappend xvals $xt lappend wvals $wid - set xt [expr {$xt + $delta + $wid + $lthickness + $linespc}] + set xt [expr {$xt + $wid + $extra}] } set t [$canv create line $x $y1 [lindex $xvals end] $y1 \ -width $lthickness -fill $reflinecolor -tags tag.$id] @@ -6444,7 +6529,12 @@ proc drawtags {id x xt y1} { $xr $yt $xr $yb $xl $yb $x [expr {$yb - $delta}] \ -width 1 -outline $tagoutlinecolor -fill $tagbgcolor \ -tags tag.$id] - $canv bind $t <1> [list showtag $tag_quoted 1] + if {$singletag} { + set tagclick [list showtags $id 1] + } else { + set tagclick [list showtag $tag_quoted 1] + } + $canv bind $t <1> $tagclick set rowtextx([rowofcommit $id]) [expr {$xr + $linespc}] } else { # draw a head or other ref @@ -6471,7 +6561,7 @@ proc drawtags {id x xt y1} { set t [$canv create text $xl $y1 -anchor w -text $tag -fill $headfgcolor \ -font $font -tags [list tag.$id text]] if {$ntags >= 0} { - $canv bind $t <1> [list showtag $tag_quoted 1] + $canv bind $t <1> $tagclick } elseif {$nheads >= 0} { $canv bind $t $ctxbut [list headmenu %X %Y $id $tag_quoted] } @@ -7080,6 +7170,7 @@ proc selectline {l isnew {desired_loc {}}} { global cmitmode showneartags allcommits global targetrow targetid lastscrollrows global autoselect autosellen jump_to_here + global vinlinediff catch {unset pending_select} $canv delete hover @@ -7221,6 +7312,8 @@ proc selectline {l isnew {desired_loc {}}} { init_flist [mc "Comments"] if {$cmitmode eq "tree"} { gettree $id + } elseif {$vinlinediff($curview) == 1} { + showinlinediff $id } elseif {[llength $olds] <= 1} { startdiff $id } else { @@ -7557,6 +7650,39 @@ proc startdiff {ids} { } } +proc showinlinediff {ids} { + global commitinfo commitdata ctext + global treediffs + + set info $commitinfo($ids) + set diff [lindex $info 7] + set difflines [split $diff "\n"] + + initblobdiffvars + set treediff {} + + set inhdr 0 + foreach line $difflines { + if {![string compare -length 5 "diff " $line]} { + set inhdr 1 + } elseif {$inhdr && ![string compare -length 4 "+++ " $line]} { + # offset also accounts for the b/ prefix + lappend treediff [string range $line 6 end] + set inhdr 0 + } + } + + set treediffs($ids) $treediff + add_flist $treediff + + $ctext conf -state normal + foreach line $difflines { + parseblobdiffline $ids $line + } + maybe_scroll_ctext 1 + $ctext conf -state disabled +} + # If the filename (name) is under any of the passed filter paths # then return true to include the file in the listing. proc path_filter {filter name} { @@ -7710,15 +7836,25 @@ proc changeworddiff {name ix op} { reselectline } +proc initblobdiffvars {} { + global diffencoding targetline diffnparents + global diffinhdr currdiffsubmod diffseehere + set targetline {} + set diffnparents 0 + set diffinhdr 0 + set diffencoding [get_path_encoding {}] + set currdiffsubmod "" + set diffseehere -1 +} + proc getblobdiffs {ids} { global blobdifffd diffids env - global diffinhdr treediffs + global treediffs global diffcontext global ignorespace global worddiff global limitdiffs vfilelimit curview - global diffencoding targetline diffnparents - global git_version currdiffsubmod + global git_version set textconv {} if {[package vcompare $git_version "1.6.1"] >= 0} { @@ -7742,13 +7878,9 @@ proc getblobdiffs {ids} { error_popup [mc "Error getting diffs: %s" $err] return } - set targetline {} - set diffnparents 0 - set diffinhdr 0 - set diffencoding [get_path_encoding {}] fconfigure $bdf -blocking 0 -encoding binary -eofchar {} set blobdifffd($ids) $bdf - set currdiffsubmod "" + initblobdiffvars filerun $bdf [list getblobdiffline $bdf $diffids] } @@ -7814,13 +7946,17 @@ proc makediffhdr {fname ids} { set diffline 0 } +proc blobdiffmaybeseehere {ateof} { + global diffseehere + if {$diffseehere >= 0} { + mark_ctext_line [lindex [split $diffseehere .] 0] + } + maybe_scroll_ctext $ateof +} + proc getblobdiffline {bdf ids} { - global diffids blobdifffd ctext curdiffstart - global diffnexthead diffnextnote difffilestart - global ctext_file_names ctext_file_lines - global diffinhdr treediffs mergemax diffnparents - global diffencoding jump_to_here targetline diffline currdiffsubmod - global worddiff + global diffids blobdifffd + global ctext set nr 0 $ctext conf -state normal @@ -7829,212 +7965,220 @@ proc getblobdiffline {bdf ids} { catch {close $bdf} return 0 } - if {![string compare -length 5 "diff " $line]} { - if {![regexp {^diff (--cc|--git) } $line m type]} { - set line [encoding convertfrom $line] - $ctext insert end "$line\n" hunksep - continue + parseblobdiffline $ids $line + } + $ctext conf -state disabled + blobdiffmaybeseehere [eof $bdf] + if {[eof $bdf]} { + catch {close $bdf} + return 0 + } + return [expr {$nr >= 1000? 2: 1}] +} + +proc parseblobdiffline {ids line} { + global ctext curdiffstart + global diffnexthead diffnextnote difffilestart + global ctext_file_names ctext_file_lines + global diffinhdr treediffs mergemax diffnparents + global diffencoding jump_to_here targetline diffline currdiffsubmod + global worddiff diffseehere + + if {![string compare -length 5 "diff " $line]} { + if {![regexp {^diff (--cc|--git) } $line m type]} { + set line [encoding convertfrom $line] + $ctext insert end "$line\n" hunksep + continue + } + # start of a new file + set diffinhdr 1 + $ctext insert end "\n" + set curdiffstart [$ctext index "end - 1c"] + lappend ctext_file_names "" + lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] + $ctext insert end "\n" filesep + + if {$type eq "--cc"} { + # start of a new file in a merge diff + set fname [string range $line 10 end] + if {[lsearch -exact $treediffs($ids) $fname] < 0} { + lappend treediffs($ids) $fname + add_flist [list $fname] } - # start of a new file - set diffinhdr 1 - $ctext insert end "\n" - set curdiffstart [$ctext index "end - 1c"] - lappend ctext_file_names "" - lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] - $ctext insert end "\n" filesep - - if {$type eq "--cc"} { - # start of a new file in a merge diff - set fname [string range $line 10 end] - if {[lsearch -exact $treediffs($ids) $fname] < 0} { - lappend treediffs($ids) $fname - add_flist [list $fname] - } + } else { + set line [string range $line 11 end] + # If the name hasn't changed the length will be odd, + # the middle char will be a space, and the two bits either + # side will be a/name and b/name, or "a/name" and "b/name". + # If the name has changed we'll get "rename from" and + # "rename to" or "copy from" and "copy to" lines following + # this, and we'll use them to get the filenames. + # This complexity is necessary because spaces in the + # filename(s) don't get escaped. + set l [string length $line] + set i [expr {$l / 2}] + if {!(($l & 1) && [string index $line $i] eq " " && + [string range $line 2 [expr {$i - 1}]] eq \ + [string range $line [expr {$i + 3}] end])} { + return + } + # unescape if quoted and chop off the a/ from the front + if {[string index $line 0] eq "\""} { + set fname [string range [lindex $line 0] 2 end] } else { - set line [string range $line 11 end] - # If the name hasn't changed the length will be odd, - # the middle char will be a space, and the two bits either - # side will be a/name and b/name, or "a/name" and "b/name". - # If the name has changed we'll get "rename from" and - # "rename to" or "copy from" and "copy to" lines following - # this, and we'll use them to get the filenames. - # This complexity is necessary because spaces in the - # filename(s) don't get escaped. - set l [string length $line] - set i [expr {$l / 2}] - if {!(($l & 1) && [string index $line $i] eq " " && - [string range $line 2 [expr {$i - 1}]] eq \ - [string range $line [expr {$i + 3}] end])} { - continue - } - # unescape if quoted and chop off the a/ from the front - if {[string index $line 0] eq "\""} { - set fname [string range [lindex $line 0] 2 end] - } else { - set fname [string range $line 2 [expr {$i - 1}]] - } + set fname [string range $line 2 [expr {$i - 1}]] } - makediffhdr $fname $ids + } + makediffhdr $fname $ids + + } elseif {![string compare -length 16 "* Unmerged path " $line]} { + set fname [encoding convertfrom [string range $line 16 end]] + $ctext insert end "\n" + set curdiffstart [$ctext index "end - 1c"] + lappend ctext_file_names $fname + lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] + $ctext insert end "$line\n" filesep + set i [lsearch -exact $treediffs($ids) $fname] + if {$i >= 0} { + setinlist difffilestart $i $curdiffstart + } + + } elseif {![string compare -length 2 "@@" $line]} { + regexp {^@@+} $line ats + set line [encoding convertfrom $diffencoding $line] + $ctext insert end "$line\n" hunksep + if {[regexp { \+(\d+),\d+ @@} $line m nl]} { + set diffline $nl + } + set diffnparents [expr {[string length $ats] - 1}] + set diffinhdr 0 - } elseif {![string compare -length 16 "* Unmerged path " $line]} { - set fname [encoding convertfrom [string range $line 16 end]] - $ctext insert end "\n" - set curdiffstart [$ctext index "end - 1c"] - lappend ctext_file_names $fname - lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] + } elseif {![string compare -length 10 "Submodule " $line]} { + # start of a new submodule + if {[regexp -indices "\[0-9a-f\]+\\.\\." $line nameend]} { + set fname [string range $line 10 [expr [lindex $nameend 0] - 2]] + } else { + set fname [string range $line 10 [expr [string first "contains " $line] - 2]] + } + if {$currdiffsubmod != $fname} { + $ctext insert end "\n"; # Add newline after commit message + } + set curdiffstart [$ctext index "end - 1c"] + lappend ctext_file_names "" + if {$currdiffsubmod != $fname} { + lappend ctext_file_lines $fname + makediffhdr $fname $ids + set currdiffsubmod $fname + $ctext insert end "\n$line\n" filesep + } else { $ctext insert end "$line\n" filesep + } + } elseif {![string compare -length 3 " >" $line]} { + set $currdiffsubmod "" + set line [encoding convertfrom $diffencoding $line] + $ctext insert end "$line\n" dresult + } elseif {![string compare -length 3 " <" $line]} { + set $currdiffsubmod "" + set line [encoding convertfrom $diffencoding $line] + $ctext insert end "$line\n" d0 + } elseif {$diffinhdr} { + if {![string compare -length 12 "rename from " $line]} { + set fname [string range $line [expr 6 + [string first " from " $line] ] end] + if {[string index $fname 0] eq "\""} { + set fname [lindex $fname 0] + } + set fname [encoding convertfrom $fname] set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { setinlist difffilestart $i $curdiffstart } - - } elseif {![string compare -length 2 "@@" $line]} { - regexp {^@@+} $line ats - set line [encoding convertfrom $diffencoding $line] - $ctext insert end "$line\n" hunksep - if {[regexp { \+(\d+),\d+ @@} $line m nl]} { - set diffline $nl + } elseif {![string compare -length 10 $line "rename to "] || + ![string compare -length 8 $line "copy to "]} { + set fname [string range $line [expr 4 + [string first " to " $line] ] end] + if {[string index $fname 0] eq "\""} { + set fname [lindex $fname 0] } - set diffnparents [expr {[string length $ats] - 1}] + makediffhdr $fname $ids + } elseif {[string compare -length 3 $line "---"] == 0} { + # do nothing + return + } elseif {[string compare -length 3 $line "+++"] == 0} { set diffinhdr 0 + return + } + $ctext insert end "$line\n" filesep - } elseif {![string compare -length 10 "Submodule " $line]} { - # start of a new submodule - if {[regexp -indices "\[0-9a-f\]+\\.\\." $line nameend]} { - set fname [string range $line 10 [expr [lindex $nameend 0] - 2]] - } else { - set fname [string range $line 10 [expr [string first "contains " $line] - 2]] - } - if {$currdiffsubmod != $fname} { - $ctext insert end "\n"; # Add newline after commit message - } - set curdiffstart [$ctext index "end - 1c"] - lappend ctext_file_names "" - if {$currdiffsubmod != $fname} { - lappend ctext_file_lines $fname - makediffhdr $fname $ids - set currdiffsubmod $fname - $ctext insert end "\n$line\n" filesep - } else { - $ctext insert end "$line\n" filesep - } - } elseif {![string compare -length 3 " >" $line]} { - set $currdiffsubmod "" - set line [encoding convertfrom $diffencoding $line] - $ctext insert end "$line\n" dresult - } elseif {![string compare -length 3 " <" $line]} { - set $currdiffsubmod "" - set line [encoding convertfrom $diffencoding $line] - $ctext insert end "$line\n" d0 - } elseif {$diffinhdr} { - if {![string compare -length 12 "rename from " $line]} { - set fname [string range $line [expr 6 + [string first " from " $line] ] end] - if {[string index $fname 0] eq "\""} { - set fname [lindex $fname 0] - } - set fname [encoding convertfrom $fname] - set i [lsearch -exact $treediffs($ids) $fname] - if {$i >= 0} { - setinlist difffilestart $i $curdiffstart + } else { + set line [string map {\x1A ^Z} \ + [encoding convertfrom $diffencoding $line]] + # parse the prefix - one ' ', '-' or '+' for each parent + set prefix [string range $line 0 [expr {$diffnparents - 1}]] + set tag [expr {$diffnparents > 1? "m": "d"}] + set dowords [expr {$worddiff ne [mc "Line diff"] && $diffnparents == 1}] + set words_pre_markup "" + set words_post_markup "" + if {[string trim $prefix " -+"] eq {}} { + # prefix only has " ", "-" and "+" in it: normal diff line + set num [string first "-" $prefix] + if {$dowords} { + set line [string range $line 1 end] + } + if {$num >= 0} { + # removed line, first parent with line is $num + if {$num >= $mergemax} { + set num "max" } - } elseif {![string compare -length 10 $line "rename to "] || - ![string compare -length 8 $line "copy to "]} { - set fname [string range $line [expr 4 + [string first " to " $line] ] end] - if {[string index $fname 0] eq "\""} { - set fname [lindex $fname 0] + if {$dowords && $worddiff eq [mc "Markup words"]} { + $ctext insert end "\[-$line-\]" $tag$num + } else { + $ctext insert end "$line" $tag$num } - makediffhdr $fname $ids - } elseif {[string compare -length 3 $line "---"] == 0} { - # do nothing - continue - } elseif {[string compare -length 3 $line "+++"] == 0} { - set diffinhdr 0 - continue - } - $ctext insert end "$line\n" filesep - - } else { - set line [string map {\x1A ^Z} \ - [encoding convertfrom $diffencoding $line]] - # parse the prefix - one ' ', '-' or '+' for each parent - set prefix [string range $line 0 [expr {$diffnparents - 1}]] - set tag [expr {$diffnparents > 1? "m": "d"}] - set dowords [expr {$worddiff ne [mc "Line diff"] && $diffnparents == 1}] - set words_pre_markup "" - set words_post_markup "" - if {[string trim $prefix " -+"] eq {}} { - # prefix only has " ", "-" and "+" in it: normal diff line - set num [string first "-" $prefix] - if {$dowords} { - set line [string range $line 1 end] + if {!$dowords} { + $ctext insert end "\n" $tag$num } - if {$num >= 0} { - # removed line, first parent with line is $num - if {$num >= $mergemax} { - set num "max" - } - if {$dowords && $worddiff eq [mc "Markup words"]} { - $ctext insert end "\[-$line-\]" $tag$num - } else { - $ctext insert end "$line" $tag$num - } - if {!$dowords} { - $ctext insert end "\n" $tag$num - } - } else { - set tags {} - if {[string first "+" $prefix] >= 0} { - # added line - lappend tags ${tag}result - if {$diffnparents > 1} { - set num [string first " " $prefix] - if {$num >= 0} { - if {$num >= $mergemax} { - set num "max" - } - lappend tags m$num + } else { + set tags {} + if {[string first "+" $prefix] >= 0} { + # added line + lappend tags ${tag}result + if {$diffnparents > 1} { + set num [string first " " $prefix] + if {$num >= 0} { + if {$num >= $mergemax} { + set num "max" } - } - set words_pre_markup "{+" - set words_post_markup "+}" - } - if {$targetline ne {}} { - if {$diffline == $targetline} { - set seehere [$ctext index "end - 1 chars"] - set targetline {} - } else { - incr diffline + lappend tags m$num } } - if {$dowords && $worddiff eq [mc "Markup words"]} { - $ctext insert end "$words_pre_markup$line$words_post_markup" $tags + set words_pre_markup "{+" + set words_post_markup "+}" + } + if {$targetline ne {}} { + if {$diffline == $targetline} { + set diffseehere [$ctext index "end - 1 chars"] + set targetline {} } else { - $ctext insert end "$line" $tags - } - if {!$dowords} { - $ctext insert end "\n" $tags + incr diffline } } - } elseif {$dowords && $prefix eq "~"} { - $ctext insert end "\n" {} - } else { - # "\ No newline at end of file", - # or something else we don't recognize - $ctext insert end "$line\n" hunksep + if {$dowords && $worddiff eq [mc "Markup words"]} { + $ctext insert end "$words_pre_markup$line$words_post_markup" $tags + } else { + $ctext insert end "$line" $tags + } + if {!$dowords} { + $ctext insert end "\n" $tags + } } + } elseif {$dowords && $prefix eq "~"} { + $ctext insert end "\n" {} + } else { + # "\ No newline at end of file", + # or something else we don't recognize + $ctext insert end "$line\n" hunksep } } - if {[info exists seehere]} { - mark_ctext_line [lindex [split $seehere .] 0] - } - maybe_scroll_ctext [eof $bdf] - $ctext conf -state disabled - if {[eof $bdf]} { - catch {close $bdf} - return 0 - } - return [expr {$nr >= 1000? 2: 1}] } proc changediffdisp {} { @@ -10878,6 +11022,23 @@ proc listrefs {id} { return [list $x $y $z] } +proc add_tag_ctext {tag} { + global ctext cached_tagcontent tagids + + if {![info exists cached_tagcontent($tag)]} { + catch { + set cached_tagcontent($tag) [exec git cat-file -p $tag] + } + } + $ctext insert end "[mc "Tag"]: $tag\n" bold + if {[info exists cached_tagcontent($tag)]} { + set text $cached_tagcontent($tag) + } else { + set text "[mc "Id"]: $tagids($tag)" + } + appendwithlinks $text {} +} + proc showtag {tag isnew} { global ctext cached_tagcontent tagids linknum tagobjid @@ -10888,17 +11049,28 @@ proc showtag {tag isnew} { clear_ctext settabs 0 set linknum 0 - if {![info exists cached_tagcontent($tag)]} { - catch { - set cached_tagcontent($tag) [exec git cat-file -p $tag] - } + add_tag_ctext $tag + maybe_scroll_ctext 1 + $ctext conf -state disabled + init_flist {} +} + +proc showtags {id isnew} { + global idtags ctext linknum + + if {$isnew} { + addtohistory [list showtags $id 0] savectextpos } - if {[info exists cached_tagcontent($tag)]} { - set text $cached_tagcontent($tag) - } else { - set text "[mc "Tag"]: $tag\n[mc "Id"]: $tagids($tag)" + $ctext conf -state normal + clear_ctext + settabs 0 + set linknum 0 + set sep {} + foreach tag $idtags($id) { + $ctext insert end $sep + add_tag_ctext $tag + set sep "\n\n" } - appendwithlinks $text {} maybe_scroll_ctext 1 $ctext conf -state disabled init_flist {} @@ -11915,7 +12087,29 @@ namespace import ::msgcat::mc ## And eventually load the actual message catalog ::msgcat::mcload $gitk_msgsdir -catch {source ~/.gitk} +catch { + # follow the XDG base directory specification by default. See + # http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + if {[info exists env(XDG_CONFIG_HOME)] && $env(XDG_CONFIG_HOME) ne ""} { + # XDG_CONFIG_HOME environment variable is set + set config_file [file join $env(XDG_CONFIG_HOME) git gitk] + set config_file_tmp [file join $env(XDG_CONFIG_HOME) git gitk-tmp] + } else { + # default XDG_CONFIG_HOME + set config_file "~/.config/git/gitk" + set config_file_tmp "~/.config/git/gitk-tmp" + } + if {![file exists $config_file]} { + # for backward compatibility use the old config file if it exists + if {[file exists "~/.gitk"]} { + set config_file "~/.gitk" + set config_file_tmp "~/.gitk-tmp" + } elseif {![file exists [file dirname $config_file]]} { + file mkdir [file dirname $config_file] + } + } + source $config_file +} parsefont mainfont $mainfont eval font create mainfont [fontflags mainfont] diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po new file mode 100644 index 0000000000..782397e6b5 --- /dev/null +++ b/gitk-git/po/bg.po @@ -0,0 +1,1334 @@ +# Bulgarian translation of gitk po-file. +# Copyright (C) 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gitk master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-01-26 15:47-0800\n" +"PO-Revision-Date: 2014-01-08 08:03+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: gitk:140 +msgid "Couldn't get list of unmerged files:" +msgstr "СпиÑъкът Ñ Ð½ÐµÑлети файлове не може да бъде получен:" + +#: gitk:212 gitk:2353 +msgid "Color words" +msgstr "ОцветÑване на думите" + +#: gitk:217 gitk:2353 gitk:8103 gitk:8136 +msgid "Markup words" +msgstr "ОтбелÑзване на думите" + +#: gitk:322 +msgid "Error parsing revisions:" +msgstr "Грешка при разбор на верÑиите:" + +#: gitk:378 +msgid "Error executing --argscmd command:" +msgstr "Грешка при изпълнение на командата Ñ â€ž--argscmd“." + +#: gitk:391 +msgid "No files selected: --merge specified but no files are unmerged." +msgstr "Ðе Ñа избрани файлове — указана е опциÑта „--merge“, но нÑма неÑлети файлове." + +#: gitk:394 +msgid "" +"No files selected: --merge specified but no unmerged files are within file " +"limit." +msgstr "Ðе Ñа избрани файлове — указана е опциÑта „--merge“, но нÑма неÑлети файлове в ограничениÑта." + +#: gitk:416 gitk:564 +msgid "Error executing git log:" +msgstr "Грешка при изпълнение на „git log“:" + +#: gitk:434 gitk:580 +msgid "Reading" +msgstr "Прочитане" + +#: gitk:494 gitk:4429 +msgid "Reading commits..." +msgstr "Прочитане на подаваниÑта…" + +#: gitk:497 gitk:1635 gitk:4432 +msgid "No commits selected" +msgstr "Ðе Ñа избрани подаваниÑ" + +#: gitk:1509 +msgid "Can't parse git log output:" +msgstr "Изходът от „git log“ не може да Ñе анализира:" + +#: gitk:1738 +msgid "No commit information available" +msgstr "ЛипÑва Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° подаваниÑ" + +#: gitk:1895 +msgid "mc" +msgstr "mc" + +#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401 +msgid "OK" +msgstr "Добре" + +#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554 +#: gitk:11123 gitk:11402 +msgid "Cancel" +msgstr "Отказ" + +#: gitk:2067 +msgid "Update" +msgstr "ОбновÑване" + +#: gitk:2068 +msgid "Reload" +msgstr "Презареждане" + +#: gitk:2069 +msgid "Reread references" +msgstr "Ðаново прочитане на наÑтройките" + +#: gitk:2070 +msgid "List references" +msgstr "ИзброÑване на указателите" + +#: gitk:2072 +msgid "Start git gui" +msgstr "Стартиране на git gui" + +#: gitk:2074 +msgid "Quit" +msgstr "Спиране на програмата" + +#: gitk:2066 +msgid "File" +msgstr "Файл" + +#: gitk:2078 +msgid "Preferences" +msgstr "ÐаÑтройки" + +#: gitk:2077 +msgid "Edit" +msgstr "Редактиране" + +#: gitk:2082 +msgid "New view..." +msgstr "Ðов изглед…" + +#: gitk:2083 +msgid "Edit view..." +msgstr "Редактиране на изгледа…" + +#: gitk:2084 +msgid "Delete view" +msgstr "Изтриване на изгледа" + +#: gitk:2086 +msgid "All files" +msgstr "Ð’Ñички файлове" + +#: gitk:2081 gitk:3975 +msgid "View" +msgstr "Изглед" + +#: gitk:2091 gitk:2101 gitk:2945 +msgid "About gitk" +msgstr "ОтноÑно gitk" + +#: gitk:2092 gitk:2106 +msgid "Key bindings" +msgstr "Клавишни комбинации" + +#: gitk:2090 gitk:2105 +msgid "Help" +msgstr "Помощ" + +#: gitk:2183 gitk:8535 +msgid "SHA1 ID:" +msgstr "SHA1:" + +#: gitk:2227 +msgid "Row" +msgstr "Ред" + +#: gitk:2265 +msgid "Find" +msgstr "ТърÑене" + +#: gitk:2266 +msgid "next" +msgstr "Ñледващо" + +#: gitk:2267 +msgid "prev" +msgstr "предишно" + +#: gitk:2268 +msgid "commit" +msgstr "подаване" + +#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725 +#: gitk:6810 +msgid "containing:" +msgstr "Ñъдържащо:" + +#: gitk:2274 gitk:3457 gitk:3462 gitk:4666 +msgid "touching paths:" +msgstr "заÑÑгащо пътищата:" + +#: gitk:2275 gitk:4680 +msgid "adding/removing string:" +msgstr "добавÑщо/премахващо низ" + +#: gitk:2276 gitk:4682 +msgid "changing lines matching:" +msgstr "променÑщо редове напаÑващи:" + +#: gitk:2285 gitk:2287 gitk:4669 +msgid "Exact" +msgstr "Точно" + +#: gitk:2287 gitk:4757 gitk:6621 +msgid "IgnCase" +msgstr "Без региÑтър" + +#: gitk:2287 gitk:4639 gitk:4755 gitk:6617 +msgid "Regexp" +msgstr "Рег. изр." + +#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814 +msgid "All fields" +msgstr "Ð’Ñички полета" + +#: gitk:2290 gitk:4774 gitk:4807 gitk:6684 +msgid "Headline" +msgstr "Първи ред" + +#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283 +msgid "Comments" +msgstr "Коментари" + +#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713 +#: gitk:8728 +msgid "Author" +msgstr "Ðвтор" + +#: gitk:2291 gitk:4774 gitk:6684 gitk:7220 +msgid "Committer" +msgstr "Подаващ" + +#: gitk:2322 +msgid "Search" +msgstr "ТърÑене" + +#: gitk:2330 +msgid "Diff" +msgstr "Разлики" + +#: gitk:2332 +msgid "Old version" +msgstr "Стара верÑиÑ" + +#: gitk:2334 +msgid "New version" +msgstr "Ðова верÑиÑ" + +#: gitk:2336 +msgid "Lines of context" +msgstr "КонтекÑÑ‚ в редове" + +#: gitk:2346 +msgid "Ignore space change" +msgstr "Празните знаци без значение" + +#: gitk:2350 gitk:2352 gitk:7842 gitk:8089 +msgid "Line diff" +msgstr "Поредови разлики" + +#: gitk:2417 +msgid "Patch" +msgstr "Кръпка" + +#: gitk:2419 +msgid "Tree" +msgstr "Дърво" + +#: gitk:2577 gitk:2597 +msgid "Diff this -> selected" +msgstr "Разлики между това и избраното" + +#: gitk:2578 gitk:2598 +msgid "Diff selected -> this" +msgstr "Разлики между избраното и това" + +#: gitk:2579 gitk:2599 +msgid "Make patch" +msgstr "Създаване на кръпка" + +#: gitk:2580 gitk:9137 +msgid "Create tag" +msgstr "Създаване на етикет" + +#: gitk:2581 gitk:9254 +msgid "Write commit to file" +msgstr "Запазване на подаването във файл" + +#: gitk:2582 gitk:9311 +msgid "Create new branch" +msgstr "Създаване на нов клон" + +#: gitk:2583 +msgid "Cherry-pick this commit" +msgstr "Отбиране на това подаване" + +#: gitk:2584 +msgid "Reset HEAD branch to here" +msgstr "Привеждане на върха на клона към текущото подаване" + +#: gitk:2585 +msgid "Mark this commit" +msgstr "ОтбелÑзване на това подаване" + +#: gitk:2586 +msgid "Return to mark" +msgstr "Връщане към отбелÑзаното подаване" + +#: gitk:2587 +msgid "Find descendant of this and mark" +msgstr "Откриване и отбелÑзване на наÑледниците" + +#: gitk:2588 +msgid "Compare with marked commit" +msgstr "Сравнение Ñ Ð¾Ñ‚Ð±ÐµÐ»Ñзаното подаване" + +#: gitk:2589 gitk:2600 +msgid "Diff this -> marked commit" +msgstr "Разлики между това и отбелÑзаното" + +#: gitk:2590 gitk:2601 +msgid "Diff marked commit -> this" +msgstr "Разлики между отбелÑзаното и това" + +#: gitk:2591 +msgid "Revert this commit" +msgstr "ОтмÑна на това подаване" + +#: gitk:2607 +msgid "Check out this branch" +msgstr "ИзтеглÑне на този клон" + +#: gitk:2608 +msgid "Remove this branch" +msgstr "Изтриване на този клон" + +#: gitk:2615 +msgid "Highlight this too" +msgstr "ОтбелÑзване и на това" + +#: gitk:2616 +msgid "Highlight this only" +msgstr "ОтбелÑзване Ñамо на това" + +#: gitk:2617 +msgid "External diff" +msgstr "Външна програма за разлики" + +#: gitk:2618 +msgid "Blame parent commit" +msgstr "Ðнотиране на родителÑкото подаване" + +#: gitk:2625 +msgid "Show origin of this line" +msgstr "Показване на произхода на този ред" + +#: gitk:2626 +msgid "Run git gui blame on this line" +msgstr "Изпълнение на „git gui blame“ върху този ред" + +#: gitk:2947 +msgid "" +"\n" +"Gitk - a commit viewer for git\n" +"\n" +"Copyright © 2005-2011 Paul Mackerras\n" +"\n" +"Use and redistribute under the terms of the GNU General Public License" +msgstr "" +"\n" +"Gitk — Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° подаваниÑта в Git\n" +"\n" +"ÐвторÑки права: © 2005-2011 Paul Mackerras\n" +"\n" +"Използвайте и разпроÑтранÑвайте при уÑловиÑта на ОПЛ на ГÐУ" + +#: gitk:2955 gitk:3020 gitk:9738 +msgid "Close" +msgstr "ЗатварÑне" + +#: gitk:2976 +msgid "Gitk key bindings" +msgstr "Клавишни комбинации" + +#: gitk:2979 +msgid "Gitk key bindings:" +msgstr "Клавишни комбинации:" + +#: gitk:2981 +#, tcl-format +msgid "<%s-Q>\t\tQuit" +msgstr "<%s-Q>\t\tСпиране на програмата" + +#: gitk:2982 +#, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-W>\t\tЗатварÑне на прозореца" + +#: gitk:2983 +msgid "<Home>\t\tMove to first commit" +msgstr "<Home>\t\tКъм първото подаване" + +#: gitk:2984 +msgid "<End>\t\tMove to last commit" +msgstr "<End>\t\tКъм поÑледното подаване" + +#: gitk:2985 +msgid "<Up>, p, k\tMove up one commit" +msgstr "<Up>, p, k\tЕдно подаване нагоре" + +#: gitk:2986 +msgid "<Down>, n, j\tMove down one commit" +msgstr "<Down>, n, j\tЕдно подаване надолу" + +#: gitk:2987 +msgid "<Left>, z, h\tGo back in history list" +msgstr "<Left>, z, h\tÐазад в иÑториÑта" + +#: gitk:2988 +msgid "<Right>, x, l\tGo forward in history list" +msgstr "<Right>, x, l\tÐапред в иÑториÑта" + +#: gitk:2989 +msgid "<PageUp>\tMove up one page in commit list" +msgstr "<PageUp>\tЕдна Ñтраница нагоре в ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта" + +#: gitk:2990 +msgid "<PageDown>\tMove down one page in commit list" +msgstr "<PageDown>\tЕдна Ñтраница надолу в ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта" + +#: gitk:2991 +#, tcl-format +msgid "<%s-Home>\tScroll to top of commit list" +msgstr "<%s-Home>\tКъм началото на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта" + +#: gitk:2992 +#, tcl-format +msgid "<%s-End>\tScroll to bottom of commit list" +msgstr "<%s-End>\tКъм ÐºÑ€Ð°Ñ Ð½Ð° ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта" + +#: gitk:2993 +#, tcl-format +msgid "<%s-Up>\tScroll commit list up one line" +msgstr "<%s-Up>\tПридвижване на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñ ÐµÐ´Ð¸Ð½ ред нагоре" + +#: gitk:2994 +#, tcl-format +msgid "<%s-Down>\tScroll commit list down one line" +msgstr "<%s-Down>\tПридвижване на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñ ÐµÐ´Ð¸Ð½ ред надолу" + +#: gitk:2995 +#, tcl-format +msgid "<%s-PageUp>\tScroll commit list up one page" +msgstr "<%s-PageUp>\tПридвижване на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñ ÐµÐ´Ð½Ð° Ñтраница нагоре" + +#: gitk:2996 +#, tcl-format +msgid "<%s-PageDown>\tScroll commit list down one page" +msgstr "<%s-PageDown>\tПридвижване на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñ ÐµÐ´Ð½Ð° Ñтраница надолу" + +#: gitk:2997 +msgid "<Shift-Up>\tFind backwards (upwards, later commits)" +msgstr "<Shift-Up>\tТърÑене назад (визуално нагоре, иÑторичеÑки — поÑледващи)" + +#: gitk:2998 +msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" +msgstr "<Shift-Down>\tТърÑене напред (визуално надолу, иÑторичеÑки — предхождащи)" + +#: gitk:2999 +msgid "<Delete>, b\tScroll diff view up one page" +msgstr "<Delete>, b\tПридвижване на изгледа за разлики една Ñтраница нагоре" + +#: gitk:3000 +msgid "<Backspace>\tScroll diff view up one page" +msgstr "<Backspace>\tПридвижване на изгледа за разлики една Ñтраница нагоре" + +#: gitk:3001 +msgid "<Space>\t\tScroll diff view down one page" +msgstr "<Space>\t\tПридвижване на изгледа за разлики една Ñтраница надолу" + +#: gitk:3002 +msgid "u\t\tScroll diff view up 18 lines" +msgstr "u\t\tПридвижване на изгледа за разлики 18 реда нагоре" + +#: gitk:3003 +msgid "d\t\tScroll diff view down 18 lines" +msgstr "d\t\tПридвижване на изгледа за разлики 18 реда надолу" + +#: gitk:3004 +#, tcl-format +msgid "<%s-F>\t\tFind" +msgstr "<%s-F>\t\tТърÑене" + +#: gitk:3005 +#, tcl-format +msgid "<%s-G>\t\tMove to next find hit" +msgstr "<%s-G>\t\tКъм Ñледващата поÑва" + +#: gitk:3006 +msgid "<Return>\tMove to next find hit" +msgstr "<Return>\tКъм Ñледващата поÑва" + +#: gitk:3007 +msgid "/\t\tFocus the search box" +msgstr "/\t\tÐ¤Ð¾ÐºÑƒÑ Ð²ÑŠÑ€Ñ…Ñƒ полето за търÑене" + +#: gitk:3008 +msgid "?\t\tMove to previous find hit" +msgstr "?\t\tКъм предишната поÑва" + +#: gitk:3009 +msgid "f\t\tScroll diff view to next file" +msgstr "f\t\tПридвижване на изгледа за разлики към ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ñ€ÐµÐ´" + +#: gitk:3010 +#, tcl-format +msgid "<%s-S>\t\tSearch for next hit in diff view" +msgstr "<%s-S>\t\tТърÑене на Ñледващата поÑва в изгледа за разлики" + +#: gitk:3011 +#, tcl-format +msgid "<%s-R>\t\tSearch for previous hit in diff view" +msgstr "<%s-R>\t\tТърÑене на предишната поÑва в изгледа за разлики" + +#: gitk:3012 +#, tcl-format +msgid "<%s-KP+>\tIncrease font size" +msgstr "<%s-KP+>\tПо-голÑм размер на шрифта" + +#: gitk:3013 +#, tcl-format +msgid "<%s-plus>\tIncrease font size" +msgstr "<%s-plus>\tПо-голÑм размер на шрифта" + +#: gitk:3014 +#, tcl-format +msgid "<%s-KP->\tDecrease font size" +msgstr "<%s-KP->\tПо-малък размер на шрифта" + +#: gitk:3015 +#, tcl-format +msgid "<%s-minus>\tDecrease font size" +msgstr "<%s-minus>\tПо-малък размер на шрифта" + +#: gitk:3016 +msgid "<F5>\t\tUpdate" +msgstr "<F5>\t\tОбновÑване" + +#: gitk:3471 gitk:3480 +#, tcl-format +msgid "Error creating temporary directory %s:" +msgstr "Грешка при Ñъздаването на временната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ â€ž%s“:" + +#: gitk:3493 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Грешка при получаването на „%s“ от %s:" + +#: gitk:3556 +msgid "command failed:" +msgstr "неуÑпешно изпълнение на команда:" + +#: gitk:3705 +msgid "No such commit" +msgstr "Такова подаване нÑма" + +#: gitk:3719 +msgid "git gui blame: command failed:" +msgstr "git gui blame: неуÑпешно изпълнение на команда:" + +#: gitk:3750 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "Върхът за Ñливане не може да бъде прочетен: %s" + +#: gitk:3758 +#, tcl-format +msgid "Error reading index: %s" +msgstr "Грешка при прочитане на индекÑа: %s" + +#: gitk:3783 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "Командата „git blame“ не може да бъде Ñтартирана: %s" + +#: gitk:3786 gitk:6652 +msgid "Searching" +msgstr "ТърÑене" + +#: gitk:3818 +#, tcl-format +msgid "Error running git blame: %s" +msgstr "Грешка при изпълнението на „git blame“: %s" + +#: gitk:3846 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "Този ред идва от подаването %s, което не е в изгледа" + +#: gitk:3860 +msgid "External diff viewer failed:" +msgstr "ÐеуÑпешно изпълнение на външната програма за разлики:" + +#: gitk:3978 +msgid "Gitk view definition" +msgstr "Ð”ÐµÑ„Ð¸Ð½Ð¸Ñ†Ð¸Ñ Ð½Ð° изглед в Gitk" + +#: gitk:3982 +msgid "Remember this view" +msgstr "Запазване на този изглед" + +#: gitk:3983 +msgid "References (space separated list):" +msgstr "Указатели (ÑпиÑък Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ» интервал):" + +#: gitk:3984 +msgid "Branches & tags:" +msgstr "Клони и етикети:" + +#: gitk:3985 +msgid "All refs" +msgstr "Ð’Ñички указатели" + +#: gitk:3986 +msgid "All (local) branches" +msgstr "Ð’Ñички (локални) клони" + +#: gitk:3987 +msgid "All tags" +msgstr "Ð’Ñички етикети" + +#: gitk:3988 +msgid "All remote-tracking branches" +msgstr "Ð’Ñички ÑледÑщи клони" + +#: gitk:3989 +msgid "Commit Info (regular expressions):" +msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° подаване (рег. изр.):" + +#: gitk:3990 +msgid "Author:" +msgstr "Ðвтор:" + +#: gitk:3991 +msgid "Committer:" +msgstr "Подал:" + +#: gitk:3992 +msgid "Commit Message:" +msgstr "Съобщение при подаване:" + +#: gitk:3993 +msgid "Matches all Commit Info criteria" +msgstr "Съвпадение по ÐºÐ¾Ñ Ð´Ð° е Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° подаването" + +#: gitk:3994 +msgid "Changes to Files:" +msgstr "Промени по файловете:" + +#: gitk:3995 +msgid "Fixed String" +msgstr "ДоÑловен низ" + +#: gitk:3996 +msgid "Regular Expression" +msgstr "РегулÑрен израз" + +#: gitk:3997 +msgid "Search string:" +msgstr "Ðиз за търÑене:" + +#: gitk:3998 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "Дата на подаване („2 weeks ago“ (преди 2 Ñедмици), „2009-03-17 15:27:38“, „March 17, 2009 15:27:38“):" + +#: gitk:3999 +msgid "Since:" +msgstr "От:" + +#: gitk:4000 +msgid "Until:" +msgstr "До:" + +#: gitk:4001 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "Ограничаване и/или преÑкачане на определен брой верÑии (неотрицателно цÑло чиÑло):" + +#: gitk:4002 +msgid "Number to show:" +msgstr "Брой показани:" + +#: gitk:4003 +msgid "Number to skip:" +msgstr "Брой преÑкочени:" + +#: gitk:4004 +msgid "Miscellaneous options:" +msgstr "Разни:" + +#: gitk:4005 +msgid "Strictly sort by date" +msgstr "Подреждане по дата" + +#: gitk:4006 +msgid "Mark branch sides" +msgstr "ОтбелÑзване на Ñтраните по клона" + +#: gitk:4007 +msgid "Limit to first parent" +msgstr "Само първиÑÑ‚ родител" + +#: gitk:4008 +msgid "Simple history" +msgstr "ОпроÑтена иÑториÑ" + +#: gitk:4009 +msgid "Additional arguments to git log:" +msgstr "Допълнителни аргументи към „git log“:" + +#: gitk:4010 +msgid "Enter files and directories to include, one per line:" +msgstr "Въведете файловете и директориите за включване, по елемент на ред" + +#: gitk:4011 +msgid "Command to generate more commits to include:" +msgstr "Команда за генерирането на допълнителни подаваниÑ, които да бъдат включени:" + +#: gitk:4135 +msgid "Gitk: edit view" +msgstr "Gitk: редактиране на изглед" + +#: gitk:4143 +msgid "-- criteria for selecting revisions" +msgstr "— критерии за избор на верÑии" + +#: gitk:4148 +msgid "View Name" +msgstr "Име на изглед" + +#: gitk:4223 +msgid "Apply (F5)" +msgstr "Прилагане (F5)" + +#: gitk:4261 +msgid "Error in commit selection arguments:" +msgstr "Грешка в аргументите за избор на подаваниÑ:" + +#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185 +msgid "None" +msgstr "ÐÑма" + +#: gitk:4924 gitk:4929 +msgid "Descendant" +msgstr "ÐаÑледник" + +#: gitk:4925 +msgid "Not descendant" +msgstr "Ðе е наÑледник" + +#: gitk:4932 gitk:4937 +msgid "Ancestor" +msgstr "ПредшеÑтвеник" + +#: gitk:4933 +msgid "Not ancestor" +msgstr "Ðе е предшеÑтвеник" + +#: gitk:5223 +msgid "Local changes checked in to index but not committed" +msgstr "Локални промени добавени към индекÑа, но неподадени" + +#: gitk:5259 +msgid "Local uncommitted changes, not checked in to index" +msgstr "Локални промени извън индекÑа" + +#: gitk:7032 +msgid "and many more" +msgstr "и още много" + +#: gitk:7035 +msgid "many" +msgstr "много" + +#: gitk:7222 +msgid "Tags:" +msgstr "Етикети:" + +#: gitk:7239 gitk:7245 gitk:8708 +msgid "Parent" +msgstr "Родител" + +#: gitk:7250 +msgid "Child" +msgstr "Дете" + +#: gitk:7259 +msgid "Branch" +msgstr "Клон" + +#: gitk:7262 +msgid "Follows" +msgstr "Следва" + +#: gitk:7265 +msgid "Precedes" +msgstr "ПредшеÑтва" + +#: gitk:7849 +#, tcl-format +msgid "Error getting diffs: %s" +msgstr "Грешка при получаването на разликите: %s" + +#: gitk:8533 +msgid "Goto:" +msgstr "Към ред:" + +#: gitk:8554 +#, tcl-format +msgid "Short SHA1 id %s is ambiguous" +msgstr "Съкратената SHA1 %s не е еднозначна" + +#: gitk:8561 +#, tcl-format +msgid "Revision %s is not known" +msgstr "Ðепозната верÑÐ¸Ñ %s" + +#: gitk:8571 +#, tcl-format +msgid "SHA1 id %s is not known" +msgstr "Ðепозната SHA1 %s" + +#: gitk:8573 +#, tcl-format +msgid "Revision %s is not in the current view" +msgstr "ВерÑÐ¸Ñ %s не е в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð¸Ð·Ð³Ð»ÐµÐ´" + +#: gitk:8715 gitk:8730 +msgid "Date" +msgstr "Дата" + +#: gitk:8718 +msgid "Children" +msgstr "Деца" + +#: gitk:8781 +#, tcl-format +msgid "Reset %s branch to here" +msgstr "ЗанулÑване на клона „%s“ към текущото подаване" + +#: gitk:8783 +msgid "Detached head: can't reset" +msgstr "ÐеÑвързан връх: невъзможно занулÑване" + +#: gitk:8888 gitk:8894 +msgid "Skipping merge commit " +msgstr "ПропуÑкане на подаването на Ñливането" + +#: gitk:8903 gitk:8908 +msgid "Error getting patch ID for " +msgstr "Грешка при получаването на идентификатора на " + +#: gitk:8904 gitk:8909 +msgid " - stopping\n" +msgstr " — Ñпиране\n" + +#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948 +msgid "Commit " +msgstr "Подаване" + +#: gitk:8918 +msgid "" +" is the same patch as\n" +" " +msgstr "" +" е Ñъщата кръпка като\n" +" " + +#: gitk:8926 +msgid "" +" differs from\n" +" " +msgstr "" +" Ñе различава от\n" +" " + +#: gitk:8928 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "Разлика между подаваниÑта:\n\n" + +#: gitk:8940 gitk:8949 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr " има %s деца — Ñпиране\n" + +#: gitk:8968 +#, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Грешка при запазването на подаването във файл: %s" + +#: gitk:8974 +#, tcl-format +msgid "Error diffing commits: %s" +msgstr "Грешка при изчиÑлÑването на разликите между подаваниÑта: %s" + +#: gitk:9020 +msgid "Top" +msgstr "Ðай-горе" + +#: gitk:9021 +msgid "From" +msgstr "От" + +#: gitk:9026 +msgid "To" +msgstr "До" + +#: gitk:9050 +msgid "Generate patch" +msgstr "Генериране на кръпка" + +#: gitk:9052 +msgid "From:" +msgstr "От:" + +#: gitk:9061 +msgid "To:" +msgstr "До:" + +#: gitk:9070 +msgid "Reverse" +msgstr "Обръщане" + +#: gitk:9072 gitk:9268 +msgid "Output file:" +msgstr "Запазване във файла:" + +#: gitk:9078 +msgid "Generate" +msgstr "Генериране" + +#: gitk:9116 +msgid "Error creating patch:" +msgstr "Грешка при Ñъздаването на кръпка:" + +#: gitk:9139 gitk:9256 gitk:9313 +msgid "ID:" +msgstr "Идентификатор:" + +#: gitk:9148 +msgid "Tag name:" +msgstr "Име на етикет:" + +#: gitk:9151 +msgid "Tag message is optional" +msgstr "Съобщението за етикет е незадължително" + +#: gitk:9153 +msgid "Tag message:" +msgstr "Съобщение за етикет:" + +#: gitk:9157 gitk:9322 +msgid "Create" +msgstr "Създаване" + +#: gitk:9175 +msgid "No tag name specified" +msgstr "ЛипÑва име на етикет" + +#: gitk:9179 +#, tcl-format +msgid "Tag \"%s\" already exists" +msgstr "Етикетът „%s“ вече ÑъщеÑтвува" + +#: gitk:9189 +msgid "Error creating tag:" +msgstr "Грешка при Ñъздаването на етикет:" + +#: gitk:9265 +msgid "Command:" +msgstr "Команда:" + +#: gitk:9273 +msgid "Write" +msgstr "Pdmdpldke" + +#: gitk:9291 +msgid "Error writing commit:" +msgstr "Грешка при запазването на подаването:" + +#: gitk:9318 +msgid "Name:" +msgstr "Име:" + +#: gitk:9341 +msgid "Please specify a name for the new branch" +msgstr "Укажете име за Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: gitk:9346 +#, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "Клонът „%s“ вече ÑъщеÑтвува. Да бъде ли презапиÑан?" + +#: gitk:9413 +#, tcl-format +msgid "Commit %s is already included in branch %s -- really re-apply it?" +msgstr "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?" + +#: gitk:9418 +msgid "Cherry-picking" +msgstr "Отбиране" + +#: gitk:9427 +#, tcl-format +msgid "" +"Cherry-pick failed because of local changes to file '%s'.\n" +"Please commit, reset or stash your changes and try again." +msgstr "" +"ÐеуÑпешно отбиране, защото във файла „%s“ има локални промени.\n" +"Подайте, занулете или ги Ñкатайте и пробвайте отново." + +#: gitk:9433 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" +"ÐеуÑпешно отбиране поради конфликти при Ñливане.\n" +"ИÑкате ли да ги коригирате чрез „git citool“?" + +#: gitk:9449 gitk:9507 +msgid "No changes committed" +msgstr "Ðе Ñа подадени промени" + +#: gitk:9476 +#, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?" + +#: gitk:9481 +msgid "Reverting" +msgstr "ОтмÑна" + +#: gitk:9489 +#, tcl-format +msgid "" +"Revert failed because of local changes to the following files:%s Please " +"commit, reset or stash your changes and try again." +msgstr "" +"ÐеуÑпешна отмÑна, защото във файла „%s“ има локални промени.\n" +"Подайте, занулете или ги Ñкатайте и пробвайте отново.<" + +#: gitk:9493 +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"ÐеуÑпешно отмÑна поради конфликти при Ñливане.\n" +"ИÑкате ли да ги коригирате чрез „git citool“?" + +#: gitk:9536 +msgid "Confirm reset" +msgstr "Потвърждаване на занулÑването" + +#: gitk:9538 +#, tcl-format +msgid "Reset branch %s to %s?" +msgstr "Да Ñе занули ли клона „%s“ към „%s“?" + +#: gitk:9540 +msgid "Reset type:" +msgstr "Вид занулÑване:" + +#: gitk:9543 +msgid "Soft: Leave working tree and index untouched" +msgstr "Слабо: работното дърво и индекÑа оÑтават Ñъщите" + +#: gitk:9546 +msgid "Mixed: Leave working tree untouched, reset index" +msgstr "СмеÑено: работното дърво оÑтава Ñъщото, индекÑÑŠÑ‚ Ñе занулÑва" + +#: gitk:9549 +msgid "" +"Hard: Reset working tree and index\n" +"(discard ALL local changes)" +msgstr "" +"Силно: занулÑване и на работното дърво, и на индекÑа\n" +"(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)" + +#: gitk:9566 +msgid "Resetting" +msgstr "ЗанулÑване" + +#: gitk:9626 +msgid "Checking out" +msgstr "ИзтеглÑне" + +#: gitk:9679 +msgid "Cannot delete the currently checked-out branch" +msgstr "Текущо изтеглениÑÑ‚ клон не може да бъде изтрит" + +#: gitk:9685 +#, tcl-format +msgid "" +"The commits on branch %s aren't on any other branch.\n" +"Really delete branch %s?" +msgstr "" +"ПодаваниÑта на клона „%s“ не Ñа на никой друг клон.\n" +"ÐаиÑтина ли да Ñе изтрие клона „%s“?" + +#: gitk:9716 +#, tcl-format +msgid "Tags and heads: %s" +msgstr "Етикети и върхове: %s" + +#: gitk:9731 +msgid "Filter" +msgstr "Филтриране" + +#: gitk:10027 +msgid "" +"Error reading commit topology information; branch and preceding/following " +"tag information will be incomplete." +msgstr "Грешка при прочитането на топологиÑта на подаваниÑта. ИнформациÑта за клона и предшеÑтващите/Ñледващите етикети ще е непълна." + +#: gitk:11004 +msgid "Tag" +msgstr "Етикет" + +#: gitk:11008 +msgid "Id" +msgstr "Идентификатор" + +#: gitk:11091 +msgid "Gitk font chooser" +msgstr "Избор на шрифт за Gitk" + +#: gitk:11108 +msgid "B" +msgstr "Ч" + +#: gitk:11111 +msgid "I" +msgstr "К" + +#: gitk:11229 +msgid "Commit list display options" +msgstr "ÐаÑтройки на ÑпиÑъка Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ" + +#: gitk:11232 +msgid "Maximum graph width (lines)" +msgstr "МакÑимална широчина на графа (в редове)" + +#: gitk:11235 +#, tcl-format +msgid "Maximum graph width (% of pane)" +msgstr "МакÑимална широчина на графа (% от панела)" + +#: gitk:11238 +msgid "Show local changes" +msgstr "Показване на локалните промени" + +#: gitk:11241 +msgid "Auto-select SHA1 (length)" +msgstr "Ðвтоматично избиране на SHA1 (дължина)" + +#: gitk:11245 +msgid "Hide remote refs" +msgstr "Скриване на отдалечените указатели" + +#: gitk:11249 +msgid "Diff display options" +msgstr "ÐаÑтройки на показването на разликите" + +#: gitk:11251 +msgid "Tab spacing" +msgstr "Широчина на табулатора" + +#: gitk:11254 +msgid "Display nearby tags/heads" +msgstr "Извеждане на близките етикети и върхове" + +#: gitk:11257 +msgid "Maximum # tags/heads to show" +msgstr "МакÑимален брой етикети/върхове за показване" + +#: gitk:11260 +msgid "Limit diffs to listed paths" +msgstr "Разлика Ñамо в избраните пътища" + +#: gitk:11263 +msgid "Support per-file encodings" +msgstr "Поддръжка на различни ÐºÐ¾Ð´Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð·Ð° вÑеки файл" + +#: gitk:11269 gitk:11416 +msgid "External diff tool" +msgstr "Външен инÑтрумент за разлики" + +#: gitk:11270 +msgid "Choose..." +msgstr "Избор…" + +#: gitk:11275 +msgid "General options" +msgstr "Общи наÑтройки" + +#: gitk:11278 +msgid "Use themed widgets" +msgstr "Използване на тема за графичните обекти" + +#: gitk:11280 +msgid "(change requires restart)" +msgstr "(промÑната изиÑква реÑтартиране на Gitk)" + +#: gitk:11282 +msgid "(currently unavailable)" +msgstr "(в момента недоÑтъпно)" + +#: gitk:11293 +msgid "Colors: press to choose" +msgstr "Цветове: избира Ñе Ñ Ð½Ð°Ñ‚Ð¸Ñкане" + +#: gitk:11296 +msgid "Interface" +msgstr "ИнтерфейÑ" + +#: gitk:11297 +msgid "interface" +msgstr "интерфейÑ" + +#: gitk:11300 +msgid "Background" +msgstr "Фон" + +#: gitk:11301 gitk:11331 +msgid "background" +msgstr "Фон" + +#: gitk:11304 +msgid "Foreground" +msgstr "Знаци" + +#: gitk:11305 +msgid "foreground" +msgstr "знаци" + +#: gitk:11308 +msgid "Diff: old lines" +msgstr "Разлика: Ñтари редове" + +#: gitk:11309 +msgid "diff old lines" +msgstr "разлика, Ñтари редове" + +#: gitk:11313 +msgid "Diff: new lines" +msgstr "Разлика: нови редове" + +#: gitk:11314 +msgid "diff new lines" +msgstr "разлика, нови редове" + +#: gitk:11318 +msgid "Diff: hunk header" +msgstr "Разлика: начало на парче" + +#: gitk:11320 +msgid "diff hunk header" +msgstr "разлика, начало на парче" + +#: gitk:11324 +msgid "Marked line bg" +msgstr "Фон на отбелÑзан ред" + +#: gitk:11326 +msgid "marked line background" +msgstr "Фон на отбелÑзан ред" + +#: gitk:11330 +msgid "Select bg" +msgstr "Избор на фон" + +#: gitk:11339 +msgid "Fonts: press to choose" +msgstr "Шрифтове: избира Ñе Ñ Ð½Ð°Ñ‚Ð¸Ñкане" + +#: gitk:11341 +msgid "Main font" +msgstr "ОÑновен шрифт" + +#: gitk:11342 +msgid "Diff display font" +msgstr "Шрифт за разликите" + +#: gitk:11343 +msgid "User interface font" +msgstr "Шрифт на интерфейÑа" + +#: gitk:11365 +msgid "Gitk preferences" +msgstr "ÐаÑтройки на Gitk" + +#: gitk:11374 +msgid "General" +msgstr "Общи" + +#: gitk:11375 +msgid "Colors" +msgstr "Цветове" + +#: gitk:11376 +msgid "Fonts" +msgstr "Шрифтове" + +#: gitk:11426 +#, tcl-format +msgid "Gitk: choose color for %s" +msgstr "Gitk: избор на цвÑÑ‚ на %s" + +#: gitk:12080 +msgid "Cannot find a git repository here." +msgstr "Тук липÑва хранилище на Git." + +#: gitk:12127 +#, tcl-format +msgid "Ambiguous argument '%s': both revision and filename" +msgstr "Ðееднозначен аргумент „%s“: има и такава верÑиÑ, и такъв файл" + +#: gitk:12139 +msgid "Bad arguments to gitk:" +msgstr "Ðеправилни аргументи на gitk:" + +#: gitk:12242 +msgid "Command line" +msgstr "Команден ред" diff --git a/gitk-git/po/po2msg.sh b/gitk-git/po/po2msg.sh index c63248e375..c63248e375 100644..100755 --- a/gitk-git/po/po2msg.sh +++ b/gitk-git/po/po2msg.sh diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 68c77f6f8f..79057b7d0e 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -548,6 +548,20 @@ our %feature = ( 'sub' => sub { feature_bool('remote_heads', @_) }, 'override' => 0, 'default' => [0]}, + + # Enable showing branches under other refs in addition to heads + + # To set system wide extra branch refs have in $GITWEB_CONFIG + # $feature{'extra-branch-refs'}{'default'} = ['dirs', 'of', 'choice']; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'extra-branch-refs'}{'override'} = 1; + # and in project config gitweb.extrabranchrefs = dirs of choice + # Every directory is separated with whitespace. + + 'extra-branch-refs' => { + 'sub' => \&feature_extra_branch_refs, + 'override' => 0, + 'default' => []}, ); sub gitweb_get_feature { @@ -626,6 +640,21 @@ sub feature_avatar { return @val ? @val : @_; } +sub feature_extra_branch_refs { + my (@branch_refs) = @_; + my $values = git_get_project_config('extrabranchrefs'); + + if ($values) { + $values = config_to_multi ($values); + @branch_refs = (); + foreach my $value (@{$values}) { + push @branch_refs, split /\s+/, $value; + } + } + + return @branch_refs; +} + # checking HEAD file with -e is fragile if the repository was # initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed # and then pruned. @@ -656,6 +685,18 @@ sub filter_snapshot_fmts { !$known_snapshot_formats{$_}{'disabled'}} @fmts; } +sub filter_and_validate_refs { + my @refs = @_; + my %unique_refs = (); + + foreach my $ref (@refs) { + die_error(500, "Invalid ref '$ref' in 'extra-branch-refs' feature") unless (is_valid_ref_format($ref)); + # 'heads' are added implicitly in get_branch_refs(). + $unique_refs{$ref} = 1 if ($ref ne 'heads'); + } + return sort keys %unique_refs; +} + # If it is set to code reference, it is code that it is to be run once per # request, allowing updating configurations that change with each request, # while running other code in config file only once. @@ -994,7 +1035,7 @@ our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_bas sub evaluate_and_validate_params { our $action = $input_params{'action'}; if (defined $action) { - if (!validate_action($action)) { + if (!is_valid_action($action)) { die_error(400, "Invalid action parameter"); } } @@ -1002,7 +1043,7 @@ sub evaluate_and_validate_params { # parameters which are pathnames our $project = $input_params{'project'}; if (defined $project) { - if (!validate_project($project)) { + if (!is_valid_project($project)) { undef $project; die_error(404, "No such project"); } @@ -1010,21 +1051,21 @@ sub evaluate_and_validate_params { our $project_filter = $input_params{'project_filter'}; if (defined $project_filter) { - if (!validate_pathname($project_filter)) { + if (!is_valid_pathname($project_filter)) { die_error(404, "Invalid project_filter parameter"); } } our $file_name = $input_params{'file_name'}; if (defined $file_name) { - if (!validate_pathname($file_name)) { + if (!is_valid_pathname($file_name)) { die_error(400, "Invalid file parameter"); } } our $file_parent = $input_params{'file_parent'}; if (defined $file_parent) { - if (!validate_pathname($file_parent)) { + if (!is_valid_pathname($file_parent)) { die_error(400, "Invalid file parent parameter"); } } @@ -1032,21 +1073,21 @@ sub evaluate_and_validate_params { # parameters which are refnames our $hash = $input_params{'hash'}; if (defined $hash) { - if (!validate_refname($hash)) { + if (!is_valid_refname($hash)) { die_error(400, "Invalid hash parameter"); } } our $hash_parent = $input_params{'hash_parent'}; if (defined $hash_parent) { - if (!validate_refname($hash_parent)) { + if (!is_valid_refname($hash_parent)) { die_error(400, "Invalid hash parent parameter"); } } our $hash_base = $input_params{'hash_base'}; if (defined $hash_base) { - if (!validate_refname($hash_base)) { + if (!is_valid_refname($hash_base)) { die_error(400, "Invalid hash base parameter"); } } @@ -1066,7 +1107,7 @@ sub evaluate_and_validate_params { our $hash_parent_base = $input_params{'hash_parent_base'}; if (defined $hash_parent_base) { - if (!validate_refname($hash_parent_base)) { + if (!is_valid_refname($hash_parent_base)) { die_error(400, "Invalid hash parent base parameter"); } } @@ -1113,7 +1154,7 @@ sub evaluate_git_dir { our $git_dir = "$projectroot/$project" if $project; } -our (@snapshot_fmts, $git_avatar); +our (@snapshot_fmts, $git_avatar, @extra_branch_refs); sub configure_gitweb_features { # list of supported snapshot formats our @snapshot_fmts = gitweb_get_feature('snapshot'); @@ -1131,6 +1172,13 @@ sub configure_gitweb_features { } else { $git_avatar = ''; } + + our @extra_branch_refs = gitweb_get_feature('extra-branch-refs'); + @extra_branch_refs = filter_and_validate_refs (@extra_branch_refs); +} + +sub get_branch_refs { + return ('heads', @extra_branch_refs); } # custom error handler: 'die <message>' is Internal Server Error @@ -1418,27 +1466,30 @@ sub href { ## ====================================================================== ## validation, quoting/unquoting and escaping -sub validate_action { - my $input = shift || return undef; +sub is_valid_action { + my $input = shift; return undef unless exists $actions{$input}; - return $input; + return 1; } -sub validate_project { - my $input = shift || return undef; - if (!validate_pathname($input) || +sub is_valid_project { + my $input = shift; + + return unless defined $input; + if (!is_valid_pathname($input) || !(-d "$projectroot/$input") || !check_export_ok("$projectroot/$input") || ($strict_export && !project_in_list($input))) { return undef; } else { - return $input; + return 1; } } -sub validate_pathname { - my $input = shift || return undef; +sub is_valid_pathname { + my $input = shift; + return undef unless defined $input; # no '.' or '..' as elements of path, i.e. no '.' nor '..' # at the beginning, at the end, and between slashes. # also this catches doubled slashes @@ -1449,24 +1500,33 @@ sub validate_pathname { if ($input =~ m!\0!) { return undef; } - return $input; + return 1; } -sub validate_refname { - my $input = shift || return undef; +sub is_valid_ref_format { + my $input = shift; - # textual hashes are O.K. - if ($input =~ m/^[0-9a-fA-F]{40}$/) { - return $input; - } - # it must be correct pathname - $input = validate_pathname($input) - or return undef; + return undef unless defined $input; # restrictions on ref name according to git-check-ref-format if ($input =~ m!(/\.|\.\.|[\000-\040\177 ~^:?*\[]|/$)!) { return undef; } - return $input; + return 1; +} + +sub is_valid_refname { + my $input = shift; + + return undef unless defined $input; + # textual hashes are O.K. + if ($input =~ m/^[0-9a-fA-F]{40}$/) { + return 1; + } + # it must be correct pathname + is_valid_pathname($input) or return undef; + # check git-check-ref-format restrictions + is_valid_ref_format($input) or return undef; + return 1; } # decode sequences of octets in utf8 into Perl's internal form, @@ -2515,6 +2575,7 @@ sub format_snapshot_links { sub get_feed_info { my $format = shift || 'Atom'; my %res = (action => lc($format)); + my $matched_ref = 0; # feed links are possible only for project views return unless (defined $project); @@ -2522,12 +2583,17 @@ sub get_feed_info { # or don't have specific feed yet (so they should use generic) return if (!$action || $action =~ /^(?:tags|heads|forks|tag|search)$/x); - my $branch; - # branches refs uses 'refs/heads/' prefix (fullname) to differentiate - # from tag links; this also makes possible to detect branch links - if ((defined $hash_base && $hash_base =~ m!^refs/heads/(.*)$!) || - (defined $hash && $hash =~ m!^refs/heads/(.*)$!)) { - $branch = $1; + my $branch = undef; + # branches refs uses 'refs/' + $get_branch_refs()[x] + '/' prefix + # (fullname) to differentiate from tag links; this also makes + # possible to detect branch links + for my $ref (get_branch_refs()) { + if ((defined $hash_base && $hash_base =~ m!^refs/\Q$ref\E/(.*)$!) || + (defined $hash && $hash =~ m!^refs/\Q$ref\E/(.*)$!)) { + $branch = $1; + $matched_ref = $ref; + last; + } } # find log type for feed description (title) my $type = 'log'; @@ -2540,7 +2606,7 @@ sub get_feed_info { } $res{-title} = $type; - $res{'hash'} = (defined $branch ? "refs/heads/$branch" : undef); + $res{'hash'} = (defined $branch ? "refs/$matched_ref/$branch" : undef); $res{'file_name'} = $file_name; return %res; @@ -3193,7 +3259,7 @@ sub git_get_last_activity { '--format=%(committer)', '--sort=-committerdate', '--count=1', - 'refs/heads') or return; + map { "refs/$_" } get_branch_refs ()) or return; my $most_recent = <$fd>; close $fd or return; if (defined $most_recent && @@ -3644,7 +3710,7 @@ sub parse_from_to_diffinfo { sub git_get_heads_list { my ($limit, @classes) = @_; - @classes = ('heads') unless @classes; + @classes = get_branch_refs() unless @classes; my @patterns = map { "refs/$_" } @classes; my @headslist; @@ -3662,9 +3728,16 @@ sub git_get_heads_list { my ($committer, $epoch, $tz) = ($committerinfo =~ /^(.*) ([0-9]+) (.*)$/); $ref_item{'fullname'} = $name; - $name =~ s!^refs/(?:head|remote)s/!!; + my $strip_refs = join '|', map { quotemeta } get_branch_refs(); + $name =~ s!^refs/($strip_refs|remotes)/!!; + $ref_item{'name'} = $name; + # for refs neither in 'heads' nor 'remotes' we want to + # show their ref dir + my $ref_dir = (defined $1) ? $1 : ''; + if ($ref_dir ne '' and $ref_dir ne 'heads' and $ref_dir ne 'remotes') { + $ref_item{'name'} .= ' (' . $ref_dir . ')'; + } - $ref_item{'name'} = $name; $ref_item{'id'} = $hash; $ref_item{'title'} = $title || '(no commit message)'; $ref_item{'epoch'} = $epoch; @@ -7021,7 +7094,7 @@ sub git_blob { git_print_page_path($file_name, "blob", $hash_base); print "<div class=\"page_body\">\n"; if ($mimetype =~ m!^image/!) { - print qq!<img type="!.esc_attr($mimetype).qq!"!; + print qq!<img class="blob" type="!.esc_attr($mimetype).qq!"!; if ($file_name) { print qq! alt="!.esc_attr($file_name).qq!" title="!.esc_attr($file_name).qq!"!; } @@ -7156,6 +7229,15 @@ sub git_tree { git_footer_html(); } +sub sanitize_for_filename { + my $name = shift; + + $name =~ s!/!-!g; + $name =~ s/[^[:alnum:]_.-]//g; + + return $name; +} + sub snapshot_name { my ($project, $hash) = @_; @@ -7163,9 +7245,7 @@ sub snapshot_name { # path/to/project/.git -> project my $name = to_utf8($project); $name =~ s,([^/])/*\.git$,$1,; - $name = basename($name); - # sanitize name - $name =~ s/[[:cntrl:]]/?/g; + $name = sanitize_for_filename(basename($name)); my $ver = $hash; if ($hash =~ /^[0-9a-fA-F]+$/) { @@ -7179,13 +7259,25 @@ sub snapshot_name { $ver = $1; } else { # branches and other need shortened SHA-1 hash - if ($hash =~ m!^refs/(?:heads|remotes)/(.*)$!) { - $ver = $1; + my $strip_refs = join '|', map { quotemeta } get_branch_refs(); + if ($hash =~ m!^refs/($strip_refs|remotes)/(.*)$!) { + my $ref_dir = (defined $1) ? $1 : ''; + $ver = $2; + + $ref_dir = sanitize_for_filename($ref_dir); + # for refs neither in heads nor remotes we want to + # add a ref dir to archive name + if ($ref_dir ne '' and $ref_dir ne 'heads' and $ref_dir ne 'remotes') { + $ver = $ref_dir . '-' . $ver; + } } $ver .= '-' . git_get_short_hash($project, $hash); } + # special case of sanitization for filename - we change + # slashes to dots instead of dashes # in case of hierarchical branch names $ver =~ s!/!.!g; + $ver =~ s/[^[:alnum:]_.-]//g; # name = project-version_string $name = "$name-$ver"; diff --git a/gitweb/static/gitweb.css b/gitweb/static/gitweb.css index 3b4d833823..3212601032 100644 --- a/gitweb/static/gitweb.css +++ b/gitweb/static/gitweb.css @@ -32,6 +32,11 @@ img.avatar { vertical-align: middle; } +img.blob { + max-height: 100%; + max-width: 100%; +} + a.list img.avatar { border-style: none; } @@ -801,10 +801,10 @@ static int graph_draw_octopus_merge(struct git_graph *graph, int num_dashes = ((graph->num_parents - dashless_commits) * 2) - 1; for (i = 0; i < num_dashes; i++) { - col_num = (i / 2) + dashless_commits; + col_num = (i / 2) + dashless_commits + graph->commit_index; strbuf_write_column(sb, &graph->new_columns[col_num], '-'); } - col_num = (i / 2) + dashless_commits; + col_num = (i / 2) + dashless_commits + graph->commit_index; strbuf_write_column(sb, &graph->new_columns[col_num], '.'); return num_dashes + 1; } diff --git a/hash.c b/hash.c deleted file mode 100644 index 749ecfe484..0000000000 --- a/hash.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Some generic hashing helpers. - */ -#include "cache.h" -#include "hash.h" - -/* - * Look up a hash entry in the hash table. Return the pointer to - * the existing entry, or the empty slot if none existed. The caller - * can then look at the (*ptr) to see whether it existed or not. - */ -static struct hash_table_entry *lookup_hash_entry(unsigned int hash, const struct hash_table *table) -{ - unsigned int size = table->size, nr = hash % size; - struct hash_table_entry *array = table->array; - - while (array[nr].ptr) { - if (array[nr].hash == hash) - break; - nr++; - if (nr >= size) - nr = 0; - } - return array + nr; -} - - -/* - * Insert a new hash entry pointer into the table. - * - * If that hash entry already existed, return the pointer to - * the existing entry (and the caller can create a list of the - * pointers or do anything else). If it didn't exist, return - * NULL (and the caller knows the pointer has been inserted). - */ -static void **insert_hash_entry(unsigned int hash, void *ptr, struct hash_table *table) -{ - struct hash_table_entry *entry = lookup_hash_entry(hash, table); - - if (!entry->ptr) { - entry->ptr = ptr; - entry->hash = hash; - table->nr++; - return NULL; - } - return &entry->ptr; -} - -static void grow_hash_table(struct hash_table *table) -{ - unsigned int i; - unsigned int old_size = table->size, new_size; - struct hash_table_entry *old_array = table->array, *new_array; - - new_size = alloc_nr(old_size); - new_array = xcalloc(sizeof(struct hash_table_entry), new_size); - table->size = new_size; - table->array = new_array; - table->nr = 0; - for (i = 0; i < old_size; i++) { - unsigned int hash = old_array[i].hash; - void *ptr = old_array[i].ptr; - if (ptr) - insert_hash_entry(hash, ptr, table); - } - free(old_array); -} - -void *lookup_hash(unsigned int hash, const struct hash_table *table) -{ - if (!table->array) - return NULL; - return lookup_hash_entry(hash, table)->ptr; -} - -void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table) -{ - unsigned int nr = table->nr; - if (nr >= table->size/2) - grow_hash_table(table); - return insert_hash_entry(hash, ptr, table); -} - -int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data) -{ - int sum = 0; - unsigned int i; - unsigned int size = table->size; - struct hash_table_entry *array = table->array; - - for (i = 0; i < size; i++) { - void *ptr = array->ptr; - array++; - if (ptr) { - int val = fn(ptr, data); - if (val < 0) - return val; - sum += val; - } - } - return sum; -} - -void free_hash(struct hash_table *table) -{ - free(table->array); - table->array = NULL; - table->size = 0; - table->nr = 0; -} diff --git a/hash.h b/hash.h deleted file mode 100644 index 1d43ac0ba0..0000000000 --- a/hash.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef HASH_H -#define HASH_H - -/* - * These are some simple generic hash table helper functions. - * Not necessarily suitable for all users, but good for things - * where you want to just keep track of a list of things, and - * have a good hash to use on them. - * - * It keeps the hash table at roughly 50-75% free, so the memory - * cost of the hash table itself is roughly - * - * 3 * 2*sizeof(void *) * nr_of_objects - * - * bytes. - * - * FIXME: on 64-bit architectures, we waste memory. It would be - * good to have just 32-bit pointers, requiring a special allocator - * for hashed entries or something. - */ -struct hash_table_entry { - unsigned int hash; - void *ptr; -}; - -struct hash_table { - unsigned int size, nr; - struct hash_table_entry *array; -}; - -extern void *lookup_hash(unsigned int hash, const struct hash_table *table); -extern void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table); -extern int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data); -extern void free_hash(struct hash_table *table); - -static inline void init_hash(struct hash_table *table) -{ - table->size = 0; - table->nr = 0; - table->array = NULL; -} - -static inline void preallocate_hash(struct hash_table *table, unsigned int elts) -{ - assert(table->size == 0 && table->nr == 0 && table->array == NULL); - table->size = elts * 2; - table->array = xcalloc(sizeof(struct hash_table_entry), table->size); -} - -#endif diff --git a/hashmap.c b/hashmap.c new file mode 100644 index 0000000000..d1b8056d8d --- /dev/null +++ b/hashmap.c @@ -0,0 +1,228 @@ +/* + * Generic implementation of hash-based key value mappings. + */ +#include "cache.h" +#include "hashmap.h" + +#define FNV32_BASE ((unsigned int) 0x811c9dc5) +#define FNV32_PRIME ((unsigned int) 0x01000193) + +unsigned int strhash(const char *str) +{ + unsigned int c, hash = FNV32_BASE; + while ((c = (unsigned char) *str++)) + hash = (hash * FNV32_PRIME) ^ c; + return hash; +} + +unsigned int strihash(const char *str) +{ + unsigned int c, hash = FNV32_BASE; + while ((c = (unsigned char) *str++)) { + if (c >= 'a' && c <= 'z') + c -= 'a' - 'A'; + hash = (hash * FNV32_PRIME) ^ c; + } + return hash; +} + +unsigned int memhash(const void *buf, size_t len) +{ + unsigned int hash = FNV32_BASE; + unsigned char *ucbuf = (unsigned char *) buf; + while (len--) { + unsigned int c = *ucbuf++; + hash = (hash * FNV32_PRIME) ^ c; + } + return hash; +} + +unsigned int memihash(const void *buf, size_t len) +{ + unsigned int hash = FNV32_BASE; + unsigned char *ucbuf = (unsigned char *) buf; + while (len--) { + unsigned int c = *ucbuf++; + if (c >= 'a' && c <= 'z') + c -= 'a' - 'A'; + hash = (hash * FNV32_PRIME) ^ c; + } + return hash; +} + +#define HASHMAP_INITIAL_SIZE 64 +/* grow / shrink by 2^2 */ +#define HASHMAP_RESIZE_BITS 2 +/* load factor in percent */ +#define HASHMAP_LOAD_FACTOR 80 + +static void alloc_table(struct hashmap *map, unsigned int size) +{ + map->tablesize = size; + map->table = xcalloc(size, sizeof(struct hashmap_entry *)); + + /* calculate resize thresholds for new size */ + map->grow_at = (unsigned int) ((uint64_t) size * HASHMAP_LOAD_FACTOR / 100); + if (size <= HASHMAP_INITIAL_SIZE) + map->shrink_at = 0; + else + /* + * The shrink-threshold must be slightly smaller than + * (grow-threshold / resize-factor) to prevent erratic resizing, + * thus we divide by (resize-factor + 1). + */ + map->shrink_at = map->grow_at / ((1 << HASHMAP_RESIZE_BITS) + 1); +} + +static inline int entry_equals(const struct hashmap *map, + const struct hashmap_entry *e1, const struct hashmap_entry *e2, + const void *keydata) +{ + return (e1 == e2) || (e1->hash == e2->hash && !map->cmpfn(e1, e2, keydata)); +} + +static inline unsigned int bucket(const struct hashmap *map, + const struct hashmap_entry *key) +{ + return key->hash & (map->tablesize - 1); +} + +static void rehash(struct hashmap *map, unsigned int newsize) +{ + unsigned int i, oldsize = map->tablesize; + struct hashmap_entry **oldtable = map->table; + + alloc_table(map, newsize); + for (i = 0; i < oldsize; i++) { + struct hashmap_entry *e = oldtable[i]; + while (e) { + struct hashmap_entry *next = e->next; + unsigned int b = bucket(map, e); + e->next = map->table[b]; + map->table[b] = e; + e = next; + } + } + free(oldtable); +} + +static inline struct hashmap_entry **find_entry_ptr(const struct hashmap *map, + const struct hashmap_entry *key, const void *keydata) +{ + struct hashmap_entry **e = &map->table[bucket(map, key)]; + while (*e && !entry_equals(map, *e, key, keydata)) + e = &(*e)->next; + return e; +} + +static int always_equal(const void *unused1, const void *unused2, const void *unused3) +{ + return 0; +} + +void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function, + size_t initial_size) +{ + unsigned int size = HASHMAP_INITIAL_SIZE; + map->size = 0; + map->cmpfn = equals_function ? equals_function : always_equal; + + /* calculate initial table size and allocate the table */ + initial_size = (unsigned int) ((uint64_t) initial_size * 100 + / HASHMAP_LOAD_FACTOR); + while (initial_size > size) + size <<= HASHMAP_RESIZE_BITS; + alloc_table(map, size); +} + +void hashmap_free(struct hashmap *map, int free_entries) +{ + if (!map || !map->table) + return; + if (free_entries) { + struct hashmap_iter iter; + struct hashmap_entry *e; + hashmap_iter_init(map, &iter); + while ((e = hashmap_iter_next(&iter))) + free(e); + } + free(map->table); + memset(map, 0, sizeof(*map)); +} + +void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata) +{ + return *find_entry_ptr(map, key, keydata); +} + +void *hashmap_get_next(const struct hashmap *map, const void *entry) +{ + struct hashmap_entry *e = ((struct hashmap_entry *) entry)->next; + for (; e; e = e->next) + if (entry_equals(map, entry, e, NULL)) + return e; + return NULL; +} + +void hashmap_add(struct hashmap *map, void *entry) +{ + unsigned int b = bucket(map, entry); + + /* add entry */ + ((struct hashmap_entry *) entry)->next = map->table[b]; + map->table[b] = entry; + + /* fix size and rehash if appropriate */ + map->size++; + if (map->size > map->grow_at) + rehash(map, map->tablesize << HASHMAP_RESIZE_BITS); +} + +void *hashmap_remove(struct hashmap *map, const void *key, const void *keydata) +{ + struct hashmap_entry *old; + struct hashmap_entry **e = find_entry_ptr(map, key, keydata); + if (!*e) + return NULL; + + /* remove existing entry */ + old = *e; + *e = old->next; + old->next = NULL; + + /* fix size and rehash if appropriate */ + map->size--; + if (map->size < map->shrink_at) + rehash(map, map->tablesize >> HASHMAP_RESIZE_BITS); + return old; +} + +void *hashmap_put(struct hashmap *map, void *entry) +{ + struct hashmap_entry *old = hashmap_remove(map, entry, NULL); + hashmap_add(map, entry); + return old; +} + +void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter) +{ + iter->map = map; + iter->tablepos = 0; + iter->next = NULL; +} + +void *hashmap_iter_next(struct hashmap_iter *iter) +{ + struct hashmap_entry *current = iter->next; + for (;;) { + if (current) { + iter->next = current->next; + return current; + } + + if (iter->tablepos >= iter->map->tablesize) + return NULL; + + current = iter->map->table[iter->tablepos++]; + } +} diff --git a/hashmap.h b/hashmap.h new file mode 100644 index 0000000000..a816ad47b1 --- /dev/null +++ b/hashmap.h @@ -0,0 +1,71 @@ +#ifndef HASHMAP_H +#define HASHMAP_H + +/* + * Generic implementation of hash-based key-value mappings. + * See Documentation/technical/api-hashmap.txt. + */ + +/* FNV-1 functions */ + +extern unsigned int strhash(const char *buf); +extern unsigned int strihash(const char *buf); +extern unsigned int memhash(const void *buf, size_t len); +extern unsigned int memihash(const void *buf, size_t len); + +/* data structures */ + +struct hashmap_entry { + struct hashmap_entry *next; + unsigned int hash; +}; + +typedef int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key, + const void *keydata); + +struct hashmap { + struct hashmap_entry **table; + hashmap_cmp_fn cmpfn; + unsigned int size, tablesize, grow_at, shrink_at; +}; + +struct hashmap_iter { + struct hashmap *map; + struct hashmap_entry *next; + unsigned int tablepos; +}; + +/* hashmap functions */ + +extern void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function, + size_t initial_size); +extern void hashmap_free(struct hashmap *map, int free_entries); + +/* hashmap_entry functions */ + +static inline void hashmap_entry_init(void *entry, unsigned int hash) +{ + struct hashmap_entry *e = entry; + e->hash = hash; + e->next = NULL; +} +extern void *hashmap_get(const struct hashmap *map, const void *key, + const void *keydata); +extern void *hashmap_get_next(const struct hashmap *map, const void *entry); +extern void hashmap_add(struct hashmap *map, void *entry); +extern void *hashmap_put(struct hashmap *map, void *entry); +extern void *hashmap_remove(struct hashmap *map, const void *key, + const void *keydata); + +/* hashmap_iter functions */ + +extern void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter); +extern void *hashmap_iter_next(struct hashmap_iter *iter); +static inline void *hashmap_iter_first(struct hashmap *map, + struct hashmap_iter *iter) +{ + hashmap_iter_init(map, iter); + return hashmap_iter_next(iter); +} + +#endif @@ -78,8 +78,7 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes) cmds->cnt = cj; } -static void pretty_print_string_list(struct cmdnames *cmds, - unsigned int colopts) +static void pretty_print_cmdnames(struct cmdnames *cmds, unsigned int colopts) { struct string_list list = STRING_LIST_INIT_NODUP; struct column_options copts; @@ -148,7 +147,7 @@ static void list_commands_in_dir(struct cmdnames *cmds, while ((de = readdir(dir)) != NULL) { int entlen; - if (prefixcmp(de->d_name, prefix)) + if (!starts_with(de->d_name, prefix)) continue; strbuf_setlen(&buf, len); @@ -209,14 +208,14 @@ void list_commands(unsigned int colopts, const char *exec_path = git_exec_path(); printf_ln(_("available git commands in '%s'"), exec_path); putchar('\n'); - pretty_print_string_list(main_cmds, colopts); + pretty_print_cmdnames(main_cmds, colopts); putchar('\n'); } if (other_cmds->cnt) { printf_ln(_("git commands available from elsewhere on your $PATH")); putchar('\n'); - pretty_print_string_list(other_cmds, colopts); + pretty_print_cmdnames(other_cmds, colopts); putchar('\n'); } } @@ -255,7 +254,7 @@ static int git_unknown_cmd_config(const char *var, const char *value, void *cb) if (!strcmp(var, "help.autocorrect")) autocorrect = git_config_int(var,value); /* Also use aliases for command lookup */ - if (!prefixcmp(var, "alias.")) + if (starts_with(var, "alias.")) add_cmdname(&aliases, var + 6, strlen(var + 6)); return git_default_config(var, value, cb); @@ -329,7 +328,7 @@ const char *help_unknown_cmd(const char *cmd) if ((n < ARRAY_SIZE(common_cmds)) && !cmp) { /* Yes, this is one of the common commands */ n++; /* use the entry from common_cmds[] */ - if (!prefixcmp(candidate, cmd)) { + if (starts_with(candidate, cmd)) { /* Give prefix match a very good score */ main_cmds.names[i]->len = 0; continue; @@ -414,7 +413,7 @@ static int append_similar_ref(const char *refname, const unsigned char *sha1, struct similar_ref_cb *cb = (struct similar_ref_cb *)(cb_data); char *branch = strrchr(refname, '/') + 1; /* A remote branch of the same name is deemed similar */ - if (!prefixcmp(refname, "refs/remotes/") && + if (starts_with(refname, "refs/remotes/") && !strcmp(branch, cb->base_ref)) string_list_append(cb->similar_refs, refname + strlen("refs/remotes/")); diff --git a/http-backend.c b/http-backend.c index 8c464bd805..d2c0a625ce 100644 --- a/http-backend.c +++ b/http-backend.c @@ -226,7 +226,7 @@ static int http_config(const char *var, const char *value, void *cb) return 0; } - if (!prefixcmp(var, "http.")) { + if (starts_with(var, "http.")) { int i; for (i = 0; i < ARRAY_SIZE(rpc_service); i++) { @@ -247,7 +247,7 @@ static struct rpc_service *select_service(const char *name) struct rpc_service *svc = NULL; int i; - if (prefixcmp(name, "git-")) + if (!starts_with(name, "git-")) forbidden("Unsupported service: '%s'", name); for (i = 0; i < ARRAY_SIZE(rpc_service); i++) { diff --git a/http-push.c b/http-push.c index 69200baf76..d4b40c9c60 100644 --- a/http-push.c +++ b/http-push.c @@ -771,7 +771,7 @@ static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed) lock->owner = xmalloc(strlen(ctx->cdata) + 1); strcpy(lock->owner, ctx->cdata); } else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TIMEOUT)) { - if (!prefixcmp(ctx->cdata, "Second-")) + if (starts_with(ctx->cdata, "Second-")) lock->timeout = strtol(ctx->cdata + 7, NULL, 10); } else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) { @@ -1542,7 +1542,7 @@ static int remote_exists(const char *path) sprintf(url, "%s%s", repo->url, path); - switch (http_get_strbuf(url, NULL, NULL, 0)) { + switch (http_get_strbuf(url, NULL, NULL)) { case HTTP_OK: ret = 1; break; @@ -1566,7 +1566,7 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1) url = xmalloc(strlen(repo->url) + strlen(path) + 1); sprintf(url, "%s%s", repo->url, path); - if (http_get_strbuf(url, NULL, &buffer, 0) != HTTP_OK) + if (http_get_strbuf(url, &buffer, NULL) != HTTP_OK) die("Couldn't get %s for remote symref\n%s", url, curl_errorstr); free(url); @@ -1579,7 +1579,7 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1) return; /* If it's a symref, set the refname; otherwise try for a sha1 */ - if (!prefixcmp((char *)buffer.buf, "ref: ")) { + if (starts_with((char *)buffer.buf, "ref: ")) { *symref = xmemdupz((char *)buffer.buf + 5, buffer.len - 6); } else { get_sha1_hex(buffer.buf, sha1); @@ -47,7 +47,7 @@ static int curl_ftp_no_epsv; static const char *curl_http_proxy; static const char *curl_cookie_file; static int curl_save_cookies; -static struct credential http_auth = CREDENTIAL_INIT; +struct credential http_auth = CREDENTIAL_INIT; static int http_proactive_auth; static const char *user_agent; @@ -260,6 +260,42 @@ static int has_cert_password(void) return 1; } +#if LIBCURL_VERSION_NUM >= 0x071900 +static void set_curl_keepalive(CURL *c) +{ + curl_easy_setopt(c, CURLOPT_TCP_KEEPALIVE, 1); +} + +#elif LIBCURL_VERSION_NUM >= 0x071000 +static int sockopt_callback(void *client, curl_socket_t fd, curlsocktype type) +{ + int ka = 1; + int rc; + socklen_t len = (socklen_t)sizeof(ka); + + if (type != CURLSOCKTYPE_IPCXN) + return 0; + + rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&ka, len); + if (rc < 0) + warning("unable to set SO_KEEPALIVE on socket %s", + strerror(errno)); + + return 0; /* CURL_SOCKOPT_OK only exists since curl 7.21.5 */ +} + +static void set_curl_keepalive(CURL *c) +{ + curl_easy_setopt(c, CURLOPT_SOCKOPTFUNCTION, sockopt_callback); +} + +#else +static void set_curl_keepalive(CURL *c) +{ + /* not supported on older curl versions */ +} +#endif + static CURL *get_curl_handle(void) { CURL *result = curl_easy_init(); @@ -332,6 +368,8 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); } + set_curl_keepalive(result); + return result; } @@ -422,7 +460,7 @@ void http_init(struct remote *remote, const char *url, int proactive_auth) credential_from_url(&http_auth, url); if (!ssl_cert_password_required && getenv("GIT_SSL_CERT_PASSWORD_PROTECTED") && - !prefixcmp(url, "https://")) + starts_with(url, "https://")) ssl_cert_password_required = 1; } @@ -723,6 +761,12 @@ void finish_active_slot(struct active_request_slot *slot) if (slot->results != NULL) { slot->results->curl_result = slot->curl_result; slot->results->http_code = slot->http_code; +#if LIBCURL_VERSION_NUM >= 0x070a08 + curl_easy_getinfo(slot->curl, CURLINFO_HTTPAUTH_AVAIL, + &slot->results->auth_avail); +#else + slot->results->auth_avail = 0; +#endif } /* Run callback if appropriate */ @@ -823,7 +867,6 @@ int handle_curl_result(struct slot_results *results) credential_reject(&http_auth); return HTTP_NOAUTH; } else { - credential_fill(&http_auth); return HTTP_REAUTH; } } else { @@ -837,12 +880,39 @@ int handle_curl_result(struct slot_results *results) } } +int run_one_slot(struct active_request_slot *slot, + struct slot_results *results) +{ + slot->results = results; + if (!start_active_slot(slot)) { + snprintf(curl_errorstr, sizeof(curl_errorstr), + "failed to start HTTP request"); + return HTTP_START_FAILED; + } + + run_active_slot(slot); + return handle_curl_result(results); +} + +static CURLcode curlinfo_strbuf(CURL *curl, CURLINFO info, struct strbuf *buf) +{ + char *ptr; + CURLcode ret; + + strbuf_reset(buf); + ret = curl_easy_getinfo(curl, info, &ptr); + if (!ret && ptr) + strbuf_addstr(buf, ptr); + return ret; +} + /* http_request() targets */ #define HTTP_REQUEST_STRBUF 0 #define HTTP_REQUEST_FILE 1 -static int http_request(const char *url, struct strbuf *type, - void *result, int target, int options) +static int http_request(const char *url, + void *result, int target, + const struct http_get_options *options) { struct active_request_slot *slot; struct slot_results results; @@ -851,7 +921,6 @@ static int http_request(const char *url, struct strbuf *type, int ret; slot = get_active_slot(); - slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); if (result == NULL) { @@ -875,9 +944,9 @@ static int http_request(const char *url, struct strbuf *type, } strbuf_addstr(&buf, "Pragma:"); - if (options & HTTP_NO_CACHE) + if (options && options->no_cache) strbuf_addstr(&buf, " no-cache"); - if (options & HTTP_KEEP_ERROR) + if (options && options->keep_error) curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 0); headers = curl_slist_append(headers, buf.buf); @@ -886,22 +955,15 @@ static int http_request(const char *url, struct strbuf *type, 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); - ret = handle_curl_result(&results); - } else { - snprintf(curl_errorstr, sizeof(curl_errorstr), - "failed to start HTTP request"); - ret = HTTP_START_FAILED; - } + ret = run_one_slot(slot, &results); - if (type) { - char *t; - strbuf_reset(type); - curl_easy_getinfo(slot->curl, CURLINFO_CONTENT_TYPE, &t); - if (t) - strbuf_addstr(type, t); - } + if (options && options->content_type) + curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE, + options->content_type); + + if (options && options->effective_url) + curlinfo_strbuf(slot->curl, CURLINFO_EFFECTIVE_URL, + options->effective_url); curl_slist_free_all(headers); strbuf_release(&buf); @@ -909,12 +971,71 @@ static int http_request(const char *url, struct strbuf *type, return ret; } +/* + * Update the "base" url to a more appropriate value, as deduced by + * redirects seen when requesting a URL starting with "url". + * + * The "asked" parameter is a URL that we asked curl to access, and must begin + * with "base". + * + * The "got" parameter is the URL that curl reported to us as where we ended + * up. + * + * Returns 1 if we updated the base url, 0 otherwise. + * + * Our basic strategy is to compare "base" and "asked" to find the bits + * specific to our request. We then strip those bits off of "got" to yield the + * new base. So for example, if our base is "http://example.com/foo.git", + * and we ask for "http://example.com/foo.git/info/refs", we might end up + * with "https://other.example.com/foo.git/info/refs". We would want the + * new URL to become "https://other.example.com/foo.git". + * + * Note that this assumes a sane redirect scheme. It's entirely possible + * in the example above to end up at a URL that does not even end in + * "info/refs". In such a case we simply punt, as there is not much we can + * do (and such a scheme is unlikely to represent a real git repository, + * which means we are likely about to abort anyway). + */ +static int update_url_from_redirect(struct strbuf *base, + const char *asked, + const struct strbuf *got) +{ + const char *tail; + size_t tail_len; + + if (!strcmp(asked, got->buf)) + return 0; + + if (!starts_with(asked, base->buf)) + die("BUG: update_url_from_redirect: %s is not a superset of %s", + asked, base->buf); + + tail = asked + base->len; + tail_len = strlen(tail); + + if (got->len < tail_len || + strcmp(tail, got->buf + got->len - tail_len)) + return 0; /* insane redirect scheme */ + + strbuf_reset(base); + strbuf_add(base, got->buf, got->len - tail_len); + return 1; +} + static int http_request_reauth(const char *url, - struct strbuf *type, void *result, int target, - int options) + struct http_get_options *options) { - int ret = http_request(url, type, result, target, options); + int ret = http_request(url, result, target, options); + + if (options && options->effective_url && options->base_url) { + if (update_url_from_redirect(options->base_url, + url, options->effective_url)) { + credential_from_url(&http_auth, options->base_url->buf); + url = options->effective_url->buf; + } + } + if (ret != HTTP_REAUTH) return ret; @@ -924,7 +1045,7 @@ static int http_request_reauth(const char *url, * making our next request. We only know how to do this for * the strbuf case, but that is enough to satisfy current callers. */ - if (options & HTTP_KEEP_ERROR) { + if (options && options->keep_error) { switch (target) { case HTTP_REQUEST_STRBUF: strbuf_reset(result); @@ -933,15 +1054,17 @@ static int http_request_reauth(const char *url, die("BUG: HTTP_KEEP_ERROR is only supported with strbufs"); } } - return http_request(url, type, result, target, options); + + credential_fill(&http_auth); + + return http_request(url, result, target, options); } int http_get_strbuf(const char *url, - struct strbuf *type, - struct strbuf *result, int options) + struct strbuf *result, + struct http_get_options *options) { - return http_request_reauth(url, type, result, - HTTP_REQUEST_STRBUF, options); + return http_request_reauth(url, result, HTTP_REQUEST_STRBUF, options); } /* @@ -950,7 +1073,8 @@ int http_get_strbuf(const char *url, * If a previous interrupted download is detected (i.e. a previous temporary * file is still around) the download is resumed. */ -static int http_get_file(const char *url, const char *filename, int options) +static int http_get_file(const char *url, const char *filename, + struct http_get_options *options) { int ret; struct strbuf tmpfile = STRBUF_INIT; @@ -958,16 +1082,16 @@ static int http_get_file(const char *url, const char *filename, int options) strbuf_addf(&tmpfile, "%s.temp", filename); result = fopen(tmpfile.buf, "a"); - if (! result) { + if (!result) { error("Unable to open local file %s", tmpfile.buf); ret = HTTP_ERROR; goto cleanup; } - ret = http_request_reauth(url, NULL, result, HTTP_REQUEST_FILE, options); + ret = http_request_reauth(url, result, HTTP_REQUEST_FILE, options); fclose(result); - if ((ret == HTTP_OK) && move_temp_to_file(tmpfile.buf, filename)) + if (ret == HTTP_OK && move_temp_to_file(tmpfile.buf, filename)) ret = HTTP_ERROR; cleanup: strbuf_release(&tmpfile); @@ -976,16 +1100,19 @@ cleanup: int http_fetch_ref(const char *base, struct ref *ref) { + struct http_get_options options = {0}; char *url; struct strbuf buffer = STRBUF_INIT; int ret = -1; + options.no_cache = 1; + url = quote_ref_url(base, ref->name); - if (http_get_strbuf(url, NULL, &buffer, HTTP_NO_CACHE) == HTTP_OK) { + if (http_get_strbuf(url, &buffer, &options) == HTTP_OK) { strbuf_rtrim(&buffer); if (buffer.len == 40) ret = get_sha1_hex(buffer.buf, ref->old_sha1); - else if (!prefixcmp(buffer.buf, "ref: ")) { + else if (starts_with(buffer.buf, "ref: ")) { ref->symref = xstrdup(buffer.buf + 5); ret = 0; } @@ -1012,7 +1139,7 @@ static char *fetch_pack_index(unsigned char *sha1, const char *base_url) strbuf_addf(&buf, "%s.temp", sha1_pack_index_name(sha1)); tmp = strbuf_detach(&buf, NULL); - if (http_get_file(url, tmp, 0) != HTTP_OK) { + if (http_get_file(url, tmp, NULL) != HTTP_OK) { error("Unable to get pack index %s", url); free(tmp); tmp = NULL; @@ -1065,6 +1192,7 @@ add_pack: int http_get_info_packs(const char *base_url, struct packed_git **packs_head) { + struct http_get_options options = {0}; int ret = 0, i = 0; char *url, *data; struct strbuf buf = STRBUF_INIT; @@ -1074,7 +1202,8 @@ int http_get_info_packs(const char *base_url, struct packed_git **packs_head) strbuf_addstr(&buf, "objects/info/packs"); url = strbuf_detach(&buf, NULL); - ret = http_get_strbuf(url, NULL, &buf, HTTP_NO_CACHE); + options.no_cache = 1; + ret = http_get_strbuf(url, &buf, &options); if (ret != HTTP_OK) goto cleanup; @@ -1084,8 +1213,8 @@ int http_get_info_packs(const char *base_url, struct packed_git **packs_head) case 'P': i++; if (i + 52 <= buf.len && - !prefixcmp(data + i, " pack-") && - !prefixcmp(data + i + 46, ".pack\n")) { + starts_with(data + i, " pack-") && + starts_with(data + i + 46, ".pack\n")) { get_sha1_hex(data + i + 6, sha1); fetch_and_setup_pack_index(packs_head, sha1, base_url); @@ -1261,7 +1390,7 @@ struct http_object_request *new_http_object_request(const char *base_url, unsigned char *sha1) { char *hex = sha1_to_hex(sha1); - char *filename; + const char *filename; char prevfile[PATH_MAX]; int prevlocal; char prev_buf[PREV_BUF_SIZE]; @@ -54,6 +54,7 @@ struct slot_results { CURLcode curl_result; long http_code; + long auth_avail; }; struct active_request_slot { @@ -89,6 +90,15 @@ extern void finish_active_slot(struct active_request_slot *slot); extern void finish_all_active_slots(void); extern int handle_curl_result(struct slot_results *results); +/* + * This will run one slot to completion in a blocking manner, similar to how + * curl_easy_perform would work (but we don't want to use that, because + * we do not want to intermingle calls to curl_multi and curl_easy). + * + */ +int run_one_slot(struct active_request_slot *slot, + struct slot_results *results); + #ifdef USE_CURL_MULTI extern void fill_active_slots(void); extern void add_fill_function(void *data, int (*fill)(void *)); @@ -102,6 +112,7 @@ extern void http_cleanup(void); extern int active_requests; extern int http_is_verbose; extern size_t http_post_buffer; +extern struct credential http_auth; extern char curl_errorstr[CURL_ERROR_SIZE]; @@ -125,11 +136,30 @@ extern void append_remote_object_url(struct strbuf *buf, const char *url, extern char *get_remote_object_url(const char *url, const char *hex, int only_two_digit_prefix); -/* Options for http_request_*() */ -#define HTTP_NO_CACHE 1 -#define HTTP_KEEP_ERROR 2 +/* Options for http_get_*() */ +struct http_get_options { + unsigned no_cache:1, + keep_error:1; + + /* If non-NULL, returns the content-type of the response. */ + struct strbuf *content_type; + + /* + * If non-NULL, returns the URL we ended up at, including any + * redirects we followed. + */ + struct strbuf *effective_url; + + /* + * If both base_url and effective_url are non-NULL, the base URL will + * be munged to reflect any redirections going from the requested url + * to effective_url. See the definition of update_url_from_redirect + * for details. + */ + struct strbuf *base_url; +}; -/* Return values for http_request_*() */ +/* Return values for http_get_*() */ #define HTTP_OK 0 #define HTTP_MISSING_TARGET 1 #define HTTP_ERROR 2 @@ -142,7 +172,7 @@ extern char *get_remote_object_url(const char *url, const char *hex, * * If the result pointer is NULL, a HTTP HEAD request is made instead of GET. */ -int http_get_strbuf(const char *url, struct strbuf *content_type, struct strbuf *result, int options); +int http_get_strbuf(const char *url, struct strbuf *result, struct http_get_options *options); extern int http_fetch_ref(const char *base, struct ref *ref); @@ -233,7 +233,21 @@ int split_ident_line(struct ident_split *split, const char *line, int len) if (!split->mail_end) return status; - for (cp = split->mail_end + 1; cp < line + len && isspace(*cp); cp++) + /* + * Look from the end-of-line to find the trailing ">" of the mail + * address, even though we should already know it as split->mail_end. + * This can help in cases of broken idents with an extra ">" somewhere + * in the email address. Note that we are assuming the timestamp will + * never have a ">" in it. + * + * Note that we will always find some ">" before going off the front of + * the string, because will always hit the split->mail_end closing + * bracket. + */ + for (cp = line + len - 1; *cp != '>'; cp--) + ; + + for (cp = cp + 1; cp < line + len && isspace(*cp); cp++) ; if (line + len <= cp) goto person_only; diff --git a/imap-send.c b/imap-send.c index 6f5cc4f782..0bc6f7fae1 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1263,7 +1263,7 @@ static int count_messages(struct strbuf *all_msgs) char *p = all_msgs->buf; while (1) { - if (!prefixcmp(p, "From ")) { + if (starts_with(p, "From ")) { p = strstr(p+5, "\nFrom: "); if (!p) break; p = strstr(p+7, "\nDate: "); @@ -1297,7 +1297,7 @@ static int split_msg(struct strbuf *all_msgs, struct strbuf *msg, int *ofs) data = &all_msgs->buf[*ofs]; len = all_msgs->len - *ofs; - if (len < 5 || prefixcmp(data, "From ")) + if (len < 5 || !starts_with(data, "From ")) return 0; p = strchr(data, '\n'); @@ -1339,13 +1339,13 @@ static int git_imap_config(const char *key, const char *val, void *cb) if (!strcmp("folder", key)) { imap_folder = xstrdup(val); } else if (!strcmp("host", key)) { - if (!prefixcmp(val, "imap:")) + if (starts_with(val, "imap:")) val += 5; - else if (!prefixcmp(val, "imaps:")) { + else if (starts_with(val, "imaps:")) { val += 6; server.use_ssl = 1; } - if (!prefixcmp(val, "//")) + if (starts_with(val, "//")) val += 2; server.host = xstrdup(val); } else if (!strcmp("user", key)) diff --git a/khash.h b/khash.h new file mode 100644 index 0000000000..57ff6038c5 --- /dev/null +++ b/khash.h @@ -0,0 +1,338 @@ +/* The MIT License + + Copyright (c) 2008, 2009, 2011 by Attractive Chaos <attractor@live.co.uk> + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef __AC_KHASH_H +#define __AC_KHASH_H + +#define AC_VERSION_KHASH_H "0.2.8" + +typedef uint32_t khint32_t; +typedef uint64_t khint64_t; + +typedef khint32_t khint_t; +typedef khint_t khiter_t; + +#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2) +#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1) +#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3) +#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1))) +#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1))) +#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1))) +#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1)) + +#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4) + +#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) + +static inline khint_t __ac_X31_hash_string(const char *s) +{ + khint_t h = (khint_t)*s; + if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s; + return h; +} + +#define kh_str_hash_func(key) __ac_X31_hash_string(key) +#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0) + +static const double __ac_HASH_UPPER = 0.77; + +#define __KHASH_TYPE(name, khkey_t, khval_t) \ + typedef struct { \ + khint_t n_buckets, size, n_occupied, upper_bound; \ + khint32_t *flags; \ + khkey_t *keys; \ + khval_t *vals; \ + } kh_##name##_t; + +#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \ + extern kh_##name##_t *kh_init_##name(void); \ + extern void kh_destroy_##name(kh_##name##_t *h); \ + extern void kh_clear_##name(kh_##name##_t *h); \ + extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \ + extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \ + extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \ + extern void kh_del_##name(kh_##name##_t *h, khint_t x); + +#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + SCOPE kh_##name##_t *kh_init_##name(void) { \ + return (kh_##name##_t*)xcalloc(1, sizeof(kh_##name##_t)); \ + } \ + SCOPE void kh_destroy_##name(kh_##name##_t *h) \ + { \ + if (h) { \ + free((void *)h->keys); free(h->flags); \ + free((void *)h->vals); \ + free(h); \ + } \ + } \ + SCOPE void kh_clear_##name(kh_##name##_t *h) \ + { \ + if (h && h->flags) { \ + memset(h->flags, 0xaa, __ac_fsize(h->n_buckets) * sizeof(khint32_t)); \ + h->size = h->n_occupied = 0; \ + } \ + } \ + SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \ + { \ + if (h->n_buckets) { \ + khint_t k, i, last, mask, step = 0; \ + mask = h->n_buckets - 1; \ + k = __hash_func(key); i = k & mask; \ + last = i; \ + while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ + i = (i + (++step)) & mask; \ + if (i == last) return h->n_buckets; \ + } \ + return __ac_iseither(h->flags, i)? h->n_buckets : i; \ + } else return 0; \ + } \ + SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \ + { /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \ + khint32_t *new_flags = NULL; \ + khint_t j = 1; \ + { \ + kroundup32(new_n_buckets); \ + if (new_n_buckets < 4) new_n_buckets = 4; \ + if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \ + else { /* hash table size to be changed (shrink or expand); rehash */ \ + new_flags = (khint32_t*)xmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ + if (!new_flags) return -1; \ + memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ + if (h->n_buckets < new_n_buckets) { /* expand */ \ + khkey_t *new_keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \ + if (!new_keys) return -1; \ + h->keys = new_keys; \ + if (kh_is_map) { \ + khval_t *new_vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \ + if (!new_vals) return -1; \ + h->vals = new_vals; \ + } \ + } /* otherwise shrink */ \ + } \ + } \ + if (j) { /* rehashing is needed */ \ + for (j = 0; j != h->n_buckets; ++j) { \ + if (__ac_iseither(h->flags, j) == 0) { \ + khkey_t key = h->keys[j]; \ + khval_t val; \ + khint_t new_mask; \ + new_mask = new_n_buckets - 1; \ + if (kh_is_map) val = h->vals[j]; \ + __ac_set_isdel_true(h->flags, j); \ + while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \ + khint_t k, i, step = 0; \ + k = __hash_func(key); \ + i = k & new_mask; \ + while (!__ac_isempty(new_flags, i)) i = (i + (++step)) & new_mask; \ + __ac_set_isempty_false(new_flags, i); \ + if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { /* kick out the existing element */ \ + { khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \ + if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \ + __ac_set_isdel_true(h->flags, i); /* mark it as deleted in the old hash table */ \ + } else { /* write the element and jump out of the loop */ \ + h->keys[i] = key; \ + if (kh_is_map) h->vals[i] = val; \ + break; \ + } \ + } \ + } \ + } \ + if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \ + h->keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \ + if (kh_is_map) h->vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \ + } \ + free(h->flags); /* free the working space */ \ + h->flags = new_flags; \ + h->n_buckets = new_n_buckets; \ + h->n_occupied = h->size; \ + h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \ + } \ + return 0; \ + } \ + SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \ + { \ + khint_t x; \ + if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \ + if (h->n_buckets > (h->size<<1)) { \ + if (kh_resize_##name(h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \ + *ret = -1; return h->n_buckets; \ + } \ + } else if (kh_resize_##name(h, h->n_buckets + 1) < 0) { /* expand the hash table */ \ + *ret = -1; return h->n_buckets; \ + } \ + } /* TODO: to implement automatically shrinking; resize() already support shrinking */ \ + { \ + khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \ + x = site = h->n_buckets; k = __hash_func(key); i = k & mask; \ + if (__ac_isempty(h->flags, i)) x = i; /* for speed up */ \ + else { \ + last = i; \ + while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \ + if (__ac_isdel(h->flags, i)) site = i; \ + i = (i + (++step)) & mask; \ + if (i == last) { x = site; break; } \ + } \ + if (x == h->n_buckets) { \ + if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \ + else x = i; \ + } \ + } \ + } \ + if (__ac_isempty(h->flags, x)) { /* not present at all */ \ + h->keys[x] = key; \ + __ac_set_isboth_false(h->flags, x); \ + ++h->size; ++h->n_occupied; \ + *ret = 1; \ + } else if (__ac_isdel(h->flags, x)) { /* deleted */ \ + h->keys[x] = key; \ + __ac_set_isboth_false(h->flags, x); \ + ++h->size; \ + *ret = 2; \ + } else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \ + return x; \ + } \ + SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \ + { \ + if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \ + __ac_set_isdel_true(h->flags, x); \ + --h->size; \ + } \ + } + +#define KHASH_DECLARE(name, khkey_t, khval_t) \ + __KHASH_TYPE(name, khkey_t, khval_t) \ + __KHASH_PROTOTYPES(name, khkey_t, khval_t) + +#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + __KHASH_TYPE(name, khkey_t, khval_t) \ + __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) + +#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ + KHASH_INIT2(name, static inline, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) + +/* Other convenient macros... */ + +/*! @function + @abstract Test whether a bucket contains data. + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return 1 if containing data; 0 otherwise [int] + */ +#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x))) + +/*! @function + @abstract Get key given an iterator + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return Key [type of keys] + */ +#define kh_key(h, x) ((h)->keys[x]) + +/*! @function + @abstract Get value given an iterator + @param h Pointer to the hash table [khash_t(name)*] + @param x Iterator to the bucket [khint_t] + @return Value [type of values] + @discussion For hash sets, calling this results in segfault. + */ +#define kh_val(h, x) ((h)->vals[x]) + +/*! @function + @abstract Alias of kh_val() + */ +#define kh_value(h, x) ((h)->vals[x]) + +/*! @function + @abstract Get the start iterator + @param h Pointer to the hash table [khash_t(name)*] + @return The start iterator [khint_t] + */ +#define kh_begin(h) (khint_t)(0) + +/*! @function + @abstract Get the end iterator + @param h Pointer to the hash table [khash_t(name)*] + @return The end iterator [khint_t] + */ +#define kh_end(h) ((h)->n_buckets) + +/*! @function + @abstract Get the number of elements in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @return Number of elements in the hash table [khint_t] + */ +#define kh_size(h) ((h)->size) + +/*! @function + @abstract Get the number of buckets in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @return Number of buckets in the hash table [khint_t] + */ +#define kh_n_buckets(h) ((h)->n_buckets) + +/*! @function + @abstract Iterate over the entries in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @param kvar Variable to which key will be assigned + @param vvar Variable to which value will be assigned + @param code Block of code to execute + */ +#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \ + for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ + if (!kh_exist(h,__i)) continue; \ + (kvar) = kh_key(h,__i); \ + (vvar) = kh_val(h,__i); \ + code; \ + } } + +/*! @function + @abstract Iterate over the values in the hash table + @param h Pointer to the hash table [khash_t(name)*] + @param vvar Variable to which value will be assigned + @param code Block of code to execute + */ +#define kh_foreach_value(h, vvar, code) { khint_t __i; \ + for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \ + if (!kh_exist(h,__i)) continue; \ + (vvar) = kh_val(h,__i); \ + code; \ + } } + +static inline khint_t __kh_oid_hash(const unsigned char *oid) +{ + khint_t hash; + memcpy(&hash, oid, sizeof(hash)); + return hash; +} + +#define __kh_oid_cmp(a, b) (hashcmp(a, b) == 0) + +KHASH_INIT(sha1, const unsigned char *, void *, 1, __kh_oid_hash, __kh_oid_cmp) +typedef kh_sha1_t khash_sha1; + +KHASH_INIT(sha1_pos, const unsigned char *, int, 1, __kh_oid_hash, __kh_oid_cmp) +typedef kh_sha1_pos_t khash_sha1_pos; + +#endif /* __AC_KHASH_H */ diff --git a/line-log.c b/line-log.c index 8b6e497b3f..1500101058 100644 --- a/line-log.c +++ b/line-log.c @@ -760,21 +760,12 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list r = r->next; } paths[count] = NULL; - parse_pathspec(&rev->diffopt.pathspec, 0, 0, "", paths); + parse_pathspec(&rev->diffopt.pathspec, 0, + PATHSPEC_PREFER_FULL, "", paths); free(paths); } } -static void load_tree_desc(struct tree_desc *desc, void **tree, - const unsigned char *sha1) -{ - unsigned long size; - *tree = read_object_with_reference(sha1, tree_type, &size, NULL); - if (!*tree) - die("Unable to read tree (%s)", sha1_to_hex(sha1)); - init_tree_desc(desc, *tree, size); -} - static int count_parents(struct commit *commit) { struct commit_list *parents = commit->parents; @@ -841,18 +832,11 @@ static void queue_diffs(struct line_log_data *range, struct diff_queue_struct *queue, struct commit *commit, struct commit *parent) { - void *tree1 = NULL, *tree2 = NULL; - struct tree_desc desc1, desc2; - assert(commit); - load_tree_desc(&desc2, &tree2, commit->tree->object.sha1); - if (parent) - load_tree_desc(&desc1, &tree1, parent->tree->object.sha1); - else - init_tree_desc(&desc1, "", 0); DIFF_QUEUE_CLEAR(&diff_queued_diff); - diff_tree(&desc1, &desc2, "", opt); + diff_tree_sha1(parent ? parent->tree->object.sha1 : NULL, + commit->tree->object.sha1, "", opt); if (opt->detect_rename) { filter_diffs_for_paths(range, 1); if (diff_might_be_rename()) @@ -860,11 +844,6 @@ static void queue_diffs(struct line_log_data *range, filter_diffs_for_paths(range, 0); } move_diff_queue(queue, &diff_queued_diff); - - if (tree1) - free(tree1); - if (tree2) - free(tree2); } static char *get_nth_line(long line, unsigned long *ends, void *data) diff --git a/list-objects.c b/list-objects.c index 6cbedf0280..206816fa9c 100644 --- a/list-objects.c +++ b/list-objects.c @@ -162,15 +162,17 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge) } mark_edge_parents_uninteresting(commit, revs, show_edge); } - for (i = 0; i < revs->cmdline.nr; i++) { - struct object *obj = revs->cmdline.rev[i].item; - struct commit *commit = (struct commit *)obj; - if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) - continue; - mark_tree_uninteresting(commit->tree); - if (revs->edge_hint && !(obj->flags & SHOWN)) { - obj->flags |= SHOWN; - show_edge(commit); + if (revs->edge_hint) { + for (i = 0; i < revs->cmdline.nr; i++) { + struct object *obj = revs->cmdline.rev[i].item; + struct commit *commit = (struct commit *)obj; + if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) + continue; + mark_tree_uninteresting(commit->tree); + if (!(obj->flags & SHOWN)) { + obj->flags |= SHOWN; + show_edge(commit); + } } } } diff --git a/log-tree.c b/log-tree.c index 8534d91826..5ce217d5eb 100644 --- a/log-tree.c +++ b/log-tree.c @@ -98,9 +98,9 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in struct object *obj; enum decoration_type type = DECORATION_NONE; - if (!prefixcmp(refname, "refs/replace/")) { + if (starts_with(refname, "refs/replace/")) { unsigned char original_sha1[20]; - if (!read_replace_refs) + if (!check_replace_refs) return 0; if (get_sha1_hex(refname + 13, original_sha1)) { warning("invalid replace ref %s", refname); @@ -116,11 +116,11 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in if (!obj) return 0; - if (!prefixcmp(refname, "refs/heads/")) + if (starts_with(refname, "refs/heads/")) type = DECORATION_REF_LOCAL; - else if (!prefixcmp(refname, "refs/remotes/")) + else if (starts_with(refname, "refs/remotes/")) type = DECORATION_REF_REMOTE; - else if (!prefixcmp(refname, "refs/tags/")) + else if (starts_with(refname, "refs/tags/")) type = DECORATION_REF_TAG; else if (!strcmp(refname, "refs/stash")) type = DECORATION_REF_STASH; @@ -134,6 +134,8 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in obj = ((struct tag *)obj)->tagged; if (!obj) break; + if (!obj->parsed) + parse_object(obj->sha1); add_name_decoration(DECORATION_REF_TAG, refname, obj); } return 0; @@ -734,7 +736,7 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log if (!opt->diff && !DIFF_OPT_TST(&opt->diffopt, EXIT_WITH_STATUS)) return 0; - parse_commit(commit); + parse_commit_or_die(commit); sha1 = commit->tree->object.sha1; /* Root commit? */ @@ -759,7 +761,7 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log * parent, showing summary diff of the others * we merged _in_. */ - parse_commit(parents->item); + parse_commit_or_die(parents->item); diff_tree_sha1(parents->item->tree->object.sha1, sha1, "", &opt->diffopt); log_tree_diff_flush(opt); @@ -774,7 +776,7 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log for (;;) { struct commit *parent = parents->item; - parse_commit(parent); + parse_commit_or_die(parent); diff_tree_sha1(parent->tree->object.sha1, sha1, "", &opt->diffopt); log_tree_diff_flush(opt); diff --git a/merge-recursive.c b/merge-recursive.c index dbb7104c04..4177092942 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -201,7 +201,9 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh, int options) { struct cache_entry *ce; - ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, refresh); + ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, + (refresh ? (CE_MATCH_REFRESH | + CE_MATCH_IGNORE_MISSING) : 0 )); if (!ce) return error(_("addinfo_cache failed for path '%s'"), path); return add_cache_entry(ce, options); @@ -693,7 +695,7 @@ static int make_room_for_path(struct merge_options *o, const char *path) /* Make sure leading directories are created */ status = safe_create_leading_directories_const(path); if (status) { - if (status == -3) { + if (status == SCLD_EXISTS) { /* something else exists */ error(msg, path, _(": perhaps a D/F conflict?")); return -1; @@ -2063,13 +2065,13 @@ int parse_merge_opt(struct merge_options *o, const char *s) o->recursive_variant = MERGE_RECURSIVE_THEIRS; else if (!strcmp(s, "subtree")) o->subtree_shift = ""; - else if (!prefixcmp(s, "subtree=")) + else if (starts_with(s, "subtree=")) o->subtree_shift = s + strlen("subtree="); else if (!strcmp(s, "patience")) o->xdl_opts = DIFF_WITH_ALG(o, PATIENCE_DIFF); else if (!strcmp(s, "histogram")) o->xdl_opts = DIFF_WITH_ALG(o, HISTOGRAM_DIFF); - else if (!prefixcmp(s, "diff-algorithm=")) { + else if (starts_with(s, "diff-algorithm=")) { long value = parse_algorithm_value(s + strlen("diff-algorithm=")); if (value < 0) return -1; @@ -2088,7 +2090,7 @@ int parse_merge_opt(struct merge_options *o, const char *s) o->renormalize = 1; else if (!strcmp(s, "no-renormalize")) o->renormalize = 0; - else if (!prefixcmp(s, "rename-threshold=")) { + else if (starts_with(s, "rename-threshold=")) { const char *score = s + strlen("rename-threshold="); if ((o->rename_score = parse_rename_score(&score)) == -1 || *score != 0) return -1; diff --git a/name-hash.c b/name-hash.c index e5b6e1ad23..97444d0201 100644 --- a/name-hash.c +++ b/name-hash.c @@ -8,49 +8,28 @@ #define NO_THE_INDEX_COMPATIBILITY_MACROS #include "cache.h" -/* - * This removes bit 5 if bit 6 is set. - * - * That will make US-ASCII characters hash to their upper-case - * equivalent. We could easily do this one whole word at a time, - * but that's for future worries. - */ -static inline unsigned char icase_hash(unsigned char c) -{ - return c & ~((c & 0x40) >> 1); -} - -static unsigned int hash_name(const char *name, int namelen) -{ - unsigned int hash = 0x123; - - while (namelen--) { - unsigned char c = *name++; - c = icase_hash(c); - hash = hash*101 + c; - } - return hash; -} - struct dir_entry { - struct dir_entry *next; + struct hashmap_entry ent; struct dir_entry *parent; struct cache_entry *ce; int nr; unsigned int namelen; }; +static int dir_entry_cmp(const struct dir_entry *e1, + const struct dir_entry *e2, const char *name) +{ + return e1->namelen != e2->namelen || strncasecmp(e1->ce->name, + name ? name : e2->ce->name, e1->namelen); +} + static struct dir_entry *find_dir_entry(struct index_state *istate, const char *name, unsigned int namelen) { - unsigned int hash = hash_name(name, namelen); - struct dir_entry *dir; - - for (dir = lookup_hash(hash, &istate->dir_hash); dir; dir = dir->next) - if (dir->namelen == namelen && - !strncasecmp(dir->ce->name, name, namelen)) - return dir; - return NULL; + struct dir_entry key; + hashmap_entry_init(&key, memihash(name, namelen)); + key.namelen = namelen; + return hashmap_get(&istate->dir_hash, &key, name); } static struct dir_entry *hash_dir_entry(struct index_state *istate, @@ -84,18 +63,11 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate, dir = find_dir_entry(istate, ce->name, namelen); if (!dir) { /* not found, create it and add to hash table */ - void **pdir; - unsigned int hash = hash_name(ce->name, namelen); - dir = xcalloc(1, sizeof(struct dir_entry)); + hashmap_entry_init(dir, memihash(ce->name, namelen)); dir->namelen = namelen; dir->ce = ce; - - pdir = insert_hash(hash, dir, &istate->dir_hash); - if (pdir) { - dir->next = *pdir; - *pdir = dir; - } + hashmap_add(&istate->dir_hash, dir); /* recursively add missing parent directories */ dir->parent = hash_dir_entry(istate, ce, namelen); @@ -114,45 +86,50 @@ static void add_dir_entry(struct index_state *istate, struct cache_entry *ce) static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce) { /* - * Release reference to the directory entry (and parents if 0). - * - * Note: we do not remove / free the entry because there's no - * hash.[ch]::remove_hash and dir->next may point to other entries - * that are still valid, so we must not free the memory. + * Release reference to the directory entry. If 0, remove and continue + * with parent directory. */ struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce)); - while (dir && dir->nr && !(--dir->nr)) - dir = dir->parent; + while (dir && !(--dir->nr)) { + struct dir_entry *parent = dir->parent; + hashmap_remove(&istate->dir_hash, dir, NULL); + free(dir); + dir = parent; + } } static void hash_index_entry(struct index_state *istate, struct cache_entry *ce) { - void **pos; - unsigned int hash; - if (ce->ce_flags & CE_HASHED) return; ce->ce_flags |= CE_HASHED; - ce->next = NULL; - hash = hash_name(ce->name, ce_namelen(ce)); - pos = insert_hash(hash, ce, &istate->name_hash); - if (pos) { - ce->next = *pos; - *pos = ce; - } + hashmap_entry_init(ce, memihash(ce->name, ce_namelen(ce))); + hashmap_add(&istate->name_hash, ce); - if (ignore_case && !(ce->ce_flags & CE_UNHASHED)) + if (ignore_case) add_dir_entry(istate, ce); } +static int cache_entry_cmp(const struct cache_entry *ce1, + const struct cache_entry *ce2, const void *remove) +{ + /* + * For remove_name_hash, find the exact entry (pointer equality); for + * index_file_exists, find all entries with matching hash code and + * decide whether the entry matches in same_name. + */ + return remove ? !(ce1 == ce2) : 0; +} + static void lazy_init_name_hash(struct index_state *istate) { int nr; if (istate->name_hash_initialized) return; - if (istate->cache_nr) - preallocate_hash(&istate->name_hash, istate->cache_nr); + hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp, + istate->cache_nr); + hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0); for (nr = 0; nr < istate->cache_nr; nr++) hash_index_entry(istate, istate->cache[nr]); istate->name_hash_initialized = 1; @@ -160,31 +137,19 @@ static void lazy_init_name_hash(struct index_state *istate) void add_name_hash(struct index_state *istate, struct cache_entry *ce) { - /* if already hashed, add reference to directory entries */ - if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_STATE_MASK) - add_dir_entry(istate, ce); - - ce->ce_flags &= ~CE_UNHASHED; if (istate->name_hash_initialized) hash_index_entry(istate, ce); } -/* - * We don't actually *remove* it, we can just mark it invalid so that - * we won't find it in lookups. - * - * Not only would we have to search the lists (simple enough), but - * we'd also have to rehash other hash buckets in case this makes the - * hash bucket empty (common). So it's much better to just mark - * it. - */ void remove_name_hash(struct index_state *istate, struct cache_entry *ce) { - /* if already hashed, release reference to directory entries */ - if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_HASHED) - remove_dir_entry(istate, ce); + if (!istate->name_hash_initialized || !(ce->ce_flags & CE_HASHED)) + return; + ce->ce_flags &= ~CE_HASHED; + hashmap_remove(&istate->name_hash, ce, ce); - ce->ce_flags |= CE_UNHASHED; + if (ignore_case) + remove_dir_entry(istate, ce); } static int slow_same_name(const char *name1, int len1, const char *name2, int len2) @@ -247,49 +212,27 @@ struct cache_entry *index_dir_exists(struct index_state *istate, const char *nam struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase) { - unsigned int hash = hash_name(name, namelen); struct cache_entry *ce; + struct hashmap_entry key; lazy_init_name_hash(istate); - ce = lookup_hash(hash, &istate->name_hash); + hashmap_entry_init(&key, memihash(name, namelen)); + ce = hashmap_get(&istate->name_hash, &key, NULL); while (ce) { - if (!(ce->ce_flags & CE_UNHASHED)) { - if (same_name(ce, name, namelen, icase)) - return ce; - } - ce = ce->next; + if (same_name(ce, name, namelen, icase)) + return ce; + ce = hashmap_get_next(&istate->name_hash, ce); } return NULL; } -struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int icase) -{ - if (namelen > 0 && name[namelen - 1] == '/') - return index_dir_exists(istate, name, namelen - 1); - return index_file_exists(istate, name, namelen, icase); -} - -static int free_dir_entry(void *entry, void *unused) -{ - struct dir_entry *dir = entry; - while (dir) { - struct dir_entry *next = dir->next; - free(dir); - dir = next; - } - return 0; -} - void free_name_hash(struct index_state *istate) { if (!istate->name_hash_initialized) return; istate->name_hash_initialized = 0; - if (ignore_case) - /* free directory entries */ - for_each_hash(&istate->dir_hash, free_dir_entry, NULL); - free_hash(&istate->name_hash); - free_hash(&istate->dir_hash); + hashmap_free(&istate->name_hash, 0); + hashmap_free(&istate->dir_hash, 1); } diff --git a/notes-utils.c b/notes-utils.c index 9107c379d9..4aa7023903 100644 --- a/notes-utils.c +++ b/notes-utils.c @@ -18,7 +18,7 @@ void create_notes_commit(struct notes_tree *t, struct commit_list *parents, unsigned char parent_sha1[20]; if (!read_ref(t->ref, parent_sha1)) { struct commit *parent = lookup_commit(parent_sha1); - if (!parent || parse_commit(parent)) + if (parse_commit(parent)) die("Failed to find/parse commit %s", t->ref); commit_list_insert(parent, &parents); } @@ -70,12 +70,12 @@ static combine_notes_fn parse_combine_notes_fn(const char *v) static int notes_rewrite_config(const char *k, const char *v, void *cb) { struct notes_rewrite_cfg *c = cb; - if (!prefixcmp(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) { + if (starts_with(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) { c->enabled = git_config_bool(k, v); return 0; } else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) { if (!v) - config_error_nonbool(k); + return config_error_nonbool(k); c->combine = parse_combine_notes_fn(v); if (!c->combine) { error(_("Bad notes.rewriteMode value: '%s'"), v); @@ -85,7 +85,7 @@ static int notes_rewrite_config(const char *k, const char *v, void *cb) } else if (!c->refs_from_env && !strcmp(k, "notes.rewriteref")) { /* note that a refs/ prefix is implied in the * underlying for_each_glob_ref */ - if (!prefixcmp(v, "refs/notes/")) + if (starts_with(v, "refs/notes/")) string_list_add_refs_by_glob(c->refs, v); else warning(_("Refusing to rewrite notes in %s" @@ -1243,9 +1243,9 @@ static void format_note(struct notes_tree *t, const unsigned char *object_sha1, if (!ref || !strcmp(ref, GIT_NOTES_DEFAULT_REF)) { strbuf_addstr(sb, "\nNotes:\n"); } else { - if (!prefixcmp(ref, "refs/")) + if (starts_with(ref, "refs/")) ref += 5; - if (!prefixcmp(ref, "notes/")) + if (starts_with(ref, "notes/")) ref += 6; strbuf_addf(sb, "\nNotes (%s):\n", ref); } @@ -1293,9 +1293,9 @@ int copy_note(struct notes_tree *t, void expand_notes_ref(struct strbuf *sb) { - if (!prefixcmp(sb->buf, "refs/notes/")) + if (starts_with(sb->buf, "refs/notes/")) return; /* we're happy */ - else if (!prefixcmp(sb->buf, "notes/")) + else if (starts_with(sb->buf, "notes/")) strbuf_insert(sb, 0, "refs/", 5); else strbuf_insert(sb, 0, "refs/notes/", 11); @@ -43,14 +43,32 @@ int type_from_string(const char *str) die("invalid object type \"%s\"", str); } +/* + * Return a numerical hash value between 0 and n-1 for the object with + * the specified sha1. n must be a power of 2. Please note that the + * return value is *not* consistent across computer architectures. + */ static unsigned int hash_obj(const unsigned char *sha1, unsigned int n) { unsigned int hash; + + /* + * Since the sha1 is essentially random, we just take the + * required number of bits directly from the first + * sizeof(unsigned int) bytes of sha1. First we have to copy + * the bytes into a properly aligned integer. If we cared + * about getting consistent results across architectures, we + * would have to call ntohl() here, too. + */ memcpy(&hash, sha1, sizeof(unsigned int)); - /* Assumes power-of-2 hash sizes in grow_object_hash */ return hash & (n - 1); } +/* + * Insert obj into the hash table hash, which has length size (which + * must be a power of 2). On collisions, simply overflow to the next + * empty bucket. + */ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size) { unsigned int j = hash_obj(obj->sha1, size); @@ -63,6 +81,10 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i hash[j] = obj; } +/* + * Look up the record for the given sha1 in the hash map stored in + * obj_hash. Return NULL if it was not found. + */ struct object *lookup_object(const unsigned char *sha1) { unsigned int i, first; @@ -92,6 +114,11 @@ struct object *lookup_object(const unsigned char *sha1) return obj; } +/* + * Increase the size of the hash map stored in obj_hash to the next + * power of 2 (but at least 32). Copy the existing values to the new + * hash map. + */ static void grow_object_hash(void) { int i; @@ -42,7 +42,14 @@ struct object { extern const char *typename(unsigned int type); extern int type_from_string(const char *str); +/* + * Return the current number of buckets in the object hashmap. + */ extern unsigned int get_max_object_index(void); + +/* + * Return the object from the specified bucket in the object hashmap. + */ extern struct object *get_indexed_object(unsigned int); /* diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c new file mode 100644 index 0000000000..1218befaf2 --- /dev/null +++ b/pack-bitmap-write.c @@ -0,0 +1,552 @@ +#include "cache.h" +#include "commit.h" +#include "tag.h" +#include "diff.h" +#include "revision.h" +#include "list-objects.h" +#include "progress.h" +#include "pack-revindex.h" +#include "pack.h" +#include "pack-bitmap.h" +#include "sha1-lookup.h" +#include "pack-objects.h" + +struct bitmapped_commit { + struct commit *commit; + struct ewah_bitmap *bitmap; + struct ewah_bitmap *write_as; + int flags; + int xor_offset; + uint32_t commit_pos; +}; + +struct bitmap_writer { + struct ewah_bitmap *commits; + struct ewah_bitmap *trees; + struct ewah_bitmap *blobs; + struct ewah_bitmap *tags; + + khash_sha1 *bitmaps; + khash_sha1 *reused; + struct packing_data *to_pack; + + struct bitmapped_commit *selected; + unsigned int selected_nr, selected_alloc; + + struct progress *progress; + int show_progress; + unsigned char pack_checksum[20]; +}; + +static struct bitmap_writer writer; + +void bitmap_writer_show_progress(int show) +{ + writer.show_progress = show; +} + +/** + * Build the initial type index for the packfile + */ +void bitmap_writer_build_type_index(struct pack_idx_entry **index, + uint32_t index_nr) +{ + uint32_t i; + + writer.commits = ewah_new(); + writer.trees = ewah_new(); + writer.blobs = ewah_new(); + writer.tags = ewah_new(); + + for (i = 0; i < index_nr; ++i) { + struct object_entry *entry = (struct object_entry *)index[i]; + enum object_type real_type; + + entry->in_pack_pos = i; + + switch (entry->type) { + case OBJ_COMMIT: + case OBJ_TREE: + case OBJ_BLOB: + case OBJ_TAG: + real_type = entry->type; + break; + + default: + real_type = sha1_object_info(entry->idx.sha1, NULL); + break; + } + + switch (real_type) { + case OBJ_COMMIT: + ewah_set(writer.commits, i); + break; + + case OBJ_TREE: + ewah_set(writer.trees, i); + break; + + case OBJ_BLOB: + ewah_set(writer.blobs, i); + break; + + case OBJ_TAG: + ewah_set(writer.tags, i); + break; + + default: + die("Missing type information for %s (%d/%d)", + sha1_to_hex(entry->idx.sha1), real_type, entry->type); + } + } +} + +/** + * Compute the actual bitmaps + */ +static struct object **seen_objects; +static unsigned int seen_objects_nr, seen_objects_alloc; + +static inline void push_bitmapped_commit(struct commit *commit, struct ewah_bitmap *reused) +{ + if (writer.selected_nr >= writer.selected_alloc) { + writer.selected_alloc = (writer.selected_alloc + 32) * 2; + writer.selected = xrealloc(writer.selected, + writer.selected_alloc * sizeof(struct bitmapped_commit)); + } + + writer.selected[writer.selected_nr].commit = commit; + writer.selected[writer.selected_nr].bitmap = reused; + writer.selected[writer.selected_nr].flags = 0; + + writer.selected_nr++; +} + +static inline void mark_as_seen(struct object *object) +{ + ALLOC_GROW(seen_objects, seen_objects_nr + 1, seen_objects_alloc); + seen_objects[seen_objects_nr++] = object; +} + +static inline void reset_all_seen(void) +{ + unsigned int i; + for (i = 0; i < seen_objects_nr; ++i) { + seen_objects[i]->flags &= ~(SEEN | ADDED | SHOWN); + } + seen_objects_nr = 0; +} + +static uint32_t find_object_pos(const unsigned char *sha1) +{ + struct object_entry *entry = packlist_find(writer.to_pack, sha1, NULL); + + if (!entry) { + die("Failed to write bitmap index. Packfile doesn't have full closure " + "(object %s is missing)", sha1_to_hex(sha1)); + } + + return entry->in_pack_pos; +} + +static void show_object(struct object *object, const struct name_path *path, + const char *last, void *data) +{ + struct bitmap *base = data; + bitmap_set(base, find_object_pos(object->sha1)); + mark_as_seen(object); +} + +static void show_commit(struct commit *commit, void *data) +{ + mark_as_seen((struct object *)commit); +} + +static int +add_to_include_set(struct bitmap *base, struct commit *commit) +{ + khiter_t hash_pos; + uint32_t bitmap_pos = find_object_pos(commit->object.sha1); + + if (bitmap_get(base, bitmap_pos)) + return 0; + + hash_pos = kh_get_sha1(writer.bitmaps, commit->object.sha1); + if (hash_pos < kh_end(writer.bitmaps)) { + struct bitmapped_commit *bc = kh_value(writer.bitmaps, hash_pos); + bitmap_or_ewah(base, bc->bitmap); + return 0; + } + + bitmap_set(base, bitmap_pos); + return 1; +} + +static int +should_include(struct commit *commit, void *_data) +{ + struct bitmap *base = _data; + + if (!add_to_include_set(base, commit)) { + struct commit_list *parent = commit->parents; + + mark_as_seen((struct object *)commit); + + while (parent) { + parent->item->object.flags |= SEEN; + mark_as_seen((struct object *)parent->item); + parent = parent->next; + } + + return 0; + } + + return 1; +} + +static void compute_xor_offsets(void) +{ + static const int MAX_XOR_OFFSET_SEARCH = 10; + + int i, next = 0; + + while (next < writer.selected_nr) { + struct bitmapped_commit *stored = &writer.selected[next]; + + int best_offset = 0; + struct ewah_bitmap *best_bitmap = stored->bitmap; + struct ewah_bitmap *test_xor; + + for (i = 1; i <= MAX_XOR_OFFSET_SEARCH; ++i) { + int curr = next - i; + + if (curr < 0) + break; + + test_xor = ewah_pool_new(); + ewah_xor(writer.selected[curr].bitmap, stored->bitmap, test_xor); + + if (test_xor->buffer_size < best_bitmap->buffer_size) { + if (best_bitmap != stored->bitmap) + ewah_pool_free(best_bitmap); + + best_bitmap = test_xor; + best_offset = i; + } else { + ewah_pool_free(test_xor); + } + } + + stored->xor_offset = best_offset; + stored->write_as = best_bitmap; + + next++; + } +} + +void bitmap_writer_build(struct packing_data *to_pack) +{ + static const double REUSE_BITMAP_THRESHOLD = 0.2; + + int i, reuse_after, need_reset; + struct bitmap *base = bitmap_new(); + struct rev_info revs; + + writer.bitmaps = kh_init_sha1(); + writer.to_pack = to_pack; + + if (writer.show_progress) + writer.progress = start_progress("Building bitmaps", writer.selected_nr); + + init_revisions(&revs, NULL); + revs.tag_objects = 1; + revs.tree_objects = 1; + revs.blob_objects = 1; + revs.no_walk = 0; + + revs.include_check = should_include; + reset_revision_walk(); + + reuse_after = writer.selected_nr * REUSE_BITMAP_THRESHOLD; + need_reset = 0; + + for (i = writer.selected_nr - 1; i >= 0; --i) { + struct bitmapped_commit *stored; + struct object *object; + + khiter_t hash_pos; + int hash_ret; + + stored = &writer.selected[i]; + object = (struct object *)stored->commit; + + if (stored->bitmap == NULL) { + if (i < writer.selected_nr - 1 && + (need_reset || + !in_merge_bases(writer.selected[i + 1].commit, + stored->commit))) { + bitmap_reset(base); + reset_all_seen(); + } + + add_pending_object(&revs, object, ""); + revs.include_check_data = base; + + if (prepare_revision_walk(&revs)) + die("revision walk setup failed"); + + traverse_commit_list(&revs, show_commit, show_object, base); + + revs.pending.nr = 0; + revs.pending.alloc = 0; + revs.pending.objects = NULL; + + stored->bitmap = bitmap_to_ewah(base); + need_reset = 0; + } else + need_reset = 1; + + if (i >= reuse_after) + stored->flags |= BITMAP_FLAG_REUSE; + + hash_pos = kh_put_sha1(writer.bitmaps, object->sha1, &hash_ret); + if (hash_ret == 0) + die("Duplicate entry when writing index: %s", + sha1_to_hex(object->sha1)); + + kh_value(writer.bitmaps, hash_pos) = stored; + display_progress(writer.progress, writer.selected_nr - i); + } + + bitmap_free(base); + stop_progress(&writer.progress); + + compute_xor_offsets(); +} + +/** + * Select the commits that will be bitmapped + */ +static inline unsigned int next_commit_index(unsigned int idx) +{ + static const unsigned int MIN_COMMITS = 100; + static const unsigned int MAX_COMMITS = 5000; + + static const unsigned int MUST_REGION = 100; + static const unsigned int MIN_REGION = 20000; + + unsigned int offset, next; + + if (idx <= MUST_REGION) + return 0; + + if (idx <= MIN_REGION) { + offset = idx - MUST_REGION; + return (offset < MIN_COMMITS) ? offset : MIN_COMMITS; + } + + offset = idx - MIN_REGION; + next = (offset < MAX_COMMITS) ? offset : MAX_COMMITS; + + return (next > MIN_COMMITS) ? next : MIN_COMMITS; +} + +static int date_compare(const void *_a, const void *_b) +{ + struct commit *a = *(struct commit **)_a; + struct commit *b = *(struct commit **)_b; + return (long)b->date - (long)a->date; +} + +void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack) +{ + if (prepare_bitmap_git() < 0) + return; + + writer.reused = kh_init_sha1(); + rebuild_existing_bitmaps(to_pack, writer.reused, writer.show_progress); +} + +static struct ewah_bitmap *find_reused_bitmap(const unsigned char *sha1) +{ + khiter_t hash_pos; + + if (!writer.reused) + return NULL; + + hash_pos = kh_get_sha1(writer.reused, sha1); + if (hash_pos >= kh_end(writer.reused)) + return NULL; + + return kh_value(writer.reused, hash_pos); +} + +void bitmap_writer_select_commits(struct commit **indexed_commits, + unsigned int indexed_commits_nr, + int max_bitmaps) +{ + unsigned int i = 0, j, next; + + qsort(indexed_commits, indexed_commits_nr, sizeof(indexed_commits[0]), + date_compare); + + if (writer.show_progress) + writer.progress = start_progress("Selecting bitmap commits", 0); + + if (indexed_commits_nr < 100) { + for (i = 0; i < indexed_commits_nr; ++i) + push_bitmapped_commit(indexed_commits[i], NULL); + return; + } + + for (;;) { + struct ewah_bitmap *reused_bitmap = NULL; + struct commit *chosen = NULL; + + next = next_commit_index(i); + + if (i + next >= indexed_commits_nr) + break; + + if (max_bitmaps > 0 && writer.selected_nr >= max_bitmaps) { + writer.selected_nr = max_bitmaps; + break; + } + + if (next == 0) { + chosen = indexed_commits[i]; + reused_bitmap = find_reused_bitmap(chosen->object.sha1); + } else { + chosen = indexed_commits[i + next]; + + for (j = 0; j <= next; ++j) { + struct commit *cm = indexed_commits[i + j]; + + reused_bitmap = find_reused_bitmap(cm->object.sha1); + if (reused_bitmap || (cm->object.flags & NEEDS_BITMAP) != 0) { + chosen = cm; + break; + } + + if (cm->parents && cm->parents->next) + chosen = cm; + } + } + + push_bitmapped_commit(chosen, reused_bitmap); + + i += next + 1; + display_progress(writer.progress, i); + } + + stop_progress(&writer.progress); +} + + +static int sha1write_ewah_helper(void *f, const void *buf, size_t len) +{ + /* sha1write will die on error */ + sha1write(f, buf, len); + return len; +} + +/** + * Write the bitmap index to disk + */ +static inline void dump_bitmap(struct sha1file *f, struct ewah_bitmap *bitmap) +{ + if (ewah_serialize_to(bitmap, sha1write_ewah_helper, f) < 0) + die("Failed to write bitmap index"); +} + +static const unsigned char *sha1_access(size_t pos, void *table) +{ + struct pack_idx_entry **index = table; + return index[pos]->sha1; +} + +static void write_selected_commits_v1(struct sha1file *f, + struct pack_idx_entry **index, + uint32_t index_nr) +{ + int i; + + for (i = 0; i < writer.selected_nr; ++i) { + struct bitmapped_commit *stored = &writer.selected[i]; + struct bitmap_disk_entry on_disk; + + int commit_pos = + sha1_pos(stored->commit->object.sha1, index, index_nr, sha1_access); + + if (commit_pos < 0) + die("BUG: trying to write commit not in index"); + + on_disk.object_pos = htonl(commit_pos); + on_disk.xor_offset = stored->xor_offset; + on_disk.flags = stored->flags; + + sha1write(f, &on_disk, sizeof(on_disk)); + dump_bitmap(f, stored->write_as); + } +} + +static void write_hash_cache(struct sha1file *f, + struct pack_idx_entry **index, + uint32_t index_nr) +{ + uint32_t i; + + for (i = 0; i < index_nr; ++i) { + struct object_entry *entry = (struct object_entry *)index[i]; + uint32_t hash_value = htonl(entry->hash); + sha1write(f, &hash_value, sizeof(hash_value)); + } +} + +void bitmap_writer_set_checksum(unsigned char *sha1) +{ + hashcpy(writer.pack_checksum, sha1); +} + +void bitmap_writer_finish(struct pack_idx_entry **index, + uint32_t index_nr, + const char *filename, + uint16_t options) +{ + static char tmp_file[PATH_MAX]; + static uint16_t default_version = 1; + static uint16_t flags = BITMAP_OPT_FULL_DAG; + struct sha1file *f; + + struct bitmap_disk_header header; + + int fd = odb_mkstemp(tmp_file, sizeof(tmp_file), "pack/tmp_bitmap_XXXXXX"); + + if (fd < 0) + die_errno("unable to create '%s'", tmp_file); + f = sha1fd(fd, tmp_file); + + memcpy(header.magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)); + header.version = htons(default_version); + header.options = htons(flags | options); + header.entry_count = htonl(writer.selected_nr); + memcpy(header.checksum, writer.pack_checksum, 20); + + sha1write(f, &header, sizeof(header)); + dump_bitmap(f, writer.commits); + dump_bitmap(f, writer.trees); + dump_bitmap(f, writer.blobs); + dump_bitmap(f, writer.tags); + write_selected_commits_v1(f, index, index_nr); + + if (options & BITMAP_OPT_HASH_CACHE) + write_hash_cache(f, index, index_nr); + + sha1close(f, NULL, CSUM_FSYNC); + + if (adjust_shared_perm(tmp_file)) + die_errno("unable to make temporary bitmap file readable"); + + if (rename(tmp_file, filename)) + die_errno("unable to rename temporary bitmap file to '%s'", filename); +} diff --git a/pack-bitmap.c b/pack-bitmap.c new file mode 100644 index 0000000000..ae0b57b950 --- /dev/null +++ b/pack-bitmap.c @@ -0,0 +1,1073 @@ +#include "cache.h" +#include "commit.h" +#include "tag.h" +#include "diff.h" +#include "revision.h" +#include "progress.h" +#include "list-objects.h" +#include "pack.h" +#include "pack-bitmap.h" +#include "pack-revindex.h" +#include "pack-objects.h" + +/* + * An entry on the bitmap index, representing the bitmap for a given + * commit. + */ +struct stored_bitmap { + unsigned char sha1[20]; + struct ewah_bitmap *root; + struct stored_bitmap *xor; + int flags; +}; + +/* + * The currently active bitmap index. By design, repositories only have + * a single bitmap index available (the index for the biggest packfile in + * the repository), since bitmap indexes need full closure. + * + * If there is more than one bitmap index available (e.g. because of alternates), + * the active bitmap index is the largest one. + */ +static struct bitmap_index { + /* Packfile to which this bitmap index belongs to */ + struct packed_git *pack; + + /* reverse index for the packfile */ + struct pack_revindex *reverse_index; + + /* + * Mark the first `reuse_objects` in the packfile as reused: + * they will be sent as-is without using them for repacking + * calculations + */ + uint32_t reuse_objects; + + /* mmapped buffer of the whole bitmap index */ + unsigned char *map; + size_t map_size; /* size of the mmaped buffer */ + size_t map_pos; /* current position when loading the index */ + + /* + * Type indexes. + * + * Each bitmap marks which objects in the packfile are of the given + * type. This provides type information when yielding the objects from + * the packfile during a walk, which allows for better delta bases. + */ + struct ewah_bitmap *commits; + struct ewah_bitmap *trees; + struct ewah_bitmap *blobs; + struct ewah_bitmap *tags; + + /* Map from SHA1 -> `stored_bitmap` for all the bitmapped comits */ + khash_sha1 *bitmaps; + + /* Number of bitmapped commits */ + uint32_t entry_count; + + /* Name-hash cache (or NULL if not present). */ + uint32_t *hashes; + + /* + * Extended index. + * + * When trying to perform bitmap operations with objects that are not + * packed in `pack`, these objects are added to this "fake index" and + * are assumed to appear at the end of the packfile for all operations + */ + struct eindex { + struct object **objects; + uint32_t *hashes; + uint32_t count, alloc; + khash_sha1_pos *positions; + } ext_index; + + /* Bitmap result of the last performed walk */ + struct bitmap *result; + + /* Version of the bitmap index */ + unsigned int version; + + unsigned loaded : 1; + +} bitmap_git; + +static struct ewah_bitmap *lookup_stored_bitmap(struct stored_bitmap *st) +{ + struct ewah_bitmap *parent; + struct ewah_bitmap *composed; + + if (st->xor == NULL) + return st->root; + + composed = ewah_pool_new(); + parent = lookup_stored_bitmap(st->xor); + ewah_xor(st->root, parent, composed); + + ewah_pool_free(st->root); + st->root = composed; + st->xor = NULL; + + return composed; +} + +/* + * Read a bitmap from the current read position on the mmaped + * index, and increase the read position accordingly + */ +static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index) +{ + struct ewah_bitmap *b = ewah_pool_new(); + + int bitmap_size = ewah_read_mmap(b, + index->map + index->map_pos, + index->map_size - index->map_pos); + + if (bitmap_size < 0) { + error("Failed to load bitmap index (corrupted?)"); + ewah_pool_free(b); + return NULL; + } + + index->map_pos += bitmap_size; + return b; +} + +static int load_bitmap_header(struct bitmap_index *index) +{ + struct bitmap_disk_header *header = (void *)index->map; + + if (index->map_size < sizeof(*header) + 20) + return error("Corrupted bitmap index (missing header data)"); + + if (memcmp(header->magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)) != 0) + return error("Corrupted bitmap index file (wrong header)"); + + index->version = ntohs(header->version); + if (index->version != 1) + return error("Unsupported version for bitmap index file (%d)", index->version); + + /* Parse known bitmap format options */ + { + uint32_t flags = ntohs(header->options); + + if ((flags & BITMAP_OPT_FULL_DAG) == 0) + return error("Unsupported options for bitmap index file " + "(Git requires BITMAP_OPT_FULL_DAG)"); + + if (flags & BITMAP_OPT_HASH_CACHE) { + unsigned char *end = index->map + index->map_size - 20; + index->hashes = ((uint32_t *)end) - index->pack->num_objects; + } + } + + index->entry_count = ntohl(header->entry_count); + index->map_pos += sizeof(*header); + return 0; +} + +static struct stored_bitmap *store_bitmap(struct bitmap_index *index, + struct ewah_bitmap *root, + const unsigned char *sha1, + struct stored_bitmap *xor_with, + int flags) +{ + struct stored_bitmap *stored; + khiter_t hash_pos; + int ret; + + stored = xmalloc(sizeof(struct stored_bitmap)); + stored->root = root; + stored->xor = xor_with; + stored->flags = flags; + hashcpy(stored->sha1, sha1); + + hash_pos = kh_put_sha1(index->bitmaps, stored->sha1, &ret); + + /* a 0 return code means the insertion succeeded with no changes, + * because the SHA1 already existed on the map. this is bad, there + * shouldn't be duplicated commits in the index */ + if (ret == 0) { + error("Duplicate entry in bitmap index: %s", sha1_to_hex(sha1)); + return NULL; + } + + kh_value(index->bitmaps, hash_pos) = stored; + return stored; +} + +static int load_bitmap_entries_v1(struct bitmap_index *index) +{ + static const size_t MAX_XOR_OFFSET = 160; + + uint32_t i; + struct stored_bitmap **recent_bitmaps; + struct bitmap_disk_entry *entry; + + recent_bitmaps = xcalloc(MAX_XOR_OFFSET, sizeof(struct stored_bitmap)); + + for (i = 0; i < index->entry_count; ++i) { + int xor_offset, flags; + struct ewah_bitmap *bitmap = NULL; + struct stored_bitmap *xor_bitmap = NULL; + uint32_t commit_idx_pos; + const unsigned char *sha1; + + entry = (struct bitmap_disk_entry *)(index->map + index->map_pos); + index->map_pos += sizeof(struct bitmap_disk_entry); + + commit_idx_pos = ntohl(entry->object_pos); + sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos); + + xor_offset = (int)entry->xor_offset; + flags = (int)entry->flags; + + bitmap = read_bitmap_1(index); + if (!bitmap) + return -1; + + if (xor_offset > MAX_XOR_OFFSET || xor_offset > i) + return error("Corrupted bitmap pack index"); + + if (xor_offset > 0) { + xor_bitmap = recent_bitmaps[(i - xor_offset) % MAX_XOR_OFFSET]; + + if (xor_bitmap == NULL) + return error("Invalid XOR offset in bitmap pack index"); + } + + recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap( + index, bitmap, sha1, xor_bitmap, flags); + } + + return 0; +} + +static int open_pack_bitmap_1(struct packed_git *packfile) +{ + int fd; + struct stat st; + char *idx_name; + + if (open_pack_index(packfile)) + return -1; + + idx_name = pack_bitmap_filename(packfile); + fd = git_open_noatime(idx_name); + free(idx_name); + + if (fd < 0) + return -1; + + if (fstat(fd, &st)) { + close(fd); + return -1; + } + + if (bitmap_git.pack) { + warning("ignoring extra bitmap file: %s", packfile->pack_name); + close(fd); + return -1; + } + + bitmap_git.pack = packfile; + bitmap_git.map_size = xsize_t(st.st_size); + bitmap_git.map = xmmap(NULL, bitmap_git.map_size, PROT_READ, MAP_PRIVATE, fd, 0); + bitmap_git.map_pos = 0; + close(fd); + + if (load_bitmap_header(&bitmap_git) < 0) { + munmap(bitmap_git.map, bitmap_git.map_size); + bitmap_git.map = NULL; + bitmap_git.map_size = 0; + return -1; + } + + return 0; +} + +static int load_pack_bitmap(void) +{ + assert(bitmap_git.map && !bitmap_git.loaded); + + bitmap_git.bitmaps = kh_init_sha1(); + bitmap_git.ext_index.positions = kh_init_sha1_pos(); + bitmap_git.reverse_index = revindex_for_pack(bitmap_git.pack); + + if (!(bitmap_git.commits = read_bitmap_1(&bitmap_git)) || + !(bitmap_git.trees = read_bitmap_1(&bitmap_git)) || + !(bitmap_git.blobs = read_bitmap_1(&bitmap_git)) || + !(bitmap_git.tags = read_bitmap_1(&bitmap_git))) + goto failed; + + if (load_bitmap_entries_v1(&bitmap_git) < 0) + goto failed; + + bitmap_git.loaded = 1; + return 0; + +failed: + munmap(bitmap_git.map, bitmap_git.map_size); + bitmap_git.map = NULL; + bitmap_git.map_size = 0; + return -1; +} + +char *pack_bitmap_filename(struct packed_git *p) +{ + char *idx_name; + int len; + + len = strlen(p->pack_name) - strlen(".pack"); + idx_name = xmalloc(len + strlen(".bitmap") + 1); + + memcpy(idx_name, p->pack_name, len); + memcpy(idx_name + len, ".bitmap", strlen(".bitmap") + 1); + + return idx_name; +} + +static int open_pack_bitmap(void) +{ + struct packed_git *p; + int ret = -1; + + assert(!bitmap_git.map && !bitmap_git.loaded); + + prepare_packed_git(); + for (p = packed_git; p; p = p->next) { + if (open_pack_bitmap_1(p) == 0) + ret = 0; + } + + return ret; +} + +int prepare_bitmap_git(void) +{ + if (bitmap_git.loaded) + return 0; + + if (!open_pack_bitmap()) + return load_pack_bitmap(); + + return -1; +} + +struct include_data { + struct bitmap *base; + struct bitmap *seen; +}; + +static inline int bitmap_position_extended(const unsigned char *sha1) +{ + khash_sha1_pos *positions = bitmap_git.ext_index.positions; + khiter_t pos = kh_get_sha1_pos(positions, sha1); + + if (pos < kh_end(positions)) { + int bitmap_pos = kh_value(positions, pos); + return bitmap_pos + bitmap_git.pack->num_objects; + } + + return -1; +} + +static inline int bitmap_position_packfile(const unsigned char *sha1) +{ + off_t offset = find_pack_entry_one(sha1, bitmap_git.pack); + if (!offset) + return -1; + + return find_revindex_position(bitmap_git.reverse_index, offset); +} + +static int bitmap_position(const unsigned char *sha1) +{ + int pos = bitmap_position_packfile(sha1); + return (pos >= 0) ? pos : bitmap_position_extended(sha1); +} + +static int ext_index_add_object(struct object *object, const char *name) +{ + struct eindex *eindex = &bitmap_git.ext_index; + + khiter_t hash_pos; + int hash_ret; + int bitmap_pos; + + hash_pos = kh_put_sha1_pos(eindex->positions, object->sha1, &hash_ret); + if (hash_ret > 0) { + if (eindex->count >= eindex->alloc) { + eindex->alloc = (eindex->alloc + 16) * 3 / 2; + eindex->objects = xrealloc(eindex->objects, + eindex->alloc * sizeof(struct object *)); + eindex->hashes = xrealloc(eindex->hashes, + eindex->alloc * sizeof(uint32_t)); + } + + bitmap_pos = eindex->count; + eindex->objects[eindex->count] = object; + eindex->hashes[eindex->count] = pack_name_hash(name); + kh_value(eindex->positions, hash_pos) = bitmap_pos; + eindex->count++; + } else { + bitmap_pos = kh_value(eindex->positions, hash_pos); + } + + return bitmap_pos + bitmap_git.pack->num_objects; +} + +static void show_object(struct object *object, const struct name_path *path, + const char *last, void *data) +{ + struct bitmap *base = data; + int bitmap_pos; + + bitmap_pos = bitmap_position(object->sha1); + + if (bitmap_pos < 0) { + char *name = path_name(path, last); + bitmap_pos = ext_index_add_object(object, name); + free(name); + } + + bitmap_set(base, bitmap_pos); +} + +static void show_commit(struct commit *commit, void *data) +{ +} + +static int add_to_include_set(struct include_data *data, + const unsigned char *sha1, + int bitmap_pos) +{ + khiter_t hash_pos; + + if (data->seen && bitmap_get(data->seen, bitmap_pos)) + return 0; + + if (bitmap_get(data->base, bitmap_pos)) + return 0; + + hash_pos = kh_get_sha1(bitmap_git.bitmaps, sha1); + if (hash_pos < kh_end(bitmap_git.bitmaps)) { + struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, hash_pos); + bitmap_or_ewah(data->base, lookup_stored_bitmap(st)); + return 0; + } + + bitmap_set(data->base, bitmap_pos); + return 1; +} + +static int should_include(struct commit *commit, void *_data) +{ + struct include_data *data = _data; + int bitmap_pos; + + bitmap_pos = bitmap_position(commit->object.sha1); + if (bitmap_pos < 0) + bitmap_pos = ext_index_add_object((struct object *)commit, NULL); + + if (!add_to_include_set(data, commit->object.sha1, bitmap_pos)) { + struct commit_list *parent = commit->parents; + + while (parent) { + parent->item->object.flags |= SEEN; + parent = parent->next; + } + + return 0; + } + + return 1; +} + +static struct bitmap *find_objects(struct rev_info *revs, + struct object_list *roots, + struct bitmap *seen) +{ + struct bitmap *base = NULL; + int needs_walk = 0; + + struct object_list *not_mapped = NULL; + + /* + * Go through all the roots for the walk. The ones that have bitmaps + * on the bitmap index will be `or`ed together to form an initial + * global reachability analysis. + * + * The ones without bitmaps in the index will be stored in the + * `not_mapped_list` for further processing. + */ + while (roots) { + struct object *object = roots->item; + roots = roots->next; + + if (object->type == OBJ_COMMIT) { + khiter_t pos = kh_get_sha1(bitmap_git.bitmaps, object->sha1); + + if (pos < kh_end(bitmap_git.bitmaps)) { + struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, pos); + struct ewah_bitmap *or_with = lookup_stored_bitmap(st); + + if (base == NULL) + base = ewah_to_bitmap(or_with); + else + bitmap_or_ewah(base, or_with); + + object->flags |= SEEN; + continue; + } + } + + object_list_insert(object, ¬_mapped); + } + + /* + * Best case scenario: We found bitmaps for all the roots, + * so the resulting `or` bitmap has the full reachability analysis + */ + if (not_mapped == NULL) + return base; + + roots = not_mapped; + + /* + * Let's iterate through all the roots that don't have bitmaps to + * check if we can determine them to be reachable from the existing + * global bitmap. + * + * If we cannot find them in the existing global bitmap, we'll need + * to push them to an actual walk and run it until we can confirm + * they are reachable + */ + while (roots) { + struct object *object = roots->item; + int pos; + + roots = roots->next; + pos = bitmap_position(object->sha1); + + if (pos < 0 || base == NULL || !bitmap_get(base, pos)) { + object->flags &= ~UNINTERESTING; + add_pending_object(revs, object, ""); + needs_walk = 1; + } else { + object->flags |= SEEN; + } + } + + if (needs_walk) { + struct include_data incdata; + + if (base == NULL) + base = bitmap_new(); + + incdata.base = base; + incdata.seen = seen; + + revs->include_check = should_include; + revs->include_check_data = &incdata; + + if (prepare_revision_walk(revs)) + die("revision walk setup failed"); + + traverse_commit_list(revs, show_commit, show_object, base); + } + + return base; +} + +static void show_extended_objects(struct bitmap *objects, + show_reachable_fn show_reach) +{ + struct eindex *eindex = &bitmap_git.ext_index; + uint32_t i; + + for (i = 0; i < eindex->count; ++i) { + struct object *obj; + + if (!bitmap_get(objects, bitmap_git.pack->num_objects + i)) + continue; + + obj = eindex->objects[i]; + show_reach(obj->sha1, obj->type, 0, eindex->hashes[i], NULL, 0); + } +} + +static void show_objects_for_type( + struct bitmap *objects, + struct ewah_bitmap *type_filter, + enum object_type object_type, + show_reachable_fn show_reach) +{ + size_t pos = 0, i = 0; + uint32_t offset; + + struct ewah_iterator it; + eword_t filter; + + if (bitmap_git.reuse_objects == bitmap_git.pack->num_objects) + return; + + ewah_iterator_init(&it, type_filter); + + while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) { + eword_t word = objects->words[i] & filter; + + for (offset = 0; offset < BITS_IN_WORD; ++offset) { + const unsigned char *sha1; + struct revindex_entry *entry; + uint32_t hash = 0; + + if ((word >> offset) == 0) + break; + + offset += ewah_bit_ctz64(word >> offset); + + if (pos + offset < bitmap_git.reuse_objects) + continue; + + entry = &bitmap_git.reverse_index->revindex[pos + offset]; + sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); + + if (bitmap_git.hashes) + hash = ntohl(bitmap_git.hashes[entry->nr]); + + show_reach(sha1, object_type, 0, hash, bitmap_git.pack, entry->offset); + } + + pos += BITS_IN_WORD; + i++; + } +} + +static int in_bitmapped_pack(struct object_list *roots) +{ + while (roots) { + struct object *object = roots->item; + roots = roots->next; + + if (find_pack_entry_one(object->sha1, bitmap_git.pack) > 0) + return 1; + } + + return 0; +} + +int prepare_bitmap_walk(struct rev_info *revs) +{ + unsigned int i; + unsigned int pending_nr = revs->pending.nr; + struct object_array_entry *pending_e = revs->pending.objects; + + struct object_list *wants = NULL; + struct object_list *haves = NULL; + + struct bitmap *wants_bitmap = NULL; + struct bitmap *haves_bitmap = NULL; + + if (!bitmap_git.loaded) { + /* try to open a bitmapped pack, but don't parse it yet + * because we may not need to use it */ + if (open_pack_bitmap() < 0) + return -1; + } + + for (i = 0; i < pending_nr; ++i) { + struct object *object = pending_e[i].item; + + if (object->type == OBJ_NONE) + parse_object_or_die(object->sha1, NULL); + + while (object->type == OBJ_TAG) { + struct tag *tag = (struct tag *) object; + + if (object->flags & UNINTERESTING) + object_list_insert(object, &haves); + else + object_list_insert(object, &wants); + + if (!tag->tagged) + die("bad tag"); + object = parse_object_or_die(tag->tagged->sha1, NULL); + } + + if (object->flags & UNINTERESTING) + object_list_insert(object, &haves); + else + object_list_insert(object, &wants); + } + + /* + * if we have a HAVES list, but none of those haves is contained + * in the packfile that has a bitmap, we don't have anything to + * optimize here + */ + if (haves && !in_bitmapped_pack(haves)) + return -1; + + /* if we don't want anything, we're done here */ + if (!wants) + return -1; + + /* + * now we're going to use bitmaps, so load the actual bitmap entries + * from disk. this is the point of no return; after this the rev_list + * becomes invalidated and we must perform the revwalk through bitmaps + */ + if (!bitmap_git.loaded && load_pack_bitmap() < 0) + return -1; + + revs->pending.nr = 0; + revs->pending.alloc = 0; + revs->pending.objects = NULL; + + if (haves) { + haves_bitmap = find_objects(revs, haves, NULL); + reset_revision_walk(); + + if (haves_bitmap == NULL) + die("BUG: failed to perform bitmap walk"); + } + + wants_bitmap = find_objects(revs, wants, haves_bitmap); + + if (!wants_bitmap) + die("BUG: failed to perform bitmap walk"); + + if (haves_bitmap) + bitmap_and_not(wants_bitmap, haves_bitmap); + + bitmap_git.result = wants_bitmap; + + bitmap_free(haves_bitmap); + return 0; +} + +int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, + uint32_t *entries, + off_t *up_to) +{ + /* + * Reuse the packfile content if we need more than + * 90% of its objects + */ + static const double REUSE_PERCENT = 0.9; + + struct bitmap *result = bitmap_git.result; + uint32_t reuse_threshold; + uint32_t i, reuse_objects = 0; + + assert(result); + + for (i = 0; i < result->word_alloc; ++i) { + if (result->words[i] != (eword_t)~0) { + reuse_objects += ewah_bit_ctz64(~result->words[i]); + break; + } + + reuse_objects += BITS_IN_WORD; + } + +#ifdef GIT_BITMAP_DEBUG + { + const unsigned char *sha1; + struct revindex_entry *entry; + + entry = &bitmap_git.reverse_index->revindex[reuse_objects]; + sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); + + fprintf(stderr, "Failed to reuse at %d (%016llx)\n", + reuse_objects, result->words[i]); + fprintf(stderr, " %s\n", sha1_to_hex(sha1)); + } +#endif + + if (!reuse_objects) + return -1; + + if (reuse_objects >= bitmap_git.pack->num_objects) { + bitmap_git.reuse_objects = *entries = bitmap_git.pack->num_objects; + *up_to = -1; /* reuse the full pack */ + *packfile = bitmap_git.pack; + return 0; + } + + reuse_threshold = bitmap_popcount(bitmap_git.result) * REUSE_PERCENT; + + if (reuse_objects < reuse_threshold) + return -1; + + bitmap_git.reuse_objects = *entries = reuse_objects; + *up_to = bitmap_git.reverse_index->revindex[reuse_objects].offset; + *packfile = bitmap_git.pack; + + return 0; +} + +void traverse_bitmap_commit_list(show_reachable_fn show_reachable) +{ + assert(bitmap_git.result); + + show_objects_for_type(bitmap_git.result, bitmap_git.commits, + OBJ_COMMIT, show_reachable); + show_objects_for_type(bitmap_git.result, bitmap_git.trees, + OBJ_TREE, show_reachable); + show_objects_for_type(bitmap_git.result, bitmap_git.blobs, + OBJ_BLOB, show_reachable); + show_objects_for_type(bitmap_git.result, bitmap_git.tags, + OBJ_TAG, show_reachable); + + show_extended_objects(bitmap_git.result, show_reachable); + + bitmap_free(bitmap_git.result); + bitmap_git.result = NULL; +} + +static uint32_t count_object_type(struct bitmap *objects, + enum object_type type) +{ + struct eindex *eindex = &bitmap_git.ext_index; + + uint32_t i = 0, count = 0; + struct ewah_iterator it; + eword_t filter; + + switch (type) { + case OBJ_COMMIT: + ewah_iterator_init(&it, bitmap_git.commits); + break; + + case OBJ_TREE: + ewah_iterator_init(&it, bitmap_git.trees); + break; + + case OBJ_BLOB: + ewah_iterator_init(&it, bitmap_git.blobs); + break; + + case OBJ_TAG: + ewah_iterator_init(&it, bitmap_git.tags); + break; + + default: + return 0; + } + + while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) { + eword_t word = objects->words[i++] & filter; + count += ewah_bit_popcount64(word); + } + + for (i = 0; i < eindex->count; ++i) { + if (eindex->objects[i]->type == type && + bitmap_get(objects, bitmap_git.pack->num_objects + i)) + count++; + } + + return count; +} + +void count_bitmap_commit_list(uint32_t *commits, uint32_t *trees, + uint32_t *blobs, uint32_t *tags) +{ + assert(bitmap_git.result); + + if (commits) + *commits = count_object_type(bitmap_git.result, OBJ_COMMIT); + + if (trees) + *trees = count_object_type(bitmap_git.result, OBJ_TREE); + + if (blobs) + *blobs = count_object_type(bitmap_git.result, OBJ_BLOB); + + if (tags) + *tags = count_object_type(bitmap_git.result, OBJ_TAG); +} + +struct bitmap_test_data { + struct bitmap *base; + struct progress *prg; + size_t seen; +}; + +static void test_show_object(struct object *object, + const struct name_path *path, + const char *last, void *data) +{ + struct bitmap_test_data *tdata = data; + int bitmap_pos; + + bitmap_pos = bitmap_position(object->sha1); + if (bitmap_pos < 0) + die("Object not in bitmap: %s\n", sha1_to_hex(object->sha1)); + + bitmap_set(tdata->base, bitmap_pos); + display_progress(tdata->prg, ++tdata->seen); +} + +static void test_show_commit(struct commit *commit, void *data) +{ + struct bitmap_test_data *tdata = data; + int bitmap_pos; + + bitmap_pos = bitmap_position(commit->object.sha1); + if (bitmap_pos < 0) + die("Object not in bitmap: %s\n", sha1_to_hex(commit->object.sha1)); + + bitmap_set(tdata->base, bitmap_pos); + display_progress(tdata->prg, ++tdata->seen); +} + +void test_bitmap_walk(struct rev_info *revs) +{ + struct object *root; + struct bitmap *result = NULL; + khiter_t pos; + size_t result_popcnt; + struct bitmap_test_data tdata; + + if (prepare_bitmap_git()) + die("failed to load bitmap indexes"); + + if (revs->pending.nr != 1) + die("you must specify exactly one commit to test"); + + fprintf(stderr, "Bitmap v%d test (%d entries loaded)\n", + bitmap_git.version, bitmap_git.entry_count); + + root = revs->pending.objects[0].item; + pos = kh_get_sha1(bitmap_git.bitmaps, root->sha1); + + if (pos < kh_end(bitmap_git.bitmaps)) { + struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, pos); + struct ewah_bitmap *bm = lookup_stored_bitmap(st); + + fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n", + sha1_to_hex(root->sha1), (int)bm->bit_size, ewah_checksum(bm)); + + result = ewah_to_bitmap(bm); + } + + if (result == NULL) + die("Commit %s doesn't have an indexed bitmap", sha1_to_hex(root->sha1)); + + revs->tag_objects = 1; + revs->tree_objects = 1; + revs->blob_objects = 1; + + result_popcnt = bitmap_popcount(result); + + if (prepare_revision_walk(revs)) + die("revision walk setup failed"); + + tdata.base = bitmap_new(); + tdata.prg = start_progress("Verifying bitmap entries", result_popcnt); + tdata.seen = 0; + + traverse_commit_list(revs, &test_show_commit, &test_show_object, &tdata); + + stop_progress(&tdata.prg); + + if (bitmap_equals(result, tdata.base)) + fprintf(stderr, "OK!\n"); + else + fprintf(stderr, "Mismatch!\n"); +} + +static int rebuild_bitmap(uint32_t *reposition, + struct ewah_bitmap *source, + struct bitmap *dest) +{ + uint32_t pos = 0; + struct ewah_iterator it; + eword_t word; + + ewah_iterator_init(&it, source); + + while (ewah_iterator_next(&word, &it)) { + uint32_t offset, bit_pos; + + for (offset = 0; offset < BITS_IN_WORD; ++offset) { + if ((word >> offset) == 0) + break; + + offset += ewah_bit_ctz64(word >> offset); + + bit_pos = reposition[pos + offset]; + if (bit_pos > 0) + bitmap_set(dest, bit_pos - 1); + else /* can't reuse, we don't have the object */ + return -1; + } + + pos += BITS_IN_WORD; + } + return 0; +} + +int rebuild_existing_bitmaps(struct packing_data *mapping, + khash_sha1 *reused_bitmaps, + int show_progress) +{ + uint32_t i, num_objects; + uint32_t *reposition; + struct bitmap *rebuild; + struct stored_bitmap *stored; + struct progress *progress = NULL; + + khiter_t hash_pos; + int hash_ret; + + if (prepare_bitmap_git() < 0) + return -1; + + num_objects = bitmap_git.pack->num_objects; + reposition = xcalloc(num_objects, sizeof(uint32_t)); + + for (i = 0; i < num_objects; ++i) { + const unsigned char *sha1; + struct revindex_entry *entry; + struct object_entry *oe; + + entry = &bitmap_git.reverse_index->revindex[i]; + sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); + oe = packlist_find(mapping, sha1, NULL); + + if (oe) + reposition[i] = oe->in_pack_pos + 1; + } + + rebuild = bitmap_new(); + i = 0; + + if (show_progress) + progress = start_progress("Reusing bitmaps", 0); + + kh_foreach_value(bitmap_git.bitmaps, stored, { + if (stored->flags & BITMAP_FLAG_REUSE) { + if (!rebuild_bitmap(reposition, + lookup_stored_bitmap(stored), + rebuild)) { + hash_pos = kh_put_sha1(reused_bitmaps, + stored->sha1, + &hash_ret); + kh_value(reused_bitmaps, hash_pos) = + bitmap_to_ewah(rebuild); + } + bitmap_reset(rebuild); + display_progress(progress, ++i); + } + }); + + stop_progress(&progress); + + free(reposition); + bitmap_free(rebuild); + return 0; +} diff --git a/pack-bitmap.h b/pack-bitmap.h new file mode 100644 index 0000000000..8b7f4e9f0d --- /dev/null +++ b/pack-bitmap.h @@ -0,0 +1,64 @@ +#ifndef PACK_BITMAP_H +#define PACK_BITMAP_H + +#include "ewah/ewok.h" +#include "khash.h" +#include "pack-objects.h" + +struct bitmap_disk_entry { + uint32_t object_pos; + uint8_t xor_offset; + uint8_t flags; +} __attribute__((packed)); + +struct bitmap_disk_header { + char magic[4]; + uint16_t version; + uint16_t options; + uint32_t entry_count; + unsigned char checksum[20]; +}; + +static const char BITMAP_IDX_SIGNATURE[] = {'B', 'I', 'T', 'M'}; + +#define NEEDS_BITMAP (1u<<22) + +enum pack_bitmap_opts { + BITMAP_OPT_FULL_DAG = 1, + BITMAP_OPT_HASH_CACHE = 4, +}; + +enum pack_bitmap_flags { + BITMAP_FLAG_REUSE = 0x1 +}; + +typedef int (*show_reachable_fn)( + const unsigned char *sha1, + enum object_type type, + int flags, + uint32_t hash, + struct packed_git *found_pack, + off_t found_offset); + +int prepare_bitmap_git(void); +void count_bitmap_commit_list(uint32_t *commits, uint32_t *trees, uint32_t *blobs, uint32_t *tags); +void traverse_bitmap_commit_list(show_reachable_fn show_reachable); +void test_bitmap_walk(struct rev_info *revs); +char *pack_bitmap_filename(struct packed_git *p); +int prepare_bitmap_walk(struct rev_info *revs); +int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, uint32_t *entries, off_t *up_to); +int rebuild_existing_bitmaps(struct packing_data *mapping, khash_sha1 *reused_bitmaps, int show_progress); + +void bitmap_writer_show_progress(int show); +void bitmap_writer_set_checksum(unsigned char *sha1); +void bitmap_writer_build_type_index(struct pack_idx_entry **index, uint32_t index_nr); +void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack); +void bitmap_writer_select_commits(struct commit **indexed_commits, + unsigned int indexed_commits_nr, int max_bitmaps); +void bitmap_writer_build(struct packing_data *to_pack); +void bitmap_writer_finish(struct pack_idx_entry **index, + uint32_t index_nr, + const char *filename, + uint16_t options); + +#endif diff --git a/pack-objects.c b/pack-objects.c new file mode 100644 index 0000000000..d01d851ce9 --- /dev/null +++ b/pack-objects.c @@ -0,0 +1,111 @@ +#include "cache.h" +#include "object.h" +#include "pack.h" +#include "pack-objects.h" + +static uint32_t locate_object_entry_hash(struct packing_data *pdata, + const unsigned char *sha1, + int *found) +{ + uint32_t i, hash, mask = (pdata->index_size - 1); + + memcpy(&hash, sha1, sizeof(uint32_t)); + i = hash & mask; + + while (pdata->index[i] > 0) { + uint32_t pos = pdata->index[i] - 1; + + if (!hashcmp(sha1, pdata->objects[pos].idx.sha1)) { + *found = 1; + return i; + } + + i = (i + 1) & mask; + } + + *found = 0; + return i; +} + +static inline uint32_t closest_pow2(uint32_t v) +{ + v = v - 1; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + return v + 1; +} + +static void rehash_objects(struct packing_data *pdata) +{ + uint32_t i; + struct object_entry *entry; + + pdata->index_size = closest_pow2(pdata->nr_objects * 3); + if (pdata->index_size < 1024) + pdata->index_size = 1024; + + pdata->index = xrealloc(pdata->index, sizeof(uint32_t) * pdata->index_size); + memset(pdata->index, 0, sizeof(int) * pdata->index_size); + + entry = pdata->objects; + + for (i = 0; i < pdata->nr_objects; i++) { + int found; + uint32_t ix = locate_object_entry_hash(pdata, entry->idx.sha1, &found); + + if (found) + die("BUG: Duplicate object in hash"); + + pdata->index[ix] = i + 1; + entry++; + } +} + +struct object_entry *packlist_find(struct packing_data *pdata, + const unsigned char *sha1, + uint32_t *index_pos) +{ + uint32_t i; + int found; + + if (!pdata->index_size) + return NULL; + + i = locate_object_entry_hash(pdata, sha1, &found); + + if (index_pos) + *index_pos = i; + + if (!found) + return NULL; + + return &pdata->objects[pdata->index[i] - 1]; +} + +struct object_entry *packlist_alloc(struct packing_data *pdata, + const unsigned char *sha1, + uint32_t index_pos) +{ + struct object_entry *new_entry; + + if (pdata->nr_objects >= pdata->nr_alloc) { + pdata->nr_alloc = (pdata->nr_alloc + 1024) * 3 / 2; + pdata->objects = xrealloc(pdata->objects, + pdata->nr_alloc * sizeof(*new_entry)); + } + + new_entry = pdata->objects + pdata->nr_objects++; + + memset(new_entry, 0, sizeof(*new_entry)); + hashcpy(new_entry->idx.sha1, sha1); + + if (pdata->index_size * 3 <= pdata->nr_objects * 4) + rehash_objects(pdata); + else + pdata->index[index_pos] = pdata->nr_objects; + + return new_entry; +} diff --git a/pack-objects.h b/pack-objects.h new file mode 100644 index 0000000000..d1b98b30ff --- /dev/null +++ b/pack-objects.h @@ -0,0 +1,68 @@ +#ifndef PACK_OBJECTS_H +#define PACK_OBJECTS_H + +struct object_entry { + struct pack_idx_entry idx; + unsigned long size; /* uncompressed size */ + struct packed_git *in_pack; /* already in pack */ + off_t in_pack_offset; + struct object_entry *delta; /* delta base object */ + struct object_entry *delta_child; /* deltified objects who bases me */ + struct object_entry *delta_sibling; /* other deltified objects who + * uses the same base as me + */ + void *delta_data; /* cached delta (uncompressed) */ + unsigned long delta_size; /* delta data size (uncompressed) */ + unsigned long z_delta_size; /* delta data size (compressed) */ + enum object_type type; + enum object_type in_pack_type; /* could be delta */ + uint32_t hash; /* name hint hash */ + unsigned int in_pack_pos; + unsigned char in_pack_header_size; + unsigned preferred_base:1; /* + * we do not pack this, but is available + * to be used as the base object to delta + * objects against. + */ + unsigned no_try_delta:1; + unsigned tagged:1; /* near the very tip of refs */ + unsigned filled:1; /* assigned write-order */ +}; + +struct packing_data { + struct object_entry *objects; + uint32_t nr_objects, nr_alloc; + + int32_t *index; + uint32_t index_size; +}; + +struct object_entry *packlist_alloc(struct packing_data *pdata, + const unsigned char *sha1, + uint32_t index_pos); + +struct object_entry *packlist_find(struct packing_data *pdata, + const unsigned char *sha1, + uint32_t *index_pos); + +static inline uint32_t pack_name_hash(const char *name) +{ + uint32_t c, hash = 0; + + if (!name) + return 0; + + /* + * This effectively just creates a sortable number from the + * last sixteen non-whitespace characters. Last characters + * count "most", so things that end in ".c" sort together. + */ + while ((c = *name++) != 0) { + if (isspace(c)) + continue; + hash = (hash >> 2) + (c << 24); + } + return hash; +} + +#endif diff --git a/pack-revindex.c b/pack-revindex.c index b4d2b35bb3..5bd7c61980 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -16,11 +16,6 @@ * get the object sha1 from the main index. */ -struct pack_revindex { - struct packed_git *p; - struct revindex_entry *revindex; -}; - static struct pack_revindex *pack_revindex; static int pack_revindex_hashsz; @@ -201,15 +196,14 @@ static void create_pack_revindex(struct pack_revindex *rix) sort_revindex(rix->revindex, num_ent, p->pack_size); } -struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs) +struct pack_revindex *revindex_for_pack(struct packed_git *p) { int num; - unsigned lo, hi; struct pack_revindex *rix; - struct revindex_entry *revindex; if (!pack_revindex_hashsz) init_pack_revindex(); + num = pack_revindex_ix(p); if (num < 0) die("internal error: pack revindex fubar"); @@ -217,30 +211,37 @@ struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs) rix = &pack_revindex[num]; if (!rix->revindex) create_pack_revindex(rix); - revindex = rix->revindex; - lo = 0; - hi = p->num_objects + 1; + return rix; +} + +int find_revindex_position(struct pack_revindex *pridx, off_t ofs) +{ + int lo = 0; + int hi = pridx->p->num_objects + 1; + struct revindex_entry *revindex = pridx->revindex; + do { unsigned mi = lo + (hi - lo) / 2; if (revindex[mi].offset == ofs) { - return revindex + mi; + return mi; } else if (ofs < revindex[mi].offset) hi = mi; else lo = mi + 1; } while (lo < hi); + error("bad offset for revindex"); - return NULL; + return -1; } -void discard_revindex(void) +struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs) { - if (pack_revindex_hashsz) { - int i; - for (i = 0; i < pack_revindex_hashsz; i++) - free(pack_revindex[i].revindex); - free(pack_revindex); - pack_revindex_hashsz = 0; - } + struct pack_revindex *pridx = revindex_for_pack(p); + int pos = find_revindex_position(pridx, ofs); + + if (pos < 0) + return NULL; + + return pridx->revindex + pos; } diff --git a/pack-revindex.h b/pack-revindex.h index 8d5027ad91..d737f98965 100644 --- a/pack-revindex.h +++ b/pack-revindex.h @@ -6,7 +6,14 @@ struct revindex_entry { unsigned int nr; }; +struct pack_revindex { + struct packed_git *p; + struct revindex_entry *revindex; +}; + +struct pack_revindex *revindex_for_pack(struct packed_git *p); +int find_revindex_position(struct pack_revindex *pridx, off_t ofs); + struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs); -void discard_revindex(void); #endif diff --git a/pack-write.c b/pack-write.c index ca9e63be18..9b8308b759 100644 --- a/pack-write.c +++ b/pack-write.c @@ -44,14 +44,13 @@ static int need_large_offset(off_t offset, const struct pack_idx_option *opts) */ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *opts, - unsigned char *sha1) + const unsigned char *sha1) { struct sha1file *f; struct pack_idx_entry **sorted_by_sha, **list, **last; off_t last_obj_offset = 0; uint32_t array[256]; int i, fd; - git_SHA_CTX ctx; uint32_t index_version; if (nr_objects) { @@ -114,9 +113,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec } sha1write(f, array, 256 * 4); - /* compute the SHA1 hash of sorted object names. */ - git_SHA1_Init(&ctx); - /* * Write the actual SHA1 entries.. */ @@ -128,7 +124,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec sha1write(f, &offset, 4); } sha1write(f, obj->sha1, 20); - git_SHA1_Update(&ctx, obj->sha1, 20); if ((opts->flags & WRITE_IDX_STRICT) && (i && !hashcmp(list[-2]->sha1, obj->sha1))) die("The same object %s appears twice in the pack", @@ -178,7 +173,6 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec sha1write(f, sha1, 20); sha1close(f, NULL, ((opts->flags & WRITE_IDX_VERIFY) ? CSUM_CLOSE : CSUM_FSYNC)); - git_SHA1_Final(sha1, &ctx); return index_name; } @@ -189,8 +183,7 @@ off_t write_pack_header(struct sha1file *f, uint32_t nr_entries) hdr.hdr_signature = htonl(PACK_SIGNATURE); hdr.hdr_version = htonl(PACK_VERSION); hdr.hdr_entries = htonl(nr_entries); - if (sha1write(f, &hdr, sizeof(hdr))) - return 0; + sha1write(f, &hdr, sizeof(hdr)); return sizeof(hdr); } @@ -371,5 +364,7 @@ void finish_tmp_packfile(char *name_buffer, if (rename(idx_tmp_name, name_buffer)) die_errno("unable to rename temporary index file"); + *end_of_name_prefix = '\0'; + free((void *)idx_tmp_name); } @@ -76,7 +76,7 @@ struct pack_idx_entry { struct progress; typedef int (*verify_fn)(const unsigned char*, enum object_type, unsigned long, void*, int*); -extern const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, unsigned char *sha1); +extern const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, const unsigned char *sha1); extern int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr); extern int verify_pack_index(struct packed_git *); extern int verify_pack(struct packed_git *, verify_fn fn, struct progress *, uint32_t); @@ -80,8 +80,15 @@ void setup_pager(void) pager_process.use_shell = 1; pager_process.argv = pager_argv; pager_process.in = -1; - if (!getenv("LESS")) { - static const char *env[] = { "LESS=FRSX", NULL }; + if (!getenv("LESS") || !getenv("LV")) { + static const char *env[3]; + int i = 0; + + if (!getenv("LESS")) + env[i++] = "LESS=FRSX"; + if (!getenv("LV")) + env[i++] = "LV=-c"; + env[i] = NULL; pager_process.env = env; } if (start_command(&pager_process)) @@ -151,7 +158,7 @@ int decimal_width(int number) static int pager_command_config(const char *var, const char *value, void *data) { struct pager_config *c = data; - if (!prefixcmp(var, "pager.") && !strcmp(var + 6, c->cmd)) { + if (starts_with(var, "pager.") && !strcmp(var + 6, c->cmd)) { int b = git_config_maybe_bool(var, value); if (b >= 0) c->want = b; diff --git a/parse-options.c b/parse-options.c index 62e9b1cc68..7b8d3faa17 100644 --- a/parse-options.c +++ b/parse-options.c @@ -273,13 +273,13 @@ is_abbreviated: if (options->flags & PARSE_OPT_NONEG) continue; /* negated and abbreviated very much? */ - if (!prefixcmp("no-", arg)) { + if (starts_with("no-", arg)) { flags |= OPT_UNSET; goto is_abbreviated; } /* negated? */ - if (prefixcmp(arg, "no-")) { - if (!prefixcmp(long_name, "no-")) { + if (!starts_with(arg, "no-")) { + if (starts_with(long_name, "no-")) { long_name += 3; opt_flags |= OPT_UNSET; goto again; @@ -289,7 +289,7 @@ is_abbreviated: flags |= OPT_UNSET; rest = skip_prefix(arg + 3, long_name); /* abbreviated and negated? */ - if (!rest && !prefixcmp(long_name, arg + 3)) + if (!rest && starts_with(long_name, arg + 3)) goto is_abbreviated; if (!rest) continue; @@ -334,7 +334,7 @@ static void check_typos(const char *arg, const struct option *options) if (strlen(arg) < 3) return; - if (!prefixcmp(arg, "no-")) { + if (starts_with(arg, "no-")) { error ("did you mean `--%s` (with two dashes ?)", arg); exit(129); } @@ -342,7 +342,7 @@ static void check_typos(const char *arg, const struct option *options) for (; options->type != OPTION_END; options++) { if (!options->long_name) continue; - if (!prefixcmp(options->long_name, arg)) { + if (starts_with(options->long_name, arg)) { error ("did you mean `--%s` (with two dashes ?)", arg); exit(129); } diff --git a/parse-options.h b/parse-options.h index 8736006ed7..d670cb9669 100644 --- a/parse-options.h +++ b/parse-options.h @@ -161,9 +161,6 @@ struct option { N_("no-op (backward compatibility)"), \ PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb } -/* Deprecated synonym */ -#define OPT_BOOLEAN OPT_COUNTUP - /* parse_options() will filter out the processed options and leave the * non-option arguments in argv[]. usagestr strings should be marked * for translation with N_(). @@ -232,15 +229,15 @@ extern int parse_opt_tertiary(const struct option *, const char *, int); extern int parse_opt_string_list(const struct option *, const char *, int); extern int parse_opt_noop_cb(const struct option *, const char *, int); -#define OPT__VERBOSE(var, h) OPT_BOOLEAN('v', "verbose", (var), (h)) -#define OPT__QUIET(var, h) OPT_BOOLEAN('q', "quiet", (var), (h)) +#define OPT__VERBOSE(var, h) OPT_COUNTUP('v', "verbose", (var), (h)) +#define OPT__QUIET(var, h) OPT_COUNTUP('q', "quiet", (var), (h)) #define OPT__VERBOSITY(var) \ { OPTION_CALLBACK, 'v', "verbose", (var), NULL, N_("be more verbose"), \ PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \ { OPTION_CALLBACK, 'q', "quiet", (var), NULL, N_("be more quiet"), \ PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 } -#define OPT__DRY_RUN(var, h) OPT_BOOLEAN('n', "dry-run", (var), (h)) -#define OPT__FORCE(var, h) OPT_BOOLEAN('f', "force", (var), (h)) +#define OPT__DRY_RUN(var, h) OPT_BOOL('n', "dry-run", (var), (h)) +#define OPT__FORCE(var, h) OPT_COUNTUP('f', "force", (var), (h)) #define OPT__ABBREV(var) \ { OPTION_CALLBACK, 0, "abbrev", (var), N_("n"), \ N_("use <n> digits to display SHA-1s"), \ @@ -265,12 +265,12 @@ static struct passwd *getpw_str(const char *username, size_t len) char *expand_user_path(const char *path) { struct strbuf user_path = STRBUF_INIT; - const char *first_slash = strchrnul(path, '/'); const char *to_copy = path; if (path == NULL) goto return_null; if (path[0] == '~') { + const char *first_slash = strchrnul(path, '/'); const char *username = path + 1; size_t username_len = first_slash - username; if (username_len == 0) { @@ -434,6 +434,16 @@ int adjust_shared_perm(const char *path) return 0; } +static int have_same_root(const char *path1, const char *path2) +{ + int is_abs1, is_abs2; + + is_abs1 = is_absolute_path(path1); + is_abs2 = is_absolute_path(path2); + return (is_abs1 && is_abs2 && tolower(path1[0]) == tolower(path2[0])) || + (!is_abs1 && !is_abs2); +} + /* * Give path as relative to prefix. * @@ -454,6 +464,16 @@ const char *relative_path(const char *in, const char *prefix, else if (!prefix_len) return in; + if (have_same_root(in, prefix)) { + /* bypass dos_drive, for "c:" is identical to "C:" */ + if (has_dos_drive_prefix(in)) { + i = 2; + j = 2; + } + } else { + return in; + } + while (i < prefix_len && j < in_len && prefix[i] == in[j]) { if (is_dir_sep(prefix[i])) { while (is_dir_sep(prefix[i])) @@ -531,6 +551,51 @@ const char *relative_path(const char *in, const char *prefix, } /* + * A simpler implementation of relative_path + * + * Get relative path by removing "prefix" from "in". This function + * first appears in v1.5.6-1-g044bbbc, and makes git_dir shorter + * to increase performance when traversing the path to work_tree. + */ +const char *remove_leading_path(const char *in, const char *prefix) +{ + static char buf[PATH_MAX + 1]; + int i = 0, j = 0; + + if (!prefix || !prefix[0]) + return in; + while (prefix[i]) { + if (is_dir_sep(prefix[i])) { + if (!is_dir_sep(in[j])) + return in; + while (is_dir_sep(prefix[i])) + i++; + while (is_dir_sep(in[j])) + j++; + continue; + } else if (in[j] != prefix[i]) { + return in; + } + i++; + j++; + } + if ( + /* "/foo" is a prefix of "/foo" */ + in[j] && + /* "/foo" is not a prefix of "/foobar" */ + !is_dir_sep(prefix[i-1]) && !is_dir_sep(in[j]) + ) + return in; + while (is_dir_sep(in[j])) + j++; + if (!in[j]) + strcpy(buf, "."); + else + strcpy(buf, in + j); + return buf; +} + +/* * It is okay if dst == src, but they should not overlap otherwise. * * Performs the following normalizations on src, storing the result in dst: diff --git a/pathspec.c b/pathspec.c index ad1a9f5b28..8043099955 100644 --- a/pathspec.c +++ b/pathspec.c @@ -33,7 +33,7 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, return; for (i = 0; i < active_nr; i++) { const struct cache_entry *ce = active_cache[i]; - match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, seen); + ce_path_match(ce, pathspec, seen); } } @@ -71,8 +71,23 @@ static struct pathspec_magic { { PATHSPEC_LITERAL, 0, "literal" }, { PATHSPEC_GLOB, '\0', "glob" }, { PATHSPEC_ICASE, '\0', "icase" }, + { PATHSPEC_EXCLUDE, '!', "exclude" }, }; +static void prefix_short_magic(struct strbuf *sb, int prefixlen, + unsigned short_magic) +{ + int i; + strbuf_addstr(sb, ":("); + for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) + if (short_magic & pathspec_magic[i].bit) { + if (sb->buf[sb->len - 1] != '(') + strbuf_addch(sb, ','); + strbuf_addstr(sb, pathspec_magic[i].name); + } + strbuf_addf(sb, ",prefix:%d)", prefixlen); +} + /* * Take an element of a pathspec and check for magic signatures. * Append the result to the prefix. Return the magic bitmap. @@ -128,7 +143,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item, die(_("global 'literal' pathspec setting is incompatible " "with all other global pathspec settings")); - if (elt[0] != ':' || literal_global) { + if (flags & PATHSPEC_LITERAL_PATH) + global_magic = 0; + + if (elt[0] != ':' || literal_global || + (flags & PATHSPEC_LITERAL_PATH)) { ; /* nothing to do */ } else if (elt[1] == '(') { /* longhand */ @@ -150,7 +169,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, magic |= pathspec_magic[i].bit; break; } - if (!prefixcmp(copyfrom, "prefix:")) { + if (starts_with(copyfrom, "prefix:")) { char *endptr; pathspec_prefix = strtol(copyfrom + 7, &endptr, 10); @@ -193,11 +212,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item, magic |= short_magic; *p_short_magic = short_magic; - /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specifed */ + /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */ if (noglob_global && !(magic & PATHSPEC_GLOB)) global_magic |= PATHSPEC_LITERAL; - /* --glob-pathspec is overriden by :(literal) */ + /* --glob-pathspec is overridden by :(literal) */ if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL)) global_magic &= ~PATHSPEC_GLOB; @@ -228,22 +247,16 @@ static unsigned prefix_pathspec(struct pathspec_item *item, */ if (flags & PATHSPEC_PREFIX_ORIGIN) { struct strbuf sb = STRBUF_INIT; - const char *start = elt; if (prefixlen && !literal_global) { /* Preserve the actual prefix length of each pattern */ if (short_magic) - die("BUG: prefixing on short magic is not supported"); + prefix_short_magic(&sb, prefixlen, short_magic); else if (long_magic_end) { - strbuf_add(&sb, start, long_magic_end - start); - strbuf_addf(&sb, ",prefix:%d", prefixlen); - start = long_magic_end; - } else { - if (*start == ':') - start++; + strbuf_add(&sb, elt, long_magic_end - elt); + strbuf_addf(&sb, ",prefix:%d)", prefixlen); + } else strbuf_addf(&sb, ":(prefix:%d)", prefixlen); - } } - strbuf_add(&sb, start, copyfrom - start); strbuf_addstr(&sb, match); item->original = strbuf_detach(&sb, NULL); } else @@ -351,7 +364,7 @@ void parse_pathspec(struct pathspec *pathspec, { struct pathspec_item *item; const char *entry = argv ? *argv : NULL; - int i, n, prefixlen; + int i, n, prefixlen, nr_exclude = 0; memset(pathspec, 0, sizeof(*pathspec)); @@ -405,6 +418,11 @@ void parse_pathspec(struct pathspec *pathspec, item[i].magic = prefix_pathspec(item + i, &short_magic, argv + i, flags, prefix, prefixlen, entry); + if ((flags & PATHSPEC_LITERAL_PATH) && + !(magic_mask & PATHSPEC_LITERAL)) + item[i].magic |= PATHSPEC_LITERAL; + if (item[i].magic & PATHSPEC_EXCLUDE) + nr_exclude++; if (item[i].magic & magic_mask) unsupported_magic(entry, item[i].magic & magic_mask, @@ -420,6 +438,10 @@ void parse_pathspec(struct pathspec *pathspec, pathspec->magic |= item[i].magic; } + if (nr_exclude == n) + die(_("There is nothing to exclude from by :(exclude) patterns.\n" + "Perhaps you forgot to add either ':/' or '.' ?")); + if (pathspec->magic & PATHSPEC_MAXDEPTH) { if (flags & PATHSPEC_KEEP_ORDER) diff --git a/pathspec.h b/pathspec.h index 944baeb622..0c1126264a 100644 --- a/pathspec.h +++ b/pathspec.h @@ -7,12 +7,14 @@ #define PATHSPEC_LITERAL (1<<2) #define PATHSPEC_GLOB (1<<3) #define PATHSPEC_ICASE (1<<4) +#define PATHSPEC_EXCLUDE (1<<5) #define PATHSPEC_ALL_MAGIC \ (PATHSPEC_FROMTOP | \ PATHSPEC_MAXDEPTH | \ PATHSPEC_LITERAL | \ PATHSPEC_GLOB | \ - PATHSPEC_ICASE) + PATHSPEC_ICASE | \ + PATHSPEC_EXCLUDE) #define PATHSPEC_ONESTAR 1 /* the pathspec pattern satisfies GFNM_ONESTAR */ @@ -58,6 +60,13 @@ struct pathspec { #define PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE (1<<5) #define PATHSPEC_PREFIX_ORIGIN (1<<6) #define PATHSPEC_KEEP_ORDER (1<<7) +/* + * For the callers that just need pure paths from somewhere else, not + * from command line. Global --*-pathspecs options are ignored. No + * magic is parsed in each pathspec either. If PATHSPEC_LITERAL is + * allowed, then it will automatically set for every pathspec. + */ +#define PATHSPEC_LITERAL_PATH (1<<8) extern void parse_pathspec(struct pathspec *pathspec, unsigned magic_mask, diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 5273ee8867..6e804a271c 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -1599,6 +1599,7 @@ sub tie_for_persistent_memoization { my %lookup_svn_merge_cache; my %check_cherry_pick_cache; my %has_no_changes_cache; + my %_rev_list_cache; tie_for_persistent_memoization(\%lookup_svn_merge_cache, "$cache_path/lookup_svn_merge"); @@ -1620,6 +1621,14 @@ sub tie_for_persistent_memoization { SCALAR_CACHE => ['HASH' => \%has_no_changes_cache], LIST_CACHE => 'FAULT', ; + + tie_for_persistent_memoization(\%_rev_list_cache, + "$cache_path/_rev_list"); + memoize '_rev_list', + SCALAR_CACHE => 'FAULT', + LIST_CACHE => ['HASH' => \%_rev_list_cache], + ; + } sub unmemoize_svn_mergeinfo_functions { @@ -1629,6 +1638,7 @@ sub tie_for_persistent_memoization { Memoize::unmemoize 'lookup_svn_merge'; Memoize::unmemoize 'check_cherry_pick'; Memoize::unmemoize 'has_no_changes'; + Memoize::unmemoize '_rev_list'; } sub clear_memoized_mergeinfo_caches { @@ -1959,11 +1969,25 @@ sub rebuild_from_rev_db { unlink $path or croak "unlink: $!"; } +#define a global associate map to record rebuild status +my %rebuild_status; +#define a global associate map to record rebuild verify status +my %rebuild_verify_status; + sub rebuild { my ($self) = @_; my $map_path = $self->map_path; my $partial = (-e $map_path && ! -z $map_path); - return unless ::verify_ref($self->refname.'^0'); + my $verify_key = $self->refname.'^0'; + if (!$rebuild_verify_status{$verify_key}) { + my $verify_result = ::verify_ref($verify_key); + if ($verify_result) { + $rebuild_verify_status{$verify_key} = 1; + } + } + if (!$rebuild_verify_status{$verify_key}) { + return; + } if (!$partial && ($self->use_svm_props || $self->no_metadata)) { my $rev_db = $self->rev_db_path; $self->rebuild_from_rev_db($rev_db); @@ -1977,10 +2001,21 @@ sub rebuild { print "Rebuilding $map_path ...\n" if (!$partial); my ($base_rev, $head) = ($partial ? $self->rev_map_max_norebuild(1) : (undef, undef)); + my $key_value = ($head ? "$head.." : "") . $self->refname; + if (exists $rebuild_status{$key_value}) { + print "Done rebuilding $map_path\n" if (!$partial || !$head); + my $rev_db_path = $self->rev_db_path; + if (-f $self->rev_db_path) { + unlink $self->rev_db_path or croak "unlink: $!"; + } + $self->unlink_rev_db_symlink; + return; + } my ($log, $ctx) = - command_output_pipe(qw/rev-list --pretty=raw --reverse/, - ($head ? "$head.." : "") . $self->refname, + command_output_pipe(qw/rev-list --pretty=raw --reverse/, + $key_value, '--'); + $rebuild_status{$key_value} = 1; my $metadata_url = $self->metadata_url; remove_username($metadata_url); my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid; diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm index b3bcd476da..34e8af966c 100644 --- a/perl/Git/SVN/Editor.pm +++ b/perl/Git/SVN/Editor.pm @@ -304,8 +304,12 @@ sub C { my ($self, $m, $deletions) = @_; my ($dir, $file) = split_path($m->{file_b}); my $pbat = $self->ensure_path($dir, $deletions); + # workaround for a bug in svn serf backend (v1.8.5 and below): + # store third argument to ->add_file() in a local variable, to make it + # have the same lifetime as $fbat + my $upa = $self->url_path($m->{file_a}); my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat, - $self->url_path($m->{file_a}), $self->{r}); + $upa, $self->{r}); print "\tC\t$m->{file_a} => $m->{file_b}\n" unless $::_q; $self->chg_file($fbat, $m); $self->close_file($fbat,undef,$self->{pool}); @@ -323,8 +327,10 @@ sub R { my ($self, $m, $deletions) = @_; my ($dir, $file) = split_path($m->{file_b}); my $pbat = $self->ensure_path($dir, $deletions); + # workaround for a bug in svn serf backend, see comment in C() above + my $upa = $self->url_path($m->{file_a}); my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat, - $self->url_path($m->{file_a}), $self->{r}); + $upa, $self->{r}); print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q; $self->apply_autoprops($file, $fbat); $self->chg_file($fbat, $m); diff --git a/perl/Git/SVN/Log.pm b/perl/Git/SVN/Log.pm index 3f8350a57d..34f2869ab5 100644 --- a/perl/Git/SVN/Log.pm +++ b/perl/Git/SVN/Log.pm @@ -117,6 +117,7 @@ sub run_pager { } open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!"; $ENV{LESS} ||= 'FRSX'; + $ENV{LV} ||= '-c'; exec $pager or fatal "Can't run pager: $! ($pager)"; } diff --git a/pkt-line.c b/pkt-line.c index 70f19501d0..bc63b3b80e 100644 --- a/pkt-line.c +++ b/pkt-line.c @@ -24,8 +24,8 @@ static void packet_trace(const char *buf, unsigned int len, int write) strbuf_addf(&out, "packet: %12s%c ", packet_trace_prefix, write ? '>' : '<'); - if ((len >= 4 && !prefixcmp(buf, "PACK")) || - (len >= 5 && !prefixcmp(buf+1, "PACK"))) { + if ((len >= 4 && starts_with(buf, "PACK")) || + (len >= 5 && starts_with(buf+1, "PACK"))) { strbuf_addstr(&out, "PACK ..."); unsetenv(trace_key); } @@ -1,14 +1,14 @@ Core Git translation language teams (please keep the list sorted alphabetically on language field) -Language: da (Danish) -Repository: https://github.com/git-da/git-po/ -Leader: Byrial Jensen <byrial@vip.cybercity.dk> +Language: bg (Bulgarian) +Repository: https://github.com/git-l10n/git-po +Leader: Alexander Shopov <ash@kambanaria.org> Language: de (German) Repository: https://github.com/ralfth/git-po-de Leader: Ralf Thielow <ralf.thielow@googlemail.com> -Members: Thomas Rast <trast@student.ethz.ch> +Members: Thomas Rast <tr@thomasrast.ch> Jan Krüger <jk@jk.gs> Christian Stimming <stimming@tuhh.de> @@ -25,10 +25,6 @@ Repository: https://github.com/quizzlo/git-po-it/ Leader: Marco Paolone <marcopaolone AT gmail.com> Members: Stefano Lattarini <stefano.lattarini AT gmail.com> -Language: nl (Dutch) -Repository: https://github.com/vfr-nl/git-po/ -Leader: Vincent van Ravesteijn <vfr@lyx.org> - Language: pt_PT (Portuguese - Portugal) Repository: https://github.com/marcomsousa/git-l10n-pt_PT/ Leader: Marco Sousa <marcomsousa AT gmail.com> diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000000..fb450b2414 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,10404 @@ +# Bulgarian translation of git po-file. +# Copyright (C) 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2014. +# +# ======================== +# DICTIONARY TO MERGE IN GIT GUI +# ------------------------ +# range интервал +# unreachable object недоÑтижим обект +# dangling objects обект извън клон +# fast-forward тривиално Ñливане +# stale remote Ñтаро хранилище +# rebase пребазирам +# force (push) принудително изтлаÑквам +# stash/index Ð¸Ð½Ð´ÐµÐºÑ +# ======================== +# RECHECK +# ------------------------ +# HEAD as a reference vs head of a branch +# +# ======================== +# GENERATE STATS +# ------------------------ +# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT +# sort -u OUT > UNIQUE +# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS +# ======================== +# DONE strings +# ------------------------ +# 222 +# ======================== +# REMAINING strings +# ------------------------ +# 1988 +# ======================== +# DONE alphabetical ordering +# ------------------------ +# +# advice, fsck, gc, help, parse-options, reflog, remote, rm, run-command +# +# ======================== +# REMAINING alphabetical ordering +# ------------------------ +# +# add, apply, archive, attr, bisect--helper, blame, branch, bundle, cat-file, check-attr, check-ignore, check-mailmap, +# checkout, checkout-index, clean, clone, column, commit, common-cmds, config, connected, count-objects, date, describe, +# diff, diffcore-order, fast-export, fetch, fmt-merge-msg, for-each-ref, git, git-am, git-bisect, git-pull, git-rebase, +# git-stash, git-submodule, gpg-interface, grep, hash-object, index-pack, init-db, log, ls-files, ls-tree, merge, +# merge-base, merge-file, merge-recursive, mktree, mv, name-rev, notes, notes-utils, object, obstack, pack-objects, +# pack-refs, pathspec, precompose_utf8, prune, prune-packed, push, read-tree, repack, replace, rerere, reset, revert, +# rev-parse, sequencer, sha1_name, shortlog, show-branch, show-ref, submodule, symbolic-ref, tag, update-index, +# update-ref, update-server-info, urlmatch, verify-pack, verify-tag, wrapper, write-tree, wt-status +# +# +# ======================== +# MOST IMPORTANT strings ordering +# ------------------------ +# 144 [remote] 68 fetch 28 blame 16 [parse-options] +# 137 commit 64 grep 27 git-rebase 12 [gc] +# 115 branch 46 push 24 revert 12 [fsck] +# 102 wt-status 38 add 21 common-cmds 3 reflog +# 78 checkout 34 config 21 [rm] +# 77 log 33 reset 21 mv +# 69 clone 29 git-stash 13 diff +# +# ======================== +# WHOLE STATISTICS strings ordering +# ------------------------ +# 144 remote 54 git-submodule 27 ls-files 12 pathspec 8 replace 3 prune-packed +# 137 commit 48 push 27 git-rebase 12 name-rev 8 git-pull 3 pack-refs +# 115 branch 41 help 24 revert 12 gc 8 fmt-merge-msg 3 count-objects +# 111 apply 40 pack-objects 24 mv 12 fsck 7 symbolic-ref 3 connected +# 102 wt-status 39 init-db 21 rm 12 checkout-index 6 gpg-interface 3 bisect--helper +# 100 notes 38 add 21 common-cmds 11 date 6 check-attr 2 verify-tag +# 97 merge 35 archive 19 show-branch 11 column 5 write-tree 2 update-server-info +# 78 checkout 34 config 19 read-tree 10 urlmatch 5 sha1_name 2 run-command +# 77 log 33 reset 19 bundle 10 shortlog 5 rev-parse 2 rerere +# 69 clone 32 clean 17 repack 10 merge-file 5 prune 2 obstack +# 68 index-pack 30 git-am 16 parse-options 10 merge-base 4 wrapper 2 advice +# 68 fetch 30 describe 14 submodule 10 ls-tree 4 notes-utils 1 precompose_utf8 +# 64 grep 29 git-stash 14 show-ref 10 hash-object 4 mktree 1 object +# 58 tag 29 git-bisect 14 fast-export 10 for-each-ref 4 check-mailmap 1 git +# 56 sequencer 28 update-index 13 diff 10 cat-file 3 verify-pack 1 diffcore-order +# 55 merge-recursive 28 blame 13 check-ignore 9 update-ref 3 reflog 1 attr +msgid "" +msgstr "" +"Project-Id-Version: git master\n" +"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" +"POT-Creation-Date: 2014-01-18 07:42+0800\n" +"PO-Revision-Date: 2014-01-28 19:05+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: advice.c:57 +#, c-format +msgid "hint: %.*s\n" +msgstr "ПодÑказка: %.*s\n" + +#. +#. * Message used both when 'git commit' fails and when +#. * other commands doing a merge do. +#. +#: advice.c:87 +msgid "" +"Fix them up in the work tree,\n" +"and then use 'git add/rm <file>' as\n" +"appropriate to mark resolution and make a commit,\n" +"or use 'git commit -a'." +msgstr "" +"Редактирайте ги в работното дърво,\n" +"и тогава ползвайте „git add/rm <file>“,\n" +"за да отбележите коригирането им и ги\n" +"подадете или проÑто ползвайте „git commit -a“." + +#: 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:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "пътÑÑ‚ „%s“ не Ñъвпада Ñ Ð½Ð¸ÐºÐ¾Ð¹ файл" + +#: archive.c:327 +msgid "fmt" +msgstr "" + +#: archive.c:327 +msgid "archive format" +msgstr "" + +#: archive.c:328 builtin/log.c:1193 +msgid "prefix" +msgstr "" + +#: archive.c:329 +msgid "prepend prefix to each pathname in the archive" +msgstr "" + +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 +msgid "file" +msgstr "файл" + +#: archive.c:331 builtin/archive.c:89 +msgid "write the archive to this file" +msgstr "" + +#: archive.c:333 +msgid "read .gitattributes in working directory" +msgstr "" + +#: archive.c:334 +msgid "report archived files on stderr" +msgstr "" + +#: archive.c:335 +msgid "store only" +msgstr "" + +#: archive.c:336 +msgid "compress faster" +msgstr "" + +#: archive.c:344 +msgid "compress better" +msgstr "" + +#: archive.c:347 +msgid "list supported archive formats" +msgstr "" + +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 +msgid "repo" +msgstr "" + +#: archive.c:350 builtin/archive.c:91 +msgid "retrieve the archive from remote repository <repo>" +msgstr "" + +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 +msgid "command" +msgstr "" + +#: archive.c:352 builtin/archive.c:93 +msgid "path to the remote git-upload-archive command" +msgstr "" + +#: attr.c:259 +msgid "" +"Negative patterns are ignored in git attributes\n" +"Use '\\!' for literal leading exclamation." +msgstr "" + +#: branch.c:60 +#, c-format +msgid "Not setting branch %s as its own upstream." +msgstr "" + +#: branch.c:82 +#, c-format +msgid "Branch %s set up to track remote branch %s from %s by rebasing." +msgstr "" + +#: branch.c:83 +#, c-format +msgid "Branch %s set up to track remote branch %s from %s." +msgstr "" + +#: branch.c:87 +#, c-format +msgid "Branch %s set up to track local branch %s by rebasing." +msgstr "" + +#: branch.c:88 +#, c-format +msgid "Branch %s set up to track local branch %s." +msgstr "" + +#: branch.c:92 +#, c-format +msgid "Branch %s set up to track remote ref %s by rebasing." +msgstr "" + +#: branch.c:93 +#, c-format +msgid "Branch %s set up to track remote ref %s." +msgstr "" + +#: branch.c:97 +#, c-format +msgid "Branch %s set up to track local ref %s by rebasing." +msgstr "" + +#: branch.c:98 +#, c-format +msgid "Branch %s set up to track local ref %s." +msgstr "" + +#: branch.c:118 +#, c-format +msgid "Tracking not set up: name too long: %s" +msgstr "" + +#: branch.c:137 +#, c-format +msgid "Not tracking: ambiguous information for ref %s" +msgstr "" + +#: branch.c:182 +#, c-format +msgid "'%s' is not a valid branch name." +msgstr "" + +#: branch.c:187 +#, c-format +msgid "A branch named '%s' already exists." +msgstr "" + +#: branch.c:195 +msgid "Cannot force update the current branch." +msgstr "" + +#: branch.c:215 +#, c-format +msgid "Cannot setup tracking information; starting point '%s' is not a branch." +msgstr "" + +#: branch.c:217 +#, c-format +msgid "the requested upstream branch '%s' does not exist" +msgstr "" + +#: branch.c:219 +msgid "" +"\n" +"If you are planning on basing your work on an upstream\n" +"branch that already exists at the remote, you may need to\n" +"run \"git fetch\" to retrieve it.\n" +"\n" +"If you are planning to push out a new local branch that\n" +"will track its remote counterpart, you may want to use\n" +"\"git push -u\" to set the upstream config as you push." +msgstr "" + +#: branch.c:264 +#, c-format +msgid "Not a valid object name: '%s'." +msgstr "" + +#: branch.c:284 +#, c-format +msgid "Ambiguous object name: '%s'." +msgstr "" + +#: branch.c:289 +#, c-format +msgid "Not a valid branch point: '%s'." +msgstr "" + +#: branch.c:295 +msgid "Failed to lock ref for update" +msgstr "" + +#: branch.c:313 +msgid "Failed to write ref" +msgstr "" + +#: bundle.c:37 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "" + +#: bundle.c:64 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "" + +#: bundle.c:90 builtin/commit.c:706 +#, c-format +msgid "could not open '%s'" +msgstr "" + +#: bundle.c:141 +msgid "Repository lacks these prerequisite commits:" +msgstr "" + +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 +msgid "revision walk setup failed" +msgstr "" + +#: bundle.c:187 +#, c-format +msgid "The bundle contains this ref:" +msgid_plural "The bundle contains these %d refs:" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:194 +msgid "The bundle records a complete history." +msgstr "" + +#: bundle.c:196 +#, c-format +msgid "The bundle requires this ref:" +msgid_plural "The bundle requires these %d refs:" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:296 +msgid "rev-list died" +msgstr "" + +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 +#, c-format +msgid "unrecognized argument: %s" +msgstr "" + +#: bundle.c:337 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "" + +#: bundle.c:382 +msgid "Refusing to create empty bundle." +msgstr "" + +#: bundle.c:398 +msgid "Could not spawn pack-objects" +msgstr "" + +#: bundle.c:416 +msgid "pack-objects died" +msgstr "" + +#: bundle.c:419 +#, c-format +msgid "cannot create '%s'" +msgstr "" + +#: bundle.c:441 +msgid "index-pack died" +msgstr "" + +#: commit.c:53 +#, c-format +msgid "could not parse %s" +msgstr "" + +#: commit.c:55 +#, c-format +msgid "%s %s is not a commit!" +msgstr "" + +#: compat/obstack.c:406 compat/obstack.c:408 +msgid "memory exhausted" +msgstr "" + +#: connected.c:70 +msgid "Could not run 'git rev-list'" +msgstr "" + +#: connected.c:90 +#, c-format +msgid "failed write to rev-list: %s" +msgstr "" + +#: connected.c:98 +#, c-format +msgid "failed to close rev-list's stdin: %s" +msgstr "" + +#: date.c:95 +msgid "in the future" +msgstr "" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "" +msgstr[1] "" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "" +msgstr[1] "" + +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "" + +#: diff.c:113 +#, c-format +msgid " Failed to parse dirstat cut-off percentage '%s'\n" +msgstr "" + +#: diff.c:118 +#, c-format +msgid " Unknown dirstat parameter '%s'\n" +msgstr "" + +#: diff.c:213 +#, c-format +msgid "Unknown value for 'diff.submodule' config variable: '%s'" +msgstr "" + +#: diff.c:263 +#, c-format +msgid "" +"Found errors in 'diff.dirstat' config variable:\n" +"%s" +msgstr "" + +#: diff.c:3509 +#, c-format +msgid "" +"Failed to parse --dirstat/-X option parameter:\n" +"%s" +msgstr "" + +#: diff.c:3523 +#, c-format +msgid "Failed to parse --submodule option parameter: '%s'" +msgstr "" + +#: gpg-interface.c:59 gpg-interface.c:131 +msgid "could not run gpg." +msgstr "" + +#: gpg-interface.c:71 +msgid "gpg did not accept the data" +msgstr "" + +#: gpg-interface.c:82 +msgid "gpg failed to sign the data" +msgstr "" + +#: gpg-interface.c:115 +#, c-format +msgid "could not create temporary file '%s': %s" +msgstr "" + +#: gpg-interface.c:118 +#, c-format +msgid "failed writing detached signature to '%s': %s" +msgstr "" + +#: grep.c:1695 +#, c-format +msgid "'%s': unable to read %s" +msgstr "" + +#: grep.c:1712 +#, c-format +msgid "'%s': %s" +msgstr "" + +#: grep.c:1723 +#, c-format +msgid "'%s': short read %s" +msgstr "" + +#: help.c:210 +#, c-format +msgid "available git commands in '%s'" +msgstr "налични команди на git от „%s“" + +#: help.c:217 +msgid "git commands available from elsewhere on your $PATH" +msgstr "команди на git от други директории от Ð¿ÑŠÑ‚Ñ â€ž$PATH“" + +#: help.c:233 +msgid "The most commonly used git commands are:" +msgstr "Ðай-чеÑто употребÑваните команди на git Ñа:" + +#: help.c:290 +#, c-format +msgid "" +"'%s' appears to be a git command, but we were not\n" +"able to execute it. Maybe git-%s is broken?" +msgstr "" +"Изглежда, че „%s“ е команда на git, но Ñ‚Ñ Ð½Ðµ може да\n" +"бъде изпълнена. ВероÑтно пакетът „git-%s“ е повреден." + +#: help.c:347 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "Странно, изглежда, че на ÑиÑтемата ви нÑма нито една команда на git." + +#: help.c:369 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" +"ПРЕДУПРЕЖДЕÐИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава " +"не\n" +"ÑъщеÑтвува. Изпълнението автоматично продължава, като Ñе Ñчита, че имате " +"предвид „%s“" + +#: help.c:374 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "Ñлед %0.1f Ñекунди…" + +#: help.c:381 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git: „%s“ не е команда на git. Вижте изхода от „git --help“." + +#: help.c:385 help.c:444 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +"\n" +"Команда Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ име е:" +msgstr[1] "" +"\n" +"Команди Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ име Ñа:" + +#: help.c:440 +#, c-format +msgid "%s: %s - %s" +msgstr "%s: %s — %s" + +#: merge.c:56 +msgid "failed to read the cache" +msgstr "" + +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 +msgid "unable to write new index file" +msgstr "" + +#: merge-recursive.c:190 +#, c-format +msgid "(bad commit)\n" +msgstr "" + +#: merge-recursive.c:206 +#, c-format +msgid "addinfo_cache failed for path '%s'" +msgstr "" + +#: merge-recursive.c:269 +msgid "error building trees" +msgstr "" + +#: merge-recursive.c:673 +#, c-format +msgid "failed to create path '%s'%s" +msgstr "" + +#: merge-recursive.c:684 +#, 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:698 merge-recursive.c:719 +msgid ": perhaps a D/F conflict?" +msgstr "" + +#: merge-recursive.c:709 +#, c-format +msgid "refusing to lose untracked file at '%s'" +msgstr "" + +#: merge-recursive.c:749 +#, c-format +msgid "cannot read object %s '%s'" +msgstr "" + +#: merge-recursive.c:751 +#, c-format +msgid "blob expected for %s '%s'" +msgstr "" + +#: merge-recursive.c:774 builtin/clone.c:317 +#, c-format +msgid "failed to open '%s'" +msgstr "" + +#: merge-recursive.c:782 +#, c-format +msgid "failed to symlink '%s'" +msgstr "" + +#: merge-recursive.c:785 +#, c-format +msgid "do not know what to do with %06o %s '%s'" +msgstr "" + +#: merge-recursive.c:923 +msgid "Failed to execute internal merge" +msgstr "" + +#: merge-recursive.c:927 +#, c-format +msgid "Unable to add %s to database" +msgstr "" + +#: merge-recursive.c:943 +msgid "unsupported object type in the tree" +msgstr "" + +#: merge-recursive.c:1022 merge-recursive.c:1036 +#, 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:1028 merge-recursive.c:1041 +#, 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:1082 +msgid "rename" +msgstr "" + +#: merge-recursive.c:1082 wt-status.c:283 +msgid "renamed" +msgstr "" + +#: merge-recursive.c:1138 +#, c-format +msgid "%s is a directory in %s adding as %s instead" +msgstr "" + +#: merge-recursive.c:1160 +#, c-format +msgid "" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" +"\"->\"%s\" in \"%s\"%s" +msgstr "" + +#: merge-recursive.c:1165 +msgid " (left unresolved)" +msgstr "" + +#: merge-recursive.c:1219 +#, c-format +msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" +msgstr "" + +#: merge-recursive.c:1249 +#, c-format +msgid "Renaming %s to %s and %s to %s instead" +msgstr "" + +#: merge-recursive.c:1448 +#, c-format +msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" +msgstr "" + +#: merge-recursive.c:1458 +#, c-format +msgid "Adding merged %s" +msgstr "" + +#: merge-recursive.c:1463 merge-recursive.c:1661 +#, c-format +msgid "Adding as %s instead" +msgstr "" + +#: merge-recursive.c:1514 +#, c-format +msgid "cannot read object %s" +msgstr "" + +#: merge-recursive.c:1517 +#, c-format +msgid "object %s is not a blob" +msgstr "" + +#: merge-recursive.c:1565 +msgid "modify" +msgstr "" + +#: merge-recursive.c:1565 wt-status.c:281 +msgid "modified" +msgstr "" + +#: merge-recursive.c:1575 +msgid "content" +msgstr "" + +#: merge-recursive.c:1582 +msgid "add/add" +msgstr "" + +#: merge-recursive.c:1616 +#, c-format +msgid "Skipped %s (merged same as existing)" +msgstr "" + +#: merge-recursive.c:1630 +#, c-format +msgid "Auto-merging %s" +msgstr "" + +#: merge-recursive.c:1634 git-submodule.sh:1148 +msgid "submodule" +msgstr "" + +#: merge-recursive.c:1635 +#, c-format +msgid "CONFLICT (%s): Merge conflict in %s" +msgstr "" + +#: merge-recursive.c:1725 +#, c-format +msgid "Removing %s" +msgstr "" + +#: merge-recursive.c:1750 +msgid "file/directory" +msgstr "" + +#: merge-recursive.c:1756 +msgid "directory/file" +msgstr "" + +#: merge-recursive.c:1761 +#, c-format +msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" +msgstr "" + +#: merge-recursive.c:1771 +#, c-format +msgid "Adding %s" +msgstr "" + +#: merge-recursive.c:1788 +msgid "Fatal merge failure, shouldn't happen." +msgstr "" + +#: merge-recursive.c:1807 +msgid "Already up-to-date!" +msgstr "" + +#: merge-recursive.c:1816 +#, c-format +msgid "merging of trees %s and %s failed" +msgstr "" + +#: merge-recursive.c:1846 +#, c-format +msgid "Unprocessed path??? %s" +msgstr "" + +#: merge-recursive.c:1891 +msgid "Merging:" +msgstr "" + +#: merge-recursive.c:1904 +#, c-format +msgid "found %u common ancestor:" +msgid_plural "found %u common ancestors:" +msgstr[0] "" +msgstr[1] "" + +#: merge-recursive.c:1941 +msgid "merge returned no commit" +msgstr "" + +#: merge-recursive.c:1998 +#, c-format +msgid "Could not parse object '%s'" +msgstr "" + +#: merge-recursive.c:2010 builtin/merge.c:665 +msgid "Unable to write index." +msgstr "" + +#: notes-utils.c:40 +msgid "Cannot commit uninitialized/unreferenced notes tree" +msgstr "" + +#: notes-utils.c:81 +#, c-format +msgid "Bad notes.rewriteMode value: '%s'" +msgstr "" + +#: notes-utils.c:91 +#, 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 +#: notes-utils.c:118 +#, c-format +msgid "Bad %s value: '%s'" +msgstr "" + +#: object.c:202 +#, c-format +msgid "unable to parse object: %s" +msgstr "" + +#: parse-options.c:537 +msgid "..." +msgstr "…" + +#: parse-options.c:555 +#, c-format +msgid "usage: %s" +msgstr "употреба: %s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:559 +#, c-format +msgid " or: %s" +msgstr " или: %s" + +#: parse-options.c:562 +#, c-format +msgid " %s" +msgstr " %s" + +#: parse-options.c:596 +msgid "-NUM" +msgstr "-ЧИСЛО" + +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "" + +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "Ðевъзможно е да Ñе доÑтавÑÑ‚ едновременно и „%s“, и „%s“ към „%s“" + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "„%s“ обикновено Ñледи „%s“, а не „%s“" + +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "„%s“ Ñледи както „%s“, така и „%s“" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "Вътрешна грешка" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "Този клон Ñледи „%s“, но ÑледениÑÑ‚ клон е изтрит.\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (за да коригирате това използвайте „git branch --unset-upstream“)\n" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "Клонът е актуализиран както „%s“.\n" + +#: remote.c:1882 +#, 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] "Клонът ви е Ñ %2$d подаване пред „%1$s“.\n" +msgstr[1] "Клонът ви е Ñ %2$d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´ „%1$s“.\n" + +#: remote.c:1888 +msgid " (use \"git push\" to publish your local commits)\n" +msgstr " (публикувайте локалните Ñи промени чрез „git push“)\n" + +#: remote.c:1891 +#, 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] "" +"Клонът ви е Ñ %2$d подаване Ñлед „%1$s“ и може да бъде тривиално ÑлÑÑ‚.\n" +msgstr[1] "" +"Клонът ви е Ñ %2$d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñлед „%1$s“ и може да бъде тривиално ÑлÑÑ‚.\n" + +#: remote.c:1899 +msgid " (use \"git pull\" to update your local branch)\n" +msgstr " (обновете Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ñи клон чрез „git pull“)\n" + +#: remote.c:1902 +#, c-format +msgid "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commit each, respectively.\n" +msgid_plural "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commits each, respectively.\n" +msgstr[0] "" +"ТекущиÑÑ‚ клон Ñе е отделил от „%s“,\n" +"двата имат Ñъответно по %d и %d неÑъвпадащи подаваниÑ.\n" +msgstr[1] "" +"ТекущиÑÑ‚ клон Ñе е отделил от „%s“,\n" +"двата имат Ñъответно по %d и %d неÑъвпадащи подаваниÑ.\n" + +#: remote.c:1912 +msgid " (use \"git pull\" to merge the remote branch into yours)\n" +msgstr " (Ñлейте Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ в Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ñ‡Ñ€ÐµÐ· „git pull“)\n" + +#: run-command.c:80 +msgid "open /dev/null failed" +msgstr "неуÑпешно отварÑне на „/dev/null“" + +#: run-command.c:82 +#, c-format +msgid "dup2(%d,%d) failed" +msgstr "неуÑпешно изпълнение на dup2(%d,%d)" + +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 +#, c-format +msgid "Could not open '%s' for writing" +msgstr "" + +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 +#, c-format +msgid "Could not write to '%s'" +msgstr "" + +#: sequencer.c:229 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'" +msgstr "" + +#: sequencer.c:232 +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:245 sequencer.c:870 sequencer.c:953 +#, c-format +msgid "Could not write to %s" +msgstr "" + +#: sequencer.c:248 +#, c-format +msgid "Error wrapping up %s" +msgstr "" + +#: sequencer.c:263 +msgid "Your local changes would be overwritten by cherry-pick." +msgstr "" + +#: sequencer.c:265 +msgid "Your local changes would be overwritten by revert." +msgstr "" + +#: sequencer.c:268 +msgid "Commit your changes or stash them to proceed." +msgstr "" + +#. TRANSLATORS: %s will be "revert" or "cherry-pick" +#: sequencer.c:325 +#, c-format +msgid "%s: Unable to write new index file" +msgstr "" + +#: sequencer.c:356 +msgid "Could not resolve HEAD commit\n" +msgstr "" + +#: sequencer.c:378 +msgid "Unable to update cache tree\n" +msgstr "" + +#: sequencer.c:423 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "" + +#: sequencer.c:428 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "" + +#: sequencer.c:494 +msgid "Your index file is unmerged." +msgstr "" + +#: sequencer.c:513 +#, c-format +msgid "Commit %s is a merge but no -m option was given." +msgstr "" + +#: sequencer.c:521 +#, c-format +msgid "Commit %s does not have parent %d" +msgstr "" + +#: sequencer.c:525 +#, 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:538 +#, c-format +msgid "%s: cannot parse parent commit %s" +msgstr "" + +#: sequencer.c:542 +#, c-format +msgid "Cannot get commit message for %s" +msgstr "" + +#: sequencer.c:628 +#, c-format +msgid "could not revert %s... %s" +msgstr "" + +#: sequencer.c:629 +#, c-format +msgid "could not apply %s... %s" +msgstr "" + +#: sequencer.c:665 +msgid "empty commit set passed" +msgstr "" + +#: sequencer.c:673 +#, c-format +msgid "git %s: failed to read the index" +msgstr "" + +#: sequencer.c:678 +#, c-format +msgid "git %s: failed to refresh the index" +msgstr "" + +#: sequencer.c:736 +#, c-format +msgid "Cannot %s during a %s" +msgstr "" + +#: sequencer.c:758 +#, c-format +msgid "Could not parse line %d." +msgstr "" + +#: sequencer.c:763 +msgid "No commits parsed." +msgstr "" + +#: sequencer.c:776 +#, c-format +msgid "Could not open %s" +msgstr "" + +#: sequencer.c:780 +#, c-format +msgid "Could not read %s." +msgstr "" + +#: sequencer.c:787 +#, c-format +msgid "Unusable instruction sheet: %s" +msgstr "" + +#: sequencer.c:815 +#, c-format +msgid "Invalid key: %s" +msgstr "" + +#: sequencer.c:818 +#, c-format +msgid "Invalid value for %s: %s" +msgstr "" + +#: sequencer.c:830 +#, c-format +msgid "Malformed options sheet: %s" +msgstr "" + +#: sequencer.c:851 +msgid "a cherry-pick or revert is already in progress" +msgstr "" + +#: sequencer.c:852 +msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" +msgstr "" + +#: sequencer.c:856 +#, c-format +msgid "Could not create sequencer directory %s" +msgstr "" + +#: sequencer.c:872 sequencer.c:957 +#, c-format +msgid "Error wrapping up %s." +msgstr "" + +#: sequencer.c:891 sequencer.c:1025 +msgid "no cherry-pick or revert in progress" +msgstr "" + +#: sequencer.c:893 +msgid "cannot resolve HEAD" +msgstr "" + +#: sequencer.c:895 +msgid "cannot abort from a branch yet to be born" +msgstr "" + +#: sequencer.c:917 builtin/apply.c:4061 +#, c-format +msgid "cannot open %s: %s" +msgstr "" + +#: sequencer.c:920 +#, c-format +msgid "cannot read %s: %s" +msgstr "" + +#: sequencer.c:921 +msgid "unexpected end of file" +msgstr "" + +#: sequencer.c:927 +#, c-format +msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" +msgstr "" + +#: sequencer.c:950 +#, c-format +msgid "Could not format %s." +msgstr "" + +#: sequencer.c:1093 +#, c-format +msgid "%s: can't cherry-pick a %s" +msgstr "" + +#: sequencer.c:1096 +#, c-format +msgid "%s: bad revision" +msgstr "" + +#: sequencer.c:1130 +msgid "Can't revert as initial commit" +msgstr "" + +#: sequencer.c:1131 +msgid "Can't cherry-pick into empty head" +msgstr "" + +#: sha1_name.c:439 +msgid "" +"Git normally never creates a ref that ends with 40 hex characters\n" +"because it will be ignored when you just specify 40-hex. These refs\n" +"may be created by mistake. For example,\n" +"\n" +" git checkout -b $br $(git rev-parse ...)\n" +"\n" +"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n" +"examine these refs and maybe delete them. Turn this message off by\n" +"running \"git config advice.objectNameWarning false\"" +msgstr "" + +#: sha1_name.c:1109 +msgid "HEAD does not point to a branch" +msgstr "" + +#: sha1_name.c:1112 +#, c-format +msgid "No such branch: '%s'" +msgstr "" + +#: sha1_name.c:1114 +#, c-format +msgid "No upstream configured for branch '%s'" +msgstr "" + +#: sha1_name.c:1118 +#, c-format +msgid "Upstream branch '%s' not stored as a remote-tracking branch" +msgstr "" + +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "" + +#: wrapper.c:422 +#, c-format +msgid "unable to access '%s': %s" +msgstr "" + +#: wrapper.c:443 +#, c-format +msgid "unable to access '%s'" +msgstr "" + +#: wrapper.c:454 +#, c-format +msgid "unable to look up current user in the passwd file: %s" +msgstr "" + +#: wrapper.c:455 +msgid "no such user" +msgstr "" + +#: wt-status.c:150 +msgid "Unmerged paths:" +msgstr "" + +#: wt-status.c:177 wt-status.c:204 +#, c-format +msgid " (use \"git reset %s <file>...\" to unstage)" +msgstr "" + +#: wt-status.c:179 wt-status.c:206 +msgid " (use \"git rm --cached <file>...\" to unstage)" +msgstr "" + +#: wt-status.c:183 +msgid " (use \"git add <file>...\" to mark resolution)" +msgstr "" + +#: wt-status.c:185 wt-status.c:189 +msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" +msgstr "" + +#: wt-status.c:187 +msgid " (use \"git rm <file>...\" to mark resolution)" +msgstr "" + +#: wt-status.c:198 +msgid "Changes to be committed:" +msgstr "" + +#: wt-status.c:216 +msgid "Changes not staged for commit:" +msgstr "" + +#: wt-status.c:220 +msgid " (use \"git add <file>...\" to update what will be committed)" +msgstr "" + +#: wt-status.c:222 +msgid " (use \"git add/rm <file>...\" to update what will be committed)" +msgstr "" + +#: wt-status.c:223 +msgid "" +" (use \"git checkout -- <file>...\" to discard changes in working directory)" +msgstr "" + +#: wt-status.c:225 +msgid " (commit or discard the untracked or modified content in submodules)" +msgstr "" + +#: wt-status.c:237 +#, c-format +msgid " (use \"git %s <file>...\" to include in what will be committed)" +msgstr "" + +#: wt-status.c:254 +msgid "bug" +msgstr "" + +#: wt-status.c:259 +msgid "both deleted:" +msgstr "" + +#: wt-status.c:260 +msgid "added by us:" +msgstr "" + +#: wt-status.c:261 +msgid "deleted by them:" +msgstr "" + +#: wt-status.c:262 +msgid "added by them:" +msgstr "" + +#: wt-status.c:263 +msgid "deleted by us:" +msgstr "" + +#: wt-status.c:264 +msgid "both added:" +msgstr "" + +#: wt-status.c:265 +msgid "both modified:" +msgstr "" + +#: wt-status.c:275 +msgid "new file" +msgstr "" + +#: wt-status.c:277 +msgid "copied" +msgstr "" + +#: wt-status.c:279 +msgid "deleted" +msgstr "" + +#: wt-status.c:285 +msgid "typechange" +msgstr "" + +#: wt-status.c:287 +msgid "unknown" +msgstr "" + +#: wt-status.c:289 +msgid "unmerged" +msgstr "" + +#: wt-status.c:336 +msgid "new commits, " +msgstr "" + +#: wt-status.c:338 +msgid "modified content, " +msgstr "" + +#: wt-status.c:340 +msgid "untracked content, " +msgstr "" + +#: wt-status.c:357 +#, c-format +msgid "bug: unhandled diff status %c" +msgstr "" + +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "" + +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "" + +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" + +#: wt-status.c:899 +msgid "You have unmerged paths." +msgstr "" + +#: wt-status.c:902 +msgid " (fix conflicts and run \"git commit\")" +msgstr "" + +#: wt-status.c:905 +msgid "All conflicts fixed but you are still merging." +msgstr "" + +#: wt-status.c:908 +msgid " (use \"git commit\" to conclude merge)" +msgstr "" + +#: wt-status.c:918 +msgid "You are in the middle of an am session." +msgstr "" + +#: wt-status.c:921 +msgid "The current patch is empty." +msgstr "" + +#: wt-status.c:925 +msgid " (fix conflicts and then run \"git am --continue\")" +msgstr "" + +#: wt-status.c:927 +msgid " (use \"git am --skip\" to skip this patch)" +msgstr "" + +#: wt-status.c:929 +msgid " (use \"git am --abort\" to restore the original branch)" +msgstr "" + +#: wt-status.c:989 wt-status.c:1006 +#, c-format +msgid "You are currently rebasing branch '%s' on '%s'." +msgstr "" + +#: wt-status.c:994 wt-status.c:1011 +msgid "You are currently rebasing." +msgstr "" + +#: wt-status.c:997 +msgid " (fix conflicts and then run \"git rebase --continue\")" +msgstr "" + +#: wt-status.c:999 +msgid " (use \"git rebase --skip\" to skip this patch)" +msgstr "" + +#: wt-status.c:1001 +msgid " (use \"git rebase --abort\" to check out the original branch)" +msgstr "" + +#: wt-status.c:1014 +msgid " (all conflicts fixed: run \"git rebase --continue\")" +msgstr "" + +#: wt-status.c:1018 +#, c-format +msgid "" +"You are currently splitting a commit while rebasing branch '%s' on '%s'." +msgstr "" + +#: wt-status.c:1023 +msgid "You are currently splitting a commit during a rebase." +msgstr "" + +#: wt-status.c:1026 +msgid " (Once your working directory is clean, run \"git rebase --continue\")" +msgstr "" + +#: wt-status.c:1030 +#, c-format +msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." +msgstr "" + +#: wt-status.c:1035 +msgid "You are currently editing a commit during a rebase." +msgstr "" + +#: wt-status.c:1038 +msgid " (use \"git commit --amend\" to amend the current commit)" +msgstr "" + +#: wt-status.c:1040 +msgid "" +" (use \"git rebase --continue\" once you are satisfied with your changes)" +msgstr "" + +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "" + +#: wt-status.c:1055 +msgid " (fix conflicts and run \"git cherry-pick --continue\")" +msgstr "" + +#: wt-status.c:1058 +msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" +msgstr "" + +#: wt-status.c:1060 +msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" +msgstr "" + +#: wt-status.c:1069 +#, c-format +msgid "You are currently reverting commit %s." +msgstr "" + +#: wt-status.c:1074 +msgid " (fix conflicts and run \"git revert --continue\")" +msgstr "" + +#: wt-status.c:1077 +msgid " (all conflicts fixed: run \"git revert --continue\")" +msgstr "" + +#: wt-status.c:1079 +msgid " (use \"git revert --abort\" to cancel the revert operation)" +msgstr "" + +#: wt-status.c:1090 +#, c-format +msgid "You are currently bisecting, started from branch '%s'." +msgstr "" + +#: wt-status.c:1094 +msgid "You are currently bisecting." +msgstr "" + +#: wt-status.c:1097 +msgid " (use \"git bisect reset\" to get back to the original branch)" +msgstr "" + +#: wt-status.c:1272 +msgid "On branch " +msgstr "" + +#: wt-status.c:1279 +msgid "rebase in progress; onto " +msgstr "" + +#: wt-status.c:1286 +msgid "HEAD detached at " +msgstr "" + +#: wt-status.c:1288 +msgid "HEAD detached from " +msgstr "" + +#: wt-status.c:1291 +msgid "Not currently on any branch." +msgstr "" + +#: wt-status.c:1308 +msgid "Initial commit" +msgstr "" + +#: wt-status.c:1322 +msgid "Untracked files" +msgstr "" + +#: wt-status.c:1324 +msgid "Ignored files" +msgstr "" + +#: wt-status.c:1328 +#, c-format +msgid "" +"It took %.2f seconds to enumerate untracked files. 'status -uno'\n" +"may speed it up, but you have to be careful not to forget to add\n" +"new files yourself (see 'git help status')." +msgstr "" + +#: wt-status.c:1334 +#, c-format +msgid "Untracked files not listed%s" +msgstr "" + +#: wt-status.c:1336 +msgid " (use -u option to show untracked files)" +msgstr "" + +#: wt-status.c:1342 +msgid "No changes" +msgstr "" + +#: wt-status.c:1347 +#, c-format +msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" +msgstr "" + +#: wt-status.c:1350 +#, c-format +msgid "no changes added to commit\n" +msgstr "" + +#: wt-status.c:1353 +#, c-format +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" +msgstr "" + +#: wt-status.c:1356 +#, c-format +msgid "nothing added to commit but untracked files present\n" +msgstr "" + +#: wt-status.c:1359 +#, c-format +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" +msgstr "" + +#: wt-status.c:1362 wt-status.c:1367 +#, c-format +msgid "nothing to commit\n" +msgstr "" + +#: wt-status.c:1365 +#, c-format +msgid "nothing to commit (use -u to show untracked files)\n" +msgstr "" + +#: wt-status.c:1369 +#, c-format +msgid "nothing to commit, working directory clean\n" +msgstr "" + +#: wt-status.c:1478 +msgid "HEAD (no branch)" +msgstr "" + +#: wt-status.c:1484 +msgid "Initial commit on " +msgstr "" + +#: wt-status.c:1514 +msgid "gone" +msgstr "" + +#: wt-status.c:1516 +msgid "behind " +msgstr "" + +#: wt-status.c:1519 wt-status.c:1522 +msgid "ahead " +msgstr "" + +#: wt-status.c:1524 +msgid ", behind " +msgstr "" + +#: compat/precompose_utf8.c:55 builtin/clone.c:356 +#, c-format +msgid "failed to unlink '%s'" +msgstr "" + +#: builtin/add.c:20 +msgid "git add [options] [--] <pathspec>..." +msgstr "" + +#. +#. * To be consistent with "git add -p" and most Git +#. * commands, we should default to being tree-wide, but +#. * this is not the original behavior and can't be +#. * changed until users trained themselves not to type +#. * "git add -u" or "git add -A". For now, we warn and +#. * keep the old behavior. Later, the behavior can be changed +#. * to tree-wide, keeping the warning for a while, and +#. * eventually we can drop the warning. +#. +#: builtin/add.c:58 +#, c-format +msgid "" +"The behavior of 'git add %s (or %s)' with no path argument from a\n" +"subdirectory of the tree will change in Git 2.0 and should not be used " +"anymore.\n" +"To add content for the whole tree, run:\n" +"\n" +" git add %s :/\n" +" (or git add %s :/)\n" +"\n" +"To restrict the command to the current directory, run:\n" +"\n" +" git add %s .\n" +" (or git add %s .)\n" +"\n" +"With the current Git version, the command is restricted to the current " +"directory.\n" +msgstr "" + +#: builtin/add.c:100 +#, c-format +msgid "" +"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n" +"whose behaviour will change in Git 2.0 with respect to paths you removed.\n" +"Paths like '%s' that are\n" +"removed from your working tree are ignored with this version of Git.\n" +"\n" +"* 'git add --ignore-removal <pathspec>', which is the current default,\n" +" ignores paths you removed from your working tree.\n" +"\n" +"* 'git add --all <pathspec>' will let you also record the removals.\n" +"\n" +"Run 'git status' to check the paths you removed from your working tree.\n" +msgstr "" + +#: builtin/add.c:144 +#, c-format +msgid "unexpected diff status %c" +msgstr "" + +#: builtin/add.c:149 builtin/commit.c:260 +msgid "updating files failed" +msgstr "" + +#: builtin/add.c:163 +#, c-format +msgid "remove '%s'\n" +msgstr "" + +#: builtin/add.c:237 +msgid "Unstaged changes after refreshing the index:" +msgstr "" + +#: builtin/add.c:299 +msgid "Could not read the index" +msgstr "" + +#: builtin/add.c:310 +#, c-format +msgid "Could not open '%s' for writing." +msgstr "" + +#: builtin/add.c:314 +msgid "Could not write patch" +msgstr "" + +#: builtin/add.c:319 +#, c-format +msgid "Could not stat '%s'" +msgstr "" + +#: builtin/add.c:321 +msgid "Empty patch. Aborted." +msgstr "" + +#: builtin/add.c:327 +#, c-format +msgid "Could not apply '%s'" +msgstr "" + +#: builtin/add.c:337 +msgid "The following paths are ignored by one of your .gitignore files:\n" +msgstr "" + +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 +msgid "dry run" +msgstr "пробно изпълнeние" + +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 +msgid "be verbose" +msgstr "повече подробноÑти" + +#: builtin/add.c:357 +msgid "interactive picking" +msgstr "" + +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 +msgid "select hunks interactively" +msgstr "" + +#: builtin/add.c:359 +msgid "edit current diff and apply" +msgstr "" + +#: builtin/add.c:360 +msgid "allow adding otherwise ignored files" +msgstr "" + +#: builtin/add.c:361 +msgid "update tracked files" +msgstr "" + +#: builtin/add.c:362 +msgid "record only the fact that the path will be added later" +msgstr "" + +#: builtin/add.c:363 +msgid "add changes from all tracked and untracked files" +msgstr "" + +#. takes no arguments +#: builtin/add.c:366 +msgid "ignore paths removed in the working tree (same as --no-all)" +msgstr "" + +#: builtin/add.c:368 +msgid "don't add, only refresh the index" +msgstr "" + +#: builtin/add.c:369 +msgid "just skip files which cannot be added because of errors" +msgstr "" + +#: builtin/add.c:370 +msgid "check if - even missing - files are ignored in dry run" +msgstr "" + +#: builtin/add.c:392 +#, c-format +msgid "Use -f if you really want to add them.\n" +msgstr "" + +#: builtin/add.c:393 +msgid "no files added" +msgstr "" + +#: builtin/add.c:399 +msgid "adding files failed" +msgstr "" + +#: builtin/add.c:438 +msgid "-A and -u are mutually incompatible" +msgstr "" + +#: builtin/add.c:456 +msgid "Option --ignore-missing can only be used together with --dry-run" +msgstr "" + +#: builtin/add.c:486 +#, c-format +msgid "Nothing specified, nothing added.\n" +msgstr "" + +#: builtin/add.c:487 +#, c-format +msgid "Maybe you wanted to say 'git add .'?\n" +msgstr "" + +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 +msgid "index file corrupt" +msgstr "файлът Ñ Ð¸Ð½Ð´ÐµÐºÑа е повреден" + +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 +msgid "Unable to write new index file" +msgstr "ÐовиÑÑ‚ файл Ñ Ð¸Ð½Ð´ÐµÐºÑа не може да бъде запиÑан" + +#: builtin/apply.c:57 +msgid "git apply [options] [<patch>...]" +msgstr "" + +#: builtin/apply.c:110 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "" + +#: builtin/apply.c:125 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "" + +#: builtin/apply.c:823 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "" + +#: builtin/apply.c:832 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "" + +#: builtin/apply.c:913 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "" + +#: builtin/apply.c:945 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "" + +#: builtin/apply.c:950 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "" + +#: builtin/apply.c:957 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "" + +#: builtin/apply.c:1422 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "" + +#: builtin/apply.c:1479 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "" + +#: builtin/apply.c:1496 +#, 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] "" +msgstr[1] "" + +#: builtin/apply.c:1656 +msgid "new file depends on old contents" +msgstr "" + +#: builtin/apply.c:1658 +msgid "deleted file still has contents" +msgstr "" + +#: builtin/apply.c:1684 +#, c-format +msgid "corrupt patch at line %d" +msgstr "" + +#: builtin/apply.c:1720 +#, c-format +msgid "new file %s depends on old contents" +msgstr "" + +#: builtin/apply.c:1722 +#, c-format +msgid "deleted file %s still has contents" +msgstr "" + +#: builtin/apply.c:1725 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "" + +#: builtin/apply.c:1871 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1900 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "" + +#: builtin/apply.c:1986 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "" + +#: builtin/apply.c:2076 +#, c-format +msgid "unable to read symlink %s" +msgstr "" + +#: builtin/apply.c:2080 +#, c-format +msgid "unable to open or read %s" +msgstr "" + +#: builtin/apply.c:2688 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "" + +#: builtin/apply.c:2806 +#, 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:2818 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "" + +#: builtin/apply.c:2824 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" + +#: builtin/apply.c:2843 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "" + +#: builtin/apply.c:2946 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "" + +#: builtin/apply.c:2952 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "" + +#: builtin/apply.c:2973 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "" + +#: builtin/apply.c:3095 +#, c-format +msgid "cannot checkout %s" +msgstr "" + +#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194 +#, c-format +msgid "read of %s failed" +msgstr "" + +#: builtin/apply.c:3174 builtin/apply.c:3396 +#, c-format +msgid "path %s has been renamed/deleted" +msgstr "" + +#: builtin/apply.c:3255 builtin/apply.c:3410 +#, c-format +msgid "%s: does not exist in index" +msgstr "" + +#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424 +#, c-format +msgid "%s: %s" +msgstr "" + +#: builtin/apply.c:3264 builtin/apply.c:3418 +#, c-format +msgid "%s: does not match index" +msgstr "" + +#: builtin/apply.c:3366 +msgid "removal patch leaves file contents" +msgstr "" + +#: builtin/apply.c:3435 +#, c-format +msgid "%s: wrong type" +msgstr "" + +#: builtin/apply.c:3437 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "" + +#: builtin/apply.c:3538 +#, c-format +msgid "%s: already exists in index" +msgstr "" + +#: builtin/apply.c:3541 +#, c-format +msgid "%s: already exists in working directory" +msgstr "" + +#: builtin/apply.c:3561 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "" + +#: builtin/apply.c:3566 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "" + +#: builtin/apply.c:3574 +#, c-format +msgid "%s: patch does not apply" +msgstr "" + +#: builtin/apply.c:3587 +#, c-format +msgid "Checking patch %s..." +msgstr "" + +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "" + +#: builtin/apply.c:3823 +#, c-format +msgid "unable to remove %s from index" +msgstr "" + +#: builtin/apply.c:3851 +#, c-format +msgid "corrupt patch for submodule %s" +msgstr "" + +#: builtin/apply.c:3855 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "" + +#: builtin/apply.c:3860 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "" + +#: builtin/apply.c:3863 builtin/apply.c:3971 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "" + +#: builtin/apply.c:3896 +#, c-format +msgid "closing file '%s'" +msgstr "" + +#: builtin/apply.c:3945 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "" + +#: builtin/apply.c:4032 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "" + +#: builtin/apply.c:4040 +msgid "internal error" +msgstr "" + +#. Say this even without --verbose +#: builtin/apply.c:4043 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:4053 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "" + +#: builtin/apply.c:4074 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "" + +#: builtin/apply.c:4077 +#, c-format +msgid "Rejected hunk #%d." +msgstr "" + +#: builtin/apply.c:4227 +msgid "unrecognized input" +msgstr "" + +#: builtin/apply.c:4238 +msgid "unable to read index file" +msgstr "" + +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 +msgid "path" +msgstr "" + +#: builtin/apply.c:4358 +msgid "don't apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:4361 +msgid "apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:4363 +msgid "num" +msgstr "" + +#: builtin/apply.c:4364 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "" + +#: builtin/apply.c:4367 +msgid "ignore additions made by the patch" +msgstr "" + +#: builtin/apply.c:4369 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "" + +#: builtin/apply.c:4373 +msgid "show number of added and deleted lines in decimal notation" +msgstr "" + +#: builtin/apply.c:4375 +msgid "instead of applying the patch, output a summary for the input" +msgstr "" + +#: builtin/apply.c:4377 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "" + +#: builtin/apply.c:4379 +msgid "make sure the patch is applicable to the current index" +msgstr "" + +#: builtin/apply.c:4381 +msgid "apply a patch without touching the working tree" +msgstr "" + +#: builtin/apply.c:4383 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "" + +#: builtin/apply.c:4385 +msgid "attempt three-way merge if a patch does not apply" +msgstr "" + +#: builtin/apply.c:4387 +msgid "build a temporary index based on embedded index information" +msgstr "" + +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 +msgid "paths are separated with NUL character" +msgstr "" + +#: builtin/apply.c:4392 +#, fuzzy +msgid "ensure at least <n> lines of context match" +msgstr "<брой>" + +#: builtin/apply.c:4393 +msgid "action" +msgstr "" + +#: builtin/apply.c:4394 +msgid "detect new or modified lines that have whitespace errors" +msgstr "" + +#: builtin/apply.c:4397 builtin/apply.c:4400 +msgid "ignore changes in whitespace when finding context" +msgstr "" + +#: builtin/apply.c:4403 +msgid "apply the patch in reverse" +msgstr "" + +#: builtin/apply.c:4405 +msgid "don't expect at least one line of context" +msgstr "" + +#: builtin/apply.c:4407 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "" + +#: builtin/apply.c:4409 +msgid "allow overlapping hunks" +msgstr "" + +#: builtin/apply.c:4412 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "" + +#: builtin/apply.c:4415 +msgid "do not trust the line counts in the hunk headers" +msgstr "" + +#: builtin/apply.c:4417 +msgid "root" +msgstr "" + +#: builtin/apply.c:4418 +msgid "prepend <root> to all filenames" +msgstr "" + +#: builtin/apply.c:4440 +msgid "--3way outside a repository" +msgstr "" + +#: builtin/apply.c:4448 +msgid "--index outside a repository" +msgstr "" + +#: builtin/apply.c:4451 +msgid "--cached outside a repository" +msgstr "" + +#: builtin/apply.c:4467 +#, c-format +msgid "can't open patch '%s'" +msgstr "" + +#: builtin/apply.c:4481 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:4487 builtin/apply.c:4497 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "" +msgstr[1] "" + +#: builtin/archive.c:17 +#, c-format +msgid "could not create archive file '%s'" +msgstr "" + +#: builtin/archive.c:20 +msgid "could not redirect output" +msgstr "" + +#: builtin/archive.c:37 +msgid "git archive: Remote with no URL" +msgstr "" + +#: builtin/archive.c:58 +msgid "git archive: expected ACK/NAK, got EOF" +msgstr "" + +#: builtin/archive.c:61 +#, c-format +msgid "git archive: NACK %s" +msgstr "" + +#: builtin/archive.c:63 +#, c-format +msgid "remote error: %s" +msgstr "" + +#: builtin/archive.c:64 +msgid "git archive: protocol error" +msgstr "" + +#: builtin/archive.c:68 +msgid "git archive: expected a flush" +msgstr "" + +#: 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:27 +msgid "git blame [options] [rev-opts] [rev] [--] file" +msgstr "" + +#: builtin/blame.c:32 +msgid "[rev-opts] are documented in git-rev-list(1)" +msgstr "" + +#: builtin/blame.c:2249 +msgid "Show blame entries as we find them, incrementally" +msgstr "" + +# FIXME +#: builtin/blame.c:2250 +msgid "Show blank SHA-1 for boundary commits (Default: off)" +msgstr "" + +#: builtin/blame.c:2251 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "" + +#: builtin/blame.c:2252 +msgid "Show work cost statistics" +msgstr "" + +#: builtin/blame.c:2253 +msgid "Show output score for blame entries" +msgstr "" + +#: builtin/blame.c:2254 +msgid "Show original filename (Default: auto)" +msgstr "" + +#: builtin/blame.c:2255 +msgid "Show original linenumber (Default: off)" +msgstr "" + +#: builtin/blame.c:2256 +msgid "Show in a format designed for machine consumption" +msgstr "" + +#: builtin/blame.c:2257 +msgid "Show porcelain format with per-line commit information" +msgstr "" + +#: builtin/blame.c:2258 +msgid "Use the same output mode as git-annotate (Default: off)" +msgstr "" + +#: builtin/blame.c:2259 +msgid "Show raw timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2260 +msgid "Show long commit SHA1 (Default: off)" +msgstr "" + +#: builtin/blame.c:2261 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "" + +#: builtin/blame.c:2262 +msgid "Show author email instead of name (Default: off)" +msgstr "" + +#: builtin/blame.c:2263 +msgid "Ignore whitespace differences" +msgstr "" + +#: builtin/blame.c:2264 +msgid "Spend extra cycles to find better match" +msgstr "" + +#: builtin/blame.c:2265 +msgid "Use revisions from <file> instead of calling git-rev-list" +msgstr "" + +#: builtin/blame.c:2266 +msgid "Use <file>'s contents as the final image" +msgstr "" + +#: builtin/blame.c:2267 builtin/blame.c:2268 +msgid "score" +msgstr "" + +#: builtin/blame.c:2267 +msgid "Find line copies within and across files" +msgstr "" + +#: builtin/blame.c:2268 +msgid "Find line movements within and across files" +msgstr "" + +#: builtin/blame.c:2269 +msgid "n,m" +msgstr "" + +#: builtin/blame.c:2269 +msgid "Process only line range n,m, counting from 1" +msgstr "" + +#: builtin/branch.c:24 +msgid "git branch [options] [-r | -a] [--merged | --no-merged]" +msgstr "" + +#: builtin/branch.c:25 +msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]" +msgstr "" + +#: builtin/branch.c:26 +msgid "git branch [options] [-r] (-d | -D) <branchname>..." +msgstr "" + +#: builtin/branch.c:27 +msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>" +msgstr "" + +#: builtin/branch.c:150 +#, c-format +msgid "" +"deleting branch '%s' that has been merged to\n" +" '%s', but not yet merged to HEAD." +msgstr "" + +#: builtin/branch.c:154 +#, c-format +msgid "" +"not deleting branch '%s' that is not yet merged to\n" +" '%s', even though it is merged to HEAD." +msgstr "" + +#: builtin/branch.c:168 +#, c-format +msgid "Couldn't look up commit object for '%s'" +msgstr "" + +#: builtin/branch.c:172 +#, 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:185 +msgid "Update of config-file failed" +msgstr "" + +#: builtin/branch.c:213 +msgid "cannot use -a with -d" +msgstr "" + +#: builtin/branch.c:219 +msgid "Couldn't look up commit object for HEAD" +msgstr "" + +#: builtin/branch.c:227 +#, c-format +msgid "Cannot delete the branch '%s' which you are currently on." +msgstr "" + +#: builtin/branch.c:240 +#, c-format +msgid "remote branch '%s' not found." +msgstr "" + +#: builtin/branch.c:241 +#, c-format +msgid "branch '%s' not found." +msgstr "" + +#: builtin/branch.c:255 +#, c-format +msgid "Error deleting remote branch '%s'" +msgstr "" + +#: builtin/branch.c:256 +#, c-format +msgid "Error deleting branch '%s'" +msgstr "" + +#: builtin/branch.c:263 +#, c-format +msgid "Deleted remote branch %s (was %s).\n" +msgstr "" + +#: builtin/branch.c:264 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "" + +#: builtin/branch.c:366 +#, c-format +msgid "branch '%s' does not point at a commit" +msgstr "" + +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "" + +#: builtin/branch.c:464 +#, c-format +msgid "[%s: behind %d]" +msgstr "" + +#: builtin/branch.c:466 +#, c-format +msgid "[behind %d]" +msgstr "" + +#: builtin/branch.c:470 +#, c-format +msgid "[%s: ahead %d]" +msgstr "" + +#: builtin/branch.c:472 +#, c-format +msgid "[ahead %d]" +msgstr "" + +#: builtin/branch.c:475 +#, c-format +msgid "[%s: ahead %d, behind %d]" +msgstr "" + +#: builtin/branch.c:478 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "" + +#: builtin/branch.c:502 +msgid " **** invalid ref ****" +msgstr "" + +#: builtin/branch.c:594 +#, c-format +msgid "(no branch, rebasing %s)" +msgstr "" + +#: builtin/branch.c:597 +#, c-format +msgid "(no branch, bisect started on %s)" +msgstr "" + +#: builtin/branch.c:600 +#, c-format +msgid "(detached from %s)" +msgstr "" + +#: builtin/branch.c:603 +msgid "(no branch)" +msgstr "" + +#: builtin/branch.c:649 +#, c-format +msgid "object '%s' does not point to a commit" +msgstr "" + +#: builtin/branch.c:681 +msgid "some refs could not be read" +msgstr "" + +#: builtin/branch.c:694 +msgid "cannot rename the current branch while not on any." +msgstr "" + +#: builtin/branch.c:704 +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "" + +#: builtin/branch.c:719 +msgid "Branch rename failed" +msgstr "" + +#: builtin/branch.c:723 +#, c-format +msgid "Renamed a misnamed branch '%s' away" +msgstr "" + +#: builtin/branch.c:727 +#, c-format +msgid "Branch renamed to %s, but HEAD is not updated!" +msgstr "" + +#: builtin/branch.c:734 +msgid "Branch is renamed, but update of config-file failed" +msgstr "" + +#: builtin/branch.c:749 +#, c-format +msgid "malformed object name %s" +msgstr "" + +#: builtin/branch.c:773 +#, c-format +msgid "could not write branch description template: %s" +msgstr "" + +#: builtin/branch.c:803 +msgid "Generic options" +msgstr "" + +#: builtin/branch.c:805 +msgid "show hash and subject, give twice for upstream branch" +msgstr "" + +#: builtin/branch.c:806 +msgid "suppress informational messages" +msgstr "" + +#: builtin/branch.c:807 +msgid "set up tracking mode (see git-pull(1))" +msgstr "" + +#: builtin/branch.c:809 +msgid "change upstream info" +msgstr "" + +#: builtin/branch.c:813 +msgid "use colored output" +msgstr "" + +#: builtin/branch.c:814 +msgid "act on remote-tracking branches" +msgstr "" + +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 +msgid "commit" +msgstr "" + +#: builtin/branch.c:818 builtin/branch.c:824 +msgid "print only branches that contain the commit" +msgstr "" + +#: builtin/branch.c:830 +msgid "Specific git-branch actions:" +msgstr "" + +#: builtin/branch.c:831 +msgid "list both remote-tracking and local branches" +msgstr "" + +#: builtin/branch.c:833 +msgid "delete fully merged branch" +msgstr "" + +#: builtin/branch.c:834 +msgid "delete branch (even if not merged)" +msgstr "" + +#: builtin/branch.c:835 +msgid "move/rename a branch and its reflog" +msgstr "" + +#: builtin/branch.c:836 +msgid "move/rename a branch, even if target exists" +msgstr "" + +#: builtin/branch.c:837 +msgid "list branch names" +msgstr "" + +#: builtin/branch.c:838 +msgid "create the branch's reflog" +msgstr "" + +#: builtin/branch.c:840 +msgid "edit the description for the branch" +msgstr "" + +#: builtin/branch.c:841 +msgid "force creation (when already exists)" +msgstr "" + +#: builtin/branch.c:844 +msgid "print only not merged branches" +msgstr "" + +#: builtin/branch.c:850 +msgid "print only merged branches" +msgstr "" + +#: builtin/branch.c:854 +msgid "list branches in columns" +msgstr "" + +#: builtin/branch.c:867 +msgid "Failed to resolve HEAD as a valid ref." +msgstr "" + +#: builtin/branch.c:872 builtin/clone.c:635 +msgid "HEAD not found below refs/heads!" +msgstr "" + +#: builtin/branch.c:896 +msgid "--column and --verbose are incompatible" +msgstr "" + +#: builtin/branch.c:902 builtin/branch.c:941 +msgid "branch name required" +msgstr "" + +#: builtin/branch.c:917 +msgid "Cannot give description to detached HEAD" +msgstr "" + +#: builtin/branch.c:922 +msgid "cannot edit description of more than one branch" +msgstr "" + +#: builtin/branch.c:929 +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "" + +#: builtin/branch.c:932 +#, c-format +msgid "No branch named '%s'." +msgstr "" + +#: builtin/branch.c:947 +msgid "too many branches for a rename operation" +msgstr "" + +#: builtin/branch.c:952 +msgid "too many branches to set new upstream" +msgstr "" + +#: builtin/branch.c:956 +#, c-format +msgid "" +"could not set upstream of HEAD to %s when it does not point to any branch." +msgstr "" + +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 +#, c-format +msgid "no such branch '%s'" +msgstr "" + +#: builtin/branch.c:963 +#, c-format +msgid "branch '%s' does not exist" +msgstr "" + +#: builtin/branch.c:975 +msgid "too many branches to unset upstream" +msgstr "" + +#: builtin/branch.c:979 +msgid "could not unset upstream of HEAD when it does not point to any branch." +msgstr "" + +#: builtin/branch.c:985 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "" + +#: builtin/branch.c:999 +msgid "it does not make sense to create 'HEAD' manually" +msgstr "" + +#: builtin/branch.c:1005 +msgid "-a and -r options to 'git branch' do not make sense with a branch name" +msgstr "" + +#: builtin/branch.c:1008 +#, 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:1025 +#, c-format +msgid "" +"\n" +"If you wanted to make '%s' track '%s', do this:\n" +"\n" +msgstr "" + +#: builtin/branch.c:1026 +#, c-format +msgid " git branch -d %s\n" +msgstr "" + +#: builtin/branch.c:1027 +#, c-format +msgid " git branch --set-upstream-to %s\n" +msgstr "" + +#: builtin/bundle.c:47 +#, c-format +msgid "%s is okay\n" +msgstr "" + +#: builtin/bundle.c:56 +msgid "Need a repository to create a bundle." +msgstr "" + +#: builtin/bundle.c:60 +msgid "Need a repository to unbundle." +msgstr "" + +#: builtin/cat-file.c:328 +msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" +msgstr "" + +#: builtin/cat-file.c:329 +msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" +msgstr "" + +#: builtin/cat-file.c:366 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "" + +#: builtin/cat-file.c:367 +msgid "show object type" +msgstr "" + +#: builtin/cat-file.c:368 +msgid "show object size" +msgstr "" + +#: builtin/cat-file.c:370 +msgid "exit with zero when there's no error" +msgstr "" + +#: builtin/cat-file.c:371 +msgid "pretty-print object's content" +msgstr "" + +#: builtin/cat-file.c:373 +msgid "for blob objects, run textconv on object's content" +msgstr "" + +#: builtin/cat-file.c:375 +msgid "show info and content of objects fed from the standard input" +msgstr "" + +#: builtin/cat-file.c:378 +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/check-ignore.c:22 builtin/hash-object.c:75 +msgid "read file names from stdin" +msgstr "" + +#: builtin/check-attr.c:23 builtin/check-ignore.c:24 +msgid "terminate input and output records by a NUL character" +msgstr "" + +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 +msgid "suppress progress reporting" +msgstr "без показване на напредъка" + +#: builtin/check-ignore.c:26 +msgid "show non-matching input paths" +msgstr "" + +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "" + +#: builtin/check-ignore.c:154 +msgid "cannot specify pathnames with --stdin" +msgstr "" + +#: builtin/check-ignore.c:157 +msgid "-z only makes sense with --stdin" +msgstr "" + +#: builtin/check-ignore.c:159 +msgid "no path specified" +msgstr "" + +#: builtin/check-ignore.c:163 +msgid "--quiet is only valid with a single pathname" +msgstr "" + +#: builtin/check-ignore.c:165 +msgid "cannot have both --quiet and --verbose" +msgstr "" + +#: builtin/check-ignore.c:168 +msgid "--non-matching is only valid with --verbose" +msgstr "" + +#: builtin/check-mailmap.c:8 +msgid "git check-mailmap [options] <contact>..." +msgstr "" + +#: builtin/check-mailmap.c:13 +msgid "also read contacts from stdin" +msgstr "" + +#: builtin/check-mailmap.c:24 +#, c-format +msgid "unable to parse contact: %s" +msgstr "" + +#: builtin/check-mailmap.c:47 +msgid "no contacts specified" +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:114 builtin/checkout.c:147 +#, c-format +msgid "path '%s' does not have our version" +msgstr "" + +#: builtin/checkout.c:116 builtin/checkout.c:149 +#, c-format +msgid "path '%s' does not have their version" +msgstr "" + +#: builtin/checkout.c:132 +#, c-format +msgid "path '%s' does not have all necessary versions" +msgstr "" + +#: builtin/checkout.c:176 +#, c-format +msgid "path '%s' does not have necessary versions" +msgstr "" + +#: builtin/checkout.c:193 +#, c-format +msgid "path '%s': cannot merge" +msgstr "" + +#: builtin/checkout.c:210 +#, c-format +msgid "Unable to add merge result for '%s'" +msgstr "" + +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 +#, c-format +msgid "'%s' cannot be used with updating paths" +msgstr "" + +#: builtin/checkout.c:244 builtin/checkout.c:247 +#, c-format +msgid "'%s' cannot be used with %s" +msgstr "" + +#: builtin/checkout.c:250 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "" + +#: builtin/checkout.c:261 builtin/checkout.c:451 +msgid "corrupt index file" +msgstr "" + +#: builtin/checkout.c:322 builtin/checkout.c:329 +#, c-format +msgid "path '%s' is unmerged" +msgstr "" + +#: builtin/checkout.c:473 +msgid "you need to resolve your current index first" +msgstr "" + +#: builtin/checkout.c:594 +#, c-format +msgid "Can not do reflog for '%s'\n" +msgstr "" + +#: builtin/checkout.c:632 +msgid "HEAD is now at" +msgstr "" + +#: builtin/checkout.c:639 +#, c-format +msgid "Reset branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:642 +#, c-format +msgid "Already on '%s'\n" +msgstr "" + +#: builtin/checkout.c:646 +#, c-format +msgid "Switched to and reset branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:648 builtin/checkout.c:1033 +#, c-format +msgid "Switched to a new branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:650 +#, c-format +msgid "Switched to branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:706 +#, c-format +msgid " ... and %d more.\n" +msgstr "" + +#. The singular version +#: builtin/checkout.c:712 +#, c-format +msgid "" +"Warning: you are leaving %d commit behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgid_plural "" +"Warning: you are leaving %d commits behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgstr[0] "" +msgstr[1] "" + +#: builtin/checkout.c:730 +#, c-format +msgid "" +"If you want to keep them by creating a new branch, this may be a good time\n" +"to do so with:\n" +"\n" +" git branch new_branch_name %s\n" +"\n" +msgstr "" + +#: builtin/checkout.c:760 +msgid "internal error in revision walk" +msgstr "" + +#: builtin/checkout.c:764 +msgid "Previous HEAD position was" +msgstr "" + +#: builtin/checkout.c:791 builtin/checkout.c:1028 +msgid "You are on a branch yet to be born" +msgstr "" + +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "" + +#: builtin/checkout.c:974 +#, c-format +msgid "invalid reference: %s" +msgstr "" + +#. case (1): want a tree +#: builtin/checkout.c:1003 +#, c-format +msgid "reference is not a tree: %s" +msgstr "" + +#: builtin/checkout.c:1042 +msgid "paths cannot be used with switching branches" +msgstr "" + +#: builtin/checkout.c:1045 builtin/checkout.c:1049 +#, c-format +msgid "'%s' cannot be used with switching branches" +msgstr "" + +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 +#, c-format +msgid "'%s' cannot be used with '%s'" +msgstr "" + +#: builtin/checkout.c:1069 +#, c-format +msgid "Cannot switch branch to a non-commit '%s'" +msgstr "" + +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 +msgid "branch" +msgstr "клон" + +#: builtin/checkout.c:1092 +msgid "create and checkout a new branch" +msgstr "" + +#: builtin/checkout.c:1094 +msgid "create/reset and checkout a branch" +msgstr "" + +#: builtin/checkout.c:1095 +msgid "create reflog for new branch" +msgstr "" + +#: builtin/checkout.c:1096 +msgid "detach the HEAD at named commit" +msgstr "" + +#: builtin/checkout.c:1097 +msgid "set upstream info for new branch" +msgstr "" + +#: builtin/checkout.c:1099 +msgid "new branch" +msgstr "" + +#: builtin/checkout.c:1099 +msgid "new unparented branch" +msgstr "" + +#: builtin/checkout.c:1100 +msgid "checkout our version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1102 +msgid "checkout their version for unmerged files" +msgstr "" + +#: builtin/checkout.c:1104 +msgid "force checkout (throw away local modifications)" +msgstr "" + +#: builtin/checkout.c:1105 +msgid "perform a 3-way merge with the new branch" +msgstr "" + +#: builtin/checkout.c:1106 builtin/merge.c:225 +msgid "update ignored files (default)" +msgstr "" + +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 +msgid "style" +msgstr "Ñтил" + +#: builtin/checkout.c:1108 +msgid "conflict style (merge or diff3)" +msgstr "" + +#: builtin/checkout.c:1111 +msgid "do not limit pathspecs to sparse entries only" +msgstr "" + +#: builtin/checkout.c:1113 +msgid "second guess 'git checkout no-such-branch'" +msgstr "" + +#: builtin/checkout.c:1136 +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "" + +#: builtin/checkout.c:1153 +msgid "--track needs a branch name" +msgstr "" + +#: builtin/checkout.c:1160 +msgid "Missing branch name; try -b" +msgstr "" + +#: builtin/checkout.c:1197 +msgid "invalid path specification" +msgstr "" + +#: builtin/checkout.c:1204 +#, c-format +msgid "" +"Cannot update paths and switch to branch '%s' at the same time.\n" +"Did you intend to checkout '%s' which can not be resolved as commit?" +msgstr "" + +#: builtin/checkout.c:1209 +#, c-format +msgid "git checkout: --detach does not take a path argument '%s'" +msgstr "" + +#: builtin/checkout.c:1213 +msgid "" +"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" +"checking out of the index." +msgstr "" + +#: builtin/clean.c:26 +msgid "" +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +msgstr "" + +#: builtin/clean.c:30 +#, c-format +msgid "Removing %s\n" +msgstr "" + +#: builtin/clean.c:31 +#, c-format +msgid "Would remove %s\n" +msgstr "" + +#: builtin/clean.c:32 +#, c-format +msgid "Skipping repository %s\n" +msgstr "" + +#: builtin/clean.c:33 +#, c-format +msgid "Would skip repository %s\n" +msgstr "" + +#: builtin/clean.c:34 +#, c-format +msgid "failed to remove %s" +msgstr "" + +#: builtin/clean.c:294 +msgid "" +"Prompt help:\n" +"1 - select a numbered item\n" +"foo - select item based on unique prefix\n" +" - (empty) select nothing" +msgstr "" + +#: builtin/clean.c:298 +msgid "" +"Prompt help:\n" +"1 - select a single item\n" +"3-5 - select a range of items\n" +"2-3,6-9 - select multiple ranges\n" +"foo - select item based on unique prefix\n" +"-... - unselect specified items\n" +"* - choose all items\n" +" - (empty) finish selecting" +msgstr "" + +#: builtin/clean.c:516 +#, c-format +msgid "Huh (%s)?" +msgstr "" + +#: builtin/clean.c:659 +#, c-format +msgid "Input ignore patterns>> " +msgstr "" + +#: builtin/clean.c:696 +#, c-format +msgid "WARNING: Cannot find items matched by: %s" +msgstr "" + +#: builtin/clean.c:717 +msgid "Select items to delete" +msgstr "" + +#: builtin/clean.c:757 +#, c-format +msgid "remove %s? " +msgstr "" + +#: builtin/clean.c:782 +msgid "Bye." +msgstr "" + +#: builtin/clean.c:790 +msgid "" +"clean - start cleaning\n" +"filter by pattern - exclude items from deletion\n" +"select by numbers - select items to be deleted by numbers\n" +"ask each - confirm each deletion (like \"rm -i\")\n" +"quit - stop cleaning\n" +"help - this screen\n" +"? - help for prompt selection" +msgstr "" + +#: builtin/clean.c:817 +msgid "*** Commands ***" +msgstr "" + +#: builtin/clean.c:818 +msgid "What now" +msgstr "" + +#: builtin/clean.c:826 +msgid "Would remove the following item:" +msgid_plural "Would remove the following items:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/clean.c:843 +msgid "No more files to clean, exiting." +msgstr "" + +#: builtin/clean.c:874 +msgid "do not print names of files removed" +msgstr "" + +#: builtin/clean.c:876 +msgid "force" +msgstr "" + +#: builtin/clean.c:877 +msgid "interactive cleaning" +msgstr "" + +#: builtin/clean.c:879 +msgid "remove whole directories" +msgstr "" + +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 +msgid "pattern" +msgstr "" + +#: builtin/clean.c:881 +msgid "add <pattern> to ignore rules" +msgstr "" + +#: builtin/clean.c:882 +msgid "remove ignored files, too" +msgstr "" + +#: builtin/clean.c:884 +msgid "remove only ignored files" +msgstr "" + +#: builtin/clean.c:902 +msgid "-x and -X cannot be used together" +msgstr "" + +#: builtin/clean.c:906 +msgid "" +"clean.requireForce set to true and neither -i, -n nor -f given; refusing to " +"clean" +msgstr "" + +#: builtin/clean.c:909 +msgid "" +"clean.requireForce defaults to true and neither -i, -n nor -f given; " +"refusing to clean" +msgstr "" + +#: builtin/clone.c:36 +msgid "git clone [options] [--] <repo> [<dir>]" +msgstr "" + +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 +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:71 +msgid "create a mirror repository (implies bare)" +msgstr "" + +#: builtin/clone.c:73 +msgid "to clone from a local repository" +msgstr "" + +#: builtin/clone.c:75 +msgid "don't use local hardlinks, always copy" +msgstr "" + +#: builtin/clone.c:77 +msgid "setup as shared repository" +msgstr "" + +#: builtin/clone.c:79 builtin/clone.c:81 +msgid "initialize submodules in the clone" +msgstr "" + +#: builtin/clone.c:82 builtin/init-db.c:485 +msgid "template-directory" +msgstr "" + +#: builtin/clone.c:83 builtin/init-db.c:486 +msgid "directory from which templates will be used" +msgstr "" + +#: builtin/clone.c:85 +msgid "reference repository" +msgstr "" + +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 +msgid "name" +msgstr "" + +#: builtin/clone.c:87 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "" + +#: builtin/clone.c:89 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "" + +#: builtin/clone.c:91 +msgid "path to git-upload-pack on the remote" +msgstr "" + +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 +msgid "depth" +msgstr "" + +#: builtin/clone.c:93 +msgid "create a shallow clone of that depth" +msgstr "" + +#: builtin/clone.c:95 +msgid "clone only one branch, HEAD or --branch" +msgstr "" + +#: builtin/clone.c:96 builtin/init-db.c:494 +msgid "gitdir" +msgstr "" + +#: builtin/clone.c:97 builtin/init-db.c:495 +msgid "separate git dir from working tree" +msgstr "" + +#: builtin/clone.c:98 +msgid "key=value" +msgstr "" + +#: builtin/clone.c:99 +msgid "set config inside the new repository" +msgstr "" + +#: builtin/clone.c:252 +#, c-format +msgid "reference repository '%s' is not a local repository." +msgstr "" + +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "" + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "" + +#: builtin/clone.c:321 +#, c-format +msgid "failed to create directory '%s'" +msgstr "" + +#: builtin/clone.c:323 builtin/diff.c:83 +#, c-format +msgid "failed to stat '%s'" +msgstr "" + +#: builtin/clone.c:325 +#, c-format +msgid "%s exists and is not a directory" +msgstr "" + +#: builtin/clone.c:339 +#, c-format +msgid "failed to stat %s\n" +msgstr "" + +#: builtin/clone.c:361 +#, c-format +msgid "failed to create link '%s'" +msgstr "" + +#: builtin/clone.c:365 +#, c-format +msgid "failed to copy file to '%s'" +msgstr "" + +#: builtin/clone.c:388 builtin/clone.c:565 +#, c-format +msgid "done.\n" +msgstr "" + +#: builtin/clone.c:401 +msgid "" +"Clone succeeded, but checkout failed.\n" +"You can inspect what was checked out with 'git status'\n" +"and retry the checkout with 'git checkout -f HEAD'\n" +msgstr "" + +#: builtin/clone.c:480 +#, c-format +msgid "Could not find remote branch %s to clone." +msgstr "" + +#: builtin/clone.c:560 +#, c-format +msgid "Checking connectivity... " +msgstr "" + +#: builtin/clone.c:563 +msgid "remote did not send all necessary objects" +msgstr "" + +#: builtin/clone.c:626 +msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" +msgstr "" + +#: builtin/clone.c:657 +msgid "unable to checkout working tree" +msgstr "" + +#: builtin/clone.c:765 +msgid "Too many arguments." +msgstr "" + +#: builtin/clone.c:769 +msgid "You must specify a repository to clone." +msgstr "" + +#: builtin/clone.c:780 +#, c-format +msgid "--bare and --origin %s options are incompatible." +msgstr "" + +#: builtin/clone.c:783 +msgid "--bare and --separate-git-dir are incompatible." +msgstr "" + +#: builtin/clone.c:796 +#, c-format +msgid "repository '%s' does not exist" +msgstr "" + +#: builtin/clone.c:802 +msgid "--depth is ignored in local clones; use file:// instead." +msgstr "" + +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "" + +#: builtin/clone.c:810 +msgid "--local is ignored" +msgstr "" + +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "" + +#: builtin/clone.c:824 +#, c-format +msgid "destination path '%s' already exists and is not an empty directory." +msgstr "" + +#: builtin/clone.c:834 +#, c-format +msgid "working tree '%s' already exists." +msgstr "" + +#: builtin/clone.c:847 builtin/clone.c:859 +#, c-format +msgid "could not create leading directories of '%s'" +msgstr "" + +#: builtin/clone.c:850 +#, c-format +msgid "could not create work tree dir '%s'." +msgstr "" + +#: builtin/clone.c:869 +#, c-format +msgid "Cloning into bare repository '%s'...\n" +msgstr "" + +#: builtin/clone.c:871 +#, c-format +msgid "Cloning into '%s'...\n" +msgstr "" + +#: builtin/clone.c:906 +#, c-format +msgid "Don't know how to clone %s" +msgstr "" + +#: builtin/clone.c:957 builtin/clone.c:965 +#, c-format +msgid "Remote branch %s not found in upstream %s" +msgstr "" + +#: builtin/clone.c:968 +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:36 +msgid "git commit [options] [--] <pathspec>..." +msgstr "" + +#: builtin/commit.c:41 +msgid "git status [options] [--] <pathspec>..." +msgstr "" + +#: builtin/commit.c:46 +msgid "" +"Your name and email address were configured automatically based\n" +"on your username and hostname. Please check that they are accurate.\n" +"You can suppress this message by setting them explicitly:\n" +"\n" +" git config --global user.name \"Your Name\"\n" +" git config --global user.email you@example.com\n" +"\n" +"After doing this, you may fix the identity used for this commit with:\n" +"\n" +" git commit --amend --reset-author\n" +msgstr "" + +#: builtin/commit.c:58 +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:63 +msgid "" +"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" +"If you wish to commit it anyway, use:\n" +"\n" +" git commit --allow-empty\n" +"\n" +msgstr "" + +#: builtin/commit.c:70 +msgid "Otherwise, please use 'git reset'\n" +msgstr "" + +#: builtin/commit.c:73 +msgid "" +"If you wish to skip this commit, use:\n" +"\n" +" git reset\n" +"\n" +"Then \"git cherry-pick --continue\" will resume cherry-picking\n" +"the remaining commits.\n" +msgstr "" + +#: builtin/commit.c:287 +msgid "failed to unpack HEAD tree object" +msgstr "" + +#: builtin/commit.c:329 +msgid "unable to create temporary index" +msgstr "" + +#: builtin/commit.c:335 +msgid "interactive add failed" +msgstr "" + +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 +msgid "unable to write new_index file" +msgstr "" + +#: builtin/commit.c:420 +msgid "cannot do a partial commit during a merge." +msgstr "" + +#: builtin/commit.c:422 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "" + +#: builtin/commit.c:432 +msgid "cannot read the index" +msgstr "" + +#: builtin/commit.c:452 +msgid "unable to write temporary index file" +msgstr "" + +#: builtin/commit.c:543 builtin/commit.c:549 +#, c-format +msgid "invalid commit: %s" +msgstr "" + +#: builtin/commit.c:571 +msgid "malformed --author parameter" +msgstr "" + +#: builtin/commit.c:591 +#, c-format +msgid "Malformed ident string: '%s'" +msgstr "" + +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 +#, c-format +msgid "could not lookup commit %s" +msgstr "" + +#: builtin/commit.c:642 builtin/shortlog.c:273 +#, c-format +msgid "(reading log message from standard input)\n" +msgstr "" + +#: builtin/commit.c:644 +msgid "could not read log from standard input" +msgstr "" + +#: builtin/commit.c:648 +#, c-format +msgid "could not read log file '%s'" +msgstr "" + +#: builtin/commit.c:654 +msgid "commit has empty message" +msgstr "" + +#: builtin/commit.c:670 +msgid "could not read MERGE_MSG" +msgstr "" + +#: builtin/commit.c:674 +msgid "could not read SQUASH_MSG" +msgstr "" + +#: builtin/commit.c:678 +#, c-format +msgid "could not read '%s'" +msgstr "" + +#: builtin/commit.c:749 +msgid "could not write commit template" +msgstr "" + +# FIXME +#: builtin/commit.c:760 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a merge.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" + +# FIXME +#: builtin/commit.c:765 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" + +#: builtin/commit.c:777 +#, c-format +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '%c' will be ignored, and an empty message aborts the commit.\n" +msgstr "" + +#: builtin/commit.c:782 +#, c-format +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '%c' will be kept; you may remove them yourself if you want to.\n" +"An empty message aborts the commit.\n" +msgstr "" + +#: builtin/commit.c:795 +#, c-format +msgid "%sAuthor: %s" +msgstr "" + +#: builtin/commit.c:802 +#, c-format +msgid "%sCommitter: %s" +msgstr "" + +#: builtin/commit.c:822 +msgid "Cannot read index" +msgstr "" + +#: builtin/commit.c:865 +msgid "Error building trees" +msgstr "" + +#: builtin/commit.c:880 builtin/tag.c:359 +#, c-format +msgid "Please supply the message using either -m or -F option.\n" +msgstr "" + +#: builtin/commit.c:982 +#, c-format +msgid "No existing author found with '%s'" +msgstr "" + +#: builtin/commit.c:997 builtin/commit.c:1237 +#, c-format +msgid "Invalid untracked files mode '%s'" +msgstr "" + +#: builtin/commit.c:1034 +msgid "--long and -z are incompatible" +msgstr "" + +#: builtin/commit.c:1064 +msgid "Using both --reset-author and --author does not make sense" +msgstr "" + +#: builtin/commit.c:1075 +msgid "You have nothing to amend." +msgstr "" + +#: builtin/commit.c:1078 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "" + +#: builtin/commit.c:1080 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "" + +#: builtin/commit.c:1083 +msgid "Options --squash and --fixup cannot be used together" +msgstr "" + +#: builtin/commit.c:1093 +msgid "Only one of -c/-C/-F/--fixup can be used." +msgstr "" + +#: builtin/commit.c:1095 +msgid "Option -m cannot be combined with -c/-C/-F/--fixup." +msgstr "" + +#: builtin/commit.c:1103 +msgid "--reset-author can be used only with -C, -c or --amend." +msgstr "" + +#: builtin/commit.c:1120 +msgid "Only one of --include/--only/--all/--interactive/--patch can be used." +msgstr "" + +#: builtin/commit.c:1122 +msgid "No paths with --include/--only does not make sense." +msgstr "" + +#: builtin/commit.c:1124 +msgid "Clever... amending the last one with dirty index." +msgstr "" + +#: builtin/commit.c:1126 +msgid "Explicit paths specified without -i nor -o; assuming --only paths..." +msgstr "" + +#: builtin/commit.c:1136 builtin/tag.c:572 +#, c-format +msgid "Invalid cleanup mode %s" +msgstr "" + +#: builtin/commit.c:1141 +msgid "Paths with -a does not make sense." +msgstr "" + +#: builtin/commit.c:1251 builtin/commit.c:1482 +msgid "show status concisely" +msgstr "" + +#: builtin/commit.c:1253 builtin/commit.c:1484 +msgid "show branch information" +msgstr "" + +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 +msgid "machine-readable output" +msgstr "" + +#: builtin/commit.c:1258 builtin/commit.c:1488 +msgid "show status in long format (default)" +msgstr "" + +#: builtin/commit.c:1261 builtin/commit.c:1491 +msgid "terminate entries with NUL" +msgstr "" + +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 +msgid "mode" +msgstr "" + +#: builtin/commit.c:1264 builtin/commit.c:1494 +msgid "show untracked files, optional modes: all, normal, no. (Default: all)" +msgstr "" + +#: builtin/commit.c:1267 +msgid "show ignored files" +msgstr "" + +#: builtin/commit.c:1268 parse-options.h:156 +msgid "when" +msgstr "кога" + +#: builtin/commit.c:1269 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "" + +#: builtin/commit.c:1271 +msgid "list untracked files in columns" +msgstr "" + +#: builtin/commit.c:1340 +msgid "couldn't look up newly created commit" +msgstr "" + +#: builtin/commit.c:1342 +msgid "could not parse newly created commit" +msgstr "" + +#: builtin/commit.c:1383 +msgid "detached HEAD" +msgstr "" + +#: builtin/commit.c:1385 +msgid " (root-commit)" +msgstr "" + +#: builtin/commit.c:1452 +msgid "suppress summary after successful commit" +msgstr "" + +#: builtin/commit.c:1453 +msgid "show diff in commit message template" +msgstr "" + +#: builtin/commit.c:1455 +msgid "Commit message options" +msgstr "" + +#: builtin/commit.c:1456 builtin/tag.c:457 +msgid "read message from file" +msgstr "" + +#: builtin/commit.c:1457 +msgid "author" +msgstr "" + +#: builtin/commit.c:1457 +msgid "override author for commit" +msgstr "" + +#: builtin/commit.c:1458 builtin/gc.c:261 +msgid "date" +msgstr "дата" + +#: builtin/commit.c:1458 +msgid "override date for commit" +msgstr "" + +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 +#: builtin/notes.c:562 builtin/tag.c:455 +msgid "message" +msgstr "" + +#: builtin/commit.c:1459 +msgid "commit message" +msgstr "" + +#: builtin/commit.c:1460 +msgid "reuse and edit message from specified commit" +msgstr "" + +#: builtin/commit.c:1461 +msgid "reuse message from specified commit" +msgstr "" + +#: builtin/commit.c:1462 +msgid "use autosquash formatted message to fixup specified commit" +msgstr "" + +#: builtin/commit.c:1463 +msgid "use autosquash formatted message to squash specified commit" +msgstr "" + +#: builtin/commit.c:1464 +msgid "the commit is authored by me now (used with -C/-c/--amend)" +msgstr "" + +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 +msgid "add Signed-off-by:" +msgstr "" + +#: builtin/commit.c:1466 +msgid "use specified template file" +msgstr "" + +#: builtin/commit.c:1467 +msgid "force edit of commit" +msgstr "" + +#: builtin/commit.c:1468 +msgid "default" +msgstr "" + +#: builtin/commit.c:1468 builtin/tag.c:460 +msgid "how to strip spaces and #comments from message" +msgstr "" + +#: builtin/commit.c:1469 +msgid "include status in commit message template" +msgstr "" + +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 +msgid "key id" +msgstr "" + +#: builtin/commit.c:1471 builtin/merge.c:224 +msgid "GPG sign commit" +msgstr "" + +#. end commit message options +#: builtin/commit.c:1474 +msgid "Commit contents options" +msgstr "" + +#: builtin/commit.c:1475 +msgid "commit all changed files" +msgstr "" + +#: builtin/commit.c:1476 +msgid "add specified files to index for commit" +msgstr "" + +#: builtin/commit.c:1477 +msgid "interactively add files" +msgstr "" + +#: builtin/commit.c:1478 +msgid "interactively add changes" +msgstr "" + +#: builtin/commit.c:1479 +msgid "commit only specified files" +msgstr "" + +#: builtin/commit.c:1480 +msgid "bypass pre-commit hook" +msgstr "" + +#: builtin/commit.c:1481 +msgid "show what would be committed" +msgstr "" + +#: builtin/commit.c:1492 +msgid "amend previous commit" +msgstr "" + +#: builtin/commit.c:1493 +msgid "bypass post-rewrite hook" +msgstr "" + +#: builtin/commit.c:1498 +msgid "ok to record an empty change" +msgstr "" + +#: builtin/commit.c:1500 +msgid "ok to record a change with an empty message" +msgstr "" + +#: builtin/commit.c:1529 +msgid "could not parse HEAD commit" +msgstr "" + +#: builtin/commit.c:1567 builtin/merge.c:518 +#, c-format +msgid "could not open '%s' for reading" +msgstr "" + +#: builtin/commit.c:1574 +#, c-format +msgid "Corrupt MERGE_HEAD file (%s)" +msgstr "" + +#: builtin/commit.c:1581 +msgid "could not read MERGE_MODE" +msgstr "" + +#: builtin/commit.c:1600 +#, c-format +msgid "could not read commit message: %s" +msgstr "" + +#: builtin/commit.c:1611 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "" + +#: builtin/commit.c:1616 +#, c-format +msgid "Aborting commit due to empty commit message.\n" +msgstr "" + +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 +msgid "failed to write commit object" +msgstr "" + +#: builtin/commit.c:1652 +msgid "cannot lock HEAD ref" +msgstr "" + +#: builtin/commit.c:1656 +msgid "cannot update HEAD ref" +msgstr "" + +#: builtin/commit.c:1667 +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:8 +msgid "git config [options]" +msgstr "" + +#: builtin/config.c:54 +msgid "Config file location" +msgstr "" + +#: builtin/config.c:55 +msgid "use global config file" +msgstr "" + +#: builtin/config.c:56 +msgid "use system config file" +msgstr "" + +#: builtin/config.c:57 +msgid "use repository config file" +msgstr "" + +#: builtin/config.c:58 +msgid "use given config file" +msgstr "" + +#: builtin/config.c:59 +msgid "blob-id" +msgstr "" + +#: builtin/config.c:59 +msgid "read config from given blob object" +msgstr "" + +#: builtin/config.c:60 +msgid "Action" +msgstr "" + +#: builtin/config.c:61 +msgid "get value: name [value-regex]" +msgstr "" + +#: builtin/config.c:62 +msgid "get all values: key [value-regex]" +msgstr "" + +#: builtin/config.c:63 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "" + +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "" + +#: builtin/config.c:65 +msgid "replace all matching variables: name value [value_regex]" +msgstr "" + +#: builtin/config.c:66 +msgid "add a new variable: name value" +msgstr "" + +#: builtin/config.c:67 +msgid "remove a variable: name [value-regex]" +msgstr "" + +#: builtin/config.c:68 +msgid "remove all matches: name [value-regex]" +msgstr "" + +#: builtin/config.c:69 +msgid "rename section: old-name new-name" +msgstr "" + +#: builtin/config.c:70 +msgid "remove a section: name" +msgstr "" + +#: builtin/config.c:71 +msgid "list all" +msgstr "" + +#: builtin/config.c:72 +msgid "open an editor" +msgstr "" + +#: builtin/config.c:73 builtin/config.c:74 +msgid "slot" +msgstr "" + +#: builtin/config.c:73 +msgid "find the color configured: [default]" +msgstr "" + +#: builtin/config.c:74 +msgid "find the color setting: [stdout-is-tty]" +msgstr "" + +#: builtin/config.c:75 +msgid "Type" +msgstr "" + +#: builtin/config.c:76 +msgid "value is \"true\" or \"false\"" +msgstr "" + +#: builtin/config.c:77 +msgid "value is decimal number" +msgstr "" + +#: builtin/config.c:78 +msgid "value is --bool or --int" +msgstr "" + +#: builtin/config.c:79 +msgid "value is a path (file or directory name)" +msgstr "" + +#: builtin/config.c:80 +msgid "Other" +msgstr "" + +#: builtin/config.c:81 +msgid "terminate values with NUL byte" +msgstr "" + +#: builtin/config.c:82 +msgid "respect include directives on lookup" +msgstr "" + +#: builtin/count-objects.c:82 +msgid "git count-objects [-v] [-H | --human-readable]" +msgstr "" + +#: builtin/count-objects.c:97 +msgid "print sizes in human readable format" +msgstr "" + +#: builtin/describe.c:16 +msgid "git describe [options] <commit-ish>*" +msgstr "" + +#: builtin/describe.c:17 +msgid "git describe [options] --dirty" +msgstr "" + +#: builtin/describe.c:237 +#, c-format +msgid "annotated tag %s not available" +msgstr "" + +#: builtin/describe.c:241 +#, c-format +msgid "annotated tag %s has no embedded name" +msgstr "" + +#: builtin/describe.c:243 +#, c-format +msgid "tag '%s' is really '%s' here" +msgstr "" + +#: builtin/describe.c:270 +#, c-format +msgid "Not a valid object name %s" +msgstr "" + +#: builtin/describe.c:273 +#, c-format +msgid "%s is not a valid '%s' object" +msgstr "" + +#: builtin/describe.c:290 +#, c-format +msgid "no tag exactly matches '%s'" +msgstr "" + +#: builtin/describe.c:292 +#, c-format +msgid "searching to describe %s\n" +msgstr "" + +#: builtin/describe.c:332 +#, c-format +msgid "finished search at %s\n" +msgstr "" + +#: builtin/describe.c:359 +#, c-format +msgid "" +"No annotated tags can describe '%s'.\n" +"However, there were unannotated tags: try --tags." +msgstr "" + +#: builtin/describe.c:363 +#, c-format +msgid "" +"No tags can describe '%s'.\n" +"Try --always, or create some tags." +msgstr "" + +#: builtin/describe.c:384 +#, c-format +msgid "traversed %lu commits\n" +msgstr "" + +#: builtin/describe.c:387 +#, c-format +msgid "" +"more than %i tags found; listed %i most recent\n" +"gave up search at %s\n" +msgstr "" + +#: builtin/describe.c:409 +msgid "find the tag that comes after the commit" +msgstr "" + +#: builtin/describe.c:410 +msgid "debug search strategy on stderr" +msgstr "" + +#: builtin/describe.c:411 +msgid "use any ref" +msgstr "" + +#: builtin/describe.c:412 +msgid "use any tag, even unannotated" +msgstr "" + +#: builtin/describe.c:413 +msgid "always use long format" +msgstr "" + +#: builtin/describe.c:414 +msgid "only follow first parent" +msgstr "" + +#: builtin/describe.c:417 +msgid "only output exact matches" +msgstr "" + +#: builtin/describe.c:419 +#, fuzzy +msgid "consider <n> most recent tags (default: 10)" +msgstr "<брой>" + +#: builtin/describe.c:421 +msgid "only consider tags matching <pattern>" +msgstr "" + +#: builtin/describe.c:423 builtin/name-rev.c:321 +msgid "show abbreviated commit object as fallback" +msgstr "" + +#: builtin/describe.c:424 +msgid "mark" +msgstr "" + +#: builtin/describe.c:425 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "" + +#: builtin/describe.c:443 +msgid "--long is incompatible with --abbrev=0" +msgstr "" + +#: builtin/describe.c:469 +msgid "No names found, cannot describe anything." +msgstr "" + +#: builtin/describe.c:489 +msgid "--dirty is incompatible with commit-ishes" +msgstr "" + +#: builtin/diff.c:85 +#, c-format +msgid "'%s': not a regular file or symlink" +msgstr "" + +#: builtin/diff.c:236 +#, c-format +msgid "invalid option: %s" +msgstr "" + +#: builtin/diff.c:357 +msgid "Not a git repository" +msgstr "" + +#: builtin/diff.c:400 +#, c-format +msgid "invalid object '%s' given." +msgstr "" + +#: builtin/diff.c:409 +#, c-format +msgid "more than two blobs given: '%s'" +msgstr "" + +#: builtin/diff.c:416 +#, c-format +msgid "unhandled object '%s' given." +msgstr "" + +#: builtin/fast-export.c:22 +msgid "git fast-export [rev-list-opts]" +msgstr "" + +#: builtin/fast-export.c:673 +#, fuzzy +msgid "show progress after <n> objects" +msgstr "<брой>" + +#: builtin/fast-export.c:675 +msgid "select handling of signed tags" +msgstr "" + +#: builtin/fast-export.c:678 +msgid "select handling of tags that tag filtered objects" +msgstr "" + +#: builtin/fast-export.c:681 +msgid "Dump marks to this file" +msgstr "" + +#: builtin/fast-export.c:683 +msgid "Import marks from this file" +msgstr "" + +#: builtin/fast-export.c:685 +msgid "Fake a tagger when tags lack one" +msgstr "" + +#: builtin/fast-export.c:687 +msgid "Output full tree for each commit" +msgstr "" + +#: builtin/fast-export.c:689 +msgid "Use the done feature to terminate the stream" +msgstr "" + +#: builtin/fast-export.c:690 +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:75 +msgid "fetch from all remotes" +msgstr "" + +#: builtin/fetch.c:77 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "" + +#: builtin/fetch.c:79 +msgid "path to upload pack on remote end" +msgstr "" + +#: builtin/fetch.c:80 +msgid "force overwrite of local branch" +msgstr "" + +#: builtin/fetch.c:82 +msgid "fetch from multiple remotes" +msgstr "" + +#: builtin/fetch.c:84 +msgid "fetch all tags and associated objects" +msgstr "" + +#: builtin/fetch.c:86 +msgid "do not fetch all tags (--no-tags)" +msgstr "" + +#: builtin/fetch.c:88 +msgid "prune remote-tracking branches no longer on remote" +msgstr "" + +#: builtin/fetch.c:89 +msgid "on-demand" +msgstr "" + +#: builtin/fetch.c:90 +msgid "control recursive fetching of submodules" +msgstr "" + +#: builtin/fetch.c:94 +msgid "keep downloaded pack" +msgstr "" + +#: builtin/fetch.c:96 +msgid "allow updating of HEAD ref" +msgstr "" + +#: builtin/fetch.c:99 +msgid "deepen history of shallow clone" +msgstr "" + +#: builtin/fetch.c:101 +msgid "convert to a complete repository" +msgstr "" + +#: builtin/fetch.c:103 builtin/log.c:1197 +msgid "dir" +msgstr "" + +#: builtin/fetch.c:104 +msgid "prepend this to submodule path output" +msgstr "" + +#: builtin/fetch.c:107 +msgid "default mode for recursion" +msgstr "" + +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "" + +#: builtin/fetch.c:347 +msgid "Couldn't find remote ref HEAD" +msgstr "" + +#: builtin/fetch.c:411 +#, c-format +msgid "object %s not found" +msgstr "" + +#: builtin/fetch.c:416 +msgid "[up to date]" +msgstr "" + +#: builtin/fetch.c:430 +#, c-format +msgid "! %-*s %-*s -> %s (can't fetch in current branch)" +msgstr "" + +#: builtin/fetch.c:431 builtin/fetch.c:517 +msgid "[rejected]" +msgstr "" + +#: builtin/fetch.c:442 +msgid "[tag update]" +msgstr "" + +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 +msgid " (unable to update local ref)" +msgstr "" + +#: builtin/fetch.c:462 +msgid "[new tag]" +msgstr "" + +#: builtin/fetch.c:465 +msgid "[new branch]" +msgstr "" + +#: builtin/fetch.c:468 +msgid "[new ref]" +msgstr "" + +#: builtin/fetch.c:513 +msgid "unable to update local ref" +msgstr "" + +#: builtin/fetch.c:513 +msgid "forced update" +msgstr "" + +#: builtin/fetch.c:519 +msgid "(non-fast-forward)" +msgstr "" + +#: builtin/fetch.c:552 builtin/fetch.c:785 +#, c-format +msgid "cannot open %s: %s\n" +msgstr "" + +#: builtin/fetch.c:561 +#, c-format +msgid "%s did not send all necessary objects\n" +msgstr "" + +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "" + +#: builtin/fetch.c:667 builtin/fetch.c:750 +#, c-format +msgid "From %.*s\n" +msgstr "" + +#: builtin/fetch.c:678 +#, c-format +msgid "" +"some local refs could not be updated; try running\n" +" 'git remote prune %s' to remove any old, conflicting branches" +msgstr "" + +#: builtin/fetch.c:730 +#, c-format +msgid " (%s will become dangling)" +msgstr "" + +#: builtin/fetch.c:731 +#, c-format +msgid " (%s has become dangling)" +msgstr "" + +#: builtin/fetch.c:755 +msgid "[deleted]" +msgstr "" + +#: builtin/fetch.c:756 builtin/remote.c:1050 +msgid "(none)" +msgstr "(нищо)" + +#: builtin/fetch.c:775 +#, c-format +msgid "Refusing to fetch into current branch %s of non-bare repository" +msgstr "" + +#: builtin/fetch.c:794 +#, c-format +msgid "Option \"%s\" value \"%s\" is not valid for %s" +msgstr "" + +#: builtin/fetch.c:797 +#, c-format +msgid "Option \"%s\" is ignored for %s\n" +msgstr "" + +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "" + +#: builtin/fetch.c:1015 +#, c-format +msgid "Fetching %s\n" +msgstr "" + +#: builtin/fetch.c:1017 builtin/remote.c:90 +#, c-format +msgid "Could not fetch %s" +msgstr "„%s“ не може да Ñе доÑтави" + +#: builtin/fetch.c:1036 +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:1059 +msgid "You need to specify a tag name." +msgstr "" + +#: builtin/fetch.c:1107 +msgid "--depth and --unshallow cannot be used together" +msgstr "" + +#: builtin/fetch.c:1109 +msgid "--unshallow on a complete repository does not make sense" +msgstr "" + +#: builtin/fetch.c:1132 +msgid "fetch --all does not take a repository argument" +msgstr "" + +#: builtin/fetch.c:1134 +msgid "fetch --all does not make sense with refspecs" +msgstr "" + +#: builtin/fetch.c:1145 +#, c-format +msgid "No such remote or remote group: %s" +msgstr "" + +#: builtin/fetch.c:1153 +msgid "Fetching a group and specifying refspecs does not make sense" +msgstr "" + +#: builtin/fmt-merge-msg.c:13 +#, fuzzy +msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" +msgstr "<брой>" + +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/show-branch.c:654 builtin/show-ref.c:178 +#: builtin/tag.c:446 parse-options.h:135 parse-options.h:242 +msgid "n" +msgstr "брой" + +#: builtin/fmt-merge-msg.c:664 +#, fuzzy +msgid "populate log with at most <n> entries from shortlog" +msgstr "<брой>" + +#: builtin/fmt-merge-msg.c:667 +msgid "alias for --log (deprecated)" +msgstr "" + +#: builtin/fmt-merge-msg.c:670 +msgid "text" +msgstr "" + +#: builtin/fmt-merge-msg.c:671 +msgid "use <text> as start of message" +msgstr "" + +#: builtin/fmt-merge-msg.c:672 +msgid "file to read from" +msgstr "" + +#: builtin/for-each-ref.c:1063 +msgid "git for-each-ref [options] [<pattern>]" +msgstr "" + +#: builtin/for-each-ref.c:1078 +msgid "quote placeholders suitably for shells" +msgstr "" + +#: builtin/for-each-ref.c:1080 +msgid "quote placeholders suitably for perl" +msgstr "" + +#: builtin/for-each-ref.c:1082 +msgid "quote placeholders suitably for python" +msgstr "" + +#: builtin/for-each-ref.c:1084 +msgid "quote placeholders suitably for tcl" +msgstr "" + +#: builtin/for-each-ref.c:1087 +#, fuzzy +msgid "show only <n> matched refs" +msgstr "<брой>" + +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 +msgid "format" +msgstr "" + +#: builtin/for-each-ref.c:1088 +msgid "format to use for the output" +msgstr "" + +#: builtin/for-each-ref.c:1089 +msgid "key" +msgstr "" + +#: builtin/for-each-ref.c:1090 +msgid "field name to sort on" +msgstr "" + +#: builtin/fsck.c:607 +msgid "git fsck [options] [<object>...]" +msgstr "git fsck [ОПЦИИ] [<ОБЕКТ>…]" + +#: builtin/fsck.c:613 +msgid "show unreachable objects" +msgstr "показване на недоÑтижимите обекти" + +#: builtin/fsck.c:614 +msgid "show dangling objects" +msgstr "показване на обектите извън клоните" + +#: builtin/fsck.c:615 +msgid "report tags" +msgstr "показване на етикетите" + +#: builtin/fsck.c:616 +msgid "report root nodes" +msgstr "показване на кореновите възли" + +#: builtin/fsck.c:617 +msgid "make index objects head nodes" +msgstr "задаване на обекти от индекÑа да Ñа коренови" + +#: builtin/fsck.c:618 +#, fuzzy +msgid "make reflogs head nodes (default)" +msgstr "проÑледÑване на указателите от журнала като глави (Ñтандартно)" + +#: builtin/fsck.c:619 +#, fuzzy +msgid "also consider packs and alternate objects" +msgstr "допълнително да Ñе проверÑват пакетите и алтернативните обекти" + +#: builtin/fsck.c:620 +msgid "enable more strict checking" +msgstr "по-Ñтроги проверки" + +#: builtin/fsck.c:622 +msgid "write dangling objects in .git/lost-found" +msgstr "запазване на обектите извън клоните в директориÑта „.git/lost-found“" + +#: builtin/fsck.c:623 builtin/prune.c:144 +msgid "show progress" +msgstr "показване на напредъка" + +#: builtin/gc.c:24 +msgid "git gc [options]" +msgstr "git gc [ОПЦИИ]" + +#: builtin/gc.c:80 +#, c-format +msgid "Invalid %s: '%s'" +msgstr "Ðеправилна ÑтойноÑÑ‚ за „%s“: „%s“" + +#: builtin/gc.c:107 +#, c-format +msgid "insanely long object directory %.*s" +msgstr "прекалено дълга Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¾Ð±ÐµÐºÑ‚Ð¸ „%.*s“" + +#: builtin/gc.c:262 +msgid "prune unreferenced objects" +msgstr "окаÑтрÑне на обектите, към които нищо не Ñочи" + +#: builtin/gc.c:264 +msgid "be more thorough (increased runtime)" +msgstr "изчерпателно търÑене на боклука (за Ñметка на повече време работа)" + +#: builtin/gc.c:265 +msgid "enable auto-gc mode" +msgstr "включване на автоматичното Ñъбиране на боклука (auto-gc)" + +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "" +"изрично Ñтартиране на Ñъбирането на боклука, дори и ако вече работи друго " +"Ñъбиране" + +#: builtin/gc.c:306 +#, 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 "" +"Ðвтоматично пакетиране на хранилището за най-добра производителноÑÑ‚. Можете " +"и\n" +"ръчно да Ñтартирате „git gc“. За подробноÑти погледнете помощта: „git help " +"gc“.\n" + +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"Ñъбирането на боклука вече е Ñтартирано на машината „%s“ Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ на\n" +"процеÑа: %<PRIuMAX> (ако Ñте Ñигурни, че това не е вÑрно, това използвайте\n" +"опциÑта „--force“)" + +#: builtin/gc.c:341 +msgid "" +"There are too many unreachable loose objects; run 'git prune' to remove them." +msgstr "" +"Има прекалено много недоÑтижими, непакетирани обекти. Използвайте „git " +"prune“, за да\n" +"ги окаÑтрите." + +#: builtin/grep.c:23 +msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "" + +#: builtin/grep.c:218 +#, c-format +msgid "grep: failed to create thread: %s" +msgstr "" + +#: builtin/grep.c:365 +#, c-format +msgid "Failed to chdir: %s" +msgstr "" + +#: builtin/grep.c:443 builtin/grep.c:478 +#, c-format +msgid "unable to read tree (%s)" +msgstr "" + +#: builtin/grep.c:493 +#, c-format +msgid "unable to grep from object of type %s" +msgstr "" + +#: builtin/grep.c:551 +#, c-format +msgid "switch `%c' expects a numerical value" +msgstr "" + +#: builtin/grep.c:568 +#, c-format +msgid "cannot open '%s'" +msgstr "" + +#: builtin/grep.c:642 +msgid "search in index instead of in the work tree" +msgstr "" + +#: builtin/grep.c:644 +msgid "find in contents not managed by git" +msgstr "" + +#: builtin/grep.c:646 +msgid "search in both tracked and untracked files" +msgstr "" + +#: builtin/grep.c:648 +msgid "search also in ignored files" +msgstr "" + +#: builtin/grep.c:651 +msgid "show non-matching lines" +msgstr "" + +#: builtin/grep.c:653 +msgid "case insensitive matching" +msgstr "" + +#: builtin/grep.c:655 +msgid "match patterns only at word boundaries" +msgstr "" + +#: builtin/grep.c:657 +msgid "process binary files as text" +msgstr "" + +#: builtin/grep.c:659 +msgid "don't match patterns in binary files" +msgstr "" + +#: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "" + +#: builtin/grep.c:664 +msgid "descend at most <depth> levels" +msgstr "" + +#: builtin/grep.c:668 +msgid "use extended POSIX regular expressions" +msgstr "" + +#: builtin/grep.c:671 +msgid "use basic POSIX regular expressions (default)" +msgstr "" + +#: builtin/grep.c:674 +msgid "interpret patterns as fixed strings" +msgstr "" + +#: builtin/grep.c:677 +msgid "use Perl-compatible regular expressions" +msgstr "" + +#: builtin/grep.c:680 +msgid "show line numbers" +msgstr "" + +#: builtin/grep.c:681 +msgid "don't show filenames" +msgstr "" + +#: builtin/grep.c:682 +msgid "show filenames" +msgstr "" + +#: builtin/grep.c:684 +msgid "show filenames relative to top directory" +msgstr "" + +#: builtin/grep.c:686 +msgid "show only filenames instead of matching lines" +msgstr "" + +#: builtin/grep.c:688 +msgid "synonym for --files-with-matches" +msgstr "" + +#: builtin/grep.c:691 +msgid "show only the names of files without match" +msgstr "" + +#: builtin/grep.c:693 +msgid "print NUL after filenames" +msgstr "" + +#: builtin/grep.c:695 +msgid "show the number of matches instead of matching lines" +msgstr "" + +#: builtin/grep.c:696 +msgid "highlight matches" +msgstr "" + +#: builtin/grep.c:698 +msgid "print empty line between matches from different files" +msgstr "" + +#: builtin/grep.c:700 +msgid "show filename only once above matches from same file" +msgstr "" + +#: builtin/grep.c:703 +#, fuzzy +msgid "show <n> context lines before and after matches" +msgstr "<брой>" + +#: builtin/grep.c:706 +#, fuzzy +msgid "show <n> context lines before matches" +msgstr "<брой>" + +#: builtin/grep.c:708 +#, fuzzy +msgid "show <n> context lines after matches" +msgstr "<брой>" + +#: builtin/grep.c:709 +msgid "shortcut for -C NUM" +msgstr "" + +#: builtin/grep.c:712 +msgid "show a line with the function name before matches" +msgstr "" + +#: builtin/grep.c:714 +msgid "show the surrounding function" +msgstr "" + +#: builtin/grep.c:717 +msgid "read patterns from file" +msgstr "" + +#: builtin/grep.c:719 +msgid "match <pattern>" +msgstr "" + +#: builtin/grep.c:721 +msgid "combine patterns specified with -e" +msgstr "" + +#: builtin/grep.c:733 +msgid "indicate hit with exit status without output" +msgstr "" + +#: builtin/grep.c:735 +msgid "show only matches from files that match all patterns" +msgstr "" + +#: builtin/grep.c:737 +msgid "show parse tree for grep expression" +msgstr "" + +#: builtin/grep.c:741 +msgid "pager" +msgstr "" + +#: builtin/grep.c:741 +msgid "show matching files in the pager" +msgstr "" + +#: builtin/grep.c:744 +msgid "allow calling of grep(1) (ignored by this build)" +msgstr "" + +#: builtin/grep.c:745 builtin/show-ref.c:187 +msgid "show usage" +msgstr "" + +#: builtin/grep.c:812 +msgid "no pattern given." +msgstr "" + +#: builtin/grep.c:870 +msgid "--open-files-in-pager only works on the worktree" +msgstr "" + +#: builtin/grep.c:893 +msgid "--cached or --untracked cannot be used with --no-index." +msgstr "" + +#: builtin/grep.c:898 +msgid "--no-index or --untracked cannot be used with revs." +msgstr "" + +#: builtin/grep.c:901 +msgid "--[no-]exclude-standard cannot be used for tracked contents." +msgstr "" + +#: builtin/grep.c:909 +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:41 +msgid "print all available commands" +msgstr "показване на вÑички налични команди" + +#: builtin/help.c:42 +msgid "print list of useful guides" +msgstr "показване на ÑпиÑък Ñ Ð¿ÑŠÑ‚ÐµÐ²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ð¸" + +#: builtin/help.c:43 +msgid "show man page" +msgstr "показване на Ñтраница от ръководÑтвото" + +#: builtin/help.c:44 +msgid "show manual in web browser" +msgstr "показване на Ñтраница от ръководÑтвото в уеб браузър" + +#: builtin/help.c:46 +msgid "show info page" +msgstr "показване на информационна Ñтраница" + +#: builtin/help.c:52 +msgid "git help [--all] [--guides] [--man|--web|--info] [command]" +msgstr "git help [--all] [--guides] [--man|--web|--info] [КОМÐÐДÐ]" + +#: builtin/help.c:64 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "непознат формат на помощта „%s“" + +#: builtin/help.c:92 +msgid "Failed to start emacsclient." +msgstr "ÐеуÑпешно Ñтартиране на „emacsclient“." + +#: builtin/help.c:105 +msgid "Failed to parse emacsclient version." +msgstr "ВерÑиÑта на „emacsclient“ не може да Ñе анализира." + +#: builtin/help.c:113 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "Прекалено Ñтара верÑÐ¸Ñ Ð½Ð° „emacsclient“ — %d (< 22)." + +#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "неуÑпешно изпълнение на „%s“: %s" + +#: builtin/help.c:216 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"„%s“: път към неподдържана програма за разглеждане на\n" +" ръководÑтвото. ВмеÑто Ð½ÐµÑ Ð¿Ñ€Ð¾Ð±Ð²Ð°Ð¹Ñ‚Ðµ „man.<tool>.cmd“." + +#: builtin/help.c:228 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" +"„%s“: команда за поддържана програма за разглеждане на\n" +" ръководÑтвото. ВмеÑто Ð½ÐµÑ Ð¿Ñ€Ð¾Ð±Ð²Ð°Ð¹Ñ‚Ðµ „man.<tool>.path“." + +#: builtin/help.c:353 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "„%s“: непозната програма за преглед на ръководÑтвото." + +#: builtin/help.c:370 +msgid "no man viewer handled the request" +msgstr "Ð½Ð¸ÐºÐ¾Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° за ръководÑтво не уÑÐ¿Ñ Ð´Ð° обработи заÑвката" + +#: builtin/help.c:378 +msgid "no info viewer handled the request" +msgstr "Ð½Ð¸ÐºÐ¾Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° за информационни Ñтраници не уÑÐ¿Ñ Ð´Ð° обработи заÑвката" + +#: builtin/help.c:424 +msgid "Defining attributes per path" +msgstr "Указване на атрибути към път" + +#: builtin/help.c:425 +msgid "A Git glossary" +msgstr "Речник Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð¸Ñ‚Ðµ на Git" + +#: builtin/help.c:426 +msgid "Specifies intentionally untracked files to ignore" +msgstr "Указване на неÑледени файлове, които да бъдат нарочно пренебрегвани" + +#: builtin/help.c:427 +msgid "Defining submodule properties" +msgstr "Дефиниране на ÑвойÑтвата на подмодулите" + +#: builtin/help.c:428 +msgid "Specifying revisions and ranges for Git" +msgstr "Указване на верÑии и интервали в Git" + +#: builtin/help.c:429 +msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" +msgstr "Въвеждащ урок за Git (верÑии поне 1.5.1)" + +#: builtin/help.c:430 +msgid "An overview of recommended workflows with Git" +msgstr "Общ преглед на препоръчваните начини за работа Ñ Git" + +#: builtin/help.c:442 +msgid "The common Git guides are:\n" +msgstr "ПопулÑрните пътеводители в Git Ñа:\n" + +#: builtin/help.c:463 builtin/help.c:480 +#, c-format +msgid "usage: %s%s" +msgstr "употреба: %s%s" + +#: builtin/help.c:496 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "„git %s“ е Ñиноним на „%s“" + +#: builtin/index-pack.c:184 +#, c-format +msgid "object type mismatch at %s" +msgstr "" + +#: builtin/index-pack.c:204 +msgid "object of unexpected type" +msgstr "" + +#: builtin/index-pack.c:244 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:254 +msgid "early EOF" +msgstr "" + +#: builtin/index-pack.c:255 +msgid "read error on input" +msgstr "" + +#: builtin/index-pack.c:267 +msgid "used more bytes than were available" +msgstr "" + +#: builtin/index-pack.c:274 +msgid "pack too large for current definition of off_t" +msgstr "" + +#: builtin/index-pack.c:290 +#, c-format +msgid "unable to create '%s'" +msgstr "" + +#: builtin/index-pack.c:295 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "" + +#: builtin/index-pack.c:309 +msgid "pack signature mismatch" +msgstr "" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "" + +#: builtin/index-pack.c:329 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "" + +#: builtin/index-pack.c:451 +#, c-format +msgid "inflate returned %d" +msgstr "" + +#: builtin/index-pack.c:500 +msgid "offset value overflow for delta base object" +msgstr "" + +#: builtin/index-pack.c:508 +msgid "delta base offset is out of bound" +msgstr "" + +#: builtin/index-pack.c:516 +#, c-format +msgid "unknown object type %d" +msgstr "" + +#: builtin/index-pack.c:547 +msgid "cannot pread pack file" +msgstr "" + +#: builtin/index-pack.c:549 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:575 +msgid "serious inflate inconsistency" +msgstr "" + +#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695 +#: builtin/index-pack.c:729 builtin/index-pack.c:738 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "" + +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 +#, c-format +msgid "unable to read %s" +msgstr "" + +#: builtin/index-pack.c:735 +#, c-format +msgid "cannot read existing object %s" +msgstr "" + +#: builtin/index-pack.c:749 +#, c-format +msgid "invalid blob object %s" +msgstr "" + +#: builtin/index-pack.c:763 +#, c-format +msgid "invalid %s" +msgstr "" + +#: builtin/index-pack.c:766 +msgid "Error in object" +msgstr "" + +#: builtin/index-pack.c:768 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "" + +#: builtin/index-pack.c:839 builtin/index-pack.c:869 +msgid "failed to apply delta" +msgstr "" + +#: builtin/index-pack.c:1010 +msgid "Receiving objects" +msgstr "" + +#: builtin/index-pack.c:1010 +msgid "Indexing objects" +msgstr "" + +#: builtin/index-pack.c:1036 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "" + +#: builtin/index-pack.c:1041 +msgid "cannot fstat packfile" +msgstr "" + +#: builtin/index-pack.c:1044 +msgid "pack has junk at the end" +msgstr "" + +#: builtin/index-pack.c:1055 +msgid "confusion beyond insanity in parse_pack_objects()" +msgstr "" + +#: builtin/index-pack.c:1078 +msgid "Resolving deltas" +msgstr "" + +#: builtin/index-pack.c:1088 +#, c-format +msgid "unable to create thread: %s" +msgstr "" + +#: builtin/index-pack.c:1130 +msgid "confusion beyond insanity" +msgstr "" + +#: builtin/index-pack.c:1138 +#, c-format +msgid "completed with %d local objects" +msgstr "" + +#: builtin/index-pack.c:1148 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "" + +#: builtin/index-pack.c:1152 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1177 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "" + +#: builtin/index-pack.c:1256 +#, c-format +msgid "local object %s is corrupt" +msgstr "" + +#: builtin/index-pack.c:1280 +msgid "error while closing pack file" +msgstr "" + +#: builtin/index-pack.c:1293 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "" + +#: builtin/index-pack.c:1301 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "" + +#: builtin/index-pack.c:1314 +msgid "cannot store pack file" +msgstr "" + +#: builtin/index-pack.c:1325 +msgid "cannot store index file" +msgstr "" + +#: builtin/index-pack.c:1358 +#, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "" + +#: builtin/index-pack.c:1364 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "" + +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "" + +#: builtin/index-pack.c:1426 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "" + +#: builtin/index-pack.c:1428 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "" + +#: builtin/index-pack.c:1475 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1482 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1510 +msgid "Cannot come back to cwd" +msgstr "" + +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 +#, c-format +msgid "bad %s" +msgstr "" + +#: builtin/index-pack.c:1591 +msgid "--fix-thin cannot be used without --stdin" +msgstr "" + +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "" + +#: builtin/index-pack.c:1614 +msgid "--verify with no packfile name given" +msgstr "" + +#: builtin/init-db.c:35 +#, c-format +msgid "Could not make %s writable by group" +msgstr "" + +#: builtin/init-db.c:62 +#, c-format +msgid "insanely long template name %s" +msgstr "" + +#: builtin/init-db.c:67 +#, c-format +msgid "cannot stat '%s'" +msgstr "" + +#: builtin/init-db.c:73 +#, c-format +msgid "cannot stat template '%s'" +msgstr "" + +#: builtin/init-db.c:80 +#, c-format +msgid "cannot opendir '%s'" +msgstr "" + +#: builtin/init-db.c:97 +#, c-format +msgid "cannot readlink '%s'" +msgstr "" + +#: builtin/init-db.c:99 +#, c-format +msgid "insanely long symlink %s" +msgstr "" + +#: builtin/init-db.c:102 +#, c-format +msgid "cannot symlink '%s' '%s'" +msgstr "" + +#: builtin/init-db.c:106 +#, c-format +msgid "cannot copy '%s' to '%s'" +msgstr "" + +#: builtin/init-db.c:110 +#, c-format +msgid "ignoring template %s" +msgstr "" + +#: builtin/init-db.c:133 +#, c-format +msgid "insanely long template path %s" +msgstr "" + +#: builtin/init-db.c:141 +#, c-format +msgid "templates not found %s" +msgstr "" + +#: builtin/init-db.c:154 +#, c-format +msgid "not copying templates of a wrong format version %d from '%s'" +msgstr "" + +#: builtin/init-db.c:192 +#, c-format +msgid "insane git directory %s" +msgstr "" + +#: builtin/init-db.c:323 builtin/init-db.c:326 +#, c-format +msgid "%s already exists" +msgstr "" + +#: builtin/init-db.c:355 +#, c-format +msgid "unable to handle file type %d" +msgstr "" + +#: builtin/init-db.c:358 +#, c-format +msgid "unable to move %s to %s" +msgstr "" + +#. +#. * TRANSLATORS: The first '%s' is either "Reinitialized +#. * existing" or "Initialized empty", the second " shared" or +#. * "", and the last '%s%s' is the verbatim directory name. +#. +#: builtin/init-db.c:420 +#, c-format +msgid "%s%s Git repository in %s%s\n" +msgstr "" + +#: builtin/init-db.c:421 +msgid "Reinitialized existing" +msgstr "" + +#: builtin/init-db.c:421 +msgid "Initialized empty" +msgstr "" + +#: builtin/init-db.c:422 +msgid " shared" +msgstr "" + +#: builtin/init-db.c:441 +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:79 builtin/repack.c:155 +msgid "be quiet" +msgstr "" + +#: builtin/init-db.c:522 builtin/init-db.c:529 +#, c-format +msgid "cannot mkdir %s" +msgstr "" + +#: builtin/init-db.c:533 +#, c-format +msgid "cannot chdir to %s" +msgstr "" + +#: builtin/init-db.c:555 +#, c-format +msgid "" +"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" +"dir=<directory>)" +msgstr "" + +#: builtin/init-db.c:579 +msgid "Cannot access current working directory" +msgstr "" + +#: builtin/init-db.c:586 +#, c-format +msgid "Cannot access work tree '%s'" +msgstr "" + +#: builtin/log.c:41 +msgid "git log [<options>] [<revision range>] [[--] <path>...]\n" +msgstr "" + +#: builtin/log.c:42 +msgid " or: git show [options] <object>..." +msgstr "" + +#: builtin/log.c:125 +msgid "suppress diff output" +msgstr "" + +#: builtin/log.c:126 +msgid "show source" +msgstr "" + +#: builtin/log.c:127 +msgid "Use mail map file" +msgstr "" + +#: builtin/log.c:128 +msgid "decorate options" +msgstr "" + +#: builtin/log.c:231 +#, c-format +msgid "Final output: %d %s\n" +msgstr "" + +#: builtin/log.c:473 builtin/log.c:565 +#, c-format +msgid "Could not read object %s" +msgstr "" + +#: builtin/log.c:589 +#, c-format +msgid "Unknown type: %d" +msgstr "" + +#: builtin/log.c:689 +msgid "format.headers without value" +msgstr "" + +#: builtin/log.c:771 +msgid "name of output directory is too long" +msgstr "" + +#: builtin/log.c:787 +#, c-format +msgid "Cannot open patch file %s" +msgstr "" + +#: builtin/log.c:801 +msgid "Need exactly one range." +msgstr "" + +#: builtin/log.c:809 +msgid "Not a range." +msgstr "" + +#: builtin/log.c:911 +msgid "Cover letter needs email format" +msgstr "" + +#: builtin/log.c:987 +#, c-format +msgid "insane in-reply-to: %s" +msgstr "" + +#: builtin/log.c:1015 +msgid "git format-patch [options] [<since> | <revision range>]" +msgstr "" + +#: builtin/log.c:1060 +msgid "Two output directories?" +msgstr "" + +#: builtin/log.c:1175 +msgid "use [PATCH n/m] even with a single patch" +msgstr "" + +#: builtin/log.c:1178 +msgid "use [PATCH] even with multiple patches" +msgstr "" + +#: builtin/log.c:1182 +msgid "print patches to standard out" +msgstr "" + +#: builtin/log.c:1184 +msgid "generate a cover letter" +msgstr "" + +#: builtin/log.c:1186 +msgid "use simple number sequence for output file names" +msgstr "" + +#: builtin/log.c:1187 +msgid "sfx" +msgstr "" + +#: builtin/log.c:1188 +msgid "use <sfx> instead of '.patch'" +msgstr "" + +#: builtin/log.c:1190 +#, fuzzy +msgid "start numbering patches at <n> instead of 1" +msgstr "<брой>" + +#: builtin/log.c:1192 +msgid "mark the series as Nth re-roll" +msgstr "" + +#: builtin/log.c:1194 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "" + +#: builtin/log.c:1197 +msgid "store resulting files in <dir>" +msgstr "" + +#: builtin/log.c:1200 +msgid "don't strip/add [PATCH]" +msgstr "" + +#: builtin/log.c:1203 +msgid "don't output binary diffs" +msgstr "" + +#: builtin/log.c:1205 +msgid "don't include a patch matching a commit upstream" +msgstr "" + +#: builtin/log.c:1207 +msgid "show patch format instead of default (patch + stat)" +msgstr "" + +#: builtin/log.c:1209 +msgid "Messaging" +msgstr "" + +#: builtin/log.c:1210 +msgid "header" +msgstr "" + +#: builtin/log.c:1211 +msgid "add email header" +msgstr "" + +#: builtin/log.c:1212 builtin/log.c:1214 +msgid "email" +msgstr "" + +#: builtin/log.c:1212 +msgid "add To: header" +msgstr "" + +#: builtin/log.c:1214 +msgid "add Cc: header" +msgstr "" + +#: builtin/log.c:1216 +msgid "ident" +msgstr "" + +#: builtin/log.c:1217 +msgid "set From address to <ident> (or committer ident if absent)" +msgstr "" + +#: builtin/log.c:1219 +msgid "message-id" +msgstr "" + +#: builtin/log.c:1220 +msgid "make first mail a reply to <message-id>" +msgstr "" + +#: builtin/log.c:1221 builtin/log.c:1224 +msgid "boundary" +msgstr "" + +#: builtin/log.c:1222 +msgid "attach the patch" +msgstr "" + +#: builtin/log.c:1225 +msgid "inline the patch" +msgstr "" + +#: builtin/log.c:1229 +msgid "enable message threading, styles: shallow, deep" +msgstr "" + +#: builtin/log.c:1231 +msgid "signature" +msgstr "" + +#: builtin/log.c:1232 +msgid "add a signature" +msgstr "" + +#: builtin/log.c:1233 +msgid "don't print the patch filenames" +msgstr "" + +#: builtin/log.c:1307 +#, c-format +msgid "invalid ident line: %s" +msgstr "" + +#: builtin/log.c:1322 +msgid "-n and -k are mutually exclusive." +msgstr "" + +#: builtin/log.c:1324 +msgid "--subject-prefix and -k are mutually exclusive." +msgstr "" + +#: builtin/log.c:1332 +msgid "--name-only does not make sense" +msgstr "" + +#: builtin/log.c:1334 +msgid "--name-status does not make sense" +msgstr "" + +#: builtin/log.c:1336 +msgid "--check does not make sense" +msgstr "" + +#: builtin/log.c:1359 +msgid "standard output, or directory, which one?" +msgstr "" + +#: builtin/log.c:1361 +#, c-format +msgid "Could not create directory '%s'" +msgstr "" + +#: builtin/log.c:1509 +msgid "Failed to create output files" +msgstr "" + +#: builtin/log.c:1558 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "" + +#: builtin/log.c:1613 +#, c-format +msgid "" +"Could not find a tracked remote branch, please specify <upstream> manually.\n" +msgstr "" + +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 +#, c-format +msgid "Unknown commit %s" +msgstr "" + +#: builtin/ls-files.c:398 +msgid "git ls-files [options] [<file>...]" +msgstr "" + +#: builtin/ls-files.c:455 +msgid "identify the file status with tags" +msgstr "" + +#: builtin/ls-files.c:457 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "" + +#: builtin/ls-files.c:459 +msgid "show cached files in the output (default)" +msgstr "" + +#: builtin/ls-files.c:461 +msgid "show deleted files in the output" +msgstr "" + +#: builtin/ls-files.c:463 +msgid "show modified files in the output" +msgstr "" + +#: builtin/ls-files.c:465 +msgid "show other files in the output" +msgstr "" + +#: builtin/ls-files.c:467 +msgid "show ignored files in the output" +msgstr "" + +#: builtin/ls-files.c:470 +msgid "show staged contents' object name in the output" +msgstr "" + +#: builtin/ls-files.c:472 +msgid "show files on the filesystem that need to be removed" +msgstr "" + +#: builtin/ls-files.c:474 +msgid "show 'other' directories' name only" +msgstr "" + +#: builtin/ls-files.c:477 +msgid "don't show empty directories" +msgstr "" + +#: builtin/ls-files.c:480 +msgid "show unmerged files in the output" +msgstr "" + +#: builtin/ls-files.c:482 +msgid "show resolve-undo information" +msgstr "" + +#: builtin/ls-files.c:484 +msgid "skip files matching pattern" +msgstr "" + +#: builtin/ls-files.c:487 +msgid "exclude patterns are read from <file>" +msgstr "" + +#: builtin/ls-files.c:490 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "" + +#: builtin/ls-files.c:492 +msgid "add the standard git exclusions" +msgstr "" + +#: builtin/ls-files.c:495 +msgid "make the output relative to the project top directory" +msgstr "" + +#: builtin/ls-files.c:498 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "" + +#: builtin/ls-files.c:499 +msgid "tree-ish" +msgstr "" + +#: builtin/ls-files.c:500 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "" + +#: builtin/ls-files.c:502 +msgid "show debugging data" +msgstr "" + +#: builtin/ls-tree.c:28 +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "" + +#: builtin/ls-tree.c:126 +msgid "only show trees" +msgstr "" + +#: builtin/ls-tree.c:128 +msgid "recurse into subtrees" +msgstr "" + +#: builtin/ls-tree.c:130 +msgid "show trees when recursing" +msgstr "" + +#: builtin/ls-tree.c:133 +msgid "terminate entries with NUL byte" +msgstr "" + +#: builtin/ls-tree.c:134 +msgid "include object size" +msgstr "" + +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 +msgid "list only filenames" +msgstr "" + +#: builtin/ls-tree.c:141 +msgid "use full path names" +msgstr "" + +#: builtin/ls-tree.c:143 +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:98 +msgid "switch `m' requires a value" +msgstr "" + +#: builtin/merge.c:135 +#, c-format +msgid "Could not find merge strategy '%s'.\n" +msgstr "" + +#: builtin/merge.c:136 +#, c-format +msgid "Available strategies are:" +msgstr "" + +#: builtin/merge.c:141 +#, c-format +msgid "Available custom strategies are:" +msgstr "" + +#: builtin/merge.c:191 +msgid "do not show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:194 +msgid "show a diffstat at the end of the merge" +msgstr "" + +#: builtin/merge.c:195 +msgid "(synonym to --stat)" +msgstr "" + +#: builtin/merge.c:197 +#, fuzzy +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "<брой>" + +#: builtin/merge.c:200 +msgid "create a single commit instead of doing a merge" +msgstr "" + +#: builtin/merge.c:202 +msgid "perform a commit if the merge succeeds (default)" +msgstr "" + +#: builtin/merge.c:204 +msgid "edit message before committing" +msgstr "" + +#: builtin/merge.c:205 +msgid "allow fast-forward (default)" +msgstr "" + +#: builtin/merge.c:207 +msgid "abort if fast-forward is not possible" +msgstr "" + +#: builtin/merge.c:211 +msgid "Verify that the named commit has a valid GPG signature" +msgstr "" + +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 +msgid "strategy" +msgstr "" + +#: builtin/merge.c:213 +msgid "merge strategy to use" +msgstr "" + +#: builtin/merge.c:214 +msgid "option=value" +msgstr "" + +#: builtin/merge.c:215 +msgid "option for selected merge strategy" +msgstr "" + +#: builtin/merge.c:217 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "" + +#: builtin/merge.c:221 +msgid "abort the current in-progress merge" +msgstr "" + +#: builtin/merge.c:250 +msgid "could not run stash." +msgstr "" + +#: builtin/merge.c:255 +msgid "stash failed" +msgstr "" + +#: builtin/merge.c:260 +#, c-format +msgid "not a valid object: %s" +msgstr "" + +#: builtin/merge.c:279 builtin/merge.c:296 +msgid "read-tree failed" +msgstr "" + +#: builtin/merge.c:326 +msgid " (nothing to squash)" +msgstr "" + +#: builtin/merge.c:339 +#, c-format +msgid "Squash commit -- not updating HEAD\n" +msgstr "" + +#: builtin/merge.c:371 +msgid "Writing SQUASH_MSG" +msgstr "" + +#: builtin/merge.c:373 +msgid "Finishing SQUASH_MSG" +msgstr "" + +#: builtin/merge.c:396 +#, c-format +msgid "No merge message -- not updating HEAD\n" +msgstr "" + +#: builtin/merge.c:446 +#, c-format +msgid "'%s' does not point to a commit" +msgstr "" + +#: builtin/merge.c:558 +#, c-format +msgid "Bad branch.%s.mergeoptions string: %s" +msgstr "" + +#: builtin/merge.c:650 +msgid "git write-tree failed to write a tree" +msgstr "" + +#: builtin/merge.c:678 +msgid "Not handling anything other than two heads merge." +msgstr "" + +#: builtin/merge.c:692 +#, c-format +msgid "Unknown option for merge-recursive: -X%s" +msgstr "" + +#: builtin/merge.c:706 +#, c-format +msgid "unable to write %s" +msgstr "" + +#: builtin/merge.c:795 +#, c-format +msgid "Could not read from '%s'" +msgstr "" + +#: builtin/merge.c:804 +#, c-format +msgid "Not committing merge; use 'git commit' to complete the merge.\n" +msgstr "" + +#: builtin/merge.c:810 +#, c-format +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" +"\n" +"Lines starting with '%c' will be ignored, and an empty message aborts\n" +"the commit.\n" +msgstr "" + +#: builtin/merge.c:834 +msgid "Empty commit message." +msgstr "" + +#: builtin/merge.c:846 +#, c-format +msgid "Wonderful.\n" +msgstr "" + +#: builtin/merge.c:911 +#, c-format +msgid "Automatic merge failed; fix conflicts and then commit the result.\n" +msgstr "" + +#: builtin/merge.c:927 +#, c-format +msgid "'%s' is not a commit" +msgstr "" + +#: builtin/merge.c:968 +msgid "No current branch." +msgstr "" + +#: builtin/merge.c:970 +msgid "No remote for the current branch." +msgstr "" + +#: builtin/merge.c:972 +msgid "No default upstream defined for the current branch." +msgstr "" + +#: builtin/merge.c:977 +#, c-format +msgid "No remote-tracking branch for %s from %s" +msgstr "" + +#: builtin/merge.c:1133 +msgid "There is no merge to abort (MERGE_HEAD missing)." +msgstr "" + +#: builtin/merge.c:1149 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:1152 git-pull.sh:34 +msgid "You have not concluded your merge (MERGE_HEAD exists)." +msgstr "" + +#: builtin/merge.c:1156 +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:1159 +msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." +msgstr "" + +#: builtin/merge.c:1168 +msgid "You cannot combine --squash with --no-ff." +msgstr "" + +#: builtin/merge.c:1177 +msgid "No commit specified and merge.defaultToUpstream not set." +msgstr "" + +#: builtin/merge.c:1209 +msgid "Can merge only exactly one commit into empty head" +msgstr "" + +#: builtin/merge.c:1212 +msgid "Squash commit into empty head not supported yet" +msgstr "" + +#: builtin/merge.c:1214 +msgid "Non-fast-forward commit does not make sense into an empty head" +msgstr "" + +#: builtin/merge.c:1219 +#, c-format +msgid "%s - not something we can merge" +msgstr "" + +#: builtin/merge.c:1270 +#, c-format +msgid "Commit %s has an untrusted GPG signature, allegedly by %s." +msgstr "" + +#: builtin/merge.c:1273 +#, c-format +msgid "Commit %s has a bad GPG signature allegedly by %s." +msgstr "" + +#. 'N' +#: builtin/merge.c:1276 +#, c-format +msgid "Commit %s does not have a GPG signature." +msgstr "" + +#: builtin/merge.c:1279 +#, c-format +msgid "Commit %s has a good GPG signature by %s\n" +msgstr "" + +#: builtin/merge.c:1363 +#, c-format +msgid "Updating %s..%s\n" +msgstr "" + +#: builtin/merge.c:1402 +#, c-format +msgid "Trying really trivial in-index merge...\n" +msgstr "" + +#: builtin/merge.c:1409 +#, c-format +msgid "Nope.\n" +msgstr "" + +#: builtin/merge.c:1441 +msgid "Not possible to fast-forward, aborting." +msgstr "" + +#: builtin/merge.c:1464 builtin/merge.c:1543 +#, c-format +msgid "Rewinding the tree to pristine...\n" +msgstr "" + +#: builtin/merge.c:1468 +#, c-format +msgid "Trying merge strategy %s...\n" +msgstr "" + +#: builtin/merge.c:1534 +#, c-format +msgid "No merge strategy handled the merge.\n" +msgstr "" + +#: builtin/merge.c:1536 +#, c-format +msgid "Merge with strategy %s failed.\n" +msgstr "" + +#: builtin/merge.c:1545 +#, c-format +msgid "Using the %s to prepare resolving by hand.\n" +msgstr "" + +#: builtin/merge.c:1557 +#, c-format +msgid "Automatic merge went well; stopped before committing as requested\n" +msgstr "" + +#: builtin/merge-base.c:29 +msgid "git merge-base [-a|--all] <commit> <commit>..." +msgstr "" + +#: builtin/merge-base.c:30 +msgid "git merge-base [-a|--all] --octopus <commit>..." +msgstr "" + +#: builtin/merge-base.c:31 +msgid "git merge-base --independent <commit>..." +msgstr "" + +#: builtin/merge-base.c:32 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "" + +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "" + +#: builtin/merge-base.c:214 +msgid "output all common ancestors" +msgstr "" + +#: builtin/merge-base.c:216 +msgid "find ancestors for a single n-way merge" +msgstr "" + +#: builtin/merge-base.c:218 +msgid "list revs not reachable from others" +msgstr "" + +#: builtin/merge-base.c:220 +msgid "is the first one ancestor of the other?" +msgstr "" + +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +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:15 +msgid "git mv [options] <source>... <destination>" +msgstr "" + +#: builtin/mv.c:71 +msgid "force move/rename even if target exists" +msgstr "" + +#: builtin/mv.c:72 +msgid "skip move/rename errors" +msgstr "" + +#: builtin/mv.c:122 +#, c-format +msgid "Checking rename of '%s' to '%s'\n" +msgstr "" + +#: builtin/mv.c:126 +msgid "bad source" +msgstr "" + +#: builtin/mv.c:129 +msgid "can not move directory into itself" +msgstr "" + +#: builtin/mv.c:132 +msgid "cannot move directory over file" +msgstr "" + +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" +"За да продължите или вкарайте промените по файла „.gitmodules“ в индекÑа, " +"или\n" +"ги Ñкътайте" + +#: builtin/mv.c:156 +#, c-format +msgid "Huh? %.*s is in index?" +msgstr "" + +#: builtin/mv.c:168 +msgid "source directory is empty" +msgstr "" + +#: builtin/mv.c:200 +msgid "not under version control" +msgstr "" + +#: builtin/mv.c:202 +msgid "destination exists" +msgstr "" + +#: builtin/mv.c:210 +#, c-format +msgid "overwriting '%s'" +msgstr "" + +#: builtin/mv.c:213 +msgid "Cannot overwrite" +msgstr "" + +#: builtin/mv.c:216 +msgid "multiple sources for the same target" +msgstr "" + +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "" + +#: builtin/mv.c:233 +#, c-format +msgid "%s, source=%s, destination=%s" +msgstr "" + +#: builtin/mv.c:243 +#, c-format +msgid "Renaming %s to %s\n" +msgstr "" + +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 +#, c-format +msgid "renaming '%s' failed" +msgstr "неуÑпешно преименуване на „%s“" + +#: builtin/name-rev.c:258 +msgid "git name-rev [options] <commit>..." +msgstr "" + +#: builtin/name-rev.c:259 +msgid "git name-rev [options] --all" +msgstr "" + +#: builtin/name-rev.c:260 +msgid "git name-rev [options] --stdin" +msgstr "" + +# FIXME +#: builtin/name-rev.c:312 +msgid "print only names (no SHA-1)" +msgstr "" + +#: builtin/name-rev.c:313 +msgid "only use tags to name the commits" +msgstr "" + +#: builtin/name-rev.c:315 +msgid "only use refs matching <pattern>" +msgstr "" + +#: builtin/name-rev.c:317 +msgid "list all commits reachable from all refs" +msgstr "" + +#: builtin/name-rev.c:318 +msgid "read from stdin" +msgstr "" + +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "" + +#: builtin/name-rev.c:325 +msgid "dereference tags in the input (internal use)" +msgstr "" + +#: builtin/notes.c:24 +msgid "git notes [--ref <notes_ref>] [list [<object>]]" +msgstr "" + +#: builtin/notes.c:25 +msgid "" +"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:26 +msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:27 +msgid "" +"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) " +"<object>] [<object>]" +msgstr "" + +#: builtin/notes.c:28 +msgid "git notes [--ref <notes_ref>] edit [<object>]" +msgstr "" + +#: builtin/notes.c:29 +msgid "git notes [--ref <notes_ref>] show [<object>]" +msgstr "" + +#: builtin/notes.c:30 +msgid "" +"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>" +msgstr "" + +#: builtin/notes.c:31 +msgid "git notes merge --commit [-v | -q]" +msgstr "" + +#: builtin/notes.c:32 +msgid "git notes merge --abort [-v | -q]" +msgstr "" + +#: builtin/notes.c:33 +msgid "git notes [--ref <notes_ref>] remove [<object>...]" +msgstr "" + +#: builtin/notes.c:34 +msgid "git notes [--ref <notes_ref>] prune [-n | -v]" +msgstr "" + +#: builtin/notes.c:35 +msgid "git notes [--ref <notes_ref>] get-ref" +msgstr "" + +#: builtin/notes.c:40 +msgid "git notes [list [<object>]]" +msgstr "" + +#: builtin/notes.c:45 +msgid "git notes add [<options>] [<object>]" +msgstr "" + +#: builtin/notes.c:50 +msgid "git notes copy [<options>] <from-object> <to-object>" +msgstr "" + +#: builtin/notes.c:51 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "" + +#: builtin/notes.c:56 +msgid "git notes append [<options>] [<object>]" +msgstr "" + +#: builtin/notes.c:61 +msgid "git notes edit [<object>]" +msgstr "" + +#: builtin/notes.c:66 +msgid "git notes show [<object>]" +msgstr "" + +#: builtin/notes.c:71 +msgid "git notes merge [<options>] <notes_ref>" +msgstr "" + +#: builtin/notes.c:72 +msgid "git notes merge --commit [<options>]" +msgstr "" + +#: builtin/notes.c:73 +msgid "git notes merge --abort [<options>]" +msgstr "" + +#: builtin/notes.c:78 +msgid "git notes remove [<object>]" +msgstr "" + +#: builtin/notes.c:83 +msgid "git notes prune [<options>]" +msgstr "" + +#: builtin/notes.c:88 +msgid "git notes get-ref" +msgstr "" + +#: builtin/notes.c:137 +#, c-format +msgid "unable to start 'show' for object '%s'" +msgstr "" + +#: builtin/notes.c:141 +msgid "could not read 'show' output" +msgstr "" + +#: builtin/notes.c:149 +#, c-format +msgid "failed to finish 'show' for object '%s'" +msgstr "" + +#: builtin/notes.c:167 builtin/tag.c:341 +#, c-format +msgid "could not create file '%s'" +msgstr "" + +#: builtin/notes.c:186 +msgid "Please supply the note contents using either -m or -F option" +msgstr "" + +#: builtin/notes.c:207 builtin/notes.c:844 +#, c-format +msgid "Removing note for object %s\n" +msgstr "" + +#: builtin/notes.c:212 +msgid "unable to write note object" +msgstr "" + +#: builtin/notes.c:214 +#, c-format +msgid "The note contents has been left in %s" +msgstr "" + +#: builtin/notes.c:248 builtin/tag.c:537 +#, c-format +msgid "cannot read '%s'" +msgstr "" + +#: builtin/notes.c:250 builtin/tag.c:540 +#, c-format +msgid "could not open or read '%s'" +msgstr "" + +#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 +#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 +#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 +#: builtin/notes.c:839 builtin/tag.c:553 +#, c-format +msgid "Failed to resolve '%s' as a valid ref." +msgstr "" + +#: builtin/notes.c:272 +#, c-format +msgid "Failed to read object '%s'." +msgstr "" + +#: builtin/notes.c:312 +#, c-format +msgid "Malformed input line: '%s'." +msgstr "" + +#: builtin/notes.c:327 +#, c-format +msgid "Failed to copy notes from '%s' to '%s'" +msgstr "" + +#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498 +#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630 +#: builtin/notes.c:904 +msgid "too many parameters" +msgstr "" + +#: builtin/notes.c:384 builtin/notes.c:643 +#, c-format +msgid "No note found for object %s." +msgstr "" + +#: builtin/notes.c:406 builtin/notes.c:563 +msgid "note contents as a string" +msgstr "" + +#: builtin/notes.c:409 builtin/notes.c:566 +msgid "note contents in a file" +msgstr "" + +#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568 +#: builtin/notes.c:571 builtin/tag.c:474 +msgid "object" +msgstr "" + +#: builtin/notes.c:412 builtin/notes.c:569 +msgid "reuse and edit specified note object" +msgstr "" + +#: builtin/notes.c:415 builtin/notes.c:572 +msgid "reuse specified note object" +msgstr "" + +#: builtin/notes.c:417 builtin/notes.c:485 +msgid "replace existing notes" +msgstr "" + +#: builtin/notes.c:451 +#, c-format +msgid "" +"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "" + +#: builtin/notes.c:456 builtin/notes.c:533 +#, c-format +msgid "Overwriting existing notes for object %s\n" +msgstr "" + +#: builtin/notes.c:486 +msgid "read objects from stdin" +msgstr "" + +#: builtin/notes.c:488 +msgid "load rewriting config for <command> (implies --stdin)" +msgstr "" + +#: builtin/notes.c:506 +msgid "too few parameters" +msgstr "" + +#: builtin/notes.c:527 +#, c-format +msgid "" +"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "" + +#: builtin/notes.c:539 +#, c-format +msgid "Missing notes on source object %s. Cannot copy." +msgstr "" + +#: builtin/notes.c:588 +#, 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:735 +msgid "General options" +msgstr "" + +#: builtin/notes.c:737 +msgid "Merge options" +msgstr "" + +#: builtin/notes.c:739 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "" + +#: builtin/notes.c:741 +msgid "Committing unmerged notes" +msgstr "" + +#: builtin/notes.c:743 +msgid "finalize notes merge by committing unmerged notes" +msgstr "" + +#: builtin/notes.c:745 +msgid "Aborting notes merge resolution" +msgstr "" + +#: builtin/notes.c:747 +msgid "abort notes merge" +msgstr "" + +#: builtin/notes.c:842 +#, c-format +msgid "Object %s has no note\n" +msgstr "" + +#: builtin/notes.c:854 +msgid "attempt to remove non-existent note is not an error" +msgstr "" + +#: builtin/notes.c:857 +msgid "read object names from the standard input" +msgstr "" + +#: builtin/notes.c:938 +msgid "notes_ref" +msgstr "" + +#: builtin/notes.c:939 +msgid "use notes from <notes_ref>" +msgstr "" + +#: builtin/notes.c:974 builtin/remote.c:1593 +#, 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:184 builtin/pack-objects.c:187 +#, c-format +msgid "deflate error (%d)" +msgstr "" + +#: builtin/pack-objects.c:2396 +#, c-format +msgid "unsupported index version %s" +msgstr "" + +#: builtin/pack-objects.c:2400 +#, c-format +msgid "bad index version '%s'" +msgstr "" + +#: builtin/pack-objects.c:2423 +#, c-format +msgid "option %s does not accept negative form" +msgstr "" + +#: builtin/pack-objects.c:2427 +#, c-format +msgid "unable to parse value '%s' for option %s" +msgstr "" + +#: builtin/pack-objects.c:2446 +msgid "do not show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2448 +msgid "show progress meter" +msgstr "" + +#: builtin/pack-objects.c:2450 +msgid "show progress meter during object writing phase" +msgstr "" + +#: builtin/pack-objects.c:2453 +msgid "similar to --all-progress when progress meter is shown" +msgstr "" + +#: builtin/pack-objects.c:2454 +msgid "version[,offset]" +msgstr "" + +#: builtin/pack-objects.c:2455 +msgid "write the pack index file in the specified idx format version" +msgstr "" + +#: builtin/pack-objects.c:2458 +msgid "maximum size of each output pack file" +msgstr "" + +#: builtin/pack-objects.c:2460 +msgid "ignore borrowed objects from alternate object store" +msgstr "" + +#: builtin/pack-objects.c:2462 +msgid "ignore packed objects" +msgstr "" + +#: builtin/pack-objects.c:2464 +msgid "limit pack window by objects" +msgstr "" + +#: builtin/pack-objects.c:2466 +msgid "limit pack window by memory in addition to object limit" +msgstr "" + +#: builtin/pack-objects.c:2468 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "" + +#: builtin/pack-objects.c:2470 +msgid "reuse existing deltas" +msgstr "" + +#: builtin/pack-objects.c:2472 +msgid "reuse existing objects" +msgstr "" + +#: builtin/pack-objects.c:2474 +msgid "use OFS_DELTA objects" +msgstr "" + +#: builtin/pack-objects.c:2476 +msgid "use threads when searching for best delta matches" +msgstr "" + +#: builtin/pack-objects.c:2478 +msgid "do not create an empty pack output" +msgstr "" + +#: builtin/pack-objects.c:2480 +msgid "read revision arguments from standard input" +msgstr "" + +#: builtin/pack-objects.c:2482 +msgid "limit the objects to those that are not yet packed" +msgstr "" + +#: builtin/pack-objects.c:2485 +msgid "include objects reachable from any reference" +msgstr "" + +#: builtin/pack-objects.c:2488 +msgid "include objects referred by reflog entries" +msgstr "" + +#: builtin/pack-objects.c:2491 +msgid "output pack to stdout" +msgstr "" + +#: builtin/pack-objects.c:2493 +msgid "include tag objects that refer to objects to be packed" +msgstr "" + +#: builtin/pack-objects.c:2495 +msgid "keep unreachable objects" +msgstr "" + +#: builtin/pack-objects.c:2496 parse-options.h:143 +msgid "time" +msgstr "време" + +#: builtin/pack-objects.c:2497 +msgid "unpack unreachable objects newer than <time>" +msgstr "" + +#: builtin/pack-objects.c:2500 +msgid "create thin packs" +msgstr "" + +#: builtin/pack-objects.c:2502 +msgid "ignore packs that have companion .keep file" +msgstr "" + +#: builtin/pack-objects.c:2504 +msgid "pack compression level" +msgstr "" + +#: builtin/pack-objects.c:2506 +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:142 +msgid "do not remove, show only" +msgstr "" + +#: builtin/prune.c:143 +msgid "report pruned objects" +msgstr "" + +#: builtin/prune.c:146 +msgid "expire objects older than <time>" +msgstr "" + +#: builtin/push.c:14 +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "" + +#: builtin/push.c:86 +msgid "tag shorthand without <tag>" +msgstr "" + +#: builtin/push.c:96 +msgid "--delete only accepts plain target ref names" +msgstr "" + +#: builtin/push.c:141 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" + +#: builtin/push.c:144 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" + +#: builtin/push.c:159 +#, c-format +msgid "" +"You are not currently on a branch.\n" +"To push the history leading to the current (detached HEAD)\n" +"state now, use\n" +"\n" +" git push %s HEAD:<name-of-remote-branch>\n" +msgstr "" + +#: builtin/push.c:173 +#, c-format +msgid "" +"The current branch %s has no upstream branch.\n" +"To push the current branch and set the remote as upstream, use\n" +"\n" +" git push --set-upstream %s %s\n" +msgstr "" + +#: builtin/push.c:181 +#, c-format +msgid "The current branch %s has multiple upstream branches, refusing to push." +msgstr "" + +#: builtin/push.c:184 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" + +#: builtin/push.c:207 +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" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" + +#: builtin/push.c:274 +msgid "" +"You didn't specify any refspecs to push, and push.default is \"nothing\"." +msgstr "" + +#: builtin/push.c:281 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Integrate the remote changes (e.g.\n" +"'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:287 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. If you did not intend to push that branch, you may want to\n" +"specify branches to push or set the 'push.default' configuration variable\n" +"to 'simple', 'current' or 'upstream' to push only the current branch." +msgstr "" + +#: builtin/push.c:293 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and integrate the remote changes\n" +"(e.g. 'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:299 +msgid "" +"Updates were rejected because the remote contains work that you do\n" +"not have locally. This is usually caused by another repository pushing\n" +"to the same ref. You may want to first integrate the remote changes\n" +"(e.g., 'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:306 +msgid "Updates were rejected because the tag already exists in the remote." +msgstr "" + +#: builtin/push.c:309 +msgid "" +"You cannot update a remote ref that points at a non-commit object,\n" +"or update a remote ref to make it point at a non-commit object,\n" +"without using the '--force' option.\n" +msgstr "" + +#: builtin/push.c:375 +#, c-format +msgid "Pushing to %s\n" +msgstr "" + +#: builtin/push.c:379 +#, c-format +msgid "failed to push some refs to '%s'" +msgstr "" + +#: builtin/push.c:412 +#, c-format +msgid "bad repository '%s'" +msgstr "" + +#: builtin/push.c:413 +msgid "" +"No configured push destination.\n" +"Either specify the URL from the command-line or configure a remote " +"repository using\n" +"\n" +" git remote add <name> <url>\n" +"\n" +"and then push using the remote name\n" +"\n" +" git push <name>\n" +msgstr "" + +#: builtin/push.c:428 +msgid "--all and --tags are incompatible" +msgstr "" + +#: builtin/push.c:429 +msgid "--all can't be combined with refspecs" +msgstr "" + +#: builtin/push.c:434 +msgid "--mirror and --tags are incompatible" +msgstr "" + +#: builtin/push.c:435 +msgid "--mirror can't be combined with refspecs" +msgstr "" + +#: builtin/push.c:440 +msgid "--all and --mirror are incompatible" +msgstr "" + +#: builtin/push.c:500 +msgid "repository" +msgstr "" + +#: builtin/push.c:501 +msgid "push all refs" +msgstr "" + +#: builtin/push.c:502 +msgid "mirror all refs" +msgstr "" + +#: builtin/push.c:504 +msgid "delete refs" +msgstr "" + +#: builtin/push.c:505 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "" + +#: builtin/push.c:508 +msgid "force updates" +msgstr "" + +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "" + +#: builtin/push.c:513 +msgid "check" +msgstr "" + +#: builtin/push.c:514 +msgid "control recursive pushing of submodules" +msgstr "" + +#: builtin/push.c:516 +msgid "use thin pack" +msgstr "" + +#: builtin/push.c:517 builtin/push.c:518 +msgid "receive pack program" +msgstr "" + +#: builtin/push.c:519 +msgid "set upstream for git pull/status" +msgstr "" + +#: builtin/push.c:522 +msgid "prune locally removed refs" +msgstr "" + +#: builtin/push.c:524 +msgid "bypass pre-push hook" +msgstr "" + +#: builtin/push.c:525 +msgid "push missing but relevant tags" +msgstr "" + +#: builtin/push.c:535 +msgid "--delete is incompatible with --all, --mirror and --tags" +msgstr "" + +#: builtin/push.c:537 +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:109 +msgid "write resulting index to <file>" +msgstr "" + +#: builtin/read-tree.c:112 +msgid "only empty the index" +msgstr "" + +#: builtin/read-tree.c:114 +msgid "Merging" +msgstr "" + +#: builtin/read-tree.c:116 +msgid "perform a merge in addition to a read" +msgstr "" + +#: builtin/read-tree.c:118 +msgid "3-way merge if no file level merging required" +msgstr "" + +#: builtin/read-tree.c:120 +msgid "3-way merge in presence of adds and removes" +msgstr "" + +#: builtin/read-tree.c:122 +msgid "same as -m, but discard unmerged entries" +msgstr "" + +#: builtin/read-tree.c:123 +msgid "<subdirectory>/" +msgstr "" + +#: builtin/read-tree.c:124 +msgid "read the tree into the index under <subdirectory>/" +msgstr "" + +#: builtin/read-tree.c:127 +msgid "update working tree with merge result" +msgstr "" + +#: builtin/read-tree.c:129 +msgid "gitignore" +msgstr "" + +#: builtin/read-tree.c:130 +msgid "allow explicitly ignored files to be overwritten" +msgstr "" + +#: builtin/read-tree.c:133 +msgid "don't check the working tree after merging" +msgstr "" + +#: builtin/read-tree.c:134 +msgid "don't update the index or the work tree" +msgstr "" + +#: builtin/read-tree.c:136 +msgid "skip applying sparse checkout filter" +msgstr "" + +#: builtin/read-tree.c:138 +msgid "debug unpack-trees" +msgstr "" + +# FIXME +#: builtin/reflog.c:499 +#, c-format +msgid "%s' for '%s' is not a valid timestamp" +msgstr "„%s“ не е правилна ÑтойноÑÑ‚ за време за „%s“" + +#: builtin/reflog.c:615 builtin/reflog.c:620 +#, c-format +msgid "'%s' is not a valid timestamp" +msgstr "„%s“ не е правилна ÑтойноÑÑ‚ за време" + +#: builtin/remote.c:12 +msgid "git remote [-v | --verbose]" +msgstr "git remote [-v | --verbose]" + +#: builtin/remote.c:13 +msgid "" +"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <name> <url>" +msgstr "" +"git remote add [-t <КЛОÐ>] [-m <ОСÐОВЕÐ_КЛОÐ>] [-f] [--tags|--no-tags] [--" +"mirror=<fetch|push>] <ИМЕ> <ÐДРЕС>" + +#: builtin/remote.c:14 builtin/remote.c:33 +msgid "git remote rename <old> <new>" +msgstr "git remote rename <СТÐРО_ИМЕ> <ÐОВО_ИМЕ>" + +#: builtin/remote.c:15 builtin/remote.c:38 +msgid "git remote remove <name>" +msgstr "git remote remove <ИМЕ>" + +#: builtin/remote.c:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete |<КЛОÐ>)" + +#: builtin/remote.c:17 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "git remote [-v | --verbose] show [-n] <ИМЕ>" + +#: builtin/remote.c:18 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "git remote prune [-n | --dry-run] <ИМЕ>" + +#: builtin/remote.c:19 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" +"git remote [-v | --verbose] update [-p | --prune] [(<ГРУПÐ> | " +"<ОТДÐЛЕЧЕÐО_ХРÐÐИЛИЩЕ>)…]" + +#: builtin/remote.c:20 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "git remote set-branches [--add] <ИМЕ> <КЛОÐ>…" + +#: builtin/remote.c:21 builtin/remote.c:69 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "git remote set-url [--push] <ИМЕ> <ÐОВ_ÐДРЕС> [<СТÐÐ _ÐДРЕС>]" + +#: builtin/remote.c:22 builtin/remote.c:70 +msgid "git remote set-url --add <name> <newurl>" +msgstr "git remote set-url --add <ИМЕ> <ÐОВ_ÐДРЕС>" + +#: builtin/remote.c:23 builtin/remote.c:71 +msgid "git remote set-url --delete <name> <url>" +msgstr "git remote set-url --delete <ИМЕ> <ÐДРЕС>" + +#: builtin/remote.c:28 +msgid "git remote add [<options>] <name> <url>" +msgstr "git remote add [<ОПЦИИ>] <ИМЕ> <ÐДРЕС>" + +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete | <КЛОÐ>)" + +#: builtin/remote.c:48 +msgid "git remote set-branches <name> <branch>..." +msgstr "git remote set-branches <ИМЕ> <КЛОÐ>…" + +#: builtin/remote.c:49 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "git remote set-branches --add <ИМЕ> <КЛОÐ>…" + +#: builtin/remote.c:54 +msgid "git remote show [<options>] <name>" +msgstr "git remote show [<ОПЦИИ>] <ИМЕ>" + +#: builtin/remote.c:59 +msgid "git remote prune [<options>] <name>" +msgstr "git remote prune [<ОПЦИИ>] <ИМЕ>" + +#: builtin/remote.c:64 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "git remote update [<ОПЦИИ>] [<ГРУПÐ> | <ОТДÐЛЕЧЕÐО_ХРÐÐИЛИЩЕ>]…" + +#: builtin/remote.c:88 +#, c-format +msgid "Updating %s" +msgstr "ОбновÑване на „%s“" + +#: builtin/remote.c:120 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"Използването Ñамо на „--mirror“ е опаÑно. ВмеÑто това\n" +"\tползвайте „--mirror=fetch“ или „--mirror=push“" + +#: builtin/remote.c:137 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "неправилна ÑтойноÑÑ‚ за „--mirror“: %s" + +#: builtin/remote.c:153 +msgid "fetch the remote branches" +msgstr "отдалечените клони не могат да бъдат доÑтавени" + +#: builtin/remote.c:155 +msgid "import all tags and associated objects when fetching" +msgstr "внаÑÑне на вÑички етикети и принадлежащите им обекти при доÑтавÑне" + +#: builtin/remote.c:158 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "може и да не Ñе доÑтавÑÑ‚ никакви етикети (чрез опциÑта „--no-tags“)" + +#: builtin/remote.c:160 +msgid "branch(es) to track" +msgstr "клон/и за Ñледене" + +#: builtin/remote.c:161 +msgid "master branch" +msgstr "оÑновен клон" + +#: builtin/remote.c:162 +msgid "push|fetch" +msgstr "издърпване|доÑтавÑне" + +#: builtin/remote.c:163 +msgid "set up remote as a mirror to push to or fetch from" +msgstr "" +"наÑтройване на отдалечено хранилище, от което да Ñе издърпва или доÑтавÑ" + +#: builtin/remote.c:175 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "" +"нÑма ÑмиÑъл да Ñе указва оÑновен клон при използване на опциÑта „--mirror“" + +#: builtin/remote.c:177 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "" +"указването на Ñледени клони е ÑмиÑлено Ñамо за отдалечени хранилища, от " +"които Ñе доÑтавÑ" + +#: builtin/remote.c:185 builtin/remote.c:641 +#, c-format +msgid "remote %s already exists." +msgstr "вече ÑъщеÑтвува отдалечено хранилище Ñ Ð¸Ð¼Ðµ „%s“." + +#: builtin/remote.c:189 builtin/remote.c:645 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "„%s“ е неправилно име за отдалечено хранилище" + +#: builtin/remote.c:233 +#, c-format +msgid "Could not setup master '%s'" +msgstr "ОÑновниÑÑ‚ клон „%s“ не може да бъде наÑтроен" + +#: builtin/remote.c:289 +#, c-format +msgid "more than one %s" +msgstr "повече от едно отдалечено хранилище на име „%s“" + +#: builtin/remote.c:334 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "Обектите за доÑтавÑне за ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€ž%s“ не могат да бъдат получени" + +#: builtin/remote.c:435 builtin/remote.c:443 +msgid "(matching)" +msgstr "(Ñъвпадащи)" + +#: builtin/remote.c:447 +msgid "(delete)" +msgstr "(за изтриване)" + +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "„%s“ не може да Ñе добави към „%s“" + +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 +#, c-format +msgid "No such remote: %s" +msgstr "Такова отдалечено хранилище нÑма: %s" + +#: builtin/remote.c:651 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "СекциÑта в наÑтройките „%s“ не може да бъде преименувана на „%s“" + +#: builtin/remote.c:657 builtin/remote.c:794 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "СекциÑта в наÑтройките „%s“ не може да бъде изтрита" + +# FIXME +#: builtin/remote.c:672 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" +"ÐеÑтандартните указатели за доÑтавÑне нÑма да бъдат обновени\n" +" %s\n" +" Променете наÑтройките ръчно, ако е необходимо." + +#: builtin/remote.c:678 +#, c-format +msgid "Could not append '%s'" +msgstr "СекциÑта „%s“ не може да бъде добавена в наÑтройките" + +#: builtin/remote.c:689 +#, c-format +msgid "Could not set '%s'" +msgstr "СекциÑта „%s“ не може да бъде зададена в наÑтройките" + +#: builtin/remote.c:711 +#, c-format +msgid "deleting '%s' failed" +msgstr "неуÑпешно изтриване на „%s“" + +#: builtin/remote.c:745 +#, c-format +msgid "creating '%s' failed" +msgstr "неуÑпешно Ñъздаване на „%s“" + +#: builtin/remote.c:759 +#, c-format +msgid "Could not remove branch %s" +msgstr "Клонът „%s“ не може да бъде изтрит" + +#: builtin/remote.c:829 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +"Бележка: Клон извън йерархиÑта „refs/remotes/“ не бе изтрит.\n" +"Изтрийте го чрез командата:" +msgstr[1] "" +"Бележка: ÐÑколко клона извън йерархиÑта „refs/remotes/“ не бÑха изтрити.\n" +"Изтрийте ги чрез командата:" + +#: builtin/remote.c:938 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr " нов (Ñледващото доÑтавÑне ще го разположи в „remotes/%s“)" + +#: builtin/remote.c:941 +msgid " tracked" +msgstr " Ñледен" + +#: builtin/remote.c:943 +msgid " stale (use 'git remote prune' to remove)" +msgstr " Ñтар (изтрийте чрез „git remote prune“)" + +#: builtin/remote.c:945 +msgid " ???" +msgstr " неÑÑно" + +# CHECK +#: builtin/remote.c:986 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "" +"неправилен клон за Ñливане „%s“. Ðевъзможно е да пребазирате върху повече от " +"1 клон" + +#: builtin/remote.c:993 +#, c-format +msgid "rebases onto remote %s" +msgstr "пребазиране върху Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“" + +#: builtin/remote.c:996 +#, c-format +msgid " merges with remote %s" +msgstr " Ñливане Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“" + +#: builtin/remote.c:997 +msgid " and with remote" +msgstr " и Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: builtin/remote.c:999 +#, c-format +msgid "merges with remote %s" +msgstr "Ñливане Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“" + +#: builtin/remote.c:1000 +msgid " and with remote" +msgstr " и Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: builtin/remote.c:1046 +msgid "create" +msgstr "Ñъздаден" + +#: builtin/remote.c:1049 +msgid "delete" +msgstr "изтрит" + +#: builtin/remote.c:1053 +msgid "up to date" +msgstr "актуален" + +#: builtin/remote.c:1056 +msgid "fast-forwardable" +msgstr "може да Ñе Ñлее тривиално" + +#: builtin/remote.c:1059 +msgid "local out of date" +msgstr "локалниÑÑ‚ е оÑтарÑл" + +#: builtin/remote.c:1066 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr " %-*s принудително изтлаÑква към %-*s (%s)" + +#: builtin/remote.c:1069 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr " %-*s изтлаÑква към %-*s (%s)" + +#: builtin/remote.c:1073 +#, c-format +msgid " %-*s forces to %s" +msgstr " %-*s принудително изтлаÑква към %s" + +#: builtin/remote.c:1076 +#, c-format +msgid " %-*s pushes to %s" +msgstr " %-*s изтлаÑква към %s" + +#: builtin/remote.c:1144 +msgid "do not query remotes" +msgstr "без заÑвки към отдалечените хранилища" + +#: builtin/remote.c:1171 +#, c-format +msgid "* remote %s" +msgstr "* отдалечено хранилище „%s“" + +#: builtin/remote.c:1172 +#, c-format +msgid " Fetch URL: %s" +msgstr " ÐÐ´Ñ€ÐµÑ Ð·Ð° доÑтавÑне: %s" + +#: builtin/remote.c:1173 builtin/remote.c:1318 +msgid "(no URL)" +msgstr "(без адреÑ)" + +#: builtin/remote.c:1182 builtin/remote.c:1184 +#, c-format +msgid " Push URL: %s" +msgstr " ÐÐ´Ñ€ÐµÑ Ð·Ð° изтлаÑкване: %s" + +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 +#, c-format +msgid " HEAD branch: %s" +msgstr " клон в HEAD: %s" + +#: builtin/remote.c:1192 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr "" +" клон в HEAD (клонът указан във файла HEAD от отдалеченото хранилище е\n" +" нееднозначен и е нÑкой от Ñледните):\n" + +#: builtin/remote.c:1204 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " Отдалечен клон: %s" +msgstr[1] " Отдалечени клони: %s" + +#: builtin/remote.c:1207 builtin/remote.c:1234 +msgid " (status not queried)" +msgstr " (ÑÑŠÑтоÑнието не бе проверено)" + +#: builtin/remote.c:1216 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " Локален клон наÑтроен за издърпване чрез „git pull“:" +msgstr[1] " Локални клони наÑтроени за издърпване чрез „git pull“:" + +#: builtin/remote.c:1224 +msgid " Local refs will be mirrored by 'git push'" +msgstr " Локалните указатели ще бъдат пренеÑени чрез „ push“" + +#: builtin/remote.c:1231 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] " ЛокалниÑÑ‚ указател, наÑтроен за „git push“%s:" +msgstr[1] " Локалните указатели, наÑтроени за „git push“%s:" + +#: builtin/remote.c:1252 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "задаване на refs/remotes/<ИМЕ>/HEAD Ñпоред отдалеченото хранилище" + +#: builtin/remote.c:1254 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "изтриване на refs/remotes/<ИМЕ>/HEAD" + +#: builtin/remote.c:1269 +msgid "Cannot determine remote HEAD" +msgstr "Ðе може да Ñе уÑтанови отдалечениÑÑ‚ връх" + +#: builtin/remote.c:1271 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "" +"МножеÑтво клони Ñ Ð²ÑŠÑ€Ñ…Ð¾Ð²Ðµ. Изберете изрично нÑкой от Ñ‚ÑÑ… чрез командата:" + +#: builtin/remote.c:1281 +#, c-format +msgid "Could not delete %s" +msgstr "„%s“ не може да бъде изтрит" + +#: builtin/remote.c:1289 +#, c-format +msgid "Not a valid ref: %s" +msgstr "Ðеправилен указател: %s" + +#: builtin/remote.c:1291 +#, c-format +msgid "Could not setup %s" +msgstr "„%s“ не може да Ñе наÑтрои" + +#: builtin/remote.c:1307 +#, c-format +msgid " %s will become dangling!" +msgstr "„%s“ ще Ñе превърне в обект извън клоните!" + +#: builtin/remote.c:1308 +#, c-format +msgid " %s has become dangling!" +msgstr "„%s“ Ñе превърна в обект извън клоните!" + +#: builtin/remote.c:1314 +#, c-format +msgid "Pruning %s" +msgstr "ОкаÑтрÑне на „%s“" + +#: builtin/remote.c:1315 +#, c-format +msgid "URL: %s" +msgstr "адреÑ: %s" + +#: builtin/remote.c:1328 +#, c-format +msgid " * [would prune] %s" +msgstr " * [ще бъде окаÑтрено] %s" + +#: builtin/remote.c:1331 +#, c-format +msgid " * [pruned] %s" +msgstr " * [окаÑтрено] %s" + +#: builtin/remote.c:1374 +msgid "prune remotes after fetching" +msgstr "окаÑтрÑне на огледалата на отдалечените хранилища Ñлед доÑтавÑне" + +#: builtin/remote.c:1440 builtin/remote.c:1514 +#, c-format +msgid "No such remote '%s'" +msgstr "ÐÑма отдалечено хранилище на име „%s“" + +#: builtin/remote.c:1460 +msgid "add branch" +msgstr "добавÑне на клон" + +#: builtin/remote.c:1467 +msgid "no remote specified" +msgstr "не е указано отдалечено хранилище" + +#: builtin/remote.c:1489 +msgid "manipulate push URLs" +msgstr "промÑна на адреÑите за изтлаÑкване" + +#: builtin/remote.c:1491 +msgid "add URL" +msgstr "добавÑне на адреÑи" + +#: builtin/remote.c:1493 +msgid "delete URLs" +msgstr "изтриване на адреÑи" + +#: builtin/remote.c:1500 +msgid "--add --delete doesn't make sense" +msgstr "опциите „--add“ и „--delete“ не могат да Ñе използват заедно" + +#: builtin/remote.c:1540 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "Ðеправилен (Ñтар) формат за адреÑ: %s" + +#: builtin/remote.c:1548 +#, c-format +msgid "No such URL found: %s" +msgstr "Такъв Ð°Ð´Ñ€ÐµÑ Ð½Ðµ е открит: %s" + +# MEANING +#: builtin/remote.c:1550 +msgid "Will not delete all non-push URLs" +msgstr "Ðикой от адреÑите, които не Ñа за изтлаÑкване, нÑма да Ñе изтрие" + +#: builtin/remote.c:1564 +msgid "be verbose; must be placed before a subcommand" +msgstr "повече подробноÑти. ПоÑÑ‚Ð°Ð²Ñ Ñе пред подкоманда" + +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +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 [--format=<format>] [-l [<pattern>]]" +msgstr "" + +#: builtin/replace.c:174 +msgid "list replace refs" +msgstr "" + +#: builtin/replace.c:175 +msgid "delete replace refs" +msgstr "" + +#: builtin/replace.c:176 +msgid "replace the ref if it exists" +msgstr "" + +#: builtin/replace.c:177 +msgid "use this format" +msgstr "" + +#: builtin/rerere.c:12 +msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" +msgstr "" + +#: builtin/rerere.c:57 +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] <tree-ish> [--] <paths>..." +msgstr "" + +#: builtin/reset.c:27 +msgid "git reset --patch [<tree-ish>] [--] [<paths>...]" +msgstr "" + +#: builtin/reset.c:33 +msgid "mixed" +msgstr "" + +#: builtin/reset.c:33 +msgid "soft" +msgstr "" + +#: builtin/reset.c:33 +msgid "hard" +msgstr "" + +#: builtin/reset.c:33 +msgid "merge" +msgstr "" + +#: builtin/reset.c:33 +msgid "keep" +msgstr "" + +#: builtin/reset.c:73 +msgid "You do not have a valid HEAD." +msgstr "" + +#: builtin/reset.c:75 +msgid "Failed to find tree of HEAD." +msgstr "" + +#: builtin/reset.c:81 +#, c-format +msgid "Failed to find tree of %s." +msgstr "" + +#: builtin/reset.c:99 +#, c-format +msgid "HEAD is now at %s" +msgstr "" + +#: builtin/reset.c:172 +#, c-format +msgid "Cannot do a %s reset in the middle of a merge." +msgstr "" + +#: builtin/reset.c:262 +msgid "be quiet, only report errors" +msgstr "" + +#: builtin/reset.c:264 +msgid "reset HEAD and index" +msgstr "" + +#: builtin/reset.c:265 +msgid "reset only HEAD" +msgstr "" + +#: builtin/reset.c:267 builtin/reset.c:269 +msgid "reset HEAD, index and working tree" +msgstr "" + +#: builtin/reset.c:271 +msgid "reset HEAD but keep local changes" +msgstr "" + +#: builtin/reset.c:289 +#, c-format +msgid "Failed to resolve '%s' as a valid revision." +msgstr "" + +#: builtin/reset.c:292 builtin/reset.c:300 +#, c-format +msgid "Could not parse object '%s'." +msgstr "" + +#: builtin/reset.c:297 +#, c-format +msgid "Failed to resolve '%s' as a valid tree." +msgstr "" + +#: builtin/reset.c:306 +msgid "--patch is incompatible with --{hard,mixed,soft}" +msgstr "" + +#: builtin/reset.c:315 +msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." +msgstr "" + +#: builtin/reset.c:317 +#, c-format +msgid "Cannot do %s reset with paths." +msgstr "" + +#: builtin/reset.c:327 +#, c-format +msgid "%s reset is not allowed in a bare repository" +msgstr "" + +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "" + +#: builtin/reset.c:350 +#, c-format +msgid "Could not reset index file to revision '%s'." +msgstr "" + +#: builtin/reset.c:355 +msgid "Could not write new index file." +msgstr "" + +#: builtin/rev-parse.c:359 +msgid "git rev-parse --parseopt [options] -- [<args>...]" +msgstr "" + +#: builtin/rev-parse.c:364 +msgid "keep the `--` passed as an arg" +msgstr "" + +#: builtin/rev-parse.c:366 +msgid "stop parsing after the first non-option argument" +msgstr "" + +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "" + +#: builtin/rev-parse.c:486 +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:71 +#, c-format +msgid "%s: %s cannot be used with %s" +msgstr "" + +#: builtin/revert.c:80 +msgid "end revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:81 +msgid "resume revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:82 +msgid "cancel revert or cherry-pick sequence" +msgstr "" + +#: builtin/revert.c:83 +msgid "don't automatically commit" +msgstr "" + +#: builtin/revert.c:84 +msgid "edit the commit message" +msgstr "" + +#: builtin/revert.c:87 +msgid "parent number" +msgstr "" + +#: builtin/revert.c:89 +msgid "merge strategy" +msgstr "" + +#: builtin/revert.c:90 +msgid "option" +msgstr "" + +#: builtin/revert.c:91 +msgid "option for merge strategy" +msgstr "" + +#: builtin/revert.c:102 +msgid "append commit name" +msgstr "" + +#: builtin/revert.c:103 +msgid "allow fast-forward" +msgstr "" + +#: builtin/revert.c:104 +msgid "preserve initially empty commits" +msgstr "" + +#: builtin/revert.c:105 +msgid "allow commits with empty messages" +msgstr "" + +#: builtin/revert.c:106 +msgid "keep redundant, empty commits" +msgstr "" + +#: builtin/revert.c:110 +msgid "program error" +msgstr "" + +#: builtin/revert.c:195 +msgid "revert failed" +msgstr "" + +#: builtin/revert.c:210 +msgid "cherry-pick failed" +msgstr "" + +#: builtin/rm.c:17 +msgid "git rm [options] [--] <file>..." +msgstr "git rm [ОПЦИИ] [--] <ФÐЙЛ>…" + +#: builtin/rm.c:65 +msgid "" +"the following submodule (or one of its nested submodules)\n" +"uses a .git directory:" +msgid_plural "" +"the following submodules (or one of its nested submodules)\n" +"use a .git directory:" +msgstr[0] "" +"ÑледниÑÑ‚ подмодул или нÑкой от неговите подмодули\n" +"използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° име „.git“:" +msgstr[1] "" +"Ñледните подмодули или нÑкои от техните подмодули\n" +"използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° име „.git“:" + +#: builtin/rm.c:71 +msgid "" +"\n" +"(use 'rm -rf' if you really want to remove it including all of its history)" +msgstr "" +"\n" +"(ако иÑкате да ги изтриете заедно Ñ Ñ†Ñлата им иÑториÑ, използвайте „rm -rf“)" + +#: builtin/rm.c:231 +msgid "" +"the following file has staged content different from both the\n" +"file and the HEAD:" +msgid_plural "" +"the following files have staged content different from both the\n" +"file and the HEAD:" +msgstr[0] "" +"ÑледниÑÑ‚ файл е ÑÑŠÑ Ñъдържание в индекÑа различно от текущото му Ñъдържание " +"и\n" +"различно от ÑъответÑтващото на HEAD:" +msgstr[1] "" +"Ñледните файлове Ñа ÑÑŠÑ Ñъдържание в индекÑа различно от текущото им " +"Ñъдържание и\n" +"различно от ÑъответÑтващото на HEAD:" + +#: builtin/rm.c:236 +msgid "" +"\n" +"(use -f to force removal)" +msgstr "" +"\n" +"(за принудително изтриване използвайте опциÑта „-f“)" + +#: builtin/rm.c:240 +msgid "the following file has changes staged in the index:" +msgid_plural "the following files have changes staged in the index:" +msgstr[0] "ÑледниÑÑ‚ файл е Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñъдържание в индекÑа:" +msgstr[1] "Ñледните файлове Ñа Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñъдържание в индекÑа:" + +#: builtin/rm.c:244 builtin/rm.c:255 +msgid "" +"\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "" +"\n" +"(за запазване на файла използвайте опциÑта „--cached“, а за принудително\n" +"изтриване — „-f“)" + +#: builtin/rm.c:252 +msgid "the following file has local modifications:" +msgid_plural "the following files have local modifications:" +msgstr[0] "ÑледниÑÑ‚ файл е Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñъдържание" +msgstr[1] "Ñледните файлове Ñа Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñъдържание" + +#: builtin/rm.c:270 +msgid "do not list removed files" +msgstr "да не Ñе извеждат изтритите файлове" + +#: builtin/rm.c:271 +msgid "only remove from the index" +msgstr "изтриване Ñамо от индекÑа" + +#: builtin/rm.c:272 +msgid "override the up-to-date check" +msgstr "въпреки проверката за актуалноÑтта на Ñъдържанието" + +#: builtin/rm.c:273 +msgid "allow recursive removal" +msgstr "рекурÑивно изтриване" + +#: builtin/rm.c:275 +msgid "exit with a zero status even if nothing matched" +msgstr "" +"изходниÑÑ‚ код да е 0, дори ако никой файл нe e напаÑнал Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° за " +"изтриване" + +#: builtin/rm.c:336 +#, c-format +msgid "not removing '%s' recursively without -r" +msgstr "без използването на опциÑта „-r“ „%s“ нÑма да Ñе изтрие рекурÑивно" + +#: builtin/rm.c:375 +#, c-format +msgid "git rm: unable to remove %s" +msgstr "git rm: „%s“ не може да Ñе изтрие" + +#: builtin/shortlog.c:13 +msgid "git shortlog [<options>] [<revision range>] [[--] [<path>...]]" +msgstr "" + +#: builtin/shortlog.c:131 +#, c-format +msgid "Missing author: %s" +msgstr "" + +#: builtin/shortlog.c:230 +msgid "sort output according to the number of commits per author" +msgstr "" + +#: builtin/shortlog.c:232 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "" + +#: builtin/shortlog.c:234 +msgid "Show the email address of each author" +msgstr "" + +#: builtin/shortlog.c:235 +msgid "w[,i1[,i2]]" +msgstr "" + +#: builtin/shortlog.c:236 +msgid "Linewrap output" +msgstr "" + +#: builtin/show-branch.c:9 +#, fuzzy +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 +#, fuzzy +msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "<брой>" + +#: builtin/show-branch.c:649 +msgid "show remote-tracking and local branches" +msgstr "" + +#: builtin/show-branch.c:651 +msgid "show remote-tracking branches" +msgstr "" + +#: builtin/show-branch.c:653 +msgid "color '*!+-' corresponding to the branch" +msgstr "" + +#: builtin/show-branch.c:655 +#, fuzzy +msgid "show <n> more commits after the common ancestor" +msgstr "<брой>" + +#: builtin/show-branch.c:657 +msgid "synonym to more=-1" +msgstr "" + +#: builtin/show-branch.c:658 +msgid "suppress naming strings" +msgstr "" + +#: builtin/show-branch.c:660 +msgid "include the current branch" +msgstr "" + +#: builtin/show-branch.c:662 +msgid "name commits with their object names" +msgstr "" + +#: builtin/show-branch.c:664 +msgid "show possible merge bases" +msgstr "" + +#: builtin/show-branch.c:666 +msgid "show refs unreachable from any other ref" +msgstr "" + +#: builtin/show-branch.c:668 +msgid "show commits in topological order" +msgstr "" + +#: builtin/show-branch.c:671 +msgid "show only commits not on the first branch" +msgstr "" + +#: builtin/show-branch.c:673 +msgid "show merges reachable from only one tip" +msgstr "" + +#: builtin/show-branch.c:675 +msgid "topologically sort, maintaining date order where possible" +msgstr "" + +#: builtin/show-branch.c:678 +#, fuzzy +msgid "<n>[,<base>]" +msgstr "<брой>" + +#: builtin/show-branch.c:679 +#, fuzzy +msgid "show <n> most recent ref-log entries starting at base" +msgstr "<брой>" + +#: builtin/show-ref.c:10 +#, fuzzy +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:168 +msgid "only show tags (can be combined with heads)" +msgstr "" + +#: builtin/show-ref.c:169 +msgid "only show heads (can be combined with tags)" +msgstr "" + +#: builtin/show-ref.c:170 +msgid "stricter reference checking, requires exact ref path" +msgstr "" + +#: builtin/show-ref.c:173 builtin/show-ref.c:175 +msgid "show the HEAD reference, even if it would be filtered out" +msgstr "" + +#: builtin/show-ref.c:177 +msgid "dereference tags into object IDs" +msgstr "" + +#: builtin/show-ref.c:179 +#, fuzzy +msgid "only show SHA1 hash using <n> digits" +msgstr "<брой>" + +#: builtin/show-ref.c:183 +msgid "do not print results to stdout (useful with --verify)" +msgstr "" + +#: builtin/show-ref.c:185 +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:8 +msgid "git symbolic-ref -d [-q] name" +msgstr "" + +#: builtin/symbolic-ref.c:40 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "" + +#: builtin/symbolic-ref.c:41 +msgid "delete symbolic ref" +msgstr "" + +#: builtin/symbolic-ref.c:42 +msgid "shorten ref output" +msgstr "" + +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 +msgid "reason" +msgstr "" + +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 +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 "" + +# FIXME +#: 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'" +msgstr "" + +#: builtin/tag.c:207 +#, c-format +msgid "tag name too long: %.*s..." +msgstr "" + +#: builtin/tag.c:212 +#, c-format +msgid "tag '%s' not found." +msgstr "" + +#: builtin/tag.c:227 +#, c-format +msgid "Deleted tag '%s' (was %s)\n" +msgstr "" + +#: builtin/tag.c:239 +#, c-format +msgid "could not verify the tag '%s'" +msgstr "" + +#: builtin/tag.c:249 +#, c-format +msgid "" +"\n" +"Write a tag message\n" +"Lines starting with '%c' will be ignored.\n" +msgstr "" + +#: builtin/tag.c:253 +#, c-format +msgid "" +"\n" +"Write a tag message\n" +"Lines starting with '%c' will be kept; you may remove them yourself if you " +"want to.\n" +msgstr "" + +#: builtin/tag.c:292 +msgid "unable to sign the tag" +msgstr "" + +#: builtin/tag.c:294 +msgid "unable to write tag file" +msgstr "" + +#: builtin/tag.c:319 +msgid "bad object type." +msgstr "" + +#: builtin/tag.c:332 +msgid "tag header too big." +msgstr "" + +#: builtin/tag.c:368 +msgid "no tag message?" +msgstr "" + +#: builtin/tag.c:374 +#, c-format +msgid "The tag message has been left in %s\n" +msgstr "" + +#: builtin/tag.c:423 +msgid "switch 'points-at' requires an object" +msgstr "" + +#: builtin/tag.c:425 +#, c-format +msgid "malformed object name '%s'" +msgstr "" + +#: builtin/tag.c:445 +msgid "list tag names" +msgstr "" + +#: builtin/tag.c:447 +#, fuzzy +msgid "print <n> lines of each tag message" +msgstr "<брой>" + +#: builtin/tag.c:449 +msgid "delete tags" +msgstr "" + +#: builtin/tag.c:450 +msgid "verify tags" +msgstr "" + +#: builtin/tag.c:452 +msgid "Tag creation options" +msgstr "" + +#: builtin/tag.c:454 +msgid "annotated tag, needs a message" +msgstr "" + +#: builtin/tag.c:456 +msgid "tag message" +msgstr "" + +#: builtin/tag.c:458 +msgid "annotated and GPG-signed tag" +msgstr "" + +#: builtin/tag.c:462 +msgid "use another key to sign the tag" +msgstr "" + +#: builtin/tag.c:463 +msgid "replace the tag if exists" +msgstr "" + +#: builtin/tag.c:464 +msgid "show tag list in columns" +msgstr "" + +#: builtin/tag.c:466 +msgid "Tag listing options" +msgstr "" + +#: builtin/tag.c:469 +msgid "print only tags that contain the commit" +msgstr "" + +#: builtin/tag.c:475 +msgid "print only tags of the object" +msgstr "" + +#: builtin/tag.c:501 +msgid "--column and -n are incompatible" +msgstr "" + +#: builtin/tag.c:518 +msgid "-n option is only allowed with -l." +msgstr "" + +#: builtin/tag.c:520 +msgid "--contains option is only allowed with -l." +msgstr "" + +#: builtin/tag.c:522 +msgid "--points-at option is only allowed with -l." +msgstr "" + +#: builtin/tag.c:530 +msgid "only one -F or -m option is allowed." +msgstr "" + +#: builtin/tag.c:550 +msgid "too many params" +msgstr "" + +#: builtin/tag.c:556 +#, c-format +msgid "'%s' is not a valid tag name." +msgstr "" + +#: builtin/tag.c:561 +#, c-format +msgid "tag '%s' already exists" +msgstr "" + +#: builtin/tag.c:579 +#, c-format +msgid "%s: cannot lock the ref" +msgstr "" + +#: builtin/tag.c:581 +#, c-format +msgid "%s: cannot update the ref" +msgstr "" + +#: builtin/tag.c:583 +#, c-format +msgid "Updated tag '%s' (was %s)\n" +msgstr "" + +#: builtin/update-index.c:402 +msgid "git update-index [options] [--] [<file>...]" +msgstr "" + +#: builtin/update-index.c:720 +msgid "continue refresh even when index needs update" +msgstr "" + +#: builtin/update-index.c:723 +msgid "refresh: ignore submodules" +msgstr "" + +#: builtin/update-index.c:726 +msgid "do not ignore new files" +msgstr "" + +#: builtin/update-index.c:728 +msgid "let files replace directories and vice-versa" +msgstr "" + +#: builtin/update-index.c:730 +msgid "notice files missing from worktree" +msgstr "" + +#: builtin/update-index.c:732 +msgid "refresh even if index contains unmerged entries" +msgstr "" + +#: builtin/update-index.c:735 +msgid "refresh stat information" +msgstr "" + +#: builtin/update-index.c:739 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "" + +#: builtin/update-index.c:743 +msgid "<mode> <object> <path>" +msgstr "" + +#: builtin/update-index.c:744 +msgid "add the specified entry to the index" +msgstr "" + +#: builtin/update-index.c:748 +msgid "(+/-)x" +msgstr "" + +#: builtin/update-index.c:749 +msgid "override the executable bit of the listed files" +msgstr "" + +#: builtin/update-index.c:753 +msgid "mark files as \"not changing\"" +msgstr "" + +#: builtin/update-index.c:756 +msgid "clear assumed-unchanged bit" +msgstr "" + +#: builtin/update-index.c:759 +msgid "mark files as \"index-only\"" +msgstr "" + +#: builtin/update-index.c:762 +msgid "clear skip-worktree bit" +msgstr "" + +#: builtin/update-index.c:765 +msgid "add to index only; do not add content to object database" +msgstr "" + +#: builtin/update-index.c:767 +msgid "remove named paths even if present in worktree" +msgstr "" + +#: builtin/update-index.c:769 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "" + +#: builtin/update-index.c:771 +msgid "read list of paths to be updated from standard input" +msgstr "" + +#: builtin/update-index.c:775 +msgid "add entries from standard input to the index" +msgstr "" + +#: builtin/update-index.c:779 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "" + +#: builtin/update-index.c:783 +msgid "only update entries that differ from HEAD" +msgstr "" + +#: builtin/update-index.c:787 +msgid "ignore files missing from worktree" +msgstr "" + +#: builtin/update-index.c:790 +msgid "report actions to standard output" +msgstr "" + +#: builtin/update-index.c:792 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "" + +#: builtin/update-index.c:796 +msgid "write index in this format" +msgstr "" + +#: builtin/update-ref.c:9 +msgid "git update-ref [options] -d <refname> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:10 +msgid "git update-ref [options] <refname> <newval> [<oldval>]" +msgstr "" + +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "" + +#: builtin/update-ref.c:255 +msgid "delete the reference" +msgstr "" + +#: builtin/update-ref.c:257 +msgid "update <refname> not the one it points to" +msgstr "" + +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +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:17 +msgid "" +"'git help -a' and 'git help -g' lists available subcommands and some\n" +"concept guides. See 'git help <command>' or 'git help <concept>'\n" +"to read about a specific subcommand or concept." +msgstr "" + +#: parse-options.h:146 +msgid "expiry date" +msgstr "период на валидноÑÑ‚" + +#: parse-options.h:161 +msgid "no-op (backward compatibility)" +msgstr "нулева Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ (за ÑъвмеÑтимоÑÑ‚ Ñ Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸ верÑии)" + +#: parse-options.h:235 +msgid "be more verbose" +msgstr "повече подробноÑти" + +#: parse-options.h:237 +msgid "be more quiet" +msgstr "по-малко подробноÑти" + +# FIXME +#: parse-options.h:243 +msgid "use <n> digits to display SHA-1s" +msgstr "да Ñе показват такъв <брой> цифри от Ñумите по SHA1" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "" + +#: common-cmds.h:17 +msgid "Create an empty Git repository or reinitialize an existing one" +msgstr "" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "" + +#: common-cmds.h:21 +msgid "Fetch from and integrate with another repository or a local branch" +msgstr "" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "" + +#: git-am.sh:50 +msgid "You need to set your committer info first" +msgstr "" + +#: git-am.sh:95 +msgid "" +"You seem to have moved HEAD since the last 'am' failure.\n" +"Not rewinding to ORIG_HEAD" +msgstr "" + +#: git-am.sh:105 +#, sh-format +msgid "" +"When you have resolved this problem, run \"$cmdline --continue\".\n" +"If you prefer to skip this patch, run \"$cmdline --skip\" instead.\n" +"To restore the original branch and stop patching, run \"$cmdline --abort\"." +msgstr "" + +#: git-am.sh:121 +msgid "Cannot fall back to three-way merge." +msgstr "" + +#: git-am.sh:137 +msgid "Repository lacks necessary blobs to fall back on 3-way merge." +msgstr "" + +#: git-am.sh:139 +msgid "Using index info to reconstruct a base tree..." +msgstr "" + +#: git-am.sh:154 +msgid "" +"Did you hand edit your patch?\n" +"It does not apply to blobs recorded in its index." +msgstr "" + +#: git-am.sh:163 +msgid "Falling back to patching base and 3-way merge..." +msgstr "" + +#: git-am.sh:179 +msgid "Failed to merge in the changes." +msgstr "" + +#: git-am.sh:274 +msgid "Only one StGIT patch series can be applied at once" +msgstr "" + +#: git-am.sh:361 +#, sh-format +msgid "Patch format $patch_format is not supported." +msgstr "" + +#: git-am.sh:363 +msgid "Patch format detection failed." +msgstr "" + +#: git-am.sh:389 +msgid "" +"The -b/--binary option has been a no-op for long time, and\n" +"it will be removed. Please do not use it anymore." +msgstr "" + +#: git-am.sh:479 +#, sh-format +msgid "previous rebase directory $dotest still exists but mbox given." +msgstr "" + +#: git-am.sh:484 +msgid "Please make up your mind. --skip or --abort?" +msgstr "" + +#: git-am.sh:520 +#, sh-format +msgid "" +"Stray $dotest directory found.\n" +"Use \"git am --abort\" to remove it." +msgstr "" + +#: git-am.sh:528 +msgid "Resolve operation not in progress, we are not resuming." +msgstr "" + +#: git-am.sh:594 +#, sh-format +msgid "Dirty index: cannot apply patches (dirty: $files)" +msgstr "" + +#: git-am.sh:698 +#, sh-format +msgid "" +"Patch is empty. Was it split wrong?\n" +"If you would prefer to skip this patch, instead run \"$cmdline --skip\".\n" +"To restore the original branch and stop patching run \"$cmdline --abort\"." +msgstr "" + +#: git-am.sh:725 +msgid "Patch does not have a valid e-mail address." +msgstr "" + +#: git-am.sh:772 +msgid "cannot be interactive without stdin connected to a terminal." +msgstr "" + +#: git-am.sh:776 +msgid "Commit Body is:" +msgstr "" + +#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] +#. in your translation. The program will only accept English +#. input at this point. +#: git-am.sh:783 +msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " +msgstr "" + +#: git-am.sh:819 +#, sh-format +msgid "Applying: $FIRSTLINE" +msgstr "" + +#: git-am.sh:840 +msgid "" +"No changes - did you forget to use 'git add'?\n" +"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 "" + +#: git-am.sh:848 +msgid "" +"You still have unmerged paths in your index\n" +"did you forget to use 'git add'?" +msgstr "" + +#: git-am.sh:864 +msgid "No changes -- Patch already applied." +msgstr "" + +#: git-am.sh:874 +#, sh-format +msgid "Patch failed at $msgnum $FIRSTLINE" +msgstr "" + +#: git-am.sh:877 +#, sh-format +msgid "" +"The copy of the patch that failed is found in:\n" +" $dotest/patch" +msgstr "" + +#: git-am.sh:895 +msgid "applying to an empty history" +msgstr "" + +#: git-bisect.sh:48 +msgid "You need to start by \"git bisect start\"" +msgstr "" + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:54 +msgid "Do you want me to do it for you [Y/n]? " +msgstr "" + +#: git-bisect.sh:95 +#, sh-format +msgid "unrecognised option: '$arg'" +msgstr "" + +#: git-bisect.sh:99 +#, sh-format +msgid "'$arg' does not appear to be a valid revision" +msgstr "" + +#: git-bisect.sh:117 +msgid "Bad HEAD - I need a HEAD" +msgstr "" + +#: git-bisect.sh:130 +#, sh-format +msgid "" +"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." +msgstr "" + +#: git-bisect.sh:140 +msgid "won't bisect on cg-seek'ed tree" +msgstr "" + +#: git-bisect.sh:144 +msgid "Bad HEAD - strange symbolic ref" +msgstr "" + +#: git-bisect.sh:189 +#, sh-format +msgid "Bad bisect_write argument: $state" +msgstr "" + +#: git-bisect.sh:218 +#, sh-format +msgid "Bad rev input: $arg" +msgstr "" + +#: git-bisect.sh:232 +msgid "Please call 'bisect_state' with at least one argument." +msgstr "" + +#: git-bisect.sh:244 +#, sh-format +msgid "Bad rev input: $rev" +msgstr "" + +#: git-bisect.sh:250 +msgid "'git bisect bad' can take only one argument." +msgstr "" + +#. 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 "" + +#. 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 "" + +#: git-bisect.sh:289 +msgid "" +"You need to give me at least one good and one bad revisions.\n" +"(You can use \"git bisect bad\" and \"git bisect good\" for that.)" +msgstr "" + +#: git-bisect.sh:292 +msgid "" +"You need to start by \"git bisect start\".\n" +"You then need to give me at least one good and one bad revisions.\n" +"(You can use \"git bisect bad\" and \"git bisect good\" for that.)" +msgstr "" + +#: git-bisect.sh:363 git-bisect.sh:490 +msgid "We are not bisecting." +msgstr "" + +#: git-bisect.sh:370 +#, sh-format +msgid "'$invalid' is not a valid commit" +msgstr "" + +#: git-bisect.sh:379 +#, sh-format +msgid "" +"Could not check out original HEAD '$branch'.\n" +"Try 'git bisect reset <commit>'." +msgstr "" + +#: git-bisect.sh:406 +msgid "No logfile given" +msgstr "" + +#: git-bisect.sh:407 +#, sh-format +msgid "cannot read $file for replaying" +msgstr "" + +#: git-bisect.sh:424 +msgid "?? what are you talking about?" +msgstr "" + +#: git-bisect.sh:436 +#, sh-format +msgid "running $command" +msgstr "" + +#: git-bisect.sh:443 +#, sh-format +msgid "" +"bisect run failed:\n" +"exit code $res from '$command' is < 0 or >= 128" +msgstr "" + +#: git-bisect.sh:469 +msgid "bisect run cannot continue any more" +msgstr "" + +#: git-bisect.sh:475 +#, sh-format +msgid "" +"bisect run failed:\n" +"'bisect_state $state' exited with error code $res" +msgstr "" + +#: git-bisect.sh:482 +msgid "bisect run success" +msgstr "" + +#: git-pull.sh:21 +msgid "" +"Pull is not possible because you have unmerged files.\n" +"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" +"as appropriate to mark resolution, or use 'git commit -a'." +msgstr "" + +#: git-pull.sh:25 +msgid "Pull is not possible because you have unmerged files." +msgstr "" + +#: git-pull.sh:223 +msgid "updating an unborn branch with changes added to the index" +msgstr "" + +#. The fetch involved updating the current branch. +#. The working tree and the index file is still based on the +#. $orig_head commit, but we are merging into $curr_head. +#. First update the working tree to match $curr_head. +#: git-pull.sh:247 +#, sh-format +msgid "" +"Warning: fetch updated the current branch head.\n" +"Warning: fast-forwarding your working tree from\n" +"Warning: commit $orig_head." +msgstr "" + +#: git-pull.sh:272 +msgid "Cannot merge multiple branches into empty head" +msgstr "" + +#: git-pull.sh:276 +msgid "Cannot rebase onto multiple branches" +msgstr "" + +#: git-rebase.sh:55 +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" +"\"." +msgstr "" + +#: git-rebase.sh:158 +msgid "Applied autostash." +msgstr "" + +#: git-rebase.sh:161 +#, sh-format +msgid "Cannot store $stash_sha1" +msgstr "" + +#: git-rebase.sh:162 +msgid "" +"Applying autostash resulted in conflicts.\n" +"Your changes are safe in the stash.\n" +"You can run \"git stash pop\" or \"git stash drop\" at any time.\n" +msgstr "" + +#: git-rebase.sh:201 +msgid "The pre-rebase hook refused to rebase." +msgstr "" + +#: git-rebase.sh:206 +msgid "It looks like git-am is in progress. Cannot rebase." +msgstr "" + +#: git-rebase.sh:346 +msgid "The --exec option must be used with the --interactive option" +msgstr "" + +#: git-rebase.sh:351 +msgid "No rebase in progress?" +msgstr "" + +#: git-rebase.sh:362 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "" + +#: git-rebase.sh:369 +msgid "Cannot read HEAD" +msgstr "" + +#: git-rebase.sh:372 +msgid "" +"You must edit all merge conflicts and then\n" +"mark them as resolved using git add" +msgstr "" + +#: git-rebase.sh:390 +#, sh-format +msgid "Could not move back to $head_name" +msgstr "" + +# FIXME +#: git-rebase.sh:409 +#, sh-format +msgid "" +"It seems that there is already a $state_dir_base directory, and\n" +"I wonder if you are in the middle of another rebase. If that is the\n" +"case, please try\n" +"\t$cmd_live_rebase\n" +"If that is not the case, please\n" +"\t$cmd_clear_stale_rebase\n" +"and run me again. I am stopping in case you still have something\n" +"valuable there." +msgstr "" + +#: git-rebase.sh:456 +#, sh-format +msgid "invalid upstream $upstream_name" +msgstr "" + +#: git-rebase.sh:480 +#, sh-format +msgid "$onto_name: there are more than one merge bases" +msgstr "" + +#: git-rebase.sh:483 git-rebase.sh:487 +#, sh-format +msgid "$onto_name: there is no merge base" +msgstr "" + +#: git-rebase.sh:492 +#, sh-format +msgid "Does not point to a valid commit: $onto_name" +msgstr "" + +#: git-rebase.sh:515 +#, sh-format +msgid "fatal: no such branch: $branch_name" +msgstr "" + +#: git-rebase.sh:548 +msgid "Cannot autostash" +msgstr "" + +#: git-rebase.sh:553 +#, sh-format +msgid "Created autostash: $stash_abbrev" +msgstr "" + +#: git-rebase.sh:557 +msgid "Please commit or stash them." +msgstr "" + +#: git-rebase.sh:577 +#, sh-format +msgid "Current branch $branch_name is up to date." +msgstr "" + +#: git-rebase.sh:581 +#, sh-format +msgid "Current branch $branch_name is up to date, rebase forced." +msgstr "" + +#: git-rebase.sh:592 +#, sh-format +msgid "Changes from $mb to $onto:" +msgstr "" + +#. Detach HEAD and reset the tree +#: git-rebase.sh:601 +msgid "First, rewinding head to replay your work on top of it..." +msgstr "" + +#: git-rebase.sh:611 +#, sh-format +msgid "Fast-forwarded $branch_name to $onto_name." +msgstr "" + +#: git-stash.sh:51 +msgid "git stash clear with parameters is unimplemented" +msgstr "" + +#: git-stash.sh:74 +msgid "You do not have the initial commit yet" +msgstr "" + +#: git-stash.sh:89 +msgid "Cannot save the current index state" +msgstr "" + +#: git-stash.sh:123 git-stash.sh:136 +msgid "Cannot save the current worktree state" +msgstr "" + +#: git-stash.sh:140 +msgid "No changes selected" +msgstr "" + +#: git-stash.sh:143 +msgid "Cannot remove temporary index (can't happen)" +msgstr "" + +#: git-stash.sh:156 +msgid "Cannot record working tree state" +msgstr "" + +#: git-stash.sh:190 +#, sh-format +msgid "Cannot update $ref_stash with $w_commit" +msgstr "" + +#. TRANSLATORS: $option is an invalid option, like +#. `--blah-blah'. The 7 spaces at the beginning of the +#. second line correspond to "error: ". So you should line +#. up the second line with however many characters the +#. translation of "error: " takes in your language. E.g. in +#. English this is: +#. +#. $ git stash save --blah-blah 2>&1 | head -n 2 +#. error: unknown option for 'stash save': --blah-blah +#. To provide a message, use git stash save -- '--blah-blah' +#: git-stash.sh:237 +#, sh-format +msgid "" +"error: unknown option for 'stash save': $option\n" +" To provide a message, use git stash save -- '$option'" +msgstr "" + +#: git-stash.sh:258 +msgid "No local changes to save" +msgstr "" + +#: git-stash.sh:262 +msgid "Cannot initialize stash" +msgstr "" + +#: git-stash.sh:266 +msgid "Cannot save the current status" +msgstr "" + +#: git-stash.sh:284 +msgid "Cannot remove worktree changes" +msgstr "" + +#: git-stash.sh:383 +msgid "No stash found." +msgstr "" + +#: git-stash.sh:390 +#, sh-format +msgid "Too many revisions specified: $REV" +msgstr "" + +#: git-stash.sh:396 +#, sh-format +msgid "$reference is not valid reference" +msgstr "" + +#: git-stash.sh:424 +#, sh-format +msgid "'$args' is not a stash-like commit" +msgstr "" + +#: git-stash.sh:435 +#, sh-format +msgid "'$args' is not a stash reference" +msgstr "" + +#: git-stash.sh:443 +msgid "unable to refresh index" +msgstr "" + +#: git-stash.sh:447 +msgid "Cannot apply a stash in the middle of a merge" +msgstr "" + +#: git-stash.sh:455 +msgid "Conflicts in index. Try without --index." +msgstr "" + +#: git-stash.sh:457 +msgid "Could not save index tree" +msgstr "" + +#: git-stash.sh:491 +msgid "Cannot unstage modified files" +msgstr "" + +#: git-stash.sh:506 +msgid "Index was not unstashed." +msgstr "" + +#: git-stash.sh:523 +#, sh-format +msgid "Dropped ${REV} ($s)" +msgstr "" + +#: git-stash.sh:524 +#, sh-format +msgid "${REV}: Could not drop stash entry" +msgstr "" + +#: git-stash.sh:531 +msgid "No branch name specified" +msgstr "" + +#: git-stash.sh:603 +msgid "(To restore them type \"git stash apply\")" +msgstr "" + +#: git-submodule.sh:95 +#, sh-format +msgid "cannot strip one component off url '$remoteurl'" +msgstr "" + +#: git-submodule.sh:237 +#, sh-format +msgid "No submodule mapping found in .gitmodules for path '$sm_path'" +msgstr "" + +#: git-submodule.sh:281 +#, sh-format +msgid "Clone of '$url' into submodule path '$sm_path' failed" +msgstr "" + +#: git-submodule.sh:293 +#, sh-format +msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" +msgstr "" + +#: git-submodule.sh:403 +msgid "Relative path can only be used from the toplevel of the working tree" +msgstr "" + +#: git-submodule.sh:413 +#, sh-format +msgid "repo URL: '$repo' must be absolute or begin with ./|../" +msgstr "" + +#: git-submodule.sh:430 +#, sh-format +msgid "'$sm_path' already exists in the index" +msgstr "" + +#: git-submodule.sh:434 +#, 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 "" + +#: git-submodule.sh:452 +#, sh-format +msgid "Adding existing repo at '$sm_path' to the index" +msgstr "" + +#: git-submodule.sh:454 +#, sh-format +msgid "'$sm_path' already exists and is not a valid git repo" +msgstr "" + +#: git-submodule.sh:462 +#, sh-format +msgid "A git directory for '$sm_name' is found locally with remote(s):" +msgstr "" + +#: git-submodule.sh:464 +#, sh-format +msgid "" +"If you want to reuse this local git directory instead of cloning again from" +msgstr "" + +#: git-submodule.sh:466 +#, sh-format +msgid "" +"use the '--force' option. If the local git directory is not the correct repo" +msgstr "" + +#: git-submodule.sh:467 +#, sh-format +msgid "" +"or you are unsure what this means choose another name with the '--name' " +"option." +msgstr "" + +#: git-submodule.sh:469 +#, sh-format +msgid "Reactivating local git directory for submodule '$sm_name'." +msgstr "" + +#: git-submodule.sh:481 +#, sh-format +msgid "Unable to checkout submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:486 +#, sh-format +msgid "Failed to add submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:495 +#, sh-format +msgid "Failed to register submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:539 +#, sh-format +msgid "Entering '$prefix$displaypath'" +msgstr "" + +#: git-submodule.sh:559 +#, sh-format +msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." +msgstr "" + +#: git-submodule.sh:605 +#, sh-format +msgid "No url found for submodule path '$displaypath' in .gitmodules" +msgstr "" + +#: git-submodule.sh:614 +#, sh-format +msgid "Failed to register url for submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:616 +#, sh-format +msgid "Submodule '$name' ($url) registered for path '$displaypath'" +msgstr "" + +#: git-submodule.sh:633 +#, sh-format +msgid "Failed to register update mode for submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:671 +#, sh-format +msgid "Use '.' if you really want to deinitialize all submodules" +msgstr "" + +#: git-submodule.sh:688 +#, sh-format +msgid "Submodule work tree '$displaypath' contains a .git directory" +msgstr "" + +#: git-submodule.sh:689 +#, sh-format +msgid "" +"(use 'rm -rf' if you really want to remove it including all of its history)" +msgstr "" + +#: git-submodule.sh:695 +#, sh-format +msgid "" +"Submodule work tree '$displaypath' contains local modifications; use '-f' to " +"discard them" +msgstr "" + +#: git-submodule.sh:698 +#, sh-format +msgid "Cleared directory '$displaypath'" +msgstr "" + +#: git-submodule.sh:699 +#, sh-format +msgid "Could not remove submodule work tree '$displaypath'" +msgstr "" + +#: git-submodule.sh:702 +#, sh-format +msgid "Could not create empty submodule directory '$displaypath'" +msgstr "" + +#: git-submodule.sh:711 +#, sh-format +msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" +msgstr "" + +#: git-submodule.sh:834 +#, sh-format +msgid "" +"Submodule path '$displaypath' not initialized\n" +"Maybe you want to use 'update --init'?" +msgstr "" + +#: git-submodule.sh:847 +#, sh-format +msgid "Unable to find current revision in submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:856 +#, sh-format +msgid "Unable to fetch in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:880 +#, sh-format +msgid "Unable to fetch in submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:894 +#, sh-format +msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:895 +#, sh-format +msgid "Submodule path '$displaypath': rebased into '$sha1'" +msgstr "" + +#: git-submodule.sh:900 +#, sh-format +msgid "Unable to merge '$sha1' in submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:901 +#, sh-format +msgid "Submodule path '$displaypath': merged in '$sha1'" +msgstr "" + +#: git-submodule.sh:906 +#, sh-format +msgid "" +"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" +msgstr "" + +#: git-submodule.sh:907 +#, sh-format +msgid "Submodule path '$prefix$sm_path': '$command $sha1'" +msgstr "" + +#: git-submodule.sh:912 +#, sh-format +msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:913 +#, sh-format +msgid "Submodule path '$displaypath': checked out '$sha1'" +msgstr "" + +#: git-submodule.sh:940 +#, sh-format +msgid "Failed to recurse into submodule path '$displaypath'" +msgstr "" + +#: git-submodule.sh:1048 +msgid "The --cached option cannot be used with the --files option" +msgstr "" + +#. unexpected type +#: git-submodule.sh:1096 +#, sh-format +msgid "unexpected mode $mod_dst" +msgstr "" + +#: git-submodule.sh:1116 +#, sh-format +msgid " Warn: $display_name doesn't contain commit $sha1_src" +msgstr "" + +#: git-submodule.sh:1119 +#, sh-format +msgid " Warn: $display_name doesn't contain commit $sha1_dst" +msgstr "" + +#: git-submodule.sh:1122 +#, sh-format +msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" +msgstr "" + +#: git-submodule.sh:1147 +msgid "blob" +msgstr "" + +#: git-submodule.sh:1261 +#, sh-format +msgid "Failed to recurse into submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:1325 +#, sh-format +msgid "Synchronizing submodule url for '$displaypath'" +msgstr "" diff --git a/po/da.po b/po/da.po deleted file mode 100644 index 898b18d115..0000000000 --- a/po/da.po +++ /dev/null @@ -1,3503 +0,0 @@ -# Danish translations for Git. -# This file is distributed under the same license as the PACKAGE package. -# Byrial Jensen <byrial@vip.cybercity.dk>, 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: Git\n" -"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-03-16 20:18+0800\n" -"PO-Revision-Date: 2012-04-10 18:41+0200\n" -"Last-Translator: Byrial Jensen <byrial@vip.cybercity.dk>\n" -"Language-Team: Danish <dansk@dansk-gruppen.dk>\n" -"Language: da\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: advice.c:34 -#, c-format -msgid "hint: %.*s\n" -msgstr "" - -#. -#. * Message used both when 'git commit' fails and when -#. * other commands doing a merge do. -#. -#: advice.c:64 -msgid "" -"Fix them up in the work tree,\n" -"and then use 'git add/rm <file>' as\n" -"appropriate to mark resolution and make a commit,\n" -"or use 'git commit -a'." -msgstr "" - -#: commit.c:47 -#, c-format -msgid "could not parse %s" -msgstr "" - -#: commit.c:49 -#, c-format -msgid "%s %s is not a commit!" -msgstr "" - -#: compat/obstack.c:406 compat/obstack.c:408 -msgid "memory exhausted" -msgstr "" - -#: connected.c:39 -msgid "Could not run 'git rev-list'" -msgstr "" - -#: connected.c:48 -#, c-format -msgid "failed write to rev-list: %s" -msgstr "" - -#: connected.c:56 -#, c-format -msgid "failed to close rev-list's stdin: %s" -msgstr "" - -#: diff.c:105 -#, c-format -msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" -msgstr "" - -#: diff.c:110 -#, c-format -msgid " Unknown dirstat parameter '%.*s'\n" -msgstr "" - -#: diff.c:210 -#, c-format -msgid "" -"Found errors in 'diff.dirstat' config variable:\n" -"%s" -msgstr "" - -#: diff.c:1336 -msgid " 0 files changed\n" -msgstr "" - -#: diff.c:1340 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1357 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1368 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:3424 -#, c-format -msgid "" -"Failed to parse --dirstat/-X option parameter:\n" -"%s" -msgstr "" - -#: gpg-interface.c:59 -msgid "could not run gpg." -msgstr "" - -#: gpg-interface.c:71 -msgid "gpg did not accept the data" -msgstr "" - -#: gpg-interface.c:82 -msgid "gpg failed to sign the data" -msgstr "" - -#: grep.c:1280 -#, c-format -msgid "'%s': unable to read %s" -msgstr "" - -#: grep.c:1297 -#, c-format -msgid "'%s': %s" -msgstr "" - -#: grep.c:1308 -#, c-format -msgid "'%s': short read %s" -msgstr "" - -#: help.c:287 -#, c-format -msgid "" -"'%s' appears to be a git command, but we were not\n" -"able to execute it. Maybe git-%s is broken?" -msgstr "" - -#: remote.c:1607 -#, 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] "" -msgstr[1] "" - -#: remote.c:1613 -#, 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] "" -msgstr[1] "" - -#: remote.c:1621 -#, c-format -msgid "" -"Your branch and '%s' have diverged,\n" -"and have %d and %d different commit each, respectively.\n" -msgid_plural "" -"Your branch and '%s' have diverged,\n" -"and have %d and %d different commits each, respectively.\n" -msgstr[0] "" -msgstr[1] "" - -#: sequencer.c:120 builtin/merge.c:864 builtin/merge.c:985 -#: builtin/merge.c:1095 builtin/merge.c:1105 -#, c-format -msgid "Could not open '%s' for writing" -msgstr "" - -#: sequencer.c:122 builtin/merge.c:334 builtin/merge.c:867 -#: builtin/merge.c:1097 builtin/merge.c:1110 -#, c-format -msgid "Could not write to '%s'" -msgstr "" - -#: sequencer.c:143 -msgid "" -"after resolving the conflicts, mark the corrected paths\n" -"with 'git add <paths>' or 'git rm <paths>'" -msgstr "" - -#: sequencer.c:146 -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:159 sequencer.c:685 sequencer.c:768 -#, c-format -msgid "Could not write to %s" -msgstr "" - -#: sequencer.c:162 -#, c-format -msgid "Error wrapping up %s" -msgstr "" - -#: sequencer.c:177 -msgid "Your local changes would be overwritten by cherry-pick." -msgstr "" - -#: sequencer.c:179 -msgid "Your local changes would be overwritten by revert." -msgstr "" - -#: sequencer.c:182 -msgid "Commit your changes or stash them to proceed." -msgstr "" - -#. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:232 -#, c-format -msgid "%s: Unable to write new index file" -msgstr "" - -#: sequencer.c:298 -msgid "Your index file is unmerged." -msgstr "" - -#: sequencer.c:301 -msgid "You do not have a valid HEAD" -msgstr "" - -#: sequencer.c:316 -#, c-format -msgid "Commit %s is a merge but no -m option was given." -msgstr "" - -#: sequencer.c:324 -#, c-format -msgid "Commit %s does not have parent %d" -msgstr "" - -#: sequencer.c:328 -#, 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:339 -#, c-format -msgid "%s: cannot parse parent commit %s" -msgstr "" - -#: sequencer.c:343 -#, c-format -msgid "Cannot get commit message for %s" -msgstr "" - -#: sequencer.c:427 -#, c-format -msgid "could not revert %s... %s" -msgstr "" - -#: sequencer.c:428 -#, c-format -msgid "could not apply %s... %s" -msgstr "" - -#: sequencer.c:450 sequencer.c:909 builtin/log.c:288 builtin/log.c:713 -#: builtin/log.c:1329 builtin/log.c:1548 builtin/merge.c:348 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "" - -#: sequencer.c:453 -msgid "empty commit set passed" -msgstr "" - -#: sequencer.c:461 -#, c-format -msgid "git %s: failed to read the index" -msgstr "" - -#: sequencer.c:466 -#, c-format -msgid "git %s: failed to refresh the index" -msgstr "" - -#: sequencer.c:551 -#, c-format -msgid "Cannot %s during a %s" -msgstr "" - -#: sequencer.c:573 -#, c-format -msgid "Could not parse line %d." -msgstr "" - -#: sequencer.c:578 -msgid "No commits parsed." -msgstr "" - -#: sequencer.c:591 -#, c-format -msgid "Could not open %s" -msgstr "" - -#: sequencer.c:595 -#, c-format -msgid "Could not read %s." -msgstr "" - -#: sequencer.c:602 -#, c-format -msgid "Unusable instruction sheet: %s" -msgstr "" - -#: sequencer.c:630 -#, c-format -msgid "Invalid key: %s" -msgstr "" - -#: sequencer.c:633 -#, c-format -msgid "Invalid value for %s: %s" -msgstr "" - -#: sequencer.c:645 -#, c-format -msgid "Malformed options sheet: %s" -msgstr "" - -#: sequencer.c:666 -msgid "a cherry-pick or revert is already in progress" -msgstr "" - -#: sequencer.c:667 -msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" -msgstr "" - -#: sequencer.c:671 -#, c-format -msgid "Could not create sequencer directory %s" -msgstr "" - -#: sequencer.c:687 sequencer.c:772 -#, c-format -msgid "Error wrapping up %s." -msgstr "" - -#: sequencer.c:706 sequencer.c:840 -msgid "no cherry-pick or revert in progress" -msgstr "" - -#: sequencer.c:708 -msgid "cannot resolve HEAD" -msgstr "" - -#: sequencer.c:710 -msgid "cannot abort from a branch yet to be born" -msgstr "" - -#: sequencer.c:732 -#, c-format -msgid "cannot open %s: %s" -msgstr "" - -#: sequencer.c:735 -#, c-format -msgid "cannot read %s: %s" -msgstr "" - -#: sequencer.c:736 -msgid "unexpected end of file" -msgstr "" - -#: sequencer.c:742 -#, c-format -msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" -msgstr "" - -#: sequencer.c:765 -#, c-format -msgid "Could not format %s." -msgstr "" - -#: sequencer.c:927 -msgid "Can't revert as initial commit" -msgstr "" - -#: sequencer.c:928 -msgid "Can't cherry-pick into empty head" -msgstr "" - -#: wt-status.c:134 -msgid "Unmerged paths:" -msgstr "" - -#: wt-status.c:140 wt-status.c:157 -#, c-format -msgid " (use \"git reset %s <file>...\" to unstage)" -msgstr "" - -#: wt-status.c:142 wt-status.c:159 -msgid " (use \"git rm --cached <file>...\" to unstage)" -msgstr "" - -#: wt-status.c:143 -msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" -msgstr "" - -#: wt-status.c:151 -msgid "Changes to be committed:" -msgstr "" - -#: wt-status.c:169 -msgid "Changes not staged for commit:" -msgstr "" - -#: wt-status.c:173 -msgid " (use \"git add <file>...\" to update what will be committed)" -msgstr "" - -#: wt-status.c:175 -msgid " (use \"git add/rm <file>...\" to update what will be committed)" -msgstr "" - -#: wt-status.c:176 -msgid "" -" (use \"git checkout -- <file>...\" to discard changes in working directory)" -msgstr "" - -#: wt-status.c:178 -msgid " (commit or discard the untracked or modified content in submodules)" -msgstr "" - -#: wt-status.c:187 -#, c-format -msgid "%s files:" -msgstr "" - -#: wt-status.c:190 -#, c-format -msgid " (use \"git %s <file>...\" to include in what will be committed)" -msgstr "" - -#: wt-status.c:207 -msgid "bug" -msgstr "" - -#: wt-status.c:212 -msgid "both deleted:" -msgstr "" - -#: wt-status.c:213 -msgid "added by us:" -msgstr "" - -#: wt-status.c:214 -msgid "deleted by them:" -msgstr "" - -#: wt-status.c:215 -msgid "added by them:" -msgstr "" - -#: wt-status.c:216 -msgid "deleted by us:" -msgstr "" - -#: wt-status.c:217 -msgid "both added:" -msgstr "" - -#: wt-status.c:218 -msgid "both modified:" -msgstr "" - -#: wt-status.c:248 -msgid "new commits, " -msgstr "" - -#: wt-status.c:250 -msgid "modified content, " -msgstr "" - -#: wt-status.c:252 -msgid "untracked content, " -msgstr "" - -#: wt-status.c:266 -#, c-format -msgid "new file: %s" -msgstr "" - -#: wt-status.c:269 -#, c-format -msgid "copied: %s -> %s" -msgstr "" - -#: wt-status.c:272 -#, c-format -msgid "deleted: %s" -msgstr "" - -#: wt-status.c:275 -#, c-format -msgid "modified: %s" -msgstr "" - -#: wt-status.c:278 -#, c-format -msgid "renamed: %s -> %s" -msgstr "" - -#: wt-status.c:281 -#, c-format -msgid "typechange: %s" -msgstr "" - -#: wt-status.c:284 -#, c-format -msgid "unknown: %s" -msgstr "" - -#: wt-status.c:287 -#, c-format -msgid "unmerged: %s" -msgstr "" - -#: wt-status.c:290 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "" - -#: wt-status.c:713 -msgid "On branch " -msgstr "" - -#: wt-status.c:720 -msgid "Not currently on any branch." -msgstr "" - -#: wt-status.c:731 -msgid "Initial commit" -msgstr "" - -#: wt-status.c:745 -msgid "Untracked" -msgstr "" - -#: wt-status.c:747 -msgid "Ignored" -msgstr "" - -#: wt-status.c:749 -#, c-format -msgid "Untracked files not listed%s" -msgstr "" - -#: wt-status.c:751 -msgid " (use -u option to show untracked files)" -msgstr "" - -#: wt-status.c:757 -msgid "No changes" -msgstr "" - -#: wt-status.c:761 -#, c-format -msgid "no changes added to commit%s\n" -msgstr "" - -#: wt-status.c:763 -msgid " (use \"git add\" and/or \"git commit -a\")" -msgstr "" - -#: wt-status.c:765 -#, c-format -msgid "nothing added to commit but untracked files present%s\n" -msgstr "" - -#: wt-status.c:767 -msgid " (use \"git add\" to track)" -msgstr "" - -#: wt-status.c:769 wt-status.c:772 wt-status.c:775 -#, c-format -msgid "nothing to commit%s\n" -msgstr "" - -#: wt-status.c:770 -msgid " (create/copy files and use \"git add\" to track)" -msgstr "" - -#: wt-status.c:773 -msgid " (use -u to show untracked files)" -msgstr "" - -#: wt-status.c:776 -msgid " (working directory clean)" -msgstr "" - -#: wt-status.c:884 -msgid "HEAD (no branch)" -msgstr "" - -#: wt-status.c:890 -msgid "Initial commit on " -msgstr "" - -#: wt-status.c:905 -msgid "behind " -msgstr "" - -#: wt-status.c:908 wt-status.c:911 -msgid "ahead " -msgstr "" - -#: wt-status.c:913 -msgid ", behind " -msgstr "" - -#: builtin/add.c:62 -#, c-format -msgid "unexpected diff status %c" -msgstr "" - -#: builtin/add.c:67 builtin/commit.c:298 -msgid "updating files failed" -msgstr "" - -#: builtin/add.c:77 -#, c-format -msgid "remove '%s'\n" -msgstr "" - -#: builtin/add.c:176 -#, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "" - -#: builtin/add.c:192 -msgid "Unstaged changes after refreshing the index:" -msgstr "" - -#: builtin/add.c:195 builtin/add.c:456 builtin/rm.c:186 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "" - -#: builtin/add.c:209 -#, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "" - -#: builtin/add.c:276 -msgid "Could not read the index" -msgstr "" - -#: builtin/add.c:286 -#, c-format -msgid "Could not open '%s' for writing." -msgstr "" - -#: builtin/add.c:290 -msgid "Could not write patch" -msgstr "" - -#: builtin/add.c:295 -#, c-format -msgid "Could not stat '%s'" -msgstr "" - -#: builtin/add.c:297 -msgid "Empty patch. Aborted." -msgstr "" - -#: builtin/add.c:303 -#, c-format -msgid "Could not apply '%s'" -msgstr "" - -#: builtin/add.c:312 -msgid "The following paths are ignored by one of your .gitignore files:\n" -msgstr "" - -#: builtin/add.c:352 -#, c-format -msgid "Use -f if you really want to add them.\n" -msgstr "" - -#: builtin/add.c:353 -msgid "no files added" -msgstr "" - -#: builtin/add.c:359 -msgid "adding files failed" -msgstr "" - -#: builtin/add.c:391 -msgid "-A and -u are mutually incompatible" -msgstr "" - -#: builtin/add.c:393 -msgid "Option --ignore-missing can only be used together with --dry-run" -msgstr "" - -#: builtin/add.c:413 -#, c-format -msgid "Nothing specified, nothing added.\n" -msgstr "" - -#: builtin/add.c:414 -#, c-format -msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "" - -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:358 builtin/mv.c:82 -#: builtin/rm.c:162 -msgid "index file corrupt" -msgstr "" - -#: builtin/add.c:476 builtin/mv.c:229 builtin/rm.c:260 -msgid "Unable to write new index file" -msgstr "" - -#: builtin/archive.c:17 -#, c-format -msgid "could not create archive file '%s'" -msgstr "" - -#: builtin/archive.c:20 -msgid "could not redirect output" -msgstr "" - -#: builtin/archive.c:37 -msgid "git archive: Remote with no URL" -msgstr "" - -#: builtin/archive.c:58 -msgid "git archive: expected ACK/NAK, got EOF" -msgstr "" - -#: builtin/archive.c:63 -#, c-format -msgid "git archive: NACK %s" -msgstr "" - -#: builtin/archive.c:65 -#, c-format -msgid "remote error: %s" -msgstr "" - -#: builtin/archive.c:66 -msgid "git archive: protocol error" -msgstr "" - -#: builtin/archive.c:71 -msgid "git archive: expected a flush" -msgstr "" - -#: builtin/branch.c:137 -#, c-format -msgid "" -"deleting branch '%s' that has been merged to\n" -" '%s', but not yet merged to HEAD." -msgstr "" - -#: builtin/branch.c:141 -#, c-format -msgid "" -"not deleting branch '%s' that is not yet merged to\n" -" '%s', even though it is merged to HEAD." -msgstr "" - -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:163 -msgid "remote " -msgstr "" - -#: builtin/branch.c:171 -msgid "cannot use -a with -d" -msgstr "" - -#: builtin/branch.c:177 -msgid "Couldn't look up commit object for HEAD" -msgstr "" - -#: builtin/branch.c:182 -#, c-format -msgid "Cannot delete the branch '%s' which you are currently on." -msgstr "" - -#: builtin/branch.c:192 -#, c-format -msgid "%sbranch '%s' not found." -msgstr "" - -#: builtin/branch.c:200 -#, c-format -msgid "Couldn't look up commit object for '%s'" -msgstr "" - -#: builtin/branch.c:206 -#, 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:214 -#, c-format -msgid "Error deleting %sbranch '%s'" -msgstr "" - -#: builtin/branch.c:219 -#, c-format -msgid "Deleted %sbranch %s (was %s).\n" -msgstr "" - -#: builtin/branch.c:224 -msgid "Update of config-file failed" -msgstr "" - -#: builtin/branch.c:322 -#, c-format -msgid "branch '%s' does not point at a commit" -msgstr "" - -#: builtin/branch.c:394 -#, c-format -msgid "behind %d] " -msgstr "" - -#: builtin/branch.c:396 -#, c-format -msgid "ahead %d] " -msgstr "" - -#: builtin/branch.c:398 -#, c-format -msgid "ahead %d, behind %d] " -msgstr "" - -#: builtin/branch.c:501 -msgid "(no branch)" -msgstr "" - -#: builtin/branch.c:566 -msgid "some refs could not be read" -msgstr "" - -#: builtin/branch.c:579 -msgid "cannot rename the current branch while not on any." -msgstr "" - -#: builtin/branch.c:589 -#, c-format -msgid "Invalid branch name: '%s'" -msgstr "" - -#: builtin/branch.c:604 -msgid "Branch rename failed" -msgstr "" - -#: builtin/branch.c:608 -#, c-format -msgid "Renamed a misnamed branch '%s' away" -msgstr "" - -#: builtin/branch.c:612 -#, c-format -msgid "Branch renamed to %s, but HEAD is not updated!" -msgstr "" - -#: builtin/branch.c:619 -msgid "Branch is renamed, but update of config-file failed" -msgstr "" - -#: builtin/branch.c:634 -#, c-format -msgid "malformed object name %s" -msgstr "" - -#: builtin/branch.c:658 -#, c-format -msgid "could not write branch description template: %s\n" -msgstr "" - -#: builtin/branch.c:746 -msgid "Failed to resolve HEAD as a valid ref." -msgstr "" - -#: builtin/branch.c:751 builtin/clone.c:558 -msgid "HEAD not found below refs/heads!" -msgstr "" - -#: builtin/branch.c:809 -msgid "-a and -r options to 'git branch' do not make sense with a branch name" -msgstr "" - -#: builtin/bundle.c:47 -#, c-format -msgid "%s is okay\n" -msgstr "" - -#: builtin/bundle.c:56 -msgid "Need a repository to create a bundle." -msgstr "" - -#: builtin/bundle.c:60 -msgid "Need a repository to unbundle." -msgstr "" - -#: builtin/checkout.c:113 builtin/checkout.c:146 -#, c-format -msgid "path '%s' does not have our version" -msgstr "" - -#: builtin/checkout.c:115 builtin/checkout.c:148 -#, c-format -msgid "path '%s' does not have their version" -msgstr "" - -#: builtin/checkout.c:131 -#, c-format -msgid "path '%s' does not have all necessary versions" -msgstr "" - -#: builtin/checkout.c:175 -#, c-format -msgid "path '%s' does not have necessary versions" -msgstr "" - -#: builtin/checkout.c:192 -#, c-format -msgid "path '%s': cannot merge" -msgstr "" - -#: builtin/checkout.c:209 -#, c-format -msgid "Unable to add merge result for '%s'" -msgstr "" - -#: builtin/checkout.c:212 builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "" - -#: builtin/checkout.c:234 builtin/checkout.c:392 -msgid "corrupt index file" -msgstr "" - -#: builtin/checkout.c:264 builtin/checkout.c:271 -#, c-format -msgid "path '%s' is unmerged" -msgstr "" - -#: builtin/checkout.c:302 builtin/checkout.c:498 builtin/clone.c:583 -#: builtin/merge.c:811 -msgid "unable to write new index file" -msgstr "" - -#: builtin/checkout.c:319 builtin/diff.c:302 builtin/merge.c:408 -msgid "diff_setup_done failed" -msgstr "" - -#: builtin/checkout.c:414 -msgid "you need to resolve your current index first" -msgstr "" - -#: builtin/checkout.c:533 -#, c-format -msgid "Can not do reflog for '%s'\n" -msgstr "" - -#: builtin/checkout.c:565 -msgid "HEAD is now at" -msgstr "" - -#: builtin/checkout.c:572 -#, c-format -msgid "Reset branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:575 -#, c-format -msgid "Already on '%s'\n" -msgstr "" - -#: builtin/checkout.c:579 -#, c-format -msgid "Switched to and reset branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:581 -#, c-format -msgid "Switched to a new branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:583 -#, c-format -msgid "Switched to branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:639 -#, c-format -msgid " ... and %d more.\n" -msgstr "" - -#. The singular version -#: builtin/checkout.c:645 -#, c-format -msgid "" -"Warning: you are leaving %d commit behind, not connected to\n" -"any of your branches:\n" -"\n" -"%s\n" -msgid_plural "" -"Warning: you are leaving %d commits behind, not connected to\n" -"any of your branches:\n" -"\n" -"%s\n" -msgstr[0] "" -msgstr[1] "" - -#: builtin/checkout.c:663 -#, c-format -msgid "" -"If you want to keep them by creating a new branch, this may be a good time\n" -"to do so with:\n" -"\n" -" git branch new_branch_name %s\n" -"\n" -msgstr "" - -#: builtin/checkout.c:692 -msgid "internal error in revision walk" -msgstr "" - -#: builtin/checkout.c:696 -msgid "Previous HEAD position was" -msgstr "" - -#: builtin/checkout.c:722 -msgid "You are on a branch yet to be born" -msgstr "" - -#. case (1) -#: builtin/checkout.c:853 -#, c-format -msgid "invalid reference: %s" -msgstr "" - -#. case (1): want a tree -#: builtin/checkout.c:892 -#, c-format -msgid "reference is not a tree: %s" -msgstr "" - -#: builtin/checkout.c:972 -msgid "-B cannot be used with -b" -msgstr "" - -#: builtin/checkout.c:981 -msgid "--patch is incompatible with all other options" -msgstr "" - -#: builtin/checkout.c:984 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "" - -#: builtin/checkout.c:986 -msgid "--detach cannot be used with -t" -msgstr "" - -#: builtin/checkout.c:992 -msgid "--track needs a branch name" -msgstr "" - -#: builtin/checkout.c:999 -msgid "Missing branch name; try -b" -msgstr "" - -#: builtin/checkout.c:1005 -msgid "--orphan and -b|-B are mutually exclusive" -msgstr "" - -#: builtin/checkout.c:1007 -msgid "--orphan cannot be used with -t" -msgstr "" - -#: builtin/checkout.c:1017 -msgid "git checkout: -f and -m are incompatible" -msgstr "" - -#: builtin/checkout.c:1051 -msgid "invalid path specification" -msgstr "" - -#: builtin/checkout.c:1059 -#, c-format -msgid "" -"git checkout: updating paths is incompatible with switching branches.\n" -"Did you intend to checkout '%s' which can not be resolved as commit?" -msgstr "" - -#: builtin/checkout.c:1061 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "" - -#: builtin/checkout.c:1066 -msgid "git checkout: --detach does not take a path argument" -msgstr "" - -#: builtin/checkout.c:1069 -msgid "" -"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" -"checking out of the index." -msgstr "" - -#: builtin/checkout.c:1088 -msgid "Cannot switch branch to a non-commit." -msgstr "" - -#: builtin/checkout.c:1091 -msgid "--ours/--theirs is incompatible with switching branches." -msgstr "" - -#: builtin/clean.c:78 -msgid "-x and -X cannot be used together" -msgstr "" - -#: builtin/clean.c:82 -msgid "" -"clean.requireForce set to true and neither -n nor -f given; refusing to clean" -msgstr "" - -#: builtin/clean.c:85 -msgid "" -"clean.requireForce defaults to true and neither -n nor -f given; refusing to " -"clean" -msgstr "" - -#: builtin/clean.c:155 builtin/clean.c:176 -#, c-format -msgid "Would remove %s\n" -msgstr "" - -#: builtin/clean.c:159 builtin/clean.c:179 -#, c-format -msgid "Removing %s\n" -msgstr "" - -#: builtin/clean.c:162 builtin/clean.c:182 -#, c-format -msgid "failed to remove %s" -msgstr "" - -#: builtin/clean.c:166 -#, c-format -msgid "Would not remove %s\n" -msgstr "" - -#: builtin/clean.c:168 -#, c-format -msgid "Not removing %s\n" -msgstr "" - -#: builtin/clone.c:243 -#, c-format -msgid "reference repository '%s' is not a local directory." -msgstr "" - -#: builtin/clone.c:302 -#, c-format -msgid "failed to open '%s'" -msgstr "" - -#: builtin/clone.c:306 -#, c-format -msgid "failed to create directory '%s'" -msgstr "" - -#: builtin/clone.c:308 builtin/diff.c:75 -#, c-format -msgid "failed to stat '%s'" -msgstr "" - -#: builtin/clone.c:310 -#, c-format -msgid "%s exists and is not a directory" -msgstr "" - -#: builtin/clone.c:324 -#, c-format -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'" -msgstr "" - -#: builtin/clone.c:350 -#, c-format -msgid "failed to copy file to '%s'" -msgstr "" - -#: builtin/clone.c:373 -#, c-format -msgid "done.\n" -msgstr "" - -#: builtin/clone.c:440 -#, c-format -msgid "Could not find remote branch %s to clone." -msgstr "" - -#: builtin/clone.c:549 -msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" -msgstr "" - -#: builtin/clone.c:639 -msgid "Too many arguments." -msgstr "" - -#: builtin/clone.c:643 -msgid "You must specify a repository to clone." -msgstr "" - -#: builtin/clone.c:654 -#, c-format -msgid "--bare and --origin %s options are incompatible." -msgstr "" - -#: builtin/clone.c:668 -#, c-format -msgid "repository '%s' does not exist" -msgstr "" - -#: builtin/clone.c:673 -msgid "--depth is ignored in local clones; use file:// instead." -msgstr "" - -#: builtin/clone.c:683 -#, c-format -msgid "destination path '%s' already exists and is not an empty directory." -msgstr "" - -#: builtin/clone.c:693 -#, c-format -msgid "working tree '%s' already exists." -msgstr "" - -#: builtin/clone.c:706 builtin/clone.c:720 -#, c-format -msgid "could not create leading directories of '%s'" -msgstr "" - -#: builtin/clone.c:709 -#, c-format -msgid "could not create work tree dir '%s'." -msgstr "" - -#: builtin/clone.c:728 -#, c-format -msgid "Cloning into bare repository '%s'...\n" -msgstr "" - -#: builtin/clone.c:730 -#, c-format -msgid "Cloning into '%s'...\n" -msgstr "" - -#: builtin/clone.c:786 -#, c-format -msgid "Don't know how to clone %s" -msgstr "" - -#: builtin/clone.c:835 -#, c-format -msgid "Remote branch %s not found in upstream %s" -msgstr "" - -#: builtin/clone.c:842 -msgid "You appear to have cloned an empty repository." -msgstr "" - -#: builtin/commit.c:42 -msgid "" -"Your name and email address were configured automatically based\n" -"on your username and hostname. Please check that they are accurate.\n" -"You can suppress this message by setting them explicitly:\n" -"\n" -" git config --global user.name \"Your Name\"\n" -" git config --global user.email you@example.com\n" -"\n" -"After doing this, you may fix the identity used for this commit with:\n" -"\n" -" git commit --amend --reset-author\n" -msgstr "" - -#: builtin/commit.c:54 -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:59 -msgid "" -"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" -"If you wish to commit it anyway, use:\n" -"\n" -" git commit --allow-empty\n" -"\n" -"Otherwise, please use 'git reset'\n" -msgstr "" - -#: builtin/commit.c:205 builtin/reset.c:33 -msgid "merge" -msgstr "" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "" - -#: builtin/commit.c:325 -msgid "failed to unpack HEAD tree object" -msgstr "" - -#: builtin/commit.c:367 -msgid "unable to create temporary index" -msgstr "" - -#: builtin/commit.c:373 -msgid "interactive add failed" -msgstr "" - -#: builtin/commit.c:406 builtin/commit.c:427 builtin/commit.c:473 -msgid "unable to write new_index file" -msgstr "" - -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." -msgstr "" - -#: builtin/commit.c:466 -msgid "cannot read the index" -msgstr "" - -#: builtin/commit.c:486 -msgid "unable to write temporary index file" -msgstr "" - -#: builtin/commit.c:550 builtin/commit.c:556 -#, c-format -msgid "invalid commit: %s" -msgstr "" - -#: builtin/commit.c:579 -msgid "malformed --author parameter" -msgstr "" - -#: builtin/commit.c:635 -#, c-format -msgid "Malformed ident string: '%s'" -msgstr "" - -#: builtin/commit.c:670 builtin/commit.c:703 builtin/commit.c:1000 -#, c-format -msgid "could not lookup commit %s" -msgstr "" - -#: builtin/commit.c:682 builtin/shortlog.c:296 -#, c-format -msgid "(reading log message from standard input)\n" -msgstr "" - -#: builtin/commit.c:684 -msgid "could not read log from standard input" -msgstr "" - -#: builtin/commit.c:688 -#, c-format -msgid "could not read log file '%s'" -msgstr "" - -#: builtin/commit.c:694 -msgid "commit has empty message" -msgstr "" - -#: builtin/commit.c:710 -msgid "could not read MERGE_MSG" -msgstr "" - -#: builtin/commit.c:714 -msgid "could not read SQUASH_MSG" -msgstr "" - -#: builtin/commit.c:718 -#, c-format -msgid "could not read '%s'" -msgstr "" - -#: builtin/commit.c:746 -#, c-format -msgid "could not open '%s'" -msgstr "" - -#: builtin/commit.c:770 -msgid "could not write commit template" -msgstr "" - -#: builtin/commit.c:783 -#, c-format -msgid "" -"\n" -"It looks like you may be committing a %s.\n" -"If this is not correct, please remove the file\n" -"\t%s\n" -"and try again.\n" -msgstr "" - -#: builtin/commit.c:796 -msgid "Please enter the commit message for your changes." -msgstr "" - -#: builtin/commit.c:799 -msgid "" -" Lines starting\n" -"with '#' will be ignored, and an empty message aborts the commit.\n" -msgstr "" - -#: builtin/commit.c:804 -msgid "" -" 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:816 -#, c-format -msgid "%sAuthor: %s" -msgstr "" - -#: builtin/commit.c:823 -#, c-format -msgid "%sCommitter: %s" -msgstr "" - -#: builtin/commit.c:843 -msgid "Cannot read index" -msgstr "" - -#: builtin/commit.c:880 -msgid "Error building trees" -msgstr "" - -#: builtin/commit.c:895 builtin/tag.c:357 -#, c-format -msgid "Please supply the message using either -m or -F option.\n" -msgstr "" - -#: builtin/commit.c:975 -#, c-format -msgid "No existing author found with '%s'" -msgstr "" - -#: builtin/commit.c:990 builtin/commit.c:1182 -#, c-format -msgid "Invalid untracked files mode '%s'" -msgstr "" - -#: builtin/commit.c:1030 -msgid "Using both --reset-author and --author does not make sense" -msgstr "" - -#: builtin/commit.c:1041 -msgid "You have nothing to amend." -msgstr "" - -#: builtin/commit.c:1043 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." -msgstr "" - -#: builtin/commit.c:1045 -msgid "Options --squash and --fixup cannot be used together" -msgstr "" - -#: builtin/commit.c:1055 -msgid "Only one of -c/-C/-F/--fixup can be used." -msgstr "" - -#: builtin/commit.c:1057 -msgid "Option -m cannot be combined with -c/-C/-F/--fixup." -msgstr "" - -#: builtin/commit.c:1063 -msgid "--reset-author can be used only with -C, -c or --amend." -msgstr "" - -#: builtin/commit.c:1080 -msgid "Only one of --include/--only/--all/--interactive/--patch can be used." -msgstr "" - -#: builtin/commit.c:1082 -msgid "No paths with --include/--only does not make sense." -msgstr "" - -#: builtin/commit.c:1084 -msgid "Clever... amending the last one with dirty index." -msgstr "" - -#: builtin/commit.c:1086 -msgid "Explicit paths specified without -i nor -o; assuming --only paths..." -msgstr "" - -#: builtin/commit.c:1096 builtin/tag.c:556 -#, c-format -msgid "Invalid cleanup mode %s" -msgstr "" - -#: builtin/commit.c:1101 -msgid "Paths with -a does not make sense." -msgstr "" - -#: builtin/commit.c:1280 -msgid "couldn't look up newly created commit" -msgstr "" - -#: builtin/commit.c:1282 -msgid "could not parse newly created commit" -msgstr "" - -#: builtin/commit.c:1323 -msgid "detached HEAD" -msgstr "" - -#: builtin/commit.c:1325 -msgid " (root-commit)" -msgstr "" - -#: builtin/commit.c:1415 -msgid "could not parse HEAD commit" -msgstr "" - -#: builtin/commit.c:1452 builtin/merge.c:509 -#, c-format -msgid "could not open '%s' for reading" -msgstr "" - -#: builtin/commit.c:1459 -#, c-format -msgid "Corrupt MERGE_HEAD file (%s)" -msgstr "" - -#: builtin/commit.c:1466 -msgid "could not read MERGE_MODE" -msgstr "" - -#: builtin/commit.c:1485 -#, c-format -msgid "could not read commit message: %s" -msgstr "" - -#: builtin/commit.c:1499 -#, c-format -msgid "Aborting commit due to empty commit message.\n" -msgstr "" - -#: builtin/commit.c:1514 builtin/merge.c:935 builtin/merge.c:968 -msgid "failed to write commit object" -msgstr "" - -#: builtin/commit.c:1535 -msgid "cannot lock HEAD ref" -msgstr "" - -#: builtin/commit.c:1539 -msgid "cannot update HEAD ref" -msgstr "" - -#: builtin/commit.c:1550 -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/describe.c:234 -#, c-format -msgid "annotated tag %s not available" -msgstr "" - -#: builtin/describe.c:238 -#, c-format -msgid "annotated tag %s has no embedded name" -msgstr "" - -#: builtin/describe.c:240 -#, c-format -msgid "tag '%s' is really '%s' here" -msgstr "" - -#: builtin/describe.c:267 -#, c-format -msgid "Not a valid object name %s" -msgstr "" - -#: builtin/describe.c:270 -#, c-format -msgid "%s is not a valid '%s' object" -msgstr "" - -#: builtin/describe.c:287 -#, c-format -msgid "no tag exactly matches '%s'" -msgstr "" - -#: builtin/describe.c:289 -#, c-format -msgid "searching to describe %s\n" -msgstr "" - -#: builtin/describe.c:329 -#, c-format -msgid "finished search at %s\n" -msgstr "" - -#: builtin/describe.c:353 -#, c-format -msgid "" -"No annotated tags can describe '%s'.\n" -"However, there were unannotated tags: try --tags." -msgstr "" - -#: builtin/describe.c:357 -#, c-format -msgid "" -"No tags can describe '%s'.\n" -"Try --always, or create some tags." -msgstr "" - -#: builtin/describe.c:378 -#, c-format -msgid "traversed %lu commits\n" -msgstr "" - -#: builtin/describe.c:381 -#, c-format -msgid "" -"more than %i tags found; listed %i most recent\n" -"gave up search at %s\n" -msgstr "" - -#: builtin/describe.c:436 -msgid "--long is incompatible with --abbrev=0" -msgstr "" - -#: builtin/describe.c:462 -msgid "No names found, cannot describe anything." -msgstr "" - -#: builtin/describe.c:482 -msgid "--dirty is incompatible with commit-ishes" -msgstr "" - -#: builtin/diff.c:77 -#, c-format -msgid "'%s': not a regular file or symlink" -msgstr "" - -#: builtin/diff.c:220 -#, c-format -msgid "invalid option: %s" -msgstr "" - -#: builtin/diff.c:297 -msgid "Not a git repository" -msgstr "" - -#: builtin/diff.c:347 -#, c-format -msgid "invalid object '%s' given." -msgstr "" - -#: builtin/diff.c:352 -#, c-format -msgid "more than %d trees given: '%s'" -msgstr "" - -#: builtin/diff.c:362 -#, c-format -msgid "more than two blobs given: '%s'" -msgstr "" - -#: builtin/diff.c:370 -#, c-format -msgid "unhandled object '%s' given." -msgstr "" - -#: builtin/fetch.c:200 -msgid "Couldn't find remote ref HEAD" -msgstr "" - -#: builtin/fetch.c:252 -#, c-format -msgid "object %s not found" -msgstr "" - -#: builtin/fetch.c:258 -msgid "[up to date]" -msgstr "" - -#: builtin/fetch.c:272 -#, c-format -msgid "! %-*s %-*s -> %s (can't fetch in current branch)" -msgstr "" - -#: builtin/fetch.c:273 builtin/fetch.c:351 -msgid "[rejected]" -msgstr "" - -#: builtin/fetch.c:284 -msgid "[tag update]" -msgstr "" - -#: builtin/fetch.c:286 builtin/fetch.c:313 builtin/fetch.c:331 -msgid " (unable to update local ref)" -msgstr "" - -#: builtin/fetch.c:298 -msgid "[new tag]" -msgstr "" - -#: builtin/fetch.c:302 -msgid "[new branch]" -msgstr "" - -#: builtin/fetch.c:347 -msgid "unable to update local ref" -msgstr "" - -#: builtin/fetch.c:347 -msgid "forced update" -msgstr "" - -#: builtin/fetch.c:353 -msgid "(non-fast-forward)" -msgstr "" - -#: builtin/fetch.c:384 builtin/fetch.c:676 -#, c-format -msgid "cannot open %s: %s\n" -msgstr "" - -#: builtin/fetch.c:393 -#, c-format -msgid "%s did not send all necessary objects\n" -msgstr "" - -#: builtin/fetch.c:479 -#, c-format -msgid "From %.*s\n" -msgstr "" - -#: builtin/fetch.c:490 -#, c-format -msgid "" -"some local refs could not be updated; try running\n" -" 'git remote prune %s' to remove any old, conflicting branches" -msgstr "" - -#: builtin/fetch.c:540 -#, c-format -msgid " (%s will become dangling)\n" -msgstr "" - -#: builtin/fetch.c:541 -#, c-format -msgid " (%s has become dangling)\n" -msgstr "" - -#: builtin/fetch.c:548 -msgid "[deleted]" -msgstr "" - -#: builtin/fetch.c:549 -msgid "(none)" -msgstr "" - -#: builtin/fetch.c:666 -#, c-format -msgid "Refusing to fetch into current branch %s of non-bare repository" -msgstr "" - -#: builtin/fetch.c:700 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "" - -#: builtin/fetch.c:777 -#, c-format -msgid "Option \"%s\" value \"%s\" is not valid for %s" -msgstr "" - -#: builtin/fetch.c:780 -#, c-format -msgid "Option \"%s\" is ignored for %s\n" -msgstr "" - -#: builtin/fetch.c:879 -#, c-format -msgid "Fetching %s\n" -msgstr "" - -#: builtin/fetch.c:881 -#, c-format -msgid "Could not fetch %s" -msgstr "" - -#: builtin/fetch.c:898 -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:918 -msgid "You need to specify a tag name." -msgstr "" - -#: builtin/fetch.c:970 -msgid "fetch --all does not take a repository argument" -msgstr "" - -#: builtin/fetch.c:972 -msgid "fetch --all does not make sense with refspecs" -msgstr "" - -#: builtin/fetch.c:983 -#, c-format -msgid "No such remote or remote group: %s" -msgstr "" - -#: builtin/fetch.c:991 -msgid "Fetching a group and specifying refspecs does not make sense" -msgstr "" - -#: builtin/gc.c:63 -#, c-format -msgid "Invalid %s: '%s'" -msgstr "" - -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "" - -#: builtin/gc.c:103 -#, c-format -msgid "insanely long object directory %.*s" -msgstr "" - -#: builtin/gc.c:223 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "" - -#: builtin/gc.c:226 -#, 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:256 -msgid "" -"There are too many unreachable loose objects; run 'git prune' to remove them." -msgstr "" - -#: builtin/grep.c:216 -#, c-format -msgid "grep: failed to create thread: %s" -msgstr "" - -#: builtin/grep.c:402 -#, c-format -msgid "Failed to chdir: %s" -msgstr "" - -#: builtin/grep.c:478 builtin/grep.c:512 -#, c-format -msgid "unable to read tree (%s)" -msgstr "" - -#: builtin/grep.c:526 -#, c-format -msgid "unable to grep from object of type %s" -msgstr "" - -#: builtin/grep.c:584 -#, c-format -msgid "switch `%c' expects a numerical value" -msgstr "" - -#: builtin/grep.c:601 -#, c-format -msgid "cannot open '%s'" -msgstr "" - -#: builtin/grep.c:888 -msgid "no pattern given." -msgstr "" - -#: builtin/grep.c:902 -#, c-format -msgid "bad object %s" -msgstr "" - -#: builtin/grep.c:943 -msgid "--open-files-in-pager only works on the worktree" -msgstr "" - -#: builtin/grep.c:966 -msgid "--cached or --untracked cannot be used with --no-index." -msgstr "" - -#: builtin/grep.c:971 -msgid "--no-index or --untracked cannot be used with revs." -msgstr "" - -#: builtin/grep.c:974 -msgid "--[no-]exclude-standard cannot be used for tracked contents." -msgstr "" - -#: builtin/grep.c:982 -msgid "both --cached and trees are given." -msgstr "" - -#: builtin/init-db.c:35 -#, c-format -msgid "Could not make %s writable by group" -msgstr "" - -#: builtin/init-db.c:62 -#, c-format -msgid "insanely long template name %s" -msgstr "" - -#: builtin/init-db.c:67 -#, c-format -msgid "cannot stat '%s'" -msgstr "" - -#: builtin/init-db.c:73 -#, c-format -msgid "cannot stat template '%s'" -msgstr "" - -#: builtin/init-db.c:80 -#, c-format -msgid "cannot opendir '%s'" -msgstr "" - -#: builtin/init-db.c:97 -#, c-format -msgid "cannot readlink '%s'" -msgstr "" - -#: builtin/init-db.c:99 -#, c-format -msgid "insanely long symlink %s" -msgstr "" - -#: builtin/init-db.c:102 -#, c-format -msgid "cannot symlink '%s' '%s'" -msgstr "" - -#: builtin/init-db.c:106 -#, c-format -msgid "cannot copy '%s' to '%s'" -msgstr "" - -#: builtin/init-db.c:110 -#, c-format -msgid "ignoring template %s" -msgstr "" - -#: builtin/init-db.c:133 -#, c-format -msgid "insanely long template path %s" -msgstr "" - -#: builtin/init-db.c:141 -#, c-format -msgid "templates not found %s" -msgstr "" - -#: builtin/init-db.c:154 -#, c-format -msgid "not copying templates of a wrong format version %d from '%s'" -msgstr "" - -#: builtin/init-db.c:192 -#, c-format -msgid "insane git directory %s" -msgstr "" - -#: builtin/init-db.c:322 builtin/init-db.c:325 -#, c-format -msgid "%s already exists" -msgstr "" - -#: builtin/init-db.c:354 -#, c-format -msgid "unable to handle file type %d" -msgstr "" - -#: builtin/init-db.c:357 -#, c-format -msgid "unable to move %s to %s" -msgstr "" - -#: builtin/init-db.c:362 -#, c-format -msgid "Could not create git link %s" -msgstr "" - -#. -#. * TRANSLATORS: The first '%s' is either "Reinitialized -#. * existing" or "Initialized empty", the second " shared" or -#. * "", and the last '%s%s' is the verbatim directory name. -#. -#: builtin/init-db.c:419 -#, c-format -msgid "%s%s Git repository in %s%s\n" -msgstr "" - -#: builtin/init-db.c:420 -msgid "Reinitialized existing" -msgstr "" - -#: builtin/init-db.c:420 -msgid "Initialized empty" -msgstr "" - -#: builtin/init-db.c:421 -msgid " shared" -msgstr "" - -#: builtin/init-db.c:440 -msgid "cannot tell cwd" -msgstr "" - -#: builtin/init-db.c:521 builtin/init-db.c:528 -#, c-format -msgid "cannot mkdir %s" -msgstr "" - -#: builtin/init-db.c:532 -#, c-format -msgid "cannot chdir to %s" -msgstr "" - -#: builtin/init-db.c:554 -#, c-format -msgid "" -"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" -"dir=<directory>)" -msgstr "" - -#: builtin/init-db.c:578 -msgid "Cannot access current working directory" -msgstr "" - -#: builtin/init-db.c:585 -#, c-format -msgid "Cannot access work tree '%s'" -msgstr "" - -#: builtin/log.c:187 -#, c-format -msgid "Final output: %d %s\n" -msgstr "" - -#: builtin/log.c:395 builtin/log.c:483 -#, c-format -msgid "Could not read object %s" -msgstr "" - -#: builtin/log.c:507 -#, c-format -msgid "Unknown type: %d" -msgstr "" - -#: builtin/log.c:596 -msgid "format.headers without value" -msgstr "" - -#: builtin/log.c:669 -msgid "name of output directory is too long" -msgstr "" - -#: builtin/log.c:680 -#, c-format -msgid "Cannot open patch file %s" -msgstr "" - -#: builtin/log.c:694 -msgid "Need exactly one range." -msgstr "" - -#: builtin/log.c:702 -msgid "Not a range." -msgstr "" - -#: builtin/log.c:739 -msgid "Could not extract email from committer identity." -msgstr "" - -#: builtin/log.c:785 -msgid "Cover letter needs email format" -msgstr "" - -#: builtin/log.c:879 -#, c-format -msgid "insane in-reply-to: %s" -msgstr "" - -#: builtin/log.c:952 -msgid "Two output directories?" -msgstr "" - -#: builtin/log.c:1173 -#, c-format -msgid "bogus committer info %s" -msgstr "" - -#: builtin/log.c:1218 -msgid "-n and -k are mutually exclusive." -msgstr "" - -#: builtin/log.c:1220 -msgid "--subject-prefix and -k are mutually exclusive." -msgstr "" - -#: builtin/log.c:1225 builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "" - -#: builtin/log.c:1228 -msgid "--name-only does not make sense" -msgstr "" - -#: builtin/log.c:1230 -msgid "--name-status does not make sense" -msgstr "" - -#: builtin/log.c:1232 -msgid "--check does not make sense" -msgstr "" - -#: builtin/log.c:1255 -msgid "standard output, or directory, which one?" -msgstr "" - -#: builtin/log.c:1257 -#, c-format -msgid "Could not create directory '%s'" -msgstr "" - -#: builtin/log.c:1410 -msgid "Failed to create output files" -msgstr "" - -#: builtin/log.c:1514 -#, c-format -msgid "" -"Could not find a tracked remote branch, please specify <upstream> manually.\n" -msgstr "" - -#: builtin/log.c:1530 builtin/log.c:1532 builtin/log.c:1544 -#, c-format -msgid "Unknown commit %s" -msgstr "" - -#: builtin/merge.c:91 -msgid "switch `m' requires a value" -msgstr "" - -#: builtin/merge.c:128 -#, c-format -msgid "Could not find merge strategy '%s'.\n" -msgstr "" - -#: builtin/merge.c:129 -#, c-format -msgid "Available strategies are:" -msgstr "" - -#: builtin/merge.c:134 -#, c-format -msgid "Available custom strategies are:" -msgstr "" - -#: builtin/merge.c:241 -msgid "could not run stash." -msgstr "" - -#: builtin/merge.c:246 -msgid "stash failed" -msgstr "" - -#: builtin/merge.c:251 -#, c-format -msgid "not a valid object: %s" -msgstr "" - -#: builtin/merge.c:270 builtin/merge.c:287 -msgid "read-tree failed" -msgstr "" - -#: builtin/merge.c:317 -msgid " (nothing to squash)" -msgstr "" - -#: builtin/merge.c:330 -#, c-format -msgid "Squash commit -- not updating HEAD\n" -msgstr "" - -#: builtin/merge.c:362 -msgid "Writing SQUASH_MSG" -msgstr "" - -#: builtin/merge.c:364 -msgid "Finishing SQUASH_MSG" -msgstr "" - -#: builtin/merge.c:386 -#, c-format -msgid "No merge message -- not updating HEAD\n" -msgstr "" - -#: builtin/merge.c:437 -#, c-format -msgid "'%s' does not point to a commit" -msgstr "" - -#: builtin/merge.c:536 -#, c-format -msgid "Bad branch.%s.mergeoptions string: %s" -msgstr "" - -#: builtin/merge.c:629 -msgid "git write-tree failed to write a tree" -msgstr "" - -#: builtin/merge.c:679 -msgid "failed to read the cache" -msgstr "" - -#: builtin/merge.c:696 -msgid "Unable to write index." -msgstr "" - -#: builtin/merge.c:709 -msgid "Not handling anything other than two heads merge." -msgstr "" - -#: builtin/merge.c:723 -#, c-format -msgid "Unknown option for merge-recursive: -X%s" -msgstr "" - -#: builtin/merge.c:737 -#, c-format -msgid "unable to write %s" -msgstr "" - -#: builtin/merge.c:876 -#, c-format -msgid "Could not read from '%s'" -msgstr "" - -#: builtin/merge.c:885 -#, c-format -msgid "Not committing merge; use 'git commit' to complete the merge.\n" -msgstr "" - -#: 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" -"\n" -"Lines starting with '#' will be ignored, and an empty message aborts\n" -"the commit.\n" -msgstr "" - -#: builtin/merge.c:915 -msgid "Empty commit message." -msgstr "" - -#: builtin/merge.c:927 -#, c-format -msgid "Wonderful.\n" -msgstr "" - -#: builtin/merge.c:1000 -#, c-format -msgid "Automatic merge failed; fix conflicts and then commit the result.\n" -msgstr "" - -#: builtin/merge.c:1016 -#, c-format -msgid "'%s' is not a commit" -msgstr "" - -#: builtin/merge.c:1057 -msgid "No current branch." -msgstr "" - -#: builtin/merge.c:1059 -msgid "No remote for the current branch." -msgstr "" - -#: builtin/merge.c:1061 -msgid "No default upstream defined for the current branch." -msgstr "" - -#: builtin/merge.c:1066 -#, c-format -msgid "No remote tracking branch for %s from %s" -msgstr "" - -#: builtin/merge.c:1188 -msgid "There is no merge to abort (MERGE_HEAD missing)." -msgstr "" - -#: builtin/merge.c:1204 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:1207 git-pull.sh:34 -msgid "You have not concluded your merge (MERGE_HEAD exists)." -msgstr "" - -#: builtin/merge.c:1211 -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:1214 -msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." -msgstr "" - -#: builtin/merge.c:1223 -msgid "You cannot combine --squash with --no-ff." -msgstr "" - -#: builtin/merge.c:1228 -msgid "You cannot combine --no-ff with --ff-only." -msgstr "" - -#: builtin/merge.c:1235 -msgid "No commit specified and merge.defaultToUpstream not set." -msgstr "" - -#: builtin/merge.c:1266 -msgid "Can merge only exactly one commit into empty head" -msgstr "" - -#: builtin/merge.c:1269 -msgid "Squash commit into empty head not supported yet" -msgstr "" - -#: builtin/merge.c:1271 -msgid "Non-fast-forward commit does not make sense into an empty head" -msgstr "" - -#: builtin/merge.c:1275 builtin/merge.c:1319 -#, c-format -msgid "%s - not something we can merge" -msgstr "" - -#: builtin/merge.c:1385 -#, c-format -msgid "Updating %s..%s\n" -msgstr "" - -#: builtin/merge.c:1423 -#, c-format -msgid "Trying really trivial in-index merge...\n" -msgstr "" - -#: builtin/merge.c:1430 -#, c-format -msgid "Nope.\n" -msgstr "" - -#: builtin/merge.c:1462 -msgid "Not possible to fast-forward, aborting." -msgstr "" - -#: builtin/merge.c:1485 builtin/merge.c:1562 -#, c-format -msgid "Rewinding the tree to pristine...\n" -msgstr "" - -#: builtin/merge.c:1489 -#, c-format -msgid "Trying merge strategy %s...\n" -msgstr "" - -#: builtin/merge.c:1553 -#, c-format -msgid "No merge strategy handled the merge.\n" -msgstr "" - -#: builtin/merge.c:1555 -#, c-format -msgid "Merge with strategy %s failed.\n" -msgstr "" - -#: builtin/merge.c:1564 -#, c-format -msgid "Using the %s to prepare resolving by hand.\n" -msgstr "" - -#: builtin/merge.c:1575 -#, c-format -msgid "Automatic merge went well; stopped before committing as requested\n" -msgstr "" - -#: builtin/mv.c:108 -#, c-format -msgid "Checking rename of '%s' to '%s'\n" -msgstr "" - -#: builtin/mv.c:112 -msgid "bad source" -msgstr "" - -#: builtin/mv.c:115 -msgid "can not move directory into itself" -msgstr "" - -#: builtin/mv.c:118 -msgid "cannot move directory over file" -msgstr "" - -#: builtin/mv.c:128 -#, c-format -msgid "Huh? %.*s is in index?" -msgstr "" - -#: builtin/mv.c:140 -msgid "source directory is empty" -msgstr "" - -#: builtin/mv.c:171 -msgid "not under version control" -msgstr "" - -#: builtin/mv.c:173 -msgid "destination exists" -msgstr "" - -#: builtin/mv.c:181 -#, c-format -msgid "overwriting '%s'" -msgstr "" - -#: builtin/mv.c:184 -msgid "Cannot overwrite" -msgstr "" - -#: builtin/mv.c:187 -msgid "multiple sources for the same target" -msgstr "" - -#: builtin/mv.c:202 -#, c-format -msgid "%s, source=%s, destination=%s" -msgstr "" - -#: builtin/mv.c:212 -#, c-format -msgid "Renaming %s to %s\n" -msgstr "" - -#: builtin/mv.c:215 -#, c-format -msgid "renaming '%s' failed" -msgstr "" - -#: builtin/notes.c:139 -#, c-format -msgid "unable to start 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:145 -msgid "can't fdopen 'show' output fd" -msgstr "" - -#: builtin/notes.c:155 -#, c-format -msgid "failed to close pipe to 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:158 -#, c-format -msgid "failed to finish 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:175 builtin/tag.c:343 -#, c-format -msgid "could not create file '%s'" -msgstr "" - -#: builtin/notes.c:189 -msgid "Please supply the note contents using either -m or -F option" -msgstr "" - -#: builtin/notes.c:210 builtin/notes.c:973 -#, c-format -msgid "Removing note for object %s\n" -msgstr "" - -#: builtin/notes.c:215 -msgid "unable to write note object" -msgstr "" - -#: builtin/notes.c:217 -#, c-format -msgid "The note contents has been left in %s" -msgstr "" - -#: builtin/notes.c:251 builtin/tag.c:521 -#, c-format -msgid "cannot read '%s'" -msgstr "" - -#: builtin/notes.c:253 builtin/tag.c:524 -#, 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:537 -#, c-format -msgid "Failed to resolve '%s' as a valid ref." -msgstr "" - -#: builtin/notes.c:275 -#, c-format -msgid "Failed to read object '%s'." -msgstr "" - -#: builtin/notes.c:299 -msgid "Cannot commit uninitialized/unreferenced notes tree" -msgstr "" - -#: builtin/notes.c:340 -#, c-format -msgid "Bad notes.rewriteMode value: '%s'" -msgstr "" - -#: builtin/notes.c:350 -#, 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 -#, c-format -msgid "Bad %s value: '%s'" -msgstr "" - -#: builtin/notes.c:441 -#, c-format -msgid "Malformed input line: '%s'." -msgstr "" - -#: builtin/notes.c:456 -#, 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 -msgid "too many parameters" -msgstr "" - -#: builtin/notes.c:513 builtin/notes.c:772 -#, c-format -msgid "No note found for object %s." -msgstr "" - -#: builtin/notes.c:580 -#, 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 -#, c-format -msgid "Overwriting existing notes for object %s\n" -msgstr "" - -#: builtin/notes.c:635 -msgid "too few parameters" -msgstr "" - -#: builtin/notes.c:656 -#, c-format -msgid "" -"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " -"existing notes" -msgstr "" - -#: builtin/notes.c:668 -#, c-format -msgid "Missing notes on source object %s. Cannot copy." -msgstr "" - -#: builtin/notes.c:717 -#, 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 -#, c-format -msgid "Object %s has no note\n" -msgstr "" - -#: builtin/notes.c:1103 -#, c-format -msgid "Unknown subcommand: %s" -msgstr "" - -#: builtin/pack-objects.c:2310 -#, c-format -msgid "unsupported index version %s" -msgstr "" - -#: builtin/pack-objects.c:2314 -#, c-format -msgid "bad index version '%s'" -msgstr "" - -#: builtin/pack-objects.c:2322 -#, c-format -msgid "option %s does not accept negative form" -msgstr "" - -#: builtin/pack-objects.c:2326 -#, c-format -msgid "unable to parse value '%s' for option %s" -msgstr "" - -#: builtin/push.c:44 -msgid "tag shorthand without <tag>" -msgstr "" - -#: builtin/push.c:63 -msgid "--delete only accepts plain target ref names" -msgstr "" - -#: builtin/push.c:73 -#, c-format -msgid "" -"You are not currently on a branch.\n" -"To push the history leading to the current (detached HEAD)\n" -"state now, use\n" -"\n" -" git push %s HEAD:<name-of-remote-branch>\n" -msgstr "" - -#: builtin/push.c:80 -#, c-format -msgid "" -"The current branch %s has no upstream branch.\n" -"To push the current branch and set the remote as upstream, use\n" -"\n" -" git push --set-upstream %s %s\n" -msgstr "" - -#: builtin/push.c:88 -#, c-format -msgid "The current branch %s has multiple upstream branches, refusing to push." -msgstr "" - -#: builtin/push.c:111 -msgid "" -"You didn't specify any refspecs to push, and push.default is \"nothing\"." -msgstr "" - -#: builtin/push.c:131 -#, c-format -msgid "Pushing to %s\n" -msgstr "" - -#: builtin/push.c:135 -#, c-format -msgid "failed to push some refs to '%s'" -msgstr "" - -#: builtin/push.c:143 -#, c-format -msgid "" -"To prevent you from losing history, non-fast-forward updates were rejected\n" -"Merge the remote changes (e.g. 'git pull') before pushing again. See the\n" -"'Note about fast-forwards' section of 'git push --help' for details.\n" -msgstr "" - -#: builtin/push.c:160 -#, c-format -msgid "bad repository '%s'" -msgstr "" - -#: builtin/push.c:161 -msgid "" -"No configured push destination.\n" -"Either specify the URL from the command-line or configure a remote " -"repository using\n" -"\n" -" git remote add <name> <url>\n" -"\n" -"and then push using the remote name\n" -"\n" -" git push <name>\n" -msgstr "" - -#: builtin/push.c:176 -msgid "--all and --tags are incompatible" -msgstr "" - -#: builtin/push.c:177 -msgid "--all can't be combined with refspecs" -msgstr "" - -#: builtin/push.c:182 -msgid "--mirror and --tags are incompatible" -msgstr "" - -#: builtin/push.c:183 -msgid "--mirror can't be combined with refspecs" -msgstr "" - -#: builtin/push.c:188 -msgid "--all and --mirror are incompatible" -msgstr "" - -#: builtin/push.c:274 -msgid "--delete is incompatible with --all, --mirror and --tags" -msgstr "" - -#: builtin/push.c:276 -msgid "--delete doesn't make sense without any refs" -msgstr "" - -#: builtin/reset.c:33 -msgid "mixed" -msgstr "" - -#: builtin/reset.c:33 -msgid "soft" -msgstr "" - -#: builtin/reset.c:33 -msgid "hard" -msgstr "" - -#: builtin/reset.c:33 -msgid "keep" -msgstr "" - -#: builtin/reset.c:77 -msgid "You do not have a valid HEAD." -msgstr "" - -#: builtin/reset.c:79 -msgid "Failed to find tree of HEAD." -msgstr "" - -#: builtin/reset.c:85 -#, c-format -msgid "Failed to find tree of %s." -msgstr "" - -#: builtin/reset.c:96 -msgid "Could not write new index file." -msgstr "" - -#: builtin/reset.c:106 -#, c-format -msgid "HEAD is now at %s" -msgstr "" - -#: builtin/reset.c:130 -msgid "Could not read index" -msgstr "" - -#: builtin/reset.c:133 -msgid "Unstaged changes after reset:" -msgstr "" - -#: builtin/reset.c:223 -#, c-format -msgid "Cannot do a %s reset in the middle of a merge." -msgstr "" - -#: builtin/reset.c:297 -#, c-format -msgid "Could not parse object '%s'." -msgstr "" - -#: builtin/reset.c:302 -msgid "--patch is incompatible with --{hard,mixed,soft}" -msgstr "" - -#: builtin/reset.c:311 -msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." -msgstr "" - -#: builtin/reset.c:313 -#, c-format -msgid "Cannot do %s reset with paths." -msgstr "" - -#: builtin/reset.c:325 -#, c-format -msgid "%s reset is not allowed in a bare repository" -msgstr "" - -#: builtin/reset.c:341 -#, c-format -msgid "Could not reset index file to revision '%s'." -msgstr "" - -#: builtin/revert.c:70 builtin/revert.c:91 -#, c-format -msgid "%s: %s cannot be used with %s" -msgstr "" - -#: builtin/revert.c:126 -msgid "program error" -msgstr "" - -#: builtin/revert.c:209 -msgid "revert failed" -msgstr "" - -#: builtin/revert.c:224 -msgid "cherry-pick failed" -msgstr "" - -#: 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 "" - -#: builtin/rm.c:115 -#, c-format -msgid "" -"'%s' has changes staged in the index\n" -"(use --cached to keep the file, or -f to force removal)" -msgstr "" - -#: builtin/rm.c:119 -#, c-format -msgid "" -"'%s' has local modifications\n" -"(use --cached to keep the file, or -f to force removal)" -msgstr "" - -#: builtin/rm.c:194 -#, c-format -msgid "not removing '%s' recursively without -r" -msgstr "" - -#: builtin/rm.c:230 -#, c-format -msgid "git rm: unable to remove %s" -msgstr "" - -#: builtin/shortlog.c:157 -#, c-format -msgid "Missing author: %s" -msgstr "" - -#: builtin/tag.c:58 -#, c-format -msgid "malformed object at '%s'" -msgstr "" - -#: builtin/tag.c:205 -#, c-format -msgid "tag name too long: %.*s..." -msgstr "" - -#: builtin/tag.c:210 -#, c-format -msgid "tag '%s' not found." -msgstr "" - -#: builtin/tag.c:225 -#, c-format -msgid "Deleted tag '%s' (was %s)\n" -msgstr "" - -#: builtin/tag.c:237 -#, c-format -msgid "could not verify the tag '%s'" -msgstr "" - -#: builtin/tag.c:247 -msgid "" -"\n" -"#\n" -"# Write a tag message\n" -"# Lines starting with '#' will be ignored.\n" -"#\n" -msgstr "" - -#: builtin/tag.c:254 -msgid "" -"\n" -"#\n" -"# Write a tag message\n" -"# Lines starting with '#' will be kept; you may remove them yourself if you " -"want to.\n" -"#\n" -msgstr "" - -#: builtin/tag.c:294 -msgid "unable to sign the tag" -msgstr "" - -#: builtin/tag.c:296 -msgid "unable to write tag file" -msgstr "" - -#: builtin/tag.c:321 -msgid "bad object type." -msgstr "" - -#: builtin/tag.c:334 -msgid "tag header too big." -msgstr "" - -#: builtin/tag.c:366 -msgid "no tag message?" -msgstr "" - -#: builtin/tag.c:372 -#, c-format -msgid "The tag message has been left in %s\n" -msgstr "" - -#: builtin/tag.c:421 -msgid "switch 'points-at' requires an object" -msgstr "" - -#: builtin/tag.c:423 -#, c-format -msgid "malformed object name '%s'" -msgstr "" - -#: builtin/tag.c:502 -msgid "-n option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:504 -msgid "--contains option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:506 -msgid "--points-at option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:514 -msgid "only one -F or -m option is allowed." -msgstr "" - -#: builtin/tag.c:534 -msgid "too many params" -msgstr "" - -#: builtin/tag.c:540 -#, c-format -msgid "'%s' is not a valid tag name." -msgstr "" - -#: builtin/tag.c:545 -#, c-format -msgid "tag '%s' already exists" -msgstr "" - -#: builtin/tag.c:563 -#, c-format -msgid "%s: cannot lock the ref" -msgstr "" - -#: builtin/tag.c:565 -#, c-format -msgid "%s: cannot update the ref" -msgstr "" - -#: builtin/tag.c:567 -#, c-format -msgid "Updated tag '%s' (was %s)\n" -msgstr "" - -#: git-am.sh:49 -msgid "You need to set your committer info first" -msgstr "" - -#: git-am.sh:136 -msgid "Repository lacks necessary blobs to fall back on 3-way merge." -msgstr "" - -#: git-am.sh:147 -msgid "" -"Did you hand edit your patch?\n" -"It does not apply to blobs recorded in its index." -msgstr "" - -#: git-am.sh:156 -msgid "Falling back to patching base and 3-way merge..." -msgstr "" - -#: git-am.sh:268 -msgid "Only one StGIT patch series can be applied at once" -msgstr "" - -#: git-am.sh:355 -#, sh-format -msgid "Patch format $patch_format is not supported." -msgstr "" - -#: git-am.sh:357 -msgid "Patch format detection failed." -msgstr "" - -#: git-am.sh:411 -msgid "-d option is no longer supported. Do not use." -msgstr "" - -#: git-am.sh:474 -#, sh-format -msgid "previous rebase directory $dotest still exists but mbox given." -msgstr "" - -#: git-am.sh:479 -msgid "Please make up your mind. --skip or --abort?" -msgstr "" - -#: git-am.sh:506 -msgid "Resolve operation not in progress, we are not resuming." -msgstr "" - -#: git-am.sh:572 -#, sh-format -msgid "Dirty index: cannot apply patches (dirty: $files)" -msgstr "" - -#: git-am.sh:748 -msgid "cannot be interactive without stdin connected to a terminal." -msgstr "" - -#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] -#. in your translation. The program will only accept English -#. input at this point. -#: git-am.sh:759 -msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " -msgstr "" - -#: git-am.sh:795 -#, sh-format -msgid "Applying: $FIRSTLINE" -msgstr "" - -#: git-am.sh:840 -msgid "No changes -- Patch already applied." -msgstr "" - -#: git-am.sh:866 -msgid "applying to an empty history" -msgstr "" - -#. TRANSLATORS: Make sure to include [Y] and [n] in your -#. translation. The program will only accept English input -#. at this point. -#: git-bisect.sh:54 -msgid "Do you want me to do it for you [Y/n]? " -msgstr "" - -#: git-bisect.sh:95 -#, sh-format -msgid "unrecognised option: '$arg'" -msgstr "" - -#: git-bisect.sh:99 -#, sh-format -msgid "'$arg' does not appear to be a valid revision" -msgstr "" - -#: git-bisect.sh:117 -msgid "Bad HEAD - I need a HEAD" -msgstr "" - -#: git-bisect.sh:130 -#, sh-format -msgid "" -"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." -msgstr "" - -#: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "" - -#: git-bisect.sh:144 -msgid "Bad HEAD - strange symbolic ref" -msgstr "" - -#: git-bisect.sh:189 -#, sh-format -msgid "Bad bisect_write argument: $state" -msgstr "" - -#: git-bisect.sh:218 -#, sh-format -msgid "Bad rev input: $arg" -msgstr "" - -#: git-bisect.sh:232 -msgid "Please call 'bisect_state' with at least one argument." -msgstr "" - -#: git-bisect.sh:244 -#, sh-format -msgid "Bad rev input: $rev" -msgstr "" - -#: git-bisect.sh:250 -msgid "'git bisect bad' can take only one argument." -msgstr "" - -#. 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 "" - -#: git-bisect.sh:354 -#, sh-format -msgid "'$invalid' is not a valid commit" -msgstr "" - -#: git-bisect.sh:363 -#, sh-format -msgid "" -"Could not check out original HEAD '$branch'.\n" -"Try 'git bisect reset <commit>'." -msgstr "" - -#: git-bisect.sh:390 -msgid "No logfile given" -msgstr "" - -#: git-bisect.sh:391 -#, sh-format -msgid "cannot read $file for replaying" -msgstr "" - -#: git-bisect.sh:408 -msgid "?? what are you talking about?" -msgstr "" - -#: git-bisect.sh:474 -msgid "We are not bisecting." -msgstr "" - -#: git-pull.sh:21 -msgid "" -"Pull is not possible because you have unmerged files.\n" -"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" -"as appropriate to mark resolution, or use 'git commit -a'." -msgstr "" - -#: git-pull.sh:25 -msgid "Pull is not possible because you have unmerged files." -msgstr "" - -#: git-pull.sh:197 -msgid "updating an unborn branch with changes added to the index" -msgstr "" - -#: git-pull.sh:253 -msgid "Cannot merge multiple branches into empty head" -msgstr "" - -#: git-pull.sh:257 -msgid "Cannot rebase onto multiple branches" -msgstr "" - -#: git-stash.sh:51 -msgid "git stash clear with parameters is unimplemented" -msgstr "" - -#: git-stash.sh:74 -msgid "You do not have the initial commit yet" -msgstr "" - -#: git-stash.sh:89 -msgid "Cannot save the current index state" -msgstr "" - -#: git-stash.sh:123 git-stash.sh:136 -msgid "Cannot save the current worktree state" -msgstr "" - -#: git-stash.sh:140 -msgid "No changes selected" -msgstr "" - -#: git-stash.sh:143 -msgid "Cannot remove temporary index (can't happen)" -msgstr "" - -#: git-stash.sh:156 -msgid "Cannot record working tree state" -msgstr "" - -#: git-stash.sh:223 -msgid "No local changes to save" -msgstr "" - -#: git-stash.sh:227 -msgid "Cannot initialize stash" -msgstr "" - -#: git-stash.sh:235 -msgid "Cannot save the current status" -msgstr "" - -#: git-stash.sh:253 -msgid "Cannot remove worktree changes" -msgstr "" - -#: git-stash.sh:352 -msgid "No stash found." -msgstr "" - -#: git-stash.sh:359 -#, sh-format -msgid "Too many revisions specified: $REV" -msgstr "" - -#: git-stash.sh:365 -#, sh-format -msgid "$reference is not valid reference" -msgstr "" - -#: git-stash.sh:393 -#, sh-format -msgid "'$args' is not a stash-like commit" -msgstr "" - -#: git-stash.sh:404 -#, sh-format -msgid "'$args' is not a stash reference" -msgstr "" - -#: git-stash.sh:412 -msgid "unable to refresh index" -msgstr "" - -#: git-stash.sh:416 -msgid "Cannot apply a stash in the middle of a merge" -msgstr "" - -#: git-stash.sh:424 -msgid "Conflicts in index. Try without --index." -msgstr "" - -#: git-stash.sh:426 -msgid "Could not save index tree" -msgstr "" - -#: git-stash.sh:460 -msgid "Cannot unstage modified files" -msgstr "" - -#: git-stash.sh:491 -#, sh-format -msgid "Dropped ${REV} ($s)" -msgstr "" - -#: git-stash.sh:492 -#, sh-format -msgid "${REV}: Could not drop stash entry" -msgstr "" - -#: git-stash.sh:499 -msgid "No branch name specified" -msgstr "" - -#: git-stash.sh:570 -msgid "(To restore them type \"git stash apply\")" -msgstr "" - -#: git-submodule.sh:56 -#, sh-format -msgid "cannot strip one component off url '$remoteurl'" -msgstr "" - -#: git-submodule.sh:108 -#, sh-format -msgid "No submodule mapping found in .gitmodules for path '$path'" -msgstr "" - -#: git-submodule.sh:149 -#, sh-format -msgid "Clone of '$url' into submodule path '$path' failed" -msgstr "" - -#: git-submodule.sh:159 -#, sh-format -msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" -msgstr "" - -#: git-submodule.sh:247 -#, sh-format -msgid "repo URL: '$repo' must be absolute or begin with ./|../" -msgstr "" - -#: git-submodule.sh:264 -#, sh-format -msgid "'$path' already exists in the index" -msgstr "" - -#: git-submodule.sh:281 -#, sh-format -msgid "'$path' already exists and is not a valid git repo" -msgstr "" - -#: git-submodule.sh:295 -#, sh-format -msgid "Unable to checkout submodule '$path'" -msgstr "" - -#: git-submodule.sh:300 -#, sh-format -msgid "Failed to add submodule '$path'" -msgstr "" - -#: git-submodule.sh:305 -#, sh-format -msgid "Failed to register submodule '$path'" -msgstr "" - -#: git-submodule.sh:347 -#, sh-format -msgid "Entering '$prefix$path'" -msgstr "" - -#: git-submodule.sh:359 -#, sh-format -msgid "Stopping at '$path'; script returned non-zero status." -msgstr "" - -#: git-submodule.sh:401 -#, sh-format -msgid "No url found for submodule path '$path' in .gitmodules" -msgstr "" - -#: git-submodule.sh:410 -#, sh-format -msgid "Failed to register url for submodule path '$path'" -msgstr "" - -#: git-submodule.sh:418 -#, sh-format -msgid "Failed to register update mode for submodule path '$path'" -msgstr "" - -#: git-submodule.sh:420 -#, sh-format -msgid "Submodule '$name' ($url) registered for path '$path'" -msgstr "" - -#: git-submodule.sh:519 -#, sh-format -msgid "" -"Submodule path '$path' not initialized\n" -"Maybe you want to use 'update --init'?" -msgstr "" - -#: git-submodule.sh:532 -#, sh-format -msgid "Unable to find current revision in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:551 -#, sh-format -msgid "Unable to fetch in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:565 -#, sh-format -msgid "Unable to rebase '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:566 -#, sh-format -msgid "Submodule path '$path': rebased into '$sha1'" -msgstr "" - -#: git-submodule.sh:571 -#, sh-format -msgid "Unable to merge '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:572 -#, sh-format -msgid "Submodule path '$path': merged in '$sha1'" -msgstr "" - -#: git-submodule.sh:577 -#, sh-format -msgid "Unable to checkout '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:578 -#, sh-format -msgid "Submodule path '$path': checked out '$sha1'" -msgstr "" - -#: git-submodule.sh:600 git-submodule.sh:923 -#, sh-format -msgid "Failed to recurse into submodule path '$path'" -msgstr "" - -#: git-submodule.sh:708 -msgid "--" -msgstr "" - -#: git-submodule.sh:766 -#, sh-format -msgid " Warn: $name doesn't contain commit $sha1_src" -msgstr "" - -#: git-submodule.sh:769 -#, sh-format -msgid " Warn: $name doesn't contain commit $sha1_dst" -msgstr "" - -#: git-submodule.sh:772 -#, sh-format -msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" -msgstr "" - -#: git-submodule.sh:797 -msgid "blob" -msgstr "" - -#: git-submodule.sh:798 -msgid "submodule" -msgstr "" - -#: git-submodule.sh:969 -#, sh-format -msgid "Synchronizing submodule url for '$name'" -msgstr "" @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: git 1.8.4\n" +"Project-Id-Version: git 1.9\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2013-08-06 14:10+0800\n" +"POT-Creation-Date: 2014-02-01 08:06+0800\n" "PO-Revision-Date: 2013-07-28 18:42+0200\n" "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n" "Language-Team: German <>\n" @@ -57,71 +57,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <Repository> [--exec <Programm>] --list" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein" + +#: archive.c:327 msgid "fmt" msgstr "Format" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "Archivformat" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" -msgstr "Prefix" +msgstr "Präfix" -#: archive.c:325 +#: archive.c:329 msgid "prepend prefix to each pathname in the archive" msgstr "stellt einen Präfix vor jeden Pfadnamen in dem Archiv" -#: archive.c:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "Datei" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "schreibt das Archiv in diese Datei" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "liest .gitattributes aus dem Arbeitsverzeichnis" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "gibt archivierte Dateien in der Standard-Fehlerausgabe aus" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "nur speichern" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "schneller komprimieren" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "besser komprimieren" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "listet unterstützte Archivformate auf" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "Repository" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 msgid "retrieve the archive from remote repository <repo>" msgstr "ruft das Archiv von Remote-Repository <Repository> ab" -#: archive.c:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "Programm" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "Pfad zum externen \"git-upload-archive\"-Programm" @@ -207,19 +212,19 @@ msgstr "Branch '%s' existiert bereits." msgid "Cannot force update the current branch." msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen." -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "" "Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein " "Branch." -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "der angeforderte Upstream-Branch '%s' existiert nicht" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -240,87 +245,87 @@ msgstr "" "\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n" "zu konfigurieren." -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "Ungültiger Objekt-Name: '%s'" -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "mehrdeutiger Objekt-Name: '%s'" -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "Ungültiger Branchpunkt: '%s'" -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "Fehler beim Sperren der Referenz zur Aktualisierung." -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "Fehler beim Schreiben der Referenz." -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "nicht erkannter Kopfbereich: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "Konnte '%s' nicht öffnen" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "Einrichtung des Revisionsgangs fehlgeschlagen" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "Das Paket enthält diese Referenz:" msgstr[1] "Das Paket enthält diese %d Referenzen:" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "Das Paket speichert eine komplette Historie." -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "Das Paket benötigt diese Referenz:" msgstr[1] "Das Paket benötigt diese %d Referenzen:" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "\"rev-list\" abgebrochen" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "nicht erkanntes Argument: %s" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "Erstellung eines leeren Pakets zurückgewiesen." @@ -355,16 +360,16 @@ msgstr "%s %s ist kein Commit!" msgid "memory exhausted" msgstr "Speicher verbraucht" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "Konnte 'git rev-list' nicht ausführen" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "Fehler beim Schreiben nach rev-list: %s" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe: %s" @@ -436,23 +441,28 @@ msgid_plural "%lu years ago" msgstr[0] "vor %lu Jahr" msgstr[1] "vor %lu Jahren" -#: diff.c:112 +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'." + +#: diff.c:113 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr "" " Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n" -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " Unbekannter \"dirstat\" Parameter '%s'\n" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -461,7 +471,7 @@ msgstr "" "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n" "%s" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -470,7 +480,7 @@ msgstr "" "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n" "%s" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'" @@ -497,17 +507,17 @@ msgstr "konnte temporäre Datei '%s' nicht erstellen: %s" msgid "failed writing detached signature to '%s': %s" msgstr "Fehler beim Schreiben der Signatur nach '%s': %s" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "'%s': konnte nicht lesen %s" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "'%s': %s" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "'%s': read() zu kurz %s" @@ -580,8 +590,8 @@ msgstr "%s: %s - %s" msgid "failed to read the cache" msgstr "Lesen des Zwischenspeichers fehlgeschlagen" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 msgid "unable to write new index file" msgstr "Konnte neue Staging-Area-Datei nicht schreiben." @@ -630,7 +640,7 @@ msgstr "kann Objekt %s '%s' nicht lesen" msgid "blob expected for %s '%s'" msgstr "Blob erwartet für %s '%s'" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "Fehler beim Öffnen von '%s'" @@ -680,7 +690,7 @@ msgstr "" msgid "rename" msgstr "umbenennen" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "umbenannt" @@ -745,7 +755,7 @@ msgstr "Objekt %s ist kein Blob" msgid "modify" msgstr "ändern" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "geändert" @@ -767,7 +777,7 @@ msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)" msgid "Auto-merging %s" msgstr "automatischer Merge von %s" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "Submodul" @@ -839,7 +849,7 @@ msgstr "Merge hat keinen Commit zurückgegeben" msgid "Could not parse object '%s'" msgstr "Konnte Objekt '%s' nicht parsen." -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "Konnte Staging-Area nicht schreiben." @@ -866,58 +876,158 @@ msgstr "" msgid "Bad %s value: '%s'" msgstr "Ungültiger %s Wert: '%s'" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "Konnte Objekt '%s' nicht parsen." -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "..." -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "Verwendung: %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr " oder: %s" -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "-NUM" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" +"Globale Einstellungen zur Pfadspezifikation 'glob' und 'noglob' sind " +"inkompatibel." + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" +"Globale Einstellung zur Pfadspezifikation 'literal' ist inkompatibel\n" +"mit allen anderen Optionen." + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "ungültiger Parameter für Pfadspezifikationsangabe 'prefix'" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "ungültige Pfadspezifikationsangabe '%.*s' in '%s'" + +#: pathspec.c:187 #, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "Pfad '%s' befindet sich in Submodul '%.*s'" +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "Fehlendes ')' am Ende der Pfadspezifikationsangabe in '%s'" -#: pathspec.c:99 +#: pathspec.c:205 #, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "'%s' ist hinter einem symbolischen Verweis" +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "nicht unterstützte Pfadspezifikationsangabe '%c' in '%s'" -#: remote.c:1788 +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s: 'literal' und 'glob' sind inkompatibel" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "%s: '%s' liegt außerhalb des Repositories" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'" + +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "" +"%s: Pfadspezifikationsangabe wird von diesem Kommando nicht unterstützt: %s" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "Pfadspezifikation '%s' ist hinter einem symbolischen Verweis" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n" +"Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen." + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "%s folgt üblicherweise %s, nicht %s" + +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "%s folgt sowohl %s als auch %s" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "Interner Fehler" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "Ihr Branch basiert auf '%s', aber Upstream-Branch wurde entfernt.\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n" + +#: remote.c:1882 #, 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] "Ihr Branch ist vor '%s' um %d Commit.\n" msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (benutzen Sie \"git push\" um lokale Commits zu publizieren)\n" -#: remote.c:1797 +#: remote.c:1891 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -927,12 +1037,12 @@ msgstr[0] "" msgstr[1] "" "Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n" -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr "" " (benutzen Sie \"git pull\" um Ihren lokalen Branch zu aktualisieren)\n" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -947,7 +1057,7 @@ msgstr[1] "" "Ihr Branch und '%s' sind divergiert,\n" "und haben jeweils %d und %d unterschiedliche Commits.\n" -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr "" " (benutzen Sie \"git pull\" um Ihren Branch mit dem Remote-Branch " @@ -962,14 +1072,14 @@ msgstr "Öffnen von /dev/null fehlgeschlagen" msgid "dup2(%d,%d) failed" msgstr "dup2(%d,%d) fehlgeschlagen" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "Konnte nicht nach '%s' schreiben." @@ -992,7 +1102,7 @@ msgstr "" "mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n" "'git commit' ein" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "Konnte nicht nach %s schreiben" @@ -1017,201 +1127,201 @@ msgstr "" "Tragen Sie Ihre Änderungen ein oder benutzen Sie \"stash\" um fortzufahren." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:324 +#: sequencer.c:325 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Konnte neue Staging-Area-Datei nicht schreiben" -#: sequencer.c:355 +#: sequencer.c:356 msgid "Could not resolve HEAD commit\n" msgstr "Konnte Commit von HEAD nicht auflösen\n" -#: sequencer.c:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n" -#: sequencer.c:422 +#: sequencer.c:423 #, c-format msgid "Could not parse commit %s\n" msgstr "Konnte Commit %s nicht parsen\n" -#: sequencer.c:427 +#: sequencer.c:428 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Konnte Eltern-Commit %s nicht parsen\n" -#: sequencer.c:493 +#: sequencer.c:494 msgid "Your index file is unmerged." msgstr "Ihre Staging-Area-Datei ist nicht zusammengeführt." -#: sequencer.c:512 +#: sequencer.c:513 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben." -#: sequencer.c:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" msgstr "Commit %s hat keinen Elternteil %d" -#: sequencer.c:524 +#: sequencer.c:525 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge." #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:537 +#: sequencer.c:538 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kann Eltern-Commit %s nicht parsen" -#: sequencer.c:541 +#: sequencer.c:542 #, c-format msgid "Cannot get commit message for %s" msgstr "Kann keine Commit-Beschreibung für %s bekommen" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "Konnte \"revert\" nicht auf %s ausführen... %s" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "Konnte %s nicht anwenden... %s" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" msgstr "leere Menge von Commits übergeben" -#: sequencer.c:672 +#: sequencer.c:673 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: Fehler beim Lesen der Staging-Area" -#: sequencer.c:677 +#: sequencer.c:678 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: Fehler beim Aktualisieren der Staging-Area" -#: sequencer.c:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "Kann %s nicht während eines %s durchführen" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "Konnte Zeile %d nicht parsen." -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." msgstr "Keine Commits geparst." -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "Konnte %s nicht öffnen" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "Konnte %s nicht lesen." -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Unbenutzbares Instruktionsblatt: %s" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "Ungültiger Schlüssel: %s" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "Ungültiger Wert für %s: %s" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "Fehlerhaftes Optionsblatt: %s" -#: sequencer.c:850 +#: sequencer.c:851 msgid "a cherry-pick or revert is already in progress" msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:855 +#: sequencer.c:856 #, c-format msgid "Could not create sequencer directory %s" msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen" -#: sequencer.c:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "Fehler beim Einpacken von %s." -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "kein \"cherry-pick\" oder \"revert\" im Gang" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "kann HEAD nicht auflösen" -#: sequencer.c:894 +#: sequencer.c:895 msgid "cannot abort from a branch yet to be born" msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird" -#: sequencer.c:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "Kann %s nicht öffnen: %s" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "Kann %s nicht lesen: %s" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" msgstr "Unerwartetes Dateiende" -#: sequencer.c:926 +#: sequencer.c:927 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt" -#: sequencer.c:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." msgstr "Konnte %s nicht formatieren." -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "%s: ungültiger Commit" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" msgstr "Kann nicht als allerersten Commit einen Revert ausführen." -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen." -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1236,275 +1346,361 @@ msgstr "" "indem Sie \"git config advice.objectNameWarning false\"\n" "ausführen." -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "HEAD zeigt auf keinen Branch" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "Kein solcher Branch '%s'" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert." -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "Upstream-Branch '%s' ist nicht als Remote-Tracking-Branch gespeichert" -#: wrapper.c:408 +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" +"Kann nicht zusammengeführte .gitmodules-Datei nicht ändern, lösen\n" +"Sie zuerst die Konflikte auf" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "Konnte .gitmodules nicht in der Staging-Area finden" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "Konnte git-Verweis %s nicht erstellen" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "Konnte core.worktree in '%s' nicht setzen." + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "ungültige Escape-Sequenz %XX" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "fehlender Host und Schema ist nicht 'file:'" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "eine 'file:' URL darf keine Portnummer enthalten" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "Hostname enthält ungültige Zeichen" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "ungültige Portnummer" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "ungültiges '..' Pfadsegment" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "konnte nicht auf '%s' zugreifen: %s" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "konnte nicht auf '%s' zugreifen" -#: wrapper.c:440 +#: wrapper.c:454 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s" -#: wrapper.c:441 +#: wrapper.c:455 msgid "no such user" msgstr "kein solcher Benutzer" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "Nicht zusammengeführte Pfade:" -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr "" " (benutzen Sie \"git reset %s <Datei>...\" zum Entfernen aus der Staging-" "Area)" -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr "" " (benutzen Sie \"git rm --cached <Datei>...\" zum Entfernen aus der Staging-" "Area)" -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr "" " (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung zu markieren)" -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" " (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung entsprechend zu " "markieren)" -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr "" " (benutzen Sie \"git add/rm <Datei>...\" um die Auflösung zu markieren)" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "zum Commit vorgemerkte Änderungen:" -#: wt-status.c:207 +#: wt-status.c:216 msgid "Changes not staged for commit:" msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:" -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr "" " (benutzen Sie \"git add <Datei>...\" um die Änderungen zum Commit " "vorzumerken)" -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" " (benutzen Sie \"git add/rm <Datei>...\" um die Änderungen zum Commit " "vorzumerken)" -#: wt-status.c:214 +#: wt-status.c:223 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" " (benutzen Sie \"git checkout -- <Datei>...\" um die Änderungen im " "Arbeitsverzeichnis zu verwerfen)" -#: wt-status.c:216 +#: wt-status.c:225 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" " (committen oder verwerfen Sie den unbeobachteten oder geänderten Inhalt in " "den Submodulen)" -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" " (benutzen Sie \"git %s <Datei>...\" um die Änderungen zum Commit " "vorzumerken)" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "Fehler" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "beide gelöscht:" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "von uns hinzugefügt:" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "von denen gelöscht:" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "von denen hinzugefügt:" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "von uns gelöscht:" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "von beiden hinzugefügt:" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "von beiden geändert:" -#: wt-status.c:286 +#: wt-status.c:275 +msgid "new file" +msgstr "neue Datei" + +#: wt-status.c:277 +msgid "copied" +msgstr "kopiert" + +#: wt-status.c:279 +msgid "deleted" +msgstr "gelöscht" + +#: wt-status.c:285 +msgid "typechange" +msgstr "Typänderung" + +#: wt-status.c:287 +msgid "unknown" +msgstr "unbekannt" + +#: wt-status.c:289 +msgid "unmerged" +msgstr "nicht zusammengeführt" + +#: wt-status.c:336 msgid "new commits, " msgstr "neue Commits, " -#: wt-status.c:288 +#: wt-status.c:338 msgid "modified content, " msgstr "geänderter Inhalt, " -#: wt-status.c:290 +#: wt-status.c:340 msgid "untracked content, " msgstr "unbeobachteter Inhalt, " -#: wt-status.c:307 -#, c-format -msgid "new file: %s" -msgstr "neue Datei: %s" - -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" -msgstr "kopiert: %s -> %s" - -#: wt-status.c:313 -#, c-format -msgid "deleted: %s" -msgstr "gelöscht: %s" - -#: wt-status.c:316 +#: wt-status.c:357 #, c-format -msgid "modified: %s" -msgstr "geändert: %s" - -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" -msgstr "umbenannt: %s -> %s" - -#: wt-status.c:322 -#, c-format -msgid "typechange: %s" -msgstr "Typänderung: %s" +msgid "bug: unhandled diff status %c" +msgstr "Fehler: unbehandelter Differenz-Status %c" -#: wt-status.c:325 -#, c-format -msgid "unknown: %s" -msgstr "unbekannt: %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "Submodule geändert, aber nicht aktualisiert:" -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" -msgstr "nicht zusammengeführt: %s" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "Änderungen in Submodul zum Committen:" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "Fehler: unbehandelter Differenz-Status %c" +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"Ändern Sie nicht die obige Zeile.\n" +"Alles unterhalb von ihr wird entfernt." -#: wt-status.c:803 +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "Sie haben nicht zusammengeführte Pfade." -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge." -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr " (benutzen Sie \"git commit\" um den Merge abzuschließen)" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." msgstr "Eine \"am\"-Sitzung ist im Gange." -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "Der aktuelle Patch ist leer." -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr "" " (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)" -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (benutzen Sie \"git am --skip\" um diesen Patch auszulassen)" -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr "" " (benutzen Sie \"git am --abort\" um den ursprünglichen Branch " "wiederherzustellen)" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'." -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 msgid "You are currently rebasing." msgstr "Sie sind gerade beim Rebase." -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr "" " (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" " "aus)" -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (benutzen Sie \"git rebase --skip\" um diesen Patch auszulassen)" -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr "" " (benutzen Sie \"git rebase --abort\" um den ursprünglichen Branch " "auszuchecken)" -#: wt-status.c:918 +#: wt-status.c:1014 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." @@ -1512,128 +1708,129 @@ msgstr "" "Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf " "'%s' im Gange ist." -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." msgstr "Sie teilen gerade einen Commit während eines Rebase auf." -#: wt-status.c:930 +#: wt-status.c:1026 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr "" " (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --" "continue\" aus)" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" "Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf " "'%s'." -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." msgstr "Sie editieren gerade einen Commit während eines Rebase." -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr "" " (benutzen Sie \"git commit --amend\" um den aktuellen Commit nachzubessern)" -#: wt-status.c:944 +#: wt-status.c:1040 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr "" " (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen " "abgeschlossen sind)" -#: wt-status.c:954 -msgid "You are currently cherry-picking." -msgstr "Sie führen gerade \"cherry-pick\" aus." +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus." -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr "" " (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue" "\" aus)" -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" " (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)" -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr "" " (benutzen Sie \"git cherry-pick --abort\" um die Cherry-Pick-Operation " "abzubrechen)" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." msgstr "Sie sind gerade an einem Revert von Commit '%s'." -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr "" " (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" " "aus)" -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)" -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr "" " (benutzen Sie \"git revert --abort\" um die Revert-Operation abzubrechen)" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'." -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." msgstr "Sie sind gerade bei einer binären Suche." -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr "" " (benutzen Sie \"git bisect reset\" um zum ursprünglichen Branch " "zurückzukehren)" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "Auf Branch " -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " msgstr "Rebase im Gange; auf " -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " msgstr "HEAD losgelöst bei " -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " msgstr "HEAD losgelöst von " -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "Im Moment auf keinem Branch." -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" msgstr "Initialer Commit" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "Unbeobachtete Dateien" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "Ignorierte Dateien" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1644,32 +1841,32 @@ msgstr "" "'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n" "neue Dateien selbstständig hinzuzufügen (siehe 'git help status')." -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" msgstr "Unbeobachtete Dateien nicht aufgelistet%s" -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr " (benutzen Sie die Option -u um unbeobachteten Dateien anzuzeigen)" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "Keine Änderungen" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" "keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder " "\"git commit -a\")\n" -#: wt-status.c:1251 +#: wt-status.c:1350 #, c-format msgid "no changes added to commit\n" msgstr "keine Änderungen zum Commit vorgemerkt\n" -#: wt-status.c:1254 +#: wt-status.c:1353 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " @@ -1678,56 +1875,60 @@ msgstr "" "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien (benutzen " "Sie \"git add\" zum Beobachten)\n" -#: wt-status.c:1257 +#: wt-status.c:1356 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien\n" -#: wt-status.c:1260 +#: wt-status.c:1359 #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" "nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git " "add\" zum Beobachten)\n" -#: wt-status.c:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" msgstr "nichts zu committen\n" -#: wt-status.c:1266 +#: wt-status.c:1365 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "" "nichts zu committen (benutzen Sie die Option -u, um unbeobachtete Dateien " "anzuzeigen)\n" -#: wt-status.c:1270 +#: wt-status.c:1369 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "HEAD (kein Branch)" -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " msgstr "Initialer Commit auf " -#: wt-status.c:1399 +#: wt-status.c:1514 +msgid "gone" +msgstr "entfernt" + +#: wt-status.c:1516 msgid "behind " msgstr "hinterher " -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "voraus " -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr ", hinterher " -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" msgstr "Konnte '%s' nicht entfernen." @@ -1813,7 +2014,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "unerwarteter Differenz-Status %c" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "Aktualisierung der Dateien fehlgeschlagen" @@ -1822,147 +2023,142 @@ msgstr "Aktualisierung der Dateien fehlgeschlagen" msgid "remove '%s'\n" msgstr "lösche '%s'\n" -#: builtin/add.c:253 +#: builtin/add.c:237 msgid "Unstaged changes after refreshing the index:" msgstr "" "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "Konnte die Staging-Area nicht lesen" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "Konnte Patch nicht schreiben" -#: builtin/add.c:359 +#: builtin/add.c:319 #, c-format msgid "Could not stat '%s'" msgstr "Konnte Verzeichnis '%s' nicht lesen" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." msgstr "Leerer Patch. Abgebrochen." -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" msgstr "Konnte '%s' nicht anwenden." -#: builtin/add.c:377 +#: builtin/add.c:337 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" "Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien " "ignoriert:\n" -#: builtin/add.c:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "Probelauf" -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "erweiterte Ausgaben" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "interaktives Auswählen" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" msgstr "Blöcke interaktiv auswählen" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "aktuelle Unterschiede editieren und anwenden" -#: builtin/add.c:400 +#: builtin/add.c:360 msgid "allow adding otherwise ignored files" msgstr "erlaubt das Hinzufügen andernfalls ignorierter Dateien" -#: builtin/add.c:401 +#: builtin/add.c:361 msgid "update tracked files" msgstr "aktualisiert beobachtete Dateien" -#: builtin/add.c:402 +#: builtin/add.c:362 msgid "record only the fact that the path will be added later" msgstr "speichert nur, dass der Pfad später hinzugefügt werden soll" -#: builtin/add.c:403 +#: builtin/add.c:363 msgid "add changes from all tracked and untracked files" msgstr "" "fügt Änderungen von allen beobachteten und unbeobachteten Dateien hinzu" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "ignoriert gelöschte Pfade im Arbeitsverzeichnis (genau wie --no-all)" -#: builtin/add.c:408 +#: builtin/add.c:368 msgid "don't add, only refresh the index" msgstr "fügt nichts hinzu, aktualisiert nur die Staging-Area" -#: builtin/add.c:409 +#: builtin/add.c:369 msgid "just skip files which cannot be added because of errors" msgstr "" "überspringt Dateien, die aufgrund von Fehlern nicht hinzugefügt werden " "konnten" -#: builtin/add.c:410 +#: builtin/add.c:370 msgid "check if - even missing - files are ignored in dry run" msgstr "prüft ob - auch fehlende - Dateien im Probelauf ignoriert werden" -#: builtin/add.c:432 +#: builtin/add.c:392 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n" -#: builtin/add.c:433 +#: builtin/add.c:393 msgid "no files added" msgstr "keine Dateien hinzugefügt" -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "Hinzufügen von Dateien fehlgeschlagen" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "Die Optionen -A und -u sind zueinander inkompatibel." -#: builtin/add.c:496 +#: builtin/add.c:456 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "" "Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden." -#: builtin/add.c:526 +#: builtin/add.c:486 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "Nichts spezifiziert, nichts hinzugefügt.\n" -#: builtin/add.c:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Wollten Sie vielleicht 'git add .' sagen?\n" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "Staging-Area-Datei beschädigt" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 msgid "Unable to write new index file" msgstr "Konnte neue Staging-Area-Datei nicht schreiben." @@ -2220,7 +2416,7 @@ msgstr "%s: Patch konnte nicht angewendet werden" msgid "Checking patch %s..." msgstr "Prüfe Patch %s..." -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen" @@ -2300,8 +2496,8 @@ msgstr "nicht erkannte Eingabe" msgid "unable to read index file" msgstr "Konnte Staging-Area-Datei nicht lesen" -#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "Pfad" @@ -2374,7 +2570,7 @@ msgstr "" "erstellt eine temporäre Staging-Area basierend auf den integrierten Staging-" "Area-Informationen" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "Pfade sind getrennt durch NUL Zeichen" @@ -2508,104 +2704,104 @@ msgstr "führt 'git bisect next' aus" msgid "update BISECT_HEAD instead of checking out the current commit" msgstr "aktualisiert BISECT_HEAD, anstatt den aktuellen Commit auszuchecken" -#: builtin/blame.c:26 +#: builtin/blame.c:27 msgid "git blame [options] [rev-opts] [rev] [--] file" msgstr "git blame [Optionen] [rev-opts] [rev] [--] Datei" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-opts] sind dokumentiert in git-rev-list(1)" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 msgid "Show blame entries as we find them, incrementally" msgstr "Zeigt \"blame\"-Einträge schrittweise, während wir sie generieren" -#: builtin/blame.c:2277 +#: builtin/blame.c:2250 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "Zeigt leere SHA-1 für Grenz-Commits (Standard: aus)" -#: builtin/blame.c:2278 +#: builtin/blame.c:2251 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Behandelt Ursprungs-Commit nicht als Grenzen (Standard: aus)" -#: builtin/blame.c:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "Zeigt Statistiken zum Arbeitsaufwand" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 msgid "Show output score for blame entries" msgstr "Zeigt Ausgabebewertung für \"blame\"-Einträge" -#: builtin/blame.c:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "Zeigt ursprünglichen Dateinamen (Standard: auto)" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "Zeigt ursprüngliche Zeilennummer (Standard: aus)" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 msgid "Show in a format designed for machine consumption" msgstr "Anzeige in einem Format für maschinelle Auswertung" -#: builtin/blame.c:2284 +#: builtin/blame.c:2257 msgid "Show porcelain format with per-line commit information" msgstr "" "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile" -#: builtin/blame.c:2285 +#: builtin/blame.c:2258 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "Benutzt den gleichen Ausgabemodus wie \"git-annotate\" (Standard: aus)" -#: builtin/blame.c:2286 +#: builtin/blame.c:2259 msgid "Show raw timestamp (Default: off)" msgstr "Zeigt unbearbeiteten Zeitstempel (Standard: aus)" -#: builtin/blame.c:2287 +#: builtin/blame.c:2260 msgid "Show long commit SHA1 (Default: off)" msgstr "Zeigt langen Commit-SHA1 (Standard: aus)" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 msgid "Suppress author name and timestamp (Default: off)" msgstr "Unterdrückt den Namen des Autors und den Zeitstempel (Standard: aus)" -#: builtin/blame.c:2289 +#: builtin/blame.c:2262 msgid "Show author email instead of name (Default: off)" msgstr "Zeigt anstatt des Namens die Email-Adresse des Autors (Standard: aus)" -#: builtin/blame.c:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "Ignoriert Unterschiede im Whitespace" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 msgid "Spend extra cycles to find better match" msgstr "arbeite länger, um bessere Übereinstimmungen zu finden" -#: builtin/blame.c:2292 +#: builtin/blame.c:2265 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "Benutzt Commits von <Datei> anstatt \"git-rev-list\" aufzurufen" -#: builtin/blame.c:2293 +#: builtin/blame.c:2266 msgid "Use <file>'s contents as the final image" msgstr "Benutzt Inhalte der <Datei>en als entgültiges Abbild" -#: builtin/blame.c:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "Bewertung" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 msgid "Find line copies within and across files" msgstr "Findet kopierte Zeilen innerhalb oder zwischen Dateien" -#: builtin/blame.c:2295 +#: builtin/blame.c:2268 msgid "Find line movements within and across files" msgstr "Findet verschobene Zeilen innerhalb oder zwischen Dateien" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "Verarbeitet nur Zeilen im Bereich n,m, gezählt von 1" @@ -2711,242 +2907,252 @@ msgstr "Branch %s entfernt (war %s).\n" msgid "branch '%s' does not point at a commit" msgstr "Branch '%s' zeigt auf keinen Commit" -#: builtin/branch.c:453 +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: entfernt]" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "[%s: %d hinterher]" -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "[%d hinterher]" -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: %d voraus]" -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "[%d voraus]" -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: %d voraus, %d hinterher]" -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "[%d voraus, %d hinterher]" -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" msgstr " **** ungültige Referenz ****" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "(kein Branch, Rebase von Branch %s im Gange)" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(kein Branch, binäre Suche begonnen bei %s)" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "(losgelöst von %s)" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "(kein Branch)" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" msgstr "Objekt '%s' zeigt auf keinen Commit" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "Konnte einige Referenzen nicht lesen" -#: builtin/branch.c:682 +#: builtin/branch.c:694 msgid "cannot rename the current branch while not on any." msgstr "" "Kann aktuellen Branch nicht umbenennen, solange Sie sich auf keinem befinden." -#: builtin/branch.c:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" msgstr "Ungültiger Branchname: '%s'" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" msgstr "Umbenennung des Branches fehlgeschlagen" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "falsch benannten Branch '%s' umbenannt" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "Branch umbenannt zu %s, aber HEAD ist nicht aktualisiert!" -#: builtin/branch.c:722 +#: builtin/branch.c:734 msgid "Branch is renamed, but update of config-file failed" msgstr "" "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist " "fehlgeschlagen." -#: builtin/branch.c:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "Missgebildeter Objektname %s" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, c-format msgid "could not write branch description template: %s" msgstr "Konnte Beschreibungsvorlage für Branch nicht schreiben: %s" -#: builtin/branch.c:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "Allgemeine Optionen" -#: builtin/branch.c:793 +#: builtin/branch.c:805 msgid "show hash and subject, give twice for upstream branch" msgstr "Zeigt Hash und Betreff; -vv: zusätzlich Upstream-Branch" -#: builtin/branch.c:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "unterdrückt Informationsmeldungen" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" msgstr "stellt den Übernahmemodus ein (siehe git-pull(1))" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" msgstr "ändert Informationen zum Upstream-Branch" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "verwendet farbliche Ausgaben" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "wirkt auf Remote-Tracking-Branches" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "Commit" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 msgid "print only branches that contain the commit" msgstr "gibt nur Branches aus, welche diesen Commit beinhalten" -#: builtin/branch.c:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "spezifische Aktionen für \"git-branch\":" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "listet Remote-Tracking und lokale Branches auf" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "entfernt vollständig zusammengeführten Branch" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "löscht Branch (auch wenn nicht zusammengeführt)" -#: builtin/branch.c:823 +#: builtin/branch.c:835 msgid "move/rename a branch and its reflog" msgstr "verschiebt/benennt einen Branch und dessen Reflog um" -#: builtin/branch.c:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" msgstr "" "verschiebt/benennt einen Branch um, auch wenn das Ziel bereits existiert" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "listet Branchnamen auf" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "erzeugt das Reflog des Branches" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "bearbeitet die Beschreibung für den Branch" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" msgstr "erzeuge auch, wenn der Branch bereits existiert" -#: builtin/branch.c:832 +#: builtin/branch.c:844 msgid "print only not merged branches" msgstr "gibt nur Branches aus, die nicht zusammengeführt sind" -#: builtin/branch.c:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "gibt nur Branches aus, die zusammengeführt sind" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "listet Branches in Spalten auf" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "Konnte HEAD nicht als gültige Referenz auflösen." -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "HEAD wurde nicht unter \"refs/heads\" gefunden!" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" msgstr "Die Optionen --column und --verbose sind inkompatibel." -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "Branchname erforderlich" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "zu losgelöstem HEAD kann keine Beschreibung hinterlegt werden" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "Beschreibung von mehr als einem Branch kann nicht bearbeitet werden" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "Noch kein Commit in Branch '%s'." -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "Branch '%s' nicht vorhanden." -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "zu viele Branches für eine Umbenennen-Operation angegeben" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" msgstr "zu viele Branches angegeben um Upstream-Branch zu setzen" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." @@ -2954,43 +3160,43 @@ msgstr "" "Konnte keinen neuen Upstream-Branch von HEAD zu %s setzen, da dieser auf\n" "keinen Branch zeigt." -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "Kein solcher Branch '%s'" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" msgstr "Branch '%s' existiert nicht" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" msgstr "" "zu viele Branches angegeben um Konfiguration zu Upstream-Branch zu entfernen" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" "Konnte Konfiguration zu Upstream-Branch von HEAD nicht entfernen, da dieser\n" "auf keinen Branch zeigt." -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" msgstr "'HEAD' darf nicht manuell erstellt werden" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" "Die Optionen -a und -r bei 'git branch' können nicht gemeimsam mit einem " "Branchnamen verwendet werden." -#: builtin/branch.c:996 +#: builtin/branch.c:1008 #, c-format msgid "" "The --set-upstream flag is deprecated and will be removed. Consider using --" @@ -2999,7 +3205,7 @@ msgstr "" "Die --set-upstream Option ist veraltet und wird entfernt. Benutzen Sie --" "track oder --set-upstream-to\n" -#: builtin/branch.c:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -3010,12 +3216,12 @@ msgstr "" "Wenn Sie wollten, dass '%s' den Branch '%s' als Upstream-Branch hat, führen " "Sie aus:\n" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr " git branch --set-upstream-to %s\n" @@ -3033,45 +3239,45 @@ msgstr "Um ein Paket zu erstellen wird ein Repository benötigt." msgid "Need a repository to unbundle." msgstr "Zum Entpacken wird ein Repository benötigt." -#: builtin/cat-file.c:285 +#: builtin/cat-file.c:328 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" msgstr "git cat-file (-t|-s|-e|-p|<Art>|--textconv) <Objekt>" -#: builtin/cat-file.c:286 +#: builtin/cat-file.c:329 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" msgstr "git cat-file (--batch|--batch-check) < <Liste_von_Objekten>" -#: builtin/cat-file.c:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "<Art> kann sein: blob, tree, commit, tag" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "zeigt Objektart" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "zeigt Objektgröße" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 msgid "exit with zero when there's no error" msgstr "beendet mit Rückgabewert 0, wenn kein Fehler aufgetreten ist" -#: builtin/cat-file.c:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "ansprechende Anzeige des Objektinhaltes" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 msgid "for blob objects, run textconv on object's content" msgstr "führt eine Textkonvertierung auf den Inhalt von Blob-Objekten aus" -#: builtin/cat-file.c:332 +#: builtin/cat-file.c:375 msgid "show info and content of objects fed from the standard input" msgstr "" "Anzeige von Informationen und Inhalt von Objekten, gelesen von der Standard-" "Eingabe" -#: builtin/cat-file.c:335 +#: builtin/cat-file.c:378 msgid "show info about objects fed from the standard input" msgstr "" "Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe" @@ -3098,10 +3304,10 @@ msgid "read file names from stdin" msgstr "liest Dateinamen von der Standard-Eingabe" #: builtin/check-attr.c:23 builtin/check-ignore.c:24 -msgid "input paths are terminated by a null character" -msgstr "Eingabepfade sind durch ein NUL Zeichen abgeschlossen" +msgid "terminate input and output records by a NUL character" +msgstr "schließt Einträge von Ein- und Ausgabe mit NUL-Zeichen ab" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "unterdrückt Fortschrittsanzeige" @@ -3109,28 +3315,32 @@ msgstr "unterdrückt Fortschrittsanzeige" msgid "show non-matching input paths" msgstr "zeigt Eingabe-Pfade ohne Übereinstimmungen" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "ignoriert Staging-Area bei der Prüfung" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "Angabe von Pfadnamen kann nicht gemeinsam mit --stdin verwendet werden" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "Die Option -z kann nur mit --stdin verwendet werden." -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" msgstr "kein Pfad angegeben" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "Die Option --quiet ist nur mit einem einzelnen Pfadnamen gültig." -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "" "Die Optionen --quiet und --verbose können nicht gemeinsam verwendet werden." -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "--non-matching ist nur mit --verbose zulässig" @@ -3206,107 +3416,107 @@ msgstr "git checkout [Optionen] <Branch>" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "git checkout [Optionen] [<Branch>] -- <Datei>..." -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, c-format msgid "path '%s' does not have our version" msgstr "Pfad '%s' hat nicht unsere Version." -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have their version" msgstr "Pfad '%s' hat nicht deren Version." -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "Pfad '%s' hat nicht alle notwendigen Versionen." -#: builtin/checkout.c:179 +#: builtin/checkout.c:176 #, c-format msgid "path '%s' does not have necessary versions" msgstr "Pfad '%s' hat nicht die notwendigen Versionen." -#: builtin/checkout.c:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "Pfad '%s': kann nicht zusammenführen" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, c-format msgid "Unable to add merge result for '%s'" msgstr "Konnte Merge-Ergebnis von '%s' nicht hinzufügen." -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, c-format msgid "'%s' cannot be used with updating paths" msgstr "'%s' kann nicht mit Pfaden verwendet werden" -#: builtin/checkout.c:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" msgstr "'%s' kann nicht mit '%s' verwendet werden" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, c-format msgid "Cannot update paths and switch to branch '%s' at the same time." msgstr "" "Kann nicht gleichzeitig Pfade aktualisieren und zu Branch '%s' wechseln" -#: builtin/checkout.c:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "beschädigte Staging-Area-Datei" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "Pfad '%s' ist nicht zusammengeführt." -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" msgstr "Sie müssen zuerst Ihre aktuelle Staging-Area auflösen." -#: builtin/checkout.c:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "HEAD ist jetzt bei" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "Setze Branch '%s' neu\n" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "Bereits auf '%s'\n" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Gewechselt zu umgesetzten Branch '%s'\n" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Gewechselt zu einem neuem Branch '%s'\n" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "Gewechselt zu Branch '%s'\n" -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr " ... und %d weitere.\n" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3329,7 +3539,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3344,136 +3554,140 @@ msgstr "" " git branch neuer_branch_name %s\n" "\n" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "interner Fehler im Revisionsgang" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" msgstr "Vorherige Position von HEAD war" -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 msgid "You are on a branch yet to be born" msgstr "Sie sind auf einem Branch, der noch geboren wird" -#. case (1) -#: builtin/checkout.c:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "nur eine Referenz erwartet, %d gegeben." + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" msgstr "Ungültige Referenz: %s" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" msgstr "Referenz ist kein \"Tree\"-Objekt: %s" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 msgid "paths cannot be used with switching branches" msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden" -#: builtin/checkout.c:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden" -#: builtin/checkout.c:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "'%s' kann nicht mit '%s' verwendet werden" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln" -#: builtin/checkout.c:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "Branch" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "erzeugt und checkt einen neuen Branch aus" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" msgstr "erzeugt/setzt um und checkt einen Branch aus" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "erzeugt das Reflog für den neuen Branch" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 msgid "detach the HEAD at named commit" msgstr "setzt HEAD zu benanntem Commit" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" msgstr "setzt Informationen zum Upstream-Branch für den neuen Branch" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "neuer Branch" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" msgstr "neuer Branch ohne Eltern-Commit" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 msgid "checkout our version for unmerged files" msgstr "checkt unsere Variante für nicht zusammengeführte Dateien aus" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1102 msgid "checkout their version for unmerged files" msgstr "checkt ihre Variante für nicht zusammengeführte Dateien aus" -#: builtin/checkout.c:1068 +#: builtin/checkout.c:1104 msgid "force checkout (throw away local modifications)" msgstr "erzwingt Auschecken (verwirft lokale Änderungen)" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1105 msgid "perform a 3-way merge with the new branch" msgstr "führt einen 3-Wege-Merge mit dem neuen Branch aus" -#: builtin/checkout.c:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "aktualisiert ignorierte Dateien (Standard)" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "Stil" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" msgstr "Konfliktstil (merge oder diff3)" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" msgstr "Pfadspezifikationen ignorieren Einstellungen zum partiellen Auschecken" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 msgid "second guess 'git checkout no-such-branch'" msgstr "second guess 'git checkout no-such-branch'" -#: builtin/checkout.c:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus." -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "Bei der Option --track muss ein Branchname angegeben werden." -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "Vermisse Branchnamen; versuchen Sie -b" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "ungültige Pfadspezifikation" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3483,12 +3697,12 @@ msgstr "" "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst " "werden kann?" -#: builtin/checkout.c:1172 +#: builtin/checkout.c:1209 #, c-format msgid "git checkout: --detach does not take a path argument '%s'" msgstr "git checkout: --detach nimmt kein Pfad-Argument '%s'" -#: builtin/checkout.c:1176 +#: builtin/checkout.c:1213 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -3496,38 +3710,38 @@ msgstr "" "git checkout: --ours/--theirs, --force und --merge sind inkompatibel wenn\n" "Sie aus der Staging-Area auschecken." -#: builtin/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <Muster>] [-x | -X] [--] <Pfade>..." -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "Lösche %s\n" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "Würde %s löschen\n" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "Überspringe Repository %s\n" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "Würde Repository %s überspringen\n" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "Fehler beim Löschen von %s" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3536,10 +3750,10 @@ msgid "" msgstr "" "Eingabehilfe:\n" "1 - nummeriertes Element auswählen\n" -"foo - Element anhand eines eindeutigen Prefix auswählen\n" +"foo - Element anhand eines eindeutigen Präfix auswählen\n" " - (leer) nichts auswählen" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3554,40 +3768,40 @@ msgstr "" "1 - einzelnes Element auswählen\n" "3-5 - Bereich von Elementen auswählen\n" "2-3,6-9 - mehrere Bereiche auswählen\n" -"foo - Element anhand eines eindeutigen Prefix auswählen\n" +"foo - Element anhand eines eindeutigen Präfix auswählen\n" "-... - angegebenes Element abwählen\n" "* - alle Elemente auswählen\n" " - (leer) Auswahl beenden" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "Wie bitte (%s)?" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " msgstr "Ignorier-Muster eingeben>> " -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "Wählen Sie Einträge zum Löschen" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " msgstr "'%s' löschen? " -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "Tschüss." -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3605,21 +3819,21 @@ msgstr "" "help - diese Meldung anzeigen\n" "? - Hilfe zur Auswahl mittels Eingabe anzeigen" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "*** Kommandos ***" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "Was nun" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "Würde das folgende Element entfernen:" msgstr[1] "Würde die folgenden Elemente entfernen:" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "Keine Dateien mehr zum Löschen, beende." @@ -3639,8 +3853,8 @@ msgstr "interaktives Clean" msgid "remove whole directories" msgstr "löscht ganze Verzeichnisse" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "Muster" @@ -3680,8 +3894,8 @@ msgstr "" msgid "git clone [options] [--] <repo> [<dir>]" msgstr "git clone [Optionen] [--] <Repository> [<Verzeichnis>]" -#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" msgstr "erzwingt Fortschrittsanzeige" @@ -3693,123 +3907,133 @@ msgstr "kein Auschecken" msgid "create a bare repository" msgstr "erstellt ein Bare-Repository" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" msgstr "erstellt ein Spiegelarchiv (impliziert --bare)" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "um von einem lokalen Repository zu klonen" -#: builtin/clone.c:76 +#: builtin/clone.c:75 msgid "don't use local hardlinks, always copy" msgstr "verwendet lokal keine harten Verweise, immer Kopien" -#: builtin/clone.c:78 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "Einrichtung als verteiltes Repository" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 msgid "initialize submodules in the clone" msgstr "initialisiert Submodule im Klon" -#: builtin/clone.c:83 builtin/init-db.c:485 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" msgstr "Vorlagenverzeichnis" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 builtin/init-db.c:486 msgid "directory from which templates will be used" msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden" -#: builtin/clone.c:86 +#: builtin/clone.c:85 msgid "reference repository" msgstr "referenziert Repository" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "Name" -#: builtin/clone.c:88 +#: builtin/clone.c:87 msgid "use <name> instead of 'origin' to track upstream" msgstr "verwendet <Name> statt 'origin' für Upstream-Repository" -#: builtin/clone.c:90 +#: builtin/clone.c:89 msgid "checkout <branch> instead of the remote's HEAD" msgstr "checkt <Branch> aus, anstatt HEAD des Remote-Repositories" -#: builtin/clone.c:92 +#: builtin/clone.c:91 msgid "path to git-upload-pack on the remote" msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" msgstr "Tiefe" -#: builtin/clone.c:94 +#: builtin/clone.c:93 msgid "create a shallow clone of that depth" -msgstr "erstellt einen flachen Klon mit dieser Tiefe" +msgstr "erstellt einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe" -#: builtin/clone.c:96 +#: builtin/clone.c:95 msgid "clone only one branch, HEAD or --branch" msgstr "klont nur einen Branch, HEAD oder --branch" -#: builtin/clone.c:97 builtin/init-db.c:494 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr ".git-Verzeichnis" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 builtin/init-db.c:495 msgid "separate git dir from working tree" msgstr "separiert Git-Verzeichnis vom Arbeitsverzeichnis" -#: builtin/clone.c:99 +#: builtin/clone.c:98 msgid "key=value" msgstr "Schlüssel=Wert" -#: builtin/clone.c:100 +#: builtin/clone.c:99 msgid "set config inside the new repository" msgstr "setzt Konfiguration innerhalb des neuen Repositories" -#: builtin/clone.c:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "Referenziertes Repository '%s' ist kein lokales Repository." -#: builtin/clone.c:316 +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)." + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") eingehängt." + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "Fehler beim Erstellen von Verzeichnis '%s'" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "Konnte '%s' nicht lesen" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "%s existiert und ist kein Verzeichnis" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" msgstr "Konnte %s nicht lesen\n" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "Konnte Verweis '%s' nicht erstellen" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" msgstr "Konnte Datei nicht nach '%s' kopieren" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "Fertig.\n" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -3819,108 +4043,113 @@ msgstr "" "Sie können mit 'git status' prüfen, was ausgecheckt worden ist\n" "und das Auschecken mit 'git checkout -f HEAD' erneut versuchen.\n" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "Konnte zu klonenden Remote-Branch %s nicht finden." -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " msgstr "Prüfe Konnektivität... " -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet." -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "Fertig\n" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" "Externer HEAD bezieht sich auf eine nicht existierende Referenz und kann " "nicht ausgecheckt werden.\n" -#: builtin/clone.c:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "Zu viele Argumente." -#: builtin/clone.c:764 +#: builtin/clone.c:769 msgid "You must specify a repository to clone." msgstr "Sie müssen ein Repository zum Klonen angeben." -#: builtin/clone.c:775 +#: builtin/clone.c:780 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "Die Optionen --bare und --origin %s sind inkompatibel." -#: builtin/clone.c:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel." -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "Repository '%s' existiert nicht." -#: builtin/clone.c:796 +#: builtin/clone.c:802 msgid "--depth is ignored in local clones; use file:// instead." msgstr "" "Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie " "stattdessen file://" -#: builtin/clone.c:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "Quelle ist ein Repository mit unvollständiger Historie (shallow)," +"ignoriere --local" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "--local wird ignoriert" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "Tiefe %s ist keine positive Zahl" + +#: builtin/clone.c:824 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "Zielpfad '%s' existiert bereits und ist kein leeres Verzeichnis." -#: builtin/clone.c:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "Arbeitsverzeichnis '%s' existiert bereits." -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, c-format msgid "could not create leading directories of '%s'" msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen." -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, c-format msgid "could not create work tree dir '%s'." msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen." -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Klone in Bare-Repository '%s'...\n" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "Klone nach '%s'...\n" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, c-format msgid "Don't know how to clone %s" msgstr "Weiß nicht wie %s zu klonen ist." -#: builtin/clone.c:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden" -#: builtin/clone.c:949 +#: builtin/clone.c:968 msgid "You appear to have cloned an empty repository." msgstr "Sie scheinen ein leeres Repository geklont zu haben." @@ -3956,15 +4185,15 @@ msgstr "Abstand zwischen Spalten" msgid "--command must be the first argument" msgstr "Die Option --command muss an erster Stelle stehen." -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." msgstr "git commit [Optionen] [--] <Pfadspezifikation>..." -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." msgstr "git status [Optionen] [--] <Pfadspezifikation>..." -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3990,7 +4219,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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" @@ -4000,7 +4229,7 @@ msgstr "" "machen. Sie können Ihr Kommando mit --allow-empty wiederholen, oder diesen\n" "Commit mit \"git reset HEAD^\" vollständig entfernen.\n" -#: builtin/commit.c:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -4015,11 +4244,11 @@ msgstr "" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "Andernfalls benutzen Sie bitte 'git reset'\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -4035,94 +4264,94 @@ msgstr "" "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n" "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n" -#: builtin/commit.c:279 +#: builtin/commit.c:287 msgid "failed to unpack HEAD tree object" msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD." -#: builtin/commit.c:321 +#: builtin/commit.c:329 msgid "unable to create temporary index" msgstr "Konnte temporäre Staging-Area nicht erstellen." -#: builtin/commit.c:327 +#: builtin/commit.c:335 msgid "interactive add failed" msgstr "interaktives Hinzufügen fehlgeschlagen" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 msgid "unable to write new_index file" msgstr "Konnte new_index Datei nicht schreiben" -#: builtin/commit.c:412 +#: builtin/commit.c:420 msgid "cannot do a partial commit during a merge." msgstr "Kann keinen Teil-Commit durchführen, während ein Merge im Gange ist." -#: builtin/commit.c:414 +#: builtin/commit.c:422 msgid "cannot do a partial commit during a cherry-pick." msgstr "" "Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist." -#: builtin/commit.c:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "Kann Staging-Area nicht lesen" -#: builtin/commit.c:444 +#: builtin/commit.c:452 msgid "unable to write temporary index file" msgstr "Konnte temporäre Staging-Area-Datei nicht schreiben." -#: builtin/commit.c:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" msgstr "Ungültiger Commit: %s" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" msgstr "Fehlerhafter --author Parameter" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "Fehlerhafter Ident-String: '%s'" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, c-format msgid "could not lookup commit %s" msgstr "Konnte Commit %s nicht nachschlagen" -#: builtin/commit.c:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, c-format msgid "(reading log message from standard input)\n" msgstr "(lese Log-Nachricht von Standard-Eingabe)\n" -#: builtin/commit.c:635 +#: builtin/commit.c:644 msgid "could not read log from standard input" msgstr "Konnte Log nicht von Standard-Eingabe lesen." -#: builtin/commit.c:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "Konnte Log-Datei '%s' nicht lesen" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" msgstr "Commit hat eine leere Beschreibung" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "Konnte MERGE_MSG nicht lesen" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "Konnte SQUASH_MSG nicht lesen" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "Konnte '%s' nicht lesen" -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" msgstr "Konnte Commit-Vorlage nicht schreiben" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -4137,7 +4366,7 @@ msgstr "" "\t%s\n" "und versuchen Sie es erneut.\n" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -4152,7 +4381,7 @@ msgstr "" "\t%s\n" "und versuchen Sie es erneut.\n" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4162,7 +4391,7 @@ msgstr "" "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n" "bricht den Commit ab.\n" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4175,152 +4404,152 @@ msgstr "" "entfernen.\n" "Eine leere Beschreibung bricht den Commit ab.\n" -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "%sAutor: %s" -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" msgstr "%sCommit-Ersteller: %s" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" msgstr "Kann Staging-Area nicht lesen" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "" "Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n" -#: builtin/commit.c:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "Kein existierender Autor mit '%s' gefunden." -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ungültiger Modus '%s' für unbeobachtete Dateien" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "Die Optionen --long und -z sind inkompatibel." -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 msgid "Using both --reset-author and --author does not make sense" msgstr "" "Die Optionen --reset-author und --author können nicht gemeinsam verwendet " "werden." -#: builtin/commit.c:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." msgstr "Sie haben nichts für \"--amend\"." -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 msgid "You are in the middle of a merge -- cannot amend." msgstr "Ein Merge ist im Gange -- kann \"--amend\" nicht ausführen." -#: builtin/commit.c:1055 +#: builtin/commit.c:1080 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "\"cherry-pick\" ist im Gange -- kann \"--amend\" nicht ausführen." -#: builtin/commit.c:1058 +#: builtin/commit.c:1083 msgid "Options --squash and --fixup cannot be used together" msgstr "" "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden." -#: builtin/commit.c:1068 +#: builtin/commit.c:1093 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Es kann nur eine Option von -c/-C/-F/--fixup verwendet werden." -#: builtin/commit.c:1070 +#: builtin/commit.c:1095 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Die Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden." -#: builtin/commit.c:1078 +#: builtin/commit.c:1103 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" "Die Option --reset--author kann nur mit -C, -c oder --amend verwendet werden." -#: builtin/commit.c:1095 +#: builtin/commit.c:1120 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Es kann nur eine Option von --include/--only/--all/--interactive/--patch " "verwendet werden." -#: builtin/commit.c:1097 +#: builtin/commit.c:1122 msgid "No paths with --include/--only does not make sense." msgstr "" "Die Optionen --include und --only können nur mit der Angabe von Pfaden " "verwendet werden." -#: builtin/commit.c:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." msgstr "" "Klug... den letzten Commit mit einer geänderten Staging-Area nachbessern." -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" "Explizite Pfade ohne -i oder -o angegeben; unter der Annahme von --only " "Pfaden..." -#: builtin/commit.c:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "Ungültiger \"cleanup\" Modus %s" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 msgid "Paths with -a does not make sense." msgstr "Die Option -a kann nur mit der Angabe von Pfaden verwendet werden." -#: builtin/commit.c:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "zeigt Status im Kurzformat" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "zeigt Branchinformationen" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "maschinenlesbare Ausgabe" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "zeigt Status im Langformat (Standard)" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "schließt Einträge mit NUL-Zeichen ab" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "Modus" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" "zeigt nicht beobachtete Dateien, optionale Modi: all, normal, no. (Standard: " "all)" -#: builtin/commit.c:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "zeigt ignorierte Dateien" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "wann" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -4328,219 +4557,219 @@ msgstr "" "ignoriert Änderungen in Submodulen, optional wenn: all, dirty, untracked. " "(Standard: all)" -#: builtin/commit.c:1242 +#: builtin/commit.c:1271 msgid "list untracked files in columns" msgstr "listet unbeobachtete Dateien in Spalten auf" -#: builtin/commit.c:1313 +#: builtin/commit.c:1340 msgid "couldn't look up newly created commit" msgstr "Konnte neu erstellten Commit nicht nachschlagen." -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "Konnte neulich erstellten Commit nicht analysieren." -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "losgelöster HEAD" -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr " (Basis-Commit)" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 msgid "suppress summary after successful commit" msgstr "unterdrückt Zusammenfassung nach erfolgreichem Commit" -#: builtin/commit.c:1426 +#: builtin/commit.c:1453 msgid "show diff in commit message template" msgstr "zeigt Unterschiede in Commit-Beschreibungsvorlage an" -#: builtin/commit.c:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "Optionen für Commit-Beschreibung" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "liest Beschreibung von Datei" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "Autor" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "überschreibt Autor eines Commits" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "Datum" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" msgstr "überschreibt Datum eines Commits" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" msgstr "Beschreibung" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" msgstr "Commit-Beschreibung" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 msgid "reuse and edit message from specified commit" msgstr "verwendet wieder und editiert Beschreibung des angegebenen Commits" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" msgstr "verwendet Beschreibung des angegebenen Commits wieder" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "verwendet eine automatisch zusammengesetzte Beschreibung zum Nachbessern des " "angegebenen Commits" -#: builtin/commit.c:1436 +#: builtin/commit.c:1463 msgid "use autosquash formatted message to squash specified commit" msgstr "" "verwendet eine automatisch zusammengesetzte Beschreibung beim \"squash\" des " "angegebenen Commits" -#: builtin/commit.c:1437 +#: builtin/commit.c:1464 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "Setzt Sie als Autor des Commits (verwendet mit -C/-c/--amend)" -#: builtin/commit.c:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "fügt 'Signed-off-by:'-Zeile hinzu" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "verwendet angegebene Vorlagendatei" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "erzwingt Bearbeitung des Commits" -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "Standard" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 msgid "how to strip spaces and #comments from message" msgstr "" "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen" -#: builtin/commit.c:1442 +#: builtin/commit.c:1469 msgid "include status in commit message template" msgstr "fügt Status in die Commit-Beschreibungsvorlage ein" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" msgstr "Schlüssel-ID" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" msgstr "signiert Commit mit GPG" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "Optionen für Commit-Inhalt" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "committet alle geänderten Dateien" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 msgid "add specified files to index for commit" msgstr "merkt die angegebenen Dateien zusätzlich zum Commit vor" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "interaktives Hinzufügen von Dateien" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "interaktives Hinzufügen von Änderungen" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "committet nur die angegebenen Dateien" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "umgeht \"pre-commit hook\"" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "zeigt an, was committet werden würde" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" msgstr "ändert vorherigen Commit" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "umgeht \"post-rewrite hook\"" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "erlaubt Aufzeichnung einer leeren Änderung" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 msgid "ok to record a change with an empty message" msgstr "erlaubt Aufzeichnung einer Änderung mit einer leeren Beschreibung" -#: builtin/commit.c:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "Konnte Commit von HEAD nicht analysieren." -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "Konnte '%s' nicht zum Lesen öffnen." -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Beschädigte MERGE_HEAD-Datei (%s)" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "Konnte MERGE_MODE nicht lesen" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, c-format msgid "could not read commit message: %s" msgstr "Konnte Commit-Beschreibung nicht lesen: %s" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Commit abgebrochen; Sie haben die Beschreibung nicht editiert.\n" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" msgstr "Fehler beim Schreiben des Commit-Objektes." -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "Kann Referenz von HEAD nicht sperren." -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "Kann Referenz von HEAD nicht aktualisieren." -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4551,127 +4780,131 @@ msgstr "" "voll und Ihr Kontingent nicht aufgebraucht ist und führen Sie\n" "anschließend \"git reset HEAD\" zu Wiederherstellung aus." -#: builtin/config.c:7 +#: builtin/config.c:8 msgid "git config [options]" msgstr "git config [Optionen]" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "Ort der Konfigurationsdatei" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" msgstr "verwendet globale Konfigurationsdatei" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "verwendet systemweite Konfigurationsdatei" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "verwendet Konfigurationsdatei des Repositories" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "verwendet die angegebene Konfigurationsdatei" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "Blob-Id" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "liest Konfiguration von angegebenem Blob-Objekt" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "Aktion" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "gibt Wert zurück: Name [Wert-regex]" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "gibt alle Werte zurück: Schlüssel [Wert-regex]" -#: builtin/config.c:61 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "gibt Werte für den regulären Ausdruck zurück: Name-regex [Wert-regex]" -#: builtin/config.c:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "gibt Wert spezifisch für eine URL zurück: section[.var] URL" + +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "ersetzt alle passenden Variablen: Name Wert [Wert-regex] " -#: builtin/config.c:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "fügt neue Variable hinzu: Name Wert" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "entfernt eine Variable: Name [Wert-regex]" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "entfernt alle Übereinstimmungen: Name [Wert-regex]" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "benennt eine Sektion um: alter-Name neuer-Name" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "entfernt eine Sektion: Name" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "listet alles auf" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "öffnet einen Editor" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "Slot" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "findet die konfigurierte Farbe: [Standard]" -#: builtin/config.c:71 +#: builtin/config.c:74 msgid "find the color setting: [stdout-is-tty]" msgstr "findet die Farbeinstellung: [Standard-Ausgabe-ist-Terminal]" -#: builtin/config.c:72 +#: builtin/config.c:75 msgid "Type" msgstr "Typ" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "Wert ist \"true\" oder \"false\"" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "Wert ist eine Dezimalzahl" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "Wert ist --bool oder --int" -#: builtin/config.c:76 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)" -#: builtin/config.c:77 +#: builtin/config.c:80 msgid "Other" msgstr "Sonstiges" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "schließt Werte mit NUL-Byte ab" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "beachtet \"include\"-Direktiven beim Nachschlagen" @@ -4799,7 +5032,7 @@ msgstr "betrachtet die jüngsten <n> Tags (Standard: 10)" msgid "only consider tags matching <pattern>" msgstr "betrachtet nur Tags die <Muster> entsprechen" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "zeigt gekürztes Commit-Objekt, wenn sonst nichts zutrifft" @@ -4825,31 +5058,31 @@ msgstr "Keine Namen gefunden, kann nichts beschreiben." msgid "--dirty is incompatible with commit-ishes" msgstr "Die Option --dirty kann nicht mit Commits verwendet werden." -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, c-format msgid "'%s': not a regular file or symlink" msgstr "'%s': keine reguläre Datei oder symbolischer Verweis" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" msgstr "Ungültige Option: %s" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "Kein Git-Repository" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "Objekt '%s' ist ungültig." -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "Mehr als zwei Blobs angegeben: '%s'" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "unbehandeltes Objekt '%s' angegeben" @@ -4858,39 +5091,39 @@ msgstr "unbehandeltes Objekt '%s' angegeben" msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [rev-list-opts]" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "zeigt Fortschritt nach <n> Objekten an" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "wählt Behandlung von signierten Tags" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 msgid "select handling of tags that tag filtered objects" msgstr "wählt Behandlung von Tags, die gefilterte Objekte markieren" -#: builtin/fast-export.c:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "Schreibt Kennzeichen in diese Datei" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "Importiert Kennzeichen von dieser Datei" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 msgid "Fake a tagger when tags lack one" msgstr "erzeugt künstlich einen Tag-Ersteller, wenn das Tag keinen hat" -#: builtin/fast-export.c:680 +#: builtin/fast-export.c:687 msgid "Output full tree for each commit" msgstr "gibt für jeden Commit das gesamte Verzeichnis aus" -#: builtin/fast-export.c:682 +#: builtin/fast-export.c:689 msgid "Use the done feature to terminate the stream" msgstr "Benutzt die \"done\"-Funktion um den Strom abzuschließen" -#: builtin/fast-export.c:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "Überspringt Ausgabe von Blob-Daten" @@ -4910,147 +5143,157 @@ msgstr "git fetch --multiple [<Optionen>] [(<Repository> | <Gruppe>)...]" msgid "git fetch --all [<options>]" msgstr "git fetch --all [<Optionen>]" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "fordert von allen Remote-Repositories an" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "hängt an .git/FETCH_HEAD an, anstatt zu überschreiben" -#: builtin/fetch.c:64 +#: builtin/fetch.c:79 msgid "path to upload pack on remote end" msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite" -#: builtin/fetch.c:65 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "erzwingt das Überschreiben von lokalen Branches" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "fordert von mehreren Remote-Repositories an" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "fordert alle Tags und verbundene Objekte an" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "fordert nicht alle Tags an (--no-tags)" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 msgid "prune remote-tracking branches no longer on remote" msgstr "" "entfernt Remote-Tracking-Branches, die sich nicht mehr im Remote-Repository " "befinden" -#: builtin/fetch.c:74 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "bei-Bedarf" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "kontrolliert rekursive Anforderungen von Submodulen" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "behält heruntergeladenes Paket" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "erlaubt Aktualisierung der \"HEAD\"-Referenz" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" -msgstr "vertieft die Historie eines flachen Klons" +msgstr "vertieft die Historie eines Klons mit unvollständiger Historie (shallow)" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "konvertiert zu einem vollständigen Repository" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "Verzeichnis" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 msgid "prepend this to submodule path output" msgstr "stellt dies an die Ausgabe der Submodul-Pfade voran" -#: builtin/fetch.c:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "Standard-Modus für Rekursion" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "akzeptiert Referenzen die .git/shallow aktualisieren" + +#: builtin/fetch.c:347 msgid "Couldn't find remote ref HEAD" msgstr "Konnte Remote-Referenz von HEAD nicht finden." -#: builtin/fetch.c:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "Objekt %s nicht gefunden" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "[aktuell]" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "" "! %-*s %-*s -> %s (kann \"fetch\" im aktuellen Branch nicht ausführen)" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "[zurückgewiesen]" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "[Tag Aktualisierung]" -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr " (kann lokale Referenz nicht aktualisieren)" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "[neues Tag]" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "[neuer Branch]" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "[neue Referenz]" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "kann lokale Referenz nicht aktualisieren" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "Aktualisierung erzwungen" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "(kein Vorspulen)" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "kann %s nicht öffnen: %s\n" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositories" +"mit unvollständiger Historie (shallow) nicht aktualisiert werden dürfen." + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "Von %.*s\n" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -5059,57 +5302,57 @@ msgstr "" "Einige lokale Referenzen konnten nicht aktualisiert werden; versuchen Sie\n" "'git remote prune %s' um jeden älteren, widersprüchlichen Branch zu löschen." -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr " (%s wird unreferenziert)" -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr " (%s wurde unreferenziert)" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "[gelöscht]" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "(nichts)" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" "Der \"fetch\" in den aktuellen Branch %s von einem nicht-Bare-Repository " "wurde verweigert." -#: builtin/fetch.c:742 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "Weiß nicht wie von %s angefordert wird." - -#: builtin/fetch.c:823 +#: builtin/fetch.c:794 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Option \"%s\" Wert \"%s\" ist nicht gültig für %s" -#: builtin/fetch.c:826 +#: builtin/fetch.c:797 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Option \"%s\" wird ignoriert für %s\n" -#: builtin/fetch.c:928 +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "Weiß nicht wie von %s angefordert wird." + +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "Fordere an von %s\n" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "Konnte nicht von %s anfordern" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -5118,35 +5361,35 @@ msgstr "" "oder den Namen des Remote-Repositories an, von welchem neue\n" "Commits angefordert werden sollen." -#: builtin/fetch.c:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "Sie müssen den Namen des Tags angeben." -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "" "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden." -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "" -"Die Option --unshallow kann nicht in einem vollständigen Repository " +"Die Option --unshallow kann nicht in einem Repository mit unvollständiger Historie " "verwendet werden." -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "fetch --all akzeptiert kein Repository als Argument" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kann nicht mit Refspecs verwendet werden." -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, c-format msgid "No such remote or remote group: %s" msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s" -#: builtin/fetch.c:1057 +#: builtin/fetch.c:1153 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" "Das Abholen einer Gruppe von Remote-Repositories kann nicht mit der Angabe\n" @@ -5157,9 +5400,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" msgstr "" "git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>]|--no-log] [--file <Datei>]" -#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "Anzahl" @@ -5183,117 +5427,123 @@ msgstr "verwendet <Text> als Beschreibungsanfang" msgid "file to read from" msgstr "Datei zum Einlesen" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 msgid "git for-each-ref [options] [<pattern>]" msgstr "git for-each-ref [Optionen] [<Muster>]" -#: builtin/for-each-ref.c:994 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "formatiert Platzhalter als Shell-String" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "formatiert Platzhalter als Perl-String" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "formatiert Platzhalter als Python-String" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "formatiert Platzhalter als TCL-String" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "zeigt nur <n> passende Referenzen" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "Format" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "für die Ausgabe zu verwendendes Format" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "Schüssel" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "sortiere nach diesem Feld" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "git fsck [Optionen] [<Objekt>...]" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "zeigt unerreichbare Objekte" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "zeigt unreferenzierte Objekte" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "meldet Tags" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "meldet Hauptwurzeln" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "prüft Objekte in der Staging-Area" -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "prüft die Reflogs (Standard)" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 msgid "also consider packs and alternate objects" msgstr "" -#: builtin/fsck.c:621 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "aktiviert genauere Prüfung" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 msgid "write dangling objects in .git/lost-found" msgstr "schreibt unreferenzierte Objekte nach .git/lost-found" -#: builtin/fsck.c:624 builtin/prune.c:134 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "zeigt Fortschrittsanzeige" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "git gc [Optionen]" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "Ungültiger %s: '%s'" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, c-format msgid "insanely long object directory %.*s" msgstr "zu langes Objekt-Verzeichnis %.*s" -#: builtin/gc.c:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "entfernt unreferenzierte Objekte" -#: builtin/gc.c:181 +#: builtin/gc.c:264 msgid "be more thorough (increased runtime)" msgstr "mehr Gründlichkeit (erhöht Laufzeit)" -#: builtin/gc.c:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "aktiviert \"auto-gc\" Modus" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "" +"erzwingt Ausführung von \"git gc\" selbst wenn ein anderes\n" +"\"git gc\" bereits ausgeführt wird" + +#: builtin/gc.c:306 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -5303,43 +5553,52 @@ msgstr "" "komprimiert. Sie können auch \"git gc\" manuell ausführen.\n" "Siehe \"git help gc\" für weitere Informationen.\n" -#: builtin/gc.c:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n" +"(benutzen Sie --force falls nicht)" + +#: builtin/gc.c:341 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" "Es gibt zu viele unerreichbare lose Objekte; führen Sie 'git prune' aus, um " "diese zu löschen." -#: builtin/grep.c:22 +#: builtin/grep.c:23 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [Optionen] [-e] <Muster> [<Commit>...] [[--] <Pfad>...]" -#: builtin/grep.c:217 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: Fehler beim Erzeugen eines Thread: %s" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "Fehler beim Verzeichniswechsel: %s" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, 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:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "Schalter '%c' erwartet einen numerischen Wert" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "kann '%s' nicht öffnen" @@ -5381,169 +5640,173 @@ msgid "don't match patterns in binary files" msgstr "findet keine Muster in Binärdateien" #: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "verarbeitet binäre Dateien mit \"textconv\"-Filtern" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "durchläuft höchstens <Tiefe> Ebenen" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "verwendet erweiterte reguläre Ausdrücke aus POSIX" -#: builtin/grep.c:669 +#: builtin/grep.c:671 msgid "use basic POSIX regular expressions (default)" msgstr "verwendet grundlegende reguläre Ausdrücke aus POSIX (Standard)" -#: builtin/grep.c:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "interpretiert Muster als feste Zeichenketten" -#: builtin/grep.c:675 +#: builtin/grep.c:677 msgid "use Perl-compatible regular expressions" msgstr "verwendet Perl-kompatible reguläre Ausdrücke" -#: builtin/grep.c:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "zeigt Zeilennummern" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "zeigt keine Dateinamen" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "zeigt Dateinamen" -#: builtin/grep.c:682 +#: builtin/grep.c:684 msgid "show filenames relative to top directory" msgstr "zeigt Dateinamen relativ zum Projektverzeichnis" -#: builtin/grep.c:684 +#: builtin/grep.c:686 msgid "show only filenames instead of matching lines" msgstr "zeigt nur Dateinamen anstatt übereinstimmende Zeilen" -#: builtin/grep.c:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "Synonym für --files-with-matches" -#: builtin/grep.c:689 +#: builtin/grep.c:691 msgid "show only the names of files without match" msgstr "zeigt nur die Dateinamen ohne Übereinstimmungen" -#: builtin/grep.c:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "gibt NUL-Zeichen nach Dateinamen aus" -#: builtin/grep.c:693 +#: builtin/grep.c:695 msgid "show the number of matches instead of matching lines" msgstr "zeigt, anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen" -#: builtin/grep.c:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "hebt Übereinstimmungen hervor" -#: builtin/grep.c:696 +#: builtin/grep.c:698 msgid "print empty line between matches from different files" msgstr "" "gibt eine Leerzeile zwischen Übereinstimmungen in verschiedenen Dateien aus" -#: builtin/grep.c:698 +#: builtin/grep.c:700 msgid "show filename only once above matches from same file" msgstr "" "zeigt den Dateinamen nur einmal oberhalb der Übereinstimmungen aus dieser " "Datei an" -#: builtin/grep.c:701 +#: builtin/grep.c:703 msgid "show <n> context lines before and after matches" msgstr "zeigt <n> Zeilen vor und nach den Übereinstimmungen an" -#: builtin/grep.c:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "zeigt <n> Zeilen vor den Übereinstimmungen an" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "zeigt <n> Zeilen nach den Übereinstimmungen an" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" msgstr "Kurzform für -C NUM" -#: builtin/grep.c:710 +#: builtin/grep.c:712 msgid "show a line with the function name before matches" msgstr "zeigt eine Zeile mit dem Funktionsnamen vor Übereinstimmungen an" -#: builtin/grep.c:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "zeigt die umgebende Funktion an" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "liest Muster von einer Datei" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "findet <Muster>" -#: builtin/grep.c:719 +#: builtin/grep.c:721 msgid "combine patterns specified with -e" msgstr "kombiniert Muster, die mit -e angegeben wurden" -#: builtin/grep.c:731 +#: builtin/grep.c:733 msgid "indicate hit with exit status without output" msgstr "zeigt Übereinstimmungen nur durch Beendigungsstatus an" -#: builtin/grep.c:733 +#: builtin/grep.c:735 msgid "show only matches from files that match all patterns" msgstr "zeigt nur Übereinstimmungen von Dateien, die allen Mustern entsprechen" -#: builtin/grep.c:735 +#: builtin/grep.c:737 msgid "show parse tree for grep expression" msgstr "zeigt geparstes Verzeichnis für \"grep\"-Ausdruck" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "pager" msgstr "Anzeigeprogramm" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "show matching files in the pager" msgstr "zeigt Dateien mit Übereinstimmungen im Anzeigeprogramm" -#: builtin/grep.c:742 +#: builtin/grep.c:744 msgid "allow calling of grep(1) (ignored by this build)" msgstr "erlaubt den Aufruf von grep(1) (von dieser Programmversion ignoriert)" -#: builtin/grep.c:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "zeigt Verwendung" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "keine Muster angegeben" -#: builtin/grep.c:865 +#: builtin/grep.c:870 msgid "--open-files-in-pager only works on the worktree" msgstr "" "Die Option --open-files-in-pager kann nur innerhalb des " "Arbeitsverzeichnisses verwendet werden." -#: builtin/grep.c:888 +#: builtin/grep.c:893 msgid "--cached or --untracked cannot be used with --no-index." msgstr "" "Die Optionen --cached und --untracked können nicht mit --no-index verwendet " "werden." -#: builtin/grep.c:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "Die Optionen --no-index und --untracked können nicht mit Commits verwendet " "werden." -#: builtin/grep.c:896 +#: builtin/grep.c:901 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" "Die Option --[no-]exclude-standard kann nicht mit beobachteten Inhalten " "verwendet werden." -#: builtin/grep.c:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden." @@ -5648,57 +5911,57 @@ msgstr "" "'%s': Kommando für unterstützten Handbuchbetrachter.\n" "Sie könnten stattdessen 'man.<Werkzeug>.path' benutzen." -#: builtin/help.c:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "'%s': unbekannter Handbuch-Betrachter." -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen" -#: builtin/help.c:374 +#: builtin/help.c:378 msgid "no info viewer handled the request" msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen" -#: builtin/help.c:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "Definition von Attributen pro Pfad" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "Ein Git-Glossar" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "Spezifikation von bewusst ignorierten, unbeobachteten Dateien" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "Definition von Submodul-Eigenschaften" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "Spezifikation von Commits und Bereichen für Git" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "Eine einführende Anleitung zu Git (für Version 1.5.1 oder neuer)" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "Eine Übersicht über empfohlene Arbeitsabläufe mit Git" -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" msgstr "Verwendung: %s%s" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "für `git %s' wurde der Alias `%s' angelegt" @@ -5799,8 +6062,8 @@ msgstr "ernsthafte Inkonsistenz nach Dekomprimierung" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "kann %s nicht lesen" @@ -5829,155 +6092,155 @@ msgstr "Fehler in Objekt" msgid "Not all child objects of %s are reachable" msgstr "Nicht alle Kind-Objekte von %s sind erreichbar" -#: builtin/index-pack.c:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "Konnte Dateiunterschied nicht anwenden" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "Empfange Objekte" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "Indiziere Objekte" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "Paket ist beschädigt (SHA1 unterschiedlich)" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" msgstr "kann Paketdatei nicht lesen" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "Paketende enthält nicht verwendbaren Inhalt" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "Fehler beim Ausführen von \"parse_pack_objects()\"" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "Löse Unterschiede auf" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "kann Thread nicht erzeugen: %s" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "Fehler beim Auflösen der Unterschiede" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "vervollständigt mit %d lokalen Objekten" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)" -#: builtin/index-pack.c:1151 +#: builtin/index-pack.c:1152 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "Paket hat %d unaufgelöste Unterschied" msgstr[1] "Paket hat %d unaufgelöste Unterschiede" -#: builtin/index-pack.c:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "lokales Objekt %s ist beschädigt" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" msgstr "Fehler beim Schließen der Paketdatei" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "Kann Paketdatei nicht speichern" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "Kann Indexdatei nicht speichern" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, c-format msgid "invalid number of threads specified (%d)" msgstr "ungültige Anzahl von Threads angegeben (%d)" -#: builtin/index-pack.c:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "keine Unterstützung von Threads, '%s' wird ignoriert" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Kann existierende Paketdatei '%s' nicht öffnen" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "Kann existierende Indexdatei für Paket '%s' nicht öffnen" -#: builtin/index-pack.c:1474 +#: builtin/index-pack.c:1475 #, c-format msgid "non delta: %d object" msgid_plural "non delta: %d objects" msgstr[0] "kein Unterschied: %d Objekt" msgstr[1] "kein Unterschied: %d Objekte" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 #, c-format msgid "chain length = %d: %lu object" msgid_plural "chain length = %d: %lu objects" msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt" msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte" -#: builtin/index-pack.c:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "%s ist ungültig" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 msgid "--fix-thin cannot be used without --stdin" msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden." -#: builtin/index-pack.c:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben." @@ -6066,11 +6329,6 @@ msgstr "kann nicht mit Dateityp %d umgehen" msgid "unable to move %s to %s" msgstr "Konnte %s nicht nach %s verschieben" -#: builtin/init-db.c:363 -#, c-format -msgid "Could not create git link %s" -msgstr "Konnte git-Verweis %s nicht erstellen" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -6113,21 +6371,21 @@ msgstr "Berechtigungen" msgid "specify that the git repository is to be shared amongst several users" msgstr "gibt an, dass das Git-Repository mit mehreren Benutzern geteilt wird" -#: builtin/init-db.c:493 builtin/prune-packed.c:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "weniger Ausgaben" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "kann Verzeichnis %s nicht erstellen" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "kann nicht in Verzeichnis %s wechseln" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -6136,11 +6394,11 @@ msgstr "" "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s " "(oder --git-dir=<Verzeichnis>)" -#: builtin/init-db.c:579 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "Kann nicht auf aktuelles Arbeitsverzeichnis zugreifen." -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen." @@ -6153,249 +6411,249 @@ msgstr "git log [<Optionen>] [Commitbereich>] [[--] <Pfad>...]\n" msgid " or: git show [options] <object>..." msgstr " oder: git show [Optionen] <Objekt>..." -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "unterdrückt Ausgabe der Unterschiede" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "zeigt Quelle" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "verwendet \"mailmap\"-Datei" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "decorate-Optionen" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "letzte Ausgabe: %d %s\n" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "Kann Objekt %s nicht lesen." -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "Unbekannter Typ: %d" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "format.headers ohne Wert" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "Name des Ausgabeverzeichnisses ist zu lang." -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "Kann Patch-Datei %s nicht öffnen" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "Brauche genau einen Commit-Bereich." -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "Kein Commit-Bereich." -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" msgstr "Anschreiben benötigt E-Mail-Format" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "ungültiges in-reply-to: %s" -#: builtin/log.c:995 +#: builtin/log.c:1015 msgid "git format-patch [options] [<since> | <revision range>]" msgstr "git format-patch [Optionen] [<seit> | <Commitbereich>]" -#: builtin/log.c:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "Zwei Ausgabeverzeichnisse?" -#: builtin/log.c:1155 +#: builtin/log.c:1175 msgid "use [PATCH n/m] even with a single patch" msgstr "verwendet [PATCH n/m] auch mit einzelnem Patch" -#: builtin/log.c:1158 +#: builtin/log.c:1178 msgid "use [PATCH] even with multiple patches" msgstr "verwendet [PATCH] auch mit mehreren Patches" -#: builtin/log.c:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "Ausgabe der Patches in Standard-Ausgabe" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "erzeugt ein Deckblatt" -#: builtin/log.c:1166 +#: builtin/log.c:1186 msgid "use simple number sequence for output file names" msgstr "verwendet einfache Nummernfolge für die Namen der Ausgabedateien" -#: builtin/log.c:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "Dateiendung" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "verwendet <Dateiendung> anstatt '.patch'" -#: builtin/log.c:1170 +#: builtin/log.c:1190 msgid "start numbering patches at <n> instead of 1" msgstr "beginnt die Nummerierung der Patches bei <n> anstatt bei 1" -#: builtin/log.c:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "kennzeichnet die Serie als n-te Fassung" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" -msgstr "verwendet [<Prefix>] anstatt [PATCH]" +msgstr "verwendet [<Präfix>] anstatt [PATCH]" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "speichert erzeugte Dateien in <Verzeichnis>" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "[PATCH] wird nicht entfernt/hinzugefügt" -#: builtin/log.c:1183 +#: builtin/log.c:1203 msgid "don't output binary diffs" msgstr "gibt keine binären Unterschiede aus" -#: builtin/log.c:1185 +#: builtin/log.c:1205 msgid "don't include a patch matching a commit upstream" msgstr "" "schließt keine Patches ein, die einem Commit im Upstream-Branch entsprechen" -#: builtin/log.c:1187 +#: builtin/log.c:1207 msgid "show patch format instead of default (patch + stat)" msgstr "zeigt Patchformat anstatt des Standards (Patch + Zusammenfassung)" -#: builtin/log.c:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "Email-Einstellungen" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "Header" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "fügt Email-Header hinzu" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "Email" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "fügt \"To:\"-Header hinzu" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "fügt \"Cc:\"-Header hinzu" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "Ident" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" msgstr "" "setzt \"From\"-Adresse auf <Ident> (oder Ident des Commit-Erstellers,wenn " "fehlend)" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "message-id" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "macht aus erster Email eine Antwort zu <message-id>" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "Grenze" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "hängt einen Patch an" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "fügt den Patch direkt in die Nachricht ein" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "aktiviert Nachrichtenverkettung, Stile: shallow, deep" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "Signatur" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "fügt eine Signatur hinzu" -#: builtin/log.c:1214 +#: builtin/log.c:1233 msgid "don't print the patch filenames" msgstr "zeigt keine Dateinamen der Patches" -#: builtin/log.c:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "Ungültige Identifikationszeile: %s" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "Die Optionen -n und -k schließen sich gegenseitig aus." -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus." -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "Die Option --name-only kann nicht verwendet werden." -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "Die Option --name-status kann nicht verwendet werden." -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "Die Option --check kann nicht verwendet werden." -#: builtin/log.c:1340 +#: builtin/log.c:1359 msgid "standard output, or directory, which one?" msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?" -#: builtin/log.c:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/log.c:1490 +#: builtin/log.c:1509 msgid "Failed to create output files" msgstr "Fehler beim Erstellen der Ausgabedateien." -#: builtin/log.c:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" @@ -6403,143 +6661,143 @@ msgstr "" "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> " "manuell an.\n" -#: builtin/log.c:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" msgstr "Unbekannter Commit %s" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "git ls-files [Optionen] [<Datei>...]" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 msgid "identify the file status with tags" msgstr "zeigt den Dateistatus mit Tags" -#: builtin/ls-files.c:467 +#: builtin/ls-files.c:457 msgid "use lowercase letters for 'assume unchanged' files" msgstr "" "verwendet Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung" -#: builtin/ls-files.c:469 +#: builtin/ls-files.c:459 msgid "show cached files in the output (default)" msgstr "zeigt zwischengespeicherten Dateien in der Ausgabe an (Standard)" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:461 msgid "show deleted files in the output" msgstr "zeigt entfernte Dateien in der Ausgabe an" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:463 msgid "show modified files in the output" msgstr "zeigt geänderte Dateien in der Ausgabe an" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:465 msgid "show other files in the output" msgstr "zeigt sonstige Dateien in der Ausgabe an" -#: builtin/ls-files.c:477 +#: builtin/ls-files.c:467 msgid "show ignored files in the output" msgstr "zeigt ignorierte Dateien in der Ausgabe an" -#: builtin/ls-files.c:480 +#: builtin/ls-files.c:470 msgid "show staged contents' object name in the output" msgstr "" "zeigt Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der " "Ausgabe an" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 msgid "show files on the filesystem that need to be removed" msgstr "zeigt Dateien im Dateisystem, die gelöscht werden müssen, an" -#: builtin/ls-files.c:484 +#: builtin/ls-files.c:474 msgid "show 'other' directories' name only" msgstr "zeigt nur Namen von 'sonstigen' Verzeichnissen an" -#: builtin/ls-files.c:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "zeigt keine leeren Verzeichnisse an" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 msgid "show unmerged files in the output" msgstr "zeigt nicht zusammengeführte Dateien in der Ausgabe an" -#: builtin/ls-files.c:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "zeigt 'resolve-undo' Informationen an" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 msgid "skip files matching pattern" msgstr "lässt Dateien aus, die einem Muster entsprechen" -#: builtin/ls-files.c:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "schließt Muster, gelesen von <Datei>, aus" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 msgid "read additional per-directory exclude patterns in <file>" msgstr "liest zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei>" -#: builtin/ls-files.c:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "fügt die standardmäßigen Git-Ausschlüsse hinzu" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 msgid "make the output relative to the project top directory" msgstr "Ausgabe relativ zum Projektverzeichnis" -#: builtin/ls-files.c:508 +#: builtin/ls-files.c:498 msgid "if any <file> is not in the index, treat this as an error" msgstr "" "behandle es als Fehler, wenn sich eine <Datei> nicht in der Staging-Area " "befindet" -#: builtin/ls-files.c:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "Commit-Referenz" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 msgid "pretend that paths removed since <tree-ish> are still present" msgstr "" "gibt vor, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch " "vorhanden sind" -#: builtin/ls-files.c:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "zeigt Ausgaben zur Fehlersuche an" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 msgid "git ls-tree [<options>] <tree-ish> [<path>...]" msgstr "git ls-tree [<Optionen>] <Commit-Referenz> [<Pfad>...]" -#: builtin/ls-tree.c:125 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "zeigt nur Verzeichnisse an" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "führt Rekursion in Unterverzeichnissen durch" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "zeigt Verzeichnisse bei Rekursion an" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "schließt Einträge mit NUL-Byte ab" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 msgid "include object size" msgstr "schließt Objektgröße ein" -#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "listet nur Dateinamen auf" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "verwendet vollständige Pfadnamen" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "" "listet das gesamte Verzeichnis auf; nicht nur das aktuelle Verzeichnis " @@ -6576,153 +6834,153 @@ msgstr "Verfügbare Strategien sind:" msgid "Available custom strategies are:" msgstr "Verfügbare benutzerdefinierte Strategien sind:" -#: builtin/merge.c:198 +#: builtin/merge.c:191 msgid "do not show a diffstat at the end of the merge" msgstr "zeigt keine Zusammenfassung der Unterschiede am Schluss des Merges an" -#: builtin/merge.c:201 +#: builtin/merge.c:194 msgid "show a diffstat at the end of the merge" msgstr "zeigt eine Zusammenfassung der Unterschiede am Schluss des Merges an" -#: builtin/merge.c:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "(Synonym für --stat)" -#: builtin/merge.c:204 +#: builtin/merge.c:197 msgid "add (at most <n>) entries from shortlog to merge commit message" msgstr "" "fügt (höchstens <n>) Einträge von \"shortlog\" zur Beschreibung des Merge-" "Commits hinzu" -#: builtin/merge.c:207 +#: builtin/merge.c:200 msgid "create a single commit instead of doing a merge" msgstr "erzeugt einen einzelnen Commit anstatt eines Merges" -#: builtin/merge.c:209 +#: builtin/merge.c:202 msgid "perform a commit if the merge succeeds (default)" msgstr "führt einen Commit durch, wenn der Merge erfolgreich war (Standard)" -#: builtin/merge.c:211 +#: builtin/merge.c:204 msgid "edit message before committing" msgstr "Bearbeitung der Beschreibung vor dem Commit" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "erlaubt Vorspulen (Standard)" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "bricht ab, wenn kein Vorspulen möglich ist" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "überprüft den genannten Commit auf eine gültige GPG-Signatur" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "Strategie" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "zu verwendende Merge-Strategie" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "Option=Wert" -#: builtin/merge.c:222 +#: builtin/merge.c:215 msgid "option for selected merge strategy" msgstr "Option für ausgewählte Merge-Strategie" -#: builtin/merge.c:224 +#: builtin/merge.c:217 msgid "merge commit message (for a non-fast-forward merge)" msgstr "" "führt Commit-Beschreibung zusammen (für einen Merge, der kein Vorspulen war)" -#: builtin/merge.c:228 +#: builtin/merge.c:221 msgid "abort the current in-progress merge" msgstr "bricht den sich im Gange befindlichen Merge ab" -#: builtin/merge.c:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "Konnte \"stash\" nicht ausführen." -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "\"stash\" fehlgeschlagen" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "kein gültiges Objekt: %s" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "read-tree fehlgeschlagen" -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr " (nichts zu quetschen)" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Quetsche Commit -- HEAD wird nicht aktualisiert\n" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "Schreibe SQUASH_MSG" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "Schließe SQUASH_MSG ab" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "Keine Merge-Commit-Beschreibung -- HEAD wird nicht aktualisiert\n" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' zeigt auf keinen Commit" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Ungültiger branch.%s.mergeoptions String: %s" -#: builtin/merge.c:657 +#: builtin/merge.c:650 msgid "git write-tree failed to write a tree" msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl" -#: builtin/merge.c:685 +#: builtin/merge.c:678 msgid "Not handling anything other than two heads merge." msgstr "Es wird nur der Merge von zwei Branches behandelt." -#: builtin/merge.c:699 +#: builtin/merge.c:692 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Unbekannte Option für merge-recursive: -X%s" -#: builtin/merge.c:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "konnte %s nicht schreiben" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "konnte nicht von '%s' lesen" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" "Merge wurde nicht committet; benutzen Sie 'git commit' um den Merge " "abzuschließen.\n" -#: builtin/merge.c:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6738,50 +6996,50 @@ msgstr "" "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n" "bricht den Commit ab.\n" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "Leere Commit-Beschreibung" -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "Wunderbar.\n" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" "Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen " "Sie dann das Ergebnis.\n" -#: builtin/merge.c:934 +#: builtin/merge.c:927 #, c-format msgid "'%s' is not a commit" msgstr "'%s' ist kein Commit" -#: builtin/merge.c:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "Sie befinden sich auf keinem Branch." -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "Kein Remote-Repository für den aktuellen Branch." -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." msgstr "" "Es ist kein Standard-Upstream-Branch für den aktuellen Branch definiert." -#: builtin/merge.c:984 +#: builtin/merge.c:977 #, c-format msgid "No remote-tracking branch for %s from %s" msgstr "Kein Remote-Tracking-Branch für %s von %s" -#: builtin/merge.c:1140 +#: builtin/merge.c:1133 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Es gibt keinen Merge zum Abbrechen (vermisse MERGE_HEAD)" -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6789,11 +7047,11 @@ msgstr "" "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n" "Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können." -#: builtin/merge.c:1159 git-pull.sh:34 +#: builtin/merge.c:1152 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)." -#: builtin/merge.c:1163 +#: builtin/merge.c:1156 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6801,143 +7059,151 @@ msgstr "" "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n" "Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können." -#: builtin/merge.c:1166 +#: builtin/merge.c:1159 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)." -#: builtin/merge.c:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "Sie können --squash nicht mit --no-ff kombinieren." -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt." -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 msgid "Can merge only exactly one commit into empty head" msgstr "Kann nur exakt einen Commit in einem leeren Branch zusammenführen." -#: builtin/merge.c:1219 +#: builtin/merge.c:1212 msgid "Squash commit into empty head not supported yet" msgstr "" "Bin auf einem Commit, der noch geboren wird; kann \"squash\" nicht ausführen." -#: builtin/merge.c:1221 +#: builtin/merge.c:1214 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "" "Nicht vorzuspulender Commit kann nicht in einem leeren Branch verwendet " "werden." -#: builtin/merge.c:1226 +#: builtin/merge.c:1219 #, c-format msgid "%s - not something we can merge" msgstr "%s - nichts was wir zusammenführen können" -#: builtin/merge.c:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "" "Commit %s hat eine nicht vertrauenswürdige GPG-Signatur, angeblich von %s." -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "Commit %s hat eine ungültige GPG-Signatur, angeblich von %s." #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "Commit %s hat keine GPG-Signatur." -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "Aktualisiere %s..%s\n" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Probiere wirklich trivialen \"in-index\"-Merge...\n" -#: builtin/merge.c:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "Nein.\n" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 msgid "Not possible to fast-forward, aborting." msgstr "Vorspulen nicht möglich, breche ab." -#: builtin/merge.c:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Rücklauf des Verzeichnisses bis zum Ursprung...\n" -#: builtin/merge.c:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Probiere Merge-Strategie %s...\n" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Keine Merge-Strategie behandelt diesen Merge.\n" -#: builtin/merge.c:1543 +#: builtin/merge.c:1536 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Merge mit Strategie %s fehlgeschlagen.\n" -#: builtin/merge.c:1552 +#: builtin/merge.c:1545 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Benutzen Sie \"%s\" um die Auflösung per Hand vorzubereiten.\n" -#: builtin/merge.c:1564 +#: builtin/merge.c:1557 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" "Automatischer Merge abgeschlossen; halte, wie gewünscht, vor dem Commit an\n" -#: builtin/merge-base.c:26 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." msgstr "git merge-base [-a|--all] <Commit> <Commit>..." -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." msgstr "git merge-base [-a|--all] --octopus <Commit>..." -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." msgstr "git merge-base --independent <Commit>..." -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <Commit> <Commit>" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <Referenz> [<Commit>]" + +#: builtin/merge-base.c:214 msgid "output all common ancestors" msgstr "Ausgabe aller gemeinsamen Vorgänger-Commits" -#: builtin/merge-base.c:99 +#: builtin/merge-base.c:216 msgid "find ancestors for a single n-way merge" msgstr "findet Vorgänger-Commits für einen einzelnen n-Wege-Merge" -#: builtin/merge-base.c:100 +#: builtin/merge-base.c:218 msgid "list revs not reachable from others" msgstr "listet Commits auf, die nicht durch Andere erreichbar sind" -#: builtin/merge-base.c:102 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "ist der Erste ein Vorgänger-Commit von dem Anderen?" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "findet wo <Commit> von Reflog von <Referenz> abgespalten wurde" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -6994,117 +7260,133 @@ msgstr "erlaubt fehlende Objekte" msgid "allow creation of more than one tree" msgstr "erlaubt die Erstellung von mehr als einem \"Tree\"-Objekt" -#: builtin/mv.c:14 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "git mv [Optionen] <Quelle>... <Ziel>" -#: builtin/mv.c:64 +#: builtin/mv.c:71 msgid "force move/rename even if target exists" msgstr "erzwingt Verschieben/Umbenennen, auch wenn das Ziel existiert" -#: builtin/mv.c:65 +#: builtin/mv.c:72 msgid "skip move/rename errors" msgstr "überspringt Fehler beim Verschieben oder Umbenennen" -#: builtin/mv.c:108 +#: builtin/mv.c:122 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "Prüfe Umbenennung von '%s' nach '%s'\n" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "ungültige Quelle" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "kann Verzeichnis nicht in sich selbst verschieben" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "kann Verzeichnis nicht über Datei verschieben" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "Huh? Verzeichnis %s ist zum Commit vorgemerkt und kein Submodul?" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" +"Bitte merken Sie Ihre Änderungen in .gitmodules zum Commit vor oder " +"benutzen\n" +"Sie \"stash\" um fortzufahren." + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "Huh? %.*s ist zum Commit vorgemerkt?" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "Quellverzeichnis ist leer" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "nicht unter Versionskontrolle" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "Ziel existiert bereits" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "überschreibe '%s'" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "Kann nicht überschreiben" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "mehrere Quellen für das selbe Ziel" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "Zielverzeichnis existiert nicht" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s, Quelle=%s, Ziel=%s" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "Benenne %s nach %s um\n" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" msgstr "Umbenennung von '%s' fehlgeschlagen" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "git name-rev [Optionen] <Commit>..." -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "git name-rev [Optionen] --all" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "git name-rev [Optionen] --stdin" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "zeigt nur Namen an (keine SHA-1)" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 msgid "only use tags to name the commits" msgstr "verwendet nur Tags um die Commits zu benennen" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:315 msgid "only use refs matching <pattern>" msgstr "verwendet nur Referenzen die <Muster> entsprechen" -#: builtin/name-rev.c:318 +#: builtin/name-rev.c:317 msgid "list all commits reachable from all refs" msgstr "listet alle Commits auf, die von allen Referenzen erreichbar sind" -#: builtin/name-rev.c:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "liest von der Standard-Eingabe" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" -msgstr "erlaubt Ausgabe von `undefinierten` Namen" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "erlaubt Ausgabe von `undefinierten` Namen (Standard)" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "dereferenziert Tags in der Eingabe (interne Verwendung)" @@ -7258,12 +7540,12 @@ msgstr "Konnte Notiz-Objekt nicht schreiben" msgid "The note contents has been left in %s" msgstr "Die Notiz-Inhalte wurden in %s belassen" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "kann '%s' nicht lesen" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "konnte '%s' nicht öffnen oder lesen" @@ -7271,7 +7553,7 @@ msgstr "konnte '%s' nicht öffnen oder lesen" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Konnte '%s' nicht als gültige Referenz auflösen." @@ -7433,7 +7715,7 @@ msgstr "Notiz-Referenz" msgid "use notes from <notes_ref>" msgstr "verwendet Notizen von <Notiz-Referenz>" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "Unbekanntes Unterkommando: %s" @@ -7448,155 +7730,155 @@ msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" msgstr "" "git pack-objects [Optionen...] Basis-Name [< Referenzliste | < Objektliste]" -#: builtin/pack-objects.c:183 builtin/pack-objects.c:186 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "Fehler beim Komprimieren (%d)" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "Nicht unterstützte Staging-Area-Version %s" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "Ungültige Staging-Area-Version '%s'" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "Option %s akzeptiert keine negative Form" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "konnte Wert '%s' für Option %s nicht parsen" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "zeigt keine Fortschrittsanzeige" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "zeigt Fortschrittsanzeige" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 msgid "show progress meter during object writing phase" msgstr "zeigt Forschrittsanzeige während der Phase des Schreibens der Objekte" -#: builtin/pack-objects.c:2454 +#: builtin/pack-objects.c:2453 msgid "similar to --all-progress when progress meter is shown" msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird" -#: builtin/pack-objects.c:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "version[,offset]" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 msgid "write the pack index file in the specified idx format version" msgstr "" "schreibt die Index-Datei des Paketes in der angegebenen Indexformat-Version" -#: builtin/pack-objects.c:2459 +#: builtin/pack-objects.c:2458 msgid "maximum size of each output pack file" msgstr "maximale Größe für jede ausgegebene Paketdatei" -#: builtin/pack-objects.c:2461 +#: builtin/pack-objects.c:2460 msgid "ignore borrowed objects from alternate object store" msgstr "ignoriert geliehene Objekte von alternativem Objektspeicher" -#: builtin/pack-objects.c:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "ignoriert gepackte Objekte" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 msgid "limit pack window by objects" msgstr "begrenzt Paketfenster durch Objekte" -#: builtin/pack-objects.c:2467 +#: builtin/pack-objects.c:2466 msgid "limit pack window by memory in addition to object limit" msgstr "begrenzt Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher" -#: builtin/pack-objects.c:2469 +#: builtin/pack-objects.c:2468 msgid "maximum length of delta chain allowed in the resulting pack" msgstr "" "maximale Länge der erlaubten Differenzverkettung im resultierenden Paket" -#: builtin/pack-objects.c:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "verwendet existierende Unterschiede wieder" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "verwendet existierende Objekte wieder" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "verwendet OFS_DELTA Objekte" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 msgid "use threads when searching for best delta matches" msgstr "" "verwendet Threads bei der Suche nach den besten Übereinstimmungen bei " "Unterschieden" -#: builtin/pack-objects.c:2479 +#: builtin/pack-objects.c:2478 msgid "do not create an empty pack output" msgstr "erzeugt keine leeren Pakete" -#: builtin/pack-objects.c:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr "liest Argumente bezüglich Commits von der Standard-Eingabe" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 msgid "limit the objects to those that are not yet packed" msgstr "begrenzt die Objekte zu solchen, die noch nicht gepackt wurden" -#: builtin/pack-objects.c:2486 +#: builtin/pack-objects.c:2485 msgid "include objects reachable from any reference" msgstr "schließt Objekte ein, die von jeder Referenz erreichbar sind" -#: builtin/pack-objects.c:2489 +#: builtin/pack-objects.c:2488 msgid "include objects referred by reflog entries" msgstr "" "schließt Objekte ein, die von Einträgen des Reflogs referenziert werden" -#: builtin/pack-objects.c:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "schreibt Paket in die Standard-Ausgabe" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 msgid "include tag objects that refer to objects to be packed" msgstr "schließt Tag-Objekte ein, die auf gepackte Objekte referenzieren" -#: builtin/pack-objects.c:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "behält nicht erreichbare Objekte" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "Zeit" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 msgid "unpack unreachable objects newer than <time>" msgstr "entpackt nicht erreichbare Objekte, die neuer als <Zeit> sind" -#: builtin/pack-objects.c:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "erzeugt dünnere Pakete" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 msgid "ignore packs that have companion .keep file" msgstr "ignoriert Pakete die .keep Dateien haben" -#: builtin/pack-objects.c:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "Komprimierungsgrad für Paketierung" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" -msgstr "verbirgt keine Commits mit künstlichen Vorgängern (\"grafts\")" +msgstr "verbirgt keine künstlichen Vorgänger-Commits (\"grafts\")" #: builtin/pack-refs.c:6 msgid "git pack-refs [options]" @@ -7618,15 +7900,15 @@ msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "nicht löschen, nur anzeigen" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "meldet gelöschte Objekte" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "lässt Objekte älter als <Zeit> verfallen" @@ -7634,15 +7916,15 @@ msgstr "lässt Objekte älter als <Zeit> verfallen" msgid "git push [<options>] [<repository> [<refspec>...]]" msgstr "git push [<Optionen>] [<Repository> [<Refspec>...]]" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "Kurzschrift für Tag ohne <Tag>" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "Die Option --delete akzeptiert nur reine Referenznamen als Ziel." -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." @@ -7651,7 +7933,7 @@ msgstr "" "Um eine Variante permanent zu verwenden, siehe push.default in 'git help " "config'." -#: builtin/push.c:102 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7677,7 +7959,7 @@ msgstr "" " git push %s %s\n" "%s" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7692,7 +7974,7 @@ msgstr "" "\n" " git push %s HEAD:<Name-des-Remote-Branches>\n" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7706,13 +7988,13 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:139 +#: builtin/push.c:181 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "" "Der aktuelle Branch %s hat mehrere Upstream-Branches, \"push\" verweigert." -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7720,10 +8002,10 @@ msgid "" "to update which remote branch." msgstr "" "Sie versenden nach '%s', welches kein Upstream-Repository Ihres aktuellen\n" -"Branches '%s' ist, ohne mir mitzuteilen, was ich versenden soll, um welchen\n" +"Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n" "Remote-Branch zu aktualisieren." -#: builtin/push.c:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7735,6 +8017,13 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" @@ -7752,20 +8041,27 @@ msgstr "" "\n" " git config --global push.default simple\n" "\n" -"Führen Sie 'git help config' aus und suchen Sie nach 'push.default' für " +"Wenn 'push.default' auf den Wert 'matching' gesetzt ist, werden lokale\n" +"Branches zu den Remote-Branches mit den selben Namen versendet.\n" +"\n" +"In Git 2.0 wird das Standardverhalten zu 'simple' geändert. Hierbei wird\n" +"der aktuelle Branch zu dem entsprechenden Remote-Branch versendet, den\n" +"'git pull' zur Aktualisierung des aktuellen Branches verwendet.\n" +"\n" +"Führen Sie 'git help config' aus und suchen Sie nach 'push.default' für\n" "weitere Informationen.\n" -"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutze den ähnlichen " -"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen " -"von Git benutzen.)" +"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den ähnlichen\n" +"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen von\n" +"Git benutzen.)" -#: builtin/push.c:225 +#: builtin/push.c:274 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" "Sie haben keine Refspec für \"push\" angegeben, und push.default ist " "\"nothing\"." -#: builtin/push.c:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7779,7 +8075,7 @@ msgstr "" "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:238 +#: builtin/push.c:287 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" @@ -7795,7 +8091,7 @@ msgstr "" "'simple', 'current'\n" "oder 'upstream' setzen, um nur den aktuellen Branch zu versenden." -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7809,7 +8105,7 @@ msgstr "" "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7828,13 +8124,13 @@ msgstr "" "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "" "Aktualisierungen wurden zurückgewiesen, weil das Tag bereits\n" "im Remote-Repository existiert." -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" @@ -7844,22 +8140,22 @@ msgstr "" "das kein Commit ist, oder es auf ein solches Objekt zeigen lassen, ohne\n" "die Option '--force' zu verwenden.\n" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "Versende nach %s\n" -#: builtin/push.c:324 +#: builtin/push.c:379 #, c-format msgid "failed to push some refs to '%s'" msgstr "Fehler beim Versenden einiger Referenzen nach '%s'" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "ungültiges Repository '%s'" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7881,87 +8177,95 @@ msgstr "" "\n" " git push <Name>\n" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "Die Optionen --all und --tags sind inkompatibel." -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden." -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "Die Optionen --mirror und --tags sind inkompatibel." -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden." -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "Die Optionen --all und --mirror sind inkompatibel." -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "Repository" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" msgstr "versendet alle Referenzen" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" msgstr "spiegelt alle Referenzen" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" msgstr "löscht Referenzen" -#: builtin/push.c:450 +#: builtin/push.c:505 msgid "push tags (can't be used with --all or --mirror)" msgstr "versendet Tags (kann nicht mit --all oder --mirror verwendet werden)" -#: builtin/push.c:453 +#: builtin/push.c:508 msgid "force updates" msgstr "erzwingt Aktualisierung" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "Referenzname>:<Erwartungswert" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "Referenz muss sich auf dem angegebenen Wert befinden" + +#: builtin/push.c:513 msgid "check" msgstr "" -#: builtin/push.c:455 +#: builtin/push.c:514 msgid "control recursive pushing of submodules" msgstr "steuert rekursiven \"push\" von Submodulen" -#: builtin/push.c:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "verwendet kleinere Pakete" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" msgstr "'receive pack' Programm" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" msgstr "setzt Upstream für \"git pull/status\"" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" msgstr "entfernt lokal gelöschte Referenzen" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" msgstr "umgeht \"pre-push hook\"" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" msgstr "versendet fehlende, aber relevante Tags" -#: builtin/push.c:476 +#: builtin/push.c:535 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags." -#: builtin/push.c:478 +#: builtin/push.c:537 msgid "--delete doesn't make sense without any refs" msgstr "Die Option --delete kann nur mit Referenzen verwendet werden." @@ -7971,7 +8275,7 @@ msgid "" "[-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>] " +"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<Präfix>] " "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--" "index-output=<Datei>] (--empty | <Commit-Referenz1> [<Commit-Referenz2> " "[<Commit-Referenz3>]])" @@ -8040,21 +8344,21 @@ msgstr "überspringt Anwendung des Filters für spärliches Auschecken" msgid "debug unpack-trees" msgstr "protokolliert Entpacken der Bäume" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" msgstr "'%s' für '%s' ist kein gültiger Zeitstempel" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "'%s' ist kein gültiger Zeitstempel" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "git remote [-v | --verbose]" -#: builtin/remote.c:12 +#: builtin/remote.c:13 msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <name> <url>" @@ -8062,78 +8366,82 @@ msgstr "" "git remote add [-t <Branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <Name> <URL>" -#: builtin/remote.c:13 builtin/remote.c:32 +#: builtin/remote.c:14 builtin/remote.c:33 msgid "git remote rename <old> <new>" msgstr "git remote rename <alt> <neu>" -#: builtin/remote.c:14 builtin/remote.c:37 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "git remote remove <Name>" -#: builtin/remote.c:15 builtin/remote.c:42 -msgid "git remote set-head <name> (-a | -d | <branch>)" -msgstr "git remote set-head <Name> (-a | -d | <Branch>)" - #: builtin/remote.c:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <Name> (-a | --auto | -d | --delete | <Branch>)" + +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "git remote [-v | --verbose] show [-n] <Name>" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "git remote prune [-n | --dry-run] <Name>" -#: builtin/remote.c:18 +#: builtin/remote.c:19 msgid "" "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" msgstr "" "git remote [-v | --verbose] update [-p | --prune] [(<Gruppe> | <Remote>)...]" -#: builtin/remote.c:19 +#: builtin/remote.c:20 msgid "git remote set-branches [--add] <name> <branch>..." msgstr "git remote set-branches [--add] <Name> <Branch>..." -#: builtin/remote.c:20 builtin/remote.c:68 +#: builtin/remote.c:21 builtin/remote.c:69 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" msgstr "git remote set-url [--push] <Name> <neueURL> [<alteURL>]" -#: builtin/remote.c:21 builtin/remote.c:69 +#: builtin/remote.c:22 builtin/remote.c:70 msgid "git remote set-url --add <name> <newurl>" msgstr "git remote set-url --add <Name> <neueURL>" -#: builtin/remote.c:22 builtin/remote.c:70 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "git remote set-url --delete <Name> <URL>" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "git remote add [<Optionen>] <Name> <URL>" -#: builtin/remote.c:47 +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <Name> (-a | --auto | -d | --delete | <Branch>)" + +#: builtin/remote.c:48 msgid "git remote set-branches <name> <branch>..." msgstr "git remote set-branches <Name> <Branch>..." -#: builtin/remote.c:48 +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "git remote set-branches --add <Name> <Branch>..." -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "git remote show [<Optionen>] <Name>" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "git remote prune [<Optionen>] <Name>" -#: builtin/remote.c:63 +#: builtin/remote.c:64 msgid "git remote update [<options>] [<group> | <remote>]..." msgstr "git remote update [<Optionen>] [<Gruppe> | <externesRepository>]..." -#: builtin/remote.c:98 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "Aktualisiere %s" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" @@ -8141,107 +8449,107 @@ msgstr "" "--mirror ist gefährlich und veraltet; bitte\n" "\t benutzen Sie stattdessen --mirror=fetch oder --mirror=push" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "unbekanntes Argument für Option --mirror: %s" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" msgstr "fordert die Remote-Branches an" -#: builtin/remote.c:165 +#: builtin/remote.c:155 msgid "import all tags and associated objects when fetching" msgstr "importiert alle Tags und verbundene Objekte beim Anfordern" -#: builtin/remote.c:168 +#: builtin/remote.c:158 msgid "or do not fetch any tag at all (--no-tags)" msgstr "oder fordere gar keine Zweige an (--no-tags)" -#: builtin/remote.c:170 +#: builtin/remote.c:160 msgid "branch(es) to track" msgstr "Branch(es) zur Übernahme" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "Hauptbranch" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "push|fetch" -#: builtin/remote.c:173 +#: builtin/remote.c:163 msgid "set up remote as a mirror to push to or fetch from" msgstr "" "Aufsetzen des Remote-Repositories als Spiegel-Repository für \"push\" und " "\"fetch\"" -#: builtin/remote.c:185 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "" "Die Option --mirror kann nicht mit der Angabe eines Hauptbranches verwendet " "werden." -#: builtin/remote.c:187 +#: builtin/remote.c:177 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "" "Die Angabe von zu folgenden Branches kann nur mit dem Anfordern von " "Spiegelarchiven verwendet werden." -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, c-format msgid "remote %s already exists." msgstr "externes Repository %s existiert bereits" -#: builtin/remote.c:199 builtin/remote.c:650 +#: builtin/remote.c:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "'%s' ist kein gültiger Name für ein Remote-Repository" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "Konnte symbolische Referenz für Hauptbranch von '%s' nicht einrichten" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "mehr als ein %s" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" msgstr "Konnte Fetch-Map für Refspec %s nicht bekommen" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "(übereinstimmend)" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "(lösche)" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%s'" msgstr "Konnte '%s' nicht an '%s' anhängen." -#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "Kein solches Remote-Repository: %s" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, c-format msgid "Could not remove config section '%s'" msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -8252,32 +8560,32 @@ msgstr "" "\t%s\n" "\tBitte aktualisieren Sie, falls notwendig, die Konfiguration manuell." -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "Konnte '%s' nicht anhängen." -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "Konnte '%s' nicht setzen" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" msgstr "Konnte '%s' nicht löschen" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" msgstr "Konnte '%s' nicht erstellen" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" msgstr "Konnte Branch %s nicht löschen" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -8293,120 +8601,120 @@ msgstr[1] "" "entfernt;\n" "um diese zu entfernen, benutzen Sie:" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr " neu (wird bei nächstem \"fetch\" in remotes/%s gespeichert)" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" msgstr " gefolgt" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr " ???" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "ungültiges branch.%s.merge; kann Rebase nicht auf > 1 Branch ausführen" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "Rebase auf Remote-Branch %s" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr " führt mit Remote-Branch %s zusammen" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr " und mit Remote-Branch" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "führt mit Remote-Branch %s zusammen" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr " und mit Remote-Branch" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "erstellt" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "gelöscht" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "aktuell" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "vorspulbar" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "lokal nicht aktuell" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s erzwingt Versandt nach %-*s (%s)" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr " %-*s versendet nach %-*s (%s)" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr " %-*s erzwingt Versand nach %s" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" msgstr " %-*s versendet nach %s" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "keine Abfrage von Remote-Repositories" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "* Remote-Repository %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" msgstr " URL zum Abholen: %s" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "(keine URL)" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr " URL zum Versenden: %s" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr " Hauptbranch: %s" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" @@ -8414,149 +8722,216 @@ msgstr "" " Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden " "sein):\n" -#: builtin/remote.c:1151 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" msgstr[0] " Remote-Branch:%s" msgstr[1] " Remote-Branches:%s" -#: builtin/remote.c:1154 builtin/remote.c:1181 +#: builtin/remote.c:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr " (Zustand nicht abgefragt)" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" msgstr[0] " Lokaler Branch konfiguriert für 'git pull':" msgstr[1] " Lokale Branches konfiguriert für 'git pull':" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 msgid " Local refs will be mirrored by 'git push'" msgstr " Lokale Referenzen werden von 'git push' gespiegelt" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, c-format msgid " Local ref configured for 'git push'%s:" msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] " Lokale Referenz konfiguriert für 'git push'%s:" msgstr[1] " Lokale Referenzen konfiguriert für 'git push'%s:" -#: builtin/remote.c:1199 +#: builtin/remote.c:1252 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository" -#: builtin/remote.c:1201 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "entfernt refs/remotes/<Name>/HEAD" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "Kann HEAD des Remote-Repositories nicht bestimmen" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "" "Mehrere Hauptbranches im Remote-Repository. Bitte wählen Sie explizit einen " "aus mit:" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "Konnte %s nicht entfernen" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" msgstr "keine gültige Referenz: %s" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "Konnte %s nicht einrichten" -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr " %s wird unreferenziert!" -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr " %s wurde unreferenziert!" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "entferne veraltete Branches von %s" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "URL: %s" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr " * [würde veralteten Branch entfernen] %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr "* [veralteten Branch entfernt] %s" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "entfernt veraltete Branches im Remote-Repository nach \"fetch\"" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "Kein solches Remote-Repository '%s'" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "fügt Branch hinzu" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "kein Remote-Repository angegeben" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "manipuliert URLs für \"push\"" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "fügt URL hinzu" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "löscht URLs" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "" "Die Optionen --add und --delete können nicht gemeinsam verwendet werden." -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "ungültiges altes URL Format: %s" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "Keine solche URL gefunden: %s" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 msgid "Will not delete all non-push URLs" msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind" -#: builtin/remote.c:1569 +#: builtin/remote.c:1564 msgid "be verbose; must be placed before a subcommand" msgstr "erweiterte Ausgaben; muss vor einem Unterkommando angegeben werden" +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "git repack [Optionen]" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "packt alles in eine einzige Pack-Datei" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "entfernt redundante Pakete und führt \"git-prune-packed\" aus" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "übergibt --no-reuse-delta an git-pack-objects" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "übergibt --no-reuse-object an git-pack-objects" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "git-update-server-info nicht ausführen" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "übergibt --local an git-pack-objects" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "Datumsangabe" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "mit -A, löscht keine Objekte älter als dieses Datum" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "Größe des Fensters für die Delta-Kompression" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "Bytes" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "" +"gleiches wie oben, limitiert aber die Speichergröße anstatt der\n" +"Anzahl der Einträge" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "limitiert die maximale Delta-Tiefe" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "maximale Größe für jede Paketdatei" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "Löschen von '%s' fehlgeschlagen" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "git replace [-f] <Objekt> <Ersetzung>" @@ -8566,26 +8941,30 @@ msgid "git replace -d <object>..." msgstr "git replace -d <Objekt>..." #: builtin/replace.c:19 -msgid "git replace -l [<pattern>]" -msgstr "git replace -l [<Muster>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<Format>] [-l [<Muster>]]" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "listet ersetzende Referenzen auf" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "löscht ersetzende Referenzen" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "ersetzt die Referenz, wenn sie existiert" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "benutzt das angegebene Format" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "git rerere [clean | forget path... | status | remaining | diff | gc]" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 msgid "register clean resolutions in index" msgstr "registriert saubere Auflösungen in der Staging-Area" @@ -8646,87 +9025,91 @@ msgstr "HEAD ist jetzt bei %s" msgid "Cannot do a %s reset in the middle of a merge." msgstr "Kann keinen '%s'-Reset durchführen, während ein Merge im Gange ist." -#: builtin/reset.c:251 +#: builtin/reset.c:262 msgid "be quiet, only report errors" msgstr "weniger Ausgaben, meldet nur Fehler" -#: builtin/reset.c:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "setzt HEAD und Staging-Area um" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "setzt nur HEAD um" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 msgid "reset HEAD, index and working tree" msgstr "setzt HEAD, Staging-Area und Arbeitsverzeichnis um" -#: builtin/reset.c:260 +#: builtin/reset.c:271 msgid "reset HEAD but keep local changes" msgstr "setzt HEAD um, behält aber lokale Änderungen" -#: builtin/reset.c:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "Konnte '%s' nicht als gültigen Commit auflösen." -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "Konnte Objekt '%s' nicht parsen." -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "Konnte '%s' nicht als gültiges \"Tree\"-Objekt auflösen." -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "--patch ist inkompatibel mit --{hard,mixed,soft}" -#: builtin/reset.c:304 +#: builtin/reset.c:315 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "" "--mixed mit Pfaden ist veraltet; benutzen Sie stattdessen 'git reset -- " "<Pfade>'." -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "Ein '%s'-Reset mit Pfaden ist nicht möglich." -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" msgstr "'%s'-Reset ist in einem Bare-Repository nicht erlaubt" -#: builtin/reset.c:336 +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:" + +#: builtin/reset.c:350 #, c-format msgid "Could not reset index file to revision '%s'." msgstr "Konnte Staging-Area-Datei nicht zu Commit '%s' setzen." -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" -msgstr "Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:" - -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "Konnte neue Staging-Area-Datei nicht schreiben." -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "git rev-parse --parseopt [Optionen] -- [<Argumente>...]" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" msgstr "lässt `--` als Argument" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 msgid "stop parsing after the first non-option argument" msgstr "stoppt das Parsen nach dem ersten Argument was keine Option ist" -#: builtin/rev-parse.c:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8757,84 +9140,84 @@ msgstr "git cherry-pick [Optionen] <Commit-Angabe>..." msgid "git cherry-pick <subcommand>" msgstr "git cherry-pick <Unterkommando>" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s kann nicht mit %s verwendet werden" -#: builtin/revert.c:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "beendet \"revert\" oder \"cherry-pick\" Ablauf" -#: builtin/revert.c:106 +#: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" msgstr "setzt \"revert\" oder \"cherry-pick\" Ablauf fort" -#: builtin/revert.c:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "bricht \"revert\" oder \"cherry-pick\" Ablauf ab" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "committet nicht automatisch" -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "Bearbeitung der Commit-Beschreibung" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "Nummer des Elternteils" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "Merge-Strategie" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "Option" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "Option für Merge-Strategie" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" msgstr "hängt Commit-Namen an" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "erlaubt Vorspulen" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "erhält ursprüngliche, leere Commits" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" msgstr "erlaubt Commits mit leerer Beschreibung" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "behält redundante, leere Commits" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "Programmfehler" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "\"revert\" fehlgeschlagen" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "\"cherry-pick\" fehlgeschlagen" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "git rm [Optionen] [--] [<Datei>...]" -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8848,7 +9231,7 @@ msgstr[1] "" "die folgenden Submodule (oder ein geschachteltes Submodul hiervon)\n" "benutzen ein .git-Verzeichnis:" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -8857,7 +9240,7 @@ msgstr "" "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n" "seiner Historie löschen möchten)" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8872,7 +9255,7 @@ msgstr[1] "" "unterschiedlich\n" "zu der Datei und HEAD:" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" @@ -8880,13 +9263,13 @@ msgstr "" "\n" "(benutzen Sie -f um die Löschung zu erzwingen)" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "die folgende Datei hat zum Commit vorgemerkte Änderungen:" msgstr[1] "die folgenden Dateien haben zum Commit vorgemerkte Änderungen:" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" @@ -8895,38 +9278,38 @@ msgstr "" "(benutzen Sie --cached um die Datei zu behalten, oder -f um die Entfernung " "zu erzwingen)" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "die folgende Datei hat lokale Änderungen:" msgstr[1] "die folgenden Dateien haben lokale Änderungen:" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "listet keine gelöschten Dateien auf" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "entfernt nur aus der Staging-Area" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "überschreibt die \"up-to-date\" Prüfung" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "erlaubt rekursive Entfernung" -#: builtin/rm.c:274 +#: builtin/rm.c:275 msgid "exit with a zero status even if nothing matched" msgstr "beendet mit Rückgabewert 0, wenn keine Übereinstimmung gefunden wurde" -#: builtin/rm.c:345 +#: builtin/rm.c:336 #, c-format msgid "not removing '%s' recursively without -r" msgstr "'%s' wird nicht ohne -r rekursiv entfernt" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm: konnte %s nicht löschen" @@ -8940,23 +9323,23 @@ msgstr "git shortlog [<Optionen>] [Commitbereich] [[--] <Pfad>...]" msgid "Missing author: %s" msgstr "fehlender Autor: %s" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 msgid "sort output according to the number of commits per author" msgstr "sortiert die Ausgabe entsprechend der Anzahl von Commits pro Autor" -#: builtin/shortlog.c:230 +#: builtin/shortlog.c:232 msgid "Suppress commit descriptions, only provides commit count" msgstr "Unterdrückt Commit-Beschreibungen, liefert nur Anzahl der Commits" -#: builtin/shortlog.c:232 +#: builtin/shortlog.c:234 msgid "Show the email address of each author" msgstr "Zeigt die Email-Adresse von jedem Autor" -#: builtin/shortlog.c:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "w[,i1[,i2]]" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "Ausgabe mit Zeilenumbrüchen" @@ -8976,67 +9359,67 @@ msgstr "" msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g|--reflog)[=<n>[,<Basis>]] [--list] [<Referenz>]" -#: builtin/show-branch.c:650 +#: builtin/show-branch.c:649 msgid "show remote-tracking and local branches" msgstr "zeigt Remote-Tracking und lokale Branches an" -#: builtin/show-branch.c:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "zeigt Remote-Tracking-Branches an" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "färbt '*!+-' entsprechend des Branches ein" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 msgid "show <n> more commits after the common ancestor" msgstr "zeigt <n> weitere Commits nach dem gemeinsamen Vorgänger-Commit" -#: builtin/show-branch.c:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "Synonym für more=-1" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "unterdrückt Namen" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "bezieht den aktuellen Branch ein" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 msgid "name commits with their object names" msgstr "benennt Commits nach ihren Objektnamen" -#: builtin/show-branch.c:665 +#: builtin/show-branch.c:664 msgid "show possible merge bases" msgstr "zeigt mögliche Merge-Basen an" -#: builtin/show-branch.c:667 +#: builtin/show-branch.c:666 msgid "show refs unreachable from any other ref" msgstr "zeigt Referenzen die unerreichbar von allen anderen Referenzen sind" -#: builtin/show-branch.c:669 +#: builtin/show-branch.c:668 msgid "show commits in topological order" msgstr "zeigt Commits in topologischer Ordnung" -#: builtin/show-branch.c:672 +#: builtin/show-branch.c:671 msgid "show only commits not on the first branch" msgstr "zeigt nur Commits, die sich nicht im ersten Branch befinden" -#: builtin/show-branch.c:674 +#: builtin/show-branch.c:673 msgid "show merges reachable from only one tip" msgstr "zeigt Merges, die nur von einem Branch aus erreichbar sind" -#: builtin/show-branch.c:676 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "topologische Sortierung, Beibehaltung Datumsordnung wo möglich" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" msgstr "<n>[,<Basis>]" -#: builtin/show-branch.c:680 +#: builtin/show-branch.c:679 msgid "show <n> most recent ref-log entries starting at base" msgstr "zeigt die <n> jüngsten Einträge im Reflog beginnend an der Basis" @@ -9064,24 +9447,24 @@ msgstr "zeigt nur Branches (kann mit \"tags\" kombiniert werden)" msgid "stricter reference checking, requires exact ref path" msgstr "strengere Referenzprüfung, erfordert exakten Referenzpfad" -#: builtin/show-ref.c:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "zeigt die HEAD-Referenz, selbst wenn diese ausgefiltert werden würde" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 msgid "dereference tags into object IDs" msgstr "dereferenziert Tags in Objekt-Identifikationen" -#: builtin/show-ref.c:180 +#: builtin/show-ref.c:179 msgid "only show SHA1 hash using <n> digits" msgstr "zeigt nur SHA1 Hash mit <n> Ziffern" -#: builtin/show-ref.c:184 +#: builtin/show-ref.c:183 msgid "do not print results to stdout (useful with --verify)" msgstr "" "keine Ausgabe der Ergebnisse in die Standard-Ausgabe (nützlich mit --verify)" -#: builtin/show-ref.c:186 +#: builtin/show-ref.c:185 msgid "show refs from stdin that aren't in local repository" msgstr "" "zeigt Referenzen von der Standard-Eingabe, die sich nicht im lokalen " @@ -9108,11 +9491,11 @@ msgstr "löscht symbolische Referenzen" msgid "shorten ref output" msgstr "verkürzte Ausgabe der Referenzen" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "Grund" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "Grund für die Aktualisierung" @@ -9278,191 +9661,203 @@ msgstr "gibt nur Tags aus, die diesen Commit beinhalten" msgid "print only tags of the object" msgstr "gibt nur Tags von dem Objekt aus" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "--column und -n sind inkompatibel" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "-n Option ist nur erlaubt mit -l." -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "--contains Option ist nur erlaubt mit -l." -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "--points-at Option ist nur erlaubt mit -l." -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "nur eine -F oder -m Option ist erlaubt." -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "zu viele Parameter" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "'%s' ist kein gültiger Tagname." -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "Tag '%s' existiert bereits" -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "%s: kann Referenz nicht sperren" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "%s: kann Referenz nicht aktualisieren" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "Tag '%s' aktualisiert (war %s)\n" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "git update-index [Optionen] [--] [<Datei>...]" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "" "Aktualisierung fortsetzen, auch wenn die Staging-Area aktualisiert werden " "muss" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "Aktualisierung: ignoriert Submodule" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "ignoriert keine neuen Dateien" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 msgid "let files replace directories and vice-versa" msgstr "lässt Dateien Verzeichnisse ersetzen, und umgedreht" -#: builtin/update-index.c:728 +#: builtin/update-index.c:730 msgid "notice files missing from worktree" msgstr "beachtet fehlende Dateien im Arbeitsverzeichnis" -#: builtin/update-index.c:730 +#: builtin/update-index.c:732 msgid "refresh even if index contains unmerged entries" msgstr "" "aktualisiert, auch wenn die Staging-Area nicht zusammengeführte Einträge " "beinhaltet" -#: builtin/update-index.c:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "aktualisiert Dateiinformationen" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 msgid "like --refresh, but ignore assume-unchanged setting" msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung" -#: builtin/update-index.c:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "<Modus> <Objekt> <Pfad>" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 msgid "add the specified entry to the index" msgstr "merkt den angegebenen Eintrag zum Commit vor" -#: builtin/update-index.c:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "(+/-)x" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 msgid "override the executable bit of the listed files" msgstr "überschreibt das \"ausführbar\"-Bit der aufgelisteten Dateien" -#: builtin/update-index.c:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "betrachte diese Datei immer als unverändert" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "löscht \"assumed-unchanged\"-Bit" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "markiert Dateien als \"index-only\"" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "löscht \"skip-worktree\"-Bit" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 msgid "add to index only; do not add content to object database" msgstr "" "merkt die Änderungen nur zum Commit vor; Inhalt wird nicht der Objekt-" "Datenbank hinzugefügt" -#: builtin/update-index.c:765 +#: builtin/update-index.c:767 msgid "remove named paths even if present in worktree" msgstr "" "löscht benannte Pfade, auch wenn sie sich im Arbeitsverzeichnis befinden" -#: builtin/update-index.c:767 +#: builtin/update-index.c:769 msgid "with --stdin: input lines are terminated by null bytes" msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen" -#: builtin/update-index.c:769 +#: builtin/update-index.c:771 msgid "read list of paths to be updated from standard input" msgstr "liest Liste der zu aktualisierenden Pfade von der Standard-Eingabe" -#: builtin/update-index.c:773 +#: builtin/update-index.c:775 msgid "add entries from standard input to the index" msgstr "merkt Einträge von der Standard-Eingabe zum Commit vor" -#: builtin/update-index.c:777 +#: builtin/update-index.c:779 msgid "repopulate stages #2 and #3 for the listed paths" msgstr "" "wiederholtes Einpflegen der Zustände #2 und #3 für die aufgelisteten Pfade" -#: builtin/update-index.c:781 +#: builtin/update-index.c:783 msgid "only update entries that differ from HEAD" msgstr "aktualisiert nur Einträge, die unterschiedlich zu HEAD sind" -#: builtin/update-index.c:785 +#: builtin/update-index.c:787 msgid "ignore files missing from worktree" msgstr "ignoriert fehlende Dateien im Arbeitsverzeichnis" -#: builtin/update-index.c:788 +#: builtin/update-index.c:790 msgid "report actions to standard output" msgstr "gibt die Aktionen in der Standard-Ausgabe aus" -#: builtin/update-index.c:790 +#: builtin/update-index.c:792 msgid "(for porcelains) forget saved unresolved conflicts" msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte" -#: builtin/update-index.c:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "schreibt Staging-Area-Datei in diesem Format" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 msgid "git update-ref [options] -d <refname> [<oldval>]" msgstr "git update-ref [Optionen] -d <Referenzname> [<alterWert>]" -#: builtin/update-ref.c:8 +#: builtin/update-ref.c:10 msgid "git update-ref [options] <refname> <newval> [<oldval>]" msgstr "git update-ref [Optionen] <Referenzname> <neuerWert> [<alterWert>]" -#: builtin/update-ref.c:19 +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "git update-ref [Optionen] --stdin [-z]" + +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "löscht diese Referenz" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 msgid "update <refname> not the one it points to" msgstr "aktualisiert <Referenzname>, nicht den Verweis" +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "Standard-Eingabe hat durch NUL-Zeichen abgeschlossene Argumente" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "liest Aktualisierungen von der Standard-Eingabe" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "git update-server-info [--force]" @@ -9493,15 +9888,15 @@ msgstr "gibt Tag-Inhalte aus" #: builtin/write-tree.c:13 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" -msgstr "git write-tree [--missing-ok] [--prefix=<Prefix>/]" +msgstr "git write-tree [--missing-ok] [--prefix=<Präfix>/]" #: builtin/write-tree.c:26 msgid "<prefix>/" -msgstr "<Prefix>/" +msgstr "<Präfix>/" #: builtin/write-tree.c:27 msgid "write tree object for a subdirectory <prefix>" -msgstr "schreibt das \"Tree\"-Objekt für ein Unterverzeichnis <Prefix>" +msgstr "schreibt das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix>" #: builtin/write-tree.c:30 msgid "only useful for debugging" @@ -9518,23 +9913,23 @@ msgstr "" "oder 'git help <Konzept>' um mehr über ein spezifisches Kommando oder\n" "Konzept zu erfahren." -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "Verfallsdatum" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "Kein Effekt (Rückwärtskompatibilität)" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "erweiterte Ausgaben" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "weniger Ausgaben" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s" @@ -9852,8 +10247,9 @@ msgstr "" "<gueltigerbranch>'." #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "binäre Suche auf gesuchtem Branch nicht möglich" +msgid "won't bisect on cg-seek'ed tree" +msgstr "" +"binäre Suche auf einem durch 'cg-seek' geändertem Verzeichnis nicht möglich" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" @@ -9993,7 +10389,7 @@ msgid "Pull is not possible because you have unmerged files." msgstr "" "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." -#: git-pull.sh:203 +#: git-pull.sh:223 msgid "updating an unborn branch with changes added to the index" msgstr "" "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit " @@ -10003,7 +10399,7 @@ msgstr "" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -10013,15 +10409,15 @@ msgstr "" "Warnung: \"fetch\" aktualisierte die Spitze des aktuellen Branches.\n" "Warnung: Spule Ihr Arbeitsverzeichnis von Commit $orig_head vor." -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "Kann nicht mehrere Branches in einen ungeborenen Branch zusammenführen" -#: git-pull.sh:264 +#: git-pull.sh:276 msgid "Cannot rebase onto multiple branches" msgstr "kann Rebase nicht auf mehrere Branches ausführen" -#: git-rebase.sh:54 +#: git-rebase.sh:55 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" @@ -10035,16 +10431,16 @@ msgstr "" "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n" "führen Sie \"git rebase --abort\" aus." -#: git-rebase.sh:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "\"autostash\" angewendet." -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "Kann $stash_sha1 nicht speichern." -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" @@ -10054,33 +10450,33 @@ msgstr "" "Ihre Änderungen sind im Stash sicher.\n" "Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen." -#: git-rebase.sh:195 +#: git-rebase.sh:206 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "\"git-am\" scheint im Gange zu sein. Kann Rebase nicht durchführen." -#: git-rebase.sh:329 +#: git-rebase.sh:346 msgid "The --exec option must be used with the --interactive option" msgstr "Die Option --exec muss mit --interactive verwendet werden." -#: git-rebase.sh:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "Kein Rebase im Gange?" -#: git-rebase.sh:345 +#: git-rebase.sh:362 msgid "The --edit-todo action can only be used during interactive rebase." msgstr "" "Die --edit-todo Aktion kann nur während eines interaktiven Rebase verwendet " "werden." -#: git-rebase.sh:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "Kann HEAD nicht lesen" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -10088,12 +10484,12 @@ msgstr "" "Sie müssen alle Merge-Konflikte editieren und diese dann\n" "mittels \"git add\" als aufgelöst markieren" -#: git-rebase.sh:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "Konnte nicht zu $head_name zurückgehen" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -10114,68 +10510,68 @@ msgstr "" "und führen Sie dieses Kommando nochmal aus. Es wird angehalten, falls noch\n" "etwas Schützenswertes vorhanden ist." -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "ungültiger Upstream-Branch $upstream_name" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: es gibt mehr als eine Merge-Basis" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: es gibt keine Merge-Basis" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "$onto_name zeigt auf keinen gültigen Commit" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "fatal: Branch $branch_name nicht gefunden" -#: git-rebase.sh:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "Kann \"autostash\" nicht ausführen." -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "\"autostash\" erzeugt: $stash_abbrev" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"." -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Aktueller Branch $branch_name ist auf dem neusten Stand." -#: git-rebase.sh:552 +#: git-rebase.sh:581 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "" "Aktueller Branch $branch_name ist auf dem neusten Stand, Rebase erzwungen." -#: git-rebase.sh:563 +#: git-rebase.sh:592 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Änderungen von $mb zu $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:572 +#: git-rebase.sh:601 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Zunächst wird der Branch zurückgespult, um Ihre Änderungen\n" "darauf neu anzuwenden..." -#: git-rebase.sh:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "$branch_name zu $onto_name vorgespult." @@ -10223,7 +10619,7 @@ msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren." #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" @@ -10233,100 +10629,85 @@ msgstr "" " Um eine Beschreibung anzugeben, benutzen Sie \"git stash save -- " "'$option'\"" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" msgstr "Keine lokalen Änderungen zum Speichern" -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "" -"Die folgenden unbeobachteten Dateien würden NICHT gespeichert werden,\n" -"müssen aber durch \"stash save\" entfernt werden:" - -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "" -"Abgebrochen. Benutzen Sie entweder die Option --force oder --include-" -"untracked." - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "Kann \"stash\" nicht initialisieren" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "Kann den aktuellen Status nicht speichern" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." msgstr "Kein \"stash\" gefunden." -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "Zu viele Commits angegeben: $REV" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "$reference ist keine gültige Referenz" -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "'$args' ist kein \"stash\"-artiger Commit" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "'$args' ist keine \"stash\"-Referenz" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "unfähig die Staging-Area zu aktualisieren" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" msgstr "Kann \"stash\" nicht anwenden, solang ein Merge im Gange ist" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "Konflikte in der Staging-Area. Versuchen Sie es ohne --index." -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "Konnte Staging-Area-Verzeichnis nicht speichern" -#: git-stash.sh:503 +#: git-stash.sh:491 msgid "Cannot unstage modified files" msgstr "Kann geänderte Dateien nicht aus der Staging-Area entfernen" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." msgstr "Staging-Area wurde nicht aus dem Stash zurückgeladen." -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Gelöscht ${REV} ($s)" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "Kein Branchname spezifiziert" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)" @@ -10444,52 +10825,52 @@ msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration." msgid "Entering '$prefix$displaypath'" msgstr "Betrete '$prefix$displaypath'" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "Stoppe bei '$prefix$displaypath'; Skript gab nicht-Null Status zurück." -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "Keine URL für Submodul-Pfad '$displaypath' in .gitmodules gefunden" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "" "Fehler beim Eintragen der URL für Submodul-Pfad '$displaypath' in die " "Konfiguration." -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "" "Submodul '$name' ($url) für Pfad '$displaypath' in die Konfiguration " "eingetragen." -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "" "Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad " "'$displaypath' in der Konfiguration." -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "" "Verwenden Sie '.' wenn Sie wirklich alle Submodule\n" "deinitialisieren möchten." -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "" "Arbeitsverzeichnis des Submoduls in '$displaypath' enthält ein .git-" "Verzeichnis" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -10497,7 +10878,7 @@ msgstr "" "(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n" "seiner Historie löschen möchten)" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " @@ -10506,31 +10887,31 @@ msgstr "" "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; " "verwenden Sie '-f' um diese zu verwerfen" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "Verzeichnis '$displaypath' bereinigt." -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "" "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen." -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "" "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen." -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "" "Submodul '$name' ($url) für Pfad '$displaypath' wurde aus der Konfiguration " "entfernt." -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" @@ -10539,42 +10920,42 @@ msgstr "" "Submodul-Pfad '$displaypath' ist nicht initialisiert.\n" "Vielleicht möchten Sie 'update --init' benutzen?" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden." -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen" -#: git-submodule.sh:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "Rebase auf '$sha1' in Submodul-Pfad '$displaypath' nicht möglich" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" @@ -10582,75 +10963,101 @@ msgstr "" "Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' " "fehlgeschlagen" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken." -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 msgid "The --cached option cannot be used with the --files option" msgstr "" "Die Optionen --cached und --files können nicht gemeinsam verwendet werden." #. unexpected type -#: git-submodule.sh:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "unerwarteter Modus $mod_dst" -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_src" -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_dst" -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" " Warnung: $display_name beinhaltet nicht die Commits $sha1_src und $sha1_dst" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "Blob" -#: git-submodule.sh:1155 -msgid "Submodules changed but not updated:" -msgstr "Submodule geändert, aber nicht aktualisiert:" - -#: git-submodule.sh:1157 -msgid "Submodule changes to be committed:" -msgstr "Änderungen in Submodul zum Committen:" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'" -#: git-submodule.sh:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "Synchronisiere Submodul-URL für '$displaypath'" +#~ msgid "copied: %s -> %s" +#~ msgstr "kopiert: %s -> %s" + +#~ msgid "deleted: %s" +#~ msgstr "gelöscht: %s" + +#~ msgid "modified: %s" +#~ msgstr "geändert: %s" + +#~ msgid "renamed: %s -> %s" +#~ msgstr "umbenannt: %s -> %s" + +#~ msgid "unmerged: %s" +#~ msgstr "nicht zusammengeführt: %s" + +#~ msgid "input paths are terminated by a null character" +#~ msgstr "Eingabepfade sind durch ein NUL Zeichen abgeschlossen" + +#~ msgid "done\n" +#~ msgstr "Fertig\n" + +#~ msgid "" +#~ "The following untracked files would NOT be saved but need to be removed " +#~ "by stash save:" +#~ msgstr "" +#~ "Die folgenden unbeobachteten Dateien würden NICHT gespeichert werden,\n" +#~ "müssen aber durch \"stash save\" entfernt werden:" + +#~ msgid "" +#~ "Aborting. Consider using either the --force or --include-untracked option." +#~ msgstr "" +#~ "Abgebrochen. Benutzen Sie entweder die Option --force oder --include-" +#~ "untracked." + #~ msgid " (fix conflicts and then run \"git am --resolved\")" #~ msgstr "" #~ " (beheben Sie die Konflikte und führen Sie dann \"git am --resolved\" " @@ -10783,9 +11190,6 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'" #~ msgid "-B cannot be used with -b" #~ msgstr "-B kann nicht mit -b benutzt werden" -#~ msgid "--patch is incompatible with all other options" -#~ msgstr "--patch ist inkompatibel mit allen anderen Optionen" - #~ msgid "--detach cannot be used with -b/-B/--orphan" #~ msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden" @@ -53,6 +53,7 @@ # repository | dépôt # remote | distante (ou serveur distant) # revision | révision +# shallow | superficiel # shell | interpréteur de commandes # stash | remisage # to stash | remiser @@ -72,16 +73,15 @@ msgid "" msgstr "" "Project-Id-Version: git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2013-08-06 14:10+0800\n" -"PO-Revision-Date: 2013-10-05 21:17+0200\n" -"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n" +"POT-Creation-Date: 2014-02-01 08:06+0800\n" +"PO-Revision-Date: 2014-02-02 14:35+0100\n" +"Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n" "Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n<=1 ?0 : 1;\n" -"X-Generator: Poedit 1.5.4\n" #: advice.c:57 #, c-format @@ -123,71 +123,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <dépôt> [--exec <commande>] --list" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "le chemin '%s' ne correspond à aucun fichier" + +#: archive.c:327 msgid "fmt" msgstr "fmt" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "format d'archive" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" msgstr "préfixe" -#: archive.c:325 +#: archive.c:329 msgid "prepend prefix to each pathname in the archive" msgstr "préfixer chaque chemin de fichier dans l'archive" -#: archive.c:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "fichier" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "écrire l'archive dans ce fichier" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "lire .gitattributes dans le répertoire de travail" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "afficher les fichiers archivés sur stderr" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "stockage seulement" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "compression rapide" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "compression efficace" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "afficher les formats d'archive supportés" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "dépôt" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 msgid "retrieve the archive from remote repository <repo>" msgstr "récupérer l'archive depuis le dépôt distant <dépôt>" -#: archive.c:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "commande" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "chemin vers la commande distante git-upload-archive" @@ -275,19 +280,19 @@ msgstr "Une branche nommée '%s' existe déjà ." msgid "Cannot force update the current branch." msgstr "Impossible de forcer la mise à jour de la branche courante." -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "" "Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est " "pas une branche." -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "la branche amont demandée '%s' n'existe pas" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -307,87 +312,87 @@ msgstr "" "sa jumelle distante, vous souhaiterez utiliser \"git push -u\"\n" "pour paramétrer le suivi distant en même temps que vous poussez." -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "Nom d'objet invalide : '%s'." -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "Nom d'objet ambigu : '%s'." -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "Point d'embranchement invalide : '%s'." -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "Échec du verrouillage de la référence pour mise à jour" -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "Échec de l'écriture de la référence" -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "'%s' ne semble pas être un fichier bundle v2" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "en-tête non reconnu : %s%s (%d)" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "impossible d'ouvrir '%s'" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" msgstr "Le dépôt ne dispose pas des commits prérequis :" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "échec de la préparation du parcours des révisions" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "Le colis contient cette référence :" msgstr[1] "Le colis contient ces %d références :" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "Le colis enregistre l'historique complet." -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "Le colis exige cette référence :" msgstr[1] "Le colis exige ces %d références :" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "rev-list a disparu" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "argument non reconnu : %s" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "la référence '%s' est exclue par les options de rev-list" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "Refus de créer un colis vide." @@ -422,16 +427,16 @@ msgstr "%s %s n'est pas un commit !" msgid "memory exhausted" msgstr "plus de mémoire" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "Impossible de lancer 'git rev-list'" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "impossible d'écrire dans la rev-list : %s" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "impossible de fermer l'entrée standard du rev-list : %s" @@ -503,24 +508,29 @@ msgid_plural "%lu years ago" msgstr[0] "il y a %lu an" msgstr[1] "il y a %lu ans" -#: diff.c:112 +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "impossible de lire le fichier de commande '%s'" + +#: diff.c:113 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr "" " Impossible d'analyser le pourcentage de modification de dirstat '%s'\n" -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " Paramètre dirstat inconnu '%s'\n" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "" "Valeur inconnue pour la variable de configuration 'diff.submodule' : '%s'" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -529,7 +539,7 @@ msgstr "" "Erreurs dans la variable de configuration 'diff.dirstat' :\n" "%s" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -538,7 +548,7 @@ msgstr "" "Impossible d'analyser le paramètre de l'option --dirstat/-X :\n" "%s" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'" @@ -565,17 +575,17 @@ msgstr "impossible de créer un fichier temporaire '%s' : %s" msgid "failed writing detached signature to '%s': %s" msgstr "impossible d'écrire la signature détachée dans '%s' : %s" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "'%s' : lecture de %s impossible" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "'%s' : %s" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "'%s' : lecture tronquée %s" @@ -649,8 +659,8 @@ msgstr "%s: %s - %s" msgid "failed to read the cache" msgstr "impossible de lire le cache" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 msgid "unable to write new index file" msgstr "impossible d'écrire le nouveau fichier d'index" @@ -699,7 +709,7 @@ msgstr "impossible de lire l'objet %s '%s'" msgid "blob expected for %s '%s'" msgstr "blob attendu pour %s '%s'" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "échec à l'ouverture de '%s'" @@ -749,7 +759,7 @@ msgstr "" msgid "rename" msgstr "renommage" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "renommé" @@ -813,7 +823,7 @@ msgstr "l'objet %s n'est pas un blob" msgid "modify" msgstr "modification" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "modifié" @@ -835,7 +845,7 @@ msgstr "%s sauté (fusion identique à l'existant)" msgid "Auto-merging %s" msgstr "Fusion automatique de %s" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "sous-module" @@ -906,7 +916,7 @@ msgstr "la fusion n'a pas retourné de commit" msgid "Could not parse object '%s'" msgstr "Impossible d'analyser l'objet '%s'" -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "Impossible d'écrire l'index." @@ -931,58 +941,159 @@ msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)" msgid "Bad %s value: '%s'" msgstr "Mauvaise valeur de %s : '%s'" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "impossible d'analyser l'objet : %s" -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "..." -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "usage : %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr " ou : %s" -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "-NUM" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" +"les réglages de spécificateurs de chemin généraux 'glob' et 'noglob' sont " +"incompatibles" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" +"le réglage global de spécificateur de chemin 'literal' est incompatible avec " +"tous les autres réglages globaux de spécificateur de chemin" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "paramètre invalide pour le spécificateur magique de chemin 'prefix'" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "La spécification magique de chemin '%.*s' est invalide dans '%s'" + +#: pathspec.c:187 #, c-format -msgid "Path '%s' is in submodule '%.*s'" +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "')' manquante à la fin du spécificateur magique de chemin dans '%s'" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "Spécificateur magique '%c' non implémenté dans '%s'" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s : 'literal' et 'glob' sont incompatibles" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "%s : '%s' est hors du dépôt" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" msgstr "Le chemin '%s' est dans le sous-module '%.*s'" -#: pathspec.c:99 +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "" +"%s : le spécificateur magique de chemin n'est pas supporté par cette " +"commande : %s" + +#: pathspec.c:433 #, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "'%s' est au delà d'un lien symbolique" +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "le chemin '%s' est au-delà d'un lien symbolique" -#: remote.c:1788 +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +"Il n'y a rien dont il faut exclure par des motifs :(exclure).\n" +"Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "Impossible de récupérer à la fois %s et %s pour %s" + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "%s suit habituellement %s, pas %s" + +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "%s suit à la fois %s et %s" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "Erreur interne" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "Votre branche est basée sur '%s', mais la branche amont a disparu.\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (utilisez \"git branch --unset-upstream\" pour corriger)\n" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "Votre branche est à jour avec '%s'.\n" + +#: remote.c:1882 #, c-format msgid "Your branch is ahead of '%s' by %d commit.\n" msgid_plural "Your branch is ahead of '%s' by %d commits.\n" msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n" msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (utilisez \"git push\" pour publier vos commits locaux)\n" -#: remote.c:1797 +#: remote.c:1891 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -994,11 +1105,11 @@ msgstr[1] "" "Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour " "en avance rapide.\n" -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr " (utilisez \"git pull\" pour mettre à jour votre branche locale)\n" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -1013,7 +1124,7 @@ msgstr[1] "" "Votre branche et '%s' ont divergé,\n" "et ont %d et %d commits différents chacune respectivement.\n" -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr "" " (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n" @@ -1027,14 +1138,14 @@ msgstr "échec de l'ouverture de /dev/null" msgid "dup2(%d,%d) failed" msgstr "échec de dup2(%d,%d)" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "Impossible d'ouvrir '%s' en écriture" -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "Impossible d'écrire dans '%s'" @@ -1057,7 +1168,7 @@ msgstr "" "avec 'git add <chemins>' ou 'git rm <chemins>'\n" "puis validez le résultat avec 'git commit'" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "Impossible d'écrire dans %s" @@ -1077,47 +1188,47 @@ msgstr "Vos modifications locales seraient écrasées par revert." #: sequencer.c:268 msgid "Commit your changes or stash them to proceed." -msgstr "Validez vos modifications ou remisez-les pour continuer." +msgstr "Validez vos modifications ou les remiser pour continuer." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:324 +#: sequencer.c:325 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Impossible d'écrire le nouveau fichier index" -#: sequencer.c:355 +#: sequencer.c:356 msgid "Could not resolve HEAD commit\n" msgstr "Impossible de résoudre le commit HEAD\n" -#: sequencer.c:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "Impossible de mettre à jour l'arbre de cache\n" -#: sequencer.c:422 +#: sequencer.c:423 #, c-format msgid "Could not parse commit %s\n" msgstr "Impossible d'analyser le commit %s\n" -#: sequencer.c:427 +#: sequencer.c:428 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Impossible d'analyser le commit parent %s\n" -#: sequencer.c:493 +#: sequencer.c:494 msgid "Your index file is unmerged." msgstr "Votre fichier d'index n'est pas fusionné." -#: sequencer.c:512 +#: sequencer.c:513 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "Le commit %s est une fusion mais l'option -m n'a pas été spécifiée." -#: sequencer.c:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" msgstr "Le commit %s n'a pas le parent %d" -#: sequencer.c:524 +#: sequencer.c:525 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" @@ -1126,157 +1237,157 @@ msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:537 +#: sequencer.c:538 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s : impossible d'analyser le commit parent %s" -#: sequencer.c:541 +#: sequencer.c:542 #, c-format msgid "Cannot get commit message for %s" msgstr "Impossible d'obtenir un message de validation pour %s" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "impossible d'annuler %s... %s" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "impossible d'appliquer %s... %s" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" msgstr "l'ensemble de commits spécifié est vide" -#: sequencer.c:672 +#: sequencer.c:673 #, c-format msgid "git %s: failed to read the index" msgstr "git %s : échec à la lecture de l'index" -#: sequencer.c:677 +#: sequencer.c:678 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s : échec du rafraîchissement de l'index" -#: sequencer.c:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "Impossible de %s pendant un %s" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "Impossible d'analyser la ligne %d." -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." msgstr "Aucun commit analysé." -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "Impossible d'ouvrir %s" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "Impossible de lire %s." -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Feuille d'instruction inutilisable : %s" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "Clé invalide: %s" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "Valeur invalide pour %s : %s" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "Feuille d'options malformée : %s" -#: sequencer.c:850 +#: sequencer.c:851 msgid "a cherry-pick or revert is already in progress" msgstr "un picorage ou un retour est déjà en cours" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\"" -#: sequencer.c:855 +#: sequencer.c:856 #, c-format msgid "Could not create sequencer directory %s" msgstr "Impossible de créer le répertoire de séquenceur %s" -#: sequencer.c:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "Erreur lors de l'emballage de %s." -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "aucun picorage ou retour en cours" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "impossible de résoudre HEAD" -#: sequencer.c:894 +#: sequencer.c:895 msgid "cannot abort from a branch yet to be born" msgstr "impossible d'abandonner depuis une branche non encore créée" -#: sequencer.c:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "impossible d'ouvrir %s : %s" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "impossible de lire %s : %s" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" msgstr "fin de fichier inattendue" -#: sequencer.c:926 +#: sequencer.c:927 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu" -#: sequencer.c:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." msgstr "Impossible de formater %s." -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s : impossible de picorer un %s" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "%s : mauvaise révision" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" msgstr "Impossible d'annuler en tant que commit initial" -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "Impossible de picorer vers une HEAD vide" -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1301,261 +1412,348 @@ msgstr "" "message\n" "en lançant \"git config advice.objectNameWarning false\"" -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "HEAD ne pointe pas sur une branche" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "Branche inconnue : '%s'" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" msgstr "Aucune branche amont configurée pour la branche '%s'" -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "La branche amont '%s' n'est pas stockée comme branche de suivi" -#: wrapper.c:408 +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" +"Modification impossible de .gitmodules non fusionné, résolvez les conflits " +"d'abord" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "Impossible de trouver une section où path=%s dans .gitmodules" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "Impossible de mettre à jour l'élément %s de .gitmodules" + +# ici %s est un chemin +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "Impossible de supprimer l'élément de .gitmodules pour %s" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "impossible de trouver .gitmodules dans l'index" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "échec de la lecture du .gitmodules mis à jour" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "échec de stat du .gitmodules mis à jour" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "suppression du .gitmodules dans l'index impossible" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "échec de l'ajout du .gitmodules mis à jour" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "échec de la mise en index du .gitmodules mis à jour" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "Impossible de créer le lien git %s" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "Impossible de paramétrer core.worktree dans %s" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "séquence d'échappement %XX invalide" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "hôte manquant et le schéma n'est pas 'file:'" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "une URL 'file:' ne peut pas contenir de numéro de port" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "caractères invalides dans le nom d'hôte" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "numéro de port invalide" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "segment de chemin '..' invalide" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "impossible d'accéder à '%s' : %s" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "impossible d'accéder à '%s'" -#: wrapper.c:440 +#: wrapper.c:454 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "" "impossible de rechercher l'utilisateur actuel dans le fichier de mots de " "passe : %s" -#: wrapper.c:441 +#: wrapper.c:455 msgid "no such user" msgstr "utilisateur inconnu" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "Chemins non fusionnés :" -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr " (utilisez \"git reset %s <fichier>...\" pour désindexer)" -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr " (utilisez \"git rm --cached <fichier>...\" pour désindexer)" -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr " (utilisez \"git add <fichier>...\" pour marquer comme résolu)" -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" " (utilisez \"git add/rm <fichier>...\" si nécessaire pour marquer comme " "résolu)" -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr " (utilisez \"git rm <fichier>...\" pour marquer comme résolu)" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "Modifications qui seront validées :" -#: wt-status.c:207 +#: wt-status.c:216 msgid "Changes not staged for commit:" msgstr "Modifications qui ne seront pas validées :" -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr "" " (utilisez \"git add <fichier>...\" pour mettre à jour ce qui sera validé)" -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" " (utilisez \"git add/rm <fichier>...\" pour mettre à jour ce qui sera " "validé)" -#: wt-status.c:214 +#: wt-status.c:223 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" " (utilisez \"git checkout -- <fichier>...\" pour annuler les modifications " "dans la copie de travail)" -#: wt-status.c:216 +#: wt-status.c:225 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" " (valider ou annuler le contenu non suivi ou modifié dans les sous-modules)" -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" " (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "bogue" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "supprimé des deux côtés :" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "ajouté par nous :" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "supprimé par eux :" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "ajouté par eux :" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "supprimé par nous :" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "ajouté de deux côtés :" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "modifié des deux côtés :" -#: wt-status.c:286 +#: wt-status.c:275 +msgid "new file" +msgstr "nouveau fichier" + +#: wt-status.c:277 +msgid "copied" +msgstr "copié" + +#: wt-status.c:279 +msgid "deleted" +msgstr "supprimé" + +#: wt-status.c:285 +msgid "typechange" +msgstr "modif. type" + +#: wt-status.c:287 +msgid "unknown" +msgstr "inconnu" + +#: wt-status.c:289 +msgid "unmerged" +msgstr "non fusionné" + +#: wt-status.c:336 msgid "new commits, " msgstr "nouveaux commits, " -#: wt-status.c:288 +#: wt-status.c:338 msgid "modified content, " msgstr "contenu modifié, " -#: wt-status.c:290 +#: wt-status.c:340 msgid "untracked content, " msgstr "contenu non suivi, " -#: wt-status.c:307 -#, c-format -msgid "new file: %s" -msgstr "nouveau : %s" - -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" -msgstr "copié : %s -> %s" - -#: wt-status.c:313 -#, c-format -msgid "deleted: %s" -msgstr "supprimé : %s" - -#: wt-status.c:316 -#, c-format -msgid "modified: %s" -msgstr "modifié : %s" - -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" -msgstr "renommé : %s -> %s" - -#: wt-status.c:322 +#: wt-status.c:357 #, c-format -msgid "typechange: %s" -msgstr "nv type : %s" +msgid "bug: unhandled diff status %c" +msgstr "bogue : état de diff non géré %c" -#: wt-status.c:325 -#, c-format -msgid "unknown: %s" -msgstr "inconnu : %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "Sous-modules modifiés mais non mis à jour :" -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" -msgstr "non fus. : %s" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "Changements du sous-module à valider :" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "bogue : état de diff non géré %c" +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"Ne touchez pas à la ligne ci-dessus\n" +"Tout se qui suit sera éliminé." -#: wt-status.c:803 +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "Vous avez des chemins non fusionnés." -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" msgstr " (réglez les conflits puis lancez \"git commit\")" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "Tous les conflits sont réglés mais la fusion n'est pas terminée." -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr " (utilisez \"git commit\" pour terminer la fusion)" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." msgstr "Vous êtes au milieu d'une session am." -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "Le patch actuel est vide." -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr " (réglez les conflits puis lancez \"git am --continue\")" -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (utilisez \"git am --skip\" pour sauter ce patch)" -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr " (utilisez \"git am --abort\" pour restaurer la branche d'origine)" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'." -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 msgid "You are currently rebasing." msgstr "Vous êtes en train de rebaser." -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr " (réglez les conflits puis lancez \"git rebase --continue\")" -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (utilisez \"git rebase --skip\" pour sauter ce patch)" -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr " (utilisez \"git rebase --abort\" pour extraire la branche d'origine)" -#: wt-status.c:918 +#: wt-status.c:1014 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (tous les conflits sont réglés : lancez \"git rebase --continue\")" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." @@ -1563,119 +1761,120 @@ msgstr "" "Vous êtes actuellement en train de fractionner un commit pendant un rebasage " "de la branche '%s' sur '%s'." -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." msgstr "" "Vous êtes actuellement en train de fractionner un commit pendant un rebasage." -#: wt-status.c:930 +#: wt-status.c:1026 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr "" " (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" "Vous êtes actuellement en train d'éditer un commit pendant un rebasage de la " "branche '%s' sur '%s'." -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." msgstr "" "Vous êtes actuellement en train d'éditer un commit pendant un rebasage." -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr " (utilisez \"git commit --amend\" pour corriger le commit actuel)" -#: wt-status.c:944 +#: wt-status.c:1040 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr "" " (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos " "modifications)" -#: wt-status.c:954 -msgid "You are currently cherry-picking." -msgstr "Vous êtes actuellement en train de picorer." +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "Vous êtes actuellement en train de picorer le commit %s." -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr " (réglez les conflits puis lancez \"git cherry-pick --continue\")" -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" " (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")" -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr " (utilisez \"git cherry-pick --abort\" pour annuler le picorage)" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." msgstr "Vous êtes actuellement en train de rétablir le commit %s." -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr " (réglez les conflits puis lancez \"git revert --continue\")" -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (tous les conflits sont réglés : lancez \"git revert --continue\")" -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr " (utilisez \"git revert --abort\" pour annuler le rétablissement)" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "Vous êtes en cours de bissection, depuis la branche '%s'." -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." msgstr "Vous êtes en cours de bissection." -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr " (utilisez \"git bisect reset\" pour revenir à la branche d'origine)" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "Sur la branche " -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " msgstr "rebasage en cours ; sur " -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " msgstr "HEAD détachée sur " -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " msgstr "HEAD détachée depuis " -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "Actuellement sur aucun branche." -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" msgstr "Validation initiale" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "Fichiers non suivis" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "Fichiers ignorés" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1687,32 +1886,32 @@ msgstr "" "oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help " "status')." -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" msgstr "Fichiers non suivis non affichés%s" -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr " (utilisez -u pour afficher les fichiers non suivis)" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "Aucune modification" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" "aucune modification n'a été ajoutée à la validation (utilisez \"git add\" ou " "\"git commit -a\")\n" -#: wt-status.c:1251 +#: wt-status.c:1350 #, c-format msgid "no changes added to commit\n" msgstr "aucune modification ajoutée à la validation\n" -#: wt-status.c:1254 +#: wt-status.c:1353 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " @@ -1721,56 +1920,61 @@ msgstr "" "aucune modification ajoutée à la validation mais des fichiers non suivis " "sont présents (utilisez \"git add\" pour les suivre)\n" -#: wt-status.c:1257 +#: wt-status.c:1356 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "" "aucune modification ajoutée à la validation mais des fichiers non suivis " "sont présents\n" -#: wt-status.c:1260 +#: wt-status.c:1359 #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" "rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les " "suivre)\n" -#: wt-status.c:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" msgstr "rien à valider\n" -#: wt-status.c:1266 +#: wt-status.c:1365 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "rien à valider (utilisez -u pour afficher les fichiers non suivis)\n" -#: wt-status.c:1270 +#: wt-status.c:1369 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "rien à valider, la copie de travail est propre\n" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "HEAD (aucune branche)" -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " msgstr "Validation initiale sur " -#: wt-status.c:1399 +# à priori on parle d'une branche ici +#: wt-status.c:1514 +msgid "gone" +msgstr "disparue" + +#: wt-status.c:1516 msgid "behind " msgstr "derrière " -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "devant " -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr ", derrière " -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" msgstr "échec lors de l'unlink de '%s'" @@ -1859,7 +2063,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "status de diff inattendu %c" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "échec de la mise à jour des fichiers" @@ -1868,145 +2072,140 @@ msgstr "échec de la mise à jour des fichiers" msgid "remove '%s'\n" msgstr "suppression de '%s'\n" -#: builtin/add.c:253 +#: builtin/add.c:237 msgid "Unstaged changes after refreshing the index:" msgstr "Modifications non indexées après rafraîchissement de l'index :" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "le chemin '%s' ne correspond à aucun fichier" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "Impossible de lire l'index" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "Impossible d'ouvrir '%s' en écriture." -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "Impossible d'écrire le patch" -#: builtin/add.c:359 +#: builtin/add.c:319 #, c-format msgid "Could not stat '%s'" msgstr "Stat de '%s' impossible" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." msgstr "Patch vide. Abandon." -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" msgstr "Impossible d'appliquer '%s'" -#: builtin/add.c:377 +#: builtin/add.c:337 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" "Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n" -#: builtin/add.c:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "simuler l'action" -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "mode verbeux" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "sélection interactive" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" msgstr "sélection interactive des sections" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "édition du diff actuel et application" -#: builtin/add.c:400 +#: builtin/add.c:360 msgid "allow adding otherwise ignored files" msgstr "permettre l'ajout de fichiers ignorés" -#: builtin/add.c:401 +#: builtin/add.c:361 msgid "update tracked files" msgstr "mettre à jour les fichiers suivis" -#: builtin/add.c:402 +#: builtin/add.c:362 msgid "record only the fact that the path will be added later" msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard" -#: builtin/add.c:403 +#: builtin/add.c:363 msgid "add changes from all tracked and untracked files" msgstr "ajouter les modifications de tous les fichiers suivis et non suivis" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "" "ignorer les chemins effacés dans la copie de travail (identique à --no-all)" -#: builtin/add.c:408 +#: builtin/add.c:368 msgid "don't add, only refresh the index" msgstr "ne pas ajouter, juste rafraîchir l'index" -#: builtin/add.c:409 +#: builtin/add.c:369 msgid "just skip files which cannot be added because of errors" msgstr "" "sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait " "d'erreurs" -#: builtin/add.c:410 +#: builtin/add.c:370 msgid "check if - even missing - files are ignored in dry run" msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide" -#: builtin/add.c:432 +#: builtin/add.c:392 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "Utilisez -f si vous voulez réellement les ajouter.\n" -#: builtin/add.c:433 +#: builtin/add.c:393 msgid "no files added" msgstr "aucun fichier ajouté" -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "échec de l'ajout de fichiers" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "-A et -u sont mutuellement incompatibles" -#: builtin/add.c:496 +#: builtin/add.c:456 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "" "L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run" -#: builtin/add.c:526 +#: builtin/add.c:486 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "Rien de spécifié, rien n'a été ajouté.\n" -#: builtin/add.c:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Vous vouliez sûrement dire 'git add .' ?\n" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "fichier d'index corrompu" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 msgid "Unable to write new index file" msgstr "Impossible d'écrire le nouveau fichier d'index" @@ -2268,7 +2467,7 @@ msgstr "%s : le patch ne s'applique pas" msgid "Checking patch %s..." msgstr "Vérification du patch %s..." -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "échec de make_cache_entry pour le chemin '%s'" @@ -2350,8 +2549,8 @@ msgstr "entrée non reconnue" msgid "unable to read index file" msgstr "lecture du fichier d'index impossible" -#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "chemin" @@ -2413,7 +2612,7 @@ msgid "build a temporary index based on embedded index information" msgstr "" "construire un index temporaire fondé sur l'information de l'index embarqué" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "les chemins sont séparés par un caractère NUL" @@ -2547,108 +2746,108 @@ msgstr "effectuer 'git bisect next'" msgid "update BISECT_HEAD instead of checking out the current commit" msgstr "mettre à jour BISECT_HEAD au lieu d'extraire le commit actuel" -#: builtin/blame.c:26 +#: builtin/blame.c:27 msgid "git blame [options] [rev-opts] [rev] [--] file" msgstr "git blame [options] [options-de-révision] [rev] [--] fichier" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[options-de-révision] sont documentés dans git-rev-list(1)" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 msgid "Show blame entries as we find them, incrementally" msgstr "" "Montrer les éléments de blâme au fur et à mesure de leur découverte, de " "manière incrémentale" -#: builtin/blame.c:2277 +#: builtin/blame.c:2250 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "Montrer un SHA-1 blanc pour les commits de limite (Défaut : désactivé)" -#: builtin/blame.c:2278 +#: builtin/blame.c:2251 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "" "Ne pas traiter les commits racine comme des limites (Défaut : désactivé)" -#: builtin/blame.c:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "Montrer les statistiques de coût d'activité" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 msgid "Show output score for blame entries" msgstr "Montrer le score de sortie pour les éléments de blâme" -#: builtin/blame.c:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "Montrer les noms de fichier originaux (Défaut : auto)" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 msgid "Show in a format designed for machine consumption" msgstr "Afficher dans un format propice à la consommation par machine" -#: builtin/blame.c:2284 +#: builtin/blame.c:2257 msgid "Show porcelain format with per-line commit information" msgstr "Afficher en format porcelaine avec l'information de commit par ligne" -#: builtin/blame.c:2285 +#: builtin/blame.c:2258 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "Utiliser le même mode de sortie que git-annotate (Défaut : désactivé)" -#: builtin/blame.c:2286 +#: builtin/blame.c:2259 msgid "Show raw timestamp (Default: off)" msgstr "Afficher les horodatages bruts (Défaut : désactivé)" -#: builtin/blame.c:2287 +#: builtin/blame.c:2260 msgid "Show long commit SHA1 (Default: off)" msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 msgid "Suppress author name and timestamp (Default: off)" msgstr "Supprimer le nom de l'auteur et l'horodatage (Défaut : désactivé)" -#: builtin/blame.c:2289 +#: builtin/blame.c:2262 msgid "Show author email instead of name (Default: off)" msgstr "Afficher l'e-mail de l'auteur au lieu du nom (Défaut : désactivé)" -#: builtin/blame.c:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "Ignorer les différences d'espace" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 msgid "Spend extra cycles to find better match" msgstr "" "Dépenser des cycles supplémentaires pour trouver une meilleure correspondance" -#: builtin/blame.c:2292 +#: builtin/blame.c:2265 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "" "Utiliser les révisions du fichier <fichier> au lieu d'appeler git-rev-list" -#: builtin/blame.c:2293 +#: builtin/blame.c:2266 msgid "Use <file>'s contents as the final image" msgstr "Utiliser le contenu de <fichier> comme image finale" -#: builtin/blame.c:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "score" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 msgid "Find line copies within and across files" msgstr "Trouver les copies de ligne dans et entre les fichiers" -#: builtin/blame.c:2295 +#: builtin/blame.c:2268 msgid "Find line movements within and across files" msgstr "Trouver les mouvements de ligne dans et entre les fichiers" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "" "Traiter seulement l'intervalle de ligne n,m en commençant le compte à 1" @@ -2753,240 +2952,251 @@ msgstr "Branche %s supprimée (précédemment %s).\n" msgid "branch '%s' does not point at a commit" msgstr "la branche '%s' ne pointe pas sur un commit" -#: builtin/branch.c:453 +# féminin pour une branche +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: disparue]" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "[%s: en retard de %d]" -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "[en retard de %d]" -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "[%s : en avance de %d]" -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "[en avance de %d]" -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s : en avance de %d, en retard de %d]" -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "[en avance de %d, en retard de %d]" -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" msgstr " **** référence invalide ****" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "(aucune branche, rebasage de %s)" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(aucune branche, bisect a démarré sur %s)" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "(détaché de %s)" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "(aucune branche)" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" msgstr "l'objet '%s' ne pointe pas sur un commit" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "des références n'ont pas pu être lues" -#: builtin/branch.c:682 +#: builtin/branch.c:694 msgid "cannot rename the current branch while not on any." msgstr "impossible de renommer la branche actuelle, il n'y en a pas." -#: builtin/branch.c:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" msgstr "Nom de branche invalide : '%s'" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" msgstr "Échec de renommage de la branche" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "Renommage d'un branche mal nommée '%s'" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "La branche a été renommée en %s, mais HEAD n'est pas mise à jour !" -#: builtin/branch.c:722 +#: builtin/branch.c:734 msgid "Branch is renamed, but update of config-file failed" msgstr "" "La branche est renommée, mais la mise à jour du fichier de configuration a " "échoué" -#: builtin/branch.c:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "nom d'objet malformé %s" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, c-format msgid "could not write branch description template: %s" msgstr "impossible d'écrire le modèle de description de branche : %s" -#: builtin/branch.c:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "Options génériques" -#: builtin/branch.c:793 +#: builtin/branch.c:805 msgid "show hash and subject, give twice for upstream branch" msgstr "afficher le hachage et le sujet, doublé pour la branche amont" -#: builtin/branch.c:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "supprimer les messages d'information" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" msgstr "régler le mode de suivi (voir git-pull(1))" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" msgstr "modifier l'information amont" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "utiliser la coloration dans la sortie" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "agir sur les branches de suivi distantes" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "commit" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 msgid "print only branches that contain the commit" msgstr "afficher seulement les branches qui contiennent le commit" -#: builtin/branch.c:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "Actions spécifiques à git-branch :" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "afficher à la fois les branches de suivi et les branches locales" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "supprimer une branche totalement fusionnée" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "supprimer une branche (même non fusionnée)" -#: builtin/branch.c:823 +#: builtin/branch.c:835 msgid "move/rename a branch and its reflog" msgstr "déplacer/renommer une branche et son reflog" -#: builtin/branch.c:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" msgstr "déplacer/renommer une branche, même si la cible existe" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "afficher les noms des branches" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "créer le reflog de la branche" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "éditer la description de la branche" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" msgstr "forcer la création (même si la cible existe)" -#: builtin/branch.c:832 +#: builtin/branch.c:844 msgid "print only not merged branches" msgstr "afficher seulement les branches non fusionnées" -#: builtin/branch.c:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "afficher seulement les branches fusionnées" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "afficher les branches en colonnes" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "Échec de résolution de HEAD comme référence valide." -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "HEAD non trouvée sous refs/heads !" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" msgstr "--column et --verbose sont incompatibles" -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "le nom de branche est requis" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "Impossible de décrire une HEAD détachée" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "impossible d'éditer la description de plus d'une branche" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "Aucun commit sur la branche '%s'." -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "Aucune branche nommée '%s'." -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "trop de branches pour une opération de renommage" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" msgstr "trop de branches pour spécifier une branche amont" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." @@ -2994,41 +3204,41 @@ msgstr "" "impossible de spécifier une branche amont de HEAD par %s qui ne pointe sur " "aucune branche." -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "pas de branche '%s'" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" msgstr "la branche '%s' n'existe pas" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" msgstr "trop de branches pour désactiver un amont" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" "impossible de désactiver une branche amont de HEAD quand elle ne pointe sur " "aucune branche." -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" msgstr "La branche '%s' n'a aucune information de branche amont" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" msgstr "créer manuellement 'HEAD' n'a pas de sens" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" "les options -a et -r de 'git branch' n'ont pas de sens avec un nom de branche" -#: builtin/branch.c:996 +#: builtin/branch.c:1008 #, c-format msgid "" "The --set-upstream flag is deprecated and will be removed. Consider using --" @@ -3037,7 +3247,7 @@ msgstr "" "l'option --set-upstream est obsolète et va disparaître. Utilisez plutôt --" "track ou --set-upstream-to\n" -#: builtin/branch.c:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -3048,15 +3258,15 @@ msgstr "" "Si vous vouliez que '%s' suive '%s', faîtes ceci :\n" "\n" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" -msgstr " git branch -set-upstream-to %s\n" +msgstr " git branch --set-upstream-to %s\n" #: builtin/bundle.c:47 #, c-format @@ -3071,44 +3281,44 @@ msgstr "La création d'un colis requiert un dépôt." msgid "Need a repository to unbundle." msgstr "Le dépaquetage d'un colis requiert un dépôt." -#: builtin/cat-file.c:285 +#: builtin/cat-file.c:328 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" msgstr "git cat-file (-t|-s|-e|-p|<type>|--textconv) <objet>" -#: builtin/cat-file.c:286 +#: builtin/cat-file.c:329 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" msgstr "git cat-file (--batch|--batch-check) < <liste_d_objets>" -#: builtin/cat-file.c:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "<type> peut être : blob, tree, commit ou tag" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "afficher le type de l'objet" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "afficher la taille de l'objet" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 msgid "exit with zero when there's no error" msgstr "sortir avec un code d'erreur nul quand il n'y a aucune erreur" -#: builtin/cat-file.c:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "afficher avec mise en forme le contenu de l'objet" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 msgid "for blob objects, run textconv on object's content" msgstr "pour les objets blob, lancer textconv sur le contenu de l'objet" -#: builtin/cat-file.c:332 +#: builtin/cat-file.c:375 msgid "show info and content of objects fed from the standard input" msgstr "" "afficher l'information et le contenu des objets passés en entrée standard" -#: builtin/cat-file.c:335 +#: builtin/cat-file.c:378 msgid "show info about objects fed from the standard input" msgstr "afficher l'information des objets passés en entrée standard" @@ -3134,10 +3344,11 @@ msgid "read file names from stdin" msgstr "lire les noms de fichier depuis l'entrée standard" #: builtin/check-attr.c:23 builtin/check-ignore.c:24 -msgid "input paths are terminated by a null character" -msgstr "les chemins en entrée sont terminés par le caractère nul" +msgid "terminate input and output records by a NUL character" +msgstr "" +"terminer les enregistrements en entrée et en sortie par un caractère NUL" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "supprimer l'état d'avancement" @@ -3145,27 +3356,31 @@ msgstr "supprimer l'état d'avancement" msgid "show non-matching input paths" msgstr "afficher les chemins en entrée qui ne correspondent pas" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "ignorer l'index pendant la vérification" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "impossible de spécifier les chemins avec --stdin" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "-z n'a de sens qu'avec l'option --stdin" -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" msgstr "aucun chemin spécifié" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "--quiet n'est valide qu'avec un seul chemin" -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "impossible d'avoir --quiet et --verbose" -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "--non-matching n'est valide qu'avec --verbose" @@ -3240,108 +3455,108 @@ msgstr "git checkout [options] <branche>" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "git checkout [options] [<branche>] -- <fichier>..." -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, c-format msgid "path '%s' does not have our version" msgstr "le chemin '%s' n'a pas notre version" -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have their version" msgstr "le chemin '%s' n'a pas leur version" -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "le chemin '%s' n'a aucune des versions nécessaires" -#: builtin/checkout.c:179 +#: builtin/checkout.c:176 #, c-format msgid "path '%s' does not have necessary versions" msgstr "le chemin '%s' n'a pas les versions nécessaires" -#: builtin/checkout.c:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "chemin '%s' : impossible de fusionner" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, c-format msgid "Unable to add merge result for '%s'" msgstr "Impossible d'ajouter le résultat de fusion pour '%s'" -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, c-format msgid "'%s' cannot be used with updating paths" msgstr "'%s' ne peut pas être utilisé avec des mises à jour de chemins" -#: builtin/checkout.c:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" msgstr "'%s' ne peut pas être utilisé avec %s" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, c-format msgid "Cannot update paths and switch to branch '%s' at the same time." msgstr "" "Impossible de mettre à jour les chemins et basculer sur la branche '%s' en " "même temps." -#: builtin/checkout.c:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "fichier d'index corrompu" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "le chemin '%s' n'est pas fusionné" -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" msgstr "vous devez d'abord résoudre votre index courant" -#: builtin/checkout.c:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Impossible de faire un reflog pour '%s'\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "HEAD est maintenant sur" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "Remise à zéro de la branche '%s'\n" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "Déjà sur '%s'\n" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Basculement et remise à zéro de la branche '%s'\n" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Basculement sur la nouvelle branche '%s'\n" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "Basculement sur la branche '%s'\n" -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr " ... et %d en plus.\n" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3364,7 +3579,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3380,136 +3595,140 @@ msgstr "" "git branche nouvelle_branche %s\n" "\n" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "erreur interne lors du parcours des révisions" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" msgstr "La position précédente de HEAD était" -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 msgid "You are on a branch yet to be born" msgstr "Vous êtes sur une branche qui doit encore naître" -#. case (1) -#: builtin/checkout.c:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "une seule référence attendue, %d fournies." + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" msgstr "référence invalide : %s" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" msgstr "la référence n'est pas un arbre : %s" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 msgid "paths cannot be used with switching branches" msgstr "impossible d'utiliser des chemins avec un basculement de branches" -#: builtin/checkout.c:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "'%s' ne peut pas être utilisé avec un basculement de branches" -#: builtin/checkout.c:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "'%s' ne peut pas être utilisé avec '%s'" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "Impossible de basculer de branche vers '%s' qui n'est pas un commit" -#: builtin/checkout.c:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "branche" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "créer et extraire une nouvelle branche" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" msgstr "créer/réinitialiser et extraire une branche" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "créer un reflog pour une nouvelle branche" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 msgid "detach the HEAD at named commit" msgstr "détacher la HEAD à la validation nommée" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" msgstr "paramétrer l'information de branche amont pour une nouvelle branche" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "nouvelle branche" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" msgstr "nouvelle branche sans parent" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 msgid "checkout our version for unmerged files" msgstr "extraire notre version pour les fichiers non fusionnés" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1102 msgid "checkout their version for unmerged files" msgstr "extraire leur version pour les fichiers non fusionnés" -#: builtin/checkout.c:1068 +#: builtin/checkout.c:1104 msgid "force checkout (throw away local modifications)" msgstr "forcer l'extraction (laisser tomber les modifications locales)" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1105 msgid "perform a 3-way merge with the new branch" msgstr "effectuer une fusion à 3 points avec la nouvelle branche" -#: builtin/checkout.c:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "mettre à jour les fichiers ignorés (par défaut)" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "style" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" msgstr "style de conflit (fusion ou diff3)" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" msgstr "ne pas limiter les spécificateurs de chemins aux seuls éléments creux" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 msgid "second guess 'git checkout no-such-branch'" msgstr "deuxième chance 'git checkout branche-inexistante'" -#: builtin/checkout.c:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" msgstr "-b, -B et --orphan sont mutuellement exclusifs" -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "--track requiert un nom de branche" -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "Nom de branche manquant ; essayez -b" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "spécification de chemin invalide" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3519,12 +3738,12 @@ msgstr "" "en même temps.\n" "Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?" -#: builtin/checkout.c:1172 +#: builtin/checkout.c:1209 #, c-format msgid "git checkout: --detach does not take a path argument '%s'" msgstr "git checkout: --detach n'accepte pas un argument de chemin '%s'" -#: builtin/checkout.c:1176 +#: builtin/checkout.c:1213 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -3532,38 +3751,38 @@ msgstr "" "git checkout: --ours/--theirs, --force et --merge sont incompatibles lors\n" "de l'extraction de l'index." -#: builtin/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <motif>] [-x | -X] [--] <chemins>..." -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "Suppression de %s\n" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "Supprimerait %s\n" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "Ignore le dépôt %s\n" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "Ignorerait le dépôt %s\n" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "échec de la suppression de %s" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3575,7 +3794,7 @@ msgstr "" "foo - sélectionner un élément par un préfixe unique\n" " - (vide) ne rien sélectionner" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3595,35 +3814,35 @@ msgstr "" "* - choisir tous les éléments\n" " - (vide) terminer la sélection" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "Hein (%s) ?" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " msgstr "Entrez les motifs à ignorer>> " -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "Sélectionner les éléments à supprimer" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " msgstr "supprimer %s ? " -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "Au revoir." -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3641,21 +3860,21 @@ msgstr "" "help - cet écran\n" "? - aide pour la sélection en ligne" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "*** Commandes ***" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "Et maintenant ?" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "Supprimerait l'élément suivant :" msgstr[1] "Supprimerait les éléments suivants :" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "Plus de fichier à nettoyer, sortie." @@ -3675,8 +3894,8 @@ msgstr "nettoyage interactif" msgid "remove whole directories" msgstr "supprimer les répertoires entiers" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "motif" @@ -3716,8 +3935,8 @@ msgstr "" msgid "git clone [options] [--] <repo> [<dir>]" msgstr "git clone [options] [--] <dépôt> [<répertoire>]" -#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" msgstr "forcer l'état d'avancement" @@ -3729,123 +3948,133 @@ msgstr "ne pas créer d'extraction" msgid "create a bare repository" msgstr "créer un dépôt nu" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" msgstr "créer un dépôt miroir (implique dépôt nu)" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "pour cloner depuis un dépôt local" -#: builtin/clone.c:76 +#: builtin/clone.c:75 msgid "don't use local hardlinks, always copy" msgstr "ne pas utiliser de liens durs locaux, toujours copier" -#: builtin/clone.c:78 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "régler comme dépôt partagé" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 msgid "initialize submodules in the clone" msgstr "initialiser les sous-modules dans le clone" -#: builtin/clone.c:83 builtin/init-db.c:485 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" msgstr "répertoire-modèle" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 builtin/init-db.c:486 msgid "directory from which templates will be used" msgstr "répertoire depuis lequel les modèles vont être utilisés" -#: builtin/clone.c:86 +#: builtin/clone.c:85 msgid "reference repository" msgstr "dépôt de référence" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "nom" -#: builtin/clone.c:88 +#: builtin/clone.c:87 msgid "use <name> instead of 'origin' to track upstream" msgstr "utiliser <nom> au lieu de 'origin' pour suivre la branche amont" -#: builtin/clone.c:90 +#: builtin/clone.c:89 msgid "checkout <branch> instead of the remote's HEAD" msgstr "extraire <branche> au lieu de la HEAD du répertoire distant" -#: builtin/clone.c:92 +#: builtin/clone.c:91 msgid "path to git-upload-pack on the remote" msgstr "chemin vers git-upload-pack sur le serveur distant" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" msgstr "profondeur" -#: builtin/clone.c:94 +#: builtin/clone.c:93 msgid "create a shallow clone of that depth" msgstr "créer un clone superficiel de cette profondeur" -#: builtin/clone.c:96 +#: builtin/clone.c:95 msgid "clone only one branch, HEAD or --branch" msgstr "cloner seulement une branche, HEAD ou --branch" -#: builtin/clone.c:97 builtin/init-db.c:494 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr "gitdir" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 builtin/init-db.c:495 msgid "separate git dir from working tree" msgstr "séparer le répertoire git de la copie de travail" -#: builtin/clone.c:99 +#: builtin/clone.c:98 msgid "key=value" msgstr "clé=valeur" -#: builtin/clone.c:100 +#: builtin/clone.c:99 msgid "set config inside the new repository" msgstr "régler la configuration dans le nouveau dépôt" -#: builtin/clone.c:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "le dépôt de référence '%s' n'est pas un dépôt local." -#: builtin/clone.c:316 +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "le dépôt de référence '%s' est superficiel" + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "le dépôt de référence '%s' est greffé" + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "échec de la création du répertoire '%s'" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "échec du stat de '%s'" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "%s existe et n'est pas un répertoire" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" msgstr "échec du stat de %s\n" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "échec de la création du lien '%s'" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" msgstr "échec de la copie vers '%s'" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "fait.\n" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -3855,108 +4084,112 @@ msgstr "" "Vous pouvez inspecter ce qui a été extrait avec 'git status'\n" "et réessayer l'extraction avec 'git checkout -f HEAD'\n" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "Impossible de trouver la branche distante '%s' à cloner." -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " msgstr "Vérification de la connectivité... " -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "le serveur distant n'a pas envoyé tous les objets nécessaires" -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "fait\n" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" "la HEAD distante réfère à une référence non existante, impossible de " "l'extraire.\n" -#: builtin/clone.c:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "impossible d'extraire la copie de travail" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "Trop d'arguments." -#: builtin/clone.c:764 +#: builtin/clone.c:769 msgid "You must specify a repository to clone." msgstr "Vous devez spécifier un dépôt à cloner." -#: builtin/clone.c:775 +#: builtin/clone.c:780 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "les options --bare et --origin %s sont incompatibles." -#: builtin/clone.c:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "--bare et --separate-git-dir sont incompatibles." -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "le dépôt '%s' n'existe pas" -#: builtin/clone.c:796 +#: builtin/clone.c:802 msgid "--depth is ignored in local clones; use file:// instead." msgstr "" "--depth est ignoré dans les clones locaux : utilisez plutôt \"file://\"." -#: builtin/clone.c:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "le dépôt source est superficiel, option --local ignorée" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "--local est ignoré" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "la profondeur %s n'est pas un entier positif" + +#: builtin/clone.c:824 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "" "le chemin de destination '%s' existe déjà et n'est pas un répertoire vide." -#: builtin/clone.c:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "la copie de travail '%s' existe déjà ." -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, c-format msgid "could not create leading directories of '%s'" msgstr "impossible de créer les répertoires de premier niveau dans '%s'" -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, c-format msgid "could not create work tree dir '%s'." msgstr "impossible de créer le répertoire de la copie de travail '%s'." -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Clonage dans le dépôt nu '%s'\n" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "Clonage dans '%s'...\n" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, c-format msgid "Don't know how to clone %s" msgstr "Je ne sais pas cloner %s" -#: builtin/clone.c:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "La branche distante %s n'a pas été trouvée dans le dépôt amont %s" -#: builtin/clone.c:949 +#: builtin/clone.c:968 msgid "You appear to have cloned an empty repository." msgstr "Vous semblez avoir cloné un dépôt vide." @@ -3992,15 +4225,15 @@ msgstr "Remplissage d'espace entre les colonnes" msgid "--command must be the first argument" msgstr "--command doit être le premier argument" -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." msgstr "git commit [options] [--] <spécification-de-chemin>..." -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." msgstr "git status [options] [--] <spécification-de-chemin>..." -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -4026,7 +4259,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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" @@ -4037,7 +4270,7 @@ msgstr "" "vide. Vous pouvez répéter votre commande avec --allow-empty, ou vous pouvez\n" "supprimer complètement le commit avec \"git reset HEAD^\".\n" -#: builtin/commit.c:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -4052,11 +4285,11 @@ msgstr "" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "Sinon, veuillez utiliser 'git reset'\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -4072,93 +4305,93 @@ msgstr "" "Puis \"git cherry-pick --continue\" continuera le picorage \n" "des commits restants.\n" -#: builtin/commit.c:279 +#: builtin/commit.c:287 msgid "failed to unpack HEAD tree object" msgstr "échec du dépaquetage de l'objet arbre HEAD" -#: builtin/commit.c:321 +#: builtin/commit.c:329 msgid "unable to create temporary index" msgstr "impossible de créer l'index temporaire" -#: builtin/commit.c:327 +#: builtin/commit.c:335 msgid "interactive add failed" msgstr "échec de l'ajout interactif" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 msgid "unable to write new_index file" msgstr "impossible d'écrire le fichier new_index" -#: builtin/commit.c:412 +#: builtin/commit.c:420 msgid "cannot do a partial commit during a merge." msgstr "impossible de faire une validation partielle pendant une fusion." -#: builtin/commit.c:414 +#: builtin/commit.c:422 msgid "cannot do a partial commit during a cherry-pick." msgstr "impossible de faire une validation partielle pendant un picorage." -#: builtin/commit.c:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "impossible de lire l'index" -#: builtin/commit.c:444 +#: builtin/commit.c:452 msgid "unable to write temporary index file" msgstr "impossible d'écrire le fichier d'index temporaire" -#: builtin/commit.c:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" msgstr "commit invalide : %s" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" msgstr "paramètre --author mal formé" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "Chaîne ident mal formée : '%s'" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, c-format msgid "could not lookup commit %s" msgstr "impossible de rechercher le commit %s" -#: builtin/commit.c:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, c-format msgid "(reading log message from standard input)\n" msgstr "(lecture du message de journal depuis l'entrée standard)\n" -#: builtin/commit.c:635 +#: builtin/commit.c:644 msgid "could not read log from standard input" msgstr "impossible de lire le journal depuis l'entrée standard" -#: builtin/commit.c:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "impossible de lire le fichier de journal '%s'" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" msgstr "le commit a un message vide" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "impossible de lire MERGE_MSG" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "impossible de lire SQUASH_MSG" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "impossible de lire '%s'" -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" msgstr "impossible d'écrire le modèle de commit" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -4173,7 +4406,7 @@ msgstr "" "\t%s\n" "et essayez à nouveau.\n" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -4188,7 +4421,7 @@ msgstr "" "\t%s\n" "et essayez à nouveau.\n" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4198,7 +4431,7 @@ msgstr "" "commençant par '%c' seront ignorées, et un message vide abandonne la " "validation.\n" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4209,142 +4442,142 @@ msgstr "" "commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n" "si vous le souhaitez. Un message vide abandonne la validation.\n" -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "%sAuteur : %s" -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" msgstr "%sValidateur : %s" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" msgstr "Impossible de lire l'index" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "Erreur lors de la construction des arbres" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Veuillez fournir le message en utilisant l'option -m ou -F.\n" -#: builtin/commit.c:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "Aucun auteur existant trouvé avec '%s'" -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Mode de fichier non suivi invalide '%s'" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "--long et -z sont incompatibles" -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 msgid "Using both --reset-author and --author does not make sense" msgstr "L'utilisation simultanée de --reset-author et --author n'a pas de sens" -#: builtin/commit.c:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." msgstr "Il n'y a rien à corriger." -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 msgid "You are in the middle of a merge -- cannot amend." msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)." -#: builtin/commit.c:1055 +#: builtin/commit.c:1080 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "Vous êtes en plein picorage -- impossible de corriger (amend)." -#: builtin/commit.c:1058 +#: builtin/commit.c:1083 msgid "Options --squash and --fixup cannot be used together" msgstr "Les options --squash et --fixup ne peuvent pas être utilisées ensemble" -#: builtin/commit.c:1068 +#: builtin/commit.c:1093 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Une seule option parmi -c/-C/-F/--fixup peut être utilisée." -#: builtin/commit.c:1070 +#: builtin/commit.c:1095 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "L'option -m ne peut pas être combinée avec -c/-C/-F/--fixup." -#: builtin/commit.c:1078 +#: builtin/commit.c:1103 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author ne peut être utilisé qu'avec -C, -c ou --amend." -#: builtin/commit.c:1095 +#: builtin/commit.c:1120 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Une seule option parmi --include/--only/--all/--interactive/--patch peut " "être utilisée." -#: builtin/commit.c:1097 +#: builtin/commit.c:1122 msgid "No paths with --include/--only does not make sense." msgstr "Aucun chemin avec les options --include/--only n'a pas de sens." -#: builtin/commit.c:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." msgstr "Malin... correction du dernier avec un index sale." -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "Chemins explicites spécifiés sans -i ni -o ; --only supposé..." -#: builtin/commit.c:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "Mode de nettoyage invalide %s" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 msgid "Paths with -a does not make sense." msgstr "Spécifier des chemins avec l'option -a n'a pas de sens." -#: builtin/commit.c:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "afficher le statut avec concision" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "afficher l'information de branche" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "sortie pour traitement automatique" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "afficher le statut en format long (par défaut)" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "terminer les éléments par NUL" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "mode" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" "afficher les fichiers non suivis, \"mode\" facultatif : all (tous), normal, " "no. (Défaut : all)" -#: builtin/commit.c:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "afficher les fichiers ignorés" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "quand" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -4352,217 +4585,217 @@ msgstr "" "ignorer les modifications dans les sous-modules, \"quand\" facultatif : all " "(tous), dirty (sale), untracked (non suivi). (Défaut : all)" -#: builtin/commit.c:1242 +#: builtin/commit.c:1271 msgid "list untracked files in columns" msgstr "afficher les fichiers non suivis en colonnes" -#: builtin/commit.c:1313 +#: builtin/commit.c:1340 msgid "couldn't look up newly created commit" msgstr "impossible de retrouver le commit nouvellement créé" -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "impossible d'analyser le commit nouvellement créé" -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "HEAD détachée" -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr " (commit racine)" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 msgid "suppress summary after successful commit" msgstr "supprimer le résumé après une validation réussie" -#: builtin/commit.c:1426 +#: builtin/commit.c:1453 msgid "show diff in commit message template" msgstr "afficher les diff dans le modèle de message de validation" -#: builtin/commit.c:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "Options du message de validation" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "lire le message depuis un fichier" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "auteur" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "remplacer l'auteur pour la validation" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "date" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" msgstr "remplacer la date pour la validation" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" msgstr "message" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" msgstr "message de validation" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 msgid "reuse and edit message from specified commit" msgstr "réutiliser et éditer le message du commit spécifié" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" msgstr "réutiliser le message du commit spécifié" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "utiliser un message formaté par autosquash pour corriger le commit spécifié" -#: builtin/commit.c:1436 +#: builtin/commit.c:1463 msgid "use autosquash formatted message to squash specified commit" msgstr "" "utiliser un message formaté par autosquash pour compresser le commit spécifié" -#: builtin/commit.c:1437 +#: builtin/commit.c:1464 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "" "à présent je suis l'auteur de la validation (utilisé avec -C/-c/--amend)" -#: builtin/commit.c:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "ajouter une entrée Signed-off-by :" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "utiliser le fichier de modèle spécifié" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "forcer l'édition du commit" -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "défaut" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 msgid "how to strip spaces and #comments from message" msgstr "comment éliminer les espaces et les commentaires # du message" -#: builtin/commit.c:1442 +#: builtin/commit.c:1469 msgid "include status in commit message template" msgstr "inclure le statut dans le modèle de message de validation" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" msgstr "identifiant de clé" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" msgstr "signer la validation avec GPG" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "Valider les options des contenus" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "valider tous les fichiers modifiés" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 msgid "add specified files to index for commit" msgstr "ajouter les fichiers spécifiés à l'index pour la validation" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "ajouter des fichiers en mode interactif" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "ajouter les modifications en mode interactif" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "valider seulement les fichiers spécifiés" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "éviter d'utiliser le crochet pre-commit" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "afficher ce qui serait validé" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" msgstr "corriger la validation précédente" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "éviter d'utiliser le crochet post-rewrite" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "accepter d'enregistrer une modification vide" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 msgid "ok to record a change with an empty message" msgstr "accepter d'enregistrer une modification avec un message vide" -#: builtin/commit.c:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "impossible d'analyser le commit HEAD" -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "impossible d'ouvrir '%s' en lecture" -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Fichier MERGE_HEAD corrompu (%s)" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "impossible de lire MERGE_MODE" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, c-format msgid "could not read commit message: %s" msgstr "impossible de lire le message de validation : %s" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Abandon de la validation ; vous n'avez pas édité le message\n" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Abandon de la validation du à un message de validation vide\n" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" msgstr "échec de l'écriture de l'objet commit" -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "impossible de verrouiller la référence HEAD" -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "impossible de mettre à jour la référence HEAD" -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4572,128 +4805,132 @@ msgstr "" "new_index. Vérifiez que le disque n'est pas plein ou que le quota\n" "n'a pas été dépassé, puis lancez \"git reset HEAD\" pour réparer." -#: builtin/config.c:7 +#: builtin/config.c:8 msgid "git config [options]" msgstr "git config [options]" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "Emplacement du fichier de configuration" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" msgstr "utiliser les fichier de configuration global" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "utiliser le fichier de configuration du système" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "utiliser le fichier de configuration du dépôt" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "utiliser le fichier de configuration spécifié" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "blob-id" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "lire la configuration depuis l'objet blob fourni" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "Action" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "obtenir la valeur : nom [regex-de-valeur]" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "obtenir toutes le valeurs : clé [regex-de-valeur]" -#: builtin/config.c:61 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "obtenir les valeur pour la regexp : regex-de-nom [regex-de-valeur]" -#: builtin/config.c:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "obtenir la valeur spécifique pour l'URL : section[.var] URL" + +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "" "remplacer toutes les variables correspondant : nom valeur [regex-de-valeur]" -#: builtin/config.c:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "ajouter une nouvelle variable : nom valeur" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "supprimer une variable : nom [regex-de-valeur]" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "supprimer toutes les correspondances nom [regex-de-valeur]" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "renommer une section : ancien-nom nouveau-nom" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "supprimer une section : nom" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "afficher tout" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "ouvrir un éditeur" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "emplacement" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "trouver la couleur configurée : [par défaut]" -#: builtin/config.c:71 +#: builtin/config.c:74 msgid "find the color setting: [stdout-is-tty]" msgstr "trouver le réglage de la couleur : [stdout-est-tty]" -#: builtin/config.c:72 +#: builtin/config.c:75 msgid "Type" msgstr "Type" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "la valeur est \"true\" (vrai) our \"false\" (faux)" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "la valeur est un nombre décimal" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "la valeur est --bool ou --int" -#: builtin/config.c:76 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "la valeur est un chemin (vers un fichier ou un répertoire)" -#: builtin/config.c:77 +#: builtin/config.c:80 msgid "Other" msgstr "Autre" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "terminer les valeurs avec un caractère NUL" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "respecter les directives d'inclusion lors de la recherche" @@ -4705,7 +4942,7 @@ msgstr "git count-objects [-v] [-H | --human-readable]" msgid "print sizes in human readable format" msgstr "affiche les tailles dans un format humainement lisible" -#: builtin/describe.c:15 +#: builtin/describe.c:16 msgid "git describe [options] <commit-ish>*" msgstr "git describe [options] <commit ou apparenté>*" @@ -4823,7 +5060,7 @@ msgstr "" msgid "only consider tags matching <pattern>" msgstr "ne considérer que les étiquettes correspondant à <motif>" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "afficher les objets commits abrégés en dernier recours" @@ -4843,35 +5080,35 @@ msgstr "--long et --abbrev=0 sont incompatibles" msgid "No names found, cannot describe anything." msgstr "aucun nom trouvé, impossible de décrire quoi que ce soit." -#: builtin/describe.c:481 +#: builtin/describe.c:489 msgid "--dirty is incompatible with commit-ishes" msgstr "--dirty est incompatible avec la spécification de commits ou assimilés" -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, c-format msgid "'%s': not a regular file or symlink" msgstr "'%s' : n'est pas un fichier régulier ni un lien symbolique" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" msgstr "option invalide : %s" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "Ce n'est pas un dépôt git !" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "objet spécifié '%s' invalide." -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "plus de deux blobs spécifiés : '%s'" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "objet non géré '%s' spécifié." @@ -4880,40 +5117,40 @@ msgstr "objet non géré '%s' spécifié." msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [options-de-liste-de-révisions]" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "afficher la progression après <n> objets" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "sélectionner la gestion des étiquettes signées" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 msgid "select handling of tags that tag filtered objects" msgstr "" "sélectionner la gestion des étiquettes qui pointent sur des objets filtrés" -#: builtin/fast-export.c:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "Enregistrer les marques dans ce fichier" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "importer les marques depuis ce fichier" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 msgid "Fake a tagger when tags lack one" msgstr "falsifier un auteur d'étiquette si l'étiquette n'en présente pas" -#: builtin/fast-export.c:680 +#: builtin/fast-export.c:687 msgid "Output full tree for each commit" msgstr "Afficher l'arbre complet pour chaque commit" -#: builtin/fast-export.c:682 +#: builtin/fast-export.c:689 msgid "Use the done feature to terminate the stream" msgstr "Utiliser la fonction \"done\" pour terminer le flux" -#: builtin/fast-export.c:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "Sauter l'affichage de données de blob" @@ -4933,146 +5170,156 @@ msgstr "git fetch --multiple [<options>] [(<dépôt> | <groupe>)...]" msgid "git fetch --all [<options>]" msgstr "git fetch --all [<options>]" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "récupérer depuis tous le dépôts distants" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "ajouter à .git/FETCH_HEAD au lieu de l'écraser" -#: builtin/fetch.c:64 +#: builtin/fetch.c:79 msgid "path to upload pack on remote end" msgstr "chemin vers lequel télécharger le paquet sur le poste distant" -#: builtin/fetch.c:65 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "forcer l'écrasement de la branche locale" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "récupérer depuis plusieurs dépôts distants" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "récupérer toutes les étiquettes et leurs objets associés" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "ne pas récupérer toutes les étiquettes (--no-tags)" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 msgid "prune remote-tracking branches no longer on remote" msgstr "" "éliminer les branches de suivi distant si la branche n'existe plus dans le " "dépôt distant" -#: builtin/fetch.c:74 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "à la demande" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "contrôler la récupération récursive dans les sous-modules" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "conserver le paquet téléchargé" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "permettre la mise à jour de la référence HEAD" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" msgstr "approfondir l'historique d'un clone superficiel" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "convertir en un dépôt complet" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "dir" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 msgid "prepend this to submodule path output" msgstr "préfixer ceci à la sortie du chemin du sous-module" -#: builtin/fetch.c:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "mode par défaut pour la récursion" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "accepter les références qui mettent à jour .git/shallow" + +#: builtin/fetch.c:347 msgid "Couldn't find remote ref HEAD" msgstr "impossible de trouver la référence HEAD distante" -#: builtin/fetch.c:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "objet %s non trouvé" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "[à jour]" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (impossible de récupérer la branche actuelle)" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "[rejeté]" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "[mise à jour de l'étiquette]" -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr " (impossible de mettre à jour la référence locale)" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "[nouvelle étiquette]" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "[nouvelle branche]" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "[nouvelle référence]" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "impossible de mettre à jour la référence locale" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "mise à jour forcée" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "(pas d'avance rapide)" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "impossible d'ouvrir %s : %s\n" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s n'a pas envoyé tous les objets nécessaires\n" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "" +"%s rejeté parce que les racines superficielles ne sont pas mises à jour" + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "Depuis %.*s\n" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -5081,55 +5328,55 @@ msgstr "" "des références locales n'ont pas pu être mises à jour ; essayez de lancer\n" " 'git remote prune %s' pour supprimer des branches anciennes en conflit" -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr " (%s sera en suspens)" -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr " (%s est devenu en suspens)" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "[supprimé]" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "(aucun(e))" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "Refus de récupérer dans la branche courant %s d'un dépôt non nu" -#: builtin/fetch.c:742 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "Je ne sais pas récupérer depuis %s" - -#: builtin/fetch.c:823 +#: builtin/fetch.c:794 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "La valeur \"%2$s\" de l'option \"%1$s\" est invalide pour %3$s" -#: builtin/fetch.c:826 +#: builtin/fetch.c:797 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "L'option \"%s\" est ignorée pour %s\n" -#: builtin/fetch.c:928 +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "Je ne sais pas récupérer depuis %s" + +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "Récupération de %s\n" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "Impossible de récupérer %s" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -5137,32 +5384,32 @@ msgstr "" "Aucun dépôt distant spécifié. Veuillez spécifier une URL ou un nom\n" "distant depuis lesquels les nouvelles révisions devraient être récupérées." -#: builtin/fetch.c:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "Vous devez spécifier un nom d'étiquette." -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "--depth et --unshallow ne peuvent pas être utilisés ensemble" -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "--unshallow sur un dépôt complet n'a pas de sens" -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "fetch --all n'accepte pas d'argument de dépôt" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all n'a pas de sens avec des spécifications de référence" -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, c-format msgid "No such remote or remote group: %s" msgstr "distant ou groupe distant inexistant : %s" -#: builtin/fetch.c:1057 +#: builtin/fetch.c:1153 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" "La récupération d'un groupe et les spécifications de référence n'ont pas de " @@ -5173,9 +5420,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" msgstr "" "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <fichier>]" -#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "n" @@ -5199,118 +5447,124 @@ msgstr "utiliser <texte> comme début de message" msgid "file to read from" msgstr "fichier d'où lire" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 msgid "git for-each-ref [options] [<pattern>]" msgstr "git for-each-ref [options] [<motif>]" -#: builtin/for-each-ref.c:994 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "échapper les champs réservés pour les interpréteurs de commandes" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "échapper les champs réservés pour perl" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "échapper les champs réservés pour python" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "échapper les champs réservés pour tcl" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "n'afficher que <n> références correspondant" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "format" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "format à utiliser pour la sortie" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "clé" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "nom du champ servant à trier" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "git fsck [options] [<objet>...]" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "afficher les objets inaccessibles" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "afficher les objets en suspens" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "afficher les étiquettes" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "signaler les nÅ“uds racines" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "considérer les objets de l'index comme nÅ“uds tête" # translated from man page -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "considérer les reflogs comme nÅ“uds tête (par défaut)" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 msgid "also consider packs and alternate objects" msgstr "inspecter aussi les objets pack et alternatifs" -#: builtin/fsck.c:621 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "activer une vérification plus strict" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 msgid "write dangling objects in .git/lost-found" msgstr "écrire les objets en suspens dans .git/lost-found" -#: builtin/fsck.c:624 builtin/prune.c:134 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "afficher la progression" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "git gc [options]" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "%s invalide : '%s'" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, c-format msgid "insanely long object directory %.*s" msgstr "objet répertoire démentiellement long %.*s" -#: builtin/gc.c:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "éliminer les objets non référencés" -#: builtin/gc.c:181 +#: builtin/gc.c:264 msgid "be more thorough (increased runtime)" msgstr "être plus consciencieux (durée de traitement allongée)" -#: builtin/gc.c:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "activer le mode auto-gc" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "" +"forcer le lancement du ramasse-miettes même si un autre ramasse-miettes " +"tourne déjà " + +#: builtin/gc.c:306 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -5321,43 +5575,52 @@ msgstr "" "lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus " "d'information.\n" -#: builtin/gc.c:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"un ramasse-miettes est déjà en cours sur la machine '%s' pid %<PRIuMAX> " +"(utilisez --force si ce n'est pas le cas)" + +#: builtin/gc.c:341 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" "Il y a trop d'objets seuls inaccessibles ; lancez 'git prune' pour les " "supprimer." -#: builtin/grep.c:22 +#: builtin/grep.c:23 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [options] [-e] <motif> [<révision>...] [[--] <chemin>...]" -#: builtin/grep.c:217 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep : échec de création du fil: %s" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "Échec de chdir: %s" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "impossible de lire l'arbre (%s)" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, c-format msgid "unable to grep from object of type %s" msgstr "impossible de faire un grep sur un objet de type %s" -#: builtin/grep.c:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "l'option '%c' attend un valeur numérique" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "impossible d'ouvrir '%s'" @@ -5399,167 +5662,171 @@ msgid "don't match patterns in binary files" msgstr "ne pas chercher les motifs dans les fichiers binaires" #: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "traiter les fichiers binaires avec les filtres textconv" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "descendre au plus de <profondeur> dans l'arborescence" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "utiliser des expressions régulières étendues POSIX" -#: builtin/grep.c:669 +#: builtin/grep.c:671 msgid "use basic POSIX regular expressions (default)" msgstr "utiliser des expressions régulières basiques POSIX (par défaut)" -#: builtin/grep.c:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "interpréter les motifs comme de chaînes fixes" -#: builtin/grep.c:675 +#: builtin/grep.c:677 msgid "use Perl-compatible regular expressions" msgstr "utiliser des expressions régulières compatibles avec Perl" -#: builtin/grep.c:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "afficher les numéros de ligne" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "ne pas pas afficher les noms de fichier" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "afficher les noms de fichier" -#: builtin/grep.c:682 +#: builtin/grep.c:684 msgid "show filenames relative to top directory" msgstr "afficher les noms de fichiers relativement au répertoire de base" -#: builtin/grep.c:684 +#: builtin/grep.c:686 msgid "show only filenames instead of matching lines" msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant" -#: builtin/grep.c:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "synonyme pour --files-with-matches" -#: builtin/grep.c:689 +#: builtin/grep.c:691 msgid "show only the names of files without match" msgstr "n'afficher que les noms des fichiers sans correspondance" -#: builtin/grep.c:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "imprimer une caractère NUL après le noms de fichier" -#: builtin/grep.c:693 +#: builtin/grep.c:695 msgid "show the number of matches instead of matching lines" msgstr "afficher le nombre de correspondances au lieu des lignes correspondant" -#: builtin/grep.c:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "mettre en évidence les correspondances" -#: builtin/grep.c:696 +#: builtin/grep.c:698 msgid "print empty line between matches from different files" msgstr "" "imprimer une ligne vide entre les correspondances de fichiers différents" -#: builtin/grep.c:698 +#: builtin/grep.c:700 msgid "show filename only once above matches from same file" msgstr "" "afficher le nom de fichier une fois au dessus des correspondances du même " "fichier" -#: builtin/grep.c:701 +#: builtin/grep.c:703 msgid "show <n> context lines before and after matches" msgstr "afficher <n> lignes de contexte avant et après les correspondances" -#: builtin/grep.c:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "afficher <n> lignes de contexte avant les correspondances" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "afficher <n> lignes de contexte après les correspondances" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" msgstr "raccourci pour -C NUM" -#: builtin/grep.c:710 +#: builtin/grep.c:712 msgid "show a line with the function name before matches" msgstr "" "afficher une ligne avec le nom de la fonction avant les correspondances" -#: builtin/grep.c:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "afficher la fonction contenante" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "lire les motifs depuis fichier" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "rechercher <motif>" -#: builtin/grep.c:719 +#: builtin/grep.c:721 msgid "combine patterns specified with -e" msgstr "combiner les motifs spécifiés par -e" -#: builtin/grep.c:731 +#: builtin/grep.c:733 msgid "indicate hit with exit status without output" msgstr "" "indiquer des correspondances avec le code de sortie mais sans rien afficher" -#: builtin/grep.c:733 +#: builtin/grep.c:735 msgid "show only matches from files that match all patterns" msgstr "" "n'afficher que les correspondances de fichiers qui correspondent à tous les " "motifs" -#: builtin/grep.c:735 +#: builtin/grep.c:737 msgid "show parse tree for grep expression" msgstr "afficher l'arbre d'analyse pour le motif grep" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "pager" msgstr "pagineur" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "show matching files in the pager" msgstr "afficher les fichiers correspondant dans le pagineur" -#: builtin/grep.c:742 +#: builtin/grep.c:744 msgid "allow calling of grep(1) (ignored by this build)" msgstr "permettre l'appel de grep(1) (ignoré par ce build)" -#: builtin/grep.c:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "afficher l'usage" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "aucun motif fourni." -#: builtin/grep.c:865 +#: builtin/grep.c:870 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager ne fonctionne que sur la copie de travail" -#: builtin/grep.c:888 +#: builtin/grep.c:893 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached ou --untracked ne peuvent pas être utilisés avec --no-index." -#: builtin/grep.c:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "--no-index ou --untracked ne peuvent pas être utilisés avec des révisions." -#: builtin/grep.c:896 +#: builtin/grep.c:901 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" "--[no-]exclude-standard ne peut pas être utilisé avec du contenu suivi." -#: builtin/grep.c:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "--cached et des arbres sont fournis en même temps." @@ -5664,58 +5931,58 @@ msgstr "" "'%s' : chemin pour l'utilitaire de visualisation de manuel supporté.\n" "Veuillez utiliser plutôt 'man.<outil>.cmd'." -#: builtin/help.c:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "'%s' : visualiseur de manuel inconnu." -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "aucun visualiseur de manuel n'a pris en charge la demande" -#: builtin/help.c:374 +#: builtin/help.c:378 msgid "no info viewer handled the request" msgstr "aucun visualiseur de 'info' n'a pris en charge la demande" -#: builtin/help.c:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "Définition des attributs par chemin" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "Un glossaire Git" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "Spécifie les fichiers non-suivis à ignorer intentionnellement" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "Définition des propriétés de sous-module" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "Spécification des révisions et portées pour Git" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "" "Une introduction pratique à Git (pour les versions 1.5.1 et supérieures)" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "Un aperçu des flux de travail recommandés avec Git" -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "Les guides Git populaires sont : \n" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" msgstr "usage : %s%s" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "`git %s\" est un alias de `%s'" @@ -5815,8 +6082,8 @@ msgstr "grave incohérence dans la décompression (inflate)" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "COLLISION SHA1 TROUVÉE AVEC %s !" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "impossible de lire %s" @@ -5845,156 +6112,156 @@ msgstr "Erreur dans l'objet" msgid "Not all child objects of %s are reachable" msgstr "Tous les objets enfants de %s ne sont pas accessibles" -#: builtin/index-pack.c:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "échec d'application du delta" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "Réception d'objets" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "Indexation d'objets" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "le paquet est corrompu (SHA1 ne correspond pas)" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" msgstr "impossible d'obtenir le statut (fstat) du fichier paquet" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "le paquet est invalide à la fin" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "confusion extrême dans parse_pack_objects()" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "Résolution des deltas" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "impossible de créer le fil : %s" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "confusion extrême" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "complété avec %d objets locaux" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "" "Somme de contrôle de fin inattendue pour %s (corruption sur le disque ?)" -#: builtin/index-pack.c:1151 +#: builtin/index-pack.c:1152 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "le paquet a %d delta non résolu" msgstr[1] "le paquet a %d deltas non résolus" -#: builtin/index-pack.c:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" msgstr "impossible de compresser l'objet ajouté (%d)" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "l'objet local %s est corrompu" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" msgstr "erreur en fermeture du fichier paquet" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "impossible d'écrire le fichier \"keep\" '%s'" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "impossible de fermer le fichier \"keep\" '%s'" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "impossible de stocker le fichier paquet" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "impossible de stocker le fichier d'index" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "mauvais pack.indexversion=%<PRIu32>" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, c-format msgid "invalid number of threads specified (%d)" msgstr "nombre de fils spécifié invalide (%d)" -#: builtin/index-pack.c:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "pas de support des fils, ignore %s" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Impossible d'ouvrir le fichier paquet existant '%s'" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "Impossible d'ouvrir le fichier paquet d'index existant pour '%s'" -#: builtin/index-pack.c:1474 +#: builtin/index-pack.c:1475 #, c-format msgid "non delta: %d object" msgid_plural "non delta: %d objects" msgstr[0] "pas un delta : %d objet" msgstr[1] "pas un delta : %d objets" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 #, c-format msgid "chain length = %d: %lu object" msgid_plural "chain length = %d: %lu objects" msgstr[0] "longueur chaînée = %d : %lu objet" msgstr[1] "longueur chaînée = %d : %lu objets" -#: builtin/index-pack.c:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "Impossible de revenir au répertoire de travail courant" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "mauvais %s" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin ne peut pas être utilisé sans --stdin" -#: builtin/index-pack.c:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "le nom de fichier paquet '%s' ne se termine pas par '.pack'" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "--verify sans nom de fichier paquet donné" @@ -6084,11 +6351,6 @@ msgstr "impossible de traiter le fichier de type %d" msgid "unable to move %s to %s" msgstr "impossible de déplacer %s vers %s" -#: builtin/init-db.c:363 -#, c-format -msgid "Could not create git link %s" -msgstr "Impossible de créer le lien git %s" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -6131,21 +6393,21 @@ msgstr "permissions" msgid "specify that the git repository is to be shared amongst several users" msgstr "spécifier que le dépôt git sera partagé entre plusieurs utilisateurs" -#: builtin/init-db.c:493 builtin/prune-packed.c:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "être silencieux" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "impossible de créer le répertoire (mkdir) %s" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "impossible de se déplacer vers le répertoire (chdir) %s" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -6154,11 +6416,11 @@ msgstr "" "%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --" "git-dir=<répertoire>)" -#: builtin/init-db.c:579 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "Impossible d'accéder au répertoire de travail courant" -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "Impossible d'accéder à l'arbre de travail '%s'" @@ -6171,248 +6433,249 @@ msgstr "git log [<options>] [<page de révisions>] [[--] <chemin>...]\n" msgid " or: git show [options] <object>..." msgstr " ou : git show [options] <objet>..." -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "supprimer la sortie des différences" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "afficher la source" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "Utiliser le fichier de correspondance de mail" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "décorer les options" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "Sortie finale : %d %s\n" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "Impossible de lire l'objet %s" -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "Type inconnu : %d" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "format.headers sans valeur" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "le nom du répertoire de sortie est trop long" -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "Impossible d'ouvrir le fichier correctif %s" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "Exactement une plage nécessaire." -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "Pas une plage." -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" msgstr "La lettre de motivation doit être au format e-mail" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "in-reply-to aberrant : %s" -#: builtin/log.c:995 +#: builtin/log.c:1015 msgid "git format-patch [options] [<since> | <revision range>]" msgstr "git format-patch [options] [<depuis> | <plage de révisions>]" -#: builtin/log.c:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "Deux répertoires de sortie ?" -#: builtin/log.c:1155 +#: builtin/log.c:1175 msgid "use [PATCH n/m] even with a single patch" msgstr "utiliser [PATCH n/m] même avec un patch unique" -#: builtin/log.c:1158 +#: builtin/log.c:1178 msgid "use [PATCH] even with multiple patches" msgstr "utiliser [PATCH] même avec des patchs multiples" -#: builtin/log.c:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "afficher les patchs sur la sortie standard" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "générer une lettre de motivation" -#: builtin/log.c:1166 +#: builtin/log.c:1186 msgid "use simple number sequence for output file names" msgstr "" "utiliser une séquence simple de nombres pour les nom des fichiers de sortie" -#: builtin/log.c:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "sfx" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "utiliser <sfx> au lieu de '.patch'" -#: builtin/log.c:1170 +#: builtin/log.c:1190 msgid "start numbering patches at <n> instead of 1" msgstr "démarrer la numérotation des patchs à <n> au lieu de 1" -#: builtin/log.c:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "marquer la série comme une Nième réédition" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" msgstr "utiliser [<préfixe>] au lieu de [PATCH]" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "stocker les fichiers résultats dans <répertoire>" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "ne pas retirer/ajouter [PATCH]" -#: builtin/log.c:1183 +#: builtin/log.c:1203 msgid "don't output binary diffs" msgstr "ne pas imprimer les diffs binaires" -#: builtin/log.c:1185 +#: builtin/log.c:1205 msgid "don't include a patch matching a commit upstream" msgstr "ne pas inclure un patch correspondant à un commit amont" -#: builtin/log.c:1187 +#: builtin/log.c:1207 msgid "show patch format instead of default (patch + stat)" msgstr "afficher le format du patch au lieu du défaut (patch + stat)" -#: builtin/log.c:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "Communication" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "en-tête" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "ajouter l'en-tête d'e-mail" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "e-mail" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "ajouter l'en-tête \"To:\"" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "ajouter l'en-tête \"Cc:\"" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "ident" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" -msgstr "Renseigner l'adresse From à <ident> (ou à l'ident du validateur si absent)" +msgstr "" +"renseigner l'adresse From à <ident> (ou à l'ident du validateur si absent)" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "id-message" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "répondre dans le premier message à <id-message>" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "frontière" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "attacher le patch" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "patch à l'intérieur" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "" "activer l'enfilage de message, styles : shallow (superficiel), deep (profond)" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "signature" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "ajouter une signature" -#: builtin/log.c:1214 +#: builtin/log.c:1233 msgid "don't print the patch filenames" msgstr "ne pas afficher les noms de fichiers des patchs" -#: builtin/log.c:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "ligne d'identification invalide : %s" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "-n et -k sont mutuellement exclusifs." -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix et -k sont mutuellement exclusifs." -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "--name-only n'a pas de sens" -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "--name-status n'a pas de sens" -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "--check n'a pas de sens" -#: builtin/log.c:1340 +#: builtin/log.c:1359 msgid "standard output, or directory, which one?" msgstr "sortie standard, ou répertoire, lequel ?" -#: builtin/log.c:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "Impossible de créer le répertoire '%s'" -#: builtin/log.c:1490 +#: builtin/log.c:1509 msgid "Failed to create output files" msgstr "Échec de création des fichiers en sortie" -#: builtin/log.c:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<branche_amont> [<head> [<limite>]]]" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" @@ -6420,139 +6683,139 @@ msgstr "" "Impossible de trouver une branche distante suivie, merci de spécifier " "<branche_amont> manuellement.\n" -#: builtin/log.c:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" msgstr "Commit inconnu %s" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "git ls-files [options] [<fichier>...]" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 msgid "identify the file status with tags" msgstr "identifier le statut de fichier avec les étiquettes" -#: builtin/ls-files.c:467 +#: builtin/ls-files.c:457 msgid "use lowercase letters for 'assume unchanged' files" msgstr "utiliser des minuscules pour les fichier 'assumés inchangés'" -#: builtin/ls-files.c:469 +#: builtin/ls-files.c:459 msgid "show cached files in the output (default)" msgstr "afficher les fichiers mis en cache dans la sortie (défaut)" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:461 msgid "show deleted files in the output" msgstr "afficher les fichiers supprimés dans la sortie" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:463 msgid "show modified files in the output" msgstr "afficher les fichiers modifiés dans la sortie" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:465 msgid "show other files in the output" msgstr "afficher les autres fichiers dans la sortie" -#: builtin/ls-files.c:477 +#: builtin/ls-files.c:467 msgid "show ignored files in the output" msgstr "afficher les fichiers ignorés dans la sortie" -#: builtin/ls-files.c:480 +#: builtin/ls-files.c:470 msgid "show staged contents' object name in the output" msgstr "afficher les nom des objets indexés dans la sortie" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 msgid "show files on the filesystem that need to be removed" msgstr "" "afficher les fichiers du système de fichiers qui ont besoin d'être supprimés" -#: builtin/ls-files.c:484 +#: builtin/ls-files.c:474 msgid "show 'other' directories' name only" msgstr "afficher seulement les noms des répertoires 'other'" -#: builtin/ls-files.c:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "ne pas afficher les répertoires vides" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 msgid "show unmerged files in the output" msgstr "afficher les fichiers non fusionnés dans la sortie" -#: builtin/ls-files.c:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "afficher l'information resolv-undo" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 msgid "skip files matching pattern" msgstr "sauter les fichiers correspondant au motif" -#: builtin/ls-files.c:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "les motifs d'exclusion sont lus depuis <fichier>" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 msgid "read additional per-directory exclude patterns in <file>" msgstr "lire des motifs d'exclusion additionnels par répertoire dans <fichier>" -#: builtin/ls-files.c:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "ajouter les exclusions git standard" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 msgid "make the output relative to the project top directory" msgstr "afficher en relatif par rapport au répertoire racine du projet" -#: builtin/ls-files.c:508 +#: builtin/ls-files.c:498 msgid "if any <file> is not in the index, treat this as an error" msgstr "si un <fichier> n'est pas dans l'index, traiter cela comme une erreur" -#: builtin/ls-files.c:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "arbre ou apparenté" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 msgid "pretend that paths removed since <tree-ish> are still present" msgstr "" "considérer que les chemins supprimés depuis <arbre ou apparenté> sont " "toujours présents" -#: builtin/ls-files.c:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "afficher les données de débogage" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 msgid "git ls-tree [<options>] <tree-ish> [<path>...]" msgstr "git ls-tree [<options>] <arbre ou apparenté> [<chemin>...]" -#: builtin/ls-tree.c:125 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "afficher seulement les arbres" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "parcourir les sous-arbres" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "afficher les arbres en les parcourant" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "terminer les éléments avec un octet NUL" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 msgid "include object size" msgstr "inclure la taille d'objet" -#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "afficher seulement les noms de fichiers" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "utiliser les noms de chemins complets" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "" "afficher l'arbre entier ; pas seulement le répertoire courant (implique --" @@ -6589,153 +6852,153 @@ msgstr "Les stratégies disponibles sont :" msgid "Available custom strategies are:" msgstr "Les stratégies personnalisées sont :" -#: builtin/merge.c:198 +#: builtin/merge.c:191 msgid "do not show a diffstat at the end of the merge" msgstr "ne pas afficher un diffstat à la fin de la fusion" -#: builtin/merge.c:201 +#: builtin/merge.c:194 msgid "show a diffstat at the end of the merge" msgstr "afficher un diffstat à la fin de la fusion" -#: builtin/merge.c:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "(synonyme de --stat)" -#: builtin/merge.c:204 +#: builtin/merge.c:197 msgid "add (at most <n>) entries from shortlog to merge commit message" msgstr "" "ajouter (au plus <n>) éléments du journal court au message de validation de " "la fusion" -#: builtin/merge.c:207 +#: builtin/merge.c:200 msgid "create a single commit instead of doing a merge" msgstr "créer une validation unique au lieu de faire une fusion" -#: builtin/merge.c:209 +#: builtin/merge.c:202 msgid "perform a commit if the merge succeeds (default)" msgstr "effectuer une validation si la fusion réussit (défaut)" -#: builtin/merge.c:211 +#: builtin/merge.c:204 msgid "edit message before committing" msgstr "éditer le message avant la validation" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "autoriser l'avance rapide (défaut)" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "abandonner si l'avance rapide n'est pas possible" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "Vérifier que la validation a une signature GPG valide" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "stratégie" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "stratégie de fusion à utiliser" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "option=valeur" -#: builtin/merge.c:222 +#: builtin/merge.c:215 msgid "option for selected merge strategy" msgstr "option pour la stratégie de fusion sélectionnée" -#: builtin/merge.c:224 +#: builtin/merge.c:217 msgid "merge commit message (for a non-fast-forward merge)" msgstr "" "message de validation de la fusion (pour une fusion sans avance rapide)" -#: builtin/merge.c:228 +#: builtin/merge.c:221 msgid "abort the current in-progress merge" msgstr "abandonner la fusion en cours" -#: builtin/merge.c:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "impossible de lancer le remisage." -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "échec du remisage" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "pas un objet valide : %s" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "read-tree a échoué" -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr " (rien à compresser)" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Validation compressée -- HEAD non mise à jour\n" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "Écriture de SQUASH_MSG" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "Finition de SQUASH_MSG" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "Pas de message de fusion -- pas de mise à jour de HEAD\n" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' ne pointe pas sur un commit" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Mauvaise chaîne branch.%s.mergeoptions : %s" -#: builtin/merge.c:657 +#: builtin/merge.c:650 msgid "git write-tree failed to write a tree" msgstr "git write-tree a échoué à écrire un arbre" -#: builtin/merge.c:685 +#: builtin/merge.c:678 msgid "Not handling anything other than two heads merge." msgstr "Impossible de gérer autre chose que la fusion de deux têtes." -#: builtin/merge.c:699 +#: builtin/merge.c:692 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Options inconnue pour merge-recursive : -X%s" -#: builtin/merge.c:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "impossible d'écrire %s" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "Impossible de lire depuis '%s'" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" "Pas de validation de la fusion ; utilisez 'git commit' pour terminer la " "fusion.\n" -#: builtin/merge.c:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6752,49 +7015,49 @@ msgstr "" "Les lignes commençant par '%c' seront ignorées, et un message vide\n" "abandonne la validation.\n" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "Message de validation vide." -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "Merveilleux.\n" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" "La fusion automatique a échoué ; réglez les conflits et validez le " "résultat.\n" -#: builtin/merge.c:934 +#: builtin/merge.c:927 #, c-format msgid "'%s' is not a commit" msgstr "'%s' n'est pas une validation" -#: builtin/merge.c:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "Pas de branche courante." -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "Pas de branche distante pour la branche courante." -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." msgstr "Pas de branche amont par défaut définie pour la branche courante." -#: builtin/merge.c:984 +#: builtin/merge.c:977 #, c-format msgid "No remote-tracking branch for %s from %s" msgstr "Pas de branche de suivi pour %s depuis %s" -#: builtin/merge.c:1140 +#: builtin/merge.c:1133 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Il n'y a pas de fusion à abandonner (MERGE_HEAD manquant)." -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6802,11 +7065,11 @@ msgstr "" "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n" "Veuillez valider vos changements avant de pouvoir fusionner." -#: builtin/merge.c:1159 git-pull.sh:34 +#: builtin/merge.c:1152 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)." -#: builtin/merge.c:1163 +#: builtin/merge.c:1156 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6814,140 +7077,148 @@ msgstr "" "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n" "Veuillez valider vos changements avant de pouvoir fusionner." -#: builtin/merge.c:1166 +#: builtin/merge.c:1159 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe)." -#: builtin/merge.c:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "Vous ne pouvez pas combiner --squash avec --no-ff." -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "" "Pas de validation spécifiée et merge.defaultToUpstream n'est pas défini." -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 msgid "Can merge only exactly one commit into empty head" msgstr "" "Possible de fusionner exactement une seule validation dans une tête vide" -#: builtin/merge.c:1219 +#: builtin/merge.c:1212 msgid "Squash commit into empty head not supported yet" msgstr "La validation compressée vers une tête vide n'est pas encore supportée" -#: builtin/merge.c:1221 +#: builtin/merge.c:1214 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "Une validation sans avance rapide n'a pas de sens dans une tête vide" -#: builtin/merge.c:1226 +#: builtin/merge.c:1219 #, c-format msgid "%s - not something we can merge" msgstr "%s - pas possible de fusionner ceci" -#: builtin/merge.c:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "La validation %s a une signature GPG non fiable, prétendument par %s." -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "La validation %s a une mauvaise signature GPG prétendument par %s." #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "La validation %s n'a pas de signature GPG." -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "La validation %s a une signature GPG correcte par %s\n" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "Mise à jour %s..%s\n" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Essai de fusion vraiment triviale dans l'index...\n" -#: builtin/merge.c:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "Non.\n" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 msgid "Not possible to fast-forward, aborting." msgstr "Pas possible d'avancer rapidement, abandon." -#: builtin/merge.c:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Retour de l'arbre à l'original...\n" -#: builtin/merge.c:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Essai de la stratégie de fusion %s...\n" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Aucune stratégie de fusion n'a pris en charge la fusion.\n" -#: builtin/merge.c:1543 +#: builtin/merge.c:1536 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "La fusion avec la stratégie %s a échoué.\n" -#: builtin/merge.c:1552 +#: builtin/merge.c:1545 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Utilisation de %s pour préparer la résolution à la main.\n" -#: builtin/merge.c:1564 +#: builtin/merge.c:1557 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" "La fusion automatique a réussi ; stoppée avant la validation comme demandé\n" -#: builtin/merge-base.c:26 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." msgstr "git merge-base [-a|--all] <validation> <validation>..." -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." msgstr "git merge-base [-a|--all] --octopus <validation>..." -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." msgstr "git merge-base --independent <validation>..." -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <validation> <validation>" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <référence> [<validation>]" + +#: builtin/merge-base.c:214 msgid "output all common ancestors" msgstr "afficher tous les ancêtres communs" -#: builtin/merge-base.c:99 +#: builtin/merge-base.c:216 msgid "find ancestors for a single n-way merge" msgstr "trouver les ancêtres pour une fusion simple à n points" -#: builtin/merge-base.c:100 +#: builtin/merge-base.c:218 msgid "list revs not reachable from others" msgstr "afficher les révisions inaccessibles depuis les autres" -#: builtin/merge-base.c:102 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "est le premier ancêtre de l'autre ?" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "trouver où <validation> a divergé du reflog de <référence>" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -7004,118 +7275,134 @@ msgstr "autoriser les objets manquants" msgid "allow creation of more than one tree" msgstr "autoriser la création de plus d'un arbre" -#: builtin/mv.c:14 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "git mv [options] <source>... <destination>" -#: builtin/mv.c:64 +#: builtin/mv.c:71 msgid "force move/rename even if target exists" msgstr "forcer le déplacement/renommage même si la cible existe" -#: builtin/mv.c:65 +#: builtin/mv.c:72 msgid "skip move/rename errors" msgstr "sauter les erreurs de déplacement/renommage" -#: builtin/mv.c:108 +#: builtin/mv.c:122 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "Vérification du renommage de '%s' en '%s'\n" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "mauvaise source" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "impossible de déplacer un répertoire dans lui-même" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "impossible de déplacer un répertoire sur un fichier" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "" +"Hein ? Le répertoire %s est dans l'index et pourtant aucun sous-module ?" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" +"Veuillez indexer vos modifications de .gitmodules ou remisez-les pour " +"continuer" + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "Hein ? %.*s est dans l'index ?" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "le répertoire source est vide" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "pas sous le contrôle de version" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "la destination existe" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "écrasement de '%s'" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "Impossible d'écraser" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "multiples sources pour la même destination" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "le répertoire de destination n'existe pas" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s, source=%s, destination=%s" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "Renommage de %s en %s\n" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" msgstr "le renommage de '%s' a échoué" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "git name-rev [options] <validation>..." -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "git name-rev [options] --all" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "git name-rev [options] --stdin" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "afficher seulement les noms (pas de SHA-1)" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 msgid "only use tags to name the commits" msgstr "utiliser seulement les étiquettes pour nommer les validations" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:315 msgid "only use refs matching <pattern>" msgstr "utiliser seulement les références correspondant à <motif>" -#: builtin/name-rev.c:318 +#: builtin/name-rev.c:317 msgid "list all commits reachable from all refs" msgstr "" "afficher toutes les validations accessibles depuis toutes les références" -#: builtin/name-rev.c:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "lire depuis l'entrée standard" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" -msgstr "autoriser l'affichage des noms `non définis`" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "autoriser l'affichage des noms `non définis` (par défaut)" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "déréférencer les étiquettes en entrée (usage interne)" @@ -7268,12 +7555,12 @@ msgstr "impossible d'écrire l'objet note" msgid "The note contents has been left in %s" msgstr "Le contenu de la note a été laissé dans %s" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "impossible de lire '%s'" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "impossible d'ouvrir ou lire '%s'" @@ -7281,7 +7568,7 @@ msgstr "impossible d'ouvrir ou lire '%s'" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Impossible de résoudre '%s' comme une référence valide." @@ -7441,7 +7728,7 @@ msgstr "références_notes" msgid "use notes from <notes_ref>" msgstr "utiliser les notes depuis <références_notes>" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "Sous-commande inconnue : %s" @@ -7456,154 +7743,154 @@ msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" msgstr "" "git pack-objects [options...] base-name [< liste-références | < liste-objets]" -#: builtin/pack-objects.c:183 builtin/pack-objects.c:186 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "erreur de compression (%d)" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "version d'index non supportée %s" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "mauvaise version d'index '%s'" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "l'option %s n'accepte pas de valeur négative" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "impossible d'analyser la valeur '%s' pour l'option %s" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "ne pas afficher la barre de progression" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "afficher la barre de progression" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 msgid "show progress meter during object writing phase" msgstr "afficher la barre de progression durant la phase d'écrite des objets" -#: builtin/pack-objects.c:2454 +#: builtin/pack-objects.c:2453 msgid "similar to --all-progress when progress meter is shown" msgstr "similaire à --all-progress quand la barre de progression est affichée" -#: builtin/pack-objects.c:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "version[,offset]" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 msgid "write the pack index file in the specified idx format version" msgstr "" "écrire le fichier d'index du paquet dans le format d'index de version " "spécifié" -#: builtin/pack-objects.c:2459 +#: builtin/pack-objects.c:2458 msgid "maximum size of each output pack file" msgstr "taille maximum de chaque fichier paquet en sortie" -#: builtin/pack-objects.c:2461 +#: builtin/pack-objects.c:2460 msgid "ignore borrowed objects from alternate object store" msgstr "ignorer les objets empruntés à un autre magasin d'objets" -#: builtin/pack-objects.c:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "ignorer les objets empaquetés" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 msgid "limit pack window by objects" msgstr "limiter la fenêtre d'empaquetage par objets" -#: builtin/pack-objects.c:2467 +#: builtin/pack-objects.c:2466 msgid "limit pack window by memory in addition to object limit" msgstr "" "limiter la fenêtre d'empaquetage par mémoire en plus de la limite d'objets" -#: builtin/pack-objects.c:2469 +#: builtin/pack-objects.c:2468 msgid "maximum length of delta chain allowed in the resulting pack" msgstr "" "longueur maximum de la chaîne de delta autorisée dans le paquet résultant" -#: builtin/pack-objects.c:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "réutiliser les deltas existants" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "réutiliser les objets existants" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "utiliser les objets OFS_DELTA" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 msgid "use threads when searching for best delta matches" msgstr "" "utiliser des fils lors de la recherche pour une meilleurs correspondance des " "deltas" -#: builtin/pack-objects.c:2479 +#: builtin/pack-objects.c:2478 msgid "do not create an empty pack output" msgstr "ne pas créer un paquet vide" -#: builtin/pack-objects.c:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr "lire les paramètres de révision depuis l'entrée standard" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 msgid "limit the objects to those that are not yet packed" msgstr "limiter les objets à ceux qui ne sont pas encore empaquetés" -#: builtin/pack-objects.c:2486 +#: builtin/pack-objects.c:2485 msgid "include objects reachable from any reference" msgstr "inclure les objets accessibles depuis toute référence" -#: builtin/pack-objects.c:2489 +#: builtin/pack-objects.c:2488 msgid "include objects referred by reflog entries" msgstr "inclure les objets référencés par les éléments de reflog" -#: builtin/pack-objects.c:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "afficher l'empaquetage sur la sortie standard" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 msgid "include tag objects that refer to objects to be packed" msgstr "inclure les objets d'étiquettes qui réfèrent à des objets à empaqueter" -#: builtin/pack-objects.c:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "garder les objets inaccessibles" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "heure" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 msgid "unpack unreachable objects newer than <time>" msgstr "dépaqueter les objets inaccessibles plus récents que <heure>" -#: builtin/pack-objects.c:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "créer des paquets légers" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 msgid "ignore packs that have companion .keep file" msgstr "ignorer les paquets qui ont un fichier .keep" -#: builtin/pack-objects.c:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "niveau de compression du paquet" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" msgstr "ne pas cacher les validations par greffes" @@ -7627,15 +7914,15 @@ msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "ne pas supprimer, afficher seulement" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "afficher les objets éliminés" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "faire expirer les objets plus vieux que <heure>" @@ -7643,15 +7930,15 @@ msgstr "faire expirer les objets plus vieux que <heure>" msgid "git push [<options>] [<repository> [<refspec>...]]" msgstr "git push [<options>] [<dépôt> [<spécification-de-référence>...]]" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "raccourci d'étiquette sans <étiquette>" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "--delete accepte seulement des noms entiers de références cibles" -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." @@ -7660,7 +7947,7 @@ msgstr "" "Pour choisir l'option de manière permanente, voir push.default dans 'git " "help config'." -#: builtin/push.c:102 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7685,7 +7972,7 @@ msgstr "" " git push %s %s\n" "%s" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7700,7 +7987,7 @@ msgstr "" "\n" " git push %s HEAD:<nom-de-la-branche-amont>\n" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7714,13 +8001,13 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:139 +#: builtin/push.c:181 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "" "La branche courante %s a de multiples branches amont, impossible de pousser." -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7731,7 +8018,7 @@ msgstr "" "pas une branche amont de votre branche courante '%s', sans me dire\n" "quoi pousser pour mettre à jour quelle branche amont." -#: builtin/push.c:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7743,6 +8030,13 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" @@ -7750,7 +8044,8 @@ msgid "" msgstr "" "push.default n'est pas défini ; sa valeur implicite change dans Git 2.0\n" "de 'matching' vers 'simple'. Pour supprimer ce message et maintenir\n" -"le comportement actuel après les changements par défaut, utilisez :\n" +"le comportement actuel après la modification de la valeur de défaut, " +"utilisez :\n" "\n" " git config --global push.default matching\n" "\n" @@ -7759,20 +8054,29 @@ msgstr "" "\n" " git config --global push.default simple\n" "\n" +"Quand push.default vaudra 'matching', git poussera les branches locales\n" +"sur les branches distantes qui existent déjà avec le même nom.\n" +"\n" +"Dans Git 2.0 Git utilisera par défaut le comportement plus conservatif " +"'simple'\n" +"qui ne pousse la branche courante vers la branche distante que 'git pull' " +"utilise\n" +"pour mettre à jour la branche courante.\n" +" \n" "Voir 'git help config' et chercher 'push.default' pour plus d'information.\n" "(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode " "similaire\n" "'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes " "versions de Git)" -#: builtin/push.c:225 +#: builtin/push.c:274 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" "Vous n'avez pas spécifié de spécifications de référence à pousser, et push." "default est \"nothing\"." -#: builtin/push.c:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7787,7 +8091,7 @@ msgstr "" "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus " "d'information." -#: builtin/push.c:238 +#: builtin/push.c:287 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" @@ -7803,7 +8107,7 @@ msgstr "" "'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement la " "branche courante." -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7818,7 +8122,7 @@ msgstr "" "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus " "d'information." -#: builtin/push.c:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7836,13 +8140,13 @@ msgstr "" "Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus " "d'information." -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "" "Les mises à jour ont été rejetées car l'étiquette existe déjà dans la " "branche distante." -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" @@ -7854,22 +8158,22 @@ msgstr "" "pointer\n" "vers un objet qui n'est pas un commit, sans utiliser l'option '--force'.\n" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "Poussage vers %s\n" -#: builtin/push.c:324 +#: builtin/push.c:379 #, c-format msgid "failed to push some refs to '%s'" msgstr "impossible de pousser des références vers '%s'" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "mauvais dépôt '%s'" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7891,88 +8195,96 @@ msgstr "" "\n" " git push <nom>\n" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "--all et --tags sont incompatibles" -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" msgstr "--all ne peut pas être combiné avec des spécifications de référence" -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "--mirror et --tags sont incompatibles" -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" msgstr "--mirror ne peut pas être combiné avec des spécifications de référence" -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "--all et --mirror sont incompatibles" -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "dépôt" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" msgstr "pousser toutes les références" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" msgstr "refléter toutes les références" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" msgstr "supprimer les références" -#: builtin/push.c:450 +#: builtin/push.c:505 msgid "push tags (can't be used with --all or --mirror)" msgstr "" "pousser les étiquettes (ne peut pas être utilisé avec --all ou --mirror)" -#: builtin/push.c:453 +#: builtin/push.c:508 msgid "force updates" msgstr "forcer les mises à jour" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "nom de référence>:<attendu" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "exiger que l'ancienne valeur de la référence soit à cette valeur" + +#: builtin/push.c:513 msgid "check" msgstr "check" -#: builtin/push.c:455 +#: builtin/push.c:514 msgid "control recursive pushing of submodules" msgstr "contrôler le poussage récursif des sous-modules" -#: builtin/push.c:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "utiliser un empaquetage léger" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" msgstr "recevoir le programme d'empaquetage" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" msgstr "définir la branche amont pour git pull/status" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" msgstr "éliminer les références locales supprimées" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" msgstr "éviter d'utiliser le crochet pre-push" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" msgstr "pousser les étiquettes manquantes mais pertinentes" -#: builtin/push.c:476 +#: builtin/push.c:535 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete est incompatible avec --all, --mirror et --tags" -#: builtin/push.c:478 +#: builtin/push.c:537 msgid "--delete doesn't make sense without any refs" msgstr "--delete n'a pas de sens sans aucune référence" @@ -8049,23 +8361,23 @@ msgstr "sauter l'application du filtre d'extraction creuse" #: builtin/read-tree.c:138 msgid "debug unpack-trees" -msgstr "deboguer unpack-trees" +msgstr "déboguer unpack-trees" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" msgstr "%s' pour '%s' n'est pas un horodatage valide" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "'%s' n'est pas un horodatage valide" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "git remote [-v | --verbose]" -#: builtin/remote.c:12 +#: builtin/remote.c:13 msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <name> <url>" @@ -8073,79 +8385,83 @@ msgstr "" "git remote add [-t <branche>] [-m <maîtresse>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <nom> <URL>" -#: builtin/remote.c:13 builtin/remote.c:32 +#: builtin/remote.c:14 builtin/remote.c:33 msgid "git remote rename <old> <new>" msgstr "git remote rename <ancienne> <nouvelle>" -#: builtin/remote.c:14 builtin/remote.c:37 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "git remote remove <nom>" -#: builtin/remote.c:15 builtin/remote.c:42 -msgid "git remote set-head <name> (-a | -d | <branch>)" -msgstr "git remote set-head <nom> (-a | -d | <branche>)" - #: builtin/remote.c:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <nom> (-a | --auto | -d | --delete |<branche>)" + +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "git remote [-v | --verbose] show [-n] <nom>" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "git remote prune [-n | --dry-run] <nom>" -#: builtin/remote.c:18 +#: builtin/remote.c:19 msgid "" "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" msgstr "" "git remote [-v | --verbose] update [-p | --prune] [(<groupe> | " "<distante>)...]" -#: builtin/remote.c:19 +#: builtin/remote.c:20 msgid "git remote set-branches [--add] <name> <branch>..." msgstr "git remote set-branches [--add] <nom> <branche>..." -#: builtin/remote.c:20 builtin/remote.c:68 +#: builtin/remote.c:21 builtin/remote.c:69 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" msgstr "git remote set-url [--push] <nom> <nouvelle-URL> [<ancienne-URL>]" -#: builtin/remote.c:21 builtin/remote.c:69 +#: builtin/remote.c:22 builtin/remote.c:70 msgid "git remote set-url --add <name> <newurl>" msgstr "git remote set-url --add <nom> <nouvelle-URL>" -#: builtin/remote.c:22 builtin/remote.c:70 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "git remote set-url --delete <nom> <URL>" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "git remote add [<options>] <nom> <URL>" -#: builtin/remote.c:47 +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <nom> (-a | --auto | -d | --delete | <branche>)" + +#: builtin/remote.c:48 msgid "git remote set-branches <name> <branch>..." msgstr "git remote set-branches <nom> <branche>..." -#: builtin/remote.c:48 +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "git remote set-branches --add <nom> <branche>..." -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "git remote show [<options>] <nom>" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "git remote prune [<options>] <nom>" -#: builtin/remote.c:63 +#: builtin/remote.c:64 msgid "git remote update [<options>] [<group> | <remote>]..." msgstr "git remote update [<options>] [<groupe> | <distante>]..." -#: builtin/remote.c:98 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "Mise à jour de %s" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" @@ -8153,105 +8469,107 @@ msgstr "" "--mirror est dangereux et obsolète ; merci\n" "\t d'utiliser --mirror=fetch ou --mirror=push à la place" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "argument miroir inconnu : %s" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" msgstr "rapatrier les branches distantes" -#: builtin/remote.c:165 +#: builtin/remote.c:155 msgid "import all tags and associated objects when fetching" msgstr "" "importer toutes les étiquettes et les objets associés lors du rapatriement" -#: builtin/remote.c:168 +#: builtin/remote.c:158 msgid "or do not fetch any tag at all (--no-tags)" msgstr "ou ne rapatrier aucune étiquette (--no-tags)" -#: builtin/remote.c:170 +#: builtin/remote.c:160 msgid "branch(es) to track" msgstr "branche(s) à suivre" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "branche maîtresse" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "push|fetch" -#: builtin/remote.c:173 +#: builtin/remote.c:163 msgid "set up remote as a mirror to push to or fetch from" msgstr "" "paramétrer la distante comme miroir pour pousser ou pour rapatrier depuis" -#: builtin/remote.c:185 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "spécifier une branche maîtresse n'a pas de sens avec --mirror" -#: builtin/remote.c:187 +#: builtin/remote.c:177 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "" "spécifier les branches à suivre n'a de sens qu'avec des miroirs de " "rapatriement" -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, c-format msgid "remote %s already exists." msgstr "la distante %s existe déjà ." -#: builtin/remote.c:199 builtin/remote.c:650 +#: builtin/remote.c:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "'%s' n'est pas un nom valide de distante" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "Impossible de paramétrer la maîtresse '%s'" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "plus d'un %s" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" -msgstr "Impossible d'obtenir une correspondance distante pour la spécification de référence %s" +msgstr "" +"Impossible d'obtenir une correspondance distante pour la spécification de " +"référence %s" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "(correspond)" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "(supprimer)" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%s'" msgstr "Impossible d'ajouter '%s' à '%s'" -#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "Distante inconnue : %s" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "Impossible de renommer la section de configuration '%s' en '%s'" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, c-format msgid "Could not remove config section '%s'" msgstr "Impossible de supprimer la section de configuration '%s'" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -8262,32 +8580,32 @@ msgstr "" "\t%s\n" "\tVeuillez mettre à jour la configuration manuellement si nécessaire." -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "Impossible d'ajouter '%s'" -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "Impossible de définir '%s'" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" msgstr "échec de suppression de '%s'" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" msgstr "échec de création de '%s'" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" msgstr "Impossible de supprimer la branche %s" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -8302,120 +8620,120 @@ msgstr[1] "" "supprimées ;\n" "pour les supprimer, utilisez :" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr " nouveau (le prochain rapatriement (fetch) stockera dans remotes/%s)" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" msgstr " suivi" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" msgstr " dépassé (utilisez 'git remote prune' pour supprimer)" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr " ???" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "branch.%s.merge invalide ; ne peut pas rebaser sur plus d'une branche" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "rebase sur la distante %s" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr " fusionne avec la distante %s" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr " et avec la distante" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "fusionne avec la distante %s" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr " et avec la distante" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "créer" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "supprimer" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "à jour" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "peut être mis à jour en avance rapide" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "le local n'est pas à jour" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s force vers %-*s (%s)" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr " %-*s pousse vers %-*s (%s)" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr " %-*s force vers %s" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" msgstr " %-*s pousse vers %s" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "ne pas interroger les distantes" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "* distante %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" msgstr " URL de rapatriement : %s" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "(pas d'URL)" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr " URL push : %s" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr " Branche HEAD : %s" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" @@ -8423,148 +8741,214 @@ msgstr "" " Branche HEAD (la HEAD distante est ambiguë, peut être l'une des " "suivantes) :\n" -#: builtin/remote.c:1151 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" msgstr[0] " Branche distante :%s" msgstr[1] " Branches distantes :%s" -#: builtin/remote.c:1154 builtin/remote.c:1181 +#: builtin/remote.c:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr " (statut non demandé)" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" msgstr[0] " Branche locale configurée pour 'git pull' :" msgstr[1] " Branches locales configurées pour 'git pull' :" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 msgid " Local refs will be mirrored by 'git push'" msgstr " Les références locales seront reflétées par 'git push'" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, c-format msgid " Local ref configured for 'git push'%s:" msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] " Référence locale configurée pour 'git push'%s :" msgstr[1] " Références locales configurées pour 'git push'%s :" -#: builtin/remote.c:1199 +#: builtin/remote.c:1252 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "définir refs/remotes/<nom>/HEAD selon la distante" -#: builtin/remote.c:1201 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "supprimer refs/remotes/<nom>/HEAD" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "Impossible de déterminer la HEAD distante" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "" "Il y a de multiples branches HEAD distantes. Veuillez en choisir une " "explicitement avec :" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "Impossible de supprimer %s" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" msgstr "Référence non valide : %s" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "Impossible de paramétrer %s" -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr " %s deviendra en suspens !" -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr " %s est devenu en suspens !" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "Élimination de %s" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "URL : %s" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr " * [serait éliminé] %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr " * [éliminé] %s" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "éliminer les distants après le rapatriement" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "Pas de serveur remote '%s'" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "ajouter une branche" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "pas de serveur distant spécifié" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "manipuler les URLs push" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "ajouter une URL" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "supprimer des URLs" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "--add --delete n'a aucun sens" -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "Motif d'URL ancien invalide : %s" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "Pas d'URL trouvée : %s" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 msgid "Will not delete all non-push URLs" msgstr "Pas de suppression de toutes les URLs non-push" -#: builtin/remote.c:1569 +#: builtin/remote.c:1564 msgid "be verbose; must be placed before a subcommand" msgstr "être verbeux : doit être placé avant une sous-commande" +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "git repack [options]" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "empaqueter tout dans un seul paquet" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "identique à -a et transformer les objets inaccessibles en suspens" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "supprimer les paquets redondants et lancer git-prune-packed" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "passer --no-reuse-delta à git-pack-objects" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "passer --no-reuse-object à git-pack-objects" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "ne pas lancer git update-server-info" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "passer --local à git-pack-objects" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "date approximative" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "avec -A, ne pas suspendre les objets plus vieux que celui-ci" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "taille de la fenêtre utilisée pour la compression des deltas" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "octets" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "" +"idem ci-dessus, mais limiter la taille mémoire au lieu du nombre d'éléments" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "limite la profondeur maximale des deltas" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "taille maximum de chaque fichier paquet" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "la suppression de '%s' a échoué" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "git replace [-f] <objet> <remplacement>" @@ -8574,26 +8958,30 @@ msgid "git replace -d <object>..." msgstr "git replace -d <objet>..." #: builtin/replace.c:19 -msgid "git replace -l [<pattern>]" -msgstr "git replace -l [<motif>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<format>] [-l [<motif>]]" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "afficher les références de remplacement" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "supprimer les références de remplacement" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "remplacer la référence si elle existe" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "utiliser ce format" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "git rerere [clear | forget chemin... | status | remaining | diff | gc]" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 msgid "register clean resolutions in index" msgstr "enregistrer des résolutions propres dans l'index" @@ -8654,87 +9042,91 @@ msgstr "HEAD est maintenant à %s" msgid "Cannot do a %s reset in the middle of a merge." msgstr "Impossible de faire un \"reset %s\" au milieu d'une fusion." -#: builtin/reset.c:251 +#: builtin/reset.c:262 msgid "be quiet, only report errors" msgstr "être silencieux, afficher seulement les erreurs" -#: builtin/reset.c:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "réinitialiser HEAD et l'index" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "réinitialiser seulement HEAD" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 msgid "reset HEAD, index and working tree" msgstr "réinitialiser HEAD, l'index et la copie de travail" -#: builtin/reset.c:260 +#: builtin/reset.c:271 msgid "reset HEAD but keep local changes" msgstr "réinitialiser HEAD mais garder les changements locaux" -#: builtin/reset.c:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "Échec de résolution de '%s' comme une révision valide." -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "Impossible d'analyser l'objet '%s'." -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "Échec de résolution de '%s' comme un arbre valide." -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "--patch est incompatible avec --{hard,mixed,soft}" -#: builtin/reset.c:304 +#: builtin/reset.c:315 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "" "--mixed avec des chemins est obsolète ; utilisez 'git reset -- <paths>' à la " "place." -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "Impossible de faire un \"%s reset\" avec des chemins." -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" msgstr "Le \"%s reset\" n'est pas permis dans un dépôt nu" -#: builtin/reset.c:336 +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "Modifications non indexées après reset :" + +#: builtin/reset.c:350 #, c-format msgid "Could not reset index file to revision '%s'." msgstr "Impossible de réinitialiser le fichier d'index à la révision '%s'." -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" -msgstr "Modifications non indexées après reset :" - -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "Impossible d'écrire le nouveau fichier d'index." -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "git rev-parse --parseopt [options] -- [<arguments>...]" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" msgstr "garder le `--` passé en argument" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 msgid "stop parsing after the first non-option argument" msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option" -#: builtin/rev-parse.c:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "sortie en forme longue fixée" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8765,84 +9157,84 @@ msgstr "git cherry-pick [options] <commit ou apparenté>..." msgid "git cherry-pick <subcommand>" msgstr "git cherry-pick <sous-commande>" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s : %s ne peut pas être utilisé avec %s" -#: builtin/revert.c:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "mettre fin au retour ou picorage" -#: builtin/revert.c:106 +#: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" msgstr "reprendre le retour ou picorage" -#: builtin/revert.c:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "annuler le retour ou picorage" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "ne pas valider automatiquement" -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "éditer le message de validation" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "numéro de parent" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "stratégie de fusion" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "option" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "option pour la stratégie de fusion" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" msgstr "ajouter le nom de validation" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "autoriser l'avance rapide" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "préserver les validations vides initialement" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" msgstr "autoriser les validations avec des messages vides" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "garder les validations redondantes, vides" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "erreur du programme" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "revert a échoué" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "le picorage a échoué" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "git rm [options] [--] <fichier>..." -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8856,7 +9248,7 @@ msgstr[1] "" "les sous-modules suivants (ou un de ses sous-modules imbriqués)\n" "utilisent un répertoire .git :" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -8865,7 +9257,7 @@ msgstr "" "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son " "historique)" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8879,7 +9271,7 @@ msgstr[1] "" "les fichiers suivants ont du contenu indexé différent\n" "du fichier et de HEAD :" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" @@ -8887,13 +9279,13 @@ msgstr "" "\n" "(utilisez -f pour forcer la suppression)" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "le fichier suivant a des changements indexés :" msgstr[1] "les fichiers suivants ont des changements indexés :" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" @@ -8901,38 +9293,38 @@ msgstr "" "\n" "(utilisez --cached pour garder le fichier, ou -f pour forcer la suppression)" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "le fichier suivant a des modifications locales :" msgstr[1] "les fichiers suivants ont des modifications locales :" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "ne pas afficher les fichiers supprimés" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "supprimer seulement de l'index" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "outrepasser la vérification des fichiers à jour" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "autoriser la suppression récursive" -#: builtin/rm.c:274 +#: builtin/rm.c:275 msgid "exit with a zero status even if nothing matched" msgstr "sortir avec un statut zéro même si rien ne correspondait" -#: builtin/rm.c:345 +#: builtin/rm.c:336 #, c-format msgid "not removing '%s' recursively without -r" msgstr "pas de suppression récursive de '%s' sans -r" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm : impossible de supprimer %s" @@ -8946,25 +9338,25 @@ msgstr "git shortlog [<options>] [<intervalle révisions>] [[--] [<chemin>...]]" msgid "Missing author: %s" msgstr "Auteur manquant : %s" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 msgid "sort output according to the number of commits per author" msgstr "trier la sortie sur le nombre de validations par auteur" -#: builtin/shortlog.c:230 +#: builtin/shortlog.c:232 msgid "Suppress commit descriptions, only provides commit count" msgstr "" "Supprimer les descriptions de validation, fournit seulement le nombre de " "validations" -#: builtin/shortlog.c:232 +#: builtin/shortlog.c:234 msgid "Show the email address of each author" msgstr "Afficher l'adresse e-mail de chaque auteur" -#: builtin/shortlog.c:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "w[,i1[,i2]]" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "Couper les lignes" @@ -8984,68 +9376,68 @@ msgstr "" msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<référence>]" -#: builtin/show-branch.c:650 +#: builtin/show-branch.c:649 msgid "show remote-tracking and local branches" msgstr "afficher les branches de suivi distantes et les branches locales" -#: builtin/show-branch.c:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "afficher les branches de suivi distantes" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "couleur '*!+-' correspondant à la branche" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 msgid "show <n> more commits after the common ancestor" msgstr "afficher <n> validations de plus après l'ancêtre commun" -#: builtin/show-branch.c:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "synonyme de more=-1" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "supprimer les chaînes de nommage" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "inclure la branche courante" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 msgid "name commits with their object names" msgstr "nommer les validations avec leurs noms d'objet" -#: builtin/show-branch.c:665 +#: builtin/show-branch.c:664 msgid "show possible merge bases" msgstr "afficher les bases possibles de fusion" -#: builtin/show-branch.c:667 +#: builtin/show-branch.c:666 msgid "show refs unreachable from any other ref" msgstr "afficher les références inaccessibles depuis toute autre référence" -#: builtin/show-branch.c:669 +#: builtin/show-branch.c:668 msgid "show commits in topological order" msgstr "afficher les validations dans l'ordre topologique" -#: builtin/show-branch.c:672 +#: builtin/show-branch.c:671 msgid "show only commits not on the first branch" msgstr "" "afficher seulement les validations qui ne sont pas sur la première branche" -#: builtin/show-branch.c:674 +#: builtin/show-branch.c:673 msgid "show merges reachable from only one tip" msgstr "afficher les fusions accessibles depuis une seule pointe" -#: builtin/show-branch.c:676 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "tri topologique, maintenant l'ordre par date si possible" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" msgstr "<n>[,<base>]" -#: builtin/show-branch.c:680 +#: builtin/show-branch.c:679 msgid "show <n> most recent ref-log entries starting at base" msgstr "" "afficher les <n> plus récents éléments de ref-log en commençant à la base" @@ -9076,24 +9468,24 @@ msgstr "" "vérification de référence plus stricte, nécessite un chemin de référence " "exact" -#: builtin/show-ref.c:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "afficher la référence HEAD, même si elle serait filtrée" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 msgid "dereference tags into object IDs" msgstr "déréférencer les étiquettes en IDs d'objet" -#: builtin/show-ref.c:180 +#: builtin/show-ref.c:179 msgid "only show SHA1 hash using <n> digits" msgstr "afficher seulement le hachage SHA1 en utilisant <n> chiffres" -#: builtin/show-ref.c:184 +#: builtin/show-ref.c:183 msgid "do not print results to stdout (useful with --verify)" msgstr "" "ne pas afficher les résultats sur la sortie standard (pratique avec --verify)" -#: builtin/show-ref.c:186 +#: builtin/show-ref.c:185 msgid "show refs from stdin that aren't in local repository" msgstr "" "afficher les références de l'entrée standard qui ne sont pas dans le dépôt " @@ -9120,11 +9512,11 @@ msgstr "supprimer la référence symbolique" msgid "shorten ref output" msgstr "raccourcir l'affichage de la référence" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "raison" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "raison de la mise à jour" @@ -9290,189 +9682,201 @@ msgstr "afficher seulement les étiquettes qui contiennent la validation" msgid "print only tags of the object" msgstr "afficher seulement les étiquettes de l'objet" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "--column et -n sont incompatibles" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "l'option -n est autorisée seulement avec -l." -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "l'option --contains est autorisée seulement avec -l." -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "l'option --points-at est autorisée seulement avec -l." -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "une seule option -F ou -m est autorisée." -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "trop de paramètres" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "'%s' n'est pas un nom d'étiquette valide." -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "l'étiquette '%s' existe déjà " -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "%s : impossible de verrouiller la référence" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "%s : impossible de mettre à jour la référence" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "Étiquette '%s' mise à jour (elle était %s)\n" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "git update-index [options] [--] [<fichier>...]" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "continuer de rafraîchir même si l'index a besoin d'une mise à jour" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "rafraîchir : ignorer les sous-modules" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "ne pas ignorer les nouveaux fichiers" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 msgid "let files replace directories and vice-versa" msgstr "laisser les fichiers remplacer des répertoires et vice-versa" -#: builtin/update-index.c:728 +#: builtin/update-index.c:730 msgid "notice files missing from worktree" msgstr "aviser des fichiers manquants dans la copie de travail" -#: builtin/update-index.c:730 +#: builtin/update-index.c:732 msgid "refresh even if index contains unmerged entries" msgstr "rafraîchir même si l'index contient des éléments non fusionnés" -#: builtin/update-index.c:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "rafraîchir l'information de stat" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 msgid "like --refresh, but ignore assume-unchanged setting" msgstr "comme --refresh, mais en ignorant l'option assume-unchanged" -#: builtin/update-index.c:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "<mode> <objet> <chemin>" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 msgid "add the specified entry to the index" msgstr "ajouter l'élément spécifié dans l'index" -#: builtin/update-index.c:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "(+/-)x" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 msgid "override the executable bit of the listed files" msgstr "outrepasser le bit exécutable pour les fichiers listés" -#: builtin/update-index.c:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "marquer les fichiers comme \"non changeants\"" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "mettre à zéro le bit supposé-non-modifié" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "marquer les fichiers comme \"index seulement\"" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "mettre à zéro le bit sauter-la-copie-de travail" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 msgid "add to index only; do not add content to object database" msgstr "" "ajouter seulement à l'index ; ne pas ajouter le contenu dans la base de " "données des objets" -#: builtin/update-index.c:765 +#: builtin/update-index.c:767 msgid "remove named paths even if present in worktree" msgstr "" "supprimer les chemins nommés même s'ils sont présents dans la copie de " "travail" -#: builtin/update-index.c:767 +#: builtin/update-index.c:769 msgid "with --stdin: input lines are terminated by null bytes" msgstr "avec --stdin : les lignes en entrée sont terminées par des octets nuls" -#: builtin/update-index.c:769 +#: builtin/update-index.c:771 msgid "read list of paths to be updated from standard input" msgstr "lire la liste des chemins à mettre à jour depuis l'entrée standard" -#: builtin/update-index.c:773 +#: builtin/update-index.c:775 msgid "add entries from standard input to the index" msgstr "ajouter les éléments depuis l'entrée standard à l'index" -#: builtin/update-index.c:777 +#: builtin/update-index.c:779 msgid "repopulate stages #2 and #3 for the listed paths" msgstr "repeupler les étapes n°2 et n°3 pour les chemins listés" -#: builtin/update-index.c:781 +#: builtin/update-index.c:783 msgid "only update entries that differ from HEAD" msgstr "mettre à jour seulement les éléments qui diffèrent de HEAD" -#: builtin/update-index.c:785 +#: builtin/update-index.c:787 msgid "ignore files missing from worktree" msgstr "ignorer les fichiers manquants dans la copie de travail" -#: builtin/update-index.c:788 +#: builtin/update-index.c:790 msgid "report actions to standard output" msgstr "afficher les actions sur la sortie standard" -#: builtin/update-index.c:790 +#: builtin/update-index.c:792 msgid "(for porcelains) forget saved unresolved conflicts" msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus" -#: builtin/update-index.c:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "écrire l'index dans ce format" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 msgid "git update-ref [options] -d <refname> [<oldval>]" msgstr "git update-ref [options] -d <nomréférence> [<anciennevaleur>]" -#: builtin/update-ref.c:8 +#: builtin/update-ref.c:10 msgid "git update-ref [options] <refname> <newval> [<oldval>]" msgstr "" "git update-ref [options] <nomréférence> <nouvellevaleur> " "[<anciennevaleur>]" -#: builtin/update-ref.c:19 +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "git update-ref [options] --stdin [-z]" + +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "supprimer la référence" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 msgid "update <refname> not the one it points to" msgstr "mettre à jour <nomréférence> et non la référence pointée par lui" +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "l'entrée standard a des arguments qui se terminent par NUL" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "lire les mises à jour depuis l'entrée standard" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "git update-server-info [--force]" @@ -9527,33 +9931,33 @@ msgstr "" "quelques concepts. Voir 'git help <command>' ou 'git help <concept>'\n" "pour en lire plus à propos d'une commande spécifique ou d'un concept." -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "date d'expiration" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "sans action (rétrocompatibilité)" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "être plus verbeux" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "être plus silencieux" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "utiliser <n> chiffres pour afficher les SHA-1s" #: common-cmds.h:8 msgid "Add file contents to the index" -msgstr "Ajouter le contenu du fichier dans l'index" +msgstr "Ajouter le contenu de fichiers dans l'index" #: common-cmds.h:9 msgid "Find by binary search the change that introduced a bug" -msgstr "Rechercher de manière binaire le changement qui a introduit un bogue" +msgstr "Trouver par recherche binaire la modification qui a introduit un bogue" #: common-cmds.h:10 msgid "List, create, or delete branches" @@ -9569,7 +9973,7 @@ msgstr "Cloner un dépôt dans un nouveau répertoire" #: common-cmds.h:13 msgid "Record changes to the repository" -msgstr "Enregistrer les changements dans le dépôt" +msgstr "Enregistrer les modifications dans le dépôt" #: common-cmds.h:14 msgid "Show changes between commits, commit and working tree, etc" @@ -9595,7 +9999,7 @@ msgstr "Afficher l'historique des validations" #: common-cmds.h:19 msgid "Join two or more development histories together" -msgstr "Joindre deux ou plusieurs historiques de développement ensemble" +msgstr "Fusionner deux ou plusieurs historiques de développement ensemble" #: common-cmds.h:20 msgid "Move or rename a file, a directory, or a symlink" @@ -9603,7 +10007,7 @@ msgstr "Déplacer ou renommer un fichier, un répertoire, ou un lien symbolique" #: common-cmds.h:21 msgid "Fetch from and integrate with another repository or a local branch" -msgstr "Rapatrier et intégrer avec un autre dépôt ou une branche locale" +msgstr "Rapatrier et intégrer un autre dépôt ou une branche locale" #: common-cmds.h:22 msgid "Update remote refs along with associated objects" @@ -9612,7 +10016,7 @@ msgstr "Mettre à jour les références distantes ainsi que les objets associés #: common-cmds.h:23 msgid "Forward-port local commits to the updated upstream head" msgstr "" -"Reporter en avant les validations locales dans la tête en amont mise à jour" +"Reporter les validations locales sur le sommet mis à jour d'une branche amont" #: common-cmds.h:24 msgid "Reset current HEAD to the specified state" @@ -9620,7 +10024,7 @@ msgstr "Réinitialiser la HEAD courante à l'état spécifié" #: common-cmds.h:25 msgid "Remove files from the working tree and from the index" -msgstr "Supprimer les fichiers de la copie de travail et de l'index" +msgstr "Supprimer des fichiers de la copie de travail et de l'index" #: common-cmds.h:26 msgid "Show various types of objects" @@ -9853,8 +10257,8 @@ msgstr "" "<branchevalide>'." #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "refus de bissecter sur un arbre 'seeked'" +msgid "won't bisect on cg-seek'ed tree" +msgstr "refus de bissecter sur un arbre 'cg-seeked'" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" @@ -9991,7 +10395,7 @@ msgstr "" msgid "Pull is not possible because you have unmerged files." msgstr "Le pull n'est pas possible car vous avez des fichiers non fusionnés." -#: git-pull.sh:203 +#: git-pull.sh:223 msgid "updating an unborn branch with changes added to the index" msgstr "" "mise à jour d'une branche non encore créée avec les changements ajoutés dans " @@ -10001,7 +10405,7 @@ msgstr "" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -10012,15 +10416,15 @@ msgstr "" "Attention : mise à jour en avance rapide de votre copie de travail\n" "Attention : depuis la validation $orig_head." -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "Impossible de fusionner de multiples branches sur une tête vide" -#: git-pull.sh:264 +#: git-pull.sh:276 msgid "Cannot rebase onto multiple branches" msgstr "Impossible de rebaser sur de multiples branches" -#: git-rebase.sh:54 +#: git-rebase.sh:55 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" @@ -10032,16 +10436,16 @@ msgstr "" "Pour extraire la branche d'origine et stopper le rebasage, lancez \"git " "rebase --abort\"." -#: git-rebase.sh:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "Autoremisage appliqué." -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "Impossible de stocker $stash_sha1" -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" @@ -10051,33 +10455,33 @@ msgstr "" "Vos modifications sont à l'abri dans la remise.\n" "Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." msgstr "Le crochet pre-rebase a refusé de rebaser." -#: git-rebase.sh:195 +#: git-rebase.sh:206 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "Il semble que git-am soit en cours. Impossible de rebaser." -#: git-rebase.sh:329 +#: git-rebase.sh:346 msgid "The --exec option must be used with the --interactive option" msgstr "L'option --exec doit être utilisée avec l'option --interactive" -#: git-rebase.sh:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "Pas de rebasage en cours ?" -#: git-rebase.sh:345 +#: git-rebase.sh:362 msgid "The --edit-todo action can only be used during interactive rebase." msgstr "" "L'action --edit-todo peut seulement être utilisée lors d'un rebasage " "interactif." -#: git-rebase.sh:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "Impossible de lire HEAD" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -10085,12 +10489,12 @@ msgstr "" "Vous devez éditer tous les conflits de fusion et\n" "les marquer comme résolus avec git add" -#: git-rebase.sh:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "Impossible de revenir à $head_name" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -10103,74 +10507,75 @@ msgid "" "valuable there." msgstr "" "Il semble qu'il y ait déjà un répertoire $state_dir_base, et je me demande\n" -"si vous n'êtes pas au milieu d'un autre rebasage. Si c'est le cas,\n" -"merci d'essayer\n" +"si un autre rebasage n'est pas déjà en cours. Si c'est le cas,\n" +"essayez\n" "\t$cmd_live_rebase\n" -"Si ça n'est pas le cas, merci de\n" +"Sinon, essayez\n" "\t$cmd_clear_stale_rebase\n" "puis relancez-moi à nouveau. Je m'arrête au cas où vous auriez quelque " "chose\n" "d'important ici." -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "invalide $upstream_name en amont" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name : il y a plus d'une base de fusion" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name : il n'y a pas de base de fusion" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Ne pointe pas sur une validation valide : $onto_name" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "fatal : pas de branche : $branch_name" -#: git-rebase.sh:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "Autoremisage impossible" -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "Autoremisage créé : $stash_abbrev" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "Veuillez les valider ou les remiser." -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "La branche courante $branch_name est à jour." -#: git-rebase.sh:552 +#: git-rebase.sh:581 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "La branche courante $branch_name est à jour, rebasage forcé." -#: git-rebase.sh:563 +#: git-rebase.sh:592 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Changements de $mb sur $onto :" #. Detach HEAD and reset the tree -#: git-rebase.sh:572 +#: git-rebase.sh:601 msgid "First, rewinding head to replay your work on top of it..." -msgstr "Premièrement, retour de head pour rejouer votre travail par-dessus..." +msgstr "" +"Premièrement, rembobinons head pour rejouer votre travail par-dessus..." -#: git-rebase.sh:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "$branch_name mise à jour en avance rapide sur $onto_name." @@ -10218,7 +10623,7 @@ msgstr "Impossible de mettre à jour $ref_stash avec $w_commit" #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" @@ -10227,98 +10632,85 @@ msgstr "" "erreur: option inconnue pour 'stash save': $option\n" " Pour fournir un message, utilisez git stash save -- '$option'" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" -msgstr "Pas de changements en local à sauver" - -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "" -"Les fichiers suivants non suivis ne seront PAS sauvés mais doivent être " -"supprimés par l'état du remisage :" +msgstr "Pas de modifications locales à sauver" -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "Abandon. Utilisez l'option --force ou --include-untracked." - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "Impossible d'initialiser le remisage" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "Impossible de sauver le statut courant" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "Impossible de supprimer les changements de la copie de travail" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." msgstr "Pas de remisage trouvé." -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "Trop de révisions spécifiées : $REV" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "$reference n'est pas une référence valide" -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "'$args' n'est pas une validation de type remisage" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "'$args' n'est pas une référence de remisage" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "impossible de rafraîchir l'index" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" -msgstr "Impossible d'appliquer un remisage au milieu d'une fusion" +msgstr "Impossible d'appliquer un remisage en cours de fusion" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "Conflits dans l'index. Essayez sans --index." -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "Impossible de sauver l'arbre d'index" -#: git-stash.sh:503 +#: git-stash.sh:491 msgid "Cannot unstage modified files" msgstr "Impossible de désindexer les fichiers modifiés" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." -msgstr "L'index n'a pas été sorti de remise" +msgstr "L'index n'a pas été sorti de remise." -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "${REV} supprimé ($s)" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Impossible de supprimer l'élément de stash" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "Aucune branche spécifiée" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "(Pour les restaurer tapez \"git stash apply\")" @@ -10440,49 +10832,49 @@ msgstr "Échec d'enregistrement du sous-module '$sm_path'" msgid "Entering '$prefix$displaypath'" msgstr "Entrée dans '$prefix$displaypath'" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "" "Arrêt sur '$prefix$displaypath' ; le script a retourné un statut non nul." -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "" "URL non trouvé pour le chemin de sous-module '$displaypath' dans .gitmodules" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "" "Échec d'enregistrement de l'URL pour le chemin de sous-module '$displaypath'" -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'" -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "" "Échec d'enregistrement du mode de mise à jour pour le chemin de sous-module " "'$displaypath'" -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "" "Utilisez '.' si vous voulez vraiment réinitialiser tous les sous-modules" -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "" "La copie de travail du sous-module '$displaypath' contient un répertoire .git" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -10490,7 +10882,7 @@ msgstr "" "(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son " "historique)" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " @@ -10499,30 +10891,30 @@ msgstr "" "La copie de travail du sous-module '$displaypath' contient des modifications " "locales ; utilisez '-f' pour les annuler" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "Répertoire '$displaypath' nettoyé" -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "" "Impossible de supprimer la copie de travail du sous-module '$displaypath'" -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "Impossible de créer le répertoire vide du sous-module '$displaypath'" -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "" "Le sous-module '$name' ($url) n'est pas enregistré pour le chemin " "'$displaypath'" -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" @@ -10531,46 +10923,46 @@ msgstr "" "Chemin de sous-module '$displaypath' non initialisé\n" "Peut-être souhaitez-vous utiliser 'update --init' ?" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "" "Impossible de trouver la révision courante dans le chemin de sous-module " "'$displaypath'" -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'" -#: git-submodule.sh:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "" "Impossible de rebaser '$sha1' dans le chemin de sous-module '$displaypath'" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "" "Impossible de fusionner '$sha1' dans le chemin de sous-module '$displaypath'" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" @@ -10578,72 +10970,96 @@ msgstr "" "L'exécution de '$command $sha1' a échoué dans le chemin de sous-module " "'$prefix$sm_path'" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "" "Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'" -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 msgid "The --cached option cannot be used with the --files option" msgstr "L'option --cached ne peut pas être utilisée avec l'option --files" #. unexpected type -#: git-submodule.sh:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "mode $mod_dst inattendu" -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr " Attention : $display_name ne contient pas la validation $sha1_src" -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr " Attention : $display_name ne contient pas la validation $sha1_dst" -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" " Attention : $display_name ne contient pas les validations $sha1_src et " "$sha1_dst" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "blob" -#: git-submodule.sh:1155 -msgid "Submodules changed but not updated:" -msgstr "Sous-modules modifiés mais non mis à jour :" - -#: git-submodule.sh:1157 -msgid "Submodule changes to be committed:" -msgstr "Changements du sous-module à valider :" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'" -#: git-submodule.sh:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "Synchronisation de l'URL sous-module pour '$displaypath'" + +#~ msgid "copied: %s -> %s" +#~ msgstr "" + +#~ msgid "deleted: %s" +#~ msgstr "supprimé : %s" + +#~ msgid "modified: %s" +#~ msgstr "modifié : %s" + +#~ msgid "renamed: %s -> %s" +#~ msgstr "renommé : %s -> %s" + +#~ msgid "unmerged: %s" +#~ msgstr "non fus. : %s" + +#~ msgid "input paths are terminated by a null character" +#~ msgstr "les chemins en entrée sont terminés par le caractère nul" + +#~ msgid "done\n" +#~ msgstr "fait\n" + +#~ msgid "" +#~ "The following untracked files would NOT be saved but need to be removed " +#~ "by stash save:" +#~ msgstr "" +#~ "Les fichiers suivants non suivis ne seront PAS sauvés mais doivent être " +#~ "supprimés par le remisage :" + +#~ msgid "" +#~ "Aborting. Consider using either the --force or --include-untracked option." +#~ msgstr "Abandon. Utilisez l'option --force ou --include-untracked." diff --git a/po/git.pot b/po/git.pot index c91e197521..33cc31d51b 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: 2013-08-06 14:10+0800\n" +"POT-Creation-Date: 2014-02-01 08:06+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" @@ -52,71 +52,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "" + +#: archive.c:327 msgid "fmt" msgstr "" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" msgstr "" -#: archive.c:325 +#: archive.c:329 msgid "prepend prefix to each pathname in the archive" msgstr "" -#: archive.c:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 msgid "retrieve the archive from remote repository <repo>" msgstr "" -#: archive.c:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "" @@ -195,17 +200,17 @@ msgstr "" msgid "Cannot force update the current branch." msgstr "" -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "" -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -217,87 +222,87 @@ msgid "" "\"git push -u\" to set the upstream config as you push." msgstr "" -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "" -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "" -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "" -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "" -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "" -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" msgstr "" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "" msgstr[1] "" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "" -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "" msgstr[1] "" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "" @@ -332,16 +337,16 @@ msgstr "" msgid "memory exhausted" msgstr "" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "" @@ -413,36 +418,41 @@ msgid_plural "%lu years ago" msgstr[0] "" msgstr[1] "" -#: diff.c:112 +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "" + +#: diff.c:113 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr "" -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr "" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" "%s" msgstr "" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" "%s" msgstr "" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "" @@ -469,17 +479,17 @@ msgstr "" msgid "failed writing detached signature to '%s': %s" msgstr "" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "" @@ -544,8 +554,8 @@ msgstr "" msgid "failed to read the cache" msgstr "" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 msgid "unable to write new index file" msgstr "" @@ -594,7 +604,7 @@ msgstr "" msgid "blob expected for %s '%s'" msgstr "" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "" @@ -640,7 +650,7 @@ msgstr "" msgid "rename" msgstr "" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "" @@ -699,7 +709,7 @@ msgstr "" msgid "modify" msgstr "" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "" @@ -721,7 +731,7 @@ msgstr "" msgid "Auto-merging %s" msgstr "" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "" @@ -791,7 +801,7 @@ msgstr "" msgid "Could not parse object '%s'" msgstr "" -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "" @@ -816,58 +826,151 @@ msgstr "" msgid "Bad %s value: '%s'" msgstr "" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "" -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "" -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr "" -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr "" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "" + +#: pathspec.c:241 #, c-format -msgid "Path '%s' is in submodule '%.*s'" +msgid "%s: '%s' is outside repository" msgstr "" -#: pathspec.c:99 +#: pathspec.c:291 #, c-format -msgid "'%s' is beyond a symbolic link" +msgid "Pathspec '%s' is in submodule '%.*s'" msgstr "" -#: remote.c:1788 +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "" + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "" + +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr "" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "" + +#: remote.c:1882 #, 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] "" msgstr[1] "" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr "" -#: remote.c:1797 +#: remote.c:1891 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -875,11 +978,11 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr "" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -890,7 +993,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr "" @@ -903,14 +1006,14 @@ msgstr "" msgid "dup2(%d,%d) failed" msgstr "" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "" -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "" @@ -928,7 +1031,7 @@ msgid "" "and commit the result with 'git commit'" msgstr "" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "" @@ -951,201 +1054,201 @@ msgid "Commit your changes or stash them to proceed." msgstr "" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:324 +#: sequencer.c:325 #, c-format msgid "%s: Unable to write new index file" msgstr "" -#: sequencer.c:355 +#: sequencer.c:356 msgid "Could not resolve HEAD commit\n" msgstr "" -#: sequencer.c:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "" -#: sequencer.c:422 +#: sequencer.c:423 #, c-format msgid "Could not parse commit %s\n" msgstr "" -#: sequencer.c:427 +#: sequencer.c:428 #, c-format msgid "Could not parse parent commit %s\n" msgstr "" -#: sequencer.c:493 +#: sequencer.c:494 msgid "Your index file is unmerged." msgstr "" -#: sequencer.c:512 +#: sequencer.c:513 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -#: sequencer.c:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" msgstr "" -#: sequencer.c:524 +#: sequencer.c:525 #, 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:537 +#: sequencer.c:538 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "" -#: sequencer.c:541 +#: sequencer.c:542 #, c-format msgid "Cannot get commit message for %s" msgstr "" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" msgstr "" -#: sequencer.c:672 +#: sequencer.c:673 #, c-format msgid "git %s: failed to read the index" msgstr "" -#: sequencer.c:677 +#: sequencer.c:678 #, c-format msgid "git %s: failed to refresh the index" msgstr "" -#: sequencer.c:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "" -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." msgstr "" -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "" -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "" -#: sequencer.c:850 +#: sequencer.c:851 msgid "a cherry-pick or revert is already in progress" msgstr "" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "" -#: sequencer.c:855 +#: sequencer.c:856 #, c-format msgid "Could not create sequencer directory %s" msgstr "" -#: sequencer.c:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "" -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "" -#: sequencer.c:894 +#: sequencer.c:895 msgid "cannot abort from a branch yet to be born" msgstr "" -#: sequencer.c:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" msgstr "" -#: sequencer.c:926 +#: sequencer.c:927 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" -#: sequencer.c:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." msgstr "" -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" msgstr "" -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "" -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1158,360 +1261,443 @@ msgid "" "running \"git config advice.objectNameWarning false\"" msgstr "" -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" msgstr "" -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "" -#: wrapper.c:408 +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "" -#: wrapper.c:440 +#: wrapper.c:454 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "" -#: wrapper.c:441 +#: wrapper.c:455 msgid "no such user" msgstr "" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "" -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr "" -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr "" -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr "" -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr "" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "" -#: wt-status.c:207 +#: wt-status.c:216 msgid "Changes not staged for commit:" msgstr "" -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr "" -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" -#: wt-status.c:214 +#: wt-status.c:223 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" -#: wt-status.c:216 +#: wt-status.c:225 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "" -#: wt-status.c:286 -msgid "new commits, " +#: wt-status.c:275 +msgid "new file" msgstr "" -#: wt-status.c:288 -msgid "modified content, " +#: wt-status.c:277 +msgid "copied" msgstr "" -#: wt-status.c:290 -msgid "untracked content, " +#: wt-status.c:279 +msgid "deleted" msgstr "" -#: wt-status.c:307 -#, c-format -msgid "new file: %s" +#: wt-status.c:285 +msgid "typechange" msgstr "" -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" +#: wt-status.c:287 +msgid "unknown" msgstr "" -#: wt-status.c:313 -#, c-format -msgid "deleted: %s" +#: wt-status.c:289 +msgid "unmerged" msgstr "" -#: wt-status.c:316 -#, c-format -msgid "modified: %s" +#: wt-status.c:336 +msgid "new commits, " msgstr "" -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" +#: wt-status.c:338 +msgid "modified content, " msgstr "" -#: wt-status.c:322 -#, c-format -msgid "typechange: %s" +#: wt-status.c:340 +msgid "untracked content, " msgstr "" -#: wt-status.c:325 +#: wt-status.c:357 #, c-format -msgid "unknown: %s" +msgid "bug: unhandled diff status %c" msgstr "" -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" msgstr "" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" msgstr "" -#: wt-status.c:803 +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" + +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "" -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" msgstr "" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "" -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr "" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." msgstr "" -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "" -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr "" -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr "" -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr "" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." msgstr "" -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 msgid "You are currently rebasing." msgstr "" -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr "" -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr "" -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr "" -#: wt-status.c:918 +#: wt-status.c:1014 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr "" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." msgstr "" -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." msgstr "" -#: wt-status.c:930 +#: wt-status.c:1026 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr "" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." msgstr "" -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr "" -#: wt-status.c:944 +#: wt-status.c:1040 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr "" -#: wt-status.c:954 -msgid "You are currently cherry-picking." +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." msgstr "" -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr "" -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr "" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." msgstr "" -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr "" -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr "" -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr "" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "" -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." msgstr "" -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr "" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "" -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " msgstr "" -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " msgstr "" -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " msgstr "" -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "" -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" msgstr "" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1519,82 +1705,86 @@ msgid "" "new files yourself (see 'git help status')." msgstr "" -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" msgstr "" -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr "" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" -#: wt-status.c:1251 +#: wt-status.c:1350 #, c-format msgid "no changes added to commit\n" msgstr "" -#: wt-status.c:1254 +#: wt-status.c:1353 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " "track)\n" msgstr "" -#: wt-status.c:1257 +#: wt-status.c:1356 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "" -#: wt-status.c:1260 +#: wt-status.c:1359 #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" -#: wt-status.c:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" msgstr "" -#: wt-status.c:1266 +#: wt-status.c:1365 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "" -#: wt-status.c:1270 +#: wt-status.c:1369 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "" -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " msgstr "" -#: wt-status.c:1399 +#: wt-status.c:1514 +msgid "gone" +msgstr "" + +#: wt-status.c:1516 msgid "behind " msgstr "" -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "" -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr "" -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" msgstr "" @@ -1654,7 +1844,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "" @@ -1663,140 +1853,135 @@ msgstr "" msgid "remove '%s'\n" msgstr "" -#: builtin/add.c:253 +#: builtin/add.c:237 msgid "Unstaged changes after refreshing the index:" msgstr "" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "" -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "" -#: builtin/add.c:359 +#: builtin/add.c:319 #, c-format msgid "Could not stat '%s'" msgstr "" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." msgstr "" -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" msgstr "" -#: builtin/add.c:377 +#: builtin/add.c:337 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" -#: builtin/add.c:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "" -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" msgstr "" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "" -#: builtin/add.c:400 +#: builtin/add.c:360 msgid "allow adding otherwise ignored files" msgstr "" -#: builtin/add.c:401 +#: builtin/add.c:361 msgid "update tracked files" msgstr "" -#: builtin/add.c:402 +#: builtin/add.c:362 msgid "record only the fact that the path will be added later" msgstr "" -#: builtin/add.c:403 +#: builtin/add.c:363 msgid "add changes from all tracked and untracked files" msgstr "" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "" -#: builtin/add.c:408 +#: builtin/add.c:368 msgid "don't add, only refresh the index" msgstr "" -#: builtin/add.c:409 +#: builtin/add.c:369 msgid "just skip files which cannot be added because of errors" msgstr "" -#: builtin/add.c:410 +#: builtin/add.c:370 msgid "check if - even missing - files are ignored in dry run" msgstr "" -#: builtin/add.c:432 +#: builtin/add.c:392 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "" -#: builtin/add.c:433 +#: builtin/add.c:393 msgid "no files added" msgstr "" -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "" -#: builtin/add.c:496 +#: builtin/add.c:456 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "" -#: builtin/add.c:526 +#: builtin/add.c:486 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "" -#: builtin/add.c:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 msgid "Unable to write new index file" msgstr "" @@ -2042,7 +2227,7 @@ msgstr "" msgid "Checking patch %s..." msgstr "" -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "" @@ -2122,8 +2307,8 @@ msgstr "" msgid "unable to read index file" msgstr "" -#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "" @@ -2183,7 +2368,7 @@ msgstr "" msgid "build a temporary index based on embedded index information" msgstr "" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "" @@ -2313,103 +2498,103 @@ msgstr "" msgid "update BISECT_HEAD instead of checking out the current commit" msgstr "" -#: builtin/blame.c:26 +#: builtin/blame.c:27 msgid "git blame [options] [rev-opts] [rev] [--] file" msgstr "" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 msgid "Show blame entries as we find them, incrementally" msgstr "" -#: builtin/blame.c:2277 +#: builtin/blame.c:2250 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "" -#: builtin/blame.c:2278 +#: builtin/blame.c:2251 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "" -#: builtin/blame.c:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 msgid "Show output score for blame entries" msgstr "" -#: builtin/blame.c:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 msgid "Show in a format designed for machine consumption" msgstr "" -#: builtin/blame.c:2284 +#: builtin/blame.c:2257 msgid "Show porcelain format with per-line commit information" msgstr "" -#: builtin/blame.c:2285 +#: builtin/blame.c:2258 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "" -#: builtin/blame.c:2286 +#: builtin/blame.c:2259 msgid "Show raw timestamp (Default: off)" msgstr "" -#: builtin/blame.c:2287 +#: builtin/blame.c:2260 msgid "Show long commit SHA1 (Default: off)" msgstr "" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 msgid "Suppress author name and timestamp (Default: off)" msgstr "" -#: builtin/blame.c:2289 +#: builtin/blame.c:2262 msgid "Show author email instead of name (Default: off)" msgstr "" -#: builtin/blame.c:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 msgid "Spend extra cycles to find better match" msgstr "" -#: builtin/blame.c:2292 +#: builtin/blame.c:2265 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "" -#: builtin/blame.c:2293 +#: builtin/blame.c:2266 msgid "Use <file>'s contents as the final image" msgstr "" -#: builtin/blame.c:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 msgid "Find line copies within and across files" msgstr "" -#: builtin/blame.c:2295 +#: builtin/blame.c:2268 msgid "Find line movements within and across files" msgstr "" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "" @@ -2507,282 +2692,292 @@ msgstr "" msgid "branch '%s' does not point at a commit" msgstr "" -#: builtin/branch.c:453 +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "" -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "" -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "" -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "" -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "" -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "" -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" msgstr "" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" msgstr "" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "" -#: builtin/branch.c:682 +#: builtin/branch.c:694 msgid "cannot rename the current branch while not on any." msgstr "" -#: builtin/branch.c:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" msgstr "" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" msgstr "" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "" -#: builtin/branch.c:722 +#: builtin/branch.c:734 msgid "Branch is renamed, but update of config-file failed" msgstr "" -#: builtin/branch.c:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, c-format msgid "could not write branch description template: %s" msgstr "" -#: builtin/branch.c:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "" -#: builtin/branch.c:793 +#: builtin/branch.c:805 msgid "show hash and subject, give twice for upstream branch" msgstr "" -#: builtin/branch.c:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" msgstr "" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" msgstr "" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 msgid "print only branches that contain the commit" msgstr "" -#: builtin/branch.c:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "" -#: builtin/branch.c:823 +#: builtin/branch.c:835 msgid "move/rename a branch and its reflog" msgstr "" -#: builtin/branch.c:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" msgstr "" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" msgstr "" -#: builtin/branch.c:832 +#: builtin/branch.c:844 msgid "print only not merged branches" msgstr "" -#: builtin/branch.c:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "" -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" msgstr "" -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "" -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "" -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" msgstr "" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." msgstr "" -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" msgstr "" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" msgstr "" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" msgstr "" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" msgstr "" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" -#: builtin/branch.c:996 +#: builtin/branch.c:1008 #, 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:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -2790,12 +2985,12 @@ msgid "" "\n" msgstr "" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr "" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr "" @@ -2813,43 +3008,43 @@ msgstr "" msgid "Need a repository to unbundle." msgstr "" -#: builtin/cat-file.c:285 +#: builtin/cat-file.c:328 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" msgstr "" -#: builtin/cat-file.c:286 +#: builtin/cat-file.c:329 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" msgstr "" -#: builtin/cat-file.c:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 msgid "exit with zero when there's no error" msgstr "" -#: builtin/cat-file.c:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 msgid "for blob objects, run textconv on object's content" msgstr "" -#: builtin/cat-file.c:332 +#: builtin/cat-file.c:375 msgid "show info and content of objects fed from the standard input" msgstr "" -#: builtin/cat-file.c:335 +#: builtin/cat-file.c:378 msgid "show info about objects fed from the standard input" msgstr "" @@ -2874,10 +3069,10 @@ msgid "read file names from stdin" msgstr "" #: builtin/check-attr.c:23 builtin/check-ignore.c:24 -msgid "input paths are terminated by a null character" +msgid "terminate input and output records by a NUL character" msgstr "" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "" @@ -2885,27 +3080,31 @@ msgstr "" msgid "show non-matching input paths" msgstr "" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "" -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" msgstr "" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "" -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "" -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "" @@ -2978,106 +3177,106 @@ msgstr "" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "" -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, c-format msgid "path '%s' does not have our version" msgstr "" -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have their version" msgstr "" -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "" -#: builtin/checkout.c:179 +#: builtin/checkout.c:176 #, c-format msgid "path '%s' does not have necessary versions" msgstr "" -#: builtin/checkout.c:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, c-format msgid "Unable to add merge result for '%s'" msgstr "" -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, c-format msgid "'%s' cannot be used with updating paths" msgstr "" -#: builtin/checkout.c:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" msgstr "" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, c-format msgid "Cannot update paths and switch to branch '%s' at the same time." msgstr "" -#: builtin/checkout.c:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "" -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" msgstr "" -#: builtin/checkout.c:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "" -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr "" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3092,7 +3291,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/checkout.c:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3102,184 +3301,188 @@ msgid "" "\n" msgstr "" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" msgstr "" -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 msgid "You are on a branch yet to be born" msgstr "" -#. case (1) -#: builtin/checkout.c:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "" + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" msgstr "" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" msgstr "" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 msgid "paths cannot be used with switching branches" msgstr "" -#: builtin/checkout.c:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "" -#: builtin/checkout.c:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "" -#: builtin/checkout.c:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" msgstr "" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 msgid "detach the HEAD at named commit" msgstr "" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" msgstr "" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" msgstr "" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 msgid "checkout our version for unmerged files" msgstr "" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1102 msgid "checkout their version for unmerged files" msgstr "" -#: builtin/checkout.c:1068 +#: builtin/checkout.c:1104 msgid "force checkout (throw away local modifications)" msgstr "" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1105 msgid "perform a 3-way merge with the new branch" msgstr "" -#: builtin/checkout.c:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" msgstr "" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" msgstr "" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 msgid "second guess 'git checkout no-such-branch'" msgstr "" -#: builtin/checkout.c:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" msgstr "" -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "" -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" "Did you intend to checkout '%s' which can not be resolved as commit?" msgstr "" -#: builtin/checkout.c:1172 +#: builtin/checkout.c:1209 #, c-format msgid "git checkout: --detach does not take a path argument '%s'" msgstr "" -#: builtin/checkout.c:1176 +#: builtin/checkout.c:1213 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" -#: builtin/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3287,7 +3490,7 @@ msgid "" " - (empty) select nothing" msgstr "" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3299,35 +3502,35 @@ msgid "" " - (empty) finish selecting" msgstr "" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " msgstr "" -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " msgstr "" -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "" -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3338,21 +3541,21 @@ msgid "" "? - help for prompt selection" msgstr "" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "" msgstr[1] "" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "" @@ -3372,8 +3575,8 @@ msgstr "" msgid "remove whole directories" msgstr "" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "" @@ -3409,8 +3612,8 @@ msgstr "" msgid "git clone [options] [--] <repo> [<dir>]" msgstr "" -#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" msgstr "" @@ -3422,227 +3625,241 @@ msgstr "" msgid "create a bare repository" msgstr "" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" msgstr "" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "" -#: builtin/clone.c:76 +#: builtin/clone.c:75 msgid "don't use local hardlinks, always copy" msgstr "" -#: builtin/clone.c:78 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 msgid "initialize submodules in the clone" msgstr "" -#: builtin/clone.c:83 builtin/init-db.c:485 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" msgstr "" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 builtin/init-db.c:486 msgid "directory from which templates will be used" msgstr "" -#: builtin/clone.c:86 +#: builtin/clone.c:85 msgid "reference repository" msgstr "" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "" -#: builtin/clone.c:88 +#: builtin/clone.c:87 msgid "use <name> instead of 'origin' to track upstream" msgstr "" -#: builtin/clone.c:90 +#: builtin/clone.c:89 msgid "checkout <branch> instead of the remote's HEAD" msgstr "" -#: builtin/clone.c:92 +#: builtin/clone.c:91 msgid "path to git-upload-pack on the remote" msgstr "" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" msgstr "" -#: builtin/clone.c:94 +#: builtin/clone.c:93 msgid "create a shallow clone of that depth" msgstr "" -#: builtin/clone.c:96 +#: builtin/clone.c:95 msgid "clone only one branch, HEAD or --branch" msgstr "" -#: builtin/clone.c:97 builtin/init-db.c:494 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr "" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 builtin/init-db.c:495 msgid "separate git dir from working tree" msgstr "" -#: builtin/clone.c:99 +#: builtin/clone.c:98 msgid "key=value" msgstr "" -#: builtin/clone.c:100 +#: builtin/clone.c:99 msgid "set config inside the new repository" msgstr "" -#: builtin/clone.c:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "" -#: builtin/clone.c:316 +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "" + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "" + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" msgstr "" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" msgstr "" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" "and retry the checkout with 'git checkout -f HEAD'\n" msgstr "" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "" -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " msgstr "" -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "" -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" -#: builtin/clone.c:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "" -#: builtin/clone.c:764 +#: builtin/clone.c:769 msgid "You must specify a repository to clone." msgstr "" -#: builtin/clone.c:775 +#: builtin/clone.c:780 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "" -#: builtin/clone.c:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "" -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "" -#: builtin/clone.c:796 +#: builtin/clone.c:802 msgid "--depth is ignored in local clones; use file:// instead." msgstr "" -#: builtin/clone.c:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "" + +#: builtin/clone.c:824 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "" -#: builtin/clone.c:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "" -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, c-format msgid "could not create leading directories of '%s'" msgstr "" -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, c-format msgid "could not create work tree dir '%s'." msgstr "" -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, c-format msgid "Don't know how to clone %s" msgstr "" -#: builtin/clone.c:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "" -#: builtin/clone.c:949 +#: builtin/clone.c:968 msgid "You appear to have cloned an empty repository." msgstr "" @@ -3678,15 +3895,15 @@ msgstr "" msgid "--command must be the first argument" msgstr "" -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." msgstr "" -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." msgstr "" -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3700,14 +3917,14 @@ msgid "" " git commit --amend --reset-author\n" msgstr "" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3716,11 +3933,11 @@ msgid "" "\n" msgstr "" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -3730,93 +3947,93 @@ msgid "" "the remaining commits.\n" msgstr "" -#: builtin/commit.c:279 +#: builtin/commit.c:287 msgid "failed to unpack HEAD tree object" msgstr "" -#: builtin/commit.c:321 +#: builtin/commit.c:329 msgid "unable to create temporary index" msgstr "" -#: builtin/commit.c:327 +#: builtin/commit.c:335 msgid "interactive add failed" msgstr "" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 msgid "unable to write new_index file" msgstr "" -#: builtin/commit.c:412 +#: builtin/commit.c:420 msgid "cannot do a partial commit during a merge." msgstr "" -#: builtin/commit.c:414 +#: builtin/commit.c:422 msgid "cannot do a partial commit during a cherry-pick." msgstr "" -#: builtin/commit.c:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "" -#: builtin/commit.c:444 +#: builtin/commit.c:452 msgid "unable to write temporary index file" msgstr "" -#: builtin/commit.c:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" msgstr "" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" msgstr "" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, c-format msgid "could not lookup commit %s" msgstr "" -#: builtin/commit.c:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, c-format msgid "(reading log message from standard input)\n" msgstr "" -#: builtin/commit.c:635 +#: builtin/commit.c:644 msgid "could not read log from standard input" msgstr "" -#: builtin/commit.c:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" msgstr "" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "" -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" msgstr "" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -3826,7 +4043,7 @@ msgid "" "and try again.\n" msgstr "" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -3836,14 +4053,14 @@ msgid "" "and try again.\n" msgstr "" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '%c' will be ignored, and an empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -3851,478 +4068,482 @@ msgid "" "An empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "" -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" msgstr "" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" msgstr "" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "" -#: builtin/commit.c:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "" -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "" -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 msgid "Using both --reset-author and --author does not make sense" msgstr "" -#: builtin/commit.c:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." msgstr "" -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 msgid "You are in the middle of a merge -- cannot amend." msgstr "" -#: builtin/commit.c:1055 +#: builtin/commit.c:1080 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" -#: builtin/commit.c:1058 +#: builtin/commit.c:1083 msgid "Options --squash and --fixup cannot be used together" msgstr "" -#: builtin/commit.c:1068 +#: builtin/commit.c:1093 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "" -#: builtin/commit.c:1070 +#: builtin/commit.c:1095 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "" -#: builtin/commit.c:1078 +#: builtin/commit.c:1103 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" -#: builtin/commit.c:1095 +#: builtin/commit.c:1120 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" -#: builtin/commit.c:1097 +#: builtin/commit.c:1122 msgid "No paths with --include/--only does not make sense." msgstr "" -#: builtin/commit.c:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." msgstr "" -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -#: builtin/commit.c:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 msgid "Paths with -a does not make sense." msgstr "" -#: builtin/commit.c:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" -#: builtin/commit.c:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" msgstr "" -#: builtin/commit.c:1242 +#: builtin/commit.c:1271 msgid "list untracked files in columns" msgstr "" -#: builtin/commit.c:1313 +#: builtin/commit.c:1340 msgid "couldn't look up newly created commit" msgstr "" -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "" -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "" -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr "" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 msgid "suppress summary after successful commit" msgstr "" -#: builtin/commit.c:1426 +#: builtin/commit.c:1453 msgid "show diff in commit message template" msgstr "" -#: builtin/commit.c:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" msgstr "" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" msgstr "" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" msgstr "" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 msgid "reuse and edit message from specified commit" msgstr "" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" msgstr "" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 msgid "use autosquash formatted message to fixup specified commit" msgstr "" -#: builtin/commit.c:1436 +#: builtin/commit.c:1463 msgid "use autosquash formatted message to squash specified commit" msgstr "" -#: builtin/commit.c:1437 +#: builtin/commit.c:1464 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "" -#: builtin/commit.c:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "" -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 msgid "how to strip spaces and #comments from message" msgstr "" -#: builtin/commit.c:1442 +#: builtin/commit.c:1469 msgid "include status in commit message template" msgstr "" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" msgstr "" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" msgstr "" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 msgid "add specified files to index for commit" msgstr "" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" msgstr "" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 msgid "ok to record a change with an empty message" msgstr "" -#: builtin/commit.c:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "" -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "" -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, c-format msgid "could not read commit message: %s" msgstr "" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" msgstr "" -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "" -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "" -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 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 +#: builtin/config.c:8 msgid "git config [options]" msgstr "" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" msgstr "" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "" -#: builtin/config.c:61 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "" -#: builtin/config.c:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "" + +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "" -#: builtin/config.c:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "" -#: builtin/config.c:71 +#: builtin/config.c:74 msgid "find the color setting: [stdout-is-tty]" msgstr "" -#: builtin/config.c:72 +#: builtin/config.c:75 msgid "Type" msgstr "" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "" -#: builtin/config.c:76 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "" -#: builtin/config.c:77 +#: builtin/config.c:80 msgid "Other" msgstr "" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "" @@ -4444,7 +4665,7 @@ msgstr "" msgid "only consider tags matching <pattern>" msgstr "" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "" @@ -4468,31 +4689,31 @@ msgstr "" msgid "--dirty is incompatible with commit-ishes" msgstr "" -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, c-format msgid "'%s': not a regular file or symlink" msgstr "" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" msgstr "" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "" -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "" @@ -4501,39 +4722,39 @@ msgstr "" msgid "git fast-export [rev-list-opts]" msgstr "" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 msgid "select handling of tags that tag filtered objects" msgstr "" -#: builtin/fast-export.c:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 msgid "Fake a tagger when tags lack one" msgstr "" -#: builtin/fast-export.c:680 +#: builtin/fast-export.c:687 msgid "Output full tree for each commit" msgstr "" -#: builtin/fast-export.c:682 +#: builtin/fast-export.c:689 msgid "Use the done feature to terminate the stream" msgstr "" -#: builtin/fast-export.c:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "" @@ -4553,230 +4774,239 @@ msgstr "" msgid "git fetch --all [<options>]" msgstr "" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "" -#: builtin/fetch.c:64 +#: builtin/fetch.c:79 msgid "path to upload pack on remote end" msgstr "" -#: builtin/fetch.c:65 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 msgid "prune remote-tracking branches no longer on remote" msgstr "" -#: builtin/fetch.c:74 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" msgstr "" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 msgid "prepend this to submodule path output" msgstr "" -#: builtin/fetch.c:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "" + +#: builtin/fetch.c:347 msgid "Couldn't find remote ref HEAD" msgstr "" -#: builtin/fetch.c:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "" -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr "" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "" + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" " 'git remote prune %s' to remove any old, conflicting branches" msgstr "" -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr "" -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr "" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" -#: builtin/fetch.c:742 +#: builtin/fetch.c:794 #, c-format -msgid "Don't know how to fetch from %s" +msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "" -#: builtin/fetch.c:823 +#: builtin/fetch.c:797 #, c-format -msgid "Option \"%s\" value \"%s\" is not valid for %s" +msgid "Option \"%s\" is ignored for %s\n" msgstr "" -#: builtin/fetch.c:826 +#: builtin/fetch.c:853 #, c-format -msgid "Option \"%s\" is ignored for %s\n" +msgid "Don't know how to fetch from %s" msgstr "" -#: builtin/fetch.c:928 +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 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:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "" -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "" -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "" -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" msgstr "" -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, c-format msgid "No such remote or remote group: %s" msgstr "" -#: builtin/fetch.c:1057 +#: builtin/fetch.c:1153 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" @@ -4784,9 +5014,10 @@ msgstr "" msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]" msgstr "" -#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "" @@ -4810,158 +5041,169 @@ msgstr "" msgid "file to read from" msgstr "" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 msgid "git for-each-ref [options] [<pattern>]" msgstr "" -#: builtin/for-each-ref.c:994 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "" -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 msgid "also consider packs and alternate objects" msgstr "" -#: builtin/fsck.c:621 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 msgid "write dangling objects in .git/lost-found" msgstr "" -#: builtin/fsck.c:624 builtin/prune.c:134 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, c-format msgid "insanely long object directory %.*s" msgstr "" -#: builtin/gc.c:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "" -#: builtin/gc.c:181 +#: builtin/gc.c:264 msgid "be more thorough (increased runtime)" msgstr "" -#: builtin/gc.c:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "" + +#: builtin/gc.c:306 #, 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:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" + +#: builtin/gc.c:341 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" -#: builtin/grep.c:22 +#: builtin/grep.c:23 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "" -#: builtin/grep.c:217 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, c-format msgid "unable to grep from object of type %s" msgstr "" -#: builtin/grep.c:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "" @@ -5003,158 +5245,162 @@ msgid "don't match patterns in binary files" msgstr "" #: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "" -#: builtin/grep.c:669 +#: builtin/grep.c:671 msgid "use basic POSIX regular expressions (default)" msgstr "" -#: builtin/grep.c:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "" -#: builtin/grep.c:675 +#: builtin/grep.c:677 msgid "use Perl-compatible regular expressions" msgstr "" -#: builtin/grep.c:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "" -#: builtin/grep.c:682 +#: builtin/grep.c:684 msgid "show filenames relative to top directory" msgstr "" -#: builtin/grep.c:684 +#: builtin/grep.c:686 msgid "show only filenames instead of matching lines" msgstr "" -#: builtin/grep.c:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "" -#: builtin/grep.c:689 +#: builtin/grep.c:691 msgid "show only the names of files without match" msgstr "" -#: builtin/grep.c:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "" -#: builtin/grep.c:693 +#: builtin/grep.c:695 msgid "show the number of matches instead of matching lines" msgstr "" -#: builtin/grep.c:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "" -#: builtin/grep.c:696 +#: builtin/grep.c:698 msgid "print empty line between matches from different files" msgstr "" -#: builtin/grep.c:698 +#: builtin/grep.c:700 msgid "show filename only once above matches from same file" msgstr "" -#: builtin/grep.c:701 +#: builtin/grep.c:703 msgid "show <n> context lines before and after matches" msgstr "" -#: builtin/grep.c:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" msgstr "" -#: builtin/grep.c:710 +#: builtin/grep.c:712 msgid "show a line with the function name before matches" msgstr "" -#: builtin/grep.c:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "" -#: builtin/grep.c:719 +#: builtin/grep.c:721 msgid "combine patterns specified with -e" msgstr "" -#: builtin/grep.c:731 +#: builtin/grep.c:733 msgid "indicate hit with exit status without output" msgstr "" -#: builtin/grep.c:733 +#: builtin/grep.c:735 msgid "show only matches from files that match all patterns" msgstr "" -#: builtin/grep.c:735 +#: builtin/grep.c:737 msgid "show parse tree for grep expression" msgstr "" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "pager" msgstr "" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "show matching files in the pager" msgstr "" -#: builtin/grep.c:742 +#: builtin/grep.c:744 msgid "allow calling of grep(1) (ignored by this build)" msgstr "" -#: builtin/grep.c:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "" -#: builtin/grep.c:865 +#: builtin/grep.c:870 msgid "--open-files-in-pager only works on the worktree" msgstr "" -#: builtin/grep.c:888 +#: builtin/grep.c:893 msgid "--cached or --untracked cannot be used with --no-index." msgstr "" -#: builtin/grep.c:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "" -#: builtin/grep.c:896 +#: builtin/grep.c:901 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" -#: builtin/grep.c:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "" @@ -5253,57 +5499,57 @@ msgid "" "Please consider using 'man.<tool>.path' instead." msgstr "" -#: builtin/help.c:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "" -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "" -#: builtin/help.c:374 +#: builtin/help.c:378 msgid "no info viewer handled the request" msgstr "" -#: builtin/help.c:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "" -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" msgstr "" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "" @@ -5403,8 +5649,8 @@ msgstr "" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "" @@ -5433,155 +5679,155 @@ msgstr "" msgid "Not all child objects of %s are reachable" msgstr "" -#: builtin/index-pack.c:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" msgstr "" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "" -#: builtin/index-pack.c:1151 +#: builtin/index-pack.c:1152 #, c-format msgid "pack has %d unresolved delta" msgid_plural "pack has %d unresolved deltas" msgstr[0] "" msgstr[1] "" -#: builtin/index-pack.c:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" msgstr "" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" msgstr "" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, c-format msgid "invalid number of threads specified (%d)" msgstr "" -#: builtin/index-pack.c:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "" -#: builtin/index-pack.c:1474 +#: builtin/index-pack.c:1475 #, c-format msgid "non delta: %d object" msgid_plural "non delta: %d objects" msgstr[0] "" msgstr[1] "" -#: builtin/index-pack.c:1481 +#: builtin/index-pack.c:1482 #, c-format msgid "chain length = %d: %lu object" msgid_plural "chain length = %d: %lu objects" msgstr[0] "" msgstr[1] "" -#: builtin/index-pack.c:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 msgid "--fix-thin cannot be used without --stdin" msgstr "" -#: builtin/index-pack.c:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "" @@ -5670,11 +5916,6 @@ msgstr "" msgid "unable to move %s to %s" msgstr "" -#: builtin/init-db.c:363 -#, c-format -msgid "Could not create git link %s" -msgstr "" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -5715,32 +5956,32 @@ msgstr "" msgid "specify that the git repository is to be shared amongst several users" msgstr "" -#: builtin/init-db.c:493 builtin/prune-packed.c:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" "dir=<directory>)" msgstr "" -#: builtin/init-db.c:579 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "" -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "" @@ -5753,381 +5994,381 @@ msgstr "" msgid " or: git show [options] <object>..." msgstr "" -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "" -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "" -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "" -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "" -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" msgstr "" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "" -#: builtin/log.c:995 +#: builtin/log.c:1015 msgid "git format-patch [options] [<since> | <revision range>]" msgstr "" -#: builtin/log.c:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "" -#: builtin/log.c:1155 +#: builtin/log.c:1175 msgid "use [PATCH n/m] even with a single patch" msgstr "" -#: builtin/log.c:1158 +#: builtin/log.c:1178 msgid "use [PATCH] even with multiple patches" msgstr "" -#: builtin/log.c:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "" -#: builtin/log.c:1166 +#: builtin/log.c:1186 msgid "use simple number sequence for output file names" msgstr "" -#: builtin/log.c:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "" -#: builtin/log.c:1170 +#: builtin/log.c:1190 msgid "start numbering patches at <n> instead of 1" msgstr "" -#: builtin/log.c:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" msgstr "" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "" -#: builtin/log.c:1183 +#: builtin/log.c:1203 msgid "don't output binary diffs" msgstr "" -#: builtin/log.c:1185 +#: builtin/log.c:1205 msgid "don't include a patch matching a commit upstream" msgstr "" -#: builtin/log.c:1187 +#: builtin/log.c:1207 msgid "show patch format instead of default (patch + stat)" msgstr "" -#: builtin/log.c:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" msgstr "" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "" -#: builtin/log.c:1214 +#: builtin/log.c:1233 msgid "don't print the patch filenames" msgstr "" -#: builtin/log.c:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "" -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "" -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "" -#: builtin/log.c:1340 +#: builtin/log.c:1359 msgid "standard output, or directory, which one?" msgstr "" -#: builtin/log.c:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "" -#: builtin/log.c:1490 +#: builtin/log.c:1509 msgid "Failed to create output files" msgstr "" -#: builtin/log.c:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -#: builtin/log.c:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" msgstr "" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 msgid "identify the file status with tags" msgstr "" -#: builtin/ls-files.c:467 +#: builtin/ls-files.c:457 msgid "use lowercase letters for 'assume unchanged' files" msgstr "" -#: builtin/ls-files.c:469 +#: builtin/ls-files.c:459 msgid "show cached files in the output (default)" msgstr "" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:461 msgid "show deleted files in the output" msgstr "" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:463 msgid "show modified files in the output" msgstr "" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:465 msgid "show other files in the output" msgstr "" -#: builtin/ls-files.c:477 +#: builtin/ls-files.c:467 msgid "show ignored files in the output" msgstr "" -#: builtin/ls-files.c:480 +#: builtin/ls-files.c:470 msgid "show staged contents' object name in the output" msgstr "" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 msgid "show files on the filesystem that need to be removed" msgstr "" -#: builtin/ls-files.c:484 +#: builtin/ls-files.c:474 msgid "show 'other' directories' name only" msgstr "" -#: builtin/ls-files.c:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 msgid "show unmerged files in the output" msgstr "" -#: builtin/ls-files.c:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 msgid "skip files matching pattern" msgstr "" -#: builtin/ls-files.c:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 msgid "read additional per-directory exclude patterns in <file>" msgstr "" -#: builtin/ls-files.c:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 msgid "make the output relative to the project top directory" msgstr "" -#: builtin/ls-files.c:508 +#: builtin/ls-files.c:498 msgid "if any <file> is not in the index, treat this as an error" msgstr "" -#: builtin/ls-files.c:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 msgid "pretend that paths removed since <tree-ish> are still present" msgstr "" -#: builtin/ls-files.c:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 msgid "git ls-tree [<options>] <tree-ish> [<path>...]" msgstr "" -#: builtin/ls-tree.c:125 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 msgid "include object size" msgstr "" -#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "" @@ -6162,148 +6403,148 @@ msgstr "" msgid "Available custom strategies are:" msgstr "" -#: builtin/merge.c:198 +#: builtin/merge.c:191 msgid "do not show a diffstat at the end of the merge" msgstr "" -#: builtin/merge.c:201 +#: builtin/merge.c:194 msgid "show a diffstat at the end of the merge" msgstr "" -#: builtin/merge.c:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "" -#: builtin/merge.c:204 +#: builtin/merge.c:197 msgid "add (at most <n>) entries from shortlog to merge commit message" msgstr "" -#: builtin/merge.c:207 +#: builtin/merge.c:200 msgid "create a single commit instead of doing a merge" msgstr "" -#: builtin/merge.c:209 +#: builtin/merge.c:202 msgid "perform a commit if the merge succeeds (default)" msgstr "" -#: builtin/merge.c:211 +#: builtin/merge.c:204 msgid "edit message before committing" msgstr "" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "" -#: builtin/merge.c:222 +#: builtin/merge.c:215 msgid "option for selected merge strategy" msgstr "" -#: builtin/merge.c:224 +#: builtin/merge.c:217 msgid "merge commit message (for a non-fast-forward merge)" msgstr "" -#: builtin/merge.c:228 +#: builtin/merge.c:221 msgid "abort the current in-progress merge" msgstr "" -#: builtin/merge.c:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "" -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "" -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr "" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, c-format msgid "'%s' does not point to a commit" msgstr "" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "" -#: builtin/merge.c:657 +#: builtin/merge.c:650 msgid "git write-tree failed to write a tree" msgstr "" -#: builtin/merge.c:685 +#: builtin/merge.c:678 msgid "Not handling anything other than two heads merge." msgstr "" -#: builtin/merge.c:699 +#: builtin/merge.c:692 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "" -#: builtin/merge.c:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" -#: builtin/merge.c:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6313,193 +6554,201 @@ msgid "" "the commit.\n" msgstr "" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "" -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" -#: builtin/merge.c:934 +#: builtin/merge.c:927 #, c-format msgid "'%s' is not a commit" msgstr "" -#: builtin/merge.c:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "" -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "" -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." msgstr "" -#: builtin/merge.c:984 +#: builtin/merge.c:977 #, c-format msgid "No remote-tracking branch for %s from %s" msgstr "" -#: builtin/merge.c:1140 +#: builtin/merge.c:1133 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "" -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 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:1159 git-pull.sh:34 +#: builtin/merge.c:1152 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "" -#: builtin/merge.c:1163 +#: builtin/merge.c:1156 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:1166 +#: builtin/merge.c:1159 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" -#: builtin/merge.c:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "" -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "" -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 msgid "Can merge only exactly one commit into empty head" msgstr "" -#: builtin/merge.c:1219 +#: builtin/merge.c:1212 msgid "Squash commit into empty head not supported yet" msgstr "" -#: builtin/merge.c:1221 +#: builtin/merge.c:1214 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "" -#: builtin/merge.c:1226 +#: builtin/merge.c:1219 #, c-format msgid "%s - not something we can merge" msgstr "" -#: builtin/merge.c:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "" -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "" #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "" -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "" -#: builtin/merge.c:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 msgid "Not possible to fast-forward, aborting." msgstr "" -#: builtin/merge.c:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "" -#: builtin/merge.c:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "" -#: builtin/merge.c:1543 +#: builtin/merge.c:1536 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "" -#: builtin/merge.c:1552 +#: builtin/merge.c:1545 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "" -#: builtin/merge.c:1564 +#: builtin/merge.c:1557 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" -#: builtin/merge-base.c:26 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." msgstr "" -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." msgstr "" -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." msgstr "" -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "" + +#: builtin/merge-base.c:214 msgid "output all common ancestors" msgstr "" -#: builtin/merge-base.c:99 +#: builtin/merge-base.c:216 msgid "find ancestors for a single n-way merge" msgstr "" -#: builtin/merge-base.c:100 +#: builtin/merge-base.c:218 msgid "list revs not reachable from others" msgstr "" -#: builtin/merge-base.c:102 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -6554,117 +6803,130 @@ msgstr "" msgid "allow creation of more than one tree" msgstr "" -#: builtin/mv.c:14 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "" -#: builtin/mv.c:64 +#: builtin/mv.c:71 msgid "force move/rename even if target exists" msgstr "" -#: builtin/mv.c:65 +#: builtin/mv.c:72 msgid "skip move/rename errors" msgstr "" -#: builtin/mv.c:108 +#: builtin/mv.c:122 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" msgstr "" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "" -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 msgid "only use tags to name the commits" msgstr "" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:315 msgid "only use refs matching <pattern>" msgstr "" -#: builtin/name-rev.c:318 +#: builtin/name-rev.c:317 msgid "list all commits reachable from all refs" msgstr "" -#: builtin/name-rev.c:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" msgstr "" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "" @@ -6810,12 +7072,12 @@ msgstr "" msgid "The note contents has been left in %s" msgstr "" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "" @@ -6823,7 +7085,7 @@ msgstr "" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "" @@ -6973,7 +7235,7 @@ msgstr "" msgid "use notes from <notes_ref>" msgstr "" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "" @@ -6986,148 +7248,148 @@ msgstr "" msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" msgstr "" -#: builtin/pack-objects.c:183 builtin/pack-objects.c:186 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 msgid "show progress meter during object writing phase" msgstr "" -#: builtin/pack-objects.c:2454 +#: builtin/pack-objects.c:2453 msgid "similar to --all-progress when progress meter is shown" msgstr "" -#: builtin/pack-objects.c:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 msgid "write the pack index file in the specified idx format version" msgstr "" -#: builtin/pack-objects.c:2459 +#: builtin/pack-objects.c:2458 msgid "maximum size of each output pack file" msgstr "" -#: builtin/pack-objects.c:2461 +#: builtin/pack-objects.c:2460 msgid "ignore borrowed objects from alternate object store" msgstr "" -#: builtin/pack-objects.c:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 msgid "limit pack window by objects" msgstr "" -#: builtin/pack-objects.c:2467 +#: builtin/pack-objects.c:2466 msgid "limit pack window by memory in addition to object limit" msgstr "" -#: builtin/pack-objects.c:2469 +#: builtin/pack-objects.c:2468 msgid "maximum length of delta chain allowed in the resulting pack" msgstr "" -#: builtin/pack-objects.c:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 msgid "use threads when searching for best delta matches" msgstr "" -#: builtin/pack-objects.c:2479 +#: builtin/pack-objects.c:2478 msgid "do not create an empty pack output" msgstr "" -#: builtin/pack-objects.c:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr "" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 msgid "limit the objects to those that are not yet packed" msgstr "" -#: builtin/pack-objects.c:2486 +#: builtin/pack-objects.c:2485 msgid "include objects reachable from any reference" msgstr "" -#: builtin/pack-objects.c:2489 +#: builtin/pack-objects.c:2488 msgid "include objects referred by reflog entries" msgstr "" -#: builtin/pack-objects.c:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 msgid "include tag objects that refer to objects to be packed" msgstr "" -#: builtin/pack-objects.c:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 msgid "unpack unreachable objects newer than <time>" msgstr "" -#: builtin/pack-objects.c:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 msgid "ignore packs that have companion .keep file" msgstr "" -#: builtin/pack-objects.c:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" msgstr "" @@ -7151,15 +7413,15 @@ msgstr "" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "" @@ -7167,21 +7429,21 @@ msgstr "" msgid "git push [<options>] [<repository> [<refspec>...]]" msgstr "" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "" -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." msgstr "" -#: builtin/push.c:102 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7196,7 +7458,7 @@ msgid "" "%s" msgstr "" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7206,7 +7468,7 @@ msgid "" " git push %s HEAD:<name-of-remote-branch>\n" msgstr "" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7215,12 +7477,12 @@ msgid "" " git push --set-upstream %s %s\n" msgstr "" -#: builtin/push.c:139 +#: builtin/push.c:181 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "" -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7228,7 +7490,7 @@ msgid "" "to update which remote branch." msgstr "" -#: builtin/push.c:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7240,18 +7502,25 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" "'current' instead of 'simple' if you sometimes use older versions of Git)" msgstr "" -#: builtin/push.c:225 +#: builtin/push.c:274 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" -#: builtin/push.c:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7259,7 +7528,7 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:238 +#: builtin/push.c:287 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" @@ -7267,7 +7536,7 @@ msgid "" "to 'simple', 'current' or 'upstream' to push only the current branch." msgstr "" -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7275,7 +7544,7 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7284,33 +7553,33 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "" -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" "without using the '--force' option.\n" msgstr "" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "" -#: builtin/push.c:324 +#: builtin/push.c:379 #, c-format msgid "failed to push some refs to '%s'" msgstr "" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7323,87 +7592,95 @@ msgid "" " git push <name>\n" msgstr "" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "" -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" msgstr "" -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "" -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" msgstr "" -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "" -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" msgstr "" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" msgstr "" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" msgstr "" -#: builtin/push.c:450 +#: builtin/push.c:505 msgid "push tags (can't be used with --all or --mirror)" msgstr "" -#: builtin/push.c:453 +#: builtin/push.c:508 msgid "force updates" msgstr "" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "" + +#: builtin/push.c:513 msgid "check" msgstr "" -#: builtin/push.c:455 +#: builtin/push.c:514 msgid "control recursive pushing of submodules" msgstr "" -#: builtin/push.c:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" msgstr "" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" msgstr "" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" msgstr "" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" msgstr "" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" msgstr "" -#: builtin/push.c:476 +#: builtin/push.c:535 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "" -#: builtin/push.c:478 +#: builtin/push.c:537 msgid "--delete doesn't make sense without any refs" msgstr "" @@ -7478,197 +7755,201 @@ msgstr "" msgid "debug unpack-trees" msgstr "" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" msgstr "" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "" -#: builtin/remote.c:12 +#: builtin/remote.c:13 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 +#: builtin/remote.c:14 builtin/remote.c:33 msgid "git remote rename <old> <new>" msgstr "" -#: builtin/remote.c:14 builtin/remote.c:37 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "" -#: builtin/remote.c:15 builtin/remote.c:42 -msgid "git remote set-head <name> (-a | -d | <branch>)" +#: builtin/remote.c:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" msgstr "" -#: builtin/remote.c:16 +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "" -#: builtin/remote.c:18 +#: builtin/remote.c:19 msgid "" "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" msgstr "" -#: builtin/remote.c:19 +#: builtin/remote.c:20 msgid "git remote set-branches [--add] <name> <branch>..." msgstr "" -#: builtin/remote.c:20 builtin/remote.c:68 +#: builtin/remote.c:21 builtin/remote.c:69 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" msgstr "" -#: builtin/remote.c:21 builtin/remote.c:69 +#: builtin/remote.c:22 builtin/remote.c:70 msgid "git remote set-url --add <name> <newurl>" msgstr "" -#: builtin/remote.c:22 builtin/remote.c:70 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "" -#: builtin/remote.c:47 -msgid "git remote set-branches <name> <branch>..." +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" msgstr "" #: builtin/remote.c:48 +msgid "git remote set-branches <name> <branch>..." +msgstr "" + +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "" -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "" -#: builtin/remote.c:63 +#: builtin/remote.c:64 msgid "git remote update [<options>] [<group> | <remote>]..." msgstr "" -#: builtin/remote.c:98 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" msgstr "" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" msgstr "" -#: builtin/remote.c:165 +#: builtin/remote.c:155 msgid "import all tags and associated objects when fetching" msgstr "" -#: builtin/remote.c:168 +#: builtin/remote.c:158 msgid "or do not fetch any tag at all (--no-tags)" msgstr "" -#: builtin/remote.c:170 +#: builtin/remote.c:160 msgid "branch(es) to track" msgstr "" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "" -#: builtin/remote.c:173 +#: builtin/remote.c:163 msgid "set up remote as a mirror to push to or fetch from" msgstr "" -#: builtin/remote.c:185 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "" -#: builtin/remote.c:187 +#: builtin/remote.c:177 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "" -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, c-format msgid "remote %s already exists." msgstr "" -#: builtin/remote.c:199 builtin/remote.c:650 +#: builtin/remote.c:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" msgstr "" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%s'" msgstr "" -#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, c-format msgid "Could not remove config section '%s'" msgstr "" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -7676,32 +7957,32 @@ msgid "" "\tPlease update the configuration manually if necessary." msgstr "" -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "" -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" msgstr "" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" msgstr "" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" msgstr "" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -7711,265 +7992,330 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr "" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" msgstr "" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" msgstr "" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr "" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr "" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr "" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr "" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr "" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr "" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr "" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" msgstr "" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" msgstr "" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr "" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr "" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" msgstr "" -#: builtin/remote.c:1151 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" msgstr[0] "" msgstr[1] "" -#: builtin/remote.c:1154 builtin/remote.c:1181 +#: builtin/remote.c:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr "" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" msgstr[0] "" msgstr[1] "" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 msgid " Local refs will be mirrored by 'git push'" msgstr "" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, c-format msgid " Local ref configured for 'git push'%s:" msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] "" msgstr[1] "" -#: builtin/remote.c:1199 +#: builtin/remote.c:1252 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "" -#: builtin/remote.c:1201 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" msgstr "" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "" -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr "" -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr "" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr "" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr "" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "" -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 msgid "Will not delete all non-push URLs" msgstr "" -#: builtin/remote.c:1569 +#: builtin/remote.c:1564 msgid "be verbose; must be placed before a subcommand" msgstr "" +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "" @@ -7979,26 +8325,30 @@ msgid "git replace -d <object>..." msgstr "" #: builtin/replace.c:19 -msgid "git replace -l [<pattern>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" msgstr "" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 msgid "register clean resolutions in index" msgstr "" @@ -8058,85 +8408,89 @@ msgstr "" msgid "Cannot do a %s reset in the middle of a merge." msgstr "" -#: builtin/reset.c:251 +#: builtin/reset.c:262 msgid "be quiet, only report errors" msgstr "" -#: builtin/reset.c:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 msgid "reset HEAD, index and working tree" msgstr "" -#: builtin/reset.c:260 +#: builtin/reset.c:271 msgid "reset HEAD but keep local changes" msgstr "" -#: builtin/reset.c:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "" -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "" -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "" -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "" -#: builtin/reset.c:304 +#: builtin/reset.c:315 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "" -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "" -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" msgstr "" -#: builtin/reset.c:336 -#, c-format -msgid "Could not reset index file to revision '%s'." +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" msgstr "" -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" +#: builtin/reset.c:350 +#, c-format +msgid "Could not reset index file to revision '%s'." msgstr "" -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "" -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" msgstr "" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 msgid "stop parsing after the first non-option argument" msgstr "" -#: builtin/rev-parse.c:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8161,84 +8515,84 @@ msgstr "" msgid "git cherry-pick <subcommand>" msgstr "" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, c-format msgid "%s: %s cannot be used with %s" msgstr "" -#: builtin/revert.c:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "" -#: builtin/revert.c:106 +#: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" msgstr "" -#: builtin/revert.c:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "" -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" msgstr "" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" msgstr "" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "" -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8248,13 +8602,13 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" msgstr "" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8264,56 +8618,56 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" msgstr "" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "" msgstr[1] "" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" msgstr "" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "" msgstr[1] "" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "" -#: builtin/rm.c:274 +#: builtin/rm.c:275 msgid "exit with a zero status even if nothing matched" msgstr "" -#: builtin/rm.c:345 +#: builtin/rm.c:336 #, c-format msgid "not removing '%s' recursively without -r" msgstr "" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "" @@ -8327,23 +8681,23 @@ msgstr "" msgid "Missing author: %s" msgstr "" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 msgid "sort output according to the number of commits per author" msgstr "" -#: builtin/shortlog.c:230 +#: builtin/shortlog.c:232 msgid "Suppress commit descriptions, only provides commit count" msgstr "" -#: builtin/shortlog.c:232 +#: builtin/shortlog.c:234 msgid "Show the email address of each author" msgstr "" -#: builtin/shortlog.c:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "" @@ -8359,67 +8713,67 @@ msgstr "" msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "" -#: builtin/show-branch.c:650 +#: builtin/show-branch.c:649 msgid "show remote-tracking and local branches" msgstr "" -#: builtin/show-branch.c:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 msgid "show <n> more commits after the common ancestor" msgstr "" -#: builtin/show-branch.c:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 msgid "name commits with their object names" msgstr "" -#: builtin/show-branch.c:665 +#: builtin/show-branch.c:664 msgid "show possible merge bases" msgstr "" -#: builtin/show-branch.c:667 +#: builtin/show-branch.c:666 msgid "show refs unreachable from any other ref" msgstr "" -#: builtin/show-branch.c:669 +#: builtin/show-branch.c:668 msgid "show commits in topological order" msgstr "" -#: builtin/show-branch.c:672 +#: builtin/show-branch.c:671 msgid "show only commits not on the first branch" msgstr "" -#: builtin/show-branch.c:674 +#: builtin/show-branch.c:673 msgid "show merges reachable from only one tip" msgstr "" -#: builtin/show-branch.c:676 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" msgstr "" -#: builtin/show-branch.c:680 +#: builtin/show-branch.c:679 msgid "show <n> most recent ref-log entries starting at base" msgstr "" @@ -8445,23 +8799,23 @@ msgstr "" msgid "stricter reference checking, requires exact ref path" msgstr "" -#: builtin/show-ref.c:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 msgid "dereference tags into object IDs" msgstr "" -#: builtin/show-ref.c:180 +#: builtin/show-ref.c:179 msgid "only show SHA1 hash using <n> digits" msgstr "" -#: builtin/show-ref.c:184 +#: builtin/show-ref.c:183 msgid "do not print results to stdout (useful with --verify)" msgstr "" -#: builtin/show-ref.c:186 +#: builtin/show-ref.c:185 msgid "show refs from stdin that aren't in local repository" msgstr "" @@ -8485,11 +8839,11 @@ msgstr "" msgid "shorten ref output" msgstr "" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "" @@ -8644,183 +8998,195 @@ msgstr "" msgid "print only tags of the object" msgstr "" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "" -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "" -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "" -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "" -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "" -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "" -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 msgid "let files replace directories and vice-versa" msgstr "" -#: builtin/update-index.c:728 +#: builtin/update-index.c:730 msgid "notice files missing from worktree" msgstr "" -#: builtin/update-index.c:730 +#: builtin/update-index.c:732 msgid "refresh even if index contains unmerged entries" msgstr "" -#: builtin/update-index.c:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 msgid "like --refresh, but ignore assume-unchanged setting" msgstr "" -#: builtin/update-index.c:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 msgid "add the specified entry to the index" msgstr "" -#: builtin/update-index.c:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 msgid "override the executable bit of the listed files" msgstr "" -#: builtin/update-index.c:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 msgid "add to index only; do not add content to object database" msgstr "" -#: builtin/update-index.c:765 +#: builtin/update-index.c:767 msgid "remove named paths even if present in worktree" msgstr "" -#: builtin/update-index.c:767 +#: builtin/update-index.c:769 msgid "with --stdin: input lines are terminated by null bytes" msgstr "" -#: builtin/update-index.c:769 +#: builtin/update-index.c:771 msgid "read list of paths to be updated from standard input" msgstr "" -#: builtin/update-index.c:773 +#: builtin/update-index.c:775 msgid "add entries from standard input to the index" msgstr "" -#: builtin/update-index.c:777 +#: builtin/update-index.c:779 msgid "repopulate stages #2 and #3 for the listed paths" msgstr "" -#: builtin/update-index.c:781 +#: builtin/update-index.c:783 msgid "only update entries that differ from HEAD" msgstr "" -#: builtin/update-index.c:785 +#: builtin/update-index.c:787 msgid "ignore files missing from worktree" msgstr "" -#: builtin/update-index.c:788 +#: builtin/update-index.c:790 msgid "report actions to standard output" msgstr "" -#: builtin/update-index.c:790 +#: builtin/update-index.c:792 msgid "(for porcelains) forget saved unresolved conflicts" msgstr "" -#: builtin/update-index.c:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 msgid "git update-ref [options] -d <refname> [<oldval>]" msgstr "" -#: builtin/update-ref.c:8 +#: builtin/update-ref.c:10 msgid "git update-ref [options] <refname> <newval> [<oldval>]" msgstr "" -#: builtin/update-ref.c:19 +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "" + +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 msgid "update <refname> not the one it points to" msgstr "" +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "" @@ -8872,23 +9238,23 @@ msgid "" "to read about a specific subcommand or concept." msgstr "" -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "" @@ -9161,7 +9527,7 @@ msgid "" msgstr "" #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" +msgid "won't bisect on cg-seek'ed tree" msgstr "" #: git-bisect.sh:144 @@ -9284,7 +9650,7 @@ msgstr "" msgid "Pull is not possible because you have unmerged files." msgstr "" -#: git-pull.sh:203 +#: git-pull.sh:223 msgid "updating an unborn branch with changes added to the index" msgstr "" @@ -9292,7 +9658,7 @@ msgstr "" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -9300,15 +9666,15 @@ msgid "" "Warning: commit $orig_head." msgstr "" -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "" -#: git-pull.sh:264 +#: git-pull.sh:276 msgid "Cannot rebase onto multiple branches" msgstr "" -#: git-rebase.sh:54 +#: git-rebase.sh:55 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" @@ -9316,58 +9682,58 @@ msgid "" "\"." msgstr "" -#: git-rebase.sh:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "" -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "" -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" "You can run \"git stash pop\" or \"git stash drop\" at any time.\n" msgstr "" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." msgstr "" -#: git-rebase.sh:195 +#: git-rebase.sh:206 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "" -#: git-rebase.sh:329 +#: git-rebase.sh:346 msgid "The --exec option must be used with the --interactive option" msgstr "" -#: git-rebase.sh:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "" -#: git-rebase.sh:345 +#: git-rebase.sh:362 msgid "The --edit-todo action can only be used during interactive rebase." msgstr "" -#: git-rebase.sh:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" msgstr "" -#: git-rebase.sh:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9380,65 +9746,65 @@ msgid "" "valuable there." msgstr "" -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "" -#: git-rebase.sh:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "" -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "" -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "" -#: git-rebase.sh:552 +#: git-rebase.sh:581 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "" -#: git-rebase.sh:563 +#: git-rebase.sh:592 #, sh-format msgid "Changes from $mb to $onto:" msgstr "" #. Detach HEAD and reset the tree -#: git-rebase.sh:572 +#: git-rebase.sh:601 msgid "First, rewinding head to replay your work on top of it..." msgstr "" -#: git-rebase.sh:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "" @@ -9486,103 +9852,92 @@ msgstr "" #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" " To provide a message, use git stash save -- '$option'" msgstr "" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" msgstr "" -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "" - -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "" - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." msgstr "" -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "" -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" msgstr "" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "" -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "" -#: git-stash.sh:503 +#: git-stash.sh:491 msgid "Cannot unstage modified files" msgstr "" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." msgstr "" -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "" @@ -9687,185 +10042,177 @@ msgstr "" msgid "Entering '$prefix$displaypath'" msgstr "" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "" -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "" -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "" -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" msgstr "" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " "discard them" msgstr "" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "" -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "" -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "" -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "" -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" "Maybe you want to use 'update --init'?" msgstr "" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" msgstr "" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 msgid "The --cached option cannot be used with the --files option" msgstr "" #. unexpected type -#: git-submodule.sh:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "" -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr "" -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr "" -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "" -#: git-submodule.sh:1155 -msgid "Submodules changed but not updated:" -msgstr "" - -#: git-submodule.sh:1157 -msgid "Submodule changes to be committed:" -msgstr "" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "" diff --git a/po/nl.po b/po/nl.po deleted file mode 100644 index ad31c66cdf..0000000000 --- a/po/nl.po +++ /dev/null @@ -1,3493 +0,0 @@ -# Dutch translations for Git. -# Copyright (C) 2012 Vincent van Ravesteijn <vfr@lyx.org> -# This file is distributed under the same license as the Git package. -# Vincent van Ravesteijn <vfr@lyx.org>, 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: Git\n" -"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-02-28 09:17+0800\n" -"PO-Revision-Date: 2012-03-07 12:02+0100\n" -"Last-Translator: Vincent van Ravesteijn <vfr@lyx.org>\n" -"Language-Team: Dutch\n" -"Language: nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ASCII\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: advice.c:34 -#, c-format -msgid "hint: %.*s\n" -msgstr "" - -#. -#. * Message used both when 'git commit' fails and when -#. * other commands doing a merge do. -#. -#: advice.c:64 -msgid "" -"Fix them up in the work tree,\n" -"and then use 'git add/rm <file>' as\n" -"appropriate to mark resolution and make a commit,\n" -"or use 'git commit -a'." -msgstr "" - -#: commit.c:47 -#, c-format -msgid "could not parse %s" -msgstr "" - -#: commit.c:49 -#, c-format -msgid "%s %s is not a commit!" -msgstr "" - -#: compat/obstack.c:406 compat/obstack.c:408 -msgid "memory exhausted" -msgstr "" - -#: connected.c:39 -msgid "Could not run 'git rev-list'" -msgstr "" - -#: connected.c:48 -#, c-format -msgid "failed write to rev-list: %s" -msgstr "" - -#: connected.c:56 -#, c-format -msgid "failed to close rev-list's stdin: %s" -msgstr "" - -#: diff.c:104 -#, c-format -msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" -msgstr "" - -#: diff.c:109 -#, c-format -msgid " Unknown dirstat parameter '%.*s'\n" -msgstr "" - -#: diff.c:205 -#, c-format -msgid "" -"Found errors in 'diff.dirstat' config variable:\n" -"%s" -msgstr "" - -#: diff.c:1331 -msgid " 0 files changed\n" -msgstr "" - -#: diff.c:1335 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1352 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:1363 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] "" -msgstr[1] "" - -#: diff.c:3364 -#, c-format -msgid "" -"Failed to parse --dirstat/-X option parameter:\n" -"%s" -msgstr "" - -#: gpg-interface.c:59 -msgid "could not run gpg." -msgstr "" - -#: gpg-interface.c:71 -msgid "gpg did not accept the data" -msgstr "" - -#: gpg-interface.c:82 -msgid "gpg failed to sign the data" -msgstr "" - -#: grep.c:1285 -#, c-format -msgid "'%s': unable to read %s" -msgstr "" - -#: grep.c:1302 -#, c-format -msgid "'%s': %s" -msgstr "" - -#: grep.c:1313 -#, c-format -msgid "'%s': short read %s" -msgstr "" - -#: help.c:287 -#, c-format -msgid "" -"'%s' appears to be a git command, but we were not\n" -"able to execute it. Maybe git-%s is broken?" -msgstr "" - -#: remote.c:1607 -#, 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] "" -msgstr[1] "" - -#: remote.c:1613 -#, 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] "" -msgstr[1] "" - -#: remote.c:1621 -#, c-format -msgid "" -"Your branch and '%s' have diverged,\n" -"and have %d and %d different commit each, respectively.\n" -msgid_plural "" -"Your branch and '%s' have diverged,\n" -"and have %d and %d different commits each, respectively.\n" -msgstr[0] "" -msgstr[1] "" - -#: sequencer.c:120 builtin/merge.c:862 builtin/merge.c:983 -#: builtin/merge.c:1093 builtin/merge.c:1103 -#, c-format -msgid "Could not open '%s' for writing" -msgstr "" - -#: sequencer.c:122 builtin/merge.c:334 builtin/merge.c:865 -#: builtin/merge.c:1095 builtin/merge.c:1108 -#, c-format -msgid "Could not write to '%s'" -msgstr "" - -#: sequencer.c:142 -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:154 sequencer.c:680 sequencer.c:763 -#, c-format -msgid "Could not write to %s" -msgstr "" - -#: sequencer.c:157 -#, c-format -msgid "Error wrapping up %s" -msgstr "" - -#: sequencer.c:172 -msgid "Your local changes would be overwritten by cherry-pick." -msgstr "" - -#: sequencer.c:174 -msgid "Your local changes would be overwritten by revert." -msgstr "" - -#: sequencer.c:177 -msgid "Commit your changes or stash them to proceed." -msgstr "" - -#. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:227 -#, c-format -msgid "%s: Unable to write new index file" -msgstr "" - -#: sequencer.c:293 -msgid "Your index file is unmerged." -msgstr "" - -#: sequencer.c:296 -msgid "You do not have a valid HEAD" -msgstr "" - -#: sequencer.c:311 -#, c-format -msgid "Commit %s is a merge but no -m option was given." -msgstr "" - -#: sequencer.c:319 -#, c-format -msgid "Commit %s does not have parent %d" -msgstr "" - -#: sequencer.c:323 -#, 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:334 -#, c-format -msgid "%s: cannot parse parent commit %s" -msgstr "" - -#: sequencer.c:338 -#, c-format -msgid "Cannot get commit message for %s" -msgstr "" - -#: sequencer.c:422 -#, c-format -msgid "could not revert %s... %s" -msgstr "" - -#: sequencer.c:423 -#, c-format -msgid "could not apply %s... %s" -msgstr "" - -#: sequencer.c:445 sequencer.c:904 builtin/log.c:286 builtin/log.c:709 -#: builtin/log.c:1325 builtin/log.c:1544 builtin/merge.c:348 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "" - -#: sequencer.c:448 -msgid "empty commit set passed" -msgstr "" - -#: sequencer.c:456 -#, c-format -msgid "git %s: failed to read the index" -msgstr "" - -#: sequencer.c:461 -#, c-format -msgid "git %s: failed to refresh the index" -msgstr "" - -#: sequencer.c:546 -#, c-format -msgid "Cannot %s during a %s" -msgstr "" - -#: sequencer.c:568 -#, c-format -msgid "Could not parse line %d." -msgstr "" - -#: sequencer.c:573 -msgid "No commits parsed." -msgstr "" - -#: sequencer.c:586 -#, c-format -msgid "Could not open %s" -msgstr "" - -#: sequencer.c:590 -#, c-format -msgid "Could not read %s." -msgstr "" - -#: sequencer.c:597 -#, c-format -msgid "Unusable instruction sheet: %s" -msgstr "" - -#: sequencer.c:625 -#, c-format -msgid "Invalid key: %s" -msgstr "" - -#: sequencer.c:628 -#, c-format -msgid "Invalid value for %s: %s" -msgstr "" - -#: sequencer.c:640 -#, c-format -msgid "Malformed options sheet: %s" -msgstr "" - -#: sequencer.c:661 -msgid "a cherry-pick or revert is already in progress" -msgstr "" - -#: sequencer.c:662 -msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" -msgstr "" - -#: sequencer.c:666 -#, c-format -msgid "Could not create sequencer directory %s" -msgstr "" - -#: sequencer.c:682 sequencer.c:767 -#, c-format -msgid "Error wrapping up %s." -msgstr "" - -#: sequencer.c:701 sequencer.c:835 -msgid "no cherry-pick or revert in progress" -msgstr "" - -#: sequencer.c:703 -msgid "cannot resolve HEAD" -msgstr "" - -#: sequencer.c:705 -msgid "cannot abort from a branch yet to be born" -msgstr "" - -#: sequencer.c:727 -#, c-format -msgid "cannot open %s: %s" -msgstr "" - -#: sequencer.c:730 -#, c-format -msgid "cannot read %s: %s" -msgstr "" - -#: sequencer.c:731 -msgid "unexpected end of file" -msgstr "" - -#: sequencer.c:737 -#, c-format -msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" -msgstr "" - -#: sequencer.c:760 -#, c-format -msgid "Could not format %s." -msgstr "" - -#: sequencer.c:922 -msgid "Can't revert as initial commit" -msgstr "" - -#: sequencer.c:923 -msgid "Can't cherry-pick into empty head" -msgstr "" - -#: wt-status.c:134 -msgid "Unmerged paths:" -msgstr "" - -#: wt-status.c:140 wt-status.c:157 -#, c-format -msgid " (use \"git reset %s <file>...\" to unstage)" -msgstr "" - -#: wt-status.c:142 wt-status.c:159 -msgid " (use \"git rm --cached <file>...\" to unstage)" -msgstr "" - -#: wt-status.c:143 -msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" -msgstr "" - -#: wt-status.c:151 -msgid "Changes to be committed:" -msgstr "" - -#: wt-status.c:169 -msgid "Changes not staged for commit:" -msgstr "" - -#: wt-status.c:173 -msgid " (use \"git add <file>...\" to update what will be committed)" -msgstr "" - -#: wt-status.c:175 -msgid " (use \"git add/rm <file>...\" to update what will be committed)" -msgstr "" - -#: wt-status.c:176 -msgid "" -" (use \"git checkout -- <file>...\" to discard changes in working directory)" -msgstr "" - -#: wt-status.c:178 -msgid " (commit or discard the untracked or modified content in submodules)" -msgstr "" - -#: wt-status.c:187 -#, c-format -msgid "%s files:" -msgstr "" - -#: wt-status.c:190 -#, c-format -msgid " (use \"git %s <file>...\" to include in what will be committed)" -msgstr "" - -#: wt-status.c:207 -msgid "bug" -msgstr "" - -#: wt-status.c:212 -msgid "both deleted:" -msgstr "" - -#: wt-status.c:213 -msgid "added by us:" -msgstr "" - -#: wt-status.c:214 -msgid "deleted by them:" -msgstr "" - -#: wt-status.c:215 -msgid "added by them:" -msgstr "" - -#: wt-status.c:216 -msgid "deleted by us:" -msgstr "" - -#: wt-status.c:217 -msgid "both added:" -msgstr "" - -#: wt-status.c:218 -msgid "both modified:" -msgstr "" - -#: wt-status.c:248 -msgid "new commits, " -msgstr "" - -#: wt-status.c:250 -msgid "modified content, " -msgstr "" - -#: wt-status.c:252 -msgid "untracked content, " -msgstr "" - -#: wt-status.c:266 -#, c-format -msgid "new file: %s" -msgstr "" - -#: wt-status.c:269 -#, c-format -msgid "copied: %s -> %s" -msgstr "" - -#: wt-status.c:272 -#, c-format -msgid "deleted: %s" -msgstr "" - -#: wt-status.c:275 -#, c-format -msgid "modified: %s" -msgstr "" - -#: wt-status.c:278 -#, c-format -msgid "renamed: %s -> %s" -msgstr "" - -#: wt-status.c:281 -#, c-format -msgid "typechange: %s" -msgstr "" - -#: wt-status.c:284 -#, c-format -msgid "unknown: %s" -msgstr "" - -#: wt-status.c:287 -#, c-format -msgid "unmerged: %s" -msgstr "" - -#: wt-status.c:290 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "" - -#: wt-status.c:713 -msgid "On branch " -msgstr "" - -#: wt-status.c:720 -msgid "Not currently on any branch." -msgstr "" - -#: wt-status.c:731 -msgid "Initial commit" -msgstr "" - -#: wt-status.c:745 -msgid "Untracked" -msgstr "" - -#: wt-status.c:747 -msgid "Ignored" -msgstr "" - -#: wt-status.c:749 -#, c-format -msgid "Untracked files not listed%s" -msgstr "" - -#: wt-status.c:751 -msgid " (use -u option to show untracked files)" -msgstr "" - -#: wt-status.c:757 -msgid "No changes" -msgstr "" - -#: wt-status.c:761 -#, c-format -msgid "no changes added to commit%s\n" -msgstr "" - -#: wt-status.c:763 -msgid " (use \"git add\" and/or \"git commit -a\")" -msgstr "" - -#: wt-status.c:765 -#, c-format -msgid "nothing added to commit but untracked files present%s\n" -msgstr "" - -#: wt-status.c:767 -msgid " (use \"git add\" to track)" -msgstr "" - -#: wt-status.c:769 wt-status.c:772 wt-status.c:775 -#, c-format -msgid "nothing to commit%s\n" -msgstr "" - -#: wt-status.c:770 -msgid " (create/copy files and use \"git add\" to track)" -msgstr "" - -#: wt-status.c:773 -msgid " (use -u to show untracked files)" -msgstr "" - -#: wt-status.c:776 -msgid " (working directory clean)" -msgstr "" - -#: wt-status.c:884 -msgid "HEAD (no branch)" -msgstr "" - -#: wt-status.c:890 -msgid "Initial commit on " -msgstr "" - -#: wt-status.c:905 -msgid "behind " -msgstr "" - -#: wt-status.c:908 wt-status.c:911 -msgid "ahead " -msgstr "" - -#: wt-status.c:913 -msgid ", behind " -msgstr "" - -#: builtin/add.c:62 -#, c-format -msgid "unexpected diff status %c" -msgstr "" - -#: builtin/add.c:67 builtin/commit.c:298 -msgid "updating files failed" -msgstr "" - -#: builtin/add.c:77 -#, c-format -msgid "remove '%s'\n" -msgstr "" - -#: builtin/add.c:176 -#, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "" - -#: builtin/add.c:192 -msgid "Unstaged changes after refreshing the index:" -msgstr "" - -#: builtin/add.c:195 builtin/add.c:456 builtin/rm.c:186 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "" - -#: builtin/add.c:209 -#, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "" - -#: builtin/add.c:276 -msgid "Could not read the index" -msgstr "" - -#: builtin/add.c:286 -#, c-format -msgid "Could not open '%s' for writing." -msgstr "" - -#: builtin/add.c:290 -msgid "Could not write patch" -msgstr "" - -#: builtin/add.c:295 -#, c-format -msgid "Could not stat '%s'" -msgstr "" - -#: builtin/add.c:297 -msgid "Empty patch. Aborted." -msgstr "" - -#: builtin/add.c:303 -#, c-format -msgid "Could not apply '%s'" -msgstr "" - -#: builtin/add.c:312 -msgid "The following paths are ignored by one of your .gitignore files:\n" -msgstr "" - -#: builtin/add.c:352 -#, c-format -msgid "Use -f if you really want to add them.\n" -msgstr "" - -#: builtin/add.c:353 -msgid "no files added" -msgstr "" - -#: builtin/add.c:359 -msgid "adding files failed" -msgstr "" - -#: builtin/add.c:391 -msgid "-A and -u are mutually incompatible" -msgstr "" - -#: builtin/add.c:393 -msgid "Option --ignore-missing can only be used together with --dry-run" -msgstr "" - -#: builtin/add.c:413 -#, c-format -msgid "Nothing specified, nothing added.\n" -msgstr "" - -#: builtin/add.c:414 -#, c-format -msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "" - -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:358 builtin/mv.c:82 -#: builtin/rm.c:162 -msgid "index file corrupt" -msgstr "" - -#: builtin/add.c:476 builtin/mv.c:229 builtin/rm.c:260 -msgid "Unable to write new index file" -msgstr "" - -#: builtin/archive.c:17 -#, c-format -msgid "could not create archive file '%s'" -msgstr "" - -#: builtin/archive.c:20 -msgid "could not redirect output" -msgstr "" - -#: builtin/archive.c:37 -msgid "git archive: Remote with no URL" -msgstr "" - -#: builtin/archive.c:58 -msgid "git archive: expected ACK/NAK, got EOF" -msgstr "" - -#: builtin/archive.c:63 -#, c-format -msgid "git archive: NACK %s" -msgstr "" - -#: builtin/archive.c:65 -#, c-format -msgid "remote error: %s" -msgstr "" - -#: builtin/archive.c:66 -msgid "git archive: protocol error" -msgstr "" - -#: builtin/archive.c:71 -msgid "git archive: expected a flush" -msgstr "" - -#: builtin/branch.c:137 -#, c-format -msgid "" -"deleting branch '%s' that has been merged to\n" -" '%s', but not yet merged to HEAD." -msgstr "" - -#: builtin/branch.c:141 -#, c-format -msgid "" -"not deleting branch '%s' that is not yet merged to\n" -" '%s', even though it is merged to HEAD." -msgstr "" - -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:163 -msgid "remote " -msgstr "" - -#: builtin/branch.c:171 -msgid "cannot use -a with -d" -msgstr "" - -#: builtin/branch.c:177 -msgid "Couldn't look up commit object for HEAD" -msgstr "" - -#: builtin/branch.c:182 -#, c-format -msgid "Cannot delete the branch '%s' which you are currently on." -msgstr "" - -#: builtin/branch.c:192 -#, c-format -msgid "%sbranch '%s' not found." -msgstr "" - -#: builtin/branch.c:200 -#, c-format -msgid "Couldn't look up commit object for '%s'" -msgstr "" - -#: builtin/branch.c:206 -#, 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:214 -#, c-format -msgid "Error deleting %sbranch '%s'" -msgstr "" - -#: builtin/branch.c:219 -#, c-format -msgid "Deleted %sbranch %s (was %s).\n" -msgstr "" - -#: builtin/branch.c:224 -msgid "Update of config-file failed" -msgstr "" - -#: builtin/branch.c:322 -#, c-format -msgid "branch '%s' does not point at a commit" -msgstr "" - -#: builtin/branch.c:394 -#, c-format -msgid "behind %d] " -msgstr "" - -#: builtin/branch.c:396 -#, c-format -msgid "ahead %d] " -msgstr "" - -#: builtin/branch.c:398 -#, c-format -msgid "ahead %d, behind %d] " -msgstr "" - -#: builtin/branch.c:501 -msgid "(no branch)" -msgstr "" - -#: builtin/branch.c:562 -msgid "some refs could not be read" -msgstr "" - -#: builtin/branch.c:575 -msgid "cannot rename the current branch while not on any." -msgstr "" - -#: builtin/branch.c:585 -#, c-format -msgid "Invalid branch name: '%s'" -msgstr "" - -#: builtin/branch.c:600 -msgid "Branch rename failed" -msgstr "" - -#: builtin/branch.c:604 -#, c-format -msgid "Renamed a misnamed branch '%s' away" -msgstr "" - -#: builtin/branch.c:608 -#, c-format -msgid "Branch renamed to %s, but HEAD is not updated!" -msgstr "" - -#: builtin/branch.c:615 -msgid "Branch is renamed, but update of config-file failed" -msgstr "" - -#: builtin/branch.c:630 -#, c-format -msgid "malformed object name %s" -msgstr "" - -#: builtin/branch.c:654 -#, c-format -msgid "could not write branch description template: %s\n" -msgstr "" - -#: builtin/branch.c:742 -msgid "Failed to resolve HEAD as a valid ref." -msgstr "" - -#: builtin/branch.c:747 builtin/clone.c:558 -msgid "HEAD not found below refs/heads!" -msgstr "" - -#: builtin/branch.c:805 -msgid "-a and -r options to 'git branch' do not make sense with a branch name" -msgstr "" - -#: builtin/bundle.c:47 -#, c-format -msgid "%s is okay\n" -msgstr "" - -#: builtin/bundle.c:56 -msgid "Need a repository to create a bundle." -msgstr "" - -#: builtin/bundle.c:60 -msgid "Need a repository to unbundle." -msgstr "" - -#: builtin/checkout.c:113 builtin/checkout.c:146 -#, c-format -msgid "path '%s' does not have our version" -msgstr "" - -#: builtin/checkout.c:115 builtin/checkout.c:148 -#, c-format -msgid "path '%s' does not have their version" -msgstr "" - -#: builtin/checkout.c:131 -#, c-format -msgid "path '%s' does not have all necessary versions" -msgstr "" - -#: builtin/checkout.c:175 -#, c-format -msgid "path '%s' does not have necessary versions" -msgstr "" - -#: builtin/checkout.c:192 -#, c-format -msgid "path '%s': cannot merge" -msgstr "" - -#: builtin/checkout.c:209 -#, c-format -msgid "Unable to add merge result for '%s'" -msgstr "" - -#: builtin/checkout.c:212 builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "" - -#: builtin/checkout.c:234 builtin/checkout.c:392 -msgid "corrupt index file" -msgstr "" - -#: builtin/checkout.c:264 builtin/checkout.c:271 -#, c-format -msgid "path '%s' is unmerged" -msgstr "" - -#: builtin/checkout.c:302 builtin/checkout.c:498 builtin/clone.c:583 -#: builtin/merge.c:809 -msgid "unable to write new index file" -msgstr "" - -#: builtin/checkout.c:319 builtin/diff.c:298 builtin/merge.c:406 -msgid "diff_setup_done failed" -msgstr "" - -#: builtin/checkout.c:414 -msgid "you need to resolve your current index first" -msgstr "" - -#: builtin/checkout.c:533 -#, c-format -msgid "Can not do reflog for '%s'\n" -msgstr "" - -#: builtin/checkout.c:565 -msgid "HEAD is now at" -msgstr "" - -#: builtin/checkout.c:572 -#, c-format -msgid "Reset branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:575 -#, c-format -msgid "Already on '%s'\n" -msgstr "" - -#: builtin/checkout.c:579 -#, c-format -msgid "Switched to and reset branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:581 -#, c-format -msgid "Switched to a new branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:583 -#, c-format -msgid "Switched to branch '%s'\n" -msgstr "" - -#: builtin/checkout.c:639 -#, c-format -msgid " ... and %d more.\n" -msgstr "" - -#. The singular version -#: builtin/checkout.c:645 -#, c-format -msgid "" -"Warning: you are leaving %d commit behind, not connected to\n" -"any of your branches:\n" -"\n" -"%s\n" -msgid_plural "" -"Warning: you are leaving %d commits behind, not connected to\n" -"any of your branches:\n" -"\n" -"%s\n" -msgstr[0] "" -msgstr[1] "" - -#: builtin/checkout.c:663 -#, c-format -msgid "" -"If you want to keep them by creating a new branch, this may be a good time\n" -"to do so with:\n" -"\n" -" git branch new_branch_name %s\n" -"\n" -msgstr "" - -#: builtin/checkout.c:692 -msgid "internal error in revision walk" -msgstr "" - -#: builtin/checkout.c:696 -msgid "Previous HEAD position was" -msgstr "" - -#: builtin/checkout.c:722 -msgid "You are on a branch yet to be born" -msgstr "" - -#. case (1) -#: builtin/checkout.c:853 -#, c-format -msgid "invalid reference: %s" -msgstr "" - -#. case (1): want a tree -#: builtin/checkout.c:892 -#, c-format -msgid "reference is not a tree: %s" -msgstr "" - -#: builtin/checkout.c:972 -msgid "-B cannot be used with -b" -msgstr "" - -#: builtin/checkout.c:981 -msgid "--patch is incompatible with all other options" -msgstr "" - -#: builtin/checkout.c:984 -msgid "--detach cannot be used with -b/-B/--orphan" -msgstr "" - -#: builtin/checkout.c:986 -msgid "--detach cannot be used with -t" -msgstr "" - -#: builtin/checkout.c:992 -msgid "--track needs a branch name" -msgstr "" - -#: builtin/checkout.c:999 -msgid "Missing branch name; try -b" -msgstr "" - -#: builtin/checkout.c:1005 -msgid "--orphan and -b|-B are mutually exclusive" -msgstr "" - -#: builtin/checkout.c:1007 -msgid "--orphan cannot be used with -t" -msgstr "" - -#: builtin/checkout.c:1017 -msgid "git checkout: -f and -m are incompatible" -msgstr "" - -#: builtin/checkout.c:1051 -msgid "invalid path specification" -msgstr "" - -#: builtin/checkout.c:1059 -#, c-format -msgid "" -"git checkout: updating paths is incompatible with switching branches.\n" -"Did you intend to checkout '%s' which can not be resolved as commit?" -msgstr "" - -#: builtin/checkout.c:1061 -msgid "git checkout: updating paths is incompatible with switching branches." -msgstr "" - -#: builtin/checkout.c:1066 -msgid "git checkout: --detach does not take a path argument" -msgstr "" - -#: builtin/checkout.c:1069 -msgid "" -"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" -"checking out of the index." -msgstr "" - -#: builtin/checkout.c:1088 -msgid "Cannot switch branch to a non-commit." -msgstr "" - -#: builtin/checkout.c:1091 -msgid "--ours/--theirs is incompatible with switching branches." -msgstr "" - -#: builtin/clean.c:78 -msgid "-x and -X cannot be used together" -msgstr "" - -#: builtin/clean.c:82 -msgid "" -"clean.requireForce set to true and neither -n nor -f given; refusing to clean" -msgstr "" - -#: builtin/clean.c:85 -msgid "" -"clean.requireForce defaults to true and neither -n nor -f given; refusing to " -"clean" -msgstr "" - -#: builtin/clean.c:155 builtin/clean.c:176 -#, c-format -msgid "Would remove %s\n" -msgstr "" - -#: builtin/clean.c:159 builtin/clean.c:179 -#, c-format -msgid "Removing %s\n" -msgstr "" - -#: builtin/clean.c:162 builtin/clean.c:182 -#, c-format -msgid "failed to remove %s" -msgstr "" - -#: builtin/clean.c:166 -#, c-format -msgid "Would not remove %s\n" -msgstr "" - -#: builtin/clean.c:168 -#, c-format -msgid "Not removing %s\n" -msgstr "" - -#: builtin/clone.c:243 -#, c-format -msgid "reference repository '%s' is not a local directory." -msgstr "" - -#: builtin/clone.c:302 -#, c-format -msgid "failed to open '%s'" -msgstr "" - -#: builtin/clone.c:306 -#, c-format -msgid "failed to create directory '%s'" -msgstr "" - -#: builtin/clone.c:308 builtin/diff.c:75 -#, c-format -msgid "failed to stat '%s'" -msgstr "" - -#: builtin/clone.c:310 -#, c-format -msgid "%s exists and is not a directory" -msgstr "" - -#: builtin/clone.c:324 -#, c-format -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'" -msgstr "" - -#: builtin/clone.c:350 -#, c-format -msgid "failed to copy file to '%s'" -msgstr "" - -#: builtin/clone.c:373 -#, c-format -msgid "done.\n" -msgstr "" - -#: builtin/clone.c:440 -#, c-format -msgid "Could not find remote branch %s to clone." -msgstr "" - -#: builtin/clone.c:549 -msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" -msgstr "" - -#: builtin/clone.c:639 -msgid "Too many arguments." -msgstr "" - -#: builtin/clone.c:643 -msgid "You must specify a repository to clone." -msgstr "" - -#: builtin/clone.c:654 -#, c-format -msgid "--bare and --origin %s options are incompatible." -msgstr "" - -#: builtin/clone.c:668 -#, c-format -msgid "repository '%s' does not exist" -msgstr "" - -#: builtin/clone.c:673 -msgid "--depth is ignored in local clones; use file:// instead." -msgstr "" - -#: builtin/clone.c:683 -#, c-format -msgid "destination path '%s' already exists and is not an empty directory." -msgstr "" - -#: builtin/clone.c:693 -#, c-format -msgid "working tree '%s' already exists." -msgstr "" - -#: builtin/clone.c:706 builtin/clone.c:720 -#, c-format -msgid "could not create leading directories of '%s'" -msgstr "" - -#: builtin/clone.c:709 -#, c-format -msgid "could not create work tree dir '%s'." -msgstr "" - -#: builtin/clone.c:728 -#, c-format -msgid "Cloning into bare repository '%s'...\n" -msgstr "" - -#: builtin/clone.c:730 -#, c-format -msgid "Cloning into '%s'...\n" -msgstr "" - -#: builtin/clone.c:786 -#, c-format -msgid "Don't know how to clone %s" -msgstr "" - -#: builtin/clone.c:835 -#, c-format -msgid "Remote branch %s not found in upstream %s" -msgstr "" - -#: builtin/clone.c:842 -msgid "You appear to have cloned an empty repository." -msgstr "" - -#: builtin/commit.c:42 -msgid "" -"Your name and email address were configured automatically based\n" -"on your username and hostname. Please check that they are accurate.\n" -"You can suppress this message by setting them explicitly:\n" -"\n" -" git config --global user.name \"Your Name\"\n" -" git config --global user.email you@example.com\n" -"\n" -"After doing this, you may fix the identity used for this commit with:\n" -"\n" -" git commit --amend --reset-author\n" -msgstr "" - -#: builtin/commit.c:54 -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:59 -msgid "" -"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" -"If you wish to commit it anyway, use:\n" -"\n" -" git commit --allow-empty\n" -"\n" -"Otherwise, please use 'git reset'\n" -msgstr "" - -#: builtin/commit.c:205 builtin/reset.c:33 -msgid "merge" -msgstr "" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "" - -#: builtin/commit.c:325 -msgid "failed to unpack HEAD tree object" -msgstr "" - -#: builtin/commit.c:367 -msgid "unable to create temporary index" -msgstr "" - -#: builtin/commit.c:373 -msgid "interactive add failed" -msgstr "" - -#: builtin/commit.c:406 builtin/commit.c:427 builtin/commit.c:473 -msgid "unable to write new_index file" -msgstr "" - -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." -msgstr "" - -#: builtin/commit.c:466 -msgid "cannot read the index" -msgstr "" - -#: builtin/commit.c:486 -msgid "unable to write temporary index file" -msgstr "" - -#: builtin/commit.c:550 builtin/commit.c:556 -#, c-format -msgid "invalid commit: %s" -msgstr "" - -#: builtin/commit.c:579 -msgid "malformed --author parameter" -msgstr "" - -#: builtin/commit.c:635 -#, c-format -msgid "Malformed ident string: '%s'" -msgstr "" - -#: builtin/commit.c:670 builtin/commit.c:703 builtin/commit.c:1000 -#, c-format -msgid "could not lookup commit %s" -msgstr "" - -#: builtin/commit.c:682 builtin/shortlog.c:296 -#, c-format -msgid "(reading log message from standard input)\n" -msgstr "" - -#: builtin/commit.c:684 -msgid "could not read log from standard input" -msgstr "" - -#: builtin/commit.c:688 -#, c-format -msgid "could not read log file '%s'" -msgstr "" - -#: builtin/commit.c:694 -msgid "commit has empty message" -msgstr "" - -#: builtin/commit.c:710 -msgid "could not read MERGE_MSG" -msgstr "" - -#: builtin/commit.c:714 -msgid "could not read SQUASH_MSG" -msgstr "" - -#: builtin/commit.c:718 -#, c-format -msgid "could not read '%s'" -msgstr "" - -#: builtin/commit.c:746 -#, c-format -msgid "could not open '%s'" -msgstr "" - -#: builtin/commit.c:770 -msgid "could not write commit template" -msgstr "" - -#: builtin/commit.c:783 -#, c-format -msgid "" -"\n" -"It looks like you may be committing a %s.\n" -"If this is not correct, please remove the file\n" -"\t%s\n" -"and try again.\n" -msgstr "" - -#: builtin/commit.c:796 -msgid "Please enter the commit message for your changes." -msgstr "" - -#: builtin/commit.c:799 -msgid "" -" Lines starting\n" -"with '#' will be ignored, and an empty message aborts the commit.\n" -msgstr "" - -#: builtin/commit.c:804 -msgid "" -" 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:816 -#, c-format -msgid "%sAuthor: %s" -msgstr "" - -#: builtin/commit.c:823 -#, c-format -msgid "%sCommitter: %s" -msgstr "" - -#: builtin/commit.c:843 -msgid "Cannot read index" -msgstr "" - -#: builtin/commit.c:880 -msgid "Error building trees" -msgstr "" - -#: builtin/commit.c:895 builtin/tag.c:357 -#, c-format -msgid "Please supply the message using either -m or -F option.\n" -msgstr "" - -#: builtin/commit.c:975 -#, c-format -msgid "No existing author found with '%s'" -msgstr "" - -#: builtin/commit.c:990 builtin/commit.c:1182 -#, c-format -msgid "Invalid untracked files mode '%s'" -msgstr "" - -#: builtin/commit.c:1030 -msgid "Using both --reset-author and --author does not make sense" -msgstr "" - -#: builtin/commit.c:1041 -msgid "You have nothing to amend." -msgstr "" - -#: builtin/commit.c:1043 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." -msgstr "" - -#: builtin/commit.c:1045 -msgid "Options --squash and --fixup cannot be used together" -msgstr "" - -#: builtin/commit.c:1055 -msgid "Only one of -c/-C/-F/--fixup can be used." -msgstr "" - -#: builtin/commit.c:1057 -msgid "Option -m cannot be combined with -c/-C/-F/--fixup." -msgstr "" - -#: builtin/commit.c:1063 -msgid "--reset-author can be used only with -C, -c or --amend." -msgstr "" - -#: builtin/commit.c:1080 -msgid "Only one of --include/--only/--all/--interactive/--patch can be used." -msgstr "" - -#: builtin/commit.c:1082 -msgid "No paths with --include/--only does not make sense." -msgstr "" - -#: builtin/commit.c:1084 -msgid "Clever... amending the last one with dirty index." -msgstr "" - -#: builtin/commit.c:1086 -msgid "Explicit paths specified without -i nor -o; assuming --only paths..." -msgstr "" - -#: builtin/commit.c:1096 builtin/tag.c:556 -#, c-format -msgid "Invalid cleanup mode %s" -msgstr "" - -#: builtin/commit.c:1101 -msgid "Paths with -a does not make sense." -msgstr "" - -#: builtin/commit.c:1280 -msgid "couldn't look up newly created commit" -msgstr "" - -#: builtin/commit.c:1282 -msgid "could not parse newly created commit" -msgstr "" - -#: builtin/commit.c:1323 -msgid "detached HEAD" -msgstr "" - -#: builtin/commit.c:1325 -msgid " (root-commit)" -msgstr "" - -#: builtin/commit.c:1415 -msgid "could not parse HEAD commit" -msgstr "" - -#: builtin/commit.c:1452 builtin/merge.c:507 -#, c-format -msgid "could not open '%s' for reading" -msgstr "" - -#: builtin/commit.c:1459 -#, c-format -msgid "Corrupt MERGE_HEAD file (%s)" -msgstr "" - -#: builtin/commit.c:1466 -msgid "could not read MERGE_MODE" -msgstr "" - -#: builtin/commit.c:1485 -#, c-format -msgid "could not read commit message: %s" -msgstr "" - -#: builtin/commit.c:1499 -#, c-format -msgid "Aborting commit due to empty commit message.\n" -msgstr "" - -#: builtin/commit.c:1514 builtin/merge.c:933 builtin/merge.c:966 -msgid "failed to write commit object" -msgstr "" - -#: builtin/commit.c:1535 -msgid "cannot lock HEAD ref" -msgstr "" - -#: builtin/commit.c:1539 -msgid "cannot update HEAD ref" -msgstr "" - -#: builtin/commit.c:1550 -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/describe.c:234 -#, c-format -msgid "annotated tag %s not available" -msgstr "" - -#: builtin/describe.c:238 -#, c-format -msgid "annotated tag %s has no embedded name" -msgstr "" - -#: builtin/describe.c:240 -#, c-format -msgid "tag '%s' is really '%s' here" -msgstr "" - -#: builtin/describe.c:267 -#, c-format -msgid "Not a valid object name %s" -msgstr "" - -#: builtin/describe.c:270 -#, c-format -msgid "%s is not a valid '%s' object" -msgstr "" - -#: builtin/describe.c:287 -#, c-format -msgid "no tag exactly matches '%s'" -msgstr "" - -#: builtin/describe.c:289 -#, c-format -msgid "searching to describe %s\n" -msgstr "" - -#: builtin/describe.c:329 -#, c-format -msgid "finished search at %s\n" -msgstr "" - -#: builtin/describe.c:353 -#, c-format -msgid "" -"No annotated tags can describe '%s'.\n" -"However, there were unannotated tags: try --tags." -msgstr "" - -#: builtin/describe.c:357 -#, c-format -msgid "" -"No tags can describe '%s'.\n" -"Try --always, or create some tags." -msgstr "" - -#: builtin/describe.c:378 -#, c-format -msgid "traversed %lu commits\n" -msgstr "" - -#: builtin/describe.c:381 -#, c-format -msgid "" -"more than %i tags found; listed %i most recent\n" -"gave up search at %s\n" -msgstr "" - -#: builtin/describe.c:436 -msgid "--long is incompatible with --abbrev=0" -msgstr "" - -#: builtin/describe.c:462 -msgid "No names found, cannot describe anything." -msgstr "" - -#: builtin/describe.c:482 -msgid "--dirty is incompatible with commit-ishes" -msgstr "" - -#: builtin/diff.c:77 -#, c-format -msgid "'%s': not a regular file or symlink" -msgstr "" - -#: builtin/diff.c:220 -#, c-format -msgid "invalid option: %s" -msgstr "" - -#: builtin/diff.c:293 -msgid "Not a git repository" -msgstr "" - -#: builtin/diff.c:343 -#, c-format -msgid "invalid object '%s' given." -msgstr "" - -#: builtin/diff.c:348 -#, c-format -msgid "more than %d trees given: '%s'" -msgstr "" - -#: builtin/diff.c:358 -#, c-format -msgid "more than two blobs given: '%s'" -msgstr "" - -#: builtin/diff.c:366 -#, c-format -msgid "unhandled object '%s' given." -msgstr "" - -#: builtin/fetch.c:200 -msgid "Couldn't find remote ref HEAD" -msgstr "" - -#: builtin/fetch.c:252 -#, c-format -msgid "object %s not found" -msgstr "" - -#: builtin/fetch.c:258 -msgid "[up to date]" -msgstr "" - -#: builtin/fetch.c:272 -#, c-format -msgid "! %-*s %-*s -> %s (can't fetch in current branch)" -msgstr "" - -#: builtin/fetch.c:273 builtin/fetch.c:351 -msgid "[rejected]" -msgstr "" - -#: builtin/fetch.c:284 -msgid "[tag update]" -msgstr "" - -#: builtin/fetch.c:286 builtin/fetch.c:313 builtin/fetch.c:331 -msgid " (unable to update local ref)" -msgstr "" - -#: builtin/fetch.c:298 -msgid "[new tag]" -msgstr "" - -#: builtin/fetch.c:302 -msgid "[new branch]" -msgstr "" - -#: builtin/fetch.c:347 -msgid "unable to update local ref" -msgstr "" - -#: builtin/fetch.c:347 -msgid "forced update" -msgstr "" - -#: builtin/fetch.c:353 -msgid "(non-fast-forward)" -msgstr "" - -#: builtin/fetch.c:384 builtin/fetch.c:676 -#, c-format -msgid "cannot open %s: %s\n" -msgstr "" - -#: builtin/fetch.c:393 -#, c-format -msgid "%s did not send all necessary objects\n" -msgstr "" - -#: builtin/fetch.c:479 -#, c-format -msgid "From %.*s\n" -msgstr "" - -#: builtin/fetch.c:490 -#, c-format -msgid "" -"some local refs could not be updated; try running\n" -" 'git remote prune %s' to remove any old, conflicting branches" -msgstr "" - -#: builtin/fetch.c:540 -#, c-format -msgid " (%s will become dangling)\n" -msgstr "" - -#: builtin/fetch.c:541 -#, c-format -msgid " (%s has become dangling)\n" -msgstr "" - -#: builtin/fetch.c:548 -msgid "[deleted]" -msgstr "" - -#: builtin/fetch.c:549 -msgid "(none)" -msgstr "" - -#: builtin/fetch.c:666 -#, c-format -msgid "Refusing to fetch into current branch %s of non-bare repository" -msgstr "" - -#: builtin/fetch.c:700 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "" - -#: builtin/fetch.c:777 -#, c-format -msgid "Option \"%s\" value \"%s\" is not valid for %s" -msgstr "" - -#: builtin/fetch.c:780 -#, c-format -msgid "Option \"%s\" is ignored for %s\n" -msgstr "" - -#: builtin/fetch.c:879 -#, c-format -msgid "Fetching %s\n" -msgstr "" - -#: builtin/fetch.c:881 -#, c-format -msgid "Could not fetch %s" -msgstr "" - -#: builtin/fetch.c:898 -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:918 -msgid "You need to specify a tag name." -msgstr "" - -#: builtin/fetch.c:970 -msgid "fetch --all does not take a repository argument" -msgstr "" - -#: builtin/fetch.c:972 -msgid "fetch --all does not make sense with refspecs" -msgstr "" - -#: builtin/fetch.c:983 -#, c-format -msgid "No such remote or remote group: %s" -msgstr "" - -#: builtin/fetch.c:991 -msgid "Fetching a group and specifying refspecs does not make sense" -msgstr "" - -#: builtin/gc.c:63 -#, c-format -msgid "Invalid %s: '%s'" -msgstr "" - -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "" - -#: builtin/gc.c:103 -#, c-format -msgid "insanely long object directory %.*s" -msgstr "" - -#: builtin/gc.c:223 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "" - -#: builtin/gc.c:226 -#, 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:256 -msgid "" -"There are too many unreachable loose objects; run 'git prune' to remove them." -msgstr "" - -#: builtin/grep.c:216 -#, c-format -msgid "grep: failed to create thread: %s" -msgstr "" - -#: builtin/grep.c:402 -#, c-format -msgid "Failed to chdir: %s" -msgstr "" - -#: builtin/grep.c:478 builtin/grep.c:512 -#, c-format -msgid "unable to read tree (%s)" -msgstr "" - -#: builtin/grep.c:526 -#, c-format -msgid "unable to grep from object of type %s" -msgstr "" - -#: builtin/grep.c:584 -#, c-format -msgid "switch `%c' expects a numerical value" -msgstr "" - -#: builtin/grep.c:601 -#, c-format -msgid "cannot open '%s'" -msgstr "" - -#: builtin/grep.c:889 -msgid "no pattern given." -msgstr "" - -#: builtin/grep.c:903 -#, c-format -msgid "bad object %s" -msgstr "" - -#: builtin/grep.c:944 -msgid "--open-files-in-pager only works on the worktree" -msgstr "" - -#: builtin/grep.c:967 -msgid "--cached or --untracked cannot be used with --no-index." -msgstr "" - -#: builtin/grep.c:972 -msgid "--no-index or --untracked cannot be used with revs." -msgstr "" - -#: builtin/grep.c:975 -msgid "--[no-]exclude-standard cannot be used for tracked contents." -msgstr "" - -#: builtin/grep.c:983 -msgid "both --cached and trees are given." -msgstr "" - -#: builtin/init-db.c:35 -#, c-format -msgid "Could not make %s writable by group" -msgstr "" - -#: builtin/init-db.c:62 -#, c-format -msgid "insanely long template name %s" -msgstr "" - -#: builtin/init-db.c:67 -#, c-format -msgid "cannot stat '%s'" -msgstr "" - -#: builtin/init-db.c:73 -#, c-format -msgid "cannot stat template '%s'" -msgstr "" - -#: builtin/init-db.c:80 -#, c-format -msgid "cannot opendir '%s'" -msgstr "" - -#: builtin/init-db.c:97 -#, c-format -msgid "cannot readlink '%s'" -msgstr "" - -#: builtin/init-db.c:99 -#, c-format -msgid "insanely long symlink %s" -msgstr "" - -#: builtin/init-db.c:102 -#, c-format -msgid "cannot symlink '%s' '%s'" -msgstr "" - -#: builtin/init-db.c:106 -#, c-format -msgid "cannot copy '%s' to '%s'" -msgstr "" - -#: builtin/init-db.c:110 -#, c-format -msgid "ignoring template %s" -msgstr "" - -#: builtin/init-db.c:133 -#, c-format -msgid "insanely long template path %s" -msgstr "" - -#: builtin/init-db.c:141 -#, c-format -msgid "templates not found %s" -msgstr "" - -#: builtin/init-db.c:154 -#, c-format -msgid "not copying templates of a wrong format version %d from '%s'" -msgstr "" - -#: builtin/init-db.c:192 -#, c-format -msgid "insane git directory %s" -msgstr "" - -#: builtin/init-db.c:322 builtin/init-db.c:325 -#, c-format -msgid "%s already exists" -msgstr "" - -#: builtin/init-db.c:354 -#, c-format -msgid "unable to handle file type %d" -msgstr "" - -#: builtin/init-db.c:357 -#, c-format -msgid "unable to move %s to %s" -msgstr "" - -#: builtin/init-db.c:362 -#, c-format -msgid "Could not create git link %s" -msgstr "" - -#. -#. * TRANSLATORS: The first '%s' is either "Reinitialized -#. * existing" or "Initialized empty", the second " shared" or -#. * "", and the last '%s%s' is the verbatim directory name. -#. -#: builtin/init-db.c:419 -#, c-format -msgid "%s%s Git repository in %s%s\n" -msgstr "" - -#: builtin/init-db.c:420 -msgid "Reinitialized existing" -msgstr "" - -#: builtin/init-db.c:420 -msgid "Initialized empty" -msgstr "" - -#: builtin/init-db.c:421 -msgid " shared" -msgstr "" - -#: builtin/init-db.c:440 -msgid "cannot tell cwd" -msgstr "" - -#: builtin/init-db.c:521 builtin/init-db.c:528 -#, c-format -msgid "cannot mkdir %s" -msgstr "" - -#: builtin/init-db.c:532 -#, c-format -msgid "cannot chdir to %s" -msgstr "" - -#: builtin/init-db.c:554 -#, c-format -msgid "" -"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" -"dir=<directory>)" -msgstr "" - -#: builtin/init-db.c:578 -msgid "Cannot access current working directory" -msgstr "" - -#: builtin/init-db.c:585 -#, c-format -msgid "Cannot access work tree '%s'" -msgstr "" - -#: builtin/log.c:185 -#, c-format -msgid "Final output: %d %s\n" -msgstr "" - -#: builtin/log.c:393 builtin/log.c:479 -#, c-format -msgid "Could not read object %s" -msgstr "" - -#: builtin/log.c:503 -#, c-format -msgid "Unknown type: %d" -msgstr "" - -#: builtin/log.c:592 -msgid "format.headers without value" -msgstr "" - -#: builtin/log.c:665 -msgid "name of output directory is too long" -msgstr "" - -#: builtin/log.c:676 -#, c-format -msgid "Cannot open patch file %s" -msgstr "" - -#: builtin/log.c:690 -msgid "Need exactly one range." -msgstr "" - -#: builtin/log.c:698 -msgid "Not a range." -msgstr "" - -#: builtin/log.c:735 -msgid "Could not extract email from committer identity." -msgstr "" - -#: builtin/log.c:781 -msgid "Cover letter needs email format" -msgstr "" - -#: builtin/log.c:875 -#, c-format -msgid "insane in-reply-to: %s" -msgstr "" - -#: builtin/log.c:948 -msgid "Two output directories?" -msgstr "" - -#: builtin/log.c:1169 -#, c-format -msgid "bogus committer info %s" -msgstr "" - -#: builtin/log.c:1214 -msgid "-n and -k are mutually exclusive." -msgstr "" - -#: builtin/log.c:1216 -msgid "--subject-prefix and -k are mutually exclusive." -msgstr "" - -#: builtin/log.c:1221 builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "" - -#: builtin/log.c:1224 -msgid "--name-only does not make sense" -msgstr "" - -#: builtin/log.c:1226 -msgid "--name-status does not make sense" -msgstr "" - -#: builtin/log.c:1228 -msgid "--check does not make sense" -msgstr "" - -#: builtin/log.c:1251 -msgid "standard output, or directory, which one?" -msgstr "" - -#: builtin/log.c:1253 -#, c-format -msgid "Could not create directory '%s'" -msgstr "" - -#: builtin/log.c:1406 -msgid "Failed to create output files" -msgstr "" - -#: builtin/log.c:1510 -#, c-format -msgid "" -"Could not find a tracked remote branch, please specify <upstream> manually.\n" -msgstr "" - -#: builtin/log.c:1526 builtin/log.c:1528 builtin/log.c:1540 -#, c-format -msgid "Unknown commit %s" -msgstr "" - -#: builtin/merge.c:91 -msgid "switch `m' requires a value" -msgstr "" - -#: builtin/merge.c:128 -#, c-format -msgid "Could not find merge strategy '%s'.\n" -msgstr "" - -#: builtin/merge.c:129 -#, c-format -msgid "Available strategies are:" -msgstr "" - -#: builtin/merge.c:134 -#, c-format -msgid "Available custom strategies are:" -msgstr "" - -#: builtin/merge.c:241 -msgid "could not run stash." -msgstr "" - -#: builtin/merge.c:246 -msgid "stash failed" -msgstr "" - -#: builtin/merge.c:251 -#, c-format -msgid "not a valid object: %s" -msgstr "" - -#: builtin/merge.c:270 builtin/merge.c:287 -msgid "read-tree failed" -msgstr "" - -#: builtin/merge.c:317 -msgid " (nothing to squash)" -msgstr "" - -#: builtin/merge.c:330 -#, c-format -msgid "Squash commit -- not updating HEAD\n" -msgstr "" - -#: builtin/merge.c:362 -msgid "Writing SQUASH_MSG" -msgstr "" - -#: builtin/merge.c:364 -msgid "Finishing SQUASH_MSG" -msgstr "" - -#: builtin/merge.c:386 -#, c-format -msgid "No merge message -- not updating HEAD\n" -msgstr "" - -#: builtin/merge.c:435 -#, c-format -msgid "'%s' does not point to a commit" -msgstr "" - -#: builtin/merge.c:534 -#, c-format -msgid "Bad branch.%s.mergeoptions string: %s" -msgstr "" - -#: builtin/merge.c:627 -msgid "git write-tree failed to write a tree" -msgstr "" - -#: builtin/merge.c:677 -msgid "failed to read the cache" -msgstr "" - -#: builtin/merge.c:694 -msgid "Unable to write index." -msgstr "" - -#: builtin/merge.c:707 -msgid "Not handling anything other than two heads merge." -msgstr "" - -#: builtin/merge.c:721 -#, c-format -msgid "Unknown option for merge-recursive: -X%s" -msgstr "" - -#: builtin/merge.c:735 -#, c-format -msgid "unable to write %s" -msgstr "" - -#: builtin/merge.c:874 -#, c-format -msgid "Could not read from '%s'" -msgstr "" - -#: builtin/merge.c:883 -#, c-format -msgid "Not committing merge; use 'git commit' to complete the merge.\n" -msgstr "" - -#: builtin/merge.c:889 -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" -"\n" -"Lines starting with '#' will be ignored, and an empty message aborts\n" -"the commit.\n" -msgstr "" - -#: builtin/merge.c:913 -msgid "Empty commit message." -msgstr "" - -#: builtin/merge.c:925 -#, c-format -msgid "Wonderful.\n" -msgstr "" - -#: builtin/merge.c:998 -#, c-format -msgid "Automatic merge failed; fix conflicts and then commit the result.\n" -msgstr "" - -#: builtin/merge.c:1014 -#, c-format -msgid "'%s' is not a commit" -msgstr "" - -#: builtin/merge.c:1055 -msgid "No current branch." -msgstr "" - -#: builtin/merge.c:1057 -msgid "No remote for the current branch." -msgstr "" - -#: builtin/merge.c:1059 -msgid "No default upstream defined for the current branch." -msgstr "" - -#: builtin/merge.c:1064 -#, c-format -msgid "No remote tracking branch for %s from %s" -msgstr "" - -#: builtin/merge.c:1186 -msgid "There is no merge to abort (MERGE_HEAD missing)." -msgstr "" - -#: builtin/merge.c:1202 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:1205 git-pull.sh:34 -msgid "You have not concluded your merge (MERGE_HEAD exists)." -msgstr "" - -#: builtin/merge.c:1209 -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:1212 -msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." -msgstr "" - -#: builtin/merge.c:1221 -msgid "You cannot combine --squash with --no-ff." -msgstr "" - -#: builtin/merge.c:1226 -msgid "You cannot combine --no-ff with --ff-only." -msgstr "" - -#: builtin/merge.c:1233 -msgid "No commit specified and merge.defaultToUpstream not set." -msgstr "" - -#: builtin/merge.c:1264 -msgid "Can merge only exactly one commit into empty head" -msgstr "" - -#: builtin/merge.c:1267 -msgid "Squash commit into empty head not supported yet" -msgstr "" - -#: builtin/merge.c:1269 -msgid "Non-fast-forward commit does not make sense into an empty head" -msgstr "" - -#: builtin/merge.c:1273 builtin/merge.c:1317 -#, c-format -msgid "%s - not something we can merge" -msgstr "" - -#: builtin/merge.c:1383 -#, c-format -msgid "Updating %s..%s\n" -msgstr "" - -#: builtin/merge.c:1421 -#, c-format -msgid "Trying really trivial in-index merge...\n" -msgstr "" - -#: builtin/merge.c:1428 -#, c-format -msgid "Nope.\n" -msgstr "" - -#: builtin/merge.c:1460 -msgid "Not possible to fast-forward, aborting." -msgstr "" - -#: builtin/merge.c:1483 builtin/merge.c:1560 -#, c-format -msgid "Rewinding the tree to pristine...\n" -msgstr "" - -#: builtin/merge.c:1487 -#, c-format -msgid "Trying merge strategy %s...\n" -msgstr "" - -#: builtin/merge.c:1551 -#, c-format -msgid "No merge strategy handled the merge.\n" -msgstr "" - -#: builtin/merge.c:1553 -#, c-format -msgid "Merge with strategy %s failed.\n" -msgstr "" - -#: builtin/merge.c:1562 -#, c-format -msgid "Using the %s to prepare resolving by hand.\n" -msgstr "" - -#: builtin/merge.c:1573 -#, c-format -msgid "Automatic merge went well; stopped before committing as requested\n" -msgstr "" - -#: builtin/mv.c:108 -#, c-format -msgid "Checking rename of '%s' to '%s'\n" -msgstr "" - -#: builtin/mv.c:112 -msgid "bad source" -msgstr "" - -#: builtin/mv.c:115 -msgid "can not move directory into itself" -msgstr "" - -#: builtin/mv.c:118 -msgid "cannot move directory over file" -msgstr "" - -#: builtin/mv.c:128 -#, c-format -msgid "Huh? %.*s is in index?" -msgstr "" - -#: builtin/mv.c:140 -msgid "source directory is empty" -msgstr "" - -#: builtin/mv.c:171 -msgid "not under version control" -msgstr "" - -#: builtin/mv.c:173 -msgid "destination exists" -msgstr "" - -#: builtin/mv.c:181 -#, c-format -msgid "overwriting '%s'" -msgstr "" - -#: builtin/mv.c:184 -msgid "Cannot overwrite" -msgstr "" - -#: builtin/mv.c:187 -msgid "multiple sources for the same target" -msgstr "" - -#: builtin/mv.c:202 -#, c-format -msgid "%s, source=%s, destination=%s" -msgstr "" - -#: builtin/mv.c:212 -#, c-format -msgid "Renaming %s to %s\n" -msgstr "" - -#: builtin/mv.c:215 -#, c-format -msgid "renaming '%s' failed" -msgstr "" - -#: builtin/notes.c:139 -#, c-format -msgid "unable to start 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:145 -msgid "can't fdopen 'show' output fd" -msgstr "" - -#: builtin/notes.c:155 -#, c-format -msgid "failed to close pipe to 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:158 -#, c-format -msgid "failed to finish 'show' for object '%s'" -msgstr "" - -#: builtin/notes.c:175 builtin/tag.c:343 -#, c-format -msgid "could not create file '%s'" -msgstr "" - -#: builtin/notes.c:189 -msgid "Please supply the note contents using either -m or -F option" -msgstr "" - -#: builtin/notes.c:210 builtin/notes.c:973 -#, c-format -msgid "Removing note for object %s\n" -msgstr "" - -#: builtin/notes.c:215 -msgid "unable to write note object" -msgstr "" - -#: builtin/notes.c:217 -#, c-format -msgid "The note contents has been left in %s" -msgstr "" - -#: builtin/notes.c:251 builtin/tag.c:521 -#, c-format -msgid "cannot read '%s'" -msgstr "" - -#: builtin/notes.c:253 builtin/tag.c:524 -#, 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:537 -#, c-format -msgid "Failed to resolve '%s' as a valid ref." -msgstr "" - -#: builtin/notes.c:275 -#, c-format -msgid "Failed to read object '%s'." -msgstr "" - -#: builtin/notes.c:299 -msgid "Cannot commit uninitialized/unreferenced notes tree" -msgstr "" - -#: builtin/notes.c:340 -#, c-format -msgid "Bad notes.rewriteMode value: '%s'" -msgstr "" - -#: builtin/notes.c:350 -#, 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 -#, c-format -msgid "Bad %s value: '%s'" -msgstr "" - -#: builtin/notes.c:441 -#, c-format -msgid "Malformed input line: '%s'." -msgstr "" - -#: builtin/notes.c:456 -#, 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 -msgid "too many parameters" -msgstr "" - -#: builtin/notes.c:513 builtin/notes.c:772 -#, c-format -msgid "No note found for object %s." -msgstr "" - -#: builtin/notes.c:580 -#, 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 -#, c-format -msgid "Overwriting existing notes for object %s\n" -msgstr "" - -#: builtin/notes.c:635 -msgid "too few parameters" -msgstr "" - -#: builtin/notes.c:656 -#, c-format -msgid "" -"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " -"existing notes" -msgstr "" - -#: builtin/notes.c:668 -#, c-format -msgid "Missing notes on source object %s. Cannot copy." -msgstr "" - -#: builtin/notes.c:717 -#, 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 -#, c-format -msgid "Object %s has no note\n" -msgstr "" - -#: builtin/notes.c:1103 -#, c-format -msgid "Unknown subcommand: %s" -msgstr "" - -#: builtin/pack-objects.c:2310 -#, c-format -msgid "unsupported index version %s" -msgstr "" - -#: builtin/pack-objects.c:2314 -#, c-format -msgid "bad index version '%s'" -msgstr "" - -#: builtin/pack-objects.c:2322 -#, c-format -msgid "option %s does not accept negative form" -msgstr "" - -#: builtin/pack-objects.c:2326 -#, c-format -msgid "unable to parse value '%s' for option %s" -msgstr "" - -#: builtin/push.c:44 -msgid "tag shorthand without <tag>" -msgstr "" - -#: builtin/push.c:63 -msgid "--delete only accepts plain target ref names" -msgstr "" - -#: builtin/push.c:73 -#, c-format -msgid "" -"You are not currently on a branch.\n" -"To push the history leading to the current (detached HEAD)\n" -"state now, use\n" -"\n" -" git push %s HEAD:<name-of-remote-branch>\n" -msgstr "" - -#: builtin/push.c:80 -#, c-format -msgid "" -"The current branch %s has no upstream branch.\n" -"To push the current branch and set the remote as upstream, use\n" -"\n" -" git push --set-upstream %s %s\n" -msgstr "" - -#: builtin/push.c:88 -#, c-format -msgid "The current branch %s has multiple upstream branches, refusing to push." -msgstr "" - -#: builtin/push.c:111 -msgid "" -"You didn't specify any refspecs to push, and push.default is \"nothing\"." -msgstr "" - -#: builtin/push.c:131 -#, c-format -msgid "Pushing to %s\n" -msgstr "" - -#: builtin/push.c:135 -#, c-format -msgid "failed to push some refs to '%s'" -msgstr "" - -#: builtin/push.c:143 -#, c-format -msgid "" -"To prevent you from losing history, non-fast-forward updates were rejected\n" -"Merge the remote changes (e.g. 'git pull') before pushing again. See the\n" -"'Note about fast-forwards' section of 'git push --help' for details.\n" -msgstr "" - -#: builtin/push.c:160 -#, c-format -msgid "bad repository '%s'" -msgstr "" - -#: builtin/push.c:161 -msgid "" -"No configured push destination.\n" -"Either specify the URL from the command-line or configure a remote " -"repository using\n" -"\n" -" git remote add <name> <url>\n" -"\n" -"and then push using the remote name\n" -"\n" -" git push <name>\n" -msgstr "" - -#: builtin/push.c:176 -msgid "--all and --tags are incompatible" -msgstr "" - -#: builtin/push.c:177 -msgid "--all can't be combined with refspecs" -msgstr "" - -#: builtin/push.c:182 -msgid "--mirror and --tags are incompatible" -msgstr "" - -#: builtin/push.c:183 -msgid "--mirror can't be combined with refspecs" -msgstr "" - -#: builtin/push.c:188 -msgid "--all and --mirror are incompatible" -msgstr "" - -#: builtin/push.c:274 -msgid "--delete is incompatible with --all, --mirror and --tags" -msgstr "" - -#: builtin/push.c:276 -msgid "--delete doesn't make sense without any refs" -msgstr "" - -#: builtin/reset.c:33 -msgid "mixed" -msgstr "" - -#: builtin/reset.c:33 -msgid "soft" -msgstr "" - -#: builtin/reset.c:33 -msgid "hard" -msgstr "" - -#: builtin/reset.c:33 -msgid "keep" -msgstr "" - -#: builtin/reset.c:77 -msgid "You do not have a valid HEAD." -msgstr "" - -#: builtin/reset.c:79 -msgid "Failed to find tree of HEAD." -msgstr "" - -#: builtin/reset.c:85 -#, c-format -msgid "Failed to find tree of %s." -msgstr "" - -#: builtin/reset.c:96 -msgid "Could not write new index file." -msgstr "" - -#: builtin/reset.c:106 -#, c-format -msgid "HEAD is now at %s" -msgstr "" - -#: builtin/reset.c:130 -msgid "Could not read index" -msgstr "" - -#: builtin/reset.c:133 -msgid "Unstaged changes after reset:" -msgstr "" - -#: builtin/reset.c:223 -#, c-format -msgid "Cannot do a %s reset in the middle of a merge." -msgstr "" - -#: builtin/reset.c:297 -#, c-format -msgid "Could not parse object '%s'." -msgstr "" - -#: builtin/reset.c:302 -msgid "--patch is incompatible with --{hard,mixed,soft}" -msgstr "" - -#: builtin/reset.c:311 -msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." -msgstr "" - -#: builtin/reset.c:313 -#, c-format -msgid "Cannot do %s reset with paths." -msgstr "" - -#: builtin/reset.c:325 -#, c-format -msgid "%s reset is not allowed in a bare repository" -msgstr "" - -#: builtin/reset.c:341 -#, c-format -msgid "Could not reset index file to revision '%s'." -msgstr "" - -#: builtin/revert.c:70 builtin/revert.c:91 -#, c-format -msgid "%s: %s cannot be used with %s" -msgstr "" - -#: builtin/revert.c:126 -msgid "program error" -msgstr "" - -#: builtin/revert.c:209 -msgid "revert failed" -msgstr "" - -#: builtin/revert.c:224 -msgid "cherry-pick failed" -msgstr "" - -#: 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 "" - -#: builtin/rm.c:115 -#, c-format -msgid "" -"'%s' has changes staged in the index\n" -"(use --cached to keep the file, or -f to force removal)" -msgstr "" - -#: builtin/rm.c:119 -#, c-format -msgid "" -"'%s' has local modifications\n" -"(use --cached to keep the file, or -f to force removal)" -msgstr "" - -#: builtin/rm.c:194 -#, c-format -msgid "not removing '%s' recursively without -r" -msgstr "" - -#: builtin/rm.c:230 -#, c-format -msgid "git rm: unable to remove %s" -msgstr "" - -#: builtin/shortlog.c:157 -#, c-format -msgid "Missing author: %s" -msgstr "" - -#: builtin/tag.c:58 -#, c-format -msgid "malformed object at '%s'" -msgstr "" - -#: builtin/tag.c:205 -#, c-format -msgid "tag name too long: %.*s..." -msgstr "" - -#: builtin/tag.c:210 -#, c-format -msgid "tag '%s' not found." -msgstr "" - -#: builtin/tag.c:225 -#, c-format -msgid "Deleted tag '%s' (was %s)\n" -msgstr "" - -#: builtin/tag.c:237 -#, c-format -msgid "could not verify the tag '%s'" -msgstr "" - -#: builtin/tag.c:247 -msgid "" -"\n" -"#\n" -"# Write a tag message\n" -"# Lines starting with '#' will be ignored.\n" -"#\n" -msgstr "" - -#: builtin/tag.c:254 -msgid "" -"\n" -"#\n" -"# Write a tag message\n" -"# Lines starting with '#' will be kept; you may remove them yourself if you " -"want to.\n" -"#\n" -msgstr "" - -#: builtin/tag.c:294 -msgid "unable to sign the tag" -msgstr "" - -#: builtin/tag.c:296 -msgid "unable to write tag file" -msgstr "" - -#: builtin/tag.c:321 -msgid "bad object type." -msgstr "" - -#: builtin/tag.c:334 -msgid "tag header too big." -msgstr "" - -#: builtin/tag.c:366 -msgid "no tag message?" -msgstr "" - -#: builtin/tag.c:372 -#, c-format -msgid "The tag message has been left in %s\n" -msgstr "" - -#: builtin/tag.c:421 -msgid "switch 'points-at' requires an object" -msgstr "" - -#: builtin/tag.c:423 -#, c-format -msgid "malformed object name '%s'" -msgstr "" - -#: builtin/tag.c:502 -msgid "-n option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:504 -msgid "--contains option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:506 -msgid "--points-at option is only allowed with -l." -msgstr "" - -#: builtin/tag.c:514 -msgid "only one -F or -m option is allowed." -msgstr "" - -#: builtin/tag.c:534 -msgid "too many params" -msgstr "" - -#: builtin/tag.c:540 -#, c-format -msgid "'%s' is not a valid tag name." -msgstr "" - -#: builtin/tag.c:545 -#, c-format -msgid "tag '%s' already exists" -msgstr "" - -#: builtin/tag.c:563 -#, c-format -msgid "%s: cannot lock the ref" -msgstr "" - -#: builtin/tag.c:565 -#, c-format -msgid "%s: cannot update the ref" -msgstr "" - -#: builtin/tag.c:567 -#, c-format -msgid "Updated tag '%s' (was %s)\n" -msgstr "" - -#: git-am.sh:49 -msgid "You need to set your committer info first" -msgstr "" - -#: git-am.sh:135 -msgid "Repository lacks necessary blobs to fall back on 3-way merge." -msgstr "" - -#: git-am.sh:144 -msgid "" -"Did you hand edit your patch?\n" -"It does not apply to blobs recorded in its index." -msgstr "" - -#: git-am.sh:153 -msgid "Falling back to patching base and 3-way merge..." -msgstr "" - -#: git-am.sh:265 -msgid "Only one StGIT patch series can be applied at once" -msgstr "" - -#: git-am.sh:352 -#, sh-format -msgid "Patch format $patch_format is not supported." -msgstr "" - -#: git-am.sh:354 -msgid "Patch format detection failed." -msgstr "" - -#: git-am.sh:406 -msgid "-d option is no longer supported. Do not use." -msgstr "" - -#: git-am.sh:469 -#, sh-format -msgid "previous rebase directory $dotest still exists but mbox given." -msgstr "" - -#: git-am.sh:474 -msgid "Please make up your mind. --skip or --abort?" -msgstr "" - -#: git-am.sh:501 -msgid "Resolve operation not in progress, we are not resuming." -msgstr "" - -#: git-am.sh:567 -#, sh-format -msgid "Dirty index: cannot apply patches (dirty: $files)" -msgstr "" - -#: git-am.sh:743 -msgid "cannot be interactive without stdin connected to a terminal." -msgstr "" - -#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] -#. in your translation. The program will only accept English -#. input at this point. -#: git-am.sh:754 -msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " -msgstr "" - -#: git-am.sh:790 -#, sh-format -msgid "Applying: $FIRSTLINE" -msgstr "" - -#: git-am.sh:835 -msgid "No changes -- Patch already applied." -msgstr "" - -#: git-am.sh:861 -msgid "applying to an empty history" -msgstr "" - -#. TRANSLATORS: Make sure to include [Y] and [n] in your -#. translation. The program will only accept English input -#. at this point. -#: git-bisect.sh:54 -msgid "Do you want me to do it for you [Y/n]? " -msgstr "" - -#: git-bisect.sh:95 -#, sh-format -msgid "unrecognised option: '$arg'" -msgstr "" - -#: git-bisect.sh:99 -#, sh-format -msgid "'$arg' does not appear to be a valid revision" -msgstr "" - -#: git-bisect.sh:117 -msgid "Bad HEAD - I need a HEAD" -msgstr "" - -#: git-bisect.sh:130 -#, sh-format -msgid "" -"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." -msgstr "" - -#: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "" - -#: git-bisect.sh:144 -msgid "Bad HEAD - strange symbolic ref" -msgstr "" - -#: git-bisect.sh:189 -#, sh-format -msgid "Bad bisect_write argument: $state" -msgstr "" - -#: git-bisect.sh:218 -#, sh-format -msgid "Bad rev input: $arg" -msgstr "" - -#: git-bisect.sh:232 -msgid "Please call 'bisect_state' with at least one argument." -msgstr "" - -#: git-bisect.sh:244 -#, sh-format -msgid "Bad rev input: $rev" -msgstr "" - -#: git-bisect.sh:250 -msgid "'git bisect bad' can take only one argument." -msgstr "" - -#. 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 "" - -#: git-bisect.sh:354 -#, sh-format -msgid "'$invalid' is not a valid commit" -msgstr "" - -#: git-bisect.sh:363 -#, sh-format -msgid "" -"Could not check out original HEAD '$branch'.\n" -"Try 'git bisect reset <commit>'." -msgstr "" - -#: git-bisect.sh:390 -msgid "No logfile given" -msgstr "" - -#: git-bisect.sh:391 -#, sh-format -msgid "cannot read $file for replaying" -msgstr "" - -#: git-bisect.sh:408 -msgid "?? what are you talking about?" -msgstr "" - -#: git-bisect.sh:474 -msgid "We are not bisecting." -msgstr "" - -#: git-pull.sh:21 -msgid "" -"Pull is not possible because you have unmerged files.\n" -"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" -"as appropriate to mark resolution, or use 'git commit -a'." -msgstr "" - -#: git-pull.sh:25 -msgid "Pull is not possible because you have unmerged files." -msgstr "" - -#: git-pull.sh:197 -msgid "updating an unborn branch with changes added to the index" -msgstr "" - -#: git-pull.sh:253 -msgid "Cannot merge multiple branches into empty head" -msgstr "" - -#: git-pull.sh:257 -msgid "Cannot rebase onto multiple branches" -msgstr "" - -#: git-stash.sh:51 -msgid "git stash clear with parameters is unimplemented" -msgstr "" - -#: git-stash.sh:74 -msgid "You do not have the initial commit yet" -msgstr "" - -#: git-stash.sh:89 -msgid "Cannot save the current index state" -msgstr "" - -#: git-stash.sh:123 git-stash.sh:136 -msgid "Cannot save the current worktree state" -msgstr "" - -#: git-stash.sh:140 -msgid "No changes selected" -msgstr "" - -#: git-stash.sh:143 -msgid "Cannot remove temporary index (can't happen)" -msgstr "" - -#: git-stash.sh:156 -msgid "Cannot record working tree state" -msgstr "" - -#: git-stash.sh:223 -msgid "No local changes to save" -msgstr "" - -#: git-stash.sh:227 -msgid "Cannot initialize stash" -msgstr "" - -#: git-stash.sh:235 -msgid "Cannot save the current status" -msgstr "" - -#: git-stash.sh:253 -msgid "Cannot remove worktree changes" -msgstr "" - -#: git-stash.sh:352 -msgid "No stash found." -msgstr "" - -#: git-stash.sh:359 -#, sh-format -msgid "Too many revisions specified: $REV" -msgstr "" - -#: git-stash.sh:365 -#, sh-format -msgid "$reference is not valid reference" -msgstr "" - -#: git-stash.sh:393 -#, sh-format -msgid "'$args' is not a stash-like commit" -msgstr "" - -#: git-stash.sh:404 -#, sh-format -msgid "'$args' is not a stash reference" -msgstr "" - -#: git-stash.sh:412 -msgid "unable to refresh index" -msgstr "" - -#: git-stash.sh:416 -msgid "Cannot apply a stash in the middle of a merge" -msgstr "" - -#: git-stash.sh:424 -msgid "Conflicts in index. Try without --index." -msgstr "" - -#: git-stash.sh:426 -msgid "Could not save index tree" -msgstr "" - -#: git-stash.sh:460 -msgid "Cannot unstage modified files" -msgstr "" - -#: git-stash.sh:491 -#, sh-format -msgid "Dropped ${REV} ($s)" -msgstr "" - -#: git-stash.sh:492 -#, sh-format -msgid "${REV}: Could not drop stash entry" -msgstr "" - -#: git-stash.sh:499 -msgid "No branch name specified" -msgstr "" - -#: git-stash.sh:570 -msgid "(To restore them type \"git stash apply\")" -msgstr "" - -#: git-submodule.sh:56 -#, sh-format -msgid "cannot strip one component off url '$remoteurl'" -msgstr "" - -#: git-submodule.sh:108 -#, sh-format -msgid "No submodule mapping found in .gitmodules for path '$path'" -msgstr "" - -#: git-submodule.sh:173 -#, sh-format -msgid "Clone of '$url' into submodule path '$path' failed" -msgstr "" - -#: git-submodule.sh:247 -#, sh-format -msgid "repo URL: '$repo' must be absolute or begin with ./|../" -msgstr "" - -#: git-submodule.sh:264 -#, sh-format -msgid "'$path' already exists in the index" -msgstr "" - -#: git-submodule.sh:281 -#, sh-format -msgid "'$path' already exists and is not a valid git repo" -msgstr "" - -#: git-submodule.sh:295 -#, sh-format -msgid "Unable to checkout submodule '$path'" -msgstr "" - -#: git-submodule.sh:300 -#, sh-format -msgid "Failed to add submodule '$path'" -msgstr "" - -#: git-submodule.sh:305 -#, sh-format -msgid "Failed to register submodule '$path'" -msgstr "" - -#: git-submodule.sh:347 -#, sh-format -msgid "Entering '$prefix$path'" -msgstr "" - -#: git-submodule.sh:359 -#, sh-format -msgid "Stopping at '$path'; script returned non-zero status." -msgstr "" - -#: git-submodule.sh:401 -#, sh-format -msgid "No url found for submodule path '$path' in .gitmodules" -msgstr "" - -#: git-submodule.sh:410 -#, sh-format -msgid "Failed to register url for submodule path '$path'" -msgstr "" - -#: git-submodule.sh:418 -#, sh-format -msgid "Failed to register update mode for submodule path '$path'" -msgstr "" - -#: git-submodule.sh:420 -#, sh-format -msgid "Submodule '$name' ($url) registered for path '$path'" -msgstr "" - -#: git-submodule.sh:519 -#, sh-format -msgid "" -"Submodule path '$path' not initialized\n" -"Maybe you want to use 'update --init'?" -msgstr "" - -#: git-submodule.sh:532 -#, sh-format -msgid "Unable to find current revision in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:551 -#, sh-format -msgid "Unable to fetch in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:565 -#, sh-format -msgid "Unable to rebase '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:566 -#, sh-format -msgid "Submodule path '$path': rebased into '$sha1'" -msgstr "" - -#: git-submodule.sh:571 -#, sh-format -msgid "Unable to merge '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:572 -#, sh-format -msgid "Submodule path '$path': merged in '$sha1'" -msgstr "" - -#: git-submodule.sh:577 -#, sh-format -msgid "Unable to checkout '$sha1' in submodule path '$path'" -msgstr "" - -#: git-submodule.sh:578 -#, sh-format -msgid "Submodule path '$path': checked out '$sha1'" -msgstr "" - -#: git-submodule.sh:600 git-submodule.sh:923 -#, sh-format -msgid "Failed to recurse into submodule path '$path'" -msgstr "" - -#: git-submodule.sh:708 -msgid "--" -msgstr "" - -#: git-submodule.sh:766 -#, sh-format -msgid " Warn: $name doesn't contain commit $sha1_src" -msgstr "" - -#: git-submodule.sh:769 -#, sh-format -msgid " Warn: $name doesn't contain commit $sha1_dst" -msgstr "" - -#: git-submodule.sh:772 -#, sh-format -msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" -msgstr "" - -#: git-submodule.sh:797 -msgid "blob" -msgstr "" - -#: git-submodule.sh:798 -msgid "submodule" -msgstr "" - -#: git-submodule.sh:969 -#, sh-format -msgid "Synchronizing submodule url for '$name'" -msgstr "" @@ -1,14 +1,14 @@ # Swedish translations for Git. -# Copyright (C) 2010-2013 Peter krefting <peter@softwolves.pp.se> +# Copyright (C) 2010-2014 Peter krefting <peter@softwolves.pp.se> # This file is distributed under the same license as the Git package. -# Peter Krefting <peter@softwolves.pp.se>, 2010, 2011, 2012, 2013. +# Peter Krefting <peter@softwolves.pp.se>, 2010, 2011, 2012, 2013, 2014. # msgid "" msgstr "" "Project-Id-Version: git 1.8.4\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2013-08-06 14:10+0800\n" -"PO-Revision-Date: 2013-08-06 12:37+0100\n" +"POT-Creation-Date: 2014-02-01 08:06+0800\n" +"PO-Revision-Date: 2014-02-02 17:21+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" @@ -57,71 +57,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <arkiv> [--exec <kmd>] --list" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "sökvägsangivelsen \"%s\" motsvarade inte nÃ¥gra filer" + +#: archive.c:327 msgid "fmt" msgstr "fmt" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "arkivformat" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" msgstr "prefix" -#: archive.c:325 +#: archive.c:329 msgid "prepend prefix to each pathname in the archive" msgstr "lägg till prefix till varje sökväg i arkivet" -#: archive.c:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "fil" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "skriv arkivet till filen" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "läs .gitattributes i arbetskatalogen" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "rapportera arkiverade filer pÃ¥ standard fel" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "endast spara" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "komprimera snabbare" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "komprimera bättre" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "visa understödda arkivformat" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "arkiv" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 msgid "retrieve the archive from remote repository <repo>" msgstr "hämta arkivet frÃ¥n fjärrarkivet <arkiv>" -#: archive.c:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "kommando" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "sökväg till kommandot git-upload-archive pÃ¥ fjärren" @@ -204,17 +209,17 @@ msgstr "Det finns redan en gren som heter \"%s\"" msgid "Cannot force update the current branch." msgstr "Kan inte tvinga uppdatering av aktuell gren." -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "Kan inte ställa in spÃ¥rning; startpunkten \"%s\" är inte en gren." -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "den efterfrÃ¥gade uppströmsgrenen \"%s\" finns inte" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -234,87 +239,87 @@ msgstr "" "spÃ¥ra dess fjärrmotsvarighet kan du använda \"git push -u\"\n" "för att ställa in uppströmskonfigurationen när du sänder in." -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "Objektnamnet är inte giltigt: \"%s\"." -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "Objektnamnet är tvetydigt: \"%s\"." -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "Avgreningspunkten är inte giltig: \"%s\"" -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "Misslyckades lÃ¥sa referens för uppdatering" -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "Misslyckades skriva referens" -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "'%s' ser inte ut som en v2-bundle-fil" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "okänt huvud: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "kunde inte öppna \"%s\"" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" msgstr "Arkivet saknar dessa nödvändiga incheckningar:" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "misslyckades skapa revisionstraversering" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "Paketet (bundlen) denna referens:" msgstr[1] "Paketet (bundlen) dessa %d referenser:" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "Paketet (bundlen) beskriver en komplett historik." -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "Paketet (bundlen) kräver denna referens:" msgstr[1] "Paketet (bundlen) kräver dessa %d referenser:" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "rev-list dog" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "okänt argument: %s" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "referensen \"%s\" exkluderas av argumenten till rev-list" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "Vägrar skapa ett tomt paket (bundle)." @@ -349,16 +354,16 @@ msgstr "%s %s är inte en incheckning!" msgid "memory exhausted" msgstr "minnet slut" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "Kunde inte köra \"git rev-list\"" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "kunde inte skriva till rev-list: %s" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "kunde inte stänga rev-list:s standard in: %s" @@ -430,22 +435,27 @@ msgid_plural "%lu years ago" msgstr[0] "%lu Ã¥r sedan" msgstr[1] "%lu Ã¥r sedan" -#: diff.c:112 +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "kunde inte läsa orderfilen \"%s\"" + +#: diff.c:113 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr " Misslyckades tolka dirstat-avskärningsprocentandel \"%s\"\n" -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " Okänd dirstat-parameter \"%s\"\n" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "Okänt värde för konfigurationsvariabeln \"diff.submodule\": \"%s\"" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -454,7 +464,7 @@ msgstr "" "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n" "%s" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -463,7 +473,7 @@ msgstr "" "Misslyckades tolka argument till flaggan --dirstat/-X;\n" "%s" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\"" @@ -490,17 +500,17 @@ msgstr "kunde inte skapa temporära filen \"%s\": %s" msgid "failed writing detached signature to '%s': %s" msgstr "misslyckades skriva fristÃ¥ende signatur till \"%s\": %s" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "\"%s\" kunde inte läsa %s" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "\"%s\": %s" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "\"%s\": kort läsning %s" @@ -573,8 +583,8 @@ msgstr "%s: %s - %s" msgid "failed to read the cache" msgstr "misslyckads läsa cachen" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 msgid "unable to write new index file" msgstr "kunde inte skriva ny indexfil" @@ -623,7 +633,7 @@ msgstr "kan inte läsa objektet %s: \"%s\"" msgid "blob expected for %s '%s'" msgstr "blob förväntades för %s \"%s\"" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "misslyckades öppna \"%s\"" @@ -673,7 +683,7 @@ msgstr "" msgid "rename" msgstr "namnbyte" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "namnbytt" @@ -735,7 +745,7 @@ msgstr "objektet %s är inte en blob" msgid "modify" msgstr "ändra" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "ändrad" @@ -757,7 +767,7 @@ msgstr "Hoppade över %s (sammanslagen samma som befintlig)" msgid "Auto-merging %s" msgstr "SlÃ¥r ihop %s automatiskt" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "undermodul" @@ -828,7 +838,7 @@ msgstr "sammanslagningen returnerade ingen incheckning" msgid "Could not parse object '%s'" msgstr "Kunde inte tolka objektet \"%s\"" -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "Kunde inte skriva indexet." @@ -853,58 +863,156 @@ msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)" msgid "Bad %s value: '%s'" msgstr "Felaktigt värde pÃ¥ %s: \"%s\"" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "kunde inte tolka objektet: %s" -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "..." -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "användning: %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr " eller: %s" -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "-TAL" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" +"de globala sökvägsinställningarna \"glob\" och \"noglob\" är inkompatibla" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" +"den globala sökvägsinställningen \"literal\" är inkompatibel med alla andra " +"globala sökvägsinställningar" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "ogiltig parameter för sökvägsuttrycket för \"prefix\"" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "felaktigt sökvägsuttryck \"%.*s\" i \"%s\"" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "\")\" saknas i slutet av sökvägsuttrycket för \"%s\"" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "Tecknet \"%c\" i sökvägsuttrycket i \"%s\" har inte implementerats" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s: \"literal\" och \"glob\" är inkompatibla" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "%s: \"%s\" är utanför arkivet" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\"" + +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "%s: sökvägsuttrycket hanteras inte av det här kommandot: %s" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "sökvägsangivelsen \"%s\" är pÃ¥ andra sidan av en symbolisk länk" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +"Ingenting att exkludera frÃ¥n med :(exkludera)-mönster.\n" +"Glömde du kanske att antingen lägga till \":/\" eller \".\"?" + +#: remote.c:753 #, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "Sökvägen \"%s\" är i undermodulen \"%.*s\"" +msgid "Cannot fetch both %s and %s to %s" +msgstr "Kan inte hämta bÃ¥de %s och %s till %s" -#: pathspec.c:99 +#: remote.c:757 #, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "\"%s\" är pÃ¥ andra sidan av en symbolisk länk" +msgid "%s usually tracks %s, not %s" +msgstr "%s spÃ¥rar vanligtvis %s, inte %s" -#: remote.c:1788 +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "%s spÃ¥rar bÃ¥de %s och %s" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "Internt fel" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "Din gren är baserad pÃ¥ \"%s\", men den har försvunnit uppströms.\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (använd \"git branch --unset-upstream\" för att rätta)\n" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "Din gren är à jour med \"%s\".\n" + +#: remote.c:1882 #, 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] "Din gren ligger före \"%s\" med %d incheckning.\n" msgstr[1] "Din gren ligger före \"%s\" med %d incheckningar.\n" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (använd \"git push\" för att publicera dina lokala incheckningar)\n" -#: remote.c:1797 +#: remote.c:1891 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -914,11 +1022,11 @@ msgstr[0] "" msgstr[1] "" "Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n" -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr " (använd \"git pull\" för att uppdatera din lokala gren)\n" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -933,7 +1041,7 @@ msgstr[1] "" "Din gren och \"%s\" har divergerat,\n" "och har %d respektive %d olika incheckningar.\n" -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr " (använd \"git pull\" för att slÃ¥ ihop fjärrgrenen med din egen)\n" @@ -946,14 +1054,14 @@ msgstr "misslyckades öppna /dev/null" msgid "dup2(%d,%d) failed" msgstr "dup2(%d,%d) misslyckades" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "Kunde inte öppna \"%s\" för skrivning" -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "Kunde inte skriva till \"%s\"" @@ -976,7 +1084,7 @@ msgstr "" "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n" "och checka in resultatet med \"git commit\"" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "Kunde inte skriva till %s" @@ -999,201 +1107,201 @@ 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:324 +#: sequencer.c:325 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Kunde inte skriva ny indexfil" -#: sequencer.c:355 +#: sequencer.c:356 msgid "Could not resolve HEAD commit\n" msgstr "Kunde inte bestämma HEAD:s incheckning\n" -#: sequencer.c:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "Kan inte uppdatera cacheträd\n" -#: sequencer.c:422 +#: sequencer.c:423 #, c-format msgid "Could not parse commit %s\n" msgstr "Kunde inte tolka incheckningen %s\n" -#: sequencer.c:427 +#: sequencer.c:428 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Kunde inte tolka föräldraincheckningen %s\n" -#: sequencer.c:493 +#: sequencer.c:494 msgid "Your index file is unmerged." msgstr "Din indexfil har inte slagits ihop." -#: sequencer.c:512 +#: sequencer.c:513 #, 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:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" msgstr "Incheckning %s har inte förälder %d" -#: sequencer.c:524 +#: sequencer.c:525 #, 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:537 +#: sequencer.c:538 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kan inte tolka föräldraincheckningen %s" -#: sequencer.c:541 +#: sequencer.c:542 #, c-format msgid "Cannot get commit message for %s" msgstr "Kan inte hämta incheckningsmeddelande för %s" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "kunde inte Ã¥ngra %s... %s" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "kunde inte tillämpa %s... %s" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" msgstr "den angivna uppsättningen incheckningar är tom" -#: sequencer.c:672 +#: sequencer.c:673 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: misslyckades läsa indexet" -#: sequencer.c:677 +#: sequencer.c:678 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: misslyckades uppdatera indexet" -#: sequencer.c:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "kan inte %s under en %s" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "Kan inte tolka rad %d." -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." msgstr "Inga incheckningar lästes." -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "Kunde inte öppna %s" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "kunde inte läsa %s." -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Oanvändbart manus: %s" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "Felaktig nyckel: %s" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "Felaktigt värde för %s: %s" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "Trasigt manus: %s" -#: sequencer.c:850 +#: sequencer.c:851 msgid "a cherry-pick or revert is already in progress" msgstr "en \"cherry-pick\" eller \"revert\" pÃ¥gÃ¥r redan" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:855 +#: sequencer.c:856 #, c-format msgid "Could not create sequencer directory %s" msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\"" -#: sequencer.c:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "Fel vid ombrytning av %s." -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "ingen \"cherry-pick\" eller \"revert\" pÃ¥gÃ¥r" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "kan inte bestämma HEAD" -#: sequencer.c:894 +#: sequencer.c:895 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:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "kan inte öppna %s: %s" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "kan inte läsa %s: %s" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" msgstr "oväntat filslut" -#: sequencer.c:926 +#: sequencer.c:927 #, 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:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." msgstr "Kunde inte formatera %s." -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s: kan inte göra \"cherry-pick\" pÃ¥ typen \"%s\"" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "%s: felaktig revision" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" msgstr "Kan inte Ã¥ngra som första incheckning" -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud" -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1215,256 +1323,342 @@ msgstr "" "Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n" "genom att köra \"git config advice.objectNameWarning false\"" -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "HEAD pekar inte pÃ¥ en gren" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "Okänd gren: \"%s\"" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" msgstr "Ingen standarduppström angiven för grenen \"%s\"" -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format 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:408 +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" +"Kan inte ändra .gitmodules-fil som inte slagits ihop, lös " +"sammanslagningskonflikter först" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "Hittade inte nÃ¥gon sektion i .gitmodules där sökväg=%s" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "Kunde inte uppdatera .gitmodules-posten %s" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "Kunde inte ta bort .gitmodules-posten för %s" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "kunde inte hitta .gitmodules i indexet" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "misslyckades läsa uppdaterad .gitmodules" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "kan inte ta status pÃ¥ uppdaterad .gitmodules" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "kan inte ta bort .gitmodules frÃ¥n indexet" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "misslyckades lägga till uppdaterad .gitmodules" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "misslyckades köa uppdaterad .gitmodules" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "Kunde inte skapa gitlänk %s" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "Kunde inte sätta core.worktree i %s" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "ogiltig %XX-teckensekvens" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "värd saknas och schemat är inte \"file:\"" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "en \"file:\"-URL kan inte innehÃ¥lla portnummer" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "ogiltiga tecken i värdnamnet" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "felaktigt portnummer" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "felaktit \"..\"-sökvägssegment" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "kan inte komma Ã¥t \"%s\": %s" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "kan inte komma Ã¥t \"%s\"" -#: wrapper.c:440 +#: wrapper.c:454 #, 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:441 +#: wrapper.c:455 msgid "no such user" msgstr "okänd användare" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "Ej sammanslagna sökvägar:" -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr " (använd \"git reset %s <fil>...\" för att ta bort frÃ¥n kö)" -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr " (använd \"git rm --cached <fil>...\" för att ta bort frÃ¥n kö)" -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr " (använd \"git add <fil>...\" för att ange lösning)" -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr " (använd \"git add/rm <fil>...\" som lämpligt för att ange lösning)" -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr " (använd \"git rm <fil>...\" för att ange lösning)" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "Ändringar att checka in:" -#: wt-status.c:207 +#: wt-status.c:216 msgid "Changes not staged for commit:" msgstr "Ändringar ej i incheckningskön:" -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr "" " (använd \"git add <fil>...\" för att uppdatera vad som skall checkas in)" -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" " (använd \"git add/rm <fil>...\" för att uppdatera vad som skall checkas in)" -#: wt-status.c:214 +#: wt-status.c:223 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" " (använd \"git checkout -- <fil>...\" för att förkasta ändringar i " "arbetskatalogen)" -#: wt-status.c:216 +#: wt-status.c:225 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)" -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" " (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "programfel" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "borttaget av bägge:" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "tillagt av oss:" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "borttaget av dem:" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "tillagt av dem:" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "borttaget av oss:" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "tillagt av bägge:" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "ändrat av bägge:" -#: wt-status.c:286 +#: wt-status.c:275 +msgid "new file" +msgstr "ny fil" + +#: wt-status.c:277 +msgid "copied" +msgstr "kopierad" + +#: wt-status.c:279 +msgid "deleted" +msgstr "borttagen" + +#: wt-status.c:285 +msgid "typechange" +msgstr "typbyte" + +#: wt-status.c:287 +msgid "unknown" +msgstr "okänd" + +#: wt-status.c:289 +msgid "unmerged" +msgstr "osammanslagen" + +#: wt-status.c:336 msgid "new commits, " msgstr "nya incheckningar, " -#: wt-status.c:288 +#: wt-status.c:338 msgid "modified content, " msgstr "ändrat innehÃ¥ll, " -#: wt-status.c:290 +#: wt-status.c:340 msgid "untracked content, " msgstr "ospÃ¥rat innehÃ¥ll, " -#: wt-status.c:307 -#, c-format -msgid "new file: %s" -msgstr "ny fil: %s" - -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" -msgstr "kopierad: %s -> %s" - -#: wt-status.c:313 -#, c-format -msgid "deleted: %s" -msgstr "borttagen: %s" - -#: wt-status.c:316 -#, c-format -msgid "modified: %s" -msgstr "ändrad: %s" - -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" -msgstr "namnbyte: %s -> %s" - -#: wt-status.c:322 +#: wt-status.c:357 #, c-format -msgid "typechange: %s" -msgstr "typbyte: %s" +msgid "bug: unhandled diff status %c" +msgstr "programfel: diff-status %c ej hanterad" -#: wt-status.c:325 -#, c-format -msgid "unknown: %s" -msgstr "okänd: %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "Undermoduler ändrade men inte uppdaterade:" -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" -msgstr "osammansl.: %s" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "Undermodulers ändringar att checka in:" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "programfel: diff-status %c ej hanterad" +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"Rör inte raden ovan.\n" +"Allt nedan kommer tas bort." -#: wt-status.c:803 +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "Du har ej sammanslagna sökvägar." -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" msgstr " (rätta konflikter och kör \"git commit\")" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning." -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr " (använd \"git commit\" för att slutföra sammanslagningen)" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." msgstr "Du är i mitten av en körning av \"git am\"." -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "Aktuell patch är tom." -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr " (rätta konflikter och kör sedan \"git am --continue\")" -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (använd \"git am --skip\" för att hoppa över patchen)" -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr " (använd \"git am --abort\" för att Ã¥terställa ursprungsgrenen)" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." msgstr "Du hÃ¥ller pÃ¥ att ombasera grenen \"%s\" ovanpÃ¥ \"%s\"." -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 msgid "You are currently rebasing." msgstr "Du hÃ¥ller pÃ¥ med en ombasering." -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr " (rätta konflikter och kör sedan \"git rebase --continue\")" -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (använd \"git rebase --skip\" för att hoppa över patchen)" -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr " (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)" -#: wt-status.c:918 +#: wt-status.c:1014 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (alla konflikter rättade: kör \"git rebase --continue\")" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." @@ -1472,117 +1666,118 @@ msgstr "" "Du hÃ¥ller pÃ¥ att dela upp en incheckning medan du ombaserar grenen \"%s\" " "ovanpÃ¥ \"%s\"." -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." msgstr "Du hÃ¥ller pÃ¥ att dela upp en incheckning i en ombasering." -#: wt-status.c:930 +#: wt-status.c:1026 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr " (SÃ¥ fort din arbetskatalog är ren, kör \"git rebase --continue\")" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" "Du hÃ¥ller pÃ¥ att redigera en incheckning medan du ombaserar grenen \"%s\" " "ovanpÃ¥ \"%s\"." -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." msgstr "Du hÃ¥ller pÃ¥ att redigera en incheckning under en ombasering." -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr "" " (använd \"git commit --amend\" för att lägga till pÃ¥ aktuell incheckning)" -#: wt-status.c:944 +#: wt-status.c:1040 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr " (använd \"git rebase --continue\" när du är nöjd med dina ändringar)" -#: wt-status.c:954 -msgid "You are currently cherry-picking." -msgstr "Du hÃ¥ller pÃ¥ med en \"cherry-pick\"." +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "Du hÃ¥ller pÃ¥ med en \"cherry-pick\" av incheckningen %s." -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr " (rätta konflikter och kör sedan \"git cherry-pick --continue\")" -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr " (alla konflikter rättade: kör \"git cherry-pick --continue\")" -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr "" " (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-" "operationen)" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." msgstr "Du hÃ¥ller pÃ¥ med att Ã¥ngra incheckningen %s." -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr " (rätta konflikter och kör sedan \"git revert --continue\")" -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (alla konflikter rättade: kör \"git revert --continue\")" -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr " (använd \"git revert --abort\" för att avbryta Ã¥ngrandet)" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "Du hÃ¥ller pÃ¥ med en \"bisect\", startad frÃ¥n grenen \"%s\"." -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." msgstr "Du hÃ¥ller pÃ¥ med en \"bisect\"." -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr "" " (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "PÃ¥ grenen " -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " msgstr "ombasering pÃ¥gÃ¥r; ovanpÃ¥" -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " msgstr "HEAD frÃ¥nkopplad vid " -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " msgstr "HEAD frÃ¥nkopplad frÃ¥n " -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "Inte pÃ¥ nÃ¥gon gren för närvarande." -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" msgstr "Första incheckning" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "OspÃ¥rade filer" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "Ignorerade filer" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1594,32 +1789,32 @@ msgstr "" "lägga till nya filer själv (se \"git help status\")." # %s är nästa sträng eller tom. -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" msgstr "OspÃ¥rade filer visas ej%s" -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr " (använd flaggan -u för att visa ospÃ¥rade filer)" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "Inga ändringar" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format 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:1251 +#: wt-status.c:1350 #, c-format msgid "no changes added to commit\n" msgstr "inga ändringar att checka in\n" -#: wt-status.c:1254 +#: wt-status.c:1353 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " @@ -1628,52 +1823,56 @@ msgstr "" "inget köat för incheckning, men ospÃ¥rade filer finns (spÃ¥ra med \"git add" "\")\n" -#: wt-status.c:1257 +#: wt-status.c:1356 #, 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:1260 +#: wt-status.c:1359 #, c-format 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:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" msgstr "inget att checka in\n" -#: wt-status.c:1266 +#: wt-status.c:1365 #, 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:1270 +#: wt-status.c:1369 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "inget att checka in, arbetskatalogen ren\n" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "HEAD (ingen gren)" -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " msgstr "Första incheckning pÃ¥ " -#: wt-status.c:1399 +#: wt-status.c:1514 +msgid "gone" +msgstr "försvunnen" + +#: wt-status.c:1516 msgid "behind " msgstr "efter " -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "före " -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr ", efter " -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" msgstr "misslyckades ta bort länken \"%s\"" @@ -1759,7 +1958,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "diff-status %c förväntades inte" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "misslyckades uppdatera filer" @@ -1768,140 +1967,135 @@ msgstr "misslyckades uppdatera filer" msgid "remove '%s'\n" msgstr "ta bort \"%s\"\n" -#: builtin/add.c:253 +#: builtin/add.c:237 msgid "Unstaged changes after refreshing the index:" msgstr "OspÃ¥rade ändringar efter att ha uppdaterat indexet:" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "sökvägsangivelsen \"%s\" motsvarade inte nÃ¥gra filer" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "Kunde inte läsa indexet" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "Kunde inte öppna \"%s\" för skrivning" -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "Kunde inte skriva patch" -#: builtin/add.c:359 +#: builtin/add.c:319 #, c-format msgid "Could not stat '%s'" msgstr "Kunde inte ta status pÃ¥ \"%s\"" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." msgstr "Tom patch. Avbryter." -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" msgstr "Kunde inte tillämpa \"%s\"" -#: builtin/add.c:377 +#: builtin/add.c:337 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:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "testkörning" -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "var pratsam" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "plocka interaktivt" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" msgstr "välj stycken interaktivt" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "redigera aktuell diff och applicera" -#: builtin/add.c:400 +#: builtin/add.c:360 msgid "allow adding otherwise ignored files" msgstr "tillÃ¥t lägga till annars ignorerade filer" -#: builtin/add.c:401 +#: builtin/add.c:361 msgid "update tracked files" msgstr "uppdatera spÃ¥rade filer" -#: builtin/add.c:402 +#: builtin/add.c:362 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:403 +#: builtin/add.c:363 msgid "add changes from all tracked and untracked files" msgstr "lägg till ändringar frÃ¥n alla spÃ¥rade och ospÃ¥rade filer" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)" -#: builtin/add.c:408 +#: builtin/add.c:368 msgid "don't add, only refresh the index" msgstr "lägg inte till, uppdatera endast indexet" -#: builtin/add.c:409 +#: builtin/add.c:369 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:410 +#: builtin/add.c:370 msgid "check if - even missing - files are ignored in dry run" msgstr "se om - även saknade - filer ignoreras i testkörning" -#: builtin/add.c:432 +#: builtin/add.c:392 #, 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:433 +#: builtin/add.c:393 msgid "no files added" msgstr "inga filer har lagts till" -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "misslyckades lägga till filer" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "-A och -u är ömsesidigt inkompatibla" -#: builtin/add.c:496 +#: builtin/add.c:456 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:526 +#: builtin/add.c:486 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "Inget angivet, inget tillagt.\n" -#: builtin/add.c:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Kanske menade du att skriva \"git add .\"?\n" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "indexfilen trasig" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 msgid "Unable to write new index file" msgstr "Kunde inte skriva ny indexfil" @@ -2154,7 +2348,7 @@ msgstr "%s: patchen kan inte tillämpas" msgid "Checking patch %s..." msgstr "Kontrollerar patchen %s..." -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "make_cache_entry misslyckades för sökvägen \"%s\"" @@ -2234,8 +2428,8 @@ msgstr "indata känns inte igen" msgid "unable to read index file" msgstr "kan inte läsa indexfilen" -#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "sökväg" @@ -2295,7 +2489,7 @@ msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas" msgid "build a temporary index based on embedded index information" msgstr "bygg ett temporärt index baserat pÃ¥ inbyggd indexinformation" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "sökvägar avdelas med NUL-tecken" @@ -2425,103 +2619,103 @@ msgstr "utför 'git bisect next'" 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:26 +#: builtin/blame.c:27 msgid "git blame [options] [rev-opts] [rev] [--] file" msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 msgid "Show blame entries as we find them, incrementally" msgstr "Visa klandringsposter när vi hittar dem, interaktivt" -#: builtin/blame.c:2277 +#: builtin/blame.c:2250 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)" -#: builtin/blame.c:2278 +#: builtin/blame.c:2251 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Behandla inte rotincheckningar som gränser (Standard: av)" -#: builtin/blame.c:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "Visa statistik över arbetskostnad" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 msgid "Show output score for blame entries" msgstr "Visa utdatapoäng för klandringsposter" -#: builtin/blame.c:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "Visa originalfilnamn (Standard: auto)" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "Visa ursprungligt radnummer (Standard: av)" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 msgid "Show in a format designed for machine consumption" msgstr "Visa i ett format avsett för maskinkonsumtion" -#: builtin/blame.c:2284 +#: builtin/blame.c:2257 msgid "Show porcelain format with per-line commit information" msgstr "Visa porslinsformat med per-rad-incheckningsinformation" -#: builtin/blame.c:2285 +#: builtin/blame.c:2258 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:2286 +#: builtin/blame.c:2259 msgid "Show raw timestamp (Default: off)" msgstr "Visa rÃ¥ tidsstämpel (Standard: av)" -#: builtin/blame.c:2287 +#: builtin/blame.c:2260 msgid "Show long commit SHA1 (Default: off)" msgstr "Visa lÃ¥ng inchecknings-SHA1 (Standard: av)" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 msgid "Suppress author name and timestamp (Default: off)" msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)" -#: builtin/blame.c:2289 +#: builtin/blame.c:2262 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:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "Ignorera ändringar i blanksteg" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 msgid "Spend extra cycles to find better match" msgstr "Slösa extra cykler med att hitta bättre träff" -#: builtin/blame.c:2292 +#: builtin/blame.c:2265 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:2293 +#: builtin/blame.c:2266 msgid "Use <file>'s contents as the final image" msgstr "Använd <fil>s innehÃ¥ll som slutgiltig bild" -#: builtin/blame.c:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "poäng" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 msgid "Find line copies within and across files" msgstr "Hitta kopierade rader inuti och mellan filer" -#: builtin/blame.c:2295 +#: builtin/blame.c:2268 msgid "Find line movements within and across files" msgstr "Hitta flyttade rader inuti och mellan filer" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "Behandla endast radintervallet n,m, med början pÃ¥ 1" @@ -2625,280 +2819,290 @@ msgstr "Tog bort grenen %s (var %s).\n" msgid "branch '%s' does not point at a commit" msgstr "grenen \"%s\" pekar inte pÃ¥ en incheckning" -#: builtin/branch.c:453 +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: försvunnen]" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "[%s: bakom %d] " -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "[bakom %d] " -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: före %d] " -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "[före %d] " -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: före %d, bakom %d] " -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "[före %d, bakom %d] " -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" msgstr " **** ogiltig ref ****" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "(ingen gren, ombaserar %s)" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(ingen gren, \"bisect\" startad pÃ¥ %s)" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "(frÃ¥nkopplad frÃ¥n %s)" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "(ingen gren)" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" msgstr "objektet \"%s\" pekar pÃ¥ en incheckning" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "vissa referenser kunde inte läsas" -#: builtin/branch.c:682 +#: builtin/branch.c:694 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:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" msgstr "Felaktigt namn pÃ¥ gren: \"%s\"" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" msgstr "Misslyckades byta namn pÃ¥ gren" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "Bytte bort namn pÃ¥ en felaktigt namngiven gren \"%s\"" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, 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:722 +#: builtin/branch.c:734 msgid "Branch is renamed, but update of config-file failed" msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen" -#: builtin/branch.c:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "felformat objektnamn %s" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, c-format msgid "could not write branch description template: %s" msgstr "kunde inte skriva grenbeskrivningsmall: %s" -#: builtin/branch.c:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "Allmänna flaggor" -#: builtin/branch.c:793 +#: builtin/branch.c:805 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:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "undertryck informationsmeddelanden" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" msgstr "ställ in spÃ¥rningsläge (se git-pull(1))" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" msgstr "ändra uppströmsinformation" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "använd färgad utdata" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "arbeta pÃ¥ fjärrspÃ¥rande grenar" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "incheckning" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 msgid "print only branches that contain the commit" msgstr "visa endast grenar som innehÃ¥ller incheckningen" -#: builtin/branch.c:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "Specifika git-branch-Ã¥tgärder:" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "visa bÃ¥de fjärrspÃ¥rande och lokala grenar" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "ta bort helt sammanslagen gren" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "ta bort gren (även om inte helt sammanslagen)" -#: builtin/branch.c:823 +#: builtin/branch.c:835 msgid "move/rename a branch and its reflog" msgstr "flytta/ta bort en gren och dess reflogg" -#: builtin/branch.c:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" msgstr "flytta/ta bort en gren, även om mÃ¥let finns" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "lista namn pÃ¥ grenar" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "skapa grenens reflogg" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "redigera beskrivning för grenen" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" msgstr "tvinga skapande (när den redan finns)" -#: builtin/branch.c:832 +#: builtin/branch.c:844 msgid "print only not merged branches" msgstr "visa endast ej sammanslagna grenar" -#: builtin/branch.c:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "visa endast sammanslagna grenar" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "visa grenar i spalter" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "Misslyckades slÃ¥ upp HEAD som giltig referens" -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "HEAD hittades inte under refs/heads!" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" msgstr "--column och --verbose är inkompatibla" -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "grennamn krävs" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "Kan inte beskriva frÃ¥nkopplad HEAD" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "kan inte redigera beskrivning för mer än en gren" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "Inga incheckningar pÃ¥ grenen \"%s\" ännu" -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "Ingen gren vid namnet \"%s\"." -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "för mÃ¥nga grenar för namnbyte" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" msgstr "för mÃ¥nga grenar för att byta uppström" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." msgstr "" "kunde inte sätta uppström för HEAD till %s när det inte pekar mot nÃ¥gon gren." -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "okänd gren \"%s\"" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" msgstr "grenen \"%s\" finns inte" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" msgstr "för mÃ¥nga grenar för att ta bort uppström" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" "kunde inte ta bort uppström för HEAD när det inte pekar mot nÃ¥gon gren." -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" msgstr "Grenen \"%s\" har ingen uppströmsinformation" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" msgstr "kan inte skapa \"HEAD\" manuellt" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 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:996 +#: builtin/branch.c:1008 #, c-format msgid "" "The --set-upstream flag is deprecated and will be removed. Consider using --" @@ -2907,7 +3111,7 @@ msgstr "" "Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track " "eller --set-upstream-to\n" -#: builtin/branch.c:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -2918,12 +3122,12 @@ msgstr "" "Om du vill göra sÃ¥ att \"%s\" spÃ¥rar \"%s\" gör du sÃ¥ här:\n" "\n" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr " git branch --set-upstream-to %s\n" @@ -2941,43 +3145,43 @@ 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/cat-file.c:285 +#: builtin/cat-file.c:328 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:286 +#: builtin/cat-file.c:329 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" msgstr "git cat-file (--batch|--batch-check) < <objektlista>" -#: builtin/cat-file.c:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "<typ> kan vara en av: blob, tree, commit, tag" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "visa objekttyp" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "visa objektstorlek" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 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:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "visa objektets innehÃ¥ll snyggt" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 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:332 +#: builtin/cat-file.c:375 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:335 +#: builtin/cat-file.c:378 msgid "show info about objects fed from the standard input" msgstr "visa information för objekt som listas pÃ¥ standard in" @@ -3002,10 +3206,10 @@ msgid "read file names from stdin" msgstr "läs filnamn frÃ¥n standard in" #: builtin/check-attr.c:23 builtin/check-ignore.c:24 -msgid "input paths are terminated by a null character" -msgstr "sökvägar avdelas med null-tecken" +msgid "terminate input and output records by a NUL character" +msgstr "avsluta in- och utdataposter med NUL-tecken" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "undertryck förloppsrapportering" @@ -3013,27 +3217,31 @@ msgstr "undertryck förloppsrapportering" msgid "show non-matching input paths" msgstr "visa indatasökvägar som inte träffas" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "ignorera index vid kontroll" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "kan inte ange sökvägsnamn med --stdin" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "-z kan endast användas tillsammans med --stdin" -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" msgstr "ingen sökväg angavs" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "--quiet kan endast användas med ett enkelt sökvägsnamn" -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "kan inte använda bÃ¥de --quiet och --verbose" -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "--non-matching är endast giltig med --verbose" @@ -3106,106 +3314,106 @@ msgstr "git checkout [flaggor] <gren>" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "git checkout [flaggor] [<gren>] -- <fil>..." -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, c-format msgid "path '%s' does not have our version" msgstr "sökvägen \"%s\" har inte vÃ¥r version" -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have their version" msgstr "sökvägen \"%s\" har inte deras version" -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, 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:179 +#: builtin/checkout.c:176 #, 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:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "sökväg \"%s\": kan inte slÃ¥ ihop" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, c-format msgid "Unable to add merge result for '%s'" msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\"" -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, 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:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" msgstr "\"%s\" kan inte användas med %s" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, 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:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "indexfilen är trasig" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "sökvägen \"%s\" har inte slagits ihop" -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" msgstr "du mÃ¥ste lösa ditt befintliga index först" -#: builtin/checkout.c:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Kan inte skapa referenslog för \"%s\"\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "HEAD är nu pÃ¥" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "Ã…terställ gren \"%s\"\n" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "Redan pÃ¥ \"%s\"\n" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Växlade till och nollställde grenen \"%s\"\n" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Växlade till en ny gren \"%s\"\n" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "Växlade till grenen \"%s\"\n" -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr " ... och %d till.\n" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3228,7 +3436,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3243,136 +3451,140 @@ msgstr "" " git branch nytt_grennamn %s\n" "\n" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "internt fel vid genomgÃ¥ng av revisioner (revision walk)" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" msgstr "Tidigare position för HEAD var" -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 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:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "endast en referens förväntades, %d gavs." + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" msgstr "felaktig referens: %s" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" msgstr "referensen är inte ett träd: %s" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 msgid "paths cannot be used with switching branches" msgstr "sökvägar kan inte användas vid byte av gren" -#: builtin/checkout.c:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "\"%s\" kan inte användas vid byte av gren" -#: builtin/checkout.c:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "\"%s\" kan inte användas med \"%s\"" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "Kan inte växla gren till icke-incheckningen \"%s\"" -#: builtin/checkout.c:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "gren" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "skapa och checka ut en ny gren" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" msgstr "skapa/nollställ och checka ut en gren" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "skapa reflogg för ny gren" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 msgid "detach the HEAD at named commit" msgstr "koppla frÃ¥n HEAD vid namngiven incheckning" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" msgstr "sätt uppströmsinformation för ny gren" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "ny gren" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" msgstr "ny gren utan förälder" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 msgid "checkout our version for unmerged files" msgstr "checka ut vÃ¥r version för ej sammanslagna filer" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1102 msgid "checkout their version for unmerged files" msgstr "checka ut deras version för ej sammanslagna filer" -#: builtin/checkout.c:1068 +#: builtin/checkout.c:1104 msgid "force checkout (throw away local modifications)" msgstr "tvinga utcheckning (kasta bort lokala ändringar)" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1105 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:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "uppdatera ignorerade filer (standard)" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "stil" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" msgstr "konfliktstil (merge eller diff3)" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" msgstr "begränsa inte sökvägar till endast glesa poster" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 msgid "second guess 'git checkout no-such-branch'" msgstr "förutspÃ¥ \"git checkout gren-saknas\"" -#: builtin/checkout.c:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" msgstr "-b, -B och --orphan är ömsesidigt uteslutande" -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "--track behöver ett namn pÃ¥ en gren" -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "Grennamn saknas; försök med -b" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "felaktig sökvägsangivelse" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3381,12 +3593,12 @@ msgstr "" "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:1172 +#: builtin/checkout.c:1209 #, 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:1176 +#: builtin/checkout.c:1213 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -3394,39 +3606,39 @@ msgstr "" "git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n" "du checkar ut frÃ¥n indexet." -#: builtin/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <mönster>] [-x | -X] [--] " "<sökvägar>..." -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "Tar bort %s\n" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "Skulle ta bort %s\n" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "Hoppar över arkivet %s\n" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "Skulle hoppa över arkivet %s\n" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "misslyckades ta bort %s" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3438,7 +3650,7 @@ msgstr "" "foo - markera post baserad pÃ¥ unikt prefix\n" " - (tomt) markera ingenting" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3458,35 +3670,35 @@ msgstr "" "* - välj alla poster\n" " - (tomt) avsluta markering" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "VadÃ¥ (%s)?" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " msgstr "Ange ignoreringsmönster>>" -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "VARNING: Hittar inte poster som motsvarar: %s" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "Välj poster att ta bort" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " msgstr "ta bort %s?" -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "Hej dÃ¥." -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3504,21 +3716,21 @@ msgstr "" "help - denna skärm\n" "? - hjälp för kommandoval" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "*** Kommandon ***" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "Vad nu" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "Skulle ta bort följande post:" msgstr[1] "Skulle ta bort följande poster:" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "Inga fler filer att städa, avslutar." @@ -3538,8 +3750,8 @@ msgstr "städa interaktivt" msgid "remove whole directories" msgstr "ta bort hela kataloger" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "mönster" @@ -3579,8 +3791,8 @@ msgstr "" msgid "git clone [options] [--] <repo> [<dir>]" msgstr "git clone [flaggor] [--] <arkiv> [<kat>]" -#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" msgstr "tvinga förloppsrapportering" @@ -3592,123 +3804,133 @@ msgstr "skapa inte nÃ¥gon utcheckning" msgid "create a bare repository" msgstr "skapa ett naket (\"bare\") arkiv" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" msgstr "skapa ett spegelarkiv (implicerar \"bare\")" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "för att klona frÃ¥n ett lokalt arkiv" -#: builtin/clone.c:76 +#: builtin/clone.c:75 msgid "don't use local hardlinks, always copy" msgstr "skapa inte lokala hÃ¥rda länkar, kopiera alltid" -#: builtin/clone.c:78 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "skapa som ett delat arkiv" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 msgid "initialize submodules in the clone" msgstr "initiera undermoduler i klonen" -#: builtin/clone.c:83 builtin/init-db.c:485 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" msgstr "mallkatalog" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 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 +#: builtin/clone.c:85 msgid "reference repository" msgstr "referensarkiv" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "namn" -#: builtin/clone.c:88 +#: builtin/clone.c:87 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 +#: builtin/clone.c:89 msgid "checkout <branch> instead of the remote's HEAD" msgstr "checka ut <gren> istället för fjärrens HEAD" -#: builtin/clone.c:92 +#: builtin/clone.c:91 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:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" msgstr "djup" -#: builtin/clone.c:94 +#: builtin/clone.c:93 msgid "create a shallow clone of that depth" msgstr "skapa en grund klon pÃ¥ detta djup" -#: builtin/clone.c:96 +#: builtin/clone.c:95 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 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr "gitkat" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 builtin/init-db.c:495 msgid "separate git dir from working tree" msgstr "separera gitkatalogen frÃ¥n arbetskatalogen" -#: builtin/clone.c:99 +#: builtin/clone.c:98 msgid "key=value" msgstr "nyckel=värde" -#: builtin/clone.c:100 +#: builtin/clone.c:99 msgid "set config inside the new repository" msgstr "ställ in konfiguration i det nya arkivet" -#: builtin/clone.c:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "referensarkivet \"%s\" är inte ett lokalt arkiv." -#: builtin/clone.c:316 +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "referensarkivet \"%s\" är grunt" + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "referensarkivet \"%s\" är ympat" + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "misslyckades skapa katalogen \"%s\"" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "misslyckades ta status pÃ¥ \"%s\"" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "%s finns och är ingen katalog" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" msgstr "misslyckades ta status pÃ¥ %s\n" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "misslyckades skapa länken \"%s\"" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" msgstr "misslyckades kopiera filen till \"%s\"" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "klart.\n" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -3718,105 +3940,109 @@ msgstr "" "Du kan inspektera det som checkades ut med \"git status\"\n" "och försöka checka ut igen med \"git checkout -f HEAD\"\n" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "Kunde inte hitta fjärrgrenen %s för att klona." -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " msgstr "Kontrollerar anslutning..." -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "fjärren sände inte alla nödvändiga objekt" -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "klart\n" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 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:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "kunde inte checka ut arbetskatalogen" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "För mÃ¥nga argument." -#: builtin/clone.c:764 +#: builtin/clone.c:769 msgid "You must specify a repository to clone." msgstr "Du mÃ¥ste ange ett arkiv att klona." -#: builtin/clone.c:775 +#: builtin/clone.c:780 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "flaggorna --bare och --origin %s är inkompatibla." -#: builtin/clone.c:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "flaggorna --bare och --separate-git-dir är inkompatibla." -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "arkivet \"%s\" finns inte" -#: builtin/clone.c:796 +#: builtin/clone.c:802 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth ignoreras i lokala kloningar; använd file:// istället" -#: builtin/clone.c:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "källarkivet är grunt, ignorerar --local" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "--local ignoreras" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "djupet %s är inte ett positivt tal" + +#: builtin/clone.c:824 #, 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:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "arbetsträdet \"%s\" finns redan." -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, c-format msgid "could not create leading directories of '%s'" msgstr "kunde inte skapa inledande kataloger för \"%s\"" -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, c-format msgid "could not create work tree dir '%s'." msgstr "kunde inte skapa arbetskatalogen \"%s\"" -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Klonar till ett naket arkiv \"%s\"...\n" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "Klonar till \"%s\"...\n" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, c-format msgid "Don't know how to clone %s" msgstr "Vet inte hur man klonar %s" -#: builtin/clone.c:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s" -#: builtin/clone.c:949 +#: builtin/clone.c:968 msgid "You appear to have cloned an empty repository." msgstr "Du verkar ha klonat ett tomt arkiv." @@ -3852,15 +4078,15 @@ msgstr "Spaltfyllnad mellan spalter" msgid "--command must be the first argument" msgstr "--command mÃ¥ste vara första argument" -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." msgstr "git commit [flaggor] [--] <sökväg>..." -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." msgstr "git status [flaggor] [--] <sökväg>..." -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3885,7 +4111,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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" @@ -3895,7 +4121,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:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3909,11 +4135,11 @@ msgstr "" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "Använd annars \"git reset\"\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -3929,93 +4155,93 @@ msgstr "" "\"git cherry-pick --continue\" kommer därefter att Ã¥teruppta\n" "cherry-pick för Ã¥terstÃ¥ende incheckningar.\n" -#: builtin/commit.c:279 +#: builtin/commit.c:287 msgid "failed to unpack HEAD tree object" msgstr "misslyckades packa upp HEAD:s trädobjekt" -#: builtin/commit.c:321 +#: builtin/commit.c:329 msgid "unable to create temporary index" msgstr "kunde inte skapa temporär indexfil" -#: builtin/commit.c:327 +#: builtin/commit.c:335 msgid "interactive add failed" msgstr "interaktiv tilläggning misslyckades" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 msgid "unable to write new_index file" msgstr "kunde inte skriva filen new_index" -#: builtin/commit.c:412 +#: builtin/commit.c:420 msgid "cannot do a partial commit during a merge." msgstr "kan inte utföra en delvis incheckning under en sammanslagning." -#: builtin/commit.c:414 +#: builtin/commit.c:422 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:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "kan inte läsa indexet" -#: builtin/commit.c:444 +#: builtin/commit.c:452 msgid "unable to write temporary index file" msgstr "kunde inte skriva temporär indexfil" -#: builtin/commit.c:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" msgstr "felaktig incheckning: %s" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" msgstr "felformad \"--author\"-flagga" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "Felaktig indragningssträng: \"%s\"" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, c-format msgid "could not lookup commit %s" msgstr "kunde inte slÃ¥ upp incheckningen %s" -#: builtin/commit.c:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, c-format msgid "(reading log message from standard input)\n" msgstr "(läser loggmeddelande frÃ¥n standard in)\n" -#: builtin/commit.c:635 +#: builtin/commit.c:644 msgid "could not read log from standard input" msgstr "kunde inte läsa logg frÃ¥n standard in" -#: builtin/commit.c:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "kunde inte läsa loggfilen \"%s\"" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" msgstr "incheckningen har ett tomt meddelande" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "kunde inte läsa MERGE_MSG" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "kunde inte läsa SQUASH_MSG" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" msgstr "kunde inte skriva incheckningsmall" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -4030,7 +4256,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -4045,7 +4271,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4055,7 +4281,7 @@ msgstr "" "med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter " "incheckningen.\n" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4066,139 +4292,139 @@ msgstr "" "med \"%c\" kommer behÃ¥llas; du kan själv ta bort dem om du vill.\n" "Ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "%sFörfattare: %s" -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" msgstr "%sIncheckare: %s" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" msgstr "Kan inte läsa indexet" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "Fel vid byggande av träd" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, 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:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "Hittade ingen befintlig författare med \"%s\"" -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ogiltigt läge för ospÃ¥rade filer: \"%s\"" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "--long och -z är inkompatibla" -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 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:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." msgstr "Du har inget att utöka." -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 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:1055 +#: builtin/commit.c:1080 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:1058 +#: builtin/commit.c:1083 msgid "Options --squash and --fixup cannot be used together" msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt" -#: builtin/commit.c:1068 +#: builtin/commit.c:1093 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:1070 +#: builtin/commit.c:1095 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:1078 +#: builtin/commit.c:1103 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:1095 +#: builtin/commit.c:1120 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:1097 +#: builtin/commit.c:1122 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:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." msgstr "Smart... utöka den senaste med smutsigt index." -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 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:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "Felaktigt städningsläge %s" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 msgid "Paths with -a does not make sense." msgstr "Kan inte ange sökvägar med -a." -#: builtin/commit.c:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "visa koncis status" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "visa information om gren" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "maskinläsbar utdata" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "visa status i lÃ¥ngt format (standard)" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "terminera poster med NUL" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "läge" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 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:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "visa ignorerade filer" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "när" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -4206,217 +4432,217 @@ msgstr "" "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. " "(Default: all)" -#: builtin/commit.c:1242 +#: builtin/commit.c:1271 msgid "list untracked files in columns" msgstr "visa ospÃ¥rade filer i spalter" -#: builtin/commit.c:1313 +#: builtin/commit.c:1340 msgid "couldn't look up newly created commit" msgstr "kunde inte slÃ¥ upp en precis skapad incheckning" -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "kunde inte tolka en precis skapad incheckning" -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "frÃ¥nkopplad HEAD" -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr " (rotincheckning)" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 msgid "suppress summary after successful commit" msgstr "undertryck sammanfattning efter framgÃ¥ngsrik incheckning" -#: builtin/commit.c:1426 +#: builtin/commit.c:1453 msgid "show diff in commit message template" msgstr "visa diff i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "Alternativ för incheckningsmeddelande" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "läs meddelande frÃ¥n fil" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "författare" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "överstyr författare för incheckningen" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "datum" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" msgstr "överstyr datum för inchecknignen" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" msgstr "meddelande" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" msgstr "incheckningsmeddelande" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 msgid "reuse and edit message from specified commit" msgstr "Ã¥teranvänd och redigera meddelande frÃ¥n angiven incheckning" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" msgstr "Ã¥teranvänd meddelande frÃ¥n angiven incheckning" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "använd autosquash-formaterat meddelande för att fixa angiven incheckning" -#: builtin/commit.c:1436 +#: builtin/commit.c:1463 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:1437 +#: builtin/commit.c:1464 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:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "lägg till Signed-off-by:" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "använd angiven mallfil" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "tvinga redigering av incheckning" -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "standard" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 msgid "how to strip spaces and #comments from message" msgstr "hur blanksteg och #kommentarer skall tas bort frÃ¥n meddelande" -#: builtin/commit.c:1442 +#: builtin/commit.c:1469 msgid "include status in commit message template" msgstr "inkludera status i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" msgstr "nyckel-id" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" msgstr "GPG-signera incheckning" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "Alternativ för incheckningens innehÃ¥ll" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "checka in alla ändrade filer" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 msgid "add specified files to index for commit" msgstr "lägg till angivna filer till indexet för incheckning" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "lägg till filer interaktivt" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "lägg till ändringar interaktivt" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "checka endast in angivna filer" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "förbigÃ¥ pre-commit-krok" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "visa vad som skulle checkas in" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" msgstr "lägg till föregÃ¥ende incheckning" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "förbigÃ¥ post-rewrite-krok" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "ok att registrera en tom ändring" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 msgid "ok to record a change with an empty message" msgstr "ok att registrera en ändring med tomt meddelande" -#: builtin/commit.c:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "kunde inte tolka HEAD:s incheckning" -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "kunde inte öppna \"%s\" för läsning" -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Trasig MERGE_HEAD-fil (%s)" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "kunde inte läsa MERGE_MODE" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, c-format msgid "could not read commit message: %s" msgstr "kunde inte läsa incheckningsmeddelande: %s" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Avbryter incheckning; meddelandet inte redigerat.\n" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Avbryter pÃ¥ grund av tomt incheckningsmeddelande.\n" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" msgstr "kunde inte skriva incheckningsobjekt" -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "kunde inte lÃ¥sa HEAD-referens" -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "kunde inte uppdatera HEAD-referens" -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4427,127 +4653,131 @@ msgstr "" "att kvoten inte har överskridits, och kör sedan\n" "\"git reset HEAD\" för att Ã¥terställa." -#: builtin/config.c:7 +#: builtin/config.c:8 msgid "git config [options]" msgstr "git config [flaggor]" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "Konfigurationsfilens plats" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" msgstr "använd global konfigurationsfil" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "använd systemets konfigurationsfil" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "använd arkivets konfigurationsfil" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "använd angiven konfigurationsil" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "blob-id" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "läs konfiguration frÃ¥n givet blob-objekt" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "Ã…tgärd" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "hämta värde: namn [värde-reguttr]" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "hämta alla värden: nyckel [värde-reguttr]" -#: builtin/config.c:61 +#: builtin/config.c:63 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:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "hämta värde specifikt URL:en: sektion[.var] URL" + +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]" -#: builtin/config.c:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "lägg till en ny variabel: namn värde" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "ta bort en variabel: namn [värde-reguttr]" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "ta bort alla träffar: namn [värde-reguttr]" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "byt namn pÃ¥ sektion: gammalt-namn nytt-namn" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "ta bort en sektion: namn" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "visa alla" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "öppna textredigeringsprogram" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "plats" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "hitta den inställda färgen: [default]" -#: builtin/config.c:71 +#: builtin/config.c:74 msgid "find the color setting: [stdout-is-tty]" msgstr "hitta färginställningen: [stdout-is-tty]" -#: builtin/config.c:72 +#: builtin/config.c:75 msgid "Type" msgstr "Typ" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "värdet är \"true\" eller \"false\"" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "värdet är ett decimalt tal" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "värdet är --bool eller --int" -#: builtin/config.c:76 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "värdet är en sökväg (fil- eller katalognamn)" -#: builtin/config.c:77 +#: builtin/config.c:80 msgid "Other" msgstr "Andra" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "terminera värden med NUL-byte" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "respektera inkluderingsdirektiv vid uppslag" @@ -4675,7 +4905,7 @@ msgstr "överväg de <n> nyaste taggarna (standard: 10)" msgid "only consider tags matching <pattern>" msgstr "överväg endast taggar som motsvarar <mönster>" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "visa förkortade incheckningsobjekt som standard" @@ -4699,31 +4929,31 @@ msgstr "Inga namn hittades, kan inte beskriva nÃ¥got." msgid "--dirty is incompatible with commit-ishes" msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden" -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, c-format msgid "'%s': not a regular file or symlink" msgstr "\"%s\": inte en normal fil eller symbolisk länk" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" msgstr "ogiltig flagga: %s" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "Inte ett git-arkiv" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "objektet \"%s\" som angavs är felaktigt." -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "mer än tvÃ¥ blobbar angavs: \"%s\"" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "ej hanterat objekt \"%s\" angavs." @@ -4732,39 +4962,39 @@ msgstr "ej hanterat objekt \"%s\" angavs." msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [rev-list-flaggor]" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "visa förlopp efter <n> objekt" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "välj hantering av signerade taggar" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 msgid "select handling of tags that tag filtered objects" msgstr "välj hantering av taggar som har taggfiltrerade objekt" -#: builtin/fast-export.c:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "Dump märken till filen" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "Importera märken frÃ¥n filen" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 msgid "Fake a tagger when tags lack one" msgstr "Fejka taggare när taggen saknar en" -#: builtin/fast-export.c:680 +#: builtin/fast-export.c:687 msgid "Output full tree for each commit" msgstr "Skriv ut hela trädet för varje incheckning" -#: builtin/fast-export.c:682 +#: builtin/fast-export.c:689 msgid "Use the done feature to terminate the stream" msgstr "Använd done-funktionen för att avsluta strömmen" -#: builtin/fast-export.c:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "Hoppa över skrivning av blob-data" @@ -4784,144 +5014,153 @@ msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]" msgid "git fetch --all [<options>]" msgstr "git fetch --all [<flaggor>]" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "hämta frÃ¥n alla fjärrar" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 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 +#: builtin/fetch.c:79 msgid "path to upload pack on remote end" msgstr "sökväg till upload pack pÃ¥ fjärren" -#: builtin/fetch.c:65 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "tvinga överskrivning av lokal gren" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "hämta frÃ¥n flera fjärrar" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "hämta alla taggar och associerade objekt" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "hämta inte alla taggar (--no-tags)" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 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 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "on-demand" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "styr rekursiv hämtning av undermoduler" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "behÃ¥ll hämtade paket" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "tillÃ¥t uppdatering av HEAD-referens" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" msgstr "fördjupa historik för grund klon" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "konvertera till komplett arkiv" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "kat" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 msgid "prepend this to submodule path output" msgstr "lägg till i början av undermodulens sökvägsutdata" -#: builtin/fetch.c:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "standardläge för rekursion" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "tar emot referenser som uppdaterar .git/shallow" + +#: builtin/fetch.c:347 msgid "Couldn't find remote ref HEAD" msgstr "Kunde inte hitta fjärr-referensen HEAD" -#: builtin/fetch.c:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "objektet %s hittades inte" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "[à jour]" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (kan inte hämta i aktuell gren)" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "[refuserad]" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "[uppdaterad tagg]" -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr " (kunde inte uppdatera lokal ref)" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "[ny tagg]" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "[ny gren]" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "[ny ref]" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "kunde inte uppdatera lokal ref" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "tvingad uppdatering" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "(ej snabbspolad)" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "kan inte öppna %s: %s\n" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s sände inte alla nödvändiga objekt\n" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "avvisa %s dÃ¥ grunda rötter inte kan uppdateras" + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "FrÃ¥n %.*s\n" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -4930,55 +5169,55 @@ msgstr "" "vissa lokala referenser kunde inte uppdateras; testa att köra\n" " \"git remote prune %s\" för att ta bort gamla grenar som stÃ¥r i konflikt" -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr " (%s kommer bli dinglande)" -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr " (%s har blivit dinglande)" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "[borttagen]" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "(ingen)" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv" -#: builtin/fetch.c:742 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "Vet inte hur man hämtar frÃ¥n %s" - -#: builtin/fetch.c:823 +#: builtin/fetch.c:794 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s" -#: builtin/fetch.c:826 +#: builtin/fetch.c:797 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Flaggan \"%s\" ignoreras för %s\n" -#: builtin/fetch.c:928 +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "Vet inte hur man hämtar frÃ¥n %s" + +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "Hämtar %s\n" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "Kunde inte hämta %s" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -4986,32 +5225,32 @@ 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:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "Du mÃ¥ste ange namnet pÃ¥ en tagg." -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "--depth och --unshallow kan inte användas samtidigt" -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "--unshallow kan inte användas pÃ¥ ett komplett arkiv" -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "fetch --all tar inte namnet pÃ¥ ett arkiv som argument" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kan inte anges med referensspecifikationer" -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, c-format msgid "No such remote or remote group: %s" msgstr "Fjärren eller fjärrgruppen finns inte: %s" -#: builtin/fetch.c:1057 +#: builtin/fetch.c:1153 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Kan inte hämta frÃ¥n grupp och ange referensspecifikationer" @@ -5020,9 +5259,10 @@ 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:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "n" @@ -5046,117 +5286,121 @@ msgstr "inled meddelande med <text>" msgid "file to read from" msgstr "fil att läsa frÃ¥n" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 msgid "git for-each-ref [options] [<pattern>]" msgstr "git for-each-ref [flaggor] [<mönster>]" -#: builtin/for-each-ref.c:994 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "citera platshÃ¥llare passande för skal" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "citera platshÃ¥llare passande för perl" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "citera platshÃ¥llare passande för python" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "citera platshÃ¥llare passande för tcl" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "visa endast <n> träffade refs" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "format" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "format att använda för utdata" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "nyckel" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "fältnamn att sortera pÃ¥" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "git fsck [flaggor] [<objekt>...]" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "visa onÃ¥bara objekt" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "visa dinglande objekt" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "rapportera taggar" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "rapportera rotnoder" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "gör indexojekt till huvudnoder" -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "gör refloggar till huvudnoder (standard)" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 msgid "also consider packs and alternate objects" msgstr "ta även hänsyn till paket och alternativa objekt" -#: builtin/fsck.c:621 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "aktivera striktare kontroll" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 msgid "write dangling objects in .git/lost-found" msgstr "skriv dinglande objekt i .git/lost-found" -#: builtin/fsck.c:624 builtin/prune.c:134 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "visa förlopp" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "git gc [flaggor]" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "Felaktigt %s: \"%s\"" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, c-format msgid "insanely long object directory %.*s" msgstr "tokigt lÃ¥ng objektkatalog %.*s" -#: builtin/gc.c:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "rensa ej refererade objekt" -#: builtin/gc.c:181 +#: builtin/gc.c:264 msgid "be more thorough (increased runtime)" msgstr "var mer grundlig (ökar körtiden)" -#: builtin/gc.c:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "aktivera auto-gc-läge" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "tvinga gc-körning även om en annan gc kanske körs" + +#: builtin/gc.c:306 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -5165,43 +5409,52 @@ 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:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"gc körs redan pÃ¥ maskinen \"%s\" pid %<PRIuMAX> (använd --force om sÃ¥ inte " +"är fallet)" + +#: builtin/gc.c:341 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:22 +#: builtin/grep.c:23 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [flaggor] [-e] <mönster> [<rev>...] [[--] <sökväg>...]" -#: builtin/grep.c:217 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: misslyckades skapa trÃ¥d. %s" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "Kunde inte byta katalog (chdir): %s" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "kunde inte läsa träd (%s)" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, c-format msgid "unable to grep from object of type %s" msgstr "Kunde inte \"grep\" frÃ¥n objekt av typen %s" -#: builtin/grep.c:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "flaggan \"%c\" antar ett numeriskt värde" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "kan inte öppna \"%s\"" @@ -5243,158 +5496,162 @@ msgid "don't match patterns in binary files" msgstr "träffa inte mönster i binärfiler" #: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "hantera binärfiler med textconv-filter" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "gÃ¥ som mest ned <djup> nivÃ¥er" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "använd utökade POSIX-reguljära uttryck" -#: builtin/grep.c:669 +#: builtin/grep.c:671 msgid "use basic POSIX regular expressions (default)" msgstr "använd grundläggande POSIX-reguljära uttryck (standard)" -#: builtin/grep.c:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "tolka mönster som fixerade strängar" -#: builtin/grep.c:675 +#: builtin/grep.c:677 msgid "use Perl-compatible regular expressions" msgstr "använd Perlkompatibla reguljära uttryck" -#: builtin/grep.c:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "visa radnummer" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "visa inte filnamn" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "visa filnamn" -#: builtin/grep.c:682 +#: builtin/grep.c:684 msgid "show filenames relative to top directory" msgstr "visa filnamn relativa till toppkatalogen" -#: builtin/grep.c:684 +#: builtin/grep.c:686 msgid "show only filenames instead of matching lines" msgstr "visa endast filnamn istället för träffade rader" -#: builtin/grep.c:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "synonym för --files-with-matches" -#: builtin/grep.c:689 +#: builtin/grep.c:691 msgid "show only the names of files without match" msgstr "visa endast namn pÃ¥ filer utan träffar" -#: builtin/grep.c:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "skriv NUL efter filnamn" -#: builtin/grep.c:693 +#: builtin/grep.c:695 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:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "ljusmarkera träffar" -#: builtin/grep.c:696 +#: builtin/grep.c:698 msgid "print empty line between matches from different files" msgstr "skriv tomma rader mellan träffar frÃ¥n olika filer" -#: builtin/grep.c:698 +#: builtin/grep.c:700 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:701 +#: builtin/grep.c:703 msgid "show <n> context lines before and after matches" msgstr "visa <n> rader sammanhang före och efter träffar" -#: builtin/grep.c:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "visa <n> rader sammanhang före träffar" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "visa <n> rader sammanhang efter träffar" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" msgstr "genväg för -C NUM" -#: builtin/grep.c:710 +#: builtin/grep.c:712 msgid "show a line with the function name before matches" msgstr "visa en rad med funktionsnamnet före träffen" -#: builtin/grep.c:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "visa den omkringliggande funktionen" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "läs mönster frÃ¥n fil" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "träffa <mönster>" -#: builtin/grep.c:719 +#: builtin/grep.c:721 msgid "combine patterns specified with -e" msgstr "kombinera mönster som anges med -e" -#: builtin/grep.c:731 +#: builtin/grep.c:733 msgid "indicate hit with exit status without output" msgstr "ange träff med slutstatuskod utan utdata" -#: builtin/grep.c:733 +#: builtin/grep.c:735 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:735 +#: builtin/grep.c:737 msgid "show parse tree for grep expression" msgstr "visa analysträd för grep-uttryck" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "pager" msgstr "bläddrare" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "show matching files in the pager" msgstr "visa träffade filer i filbläddraren" -#: builtin/grep.c:742 +#: builtin/grep.c:744 msgid "allow calling of grep(1) (ignored by this build)" msgstr "tillÃ¥t anropa grep(1) (ignoreras av detta bygge)" -#: builtin/grep.c:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "visa användning" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "inget mönster angavs." -#: builtin/grep.c:865 +#: builtin/grep.c:870 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager fungerar endast i arbetskatalogen" -#: builtin/grep.c:888 +#: builtin/grep.c:893 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached och --untracked kan inte användas med --no-index." -#: builtin/grep.c:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index och --untracked kan inte användas med revisioner." -#: builtin/grep.c:896 +#: builtin/grep.c:901 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:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "bÃ¥de --cached och träd angavs." @@ -5499,57 +5756,57 @@ msgstr "" "\"%s\": kommando för man-visare som stöds.\n" "Använd \"man.<verktyg>.path\" istället." -#: builtin/help.c:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "\"%s\": okänd man-visare." -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "ingen man-visare hanterade förfrÃ¥gan" -#: builtin/help.c:374 +#: builtin/help.c:378 msgid "no info viewer handled the request" msgstr "ingen info-visare hanterade förfrÃ¥gan" -#: builtin/help.c:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "Definierar attribut per sökväg" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "En Git-ordlista" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "Ange avsiktligen ospÃ¥rade filer att ignorera" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "Ange egenskaper för undermoduler" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "Ange versioner och intervall i Git" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "Introduktion till Git (för version 1.5.1 och senare)" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "Översikt över rekommenderade arbetsflöden med Git" -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "De vanliga Git-vägledningarna är:\n" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" msgstr "användning: %s%s" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "\"git %s\" är ett alias för \"%s\"" @@ -5649,8 +5906,8 @@ msgstr "allvarlig inflate-inkonsekvens" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "kunde inte läsa %s" @@ -5679,155 +5936,155 @@ msgstr "Fel i objekt" msgid "Not all child objects of %s are reachable" msgstr "Inte alla barnobjekt för %s kan nÃ¥s" -#: builtin/index-pack.c:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "misslyckades tillämpa delta" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "Tar emot objekt" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "Skapar index för objekt" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "paketet är trasigt (SHA1 stämmer inte)" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" msgstr "kan inte utföra \"fstat\" pÃ¥ paketfil" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "paket har skräp i slutet" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "förvirrad bortom vanvett i parse_pack_objects()" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "Analyserar delta" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "kunde inte skapa trÃ¥d: %s" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "förvirrad bortom vanvett" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "slutfördes med %d lokala objekt" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "Oväntad svanschecksumma för %s (trasig disk?)" -#: builtin/index-pack.c:1151 +#: builtin/index-pack.c:1152 #, 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:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" msgstr "kunde inte utföra \"deflate\" pÃ¥ tillagt objekt (%d)" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "lokalt objekt %s är trasigt" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" msgstr "fel vid stängning av paketfil" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "kan inte ta skriva \"keep\"-fil \"%s\"" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "akn inte stänga skriven \"keep\"-fil \"%s\"" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "kan inte spara paketfil" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "kan inte spara indexfil" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "felaktig pack.indexversion=%<PRIu32>" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, c-format msgid "invalid number of threads specified (%d)" msgstr "felaktigt antal trÃ¥dar angivet (%d)" -#: builtin/index-pack.c:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "trÃ¥dstöd saknas, ignorerar %s" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Kan inte öppna befintlig paketfil \"%s\"" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, 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:1474 +#: builtin/index-pack.c:1475 #, 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:1481 +#: builtin/index-pack.c:1482 #, 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:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "Kan inte gÃ¥ tillbaka till arbetskatalogen (cwd)" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "felaktig %s" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin kan inte användas med --stdin" -#: builtin/index-pack.c:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\"" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "--verify angavs utan paketfilnamn" @@ -5916,11 +6173,6 @@ msgstr "kan inte hantera filtyp %d" msgid "unable to move %s to %s" msgstr "kan inte flytta %s till %s" -#: builtin/init-db.c:363 -#, c-format -msgid "Could not create git link %s" -msgstr "Kunde inte skapa gitlänk %s" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -5963,21 +6215,21 @@ msgstr "behörigheter" 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:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "var tyst" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "kan inte skapa katalogen (mkdir) %s" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "kan inte byta katalog (chdir) till %s" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -5986,11 +6238,11 @@ msgstr "" "%s (eller --work-tree=<katalog>) inte tillÃ¥tet utan att ange %s (eller --git-" "dir=<katalog>)" -#: builtin/init-db.c:579 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "Kan inte komma Ã¥t aktuell arbetskatalog" -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "Kan inte komma Ã¥t arbetskatalogen \"%s\"" @@ -6003,381 +6255,381 @@ msgstr "git log [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]\n" msgid " or: git show [options] <object>..." msgstr " eller: git show [flaggor] <objekt>..." -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "undertryck diff-utdata" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "visa källkod" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "Använd e-postmappningsfil" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "dekoreringsflaggor" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "Slututdata: %d %s\n" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "Kunde inte läsa objektet %s" -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "Okänd typ: %d" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "format.headers utan värde" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "namnet pÃ¥ utdatakatalogen är för lÃ¥ngt" -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "Kan inte öppna patchfilen %s" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "Behöver precis ett intervall." -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "Inte ett intervall." -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" msgstr "Omslagsbrevet behöver e-postformat" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "tokigt in-reply-to: %s" -#: builtin/log.c:995 +#: builtin/log.c:1015 msgid "git format-patch [options] [<since> | <revision range>]" msgstr "git format-patch [flaggor] [<sedan> | <revisionsintervall>]" -#: builtin/log.c:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "TvÃ¥ utdatakataloger?" -#: builtin/log.c:1155 +#: builtin/log.c:1175 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:1158 +#: builtin/log.c:1178 msgid "use [PATCH] even with multiple patches" msgstr "använd [PATCH] även för flera patchar" -#: builtin/log.c:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "skriv patcharna pÃ¥ stnadard ut" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "generera ett följebrev" -#: builtin/log.c:1166 +#: builtin/log.c:1186 msgid "use simple number sequence for output file names" msgstr "använd enkel nummersekvens för utdatafilnamn" -#: builtin/log.c:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "sfx" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "använd <sfx> istället för \".patch\"" -#: builtin/log.c:1170 +#: builtin/log.c:1190 msgid "start numbering patches at <n> instead of 1" msgstr "börja numrera patchar pÃ¥ <n> istället för 1" -#: builtin/log.c:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "markera serien som N:te försök" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" msgstr "Använd [<prefix>] istället för [PATCH]" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "spara filerna i <katalog>" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "ta inte bort eller lägg till [PATCH]" -#: builtin/log.c:1183 +#: builtin/log.c:1203 msgid "don't output binary diffs" msgstr "skriv inte binära diffar" -#: builtin/log.c:1185 +#: builtin/log.c:1205 msgid "don't include a patch matching a commit upstream" msgstr "ta inte med patchar som motsvarar en uppströmsincheckning" -#: builtin/log.c:1187 +#: builtin/log.c:1207 msgid "show patch format instead of default (patch + stat)" msgstr "visa patchformat istället för standard (patch + stat)" -#: builtin/log.c:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "E-post" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "huvud" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "lägg till e-posthuvud" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "epost" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "Lägg till mottagarhuvud (\"To:\")" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "Lägg till kopiehuvud (\"Cc:\")" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "ident" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" msgstr "sätt FrÃ¥n-adress till <ident> (eller incheckare om ident saknas)" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "meddelande-id" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "Gör det första brevet ett svar till <meddelande-id>" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "gräns" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "bifoga patchen" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "gör patchen ett inline-objekt" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "aktivera brevtrÃ¥dning, typer: shallow, deep" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "signatur" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "lägg till signatur" -#: builtin/log.c:1214 +#: builtin/log.c:1233 msgid "don't print the patch filenames" msgstr "visa inte filnamn för patchar" -#: builtin/log.c:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "ogiltig ident-rad: %s" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "-n och -k kan inte användas samtidigt." -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix och -k kan inte användas samtidigt." -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "kan inte använda --name-only" -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "kan inte använda --name-status" -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "kan inte använda --check" -#: builtin/log.c:1340 +#: builtin/log.c:1359 msgid "standard output, or directory, which one?" msgstr "standard ut, eller katalog, vilken skall det vara?" -#: builtin/log.c:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "Kunde inte skapa katalogen \"%s\"" -#: builtin/log.c:1490 +#: builtin/log.c:1509 msgid "Failed to create output files" msgstr "Misslyckades skapa utdatafiler" -#: builtin/log.c:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, 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:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" msgstr "Okänd incheckning %s" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "git ls-files [flaggor] [<fil>...]" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 msgid "identify the file status with tags" msgstr "identifiera filstatus med taggar" -#: builtin/ls-files.c:467 +#: builtin/ls-files.c:457 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:469 +#: builtin/ls-files.c:459 msgid "show cached files in the output (default)" msgstr "visa cachade filer i utdata (standard)" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:461 msgid "show deleted files in the output" msgstr "visa borttagna filer i utdata" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:463 msgid "show modified files in the output" msgstr "visa modifierade filer i utdata" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:465 msgid "show other files in the output" msgstr "visa andra filer i utdata" -#: builtin/ls-files.c:477 +#: builtin/ls-files.c:467 msgid "show ignored files in the output" msgstr "visa ignorerade filer i utdata" -#: builtin/ls-files.c:480 +#: builtin/ls-files.c:470 msgid "show staged contents' object name in the output" msgstr "visa köat innehÃ¥lls objektnamn i utdata" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 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:484 +#: builtin/ls-files.c:474 msgid "show 'other' directories' name only" msgstr "visa endast namn för \"andra\" kataloger" -#: builtin/ls-files.c:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "visa inte tomma kataloger" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 msgid "show unmerged files in the output" msgstr "visa ej sammanslagna filer i utdata" -#: builtin/ls-files.c:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "visa \"resolve-undo\"-information" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 msgid "skip files matching pattern" msgstr "hoppa över filer som motsvarar mönster" -#: builtin/ls-files.c:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "exkludera mönster som läses frÃ¥n <fil>" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 msgid "read additional per-directory exclude patterns in <file>" msgstr "läs ytterligare per-katalog-exkluderingsmönster frÃ¥n <fil>" -#: builtin/ls-files.c:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "lägg till git:s standardexkluderingar" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 msgid "make the output relative to the project top directory" msgstr "gör utdata relativ till projektets toppkatalog" -#: builtin/ls-files.c:508 +#: builtin/ls-files.c:498 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:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "träd-igt" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 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:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "visa felsökningsutdata" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 msgid "git ls-tree [<options>] <tree-ish> [<path>...]" msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]" -#: builtin/ls-tree.c:125 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "visa endast träd" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "rekursera ner i underträd" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "visa träd medan rekursering" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "terminera poster med NUL-byte" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 msgid "include object size" msgstr "inkludera objektstorlek" -#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "visa endast filnamn" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "använd fullständiga sökvägsnamn" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)" @@ -6412,151 +6664,151 @@ msgstr "Tillgängliga strategier är:" msgid "Available custom strategies are:" msgstr "Tillgängliga skräddarsydda strategier är:" -#: builtin/merge.c:198 +#: builtin/merge.c:191 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:201 +#: builtin/merge.c:194 msgid "show a diffstat at the end of the merge" msgstr "visa en diffstat när sammanslagningen är färdig" -#: builtin/merge.c:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "(synonym till --stat)" -#: builtin/merge.c:204 +#: builtin/merge.c:197 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:207 +#: builtin/merge.c:200 msgid "create a single commit instead of doing a merge" msgstr "skapa en ensam incheckning istället för en sammanslagning" -#: builtin/merge.c:209 +#: builtin/merge.c:202 msgid "perform a commit if the merge succeeds (default)" msgstr "utför en incheckning om sammanslagningen lyckades (standard)" -#: builtin/merge.c:211 +#: builtin/merge.c:204 msgid "edit message before committing" msgstr "redigera meddelande innan incheckning" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "tillÃ¥t snabbspolning (standard)" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "avbryt om snabbspolning inte är möjlig" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "strategi" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "sammanslagninsstrategi att använda" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "alternativ=värde" -#: builtin/merge.c:222 +#: builtin/merge.c:215 msgid "option for selected merge strategy" msgstr "alternativ för vald sammanslagningsstrategi" -#: builtin/merge.c:224 +#: builtin/merge.c:217 msgid "merge commit message (for a non-fast-forward merge)" msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning" -#: builtin/merge.c:228 +#: builtin/merge.c:221 msgid "abort the current in-progress merge" msgstr "avbryt den pÃ¥gÃ¥ende sammanslagningen" -#: builtin/merge.c:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "kunde köra stash." -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "stash misslyckades" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "inte ett giltigt objekt: %s" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "read-tree misslyckades" -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr " (inget att platta till)" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Tillplattningsincheckning -- uppdaterar inte HEAD\n" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "Skriver SQUASH_MSG" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "Avslutar SQUASH_MSG" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, c-format msgid "'%s' does not point to a commit" msgstr "\"%s\" verkar inte peka pÃ¥ en incheckning" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Felaktig branch.%s.mergeoptions-sträng: %s" -#: builtin/merge.c:657 +#: builtin/merge.c:650 msgid "git write-tree failed to write a tree" msgstr "git write-tree misslyckades skriva ett träd" -#: builtin/merge.c:685 +#: builtin/merge.c:678 msgid "Not handling anything other than two heads merge." msgstr "Hanterar inte nÃ¥got annat än en sammanslagning av tvÃ¥ huvuden." -#: builtin/merge.c:699 +#: builtin/merge.c:692 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Felaktig flagga för merge-recursive: -X%s" -#: builtin/merge.c:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "kunde inte skriva %s" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "Kunde inte läsa frÃ¥n \"%s\"" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, 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:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6572,48 +6824,48 @@ msgstr "" "Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n" "avbryter incheckningen.\n" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "Tomt incheckningsmeddelande." -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "Underbart.\n" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, 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:934 +#: builtin/merge.c:927 #, c-format msgid "'%s' is not a commit" msgstr "\"%s\" är inte en incheckning" -#: builtin/merge.c:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "Inte pÃ¥ nÃ¥gon gren." -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "Ingen fjärr för aktuell gren." -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." msgstr "Ingen standarduppström angiven för aktuell gren." -#: builtin/merge.c:984 +#: builtin/merge.c:977 #, 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:1140 +#: builtin/merge.c:1133 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)." -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6621,11 +6873,11 @@ msgstr "" "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n" "Checka in dina ändringar innan du kan slÃ¥ ihop." -#: builtin/merge.c:1159 git-pull.sh:34 +#: builtin/merge.c:1152 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:1163 +#: builtin/merge.c:1156 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6633,140 +6885,148 @@ 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:1166 +#: builtin/merge.c:1159 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:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "Du kan inte kombinera --squash med --no-ff." -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt." -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 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:1219 +#: builtin/merge.c:1212 msgid "Squash commit into empty head not supported yet" msgstr "Stöder inte en tillplattningsincheckning pÃ¥ ett tomt huvud ännu" -#: builtin/merge.c:1221 +#: builtin/merge.c:1214 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:1226 +#: builtin/merge.c:1219 #, c-format msgid "%s - not something we can merge" msgstr "%s - inte nÃ¥got vi kan slÃ¥ ihop" -#: builtin/merge.c:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "" "Incheckningen %s har en obetrodd GPG-signatur som pÃ¥stÃ¥s vara gjord av %s." -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "" "Incheckningen %s har en felaktig GPG-signatur som pÃ¥stÃ¥s vara gjord av %s." #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "Incheckning %s har inte nÃ¥gon GPG-signatur." -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "Uppdaterar %s..%s\n" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Försöker riktigt enkel sammanslagning i indexet...\n" -#: builtin/merge.c:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "Nej.\n" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 msgid "Not possible to fast-forward, aborting." msgstr "Kan inte snabbspola, avbryter." -#: builtin/merge.c:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Ã…terspolar trädet till orört...\n" -#: builtin/merge.c:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Försöker sammanslagninsstrategin %s...\n" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n" -#: builtin/merge.c:1543 +#: builtin/merge.c:1536 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Sammanslagning med strategin %s misslyckades.\n" -#: builtin/merge.c:1552 +#: builtin/merge.c:1545 #, 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:1564 +#: builtin/merge.c:1557 #, 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 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." msgstr "git merge-base [-a|--all] <incheckning> <incheckning>..." -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." msgstr "git merge-base [-a|--all] --octopus <incheckning>..." -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." msgstr "git merge-base --independent <incheckning>..." -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <incheckning> <incheckning>" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <ref> <incheckning>" + +#: builtin/merge-base.c:214 msgid "output all common ancestors" msgstr "skriv ut alla gemensamma anfäder" -#: builtin/merge-base.c:99 +#: builtin/merge-base.c:216 msgid "find ancestors for a single n-way merge" msgstr "hitta anfader för enkel n-vägssammanslagning" -#: builtin/merge-base.c:100 +#: builtin/merge-base.c:218 msgid "list revs not reachable from others" msgstr "visa revisioner som inte kan nÃ¥s frÃ¥n andra" -#: builtin/merge-base.c:102 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "är den första anfader till den andra?" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "se var <incheckning> grenades av frÃ¥n referensloggen frÃ¥n <ref>" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -6822,117 +7082,131 @@ msgstr "tillÃ¥t saknade objekt" msgid "allow creation of more than one tree" msgstr "tillÃ¥t skapa mer än ett träd" -#: builtin/mv.c:14 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "git mv [flaggor] <källa>... <mÃ¥l>" -#: builtin/mv.c:64 +#: builtin/mv.c:71 msgid "force move/rename even if target exists" msgstr "tvinga flytta/ändra namn även om mÃ¥let finns" -#: builtin/mv.c:65 +#: builtin/mv.c:72 msgid "skip move/rename errors" msgstr "hoppa över fel vid flytt/namnändring" -#: builtin/mv.c:108 +#: builtin/mv.c:122 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "Kontrollerar namnbyte av \"%s\" till \"%s\"\n" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "felaktig källa" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "kan inte flytta katalog till sig själv" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "kan inte flytta katalog över fil" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "Vad? Katalogen %s är i indexet och inte en undermodul?" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" +"Köa dina ändringar i .gitmodules eller använd \"stash\" för att fortsätta" + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "Vad? %.*s är i indexet?" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "källkatalogen är tom" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "inte versionshanterad" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "destinationen finns" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "skriver över \"%s\"" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "Kan inte skriva över" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "flera källor för samma mÃ¥l" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "destinationskatalogen finns inte" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s, källa=%s, mÃ¥l=%s" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "Byter namn pÃ¥ %s till %s\n" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" msgstr "misslyckades byta namn pÃ¥ \"%s\"" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "git name-rev [flaggor] <incheckning>..." -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "git name-rev [flaggor] --all" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "git name-rev [flaggor] --stdin" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "skriv endast namn (ingen SHA-1)" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 msgid "only use tags to name the commits" msgstr "använd endast taggar för att namnge incheckningar" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:315 msgid "only use refs matching <pattern>" msgstr "använd endast referenser som motsvarar <mönster>" -#: builtin/name-rev.c:318 +#: builtin/name-rev.c:317 msgid "list all commits reachable from all refs" msgstr "lista alla incheckningar som kan nÃ¥s alla referenser" -#: builtin/name-rev.c:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "läs frÃ¥n standard in" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" -msgstr "tillÃ¥t att skriva \"odefinierade\" namn" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "tillÃ¥t att skriva \"odefinierade\" namn (standard)" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "avreferera taggar i indata (används internt)" @@ -7085,12 +7359,12 @@ msgstr "kunde inte skriva anteckningsobjekt" msgid "The note contents has been left in %s" msgstr "Anteckningens innehÃ¥ll har lämnats kvar i %s" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "kunde inte öppna eller läsa \"%s\"" @@ -7098,7 +7372,7 @@ msgstr "kunde inte öppna eller läsa \"%s\"" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Kunde inte slÃ¥ upp \"%s\" som en giltig referens." @@ -7258,7 +7532,7 @@ msgstr "anteckningar-ref" msgid "use notes from <notes_ref>" msgstr "använd anteckningar frÃ¥n <anteckningsref>" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "Okänt underkommando: %s" @@ -7271,148 +7545,148 @@ msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]" 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 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "fel i deflate (%d)" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "indexversionen %s stöds ej" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "felaktig indexversion \"%s\"" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "flaggan %s godtar inte negativ form" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "kunde inte tolka värdet \"%s\" för flaggan %s" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "visa inte förloppsindikator" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "visa förloppsindikator" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 msgid "show progress meter during object writing phase" msgstr "visa förloppsindikator under objektskrivningsfasen" -#: builtin/pack-objects.c:2454 +#: builtin/pack-objects.c:2453 msgid "similar to --all-progress when progress meter is shown" msgstr "som --all-progress när förloppsmätaren visas" -#: builtin/pack-objects.c:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "version[,offset]" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 msgid "write the pack index file in the specified idx format version" msgstr "skriv paketindexfilen i angiven indexformatversion" -#: builtin/pack-objects.c:2459 +#: builtin/pack-objects.c:2458 msgid "maximum size of each output pack file" msgstr "maximal storlek pÃ¥ varje utdatapaketfil" -#: builtin/pack-objects.c:2461 +#: builtin/pack-objects.c:2460 msgid "ignore borrowed objects from alternate object store" msgstr "ignorera lÃ¥nade objekt frÃ¥n alternativa objektlager" -#: builtin/pack-objects.c:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "ignorera packade objekt" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 msgid "limit pack window by objects" msgstr "begränsa paketfönster efter objekt" -#: builtin/pack-objects.c:2467 +#: builtin/pack-objects.c:2466 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:2469 +#: builtin/pack-objects.c:2468 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:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "Ã¥teranvänd befintliga delta" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "Ã¥teranvänd befintliga objekt" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "använd OFS_DELTA-objekt" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 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:2479 +#: builtin/pack-objects.c:2478 msgid "do not create an empty pack output" msgstr "försök inte skapa tom paketutdata" -#: builtin/pack-objects.c:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr "läs revisionsargument frÃ¥n standard in" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 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:2486 +#: builtin/pack-objects.c:2485 msgid "include objects reachable from any reference" msgstr "inkludera objekt som kan nÃ¥s frÃ¥n nÃ¥gon referens" -#: builtin/pack-objects.c:2489 +#: builtin/pack-objects.c:2488 msgid "include objects referred by reflog entries" msgstr "inkludera objekt som refereras frÃ¥n referensloggposter" -#: builtin/pack-objects.c:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "skriv paket pÃ¥ standard ut" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 msgid "include tag objects that refer to objects to be packed" msgstr "inkludera taggobjekt som refererar objekt som skall packas" -#: builtin/pack-objects.c:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "behÃ¥ll onÃ¥bara objekt" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "tid" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 msgid "unpack unreachable objects newer than <time>" msgstr "packa upp onÃ¥bara objekt nyare än <tid>" -#: builtin/pack-objects.c:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "skapa tunna paket" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 msgid "ignore packs that have companion .keep file" msgstr "ignorera paket som har tillhörande .keep-fil" -#: builtin/pack-objects.c:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "komprimeringsgrad för paket" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" msgstr "göm inte incheckningar med ympningar (\"grafts\")" @@ -7436,15 +7710,15 @@ msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "ta inte bort, bara visa" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "rapportera borttagna objekt" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "lÃ¥t tid gÃ¥ ut för objekt äldre än <tid>" @@ -7452,15 +7726,15 @@ msgstr "lÃ¥t tid gÃ¥ ut för objekt äldre än <tid>" msgid "git push [<options>] [<repository> [<refspec>...]]" msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "taggförkortning utan <tagg>" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "--delete godtar endast enkla mÃ¥lreferensnamn" -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." @@ -7469,7 +7743,7 @@ msgstr "" "För att välja ett av alternativen permanent, se push.default i \"git help " "config\"." -#: builtin/push.c:102 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7494,7 +7768,7 @@ msgstr "" " git push %s %s\n" "%s" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7509,7 +7783,7 @@ msgstr "" "\n" " git push %s HEAD:<namn-pÃ¥-fjärrgren>\n" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7522,12 +7796,12 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:139 +#: builtin/push.c:181 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända." -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7538,7 +7812,7 @@ 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:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7550,6 +7824,13 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" @@ -7567,19 +7848,27 @@ msgstr "" "\n" " git config --global push.default simple\n" "\n" +"Nör push.default är satt till \"matching\" kommer git att sända lokala " +"grenar\n" +"till fjärrgrenar som redan finns och som har samma namn.\n" +"\n" +"Git 2.0 kommer som standard välja den mer konservativa inställningen\n" +"\"simple\", vilket bara sänder in den aktuella grenen till den motsvarande\n" +"fjärrgren \"git pull\" använder för att uppdatera den aktuella grenen.\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:225 +#: builtin/push.c:274 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:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7591,7 +7880,7 @@ 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:238 +#: builtin/push.c:287 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" @@ -7605,7 +7894,7 @@ msgstr "" "endast\n" "sända aktuell gren." -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7617,7 +7906,7 @@ 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:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7631,11 +7920,11 @@ msgstr "" "(t.ex. \"git pull ...\") innan du sänder igen.\n" "Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer." -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "Uppdateringarna avvisades eftersom taggen redan finns pÃ¥ fjärren." -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" @@ -7646,22 +7935,22 @@ msgstr "" "pekar pÃ¥ nÃ¥got som inte är en incheckning, utan att använda flaggan\n" "\"--force\".\n" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "Sänder till %s\n" -#: builtin/push.c:324 +#: builtin/push.c:379 #, c-format msgid "failed to push some refs to '%s'" msgstr "misslyckades sända vissa referenser till \"%s\"" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "felaktigt arkiv \"%s\"" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7682,87 +7971,95 @@ msgstr "" "\n" " git push <namn>\n" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "--all och --tags är inkompatibla" -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" msgstr "--all kan inte kombineras med referensspecifikationer" -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "--mirror och --tags är inkompatibla" -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" msgstr "--mirror kan inte kombineras med referensspecifikationer" -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "--all och --mirror är inkompatibla" -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "arkiv" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" msgstr "sänd alla referenser" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" msgstr "spegla alla referenser" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" msgstr "ta bort referenser" -#: builtin/push.c:450 +#: builtin/push.c:505 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:453 +#: builtin/push.c:508 msgid "force updates" msgstr "tvinga uppdateringar" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "refnamn>:<förvänta" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "kräv att ref:s tidigare värde är detta" + +#: builtin/push.c:513 msgid "check" msgstr "kontrollera" -#: builtin/push.c:455 +#: builtin/push.c:514 msgid "control recursive pushing of submodules" msgstr "styr rekursiv insändning av undermoduler" -#: builtin/push.c:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "använd tunna paket" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" msgstr "program för att ta emot paket" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" msgstr "ställ in uppström för git pull/status" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" msgstr "ta bort lokalt borttagna referenser" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" msgstr "förbigÃ¥ pre-push-krok" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" msgstr "sänd in saknade men relevanta taggar" -#: builtin/push.c:476 +#: builtin/push.c:535 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete är imkompatibel med --all, --mirror och --tags" -#: builtin/push.c:478 +#: builtin/push.c:537 msgid "--delete doesn't make sense without any refs" msgstr "--delete kan inte användas utan referenser" @@ -7840,21 +8137,21 @@ msgstr "hoppa över att applicera filter för gles utcheckning" msgid "debug unpack-trees" msgstr "felsök unpack-trees" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" msgstr "\"%s\" för \"%s\" är inte en giltig tidsstämpel" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "\"%s\" är inte en giltig tidsstämpel" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "git remote [-v | --verbose]" -#: builtin/remote.c:12 +#: builtin/remote.c:13 msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <name> <url>" @@ -7862,78 +8159,82 @@ 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 +#: builtin/remote.c:14 builtin/remote.c:33 msgid "git remote rename <old> <new>" msgstr "git remote rename <gammal> <ny>" -#: builtin/remote.c:14 builtin/remote.c:37 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "git remote remove <namn>" -#: builtin/remote.c:15 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:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <namn> (-a | --auto | -d | --delete | <gren>)" + +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "git remote [-v | --verbose] show [-n] <namn>" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "git remote prune [-n | --dry-run] <namn>" -#: builtin/remote.c:18 +#: builtin/remote.c:19 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 +#: builtin/remote.c:20 msgid "git remote set-branches [--add] <name> <branch>..." msgstr "git remote set-branches [--add] <namn> <gren>..." -#: builtin/remote.c:20 builtin/remote.c:68 +#: builtin/remote.c:21 builtin/remote.c:69 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 +#: builtin/remote.c:22 builtin/remote.c:70 msgid "git remote set-url --add <name> <newurl>" msgstr "git remote set-url --add <namn> <nyurl>" -#: builtin/remote.c:22 builtin/remote.c:70 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "git remote set-url --delete <namn> <url>" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "git remote add [<flaggor>] <namn> <url>" -#: builtin/remote.c:47 +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <namn> (-a | --auto | -d | --delete | <gren>)" + +#: builtin/remote.c:48 msgid "git remote set-branches <name> <branch>..." msgstr "git remote set-branches <namn> <gren>..." -#: builtin/remote.c:48 +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "git remote set-branches --add <namn> <gren>..." -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "git remote show [<flaggor>] <namn>" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "git remote prune [<flaggor>] <namn>" -#: builtin/remote.c:63 +#: builtin/remote.c:64 msgid "git remote update [<options>] [<group> | <remote>]..." msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..." -#: builtin/remote.c:98 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "Uppdaterar %s" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" @@ -7941,101 +8242,101 @@ msgstr "" "--mirror är farlig och förÃ¥ldrad; använd\n" "\t --mirror=fetch eller --mirror=push istället" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "okänt argument till mirror: %s" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" msgstr "hämta fjärrgrenarna" -#: builtin/remote.c:165 +#: builtin/remote.c:155 msgid "import all tags and associated objects when fetching" msgstr "importera alla taggar och associerade objekt vid hämtning" -#: builtin/remote.c:168 +#: builtin/remote.c:158 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 +#: builtin/remote.c:160 msgid "branch(es) to track" msgstr "gren(ar) att spÃ¥ra" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "huvudgren" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "push|fetch" -#: builtin/remote.c:173 +#: builtin/remote.c:163 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 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "att ange en master-gren ger ingen mening med --mirror" -#: builtin/remote.c:187 +#: builtin/remote.c:177 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "att ange grenar att spÃ¥ra ger mening bara med hämtningsspeglar" -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, c-format msgid "remote %s already exists." msgstr "fjärrarkivet %s finns redan." -#: builtin/remote.c:199 builtin/remote.c:650 +#: builtin/remote.c:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "\"%s\" är inte ett giltigt namn pÃ¥ fjärrarkiv" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "Kunde inte skapa master \"%s\"" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "mer än en %s" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" msgstr "Kunde inte hämta mappning för referensspecifikation %s" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "(matchande)" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "(ta bort)" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%s'" msgstr "Kunde inte tillämpa \"%s\" pÃ¥ \"%s\"" -#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "Inget sÃ¥dant fjärrarkiv: %s" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "Kunde inte byta namn pÃ¥ konfigurationssektionen \"%s\" till \"%s\"" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, c-format msgid "Could not remove config section '%s'" msgstr "Kunde inte ta bort konfigurationssektionen \"%s\"" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -8046,32 +8347,32 @@ msgstr "" "\t%s\n" "\tUppdatera konfigurationen manuellt om nödvändigt." -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "Kunde inte lägga till pÃ¥ \"%s\"" -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "Kunde inte sätta \"%s\"" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" msgstr "misslyckades ta bort \"%s\"" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" msgstr "misslyckades skapa \"%s\"" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" msgstr "Kunde inte ta bort grenen %s" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -8085,265 +8386,330 @@ msgstr[1] "" "Observera: NÃ¥gra grenar utanför hierarkin refs/remotes/ togs inte bort;\n" "för att ta bort dem, använd:" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr " ny (nästa hämtning sparar i remotes/%s)" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" msgstr " spÃ¥rad" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" msgstr " förlegad (använd \"git remote prune\" för att ta bort)" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr " ???" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "ogiltig branch.%s.merge; kan inte ombasera över > 1 gren" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "ombaseras pÃ¥ fjärren %s" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr " sammanslÃ¥s med fjärren %s" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr " och med fjärren" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "sammanslÃ¥s med fjärren %s" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr " och med fjärren" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "skapa" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "ta bort" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "à jour" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "kan snabbspolas" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "lokal förÃ¥ldrad" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s tvingar till %-*s (%s)" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr " %-*s sänder till %-*s (%s)" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr " %-*s tvingar till %s" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" msgstr " %-*s sänder till %s" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "frÃ¥ga inte fjärrar" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "* fjärr %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" msgstr " Hämt-URL: %s" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "(ingen URL)" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr " Sänd-URL: %s" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr " HEAD-gren: %s" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" msgstr " HEAD-gren (HEAD pÃ¥ fjärr är tvetydig, kan vara en av följande):\n" -#: builtin/remote.c:1151 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" msgstr[0] " Fjärrgren:%s" msgstr[1] " Fjärrgrenar:%s" -#: builtin/remote.c:1154 builtin/remote.c:1181 +#: builtin/remote.c:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr " (status inte förfrÃ¥gad)" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" msgstr[0] " Lokal gren konfigurerad för \"git pull\":" msgstr[1] " Lokala grenar konfigurerade för \"git pull\":" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 msgid " Local refs will be mirrored by 'git push'" msgstr " Lokala referenser speglas av \"git push\"" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, c-format msgid " Local ref configured for 'git push'%s:" 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 +#: builtin/remote.c:1252 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren" -#: builtin/remote.c:1201 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "ta bort refs/remotes/<namn>/HEAD" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "Kan inte bestämma HEAD pÃ¥ fjärren" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "Flera HEAD-grenar pÃ¥ fjärren. Välj en explicit med:" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "Kunde inte ta bort %s" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" msgstr "Inte en giltig referens: %s" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "Kunde inte ställa in %s" -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr " %s kommer bli dinglande!" -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr " %s har blivit dinglande!" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "Rensar %s" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "URL: %s" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr " * [skulle rensa] %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr " * [rensad] %s" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "rensa fjärrar efter hämtning" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "Ingen sÃ¥dan fjärr \"%s\"" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "lägg till gren" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "ingen fjärr angavs" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "manipulera URL:ar för sändning" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "lägg till URL" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "ta bort URL:ar" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "--add --delete ger ingen mening" -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "Felaktig gammalt URL-mönster: %s" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "Ingen sÃ¥dan URL hittades: %s" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 msgid "Will not delete all non-push URLs" msgstr "Kommer inte ta bort alla icke-sänd-URL:er" -#: builtin/remote.c:1569 +#: builtin/remote.c:1564 msgid "be verbose; must be placed before a subcommand" msgstr "var pratsam; mÃ¥ste skrivas före ett underkommando" +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "git repack [flaggor]" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "packa allt i ett enda paket" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "samma som -a, och gör onÃ¥bara objekt lösa" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "ta bort överflödiga paket, och kör git-prune-packed" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "sänd --no-reuse-delta till git-pack-objects" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "sänd --no-reuse-object till git-pack-objects" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "kör inte git-update-server-info" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "sänd --local till git-pack-objects" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "cirkadatum" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "med -A, lös inte upp objekt äldre än detta" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "storlek pÃ¥ fönster använt för deltakomprimering" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "byte" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "samma som ovan, men begränsa minnesstorleken istället för postantal" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "begränsa maximalt deltadjup" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "maximal storlek pÃ¥ varje paketfil" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "misslyckades ta bort \"%s\"" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "git replace [-f] <objekt> <ersättning>" @@ -8353,26 +8719,30 @@ 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>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<format>] [-l [<mönster>]]" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "visa ersättningsreferenser" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "ta bort ersättningsreferenser" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "ersätt referensen om den finns" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "använd detta format" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 msgid "register clean resolutions in index" msgstr "registrera rena lösningar i indexet" @@ -8433,86 +8803,90 @@ msgstr "HEAD är nu pÃ¥ %s" 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:251 +#: builtin/reset.c:262 msgid "be quiet, only report errors" msgstr "var tyst, rapportera endast fel" -#: builtin/reset.c:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "Ã¥terställ HEAD och index" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "Ã¥terställ endast HEAD" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 msgid "reset HEAD, index and working tree" msgstr "Ã¥terställ HEAD, index och arbetskatalog" -#: builtin/reset.c:260 +#: builtin/reset.c:271 msgid "reset HEAD but keep local changes" msgstr "Ã¥terställ HEAD men behÃ¥ll lokala ändringar" -#: builtin/reset.c:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "Kunde inte slÃ¥ upp \"%s\" som en giltig revision." -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "Kan inte tolka objektet \"%s\"" -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "Kunde inte slÃ¥ upp \"%s\" som ett giltigt träd." -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "--patch är inkompatibel med --{hard,mixed,soft}" -#: builtin/reset.c:304 +#: builtin/reset.c:315 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "" "--mixed rekommenderas inte med sökvägar; använd \"git reset -- <sökvägar>\"." -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "Kan inte göra %s Ã¥terställning med sökvägar." -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" msgstr "%s Ã¥terställning tillÃ¥ts inte i ett naket arkiv" -#: builtin/reset.c:336 +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "Oköade ändringar efter Ã¥terställning:" + +#: builtin/reset.c:350 #, c-format msgid "Could not reset index file to revision '%s'." msgstr "Kunde inte Ã¥terställa indexfilen till versionen \"%s\"." -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" -msgstr "Oköade ändringar efter Ã¥terställning:" - -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "Kunde inte skriva ny indexfil." -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "git rev-parse --parseopt [options] -- [<argument>...]" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" msgstr "behÃ¥ll \"--\" sänt som argument" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 msgid "stop parsing after the first non-option argument" msgstr "sluta tolka efter första argument som inte är flagga" -#: builtin/rev-parse.c:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "utdata fast i lÃ¥ng form" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8543,84 +8917,84 @@ msgstr "git cherry-pick [flaggor] <incheckning-igt>..." msgid "git cherry-pick <subcommand>" msgstr "git cherry-pick <underkommando>" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s kan inte användas med %s" -#: builtin/revert.c:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "avsluta revert- eller cherry-pick-sekvens" -#: builtin/revert.c:106 +#: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" msgstr "Ã¥teruppta revert- eller cherry-pick-sekvens" -#: builtin/revert.c:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "avbryt revert- eller cherry-pick-sekvens" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "checka inte in automatiskt" -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "redigera incheckningsmeddelandet" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "nummer pÃ¥ förälder" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "sammanslagninsstrategi" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "alternativ" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "alternativ för sammanslagningsstrategi" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" msgstr "lägg till incheckningsnamn" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "tillÃ¥t snabbspolning" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "behÃ¥ll incheckningar som börjar som tomma" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" msgstr "tillÃ¥t incheckningar med tomt meddelande" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "behÃ¥ll redundanta, tomma incheckningar" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "programfel" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "\"revert\" misslyckades" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "\"cherry-pick\" misslyckades" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "git rm [flaggor] [--] <fil>..." -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8634,7 +9008,7 @@ msgstr[1] "" "följande undermoduler (eller en av deras nästlade undermoduler)\n" "använder en .git-katalog:" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -8642,7 +9016,7 @@ msgstr "" "\n" "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8654,7 +9028,7 @@ msgstr[0] "" msgstr[1] "" "följande filer har köat innehÃ¥ll som skiljer sig bÃ¥de frÃ¥n filen och HEAD:" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" @@ -8662,13 +9036,13 @@ msgstr "" "\n" "(använd -f för att tvinga borttagning)" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "följande fil har ändringar köade i indexet:" msgstr[1] "följande filer har ändringar köade i indexet:" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" @@ -8676,38 +9050,38 @@ msgstr "" "\n" "(använd --cached för att behÃ¥lla filen eller -f för att tvinga borttagning)" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "följande fil har lokala ändringar:" msgstr[1] "följande filer har lokala ändringar:" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "lista inte borttagna filer" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "ta bara bort frÃ¥n indexet" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "överstyr à jour-testet" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "tillÃ¥t rekursiv borttagning" -#: builtin/rm.c:274 +#: builtin/rm.c:275 msgid "exit with a zero status even if nothing matched" msgstr "avsluta med nollstatus även om inget träffades" -#: builtin/rm.c:345 +#: builtin/rm.c:336 #, c-format msgid "not removing '%s' recursively without -r" msgstr "tar inte bort \"%s\" rekursivt utan -r" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm: kan inte ta bort %s" @@ -8721,23 +9095,23 @@ msgstr "git shortlog [<flaggor>] [<versionsintervall>] [[--] <sökväg>...]" msgid "Missing author: %s" msgstr "Författare saknas: %s" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 msgid "sort output according to the number of commits per author" msgstr "sortera utdata enligt antal incheckningar per författare" -#: builtin/shortlog.c:230 +#: builtin/shortlog.c:232 msgid "Suppress commit descriptions, only provides commit count" msgstr "Undertryck beskrivningar, visa bara antal incheckningar" -#: builtin/shortlog.c:232 +#: builtin/shortlog.c:234 msgid "Show the email address of each author" msgstr "Visa e-postadress för varje författare" -#: builtin/shortlog.c:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "w[,i1[,i2]]" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "Radbryt utdata" @@ -8757,67 +9131,67 @@ msgstr "" msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g|--reflog)[=<n>[,<bas>]] [--list] [<ref>]" -#: builtin/show-branch.c:650 +#: builtin/show-branch.c:649 msgid "show remote-tracking and local branches" msgstr "visa fjärrspÃ¥rande och lokala grenar" -#: builtin/show-branch.c:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "visa fjärrspÃ¥rande grenar" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "färga \"*!+-\" enligt grenen" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 msgid "show <n> more commits after the common ancestor" msgstr "visa <n> ytterligare incheckningar efter gemensam anfader" -#: builtin/show-branch.c:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "synonym till more=-1" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "undertyck namnsträngar" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "inkludera aktuell gren" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 msgid "name commits with their object names" msgstr "namnge incheckningar med deras objektnamn" -#: builtin/show-branch.c:665 +#: builtin/show-branch.c:664 msgid "show possible merge bases" msgstr "visa möjliga sammanslaningsbaser" -#: builtin/show-branch.c:667 +#: builtin/show-branch.c:666 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:669 +#: builtin/show-branch.c:668 msgid "show commits in topological order" msgstr "visa incheckningar i topologisk ordning" -#: builtin/show-branch.c:672 +#: builtin/show-branch.c:671 msgid "show only commits not on the first branch" msgstr "visa endast incheckningar inte pÃ¥ den första grenen" -#: builtin/show-branch.c:674 +#: builtin/show-branch.c:673 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 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "sortera topologiskt, behÃ¥ll datumordning när möjligt" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" msgstr "<n>[,<bas>]" -#: builtin/show-branch.c:680 +#: 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" @@ -8845,23 +9219,23 @@ msgstr "visa endast huvuden (kan kombineras med taggar)" msgid "stricter reference checking, requires exact ref path" msgstr "striktare referenskontroll, kräver exakt referenssökväg" -#: builtin/show-ref.c:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "visa HEAD-refrens, även när den skulle filtreras ut" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 msgid "dereference tags into object IDs" msgstr "avreferera taggar till objekt-id" -#: builtin/show-ref.c:180 +#: builtin/show-ref.c:179 msgid "only show SHA1 hash using <n> digits" msgstr "visa SHA1-hash endast med <n> siffror" -#: builtin/show-ref.c:184 +#: builtin/show-ref.c:183 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:186 +#: builtin/show-ref.c:185 msgid "show refs from stdin that aren't in local repository" msgstr "visa referenser frÃ¥n standard in som inte finns i lokalt arkiv" @@ -8886,11 +9260,11 @@ msgstr "ta bort symbolisk referens" msgid "shorten ref output" msgstr "förkorta ref-utdata" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "skäl" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "skäl till uppdateringen" @@ -9055,183 +9429,195 @@ msgstr "visa endast taggar som innehÃ¥ller incheckningen" msgid "print only tags of the object" msgstr "visa endast taggar för objektet" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "--column och -n är inkompatibla" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "Flaggan -n är endast tillÃ¥ten tillsammans med -l." -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "Flaggan --contains är endast tillÃ¥ten tillsammans med -l" -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "Flaggan --points-at är endast tillÃ¥ten tillsammans med -l." -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "endast en av flaggorna -F eller -m tillÃ¥ts." -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "för mÃ¥nga parametrar" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "\"%s\" är inte ett giltigt taggnamn." -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "taggen \"%s\" finns redan" -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "%s: kan inte lÃ¥sa referensen" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "%s: kan inte uppdatera referensen" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "Uppdaterad tagg \"%s\" (var %s)\n" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "git update-index [flaggor] [--] [<fil>...]" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "fortsätt uppdatera även när index inte är à jour" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "refresh: ignorera undermoduler" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "ignorera inte nya filer" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 msgid "let files replace directories and vice-versa" msgstr "lÃ¥t filer ersätta kataloger och omvänt" -#: builtin/update-index.c:728 +#: builtin/update-index.c:730 msgid "notice files missing from worktree" msgstr "lägg märke till filer som saknas i arbetskatalogen" -#: builtin/update-index.c:730 +#: builtin/update-index.c:732 msgid "refresh even if index contains unmerged entries" msgstr "uppdatera även om indexet innehÃ¥ller ej sammanslagna poster" -#: builtin/update-index.c:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "uppdatera statusinformation" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 msgid "like --refresh, but ignore assume-unchanged setting" msgstr "som --refresh, men ignorera assume-unchanged-inställning" -#: builtin/update-index.c:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "<läge> <objekt> <sökväg>" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 msgid "add the specified entry to the index" msgstr "lägg till angiven post i indexet" -#: builtin/update-index.c:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "(+/-)x" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 msgid "override the executable bit of the listed files" msgstr "överstyr exekveringsbiten för angivna filer" -#: builtin/update-index.c:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "markera filer som \"ändras inte\"" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "rensa \"assume-unchanged\"-biten" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "markera filer som \"endast index\"" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "töm \"skip-worktree\"-biten" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 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:765 +#: builtin/update-index.c:767 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:767 +#: builtin/update-index.c:769 msgid "with --stdin: input lines are terminated by null bytes" msgstr "med --stdin: indatarader termineras med null-byte" -#: builtin/update-index.c:769 +#: builtin/update-index.c:771 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:773 +#: builtin/update-index.c:775 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:777 +#: builtin/update-index.c:779 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:781 +#: builtin/update-index.c:783 msgid "only update entries that differ from HEAD" msgstr "uppdatera endast poster som skiljer sig frÃ¥n HEAD" -#: builtin/update-index.c:785 +#: builtin/update-index.c:787 msgid "ignore files missing from worktree" msgstr "ignorera filer som saknas i arbetskatalogen" -#: builtin/update-index.c:788 +#: builtin/update-index.c:790 msgid "report actions to standard output" msgstr "raportera Ã¥tgärder pÃ¥ standard ut" -#: builtin/update-index.c:790 +#: builtin/update-index.c:792 msgid "(for porcelains) forget saved unresolved conflicts" msgstr "(för porslin) glöm sparade olösta konflikter" -#: builtin/update-index.c:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "skriv index i detta format" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 msgid "git update-ref [options] -d <refname> [<oldval>]" msgstr "git update-ref [flaggor] -d <refnamn> [<gammaltvärde>]" -#: builtin/update-ref.c:8 +#: builtin/update-ref.c:10 msgid "git update-ref [options] <refname> <newval> [<oldval>]" msgstr "git update-ref [flaggor] <refnamn> <gammaltvärde> [<nyttvärde>]" -#: builtin/update-ref.c:19 +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "git update-ref [flaggor] --stdin [-z]" + +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "ta bort referensen" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 msgid "update <refname> not the one it points to" msgstr "uppdatera <refnamn> inte det den pekar pÃ¥" +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "standard in har NUL-terminerade argument" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "läs uppdateringar frÃ¥n standard in" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "git update-server-info [--force]" @@ -9286,23 +9672,23 @@ msgstr "" "nÃ¥gra konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n" "<koncept>\" för att läsa mer om specifika underkommandon och koncept." -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "giltig till" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "ingen funktion (bakÃ¥tkompatibilitet)" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "var mer pratsam" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "var mer tyst" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "använd <n> siffror för att visa SHA-1:or" @@ -9438,7 +9824,7 @@ msgstr "" #: git-am.sh:163 msgid "Falling back to patching base and 3-way merge..." msgstr "" -"Faller tillbaka pÃ¥ att pacha grundversionen och trevägssammanslagning..." +"Faller tillbaka pÃ¥ att patcha grundversionen och trevägssammanslagning..." #: git-am.sh:179 msgid "Failed to merge in the changes." @@ -9603,8 +9989,8 @@ msgstr "" # cogito-relaterat #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "kör inte \"bisect\" pÃ¥ ett \"seeked\"-träd" +msgid "won't bisect on cg-seek'ed tree" +msgstr "kör inte \"bisect\" pÃ¥ träd där \"cg-seek\" använts" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" @@ -9740,7 +10126,7 @@ msgstr "" msgid "Pull is not possible because you have unmerged files." msgstr "Du kan inte göra en \"pull\" dÃ¥ du har ändringar som inte checkats in." -#: git-pull.sh:203 +#: git-pull.sh:223 msgid "updating an unborn branch with changes added to the index" msgstr "uppdaterar en ofödd gren med ändringar som lagts till i indexet" @@ -9748,7 +10134,7 @@ msgstr "uppdaterar en ofödd gren med ändringar som lagts till i indexet" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -9759,15 +10145,15 @@ msgstr "" "Varning: snabbspolar din arbetskatalog frÃ¥n\n" "Varning: incheckningen $orig_head." -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "Kan inte slÃ¥ ihop flera grenar i ett tomt huvud." -#: git-pull.sh:264 +#: git-pull.sh:276 msgid "Cannot rebase onto multiple branches" msgstr "Kan inte utföra en \"rebase\" ovanpÃ¥ flera grenar" -#: git-rebase.sh:54 +#: git-rebase.sh:55 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" @@ -9778,16 +10164,16 @@ 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:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "Tillämpade autostash." -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "Kan inte spara $stash_sha1" -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" @@ -9797,31 +10183,31 @@ msgstr "" "Dina ändringar är säkra i stashen.\n" "Du kan när som helst använda \"git stash pop\" eller \"git stash drop\".\n" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." msgstr "Kroken pre-rebase vägrade ombaseringen." -#: git-rebase.sh:195 +#: git-rebase.sh:206 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:329 +#: git-rebase.sh:346 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:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "Ingen ombasering pÃ¥gÃ¥r?" -#: git-rebase.sh:345 +#: git-rebase.sh:362 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:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "Kan inte läsa HEAD" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -9829,12 +10215,12 @@ msgstr "" "Du mÃ¥ste redigera alla sammanslagningskonflikter och\n" "därefter markera dem som lösta med git add" -#: git-rebase.sh:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "Kunde inte flytta tillbaka till $head_name" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9855,66 +10241,66 @@ msgstr "" "och kör programmet igen. Jag avslutar ifall du fortfarande har\n" "nÃ¥got av värde där." -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "ogiltig uppström $upstream_name" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: mer än en sammanslagningsbas finns" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ingen sammanslagningsbas finns" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Peka pÃ¥ en giltig incheckning: $onto_name" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "ödesdigert: ingen sÃ¥dan gren: $branch_name" -#: git-rebase.sh:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "Kan inte utföra \"autostash\"" -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "Skapade autostash: $stash_abbrev" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "Checka in eller använd \"stash\" pÃ¥ dem." -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Aktuell gren $branch_name är à jour." -#: git-rebase.sh:552 +#: git-rebase.sh:581 #, 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:563 +#: git-rebase.sh:592 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Ändringar frÃ¥n $mb till $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:572 +#: git-rebase.sh:601 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:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Snabbspolade $branch_name till $onto_name." @@ -9962,7 +10348,7 @@ msgstr "Kan inte uppdatera $ref_stash med $w_commit" #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" @@ -9971,100 +10357,85 @@ msgstr "" "fel: felaktig flagga för \"stash save\": $option\n" " För att ange ett meddelande, använd git stash save -- \"$option\"" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" msgstr "Inga lokala ändringar att spara" -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "" -"Följande ospÃ¥rade ändringar skulle INTE sparas utan mÃ¥ste tas bort med " -"\"stash save\":" - -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "" -"Avbryter. Överväg att använda antingen flaggan --force eller --include-" -"untracked." - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "Kan inte initiera \"stash\"" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "Kan inte spara aktuell status" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "Kan inte ta bort ändringar i arbetskatalogen" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." msgstr "Ingen \"stash\" hittades." -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "För mÃ¥nga revisioner angivna: $REV" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "$reference är inte en giltig referens." -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "\"$args\" är inte en \"stash\"-liknande incheckning" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "\"$args\" är inte en \"stash\"-referens" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "kan inte uppdatera indexet" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" msgstr "Kan inte tillämpa en \"stash\" mitt i en sammanslagning" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "Konflikter i indexet. Testa utan --index." -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "Kunde inte spara indexträd" -#: git-stash.sh:503 +#: git-stash.sh:491 msgid "Cannot unstage modified files" msgstr "Kan inte ta bort ändrade filer ur kön" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." msgstr "Indexet har inte tagits ur kön." -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Kastade ${REV} ($s)" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Kunde inte kasta \"stash\"-post" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "Inget grennamn angavs" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "(För att Ã¥terställa dem, skriv \"git stash apply\")" @@ -10178,56 +10549,56 @@ msgstr "Misslyckades registrera undermodulen \"$sm_path\"" msgid "Entering '$prefix$displaypath'" msgstr "GÃ¥r in i \"$prefix$displaypath\"" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "" "Stoppar pÃ¥ \"$prefix$displaypath\"; skriptet returnerade en status skild " "frÃ¥n noll." -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "" "Hittade ingen url för undermodulsökvägen \"$displaypath\" i .gitmodules" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\"" -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "" "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\"" -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "" "Misslyckades registrera uppdateringsläge för undermodulsökväg \"$displaypath" "\"" -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "Använd \".\" om du verkligen vill avinitiera alla undermoduler" -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "" "Undermodulens arbetskatalog \"$displaypath\" innehÃ¥ller katalogen \".git\"" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" msgstr "" "(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " @@ -10236,28 +10607,28 @@ msgstr "" "Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" " "kastar bort dem" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "Rensade katalogen \"$displaypath\"" -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\"" -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\"" -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "" "Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\"" -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" @@ -10266,117 +10637,143 @@ msgstr "" "Undermodulen \"$displaypath\" har inte initierats\n" "Kanske du vill köra \"update --init\"?" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\"" -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, 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:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\"" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\"" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\"" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "Kan inte slÃ¥ ihop \"$sha1\" i undermodulsökvägen \"$displaypath\"" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\"" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" msgstr "" "Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$prefix$sm_path\"" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\"" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\"" -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\"" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\"" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 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:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "oväntat läge $mod_dst" -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr " Varning: $display_name innehÃ¥ller inte incheckningen $sha1_src" -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr " Varning: $display_name innehÃ¥ller inte incheckningen $sha1_dst" -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" " Varning: $display_name innehÃ¥ller inte incheckningarna $sha1_src och " "$sha1_dst" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "blob" -#: git-submodule.sh:1155 -msgid "Submodules changed but not updated:" -msgstr "Undermoduler ändrade men inte uppdaterade:" - -#: git-submodule.sh:1157 -msgid "Submodule changes to be committed:" -msgstr "Undermodulers ändringar att checka in:" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\"" -#: git-submodule.sh:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "Synkroniserar undermodul-url för \"$displaypath\"" +#~ msgid "copied: %s -> %s" +#~ msgstr "kopierad: %s -> %s" + +#~ msgid "deleted: %s" +#~ msgstr "borttagen: %s" + +#~ msgid "modified: %s" +#~ msgstr "ändrad: %s" + +#~ msgid "renamed: %s -> %s" +#~ msgstr "namnbyte: %s -> %s" + +#~ msgid "unmerged: %s" +#~ msgstr "osammansl.: %s" + +#~ msgid "input paths are terminated by a null character" +#~ msgstr "sökvägar avdelas med null-tecken" + +#~ msgid "done\n" +#~ msgstr "klart\n" + +#~ msgid "" +#~ "The following untracked files would NOT be saved but need to be removed " +#~ "by stash save:" +#~ msgstr "" +#~ "Följande ospÃ¥rade ändringar skulle INTE sparas utan mÃ¥ste tas bort med " +#~ "\"stash save\":" + +#~ msgid "" +#~ "Aborting. Consider using either the --force or --include-untracked option." +#~ msgstr "" +#~ "Avbryter. Överväg att använda antingen flaggan --force eller --include-" +#~ "untracked." + #~ msgid " (fix conflicts and then run \"git am --resolved\")" #~ msgstr " (rätta konflikter och kör sedan \"git am --resolved\")" @@ -10498,9 +10895,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\"" #~ 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" @@ -1,22 +1,23 @@ # Vietnamese translation for GIT-CORE. +# Bản dịch tiếng Việt dà nh cho GIT-CORE. # This file is distributed under the same license as the git-core package. -# First translated by Trần Ngá»c Quân <vnwildman@gmail.com>, 2012-2013. +# First translated by Trần Ngá»c Quân <vnwildman@gmail.com>, 2012-2014. # Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com>, 2012. # msgid "" msgstr "" -"Project-Id-Version: git-v1.8.4-rc1-22-gb8ecf23\n" +"Project-Id-Version: git v1.9-pu\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2013-08-06 14:10+0800\n" -"PO-Revision-Date: 2013-08-06 14:28+0700\n" +"POT-Creation-Date: 2014-02-01 08:06+0800\n" +"PO-Revision-Date: 2014-02-03 07:30+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" -"Team-Website: <http://translationproject.org/team/vi.html>\n" "Plural-Forms: nplurals=2; plural=1;\n" +"X-Language-Team-Website: <http://translationproject.org/team/vi.html>\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-Basepath: ../\n" "X-Generator: Poedit 1.5.5\n" @@ -24,7 +25,7 @@ msgstr "" #: advice.c:57 #, c-format msgid "hint: %.*s\n" -msgstr "gợi ý: %.*s\n" +msgstr "tìm thấy: %.*s\n" #. #. * Message used both when 'git commit' fails and when @@ -61,71 +62,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <kho> [--exec <lệnh>] --list" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "đặc tả đưá»ng dẫn “%s†không khá»›p vá»›i bất kỳ táºp tin nà o" + +#: archive.c:327 msgid "fmt" msgstr "fmt" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "định dạng lưu trữ" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" msgstr "tiá»n tố" -#: archive.c:325 +#: archive.c:329 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:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "táºp-tin" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "ghi kho lưu và o táºp tin nà y" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "Ä‘á»c .gitattributes trong thư mục là m việc" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "liệt kê các táºp tin được lưu trữ và o stderr (đầu ra lá»—i tiêu chuẩn)" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "chỉ lưu (không nén)" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "nén nhanh hÆ¡n" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "nén nhá» hÆ¡n" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "liệt kê các kiểu nén được há»— trợ" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "kho" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 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:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "lệnh" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "đưá»ng dẫn đến lệnh git-upload-pack trên máy chá»§" @@ -140,38 +146,37 @@ msgstr "" #: branch.c:60 #, c-format msgid "Not setting branch %s as its own upstream." -msgstr "Chưa cà i đặt nhánh %s như là thượng nguồn (upstream) cá»§a nó." +msgstr "Chưa cà i đặt nhánh %s như là thượng nguồn cá»§a nó." #: branch.c:82 #, c-format msgid "Branch %s set up to track remote branch %s from %s by rebasing." -msgstr "" -"Nhánh %s cà i đặt để theo dõi vết nhánh máy chá»§ %s từ %s bằng cách rebase." +msgstr "Nhánh %s cà i đặt để theo dõi nhánh máy chá»§ %s từ %s bằng cách rebase." #: branch.c:83 #, c-format msgid "Branch %s set up to track remote branch %s from %s." -msgstr "Nhánh %s cà i đặt để theo vết nhánh máy chá»§ %s từ %s." +msgstr "Nhánh %s cà i đặt để theo dõi nhánh máy chá»§ %s từ %s." #: branch.c:87 #, c-format msgid "Branch %s set up to track local branch %s by rebasing." -msgstr "Nhánh %s cà i đặt để theo vết nhánh ná»™i bá»™ %s bằng cách rebase." +msgstr "Nhánh %s cà i đặt để theo dõi nhánh ná»™i bá»™ %s bằng cách rebase." #: branch.c:88 #, c-format msgid "Branch %s set up to track local branch %s." -msgstr "Nhánh %s cà i đặt để theo vết nhánh ná»™i bá»™ %s." +msgstr "Nhánh %s cà i đặt để theo dõi nhánh ná»™i bá»™ %s." #: branch.c:92 #, c-format msgid "Branch %s set up to track remote ref %s by rebasing." -msgstr "Nhánh %s cà i đặt để theo vết nhánh máy chá»§ %s bằng cách rebase." +msgstr "Nhánh %s cà i đặt để theo dõi nhánh máy chá»§ %s bằng cách rebase." #: branch.c:93 #, c-format msgid "Branch %s set up to track remote ref %s." -msgstr "Nhánh %s cà i đặt để theo vết tham chiếu máy chá»§ %s." +msgstr "Nhánh %s cà i đặt để theo dõi tham chiếu máy chá»§ %s." #: branch.c:97 #, c-format @@ -187,12 +192,12 @@ msgstr "Nhánh %s cà i đặt để theo dõi tham chiếu ná»™i bá»™ %s." #: branch.c:118 #, c-format msgid "Tracking not set up: name too long: %s" -msgstr "Theo vết chưa được cà i đặt: tên quá dà i: %s" +msgstr "Việc theo dõi chưa được cà i đặt: tên quá dà i: %s" #: branch.c:137 #, c-format msgid "Not tracking: ambiguous information for ref %s" -msgstr "Không theo vết: thông tin chưa rõ rà ng cho tham chiếu %s" +msgstr "Không theo dõi: thông tin chưa rõ rà ng cho tham chiếu %s" #: branch.c:182 #, c-format @@ -208,19 +213,19 @@ msgstr "Äã có nhánh mang tên “%sâ€." msgid "Cannot force update the current branch." msgstr "Không thể ép buá»™c cáºp nháºt nhánh hiện hà nh." -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "" -"Không thể cà i đặt thông tin theo vết; Ä‘iểm bắt đầu “%s†không phải là má»™t " +"Không thể cà i đặt thông tin theo dõi; Ä‘iểm bắt đầu “%s†không phải là má»™t " "nhánh." -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" -msgstr "nhánh dòng ngược đã yêu cầu “%s†chưa sẵn có" +msgstr "nhánh thượng nguồn đã yêu cầu “%s†không tồn tại" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -232,101 +237,101 @@ msgid "" "\"git push -u\" to set the upstream config as you push." msgstr "" "\n" -"Nếu bạn có ý định trên cÆ¡ sở công việc cá»§a bạn trên nhánh dòng ngược\n" +"Nếu bạn có ý định “cải tổ†công việc cá»§a bạn trên nhánh thượng nguồn\n" "(upstream) cái mà đã sẵn có trên máy chá»§, bạn cần chạy\n" "lệnh \"git fetch\" để lấy nó vá».\n" "\n" -"Nếu bạn có ý định push lênh má»™t nhánh ná»™i bá»™ má»›i cái mà \n" +"Nếu bạn có ý định push lên má»™t nhánh ná»™i bá»™ má»›i cái mà \n" "sẽ theo dõi bản đối chiếu máy chá»§ cá»§a nó, bạn cần dùng lệnh\n" -"\"git push -u\" để đặt cấu hình dòng ngược bạn muốn push." +"\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push." -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "Không phải tên đối tượng hợp lệ: “%sâ€." -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "Tên đối tượng chưa rõ rà ng: “%sâ€." -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "Nhánh không hợp lệ: “%sâ€." -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "Gặp lá»—i khi khóa tham chiếu (ref) để cáºp nháºt" -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "Gặp lá»—i khi ghi tham chiếu (ref)" -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "“%s†không giống như táºp tin v2 bundle (định dạng dump cá»§a git)" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" -msgstr "phần đầu (header) không được thừa nháºn: %s%s (%d)" +msgstr "phần đầu không được thừa nháºn: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "không thể mở “%sâ€" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" -msgstr "Kho chứa thiếu những lần chuyển giao (commit) cần trước hết nà y:" +msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết nà y:" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "cà i đặt việc di chuyển qua các Ä‘iểm xét duyệt gặp lá»—i" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "Bundle chứa tham chiếu (ref) nà y:" msgstr[1] "Bundle chứa %d tham chiếu (ref):" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "Lệnh bundle ghi lại toà n bá»™ lịch sá»." -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "Lệnh bundle yêu cầu tham chiếu nà y:" msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu (refs) nà y:" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "rev-list đã chết" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "đối số không được thừa nháºn: %s" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "th.chiếu “%s†bị loại trừ bởi các tùy chá»n rev-list" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "Từ chối tạo má»™t bundle trống rá»—ng." #: bundle.c:398 msgid "Could not spawn pack-objects" -msgstr "Không thể sản sinh pack-objects" +msgstr "Không thể sản sinh đối tượng gói" #: bundle.c:416 msgid "pack-objects died" @@ -355,16 +360,16 @@ msgstr "%s %s không phải là má»™t lần commit!" msgid "memory exhausted" msgstr "hết bá»™ nhá»›" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "Không thể chạy “git rev-listâ€" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "gặp lá»—i khi ghi và o rev-list: %s" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "gặp lá»—i khi đóng đầu và o chuẩn stdin cá»§a rev-list: %s" @@ -436,22 +441,27 @@ msgid_plural "%lu years ago" msgstr[0] "%lu năm trước" msgstr[1] "%lu năm trước" -#: diff.c:112 +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "gặp lá»—i khi Ä‘á»c táºp-tin-thứ-tá»± “%sâ€" + +#: diff.c:113 #, 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" -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " Không hiểu đối số dirstat “%sâ€\n" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "Không hiểu giá trị cho biến cấu hình “diff.submoduleâ€: “%sâ€" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -460,7 +470,7 @@ msgstr "" "Tìm thấy các lá»—i trong biến cấu hình “diff.dirstatâ€:\n" "%s" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -469,7 +479,7 @@ msgstr "" "Gặp lá»—i khi phân tÃch đối số tùy chá»n --dirstat/-X:\n" "%s" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Gặp lá»—i khi phân tÃch đối số tùy chá»n --submodule: “%sâ€" @@ -496,17 +506,17 @@ msgstr "không thể tạo táºp tin tạm thá»i “%sâ€: %s" msgid "failed writing detached signature to '%s': %s" msgstr "gặp lá»—i khi ghi chữ ký Ä‘Ãnh kèm và o “%sâ€: %s" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "“%sâ€: không thể Ä‘á»c %s" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "“%sâ€: %s" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "“%sâ€: Ä‘á»c ngắn %s" @@ -518,11 +528,11 @@ msgstr "các lệnh git sẵn có trong thư mục “%sâ€:" #: help.c:217 msgid "git commands available from elsewhere on your $PATH" -msgstr "các lệnh git sẵn sà ng để dùng từ má»™t nÆ¡i khác trong $PATH cá»§a bạn" +msgstr "các lệnh git sẵn có từ má»™t nÆ¡i khác trong $PATH cá»§a bạn" #: help.c:233 msgid "The most commonly used git commands are:" -msgstr "Những lệnh git hay được sá» dụng nhất là :" +msgstr "Những lệnh git hay được dùng nhất là :" #: help.c:290 #, c-format @@ -544,7 +554,7 @@ msgid "" "Continuing under the assumption that you meant '%s'" msgstr "" "CẢNH BÃO: Bạn đã gá»i lệnh Git có tên “%sâ€, mà nó lại không có sẵn.\n" -"Giả định rằng ý bạn là “%sâ€" +"Tiếp tục và coi rằng ý bạn là “%sâ€" #: help.c:374 #, c-format @@ -577,10 +587,10 @@ msgstr "%s: %s - %s" #: merge.c:56 msgid "failed to read the cache" -msgstr "gặp lá»—i khi Ä‘á»c bá»™ nhá»› tạm" +msgstr "gặp lá»—i khi Ä‘á»c bá»™ nhá»› đệm" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 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" @@ -617,7 +627,7 @@ msgstr ": có lẽ là má»™t xung đột D/F?" #: merge-recursive.c:709 #, 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 dõi tại “%sâ€" #: merge-recursive.c:749 #, c-format @@ -629,7 +639,7 @@ msgstr "không thể Ä‘á»c đối tượng %s “%sâ€" msgid "blob expected for %s '%s'" msgstr "đối tượng blob được mong đợi cho %s “%sâ€" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "gặp lá»—i khi mở “%sâ€" @@ -637,7 +647,7 @@ msgstr "gặp lá»—i khi mở “%sâ€" #: merge-recursive.c:782 #, 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 má»m (symlink) “%sâ€" #: merge-recursive.c:785 #, c-format @@ -679,7 +689,7 @@ msgstr "" msgid "rename" msgstr "đổi tên" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "đã đổi tên" @@ -742,7 +752,7 @@ msgstr "đối tượng %s không phải là má»™t blob" msgid "modify" msgstr "sá»a đổi" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "đã sá»a" @@ -764,7 +774,7 @@ msgstr "Äã bá» qua %s (đã có sẵn lần hòa trá»™n nà y)" msgid "Auto-merging %s" msgstr "Tá»±-động-hòa-trá»™n %s" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "mô-Ä‘un-con" @@ -829,22 +839,22 @@ msgstr[1] "tìm thấy %u tổ tiên chung:" #: merge-recursive.c:1941 msgid "merge returned no commit" -msgstr "hòa trá»™n không trả vá» lần chuyển giao (commit) nà o" +msgstr "hòa trá»™n không trả vá» lần chuyển giao nà o" #: merge-recursive.c:1998 #, c-format msgid "Could not parse object '%s'" msgstr "Không thể phân tÃch đối tượng “%sâ€" -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "Không thể ghi bảng mục lục" #: notes-utils.c:40 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ú" +"Không thể chuyển giao cây ghi chú chưa được khởi tạo hoặc không được tham " +"chiếu" #: notes-utils.c:81 #, c-format @@ -854,7 +864,7 @@ msgstr "Giá trị notes.rewriteMode sai: “%sâ€" #: notes-utils.c:91 #, 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/)" +msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoà i refs/notes/)" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value @@ -863,74 +873,173 @@ msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoà i cá»§a refs/notes/)" msgid "Bad %s value: '%s'" msgstr "Giá trị %s sai: “%sâ€" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "không thể phân tÃch đối tượng: “%sâ€" -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "..." -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "cách dùng: %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr " hoặc: %s" -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "-Sá»" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "" +"các cà i đặt đặc tả đưá»ng dẫn “glob†và “noglob†toà n cục là xung khắc nhau" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" +"cà i đặt đặc tả đưá»ng dẫn “literal†toà n cục là xung khắc vá»›i các cà i đặt đặc " +"tả đưá»ng dẫn toà n cục khác" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "tham số không hợp lệ cho “tiá»n tố†mà u nhiệm đặc tả đưá»ng đẫn" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "Số mà u nhiệm đặc tả đưá»ng dẫn không hợp lệ “%.*s†trong “%sâ€" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "Thiếu “)†tại cuối cá»§a số mà u nhiệm đặc tả đưá»ng dẫn trong “%sâ€" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "Chưa viết mã cho số mà u nhiệm đặc tả đưá»ng dẫn “%c†trong “%sâ€" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s: “literal†và “glob†xung khắc nhau" + +#: pathspec.c:241 #, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "ÄÆ°á»ng dẫn “%s†thì ở trong mô-Ä‘un-con “%.*sâ€" +msgid "%s: '%s' is outside repository" +msgstr "%s: “%s†ngoà i má»™t kho chứa" -#: pathspec.c:99 +#: pathspec.c:291 #, 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" +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "Äặc tả đưá»ng dẫn “%s†thì ở trong mô-Ä‘un-con “%.*sâ€" -#: remote.c:1788 +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "%s: số mầu nhiệm đặc tả đưá»ng dẫn chưa được há»— trợ bởi lệnh nà y: %s" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "đặc tả đưá»ng dẫn “%s†vượt ra ngoà i liên kết má»m" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +"Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n" +"Có lẽ bạn đã quên thêm hoặc là “:/†hoặc là “.â€?" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "Không thể lấy vá» cả %s và %s cho %s" + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "%s thưá»ng theo dõi %s, không phải %s" + +#: remote.c:761 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "%s theo dõi cả %s và %s" + +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "Lá»—i ná»™i bá»™" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "" +"Nhánh cá»§a bạn dá»±a trên cÆ¡ sở là “%sâ€, nhưng trên thượng nguồn không còn.\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (dùng \" git branch --unset-upstream\" để sá»a)\n" + +#: remote.c:1878 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "Nhánh cá»§a bạn đã cáºp nháºt vá»›i “%sâ€.\n" + +#: remote.c:1882 #, 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.\n" +msgstr[1] "Nhánh cá»§a bạn là đầu cá»§a “%s†bởi %d lần chuyển giao.\n" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (dùng \"git push\" để xuất bản các lần chuyển giao ná»™i bá»™ cá»§a bạn)\n" -#: remote.c:1797 +#: remote.c:1891 #, 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" +"Nhánh cá»§a bạn ở đằng sau “%s†%d lần chuyển giao, 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" +"Nhánh cá»§a bạn ở đằng sau “%s†%d lần chuyển giao, và có thể được fast-" +"forward.\n" -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr " (dùng \"git pull\" để cáºp nháºt nhánh ná»™i bá»™ cá»§a bạn)\n" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -940,13 +1049,13 @@ msgid_plural "" "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" -"và có %d và %d lần chuyển giao (commit) khác nhau cho từng cái,\n" +"và có %d và %d lần chuyển giao khác nhau cho từng cái,\n" "tương ứng vá»›i má»—i lần.\n" msgstr[1] "" "Your branch and “%s†have diverged,\n" "and have %d and %d different commit each, respectively.\n" -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr "" " (dùng \"git pull\" để hòa trá»™n nhánh trên máy chá»§ và o trong nhánh cá»§a " @@ -954,21 +1063,21 @@ msgstr "" #: run-command.c:80 msgid "open /dev/null failed" -msgstr "gặp lá»—i khi mở /dev/null" +msgstr "gặp lá»—i khi mở “/dev/nullâ€" #: run-command.c:82 #, c-format msgid "dup2(%d,%d) failed" msgstr "dup2(%d,%d) gặp lá»—i" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "Không thể mở “%s†để ghi" -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "Không thể ghi và o “%sâ€" @@ -989,9 +1098,9 @@ msgid "" 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à chuyển giao kết quả bằng lệnh “git commitâ€" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "Không thể ghi và o %s" @@ -1011,208 +1120,206 @@ msgstr "Các thay đổi ná»™i bá»™ cá»§a bạn có thể bị ghi đè bởi lá #: sequencer.c:268 msgid "Commit your changes or stash them to proceed." -msgstr "Chuyển giao (commit) các thay đổi cá»§a bạn hay stash chúng để xá» lý." +msgstr "Chuyển giao các thay đổi cá»§a bạn hay tạm cất (stash) chúng để xá» lý." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:324 +#: sequencer.c:325 #, 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:355 +#: sequencer.c:356 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:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "Không thể cáºp nháºt cây bá»™ nhá»› đệm\n" -#: sequencer.c:422 +#: sequencer.c:423 #, 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:427 +#: sequencer.c:428 #, 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" +msgstr "Không thể phân tÃch lần chuyển giao cha mẹ “%sâ€\n" -#: sequencer.c:493 +#: sequencer.c:494 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:512 +#: sequencer.c:513 #, 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 %s là má»™t lần hòa trá»™n nhưng không đưa ra tùy chá»n -m." -#: sequencer.c:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" -msgstr "Lần chuyển giao (commit) %s không có cha mẹ %d" +msgstr "Lần chuyển giao %s không có cha mẹ %d" -#: sequencer.c:524 +#: sequencer.c:525 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" -"Luồng chÃnh đã được chỉ ra nhưng lần chuyển giao (commit) %s không phải là " -"má»™t lần hòa trá»™n." +"Luồng chÃnh đã được chỉ ra nhưng lần chuyển giao %s không phải là má»™t lần " +"hòa trá»™n." #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:537 +#: sequencer.c:538 #, 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:541 +#: sequencer.c:542 #, 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" +msgstr "Không thể lấy ghi chú lần chuyển giao cho %s" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "không thể revert %s... %s" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "không thể apply (áp dụng miếng vá) %s... %s" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" -msgstr "lần chuyển giao (commit) trống rá»—ng đặt là hợp quy cách" +msgstr "lần chuyển giao trống rá»—ng đặt là hợp quy cách" -#: sequencer.c:672 +#: sequencer.c:673 #, 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:677 +#: sequencer.c:678 #, 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:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "Không thể %s trong khi %s" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "Không phân tÃch được dòng %d." -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." -msgstr "Không có lần chuyển giao (commit) nà o được phân tÃch." +msgstr "Không có lần chuyển giao nà o được phân tÃch." -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "Không thể mở %s" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "Không thể Ä‘á»c %s." -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Bảng chỉ thị không thể dùng được: %s" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "Khóa không đúng: %s" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "Giá trị không hợp lệ %s: %s" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "Bảng tùy chá»n dị hình: %s" -#: sequencer.c:850 +#: sequencer.c:851 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" +msgstr "có má»™t thao tác “cherry-pick†hoặc “revert†đang được thá»±c hiện" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "hãy thá» \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:855 +#: sequencer.c:856 #, 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:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "Lá»—i bao bá»c %s." -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "không cherry-pick hay revert trong tiến trình" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "không thể phân giải HEAD" -#: sequencer.c:894 +#: sequencer.c:895 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:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "không thể mở %s: %s" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "không thể Ä‘á»c %s: %s" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" -msgstr "kết thúc táºp tin đột xuất" +msgstr "gặp kết thúc táºp tin đột xuất" -#: sequencer.c:926 +#: sequencer.c:927 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "táºp tin HEAD “pre-cherry-pick†đã lưu “%s†bị há»ng" -#: sequencer.c:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." -msgstr "Không thể định dạng %s." +msgstr "Không thể định dạng “%sâ€." -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s: không thể cherry-pick má»™t %s" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "%s: Ä‘iểm xét duyệt sai" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" -msgstr "Không thể revert má»™t lần chuyển giao (commit) khởi tạo" +msgstr "Không thể revert má»™t lần chuyển giao khởi tạo" -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "Không thể cherry-pick và o má»™t đầu (head) trống rá»—ng" -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1236,392 +1343,476 @@ msgstr "" "nà y\n" "bằng cách chạy lệnh \"git config advice.objectNameWarning false\"" -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "HEAD không chỉ đến má»™t nhánh nà o cả" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "Không có nhánh nà o như thế: “%sâ€" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" -msgstr "Không có thượng nguồn (upstream) được cấu hình cho nhánh “%sâ€" +msgstr "Không có thượng nguồn được cấu hình cho nhánh “%sâ€" -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "" -"Nhánh thượng nguồn (upstream) “%s†không được lưu lại như là má»™t nhánh " -"“remote-trackingâ€" +"Nhánh thượng nguồn “%s†không được lưu lại như là má»™t nhánh “remote-trackingâ€" + +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" +"Không thể thay đổi .gitmodules chưa hòa trá»™n, hãy giải quyết xung đột trá»™n " +"trước" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "Không thể tìm thấy phần trong .gitmodules nÆ¡i mà đưá»ng_dẫn=%s" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "Không thể cáºp nháºt mục .gitmodules %s" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "Không thể gỡ bá» mục .gitmodules dà nh cho %s" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "không tìm thấy .gitmodules trong bảng mục lục" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "gặp lá»—i khi Ä‘á»c cáºp nháºt .gitmodules" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "không thể lấy thống kê .gitmodules đã cáºp nháºt" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "không thể gỡ bá» .gitmodules từ mục lục" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "gặp lá»—i khi thêm .gitmodules đã cáºp nháºt" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "gặp lá»—i khi tổ chức .gitmodules đã cáºp nháºt" + +#: submodule.c:1144 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â€" -#: wrapper.c:408 +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "Không thể đặt “core.worktree†trong “%sâ€." + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "tên lược đồ URL không hợp lệ, hoặc thiếu háºu tố “://â€" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "thoát chuá»—i %XX không hợp lệ" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "thiếu máy chá»§ và lược đồ thì không phải là giao thức “file:â€" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "URL kiểu “file:†không được chứa cổng" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "có các ký tá»± không hợp lệ trong tên máy" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "tên cổng không hợp lệ" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "Ä‘oạn đưá»ng dẫn “..†không hợp lệ" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "không thể truy cáºp “%sâ€: %s" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "không thể truy cáºp “%sâ€" -#: wrapper.c:440 +#: wrapper.c:454 #, 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:441 +#: wrapper.c:455 msgid "no such user" msgstr "không có ngưá»i dùng như váºy" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "Những đưá»ng dẫn chưa được hòa trá»™n:" -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" -msgstr " (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á» ra khá»i bệ phóng)" -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" -msgstr " (dùng \"git rm --cached <táºp-tin>...\" để bá» trạng thái (stage))" +msgstr " (dùng \"git rm --cached <táºp-tin>...\" để bá» ra khá»i bệ phóng)" -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr " (dùng \"git add <táºp-tin>...\" để đánh dấu là cần giải quyết)" -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" -" (dùng \"git add/rm <táºp-tin>...\" như là má»™t cách thÃch hợp để đánh dấu " -"là cần được giải quyết)" +" (dùng \"git add/rm <táºp-tin>...\" như là má»™t cách thÃch hợp để đánh dấu là " +"cần được giải quyết)" -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr " (dùng \"git rm <táºp-tin>...\" để đánh dấu là cần giải quyết)" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "Những thay đổi sẽ được chuyển giao:" -#: wt-status.c:207 +#: wt-status.c:216 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 chưa được đặt lên bệ phóng để chuyển giao:" -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" -msgstr "" -" (dùng \"git add <táºp-tin>...\" để cáºp nháºt những gì cần chuyển giao " -"(commit))" +msgstr " (dùng \"git add <táºp-tin>...\" để cáºp nháºt những gì sẽ chuyển giao)" -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" " (dùng \"git add/rm <táºp-tin>...\" để cáºp nháºt những gì sẽ được chuyển giao)" -#: wt-status.c:214 +#: wt-status.c:223 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)" +" (dùng \"git checkout -- <táºp-tin>...\" để loại bá» các thay đổi trong thư " +"mục là m việc)" -#: wt-status.c:216 +#: wt-status.c:225 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)" +" (chuyển giao hoặc là loại bá» các ná»™i dung chưa được theo dõi hay đã sá»a " +"chữa trong mô-Ä‘un-con)" -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" -" (dùng \"git %s <táºp-tin>...\" để thêm và o những gì cần chuyển giao " -"(commit))" +" (dùng \"git %s <táºp-tin>...\" để thêm và o những gì cần được chuyển giao)" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "lá»—i" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "bị xóa bởi cả hai:" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "được thêm và o bởi chúng ta:" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "bị xóa Ä‘i bởi há»:" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "được thêm và o bởi há»:" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "bị xóa bởi chúng ta:" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "được thêm và o bởi cả hai:" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "bị sá»a bởi cả hai:" -#: wt-status.c:286 -msgid "new commits, " -msgstr "lần chuyển giao (commit) má»›i, " +#: wt-status.c:275 +msgid "new file" +msgstr "táºp tin má»›i" -#: wt-status.c:288 -msgid "modified content, " -msgstr "ná»™i dung bị sá»a đổi, " +#: wt-status.c:277 +msgid "copied" +msgstr "đã chép" -#: wt-status.c:290 -msgid "untracked content, " -msgstr "ná»™i dung chưa được theo dõi, " +#: wt-status.c:279 +msgid "deleted" +msgstr "bị xoá" -#: wt-status.c:307 -#, c-format -msgid "new file: %s" -msgstr "táºp tin má»›i: %s" +#: wt-status.c:285 +msgid "typechange" +msgstr "đổi-kiểu" -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" -msgstr "đã sao chép: %s -> %s" +#: wt-status.c:287 +msgid "unknown" +msgstr "không hiểu" -#: wt-status.c:313 -#, c-format -msgid "deleted: %s" -msgstr "đã xóa: %s" +#: wt-status.c:289 +msgid "unmerged" +msgstr "chưa hòa trá»™n" -#: wt-status.c:316 -#, c-format -msgid "modified: %s" -msgstr "đã sá»a đổi: %s" +#: wt-status.c:336 +msgid "new commits, " +msgstr "lần chuyển giao má»›i, " -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" -msgstr "đã đổi tên: %s -> %s" +#: wt-status.c:338 +msgid "modified content, " +msgstr "ná»™i dung bị sá»a đổi, " -#: wt-status.c:322 -#, c-format -msgid "typechange: %s" -msgstr "đổi-kiểu: %s" +#: wt-status.c:340 +msgid "untracked content, " +msgstr "ná»™i dung chưa được theo dõi, " -#: wt-status.c:325 +#: wt-status.c:357 #, c-format -msgid "unknown: %s" -msgstr "không hiểu: %s" +msgid "bug: unhandled diff status %c" +msgstr "lá»—i: không thể tiếp nháºn trạng thái lệnh diff %c" -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" -msgstr "chưa hòa trá»™n: %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "Những mô-Ä‘un-con đã bị thay đổi nhưng chưa được cáºp nháºt:" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "lá»—i: không lấy được trạng thái lệnh diff %c" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "Những mô-Ä‘un-con thay đổi đã được chuyển giao:" + +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"Không động đến đưá»ng ở trên.\n" +"Má»i thứ phÃa dưới sẽ được xóa bá»." -#: wt-status.c:803 +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "Bạn có những đưá»ng dẫn chưa được hòa trá»™n." -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" -msgstr " (sá»a các xung đột sau đó chạy \"git commit\")" +msgstr " (sá»a các xung đột rồi chạy \"git commit\")" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn Ä‘ang hòa trá»™n." -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr " (dùng \"git commit\" để hoà n tất việc hòa trá»™n)" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." msgstr "Bạn Ä‘ang ở giữa cá»§a má»™t phiên “amâ€." -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "Miếng vá hiện tại bị trống rá»—ng." -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr " (sá»a các xung đột và sau đó chạy lệnh \"git am --continue\")" -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (dùng \"git am --skip\" để bá» qua miếng vá nà y)" -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr " (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thá»§y)" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." -msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc rebase nhánh “%s†trên “%sâ€." +msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc “rebase†nhánh “%s†trên “%sâ€." -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 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)." +msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc “rebase†(“cải tổâ€)." -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" -msgstr " (sá»a các xung đột và sau đó chạy lệnh \"git rebase --continue\")" +msgstr "" +" (sá»a các xung đột và sau đó chạy lệnh “cải tổ†\"git rebase --continue\")" -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" -msgstr " (dùng \"git rebase --skip\" để bá» qua lần vá nà y)" +msgstr " (dùng lệnh “cải tổ†\"git rebase --skip\" để bá» qua lần vá nà y)" -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" -msgstr " (dùng \"git rebase --abort\" để check-out nhánh nguyên thá»§y)" +msgstr "" +" (dùng lệnh “cải tổ†\"git rebase --abort\" để check-out nhánh nguyên thá»§y)" -#: wt-status.c:918 +#: wt-status.c:1014 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\")" +" (khi tất cả các xung đột đã sá»a xong: chạy lệnh “cải tổ†\"git rebase --" +"continue\")" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." msgstr "" -"Bạn hiện nay Ä‘ang thá»±c hiện việc chia tách má»™t lần chuyển giao (commit) " -"trong khi Ä‘ang rebase nhánh “%s†trên “%sâ€." +"Bạn hiện nay Ä‘ang thá»±c hiện việc chia tách má»™t lần chuyển giao trong khi " +"Ä‘ang “rebase†nhánh “%s†trên “%sâ€." -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." msgstr "" "Bạn hiện tại Ä‘ang cắt đôi má»™t lần chuyển giao trong khi Ä‘ang thá»±c hiện việc " "rebase." -#: wt-status.c:930 +#: wt-status.c:1026 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" -"\")" +" (Má»™t khi thư mục là m việc cá»§a bạn đã gá»n gà ng, chạy lệnh “cải tổ†\"git " +"rebase --continue\")" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" -"Bạn hiện nay Ä‘ang thá»±c hiện việc sá»a chữa má»™t lần chuyển giao (commit) trong " -"khi Ä‘ang rebase nhánh “%s†trên “%sâ€." +"Bạn hiện nay Ä‘ang thá»±c hiện việc sá»a chữa má»™t lần chuyển giao trong khi Ä‘ang " +"rebase nhánh “%s†trên “%sâ€." -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." msgstr "Bạn hiện Ä‘ang sá»a má»™t lần chuyển giao trong khi bạn thá»±c hiện rebase." -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" -msgstr "" -" (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 hiện tại)" -#: wt-status.c:944 +#: wt-status.c:1040 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)" +" (chạy lệnh “cải tổ†\"git rebase --continue\" má»™t khi bạn cảm thấy hà i " +"lòng vá» những thay đổi cá»§a mình)" -#: wt-status.c:954 -msgid "You are currently cherry-picking." -msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc cherry-pick." +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc cherry-pick lần chuyển giao %s." -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr "" " (sá»a các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")" -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" " (khi tất cả các xung đột đã sá»a xong: chạy lệnh \"git cherry-pick --" "continue\")" -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr " (dùng \"git cherry-pick --abort\" để há»§y bá» thao tác cherry-pick)" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." msgstr "Bạn hiện nay Ä‘ang thá»±c hiện thao tác revert lần chuyển giao “%sâ€." -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr " (sá»a các xung đột và sau đó chạy lệnh \"git revert --continue\")" -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr "" " (khi tất cả các xung đột đã sá»a xong: chạy lệnh \"git revert --continue\")" -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr " (dùng \"git revert --abort\" để há»§y bá» thao tác revert)" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "" "Bạn hiện nay Ä‘ang thá»±c hiện thao tác di chuyển ná»a bước (bisect), bắt đầu từ " "nhánh “%sâ€." -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." -msgstr "Bạn hiện tại Ä‘ang thá»±c hiện việc bisect (chia đôi)." +msgstr "Bạn hiện tại Ä‘ang thá»±c hiện việc bisect (di chuyển ná»a bước)." -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr " (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thá»§y)" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "Trên nhánh " -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " -msgstr "rebase Ä‘ang được thá»±c hiện: lên trên" +msgstr "rebase Ä‘ang được thá»±c hiện: lên trên " -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " -msgstr "HEAD được tách rá»i tại" +msgstr "HEAD được tách rá»i tại " -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " -msgstr "HEAD được tách rá»i từ" +msgstr "HEAD được tách rá»i từ " -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "Hiện tại chẳng ở nhánh nà o cả." -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" -msgstr "Lần chuyển giao (commit) khởi đầu" +msgstr "Lần chuyển giao khởi tạo" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "Những táºp tin chưa được theo dõi" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "Những táºp tin bị lá» Ä‘i" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1633,95 +1824,98 @@ msgstr "" "có lẽ là m nó nhanh hÆ¡n, nhưng bạn phải cẩn tháºn đừng quên mình phải\n" "tá»± thêm các táºp tin má»›i (xem “git help statusâ€.." -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" -msgstr "Những táºp tin không bị theo vết không được liệt kê ra %s" +msgstr "Những táºp tin chưa được theo dõi không được liệt kê ra %s" -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr " (dùng tùy chá»n -u để hiển thị các táºp tin chưa được theo dõi)" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "Không có thay đổi nà o" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "" -"không có thay đổi nà o được thêm và o commit (dùng \"git add\" và /hoặc \"git " -"commit -a\")\n" +"không có thay đổi nà o được thêm và o để chuyển giao (dùng \"git add\" và /hoặc " +"\"git commit -a\")\n" -#: wt-status.c:1251 +#: wt-status.c:1350 #, c-format 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" +msgstr "không có thay đổi nà o được thêm và o để chuyển giao\n" -#: wt-status.c:1254 +#: wt-status.c:1353 #, 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" +"không có gì được thêm và o lần chuyển giao nhưng có những táºp tin chưa được " +"theo dõi hiện diện (dùng \"git add\" để đưa và o theo dõi)\n" -#: wt-status.c:1257 +#: wt-status.c:1356 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "" -"không có gì được thêm và o lần chuyển giao (commit) nhưng có những táºp tin " -"không được theo dấu vết hiện diện\n" +"không có gì được thêm và o lần chuyển giao nhưng có những táºp tin chưa được " +"theo dõi hiện diện\n" -#: wt-status.c:1260 +#: wt-status.c:1359 #, 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" +"không có gì để chuyển giao (tạo/sao-chép các táºp tin và dùng \"git add\" để " +"đưa và o theo dõi)\n" -#: wt-status.c:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" -msgstr "không có gì để chuyển giao (commit)\n" +msgstr "không có gì để chuyển giao\n" -#: wt-status.c:1266 +#: wt-status.c:1365 #, 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" +"không có gì để chuyển giao (dùng -u xem các táºp tin chưa được theo dõi)\n" -#: wt-status.c:1270 +#: wt-status.c:1369 #, 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" +msgstr "không có gì để chuyển giao, thư mục là m việc sạch sẽ\n" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "HEAD (không nhánh)" -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " -msgstr "Lần chuyển giao (commit) khởi tạo trên " +msgstr "Lần chuyển giao khởi tạo trên " + +#: wt-status.c:1514 +msgid "gone" +msgstr "đã ra Ä‘i" -#: wt-status.c:1399 +#: wt-status.c:1516 msgid "behind " msgstr "đằng sau " -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "phÃa trước " -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr ", đằng sau " -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" -msgstr "bá» liên kết (unlink) %s không thà nh công" +msgstr "gặp lá»—i khi bá» liên kết (unlink) “%sâ€" #: builtin/add.c:20 msgid "git add [options] [--] <pathspec>..." @@ -1763,12 +1957,12 @@ msgstr "" "Äể thêm ná»™i dung cho toà n bá»™ cây, chạy:\n" "\n" " git add %s :/\n" -" (hay git add %s :/)\n" +" (hoặc git add %s :/)\n" "\n" "Äể hạn chế lệnh cho thư-mục hiện tại, chạy:\n" "\n" " git add %s .\n" -" (hay git add %s .)\n" +" (hoặc git add %s .)\n" "\n" "Vá»›i phiên bản hiện tại cá»§a Git, lệnh bị hạn chế cho thư-mục hiện tại.\n" @@ -1806,7 +2000,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "trạng thái lệnh diff không như mong đợi %c" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "Cáºp nháºt táºp tin gặp lá»—i" @@ -1815,147 +2009,142 @@ msgstr "Cáºp nháºt táºp tin gặp lá»—i" msgid "remove '%s'\n" msgstr "gỡ bỠ“%sâ€\n" -#: builtin/add.c:253 +#: builtin/add.c:237 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:" +"ÄÆ°a ra khá»i bệ phóng các thay đổi sau khi là m tươi má»›i lại bảng mục lục:" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, 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" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "Không thể Ä‘á»c bảng mục lục" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "Không thể mở “%s†để ghi." -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "Không thể ghi ra miếng vá" -#: builtin/add.c:359 +#: builtin/add.c:319 #, 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 thông tin thống kê vỠ“%sâ€" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." -msgstr "Miếng vá trống rá»—ng. Äã bá» qua." +msgstr "Miếng vá trống rá»—ng. Nên bá» qua." -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" -msgstr "Không thể apply (áp dụng miếng vá) “%sâ€" +msgstr "Không thể áp dụng miếng vá “%sâ€" -#: builtin/add.c:377 +#: builtin/add.c:337 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" "Các đưá»ng dẫn theo sau đây sẽ bị lá» Ä‘i bởi má»™t trong các táºp tin .gitignore " "cá»§a bạn:\n" -#: builtin/add.c:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "chạy thá»" -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "chi tiết" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "sá»a bằng cách tương tác" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" -msgstr "chá»n “hunks†má»™t cách tương tác" +msgstr "chá»n “hunks†theo kiểu tương tác" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "sá»a diff hiện nay và áp dụng nó" -#: builtin/add.c:400 +#: builtin/add.c:360 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:401 +#: builtin/add.c:361 msgid "update tracked files" -msgstr "cáºp nháºt các táºp tin được theo vết" +msgstr "cáºp nháºt các táºp tin được theo dõi" -#: builtin/add.c:402 +#: builtin/add.c:362 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:403 +#: builtin/add.c:363 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" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "" "lá» Ä‘i các đưá»ng dẫn bị gỡ bá» trong cây thư mục là m việc (giống vá»›i --no-all)" -#: builtin/add.c:408 +#: builtin/add.c:368 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:409 +#: builtin/add.c:369 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:410 +#: builtin/add.c:370 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:432 +#: builtin/add.c:392 #, 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:433 +#: builtin/add.c:393 msgid "no files added" msgstr "chưa có táºp tin nà o được thêm và o" -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "thêm táºp tin gặp lá»—i" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "-A và -u xung khắc nhau" -#: builtin/add.c:496 +#: builtin/add.c:456 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "Tùy chá»n --ignore-missing chỉ có thể được dùng cùng vá»›i --dry-run" -#: builtin/add.c:526 +#: builtin/add.c:486 #, 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:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "Có lẽ bạn muốn là “git add .†phải không?\n" +msgstr "Có lẽ ý bạn là “git add .†phải không?\n" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "táºp tin ghi bảng mục lục bị há»ng" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 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" @@ -1983,7 +2172,7 @@ msgstr "" #: 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" +msgstr "thi hà nh biểu thức chÃnh quy trả vá» %d cho đầu và o: %s" #: builtin/apply.c:913 #, c-format @@ -1993,22 +2182,23 @@ 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: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" +msgstr "" +"git apply: git-diff sai - cần /dev/null, nhưng lại nháºn được %s trên dòng %d" #: 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" +msgstr "git apply: git-diff sai - tên táºp tin má»›i không nhất quán trên dòng %d" #: 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" +msgstr "git apply: git-diff sai - tên táºp tin cÅ© không nhất quán trên dòng %d" #: builtin/apply.c:957 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" -msgstr "git apply: git-diff sai - cần /dev/null trên dòng %d" +msgstr "git apply: git-diff sai - cần “/dev/null†trên dòng %d" #: builtin/apply.c:1422 #, c-format @@ -2077,12 +2267,12 @@ msgstr "miếng vá định dạng nhị phân không được nháºn ra tại d #: builtin/apply.c:1986 #, c-format msgid "patch with only garbage at line %d" -msgstr "vá chỉ vá»›i “garbage†tại dòng %d" +msgstr "vá chỉ vá»›i “rác†tại dòng %d" #: builtin/apply.c:2076 #, c-format msgid "unable to read symlink %s" -msgstr "không thể Ä‘á»c liên kết tượng trưng %s" +msgstr "không thể Ä‘á»c liên kết má»m %s" #: builtin/apply.c:2080 #, c-format @@ -2104,7 +2294,7 @@ msgstr[1] "Khối dữ liệu #%d thà nh công tại %d (offset %d dòng)." #: builtin/apply.c:2818 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" -msgstr "Ná»™i dung bị giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %d" +msgstr "Ná»™i dung bị giảm xuống còn (%ld/%ld) để áp dụng mảnh dữ liệu tại %d" #: builtin/apply.c:2824 #, c-format @@ -2112,7 +2302,7 @@ msgid "" "while searching for:\n" "%.*s" msgstr "" -"Trong khi Ä‘ang tìm kiếm cho:\n" +"trong khi Ä‘ang tìm kiếm cho:\n" "%.*s" #: builtin/apply.c:2843 @@ -2135,7 +2325,7 @@ msgstr "" #: builtin/apply.c:2973 #, c-format msgid "patch failed: %s:%ld" -msgstr "vá gặp lá»—i: %s:%ld" +msgstr "gặp lá»—i khi vá: %s:%ld" #: builtin/apply.c:3095 #, c-format @@ -2150,7 +2340,7 @@ msgstr "Ä‘á»c %s gặp lá»—i" #: builtin/apply.c:3174 builtin/apply.c:3396 #, c-format msgid "path %s has been renamed/deleted" -msgstr "đưá»ng dẫn %s đã bị xóa/đổi tên" +msgstr "đưá»ng dẫn %s đã bị xóa hoặc đổi tên" #: builtin/apply.c:3255 builtin/apply.c:3410 #, c-format @@ -2179,7 +2369,7 @@ msgstr "%s: sai kiểu" #: builtin/apply.c:3437 #, c-format msgid "%s has type %o, expected %o" -msgstr "%s có kiểu %o, mong chá» %o" +msgstr "%s có kiểu %o, cần %o" #: builtin/apply.c:3538 #, c-format @@ -2211,7 +2401,7 @@ msgstr "%s: miếng vá không được áp dụng" msgid "Checking patch %s..." msgstr "Äang kiểm tra miếng vá %s..." -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, 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â€" @@ -2224,7 +2414,7 @@ msgstr "không thể gỡ bá» %s từ mục lục" #: builtin/apply.c:3851 #, c-format msgid "corrupt patch for submodule %s" -msgstr "miếng vá sai há»ng cho mô-Ä‘un-con (subproject) %s" +msgstr "miếng vá sai há»ng cho mô-Ä‘un-con %s" #: builtin/apply.c:3855 #, c-format @@ -2234,12 +2424,12 @@ msgstr "không thể lấy trạng thái vá» táºp tin %s má»›i hÆ¡n đã đưá #: builtin/apply.c:3860 #, 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" +msgstr "không thể tạo “kho lưu đằng sau†cho táºp tin được tạo má»›i hÆ¡n %s" #: builtin/apply.c:3863 builtin/apply.c:3971 #, c-format msgid "unable to add cache entry for %s" -msgstr "không thể thêm mục nhá»› tạm cho %s" +msgstr "không thể thêm mục nhá»› đệm cho %s" #: builtin/apply.c:3896 #, c-format @@ -2249,7 +2439,7 @@ msgstr "Ä‘ang đóng táºp tin “%sâ€" #: builtin/apply.c:3945 #, 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ế độ %o" #: builtin/apply.c:4032 #, c-format @@ -2271,7 +2461,7 @@ msgstr[1] "Äang áp dụng miếng vá %%s vá»›i %d lần từ chối..." #: builtin/apply.c:4053 #, 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" +msgstr "Ä‘ang cắt ngắn tên táºp tin .rej thà nh %.*s.rej" #: builtin/apply.c:4074 #, c-format @@ -2291,8 +2481,8 @@ msgstr "không thừa nháºn đầu và o" 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:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "đưá»ng-dẫn" @@ -2310,11 +2500,11 @@ msgstr "số" #: builtin/apply.c:4364 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" +msgstr "gỡ bá» <số> dấu gạch chéo dẫn đầu từ đưá»ng dẫn diff cổ Ä‘iển" #: builtin/apply.c:4367 msgid "ignore additions made by the patch" -msgstr "lá» Ä‘i phần phụ thêm tạo ra bởi miếng vá" +msgstr "lá» Ä‘i phần bổ xung được tạo ra bởi miếng vá" #: builtin/apply.c:4369 msgid "instead of applying the patch, output diffstat for the input" @@ -2356,7 +2546,7 @@ msgid "build a temporary index based on embedded index information" msgstr "" "xây dá»±ng bảng mục lục tạm thá»i trên cÆ¡ sở thông tin bảng mục lục được nhúng" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "các đưá»ng dẫn bị ngăn cách bởi ký tá»± NULL" @@ -2374,7 +2564,7 @@ msgstr "tìm thấy má»™t dòng má»›i hoặc bị sá»a đổi mà nó có lá»—i #: builtin/apply.c:4397 builtin/apply.c:4400 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" +msgstr "lá» Ä‘i sá»± thay đổi do khoảng trắng gây ra khi quét ná»™i dung" #: builtin/apply.c:4403 msgid "apply the patch in reverse" @@ -2455,7 +2645,7 @@ msgstr "git archive: Máy chá»§ không có địa chỉ URL" #: builtin/archive.c:58 msgid "git archive: expected ACK/NAK, got EOF" -msgstr "git archive: mong đợi ACK/NAK, nháºn EOF" +msgstr "git archive: cần ACK/NAK, nhưng lại nháºn được EOF" #: builtin/archive.c:61 #, c-format @@ -2473,7 +2663,7 @@ msgstr "git archive: lá»—i giao thức" #: builtin/archive.c:68 msgid "git archive: expected a flush" -msgstr "git archive: đã mong chá» má»™t flush" +msgstr "git archive: cần má»™t flush (đẩy dữ liệu lên đĩa)" #: builtin/bisect--helper.c:7 msgid "git bisect--helper --next-all [--no-checkout]" @@ -2486,108 +2676,107 @@ 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" +"cáºp nháºt BISECT_HEAD thay vì lấy ra (checking out) lần chuyển giao hiện hà nh" -#: builtin/blame.c:26 +#: builtin/blame.c:27 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:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-opts] được mô tả trong git-rev-list(1)" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 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:2277 +#: builtin/blame.c:2250 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:2278 +#: builtin/blame.c:2251 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:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "Hiển thị thống kê công sức là m việc" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 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:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "Hiển thị tên táºp tin gốc (Mặc định: auto)" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "Hiển thị số dòng gốc (Mặc định: off)" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 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:2284 +#: builtin/blame.c:2257 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:2285 +#: builtin/blame.c:2258 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:2286 +#: builtin/blame.c:2259 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:2287 +#: builtin/blame.c:2260 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)" +msgstr "Hiển thị SHA1 cá»§a lần chuyển giao dạng dà i (Mặc định: off)" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 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:2289 +#: builtin/blame.c:2262 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:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "Bá» qua các khác biệt do khoảng trắng gây ra" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 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:2292 +#: builtin/blame.c:2265 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:2293 +#: builtin/blame.c:2266 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:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "Ä‘iểm số" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 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:2295 +#: builtin/blame.c:2268 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:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "Xá» lý chỉ dòng vùng n,m, tÃnh từ 1" @@ -2628,7 +2817,7 @@ msgstr "" #: builtin/branch.c:168 #, 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 cho “%sâ€" #: builtin/branch.c:172 #, c-format @@ -2649,7 +2838,7 @@ msgstr "không thể dùng tùy chá»n -a vá»›i -d" #: builtin/branch.c:219 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" +msgstr "Không thể tìm kiếm đối tượng chuyển giao cho HEAD" #: builtin/branch.c:227 #, c-format @@ -2674,7 +2863,7 @@ msgstr "Gặp lá»—i khi Ä‘ang xóa nhánh trên máy chá»§ “%sâ€" #: builtin/branch.c:256 #, c-format msgid "Error deleting branch '%s'" -msgstr "Lá»—i khi xoá bá» nhánh “%sâ€" +msgstr "Gặp lá»—i khi xoá bá» nhánh “%sâ€" #: builtin/branch.c:263 #, c-format @@ -2689,292 +2878,300 @@ msgstr "Nhánh “%s†đã bị xóa (từng là %s)\n" #: builtin/branch.c:366 #, 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 nà o cả" -#: builtin/branch.c:453 +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: đã ra Ä‘i]" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "[%s: đằng sau %d]" -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "[đằng sau %d]" -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: phÃa trước %d]" -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "[phÃa trước %d]" -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: trước %d, sau %d]" -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "[trước %d, sau %d]" -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" -msgstr " **** tham chiếu sai ****" +msgstr " **** tham chiếu không hợp lệ ****" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "(không nhánh, Ä‘ang rebase %s)" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(không nhánh, bisect được bắt đầu tại %s)" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "(được tách rá»i từ %s)" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "(không nhánh)" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" -msgstr "đối tượng “%s†không chỉ đến má»™t lần chuyển giao (commit) nà o cả" +msgstr "đối tượng “%s†không chỉ đến má»™t lần chuyển giao nà o cả" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "má»™t số tham chiếu đã không thể Ä‘á»c được" -#: builtin/branch.c:682 +#: builtin/branch.c:694 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:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" -msgstr "Sai tên nhánh: “%sâ€" +msgstr "Tên nhánh không hợp lệ: “%sâ€" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" -msgstr "Äổi tên nhánh gặp lá»—i" +msgstr "Gặp lá»—i khi đổi tên nhánh" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "Äã đổi tên nhánh khuyết danh “%s†đi" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, 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:722 +#: builtin/branch.c:734 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:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "tên đối tượng dị hình %s" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, 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:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "Tùy chá»n chung" -#: builtin/branch.c:793 +#: builtin/branch.c:805 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:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "Thu hồi các thông Ä‘iệp thông tin" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" -msgstr "cà i đặt chế độ theo vết (xem git-pull(1))" +msgstr "cà i đặt chế độ theo dõi (xem git-pull(1))" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" -msgstr "thay đổi thông tin thượng nguồn (upstream)" +msgstr "thay đổi thông tin thượng nguồn" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "sá» dụng kết xuất có tô mà u" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "thao tác trên nhánh “remote-trackingâ€" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "commit" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 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:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "Hà nh động git-branch:" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "liệt kê cả nhánh “remote-tracking†và ná»™i bá»™" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "xóa má»™t cách đầy đủ nhánh đã hòa trá»™n" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "xoá nhánh (cho dù là chưa được hòa trá»™n)" -#: builtin/branch.c:823 +#: builtin/branch.c:835 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:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" -msgstr "di chuyển hoặc đổi tên má»™t nhánh, tháºm chà cả khi Ä‘Ãch đã có sẵn" +msgstr "di chuyển hoặc đổi tên má»™t nhánh ngay cả khi Ä‘Ãch đã có sẵn" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "liệt kê các tên nhánh" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "tạo reflog cá»§a nhánh" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "sá»a mô tả cho nhánh" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" -msgstr "ép buá»™c tạo (khi đã sẵn tồn tại rồi)" +msgstr "ép buá»™c tạo (khi đã có nhánh cùng tên)" -#: builtin/branch.c:832 +#: builtin/branch.c:844 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:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "chỉ hiển thị các nhánh được hòa trá»™n" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "liệt kê các nhánh trong các cá»™t" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "Gặp lá»—i khi phân giải HEAD như là má»™t tham chiếu (ref) hợp lệ." -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "không tìm thấy HEAD ở dưới refs/heads!" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" -msgstr "--column và --verbose xung khắc nhau" +msgstr "tùy chá»n --column và --verbose xung khắc nhau" -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "cần tên nhánh" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "Không thể đưa ra mô tả HEAD đã tách rá»i" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "không thể sá»a mô tả cho nhiá»u hÆ¡n má»™t nhánh" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "Vẫn chưa chuyển giao trên nhánh “%sâ€." -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "Không có nhánh nà o có tên “%sâ€." -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "quá nhiá»u nhánh dà nh cho thao tác đổi tên" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" -msgstr "quá nhiá»u nhánh được đặt cho dòng ngược (upstream) má»›i" +msgstr "quá nhiá»u nhánh được đặt cho thượng nguồn má»›i" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." msgstr "" -"không thể đặt dòng ngược (upstream) cá»§a HEAD thà nh %s khi mà nó chẳng chỉ " -"đến nhánh nà o cả." +"không thể đặt thượng nguồn cá»§a HEAD thà nh %s khi mà nó chẳng chỉ đến nhánh " +"nà o cả." -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "không có nhánh nà o như thế “%sâ€" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" -msgstr "nhánh “%s†chưa sẵn có" +msgstr "chưa có nhánh “%sâ€" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" -msgstr "quá nhiá»u nhánh để bỠđặt ngược dòng (upstream)" +msgstr "quá nhiá»u nhánh để bỠđặt thượng nguồn" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." -msgstr "" -"không thể bỠđặt ngược dòng (upstream) cá»§a HEAD không chỉ đến má»™t nhánh nà o " -"cả." +msgstr "không thể bỠđặt thượng nguồn cá»§a HEAD không chỉ đến má»™t nhánh nà o cả." -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" -msgstr "Nhánh “%s†không có thông tin thượng nguồn (upstream)" +msgstr "Nhánh “%s†không có thông tin thượng nguồn" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" -msgstr "không hợp lý khi tạo “HEAD†thá»§ công " +msgstr "không hợp lý khi tạo “HEAD†thá»§ công" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 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" -#: builtin/branch.c:996 +#: builtin/branch.c:1008 #, 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-" +"Cá» --set-upstream đã lạc háºu và sẽ bị xóa bá». Nên dùng --track hoặc --set-" "upstream-to\n" -#: builtin/branch.c:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -2985,12 +3182,12 @@ msgstr "" "Nếu bạn muốn “%s†theo dõi “%sâ€, thá»±c hiện lệnh sau:\n" "\n" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr " git branch --set-upstream-to %s\n" @@ -3002,50 +3199,50 @@ msgstr "“%s†tốt\n" #: builtin/bundle.c:56 msgid "Need a repository to create a bundle." -msgstr "Cần má»™t kho chứa để mà tạo má»™t bundle." +msgstr "Cần má»™t kho chứa để có thể tạo má»™t bundle." #: builtin/bundle.c:60 msgid "Need a repository to unbundle." -msgstr "Cần má»™t kho chứa để mà bung má»™t bundle." +msgstr "Cần má»™t kho chứa để có thể giải nén má»™t bundle." -#: builtin/cat-file.c:285 +#: builtin/cat-file.c:328 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:286 +#: builtin/cat-file.c:329 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:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" -msgstr "<kiểu> là má»™t trong số: blob, tree, commit, tag" +msgstr "<kiểu> là má»™t trong số: blob, tree, commit hoặc tag" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "hiển thị kiểu đối tượng" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "hiển thị kÃch thước đối tượng" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 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:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "in ná»™i dung đối tượng dạng dá»… Ä‘á»c" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 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:332 +#: builtin/cat-file.c:375 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:335 +#: builtin/cat-file.c:378 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" @@ -3064,17 +3261,17 @@ 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" +msgstr "chỉ dùng .gitattributes từ bảng mục lục" #: builtin/check-attr.c:21 builtin/check-ignore.c:22 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 builtin/check-ignore.c:24 -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" +msgid "terminate input and output records by a NUL character" +msgstr "chấm dứt các bản ghi và o và ra bằng ký tá»± NULL" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "chặn các báo cáo tiến trình hoạt động" @@ -3082,27 +3279,31 @@ msgstr "chặn các báo cáo tiến trình hoạt động" msgid "show non-matching input paths" msgstr "hiển thị những đưá»ng dẫn đầu và o không khá»›p vá»›i mẫu" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "bá» qua mục lục khi kiểm tra" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "không thể chỉ định các tên đưá»ng dẫn vá»›i --stdin" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "-z chỉ hợp lý vá»›i --stdin" -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" -msgstr "chưa ghi rõ đưá»ng dẫn" +msgstr "chưa chỉ ra đưá»ng dẫn" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "--quiet chỉ hợp lệ vá»›i tên đưá»ng dẫn đơn" -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "không thể dùng cả hai tùy chá»n --quiet và --verbose" -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "tùy-chá»n --non-matching chỉ hợp lệ khi dùng vá»›i --verbose" @@ -3150,7 +3351,7 @@ msgstr "cáºp nháºt thông tin thống kê trong táºp tin lưu bảng mục lá #: 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" +msgstr "Ä‘á»c danh sách đưá»ng dẫn từ đầu và o tiêu chuẩn" #: builtin/checkout-index.c:202 msgid "write the content to temporary files" @@ -3166,7 +3367,7 @@ 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" +msgstr "sao chép ra các táºp tin từ bệ phóng có tên" #: builtin/checkout.c:25 msgid "git checkout [options] <branch>" @@ -3176,107 +3377,107 @@ msgstr "git checkout [các-tùy-chá»n] <nhánh>" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "git checkout [các-tùy-chá»n] [<nhánh>] -- <táºp-tin>..." -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, 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" -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, 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" -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, 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" -#: builtin/checkout.c:179 +#: builtin/checkout.c:176 #, 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" -#: builtin/checkout.c:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "đưá»ng dẫn “%sâ€: không thể hòa trá»™n" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, 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â€" -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, 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" +msgstr "không được dùng “%s†vá»›i các đưá»ng dẫn cáºp nháºt" -#: builtin/checkout.c:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" -msgstr "“%s†không thể được sá» dụng vá»›i %s" +msgstr "không được dùng “%s†vá»›i %s" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, 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:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "táºp tin ghi bảng mục lục bị há»ng" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "đưá»ng dẫn “%s†không được hòa trá»™n" -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" -msgstr "bạn cần phải phân giải bảng mục lục hiện tại cá»§a bạn trước đã" +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:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "Không thể thá»±c hiện reflog cho “%sâ€\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "HEAD hiện giá» tại" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "Äặt lại nhánh “%sâ€\n" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "Äã sẵn sà ng trên “%sâ€\n" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Äã chuyển tá»›i và reset nhánh “%sâ€\n" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Äã chuyển đến nhánh má»›i “%sâ€\n" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "Äã chuyển đến nhánh “%sâ€\n" -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr " ... và nhiá»u hÆ¡n %d.\n" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3289,19 +3490,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 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 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:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3317,138 +3518,142 @@ msgstr "" " git branch tên_nhánh_má»›i %s\n" "\n" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "lá»—i ná»™i bá»™ trong khi di chuyển qua các Ä‘iểm xét duyệt" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" -msgstr "Vị trà kế trước cá»§a HEAD là " +msgstr "Vị trà trước kia cá»§a HEAD là " -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 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:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "chỉ cần má»™t tham chiếu, nhưng lại đưa ra %d." + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" -msgstr "tham chiếu sai: %s" +msgstr "tham chiếu không hợp lệ: %s" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" -msgstr "tham chiếu không phải là má»™t cây (tree):%s" +msgstr "tham chiếu không phải là má»™t cây:%s" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 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:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, 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:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" -msgstr "“%s†không thể được sá» dụng vá»›i “%sâ€" +msgstr "“%s†không thể được dùng vá»›i “%sâ€" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, 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:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "nhánh" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "tạo và checkout má»™t nhánh má»›i" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" -msgstr "create/reset và checkout má»™t nhánh" +msgstr "tạo/đặt_lại và checkout má»™t nhánh" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "tạo reflog cho nhánh má»›i" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 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:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" -msgstr "đặt thông tin thượng nguồn (upstream) cho nhánh má»›i" +msgstr "đặt thông tin thượng nguồn cho nhánh má»›i" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "nhánh má»›i" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" -msgstr "nhánh mồ côi má»›i" +msgstr "nhánh không cha má»›i" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 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:1066 +#: builtin/checkout.c:1102 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:1068 +#: builtin/checkout.c:1104 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:1069 +#: builtin/checkout.c:1105 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:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "cáºp nháºt các táºp tin bị bá» qua (mặc định)" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "kiểu" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" -msgstr "xung đột kiểu (hòa trá»™n hay diff3)" +msgstr "xung đột kiểu (hòa trá»™n hoặc diff3)" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" -msgstr "không giá»›i hạn pathspecs chỉ thà nh các mục thưa thá»›t" +msgstr "không giá»›i hạn đặc tả đưá»ng dẫn thà nh chỉ các mục thưa thá»›t" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 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:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" -msgstr "Tùy chá»n -b|-B và --orphan loại từ lẫn nhau" +msgstr "Các tùy chá»n -b, -B và --orphan loại từ lẫn nhau" -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "--track cần tên má»™t nhánh" -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "Thiếu tên nhánh; hãy thá» -b" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "đưá»ng dẫn đã cho không hợp lệ" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3456,14 +3661,14 @@ msgid "" msgstr "" "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)?" +"chuyển giao?" -#: builtin/checkout.c:1172 +#: builtin/checkout.c:1209 #, 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:1176 +#: builtin/checkout.c:1213 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -3471,38 +3676,38 @@ msgstr "" "git checkout: --ours/--theirs, --force và --merge là xung khắc vá»›i nhau khi\n" "checkout bảng mục lục (index)." -#: builtin/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <mẫu>] [-x | -X] [--] <đưá»ng-dẫn>..." -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "Äang gỡ bá» %s\n" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "Có thể gỡ bá» %s\n" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "Äang bá» qua kho chứa %s\n" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "Nên bá» qua kho chứa %s\n" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "gặp lá»—i khi gỡ bá» %s" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3514,7 +3719,7 @@ msgstr "" "foo - chá»n mục trên cÆ¡ sở tiá»n tố duy nhất\n" " - (trống rá»—ng) không chá»n gì cả" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3534,35 +3739,35 @@ msgstr "" "* - chá»n tất\n" " - (trống rá»—ng) kết thúc việc chá»n" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "Hả (%s)?" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " -msgstr "Mẫu để lá»c các táºp tin cần lá» Ä‘i đầu và o>>" +msgstr "Mẫu để lá»c các táºp tin đầu và o cần lá» Ä‘i>> " -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "CẢNH BÃO: Không tìm thấy các mục được khá»›p bởi: %s" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "Chá»n mục muốn xóa" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " -msgstr "gỡ bỠ“%sâ€?" +msgstr "gỡ bỠ“%sâ€? " -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "Tạm biệt." -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3580,21 +3785,21 @@ msgstr "" "help - hiển thị chÃnh trợ giúp nà y\n" "? - trợ giúp dà nh cho chá»n bằng cách nhắc" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "*** Lệnh ***" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "Giá» thì sao" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "Có muốn gỡ bá» mục sau đây không:" msgstr[1] "Có muốn gỡ bá» các mục sau đây không:" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "Không còn táºp-tin nà o để dá»n dẹp, Ä‘ang thoát ra." @@ -3608,14 +3813,14 @@ msgstr "ép buá»™c" #: builtin/clean.c:877 msgid "interactive cleaning" -msgstr "sá»a bằng cách tương tác" +msgstr "dá»n bằng kiểu tương tác" #: builtin/clean.c:879 msgid "remove whole directories" msgstr "gỡ bá» toà n bá»™ thư mục" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "mẫu" @@ -3655,10 +3860,10 @@ msgstr "" 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:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" -msgstr "ép buá»™c báo cáo tiến trình" +msgstr "ép buá»™c báo cáo tiến triển công việc" #: builtin/clone.c:66 msgid "don't create a checkout" @@ -3666,125 +3871,135 @@ 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" +msgstr "tạo kho thuần" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" -msgstr "tạo kho bản sao (mirror) (ngụ ý là bare)" +msgstr "tạo kho bản sao (ý là kho thuần)" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "để nhân bản từ kho ná»™i bá»™" -#: builtin/clone.c:76 +#: builtin/clone.c:75 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 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "cà i đặt đây là kho chia sẻ" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 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 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" -msgstr "thư-mục-tạm" +msgstr "thư-mục-mẫu" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 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 +#: builtin/clone.c:85 msgid "reference repository" msgstr "kho tham chiếu" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "tên" -#: builtin/clone.c:88 +#: builtin/clone.c:87 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)" +msgstr "dùng <tên> thay cho “origin†để theo dõi thượng nguồn" -#: builtin/clone.c:90 +#: builtin/clone.c:89 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á»§" +msgstr "lấy ra <nhánh> thay cho HEAD cá»§a máy chá»§" -#: builtin/clone.c:92 +#: builtin/clone.c:91 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:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" -msgstr "độ sâu" +msgstr "độ-sâu" -#: builtin/clone.c:94 +#: builtin/clone.c:93 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 +#: builtin/clone.c:95 msgid "clone only one branch, HEAD or --branch" -msgstr "nhân bản (clone) chỉ má»™t nhánh, HEAD hoặc --branch" +msgstr "chỉ nhân bản má»™t nhánh, HEAD hoặc --branch" -#: builtin/clone.c:97 builtin/init-db.c:494 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr "gitdir" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 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 +#: builtin/clone.c:98 msgid "key=value" -msgstr "khóa=giá trị" +msgstr "khóa=giá_trị" -#: builtin/clone.c:100 +#: builtin/clone.c:99 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:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "kho tham chiếu “%s†không phải là má»™t kho ná»™i bá»™." -#: builtin/clone.c:316 +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "kho tham chiếu “%s†là nông" + +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "kho tham chiếu “%s†bị cấy ghép" + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "tạo thư mục \"%s\" gặp lá»—i" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "gặp lá»—i stat (lấy trạng thái vá») “%sâ€" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "%s tồn tại nhưng không phải là má»™t thư mục" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" -msgstr "lá»—i stat (lấy trạng thái vá») %s\n" +msgstr "gặp lá»—i khi lấy thông tin thống kê vá» %s\n" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "gặp lá»—i khi tạo được liên kết má»m %s" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" -msgstr "gặp lá»—i khi chép táºp tin tá»›i “%sâ€" +msgstr "gặp lá»—i khi sao chép táºp tin và “%sâ€" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "hoà n tất.\n" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -3794,104 +4009,108 @@ msgstr "" "Bạn kiểm tra kỹ xem cái gì được lấy ra bằng lệnh “git statusâ€\n" "và thá» checkout vá»›i lệnh “git checkout -f HEADâ€\n" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "Không tìm thấy nhánh máy chá»§ %s để nhân bản (clone)." -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " -msgstr "Äang kiểm tra kết nối..." +msgstr "Äang kiểm tra kết nối... " -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "máy chá»§ đã không gá»i tất cả các đối tượng cần thiết" -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "xong.\n" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 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:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "không thể lấy ra (checkout) cây là m việc" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "Có quá nhiá»u đối số." -#: builtin/clone.c:764 +#: builtin/clone.c:769 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:775 +#: builtin/clone.c:780 #, 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:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "tùy chá»n --bare và --separate-git-dir xung khắc nhau." -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "kho chứa “%s†chưa tồn tại" -#: builtin/clone.c:796 +#: builtin/clone.c:802 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:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "kho nguồn là nông, nên bá» qua --local" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "--local bị lá» Ä‘i" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "độ sâu %s không phải là má»™t số nguyên dương" + +#: builtin/clone.c:824 #, 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." -#: builtin/clone.c:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "cây là m việc “%s†đã sẵn tồn tại rồi." -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, 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â€" -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, 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â€." -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Äang nhân bản thà nh kho chứa bare “%sâ€...\n" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "Äang nhân bản thà nh “%sâ€...\n" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, 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:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, 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 thượng nguồn (upstream) %s" +msgstr "Nhánh máy chá»§ %s không tìm thấy trong thượng nguồn %s" -#: builtin/clone.c:949 +#: builtin/clone.c:968 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." @@ -3913,11 +4132,11 @@ 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" +msgstr "Chèn thêm khoảng trống và o 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" +msgstr "Chèn thêm khoảng trắng và o bên phải" #: builtin/column.c:32 msgid "Padding space between columns" @@ -3927,15 +4146,15 @@ msgstr "Chèn thêm khoảng trắng giữa các cá»™t" msgid "--command must be the first argument" msgstr "--command phải là đối số đầu tiên" -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." msgstr "git commit [các-tùy-chá»n] [--] <pathspec>..." -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." msgstr "git status [các-tùy-chá»n] [--] <pathspec>..." -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3959,24 +4178,24 @@ msgstr "" " 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" +"chuyển giao nà y vá»›i lệnh:\n" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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" +"Bạn đã yêu cầu amend (“tu bổâ€) phần lá»›n các lần chuyển giao 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:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3986,16 +4205,16 @@ msgid "" 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" -"Nếu bạn vẫn muốn chuyển giao nó cho dù thế nà o Ä‘i nữa, sá» dụng:\n" +"Nếu bạn vẫn muốn chuyển giao nó cho dù thế nà o Ä‘i nữa, hãy dùng:\n" "\n" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "Nếu không được thì dùng lệnh \"git reset\"\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -4011,97 +4230,95 @@ msgstr "" "Thế thì \"git cherry-pick --continue\" sẽ phục hồi lại việc cherry-pick\n" "những lần chuyển giao còn lại.\n" -#: builtin/commit.c:279 +#: builtin/commit.c:287 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:321 +#: builtin/commit.c:329 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:327 +#: builtin/commit.c:335 msgid "interactive add failed" -msgstr "việc thêm tương tác gặp lá»—i" +msgstr "gặp lá»—i khi thêm bằng cách tương" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 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:412 +#: builtin/commit.c:420 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." +"không thể thá»±c hiện việc chuyển giao cục bá»™ trong khi Ä‘ang được hòa trá»™n." -#: builtin/commit.c:414 +#: builtin/commit.c:422 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." +"không thể thá»±c hiện việc chuyển giao bá»™ pháºn trong khi Ä‘ang cherry-pick." -#: builtin/commit.c:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "không Ä‘á»c được bảng mục lục" -#: builtin/commit.c:444 +#: builtin/commit.c:452 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:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" -msgstr "lần chuyển giao (commit) không hợp lệ: %s" +msgstr "lần chuyển giao không hợp lệ: %s" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" -msgstr "đối số --author bị dị hình" +msgstr "đối số cho --author bị dị hình" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "Chuá»—i thụt lỠđầu dòng dị hình: “%sâ€" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, 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:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, 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:635 +#: builtin/commit.c:644 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:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "không Ä‘á»c được tệp nháºt ký “%sâ€" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" -msgstr "lần chuyển giao (commit) có ghi chú trống rá»—ng" +msgstr "lần chuyển giao có ghi chú trống rá»—ng" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "không thể Ä‘á»c MERGE_MSG" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "không thể Ä‘á»c SQUASH_MSG" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "Không thể Ä‘á»c “%sâ€." -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" -msgstr "không thể ghi mẫu commit" +msgstr "không thể ghi mẫu chuyển giao" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -4116,7 +4333,7 @@ msgstr "" "\t%s\n" "và thá» lại.\n" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -4131,7 +4348,7 @@ msgstr "" "\t%s\n" "và thá» lại.\n" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4140,9 +4357,9 @@ 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 “%c†sẽ được bá» qua, nếu phần chú thÃch rá»—ng sẽ há»§y bá» lần " -"chuyển giao (commit).\n" +"chuyển giao.\n" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4152,150 +4369,151 @@ 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 “%c†sẽ được bá» qua; bạn có thể xóa chúng Ä‘i nếu muốn thế.\n" -"Phần chú thÃch nà y nếu trống rá»—ng sẽ há»§y bá» lần chuyển giao (commit).\n" +"Phần chú thÃch nà y nếu trống rá»—ng sẽ há»§y bá» lần chuyển giao.\n" -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "%sTác giả: %s" -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" -msgstr "%sNgưá»i chuyển giao (commit): %s" +msgstr "%sNgưá»i chuyển giao: %s" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" -msgstr "không Ä‘á»c được bảng mục lục" +msgstr "Không Ä‘á»c được bảng mục lục" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "Gặp lá»—i khi xây dá»±ng cây" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, 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" +msgstr "Xin hãy cung cấp lá»i chú giải hoặc là dùng tùy chá»n -m hoặc là -F.\n" -#: builtin/commit.c:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "Không tìm thấy tác giả có sẵn vá»›i “%sâ€" -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, 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 chưa được theo dõi không hợp lệ “%sâ€" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "hai tùy chá»n -long và -z không tương thÃch vá»›i nhau" -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 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:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." -msgstr "Không có gì để amend (tu bổ) cả." +msgstr "Không có gì để mà “tu bổ†cả." -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 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ổ)." +"Bạn Ä‘ang ở giữa cá»§a quá trình hòa trá»™n -- không thể thá»±c hiện việc “tu bổâ€." -#: builtin/commit.c:1055 +#: builtin/commit.c:1080 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ổ)." +"Bạn Ä‘ang ở giữa cá»§a quá trình cherry-pick -- không thể thá»±c hiện việc “tu " +"bổâ€." -#: builtin/commit.c:1058 +#: builtin/commit.c:1083 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:1068 +#: builtin/commit.c:1093 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" +msgstr "" +"Chỉ được dùng má»™t trong số tùy chá»n trong số các tùy chá»n -c/-C/-F/--fixup" -#: builtin/commit.c:1070 +#: builtin/commit.c:1095 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:1078 +#: builtin/commit.c:1103 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" "--reset-author chỉ có thể được sá» dụng vá»›i tùy chá»n -C, -c hay --amend." -#: builtin/commit.c:1095 +#: builtin/commit.c:1120 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Chỉ má»™t trong các tùy chá»n --include/--only/--all/--interactive/--patch được " "sá» dụng." -#: builtin/commit.c:1097 +#: builtin/commit.c:1122 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:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." -msgstr "Giá»i... tu bổ cái cuối vá»›i bảng mục lục phi nghÄ©a." +msgstr "Giá»i... “tu bổ†cái cuối vá»›i bảng mục lục bẩn." -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" "Những đưá»ng dẫn rõ rà ng được chỉ ra không có tùy chá»n -i cÅ©ng không -o; Ä‘ang " "giả định --only những-đưá»ng-dẫn..." -#: builtin/commit.c:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "Chế độ dá»n dẹp không hợp lệ %s" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 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:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "hiển thị trạng thái ở dạng súc tÃch" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "hiển thị thông tin nhánh" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "kết xuất dạng máy-có-thể-Ä‘á»c" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "hiển thị trạng thái ở định dạng dà i (mặc định)" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "chấm dứt các mục bằng NUL" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "chế độ" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 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:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "hiển thị các táºp tin ẩn" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "khi" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -4303,223 +4521,221 @@ 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:1242 +#: builtin/commit.c:1271 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:1313 +#: builtin/commit.c:1340 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" +msgstr "không thể tìm thấy lần chuyển giao má»›i hÆ¡n đã được tạo" -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "" "không thể phân tÃch cú pháp cá»§a đối tượng chuyển giao má»›i hÆ¡n đã được tạo" -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "đã rá»i khá»i HEAD" -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr " (root-commit)" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 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:1426 +#: builtin/commit.c:1453 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:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "Các tùy chá»n ghi chú commit" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "Ä‘á»c chú thÃch từ táºp tin" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "tác giả" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "ghi đè tác giả cho commit" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "ngà y tháng" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" -msgstr "ghi đè ngà y tháng cho commit" +msgstr "ghi đè ngà y tháng cho lần chuyển giao" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" -msgstr "thông Ä‘iệp" +msgstr "chú thÃch" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" -msgstr "chú thÃch cá»§a lần commit" +msgstr "chú thÃch cá»§a lần chuyển giao" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 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" +msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho nhưng có cho sá»a chữa" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" -msgstr "dùng lại các ghi chú từ lần chuyển giao (commit) đã cho" +msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 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:1436 +#: builtin/commit.c:1463 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:1437 +#: builtin/commit.c:1464 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:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" -msgstr "thêm dòng Signed-off-by:" +msgstr "(nên dùng) thêm dòng Signed-off-by:" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "sá» dụng táºp tin mẫu đã cho" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "ép buá»™c sá»a lần commit" -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "mặc định" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 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:1442 +#: builtin/commit.c:1469 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)" +msgstr "bao gồm các trạng thái trong mẫu ghi chú chuyển giao" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" -msgstr "id khóa" +msgstr "id cá»§a khóa" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" -msgstr "ký lần commit dùng GPG" +msgstr "ký lần chuyển giao dùng GPG" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "Các tùy ná»™i dung ghi chú commit" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "chuyển giao tất cả các táºp tin có thay đổi" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 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)" +msgstr "thêm các táºp tin đã chỉ ra và o bảng mục lục để chuyển giao" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "thêm các táºp-tin bằng tương tác" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "thêm các thay đổi bằng tương tác" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "chỉ chuyển giao các táºp tin đã chỉ ra" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "vòng qua móc (hook) pre-commit" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "hiển thị xem cái gì có thể được chuyển giao" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" -msgstr "tu bổ (amend) lần commit trước" +msgstr "“tu bổ†(amend) lần commit trước" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "vòng qua móc (hook) post-rewrite" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "ok để ghi lại má»™t thay đổi trống rá»—ng" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 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:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "không thể phân tÃch commit (lần chuyển giao) HEAD" -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "không thể mở “%s†để Ä‘á»c" -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Táºp tin MERGE_HEAD sai há»ng (%s)" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "không thể Ä‘á»c MERGE_MODE" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, 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" +msgstr "không thể Ä‘á»c phần chú thÃch (message) commit (lần chuyển giao): %s" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, 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 " +"Äang bá» qua việc chuyển giao; bạn đã không biên soạn phần chú thÃch " "(message).\n" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, 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 "Bãi bá» việc chuyển giao bởi vì phần chú thÃch cá»§a nó trống rá»—ng.\n" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" -msgstr "gặp lá»—i khi ghi đối tượng chuyển giao (commit)" +msgstr "gặp lá»—i khi ghi đối tượng chuyển giao" -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "không thể khóa HEAD ref (tham chiếu)" -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "không thể cáºp nháºt ref (tham chiếu) HEAD" -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4527,130 +4743,134 @@ 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) bị vượt quá, và sau đó \"git reset HEAD\" để khắc " +"phục." -#: builtin/config.c:7 +#: builtin/config.c:8 msgid "git config [options]" msgstr "git config [các-tùy-chá»n]" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "Vị trà táºp tin cấu hình" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" -msgstr "đặt táºp tin cấu hình cần toà n cục" +msgstr "dùng táºp tin cấu hình toà n cục" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "sá» dụng táºp tin cấu hình hệ thống" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "dùng táºp tin cấu hình cá»§a kho" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "sá» dụng táºp tin cấu hình đã cho" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "blob-id" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "Ä‘á»c cấu hình từ đối tượng blob đã cho" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "Hà nh động" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "lấy giá-trị: tên [value-regex]" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "lấy tất cả giá-trị: khóa [value-regex]" -#: builtin/config.c:61 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "lấy giá trị cho regexp: name-regex [value-regex]" -#: builtin/config.c:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "lấy đặc tả giá trị cho URL: phần[.biến] URL" + +#: builtin/config.c:65 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:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "thêm biến má»›i: tên giá-trị" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "gỡ bá» biến: tên [value-regex]" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "gỡ bá» má»i cái khá»›p: tên [value-regex]" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" -msgstr "đổi tên chương: tên-cÅ© tên-má»›i" +msgstr "đổi tên phần: tên-cÅ© tên-má»›i" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" -msgstr "gỡ bá» chương: tên" +msgstr "gỡ bá» phần: tên" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "liệt kê tất" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "mở má»™t trình biên soạn" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "khe" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "tìm cấu hình mà u sắc: [mặc định]" -#: builtin/config.c:71 +#: builtin/config.c:74 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:72 +#: builtin/config.c:75 msgid "Type" msgstr "Kiểu" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "giá trị là \"true\" hoặc \"false\"" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "giá trị ở dạng số tháºp phân" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "giá trị là --bool hoặc --int" -#: builtin/config.c:76 +#: builtin/config.c:79 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:77 +#: builtin/config.c:80 msgid "Other" msgstr "Khác" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "chấm dứt giá trị vá»›i byte NUL" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "tôn trá»ng kể cà các hướng trong tìm kiếm" @@ -4731,7 +4951,7 @@ msgstr "" #: builtin/describe.c:384 #, c-format msgid "traversed %lu commits\n" -msgstr "đã xuyên %lu qua lần chuyển giao (commit)\n" +msgstr "đã xuyên %lu qua lần chuyển giao\n" #: builtin/describe.c:387 #, c-format @@ -4748,7 +4968,7 @@ msgstr "tìm các thẻ mà nó đến trước lần chuyển giao" #: builtin/describe.c:410 msgid "debug search strategy on stderr" -msgstr "chiến lược tìm kiếm trên đầu ra lá»—i chuẩn stderr" +msgstr "chiến lược tìm kiếm gỡ lá»—i trên đầu ra lá»—i chuẩn stderr" #: builtin/describe.c:411 msgid "use any ref" @@ -4776,9 +4996,9 @@ msgstr "coi như <n> thẻ gần đây nhất (mặc định: 10)" #: builtin/describe.c:421 msgid "only consider tags matching <pattern>" -msgstr "chỉ cân nhắc đến những thẻ khá»›p vá»›i <mẫu>" +msgstr "chỉ cân nhắc đến những thẻ khá»›p vá»›i <mẫu>" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback" @@ -4800,33 +5020,33 @@ msgstr "Không tìm thấy các tên, không thể mô tả gì cả." #: builtin/describe.c:489 msgid "--dirty is incompatible with commit-ishes" -msgstr "--dirty là xung khắc vá»›i các tùy chá»n dà nh cho chuyển giao (commit)" +msgstr "--dirty là xung khắc vá»›i các tùy chá»n commit-ish" -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, 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 má»m" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" -msgstr "tùy chá»n sai: %s" +msgstr "tùy chá»n không hợp lệ: %s" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "Không phải là kho git" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "đối tượng đã cho “%s†không hợp lệ." -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "đã cho nhiá»u hÆ¡n hai đối tượng blob: “%sâ€" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "đã cho đối tượng không thể nắm giữ “%sâ€." @@ -4835,39 +5055,39 @@ msgstr "đã cho đối tượng không thể nắm giữ “%sâ€." msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [rev-list-opts]" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "hiển thị tiến triển sau <n> đối tượng" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "chá»n Ä‘iá»u khiển cá»§a thẻ đã ký" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 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:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "Äổ các đánh dấu nà y và o táºp-tin" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "nháºp và o đánh dấu từ táºp tin nà y" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 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:680 +#: builtin/fast-export.c:687 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:682 +#: builtin/fast-export.c:689 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:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "Bá» qua kết xuất cá»§a dữ liệu blob" @@ -4887,146 +5107,155 @@ msgstr "git fetch --multiple [<các-tùy-chá»n>] [(<kho> | <nhóm>)...]" msgid "git fetch --all [<options>]" msgstr "git fetch --all [<các-tùy-chá»n>]" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "lấy vá» từ tất cả các máy chá»§" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 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 +#: builtin/fetch.c:79 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 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "ép buá»™c ghi đè lên nhánh ná»™i bá»™" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "lấy từ nhiá»u máy chá»§ cùng lúc" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "lấy tất cả các thẻ cùng vá»›i các đối tượng liên quan đến nó" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "không lấy tất cả các thẻ (--no-tags)" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 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 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "khi-cần" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "Ä‘iá»u khiển việc lấy vỠđệ quy trong các mô-Ä‘un-con" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "giữ các gói đã tải vá»" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "cho phép cáºp nháºt th.chiếu HEAD" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" msgstr "là m sâu hÆ¡n lịch sá» cá»§a bản sao" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "chuyển đổi hoà n toà n sang kho git" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "tmục" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 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:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "chế độ mặc định cho đệ qui" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "chấp nháºn tham chiếu cáºp nháºt .git/shallow" + +#: builtin/fetch.c:347 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:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "Không tìm thấy đối tượng %s" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "[đã cáºp nháºt]" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (không thể fetch (lấy) vá» nhánh hiện hà nh)" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "[Bị từ chối]" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "[cáºp nháºt thẻ]" -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr " (không thể cáºp nháºt tham chiếu (ref) ná»™i bá»™)" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "[thẻ má»›i]" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "[nhánh má»›i]" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "[ref (tham chiếu) má»›i]" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "không thể cáºp nháºt tham chiếu (ref) ná»™i bá»™" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "cưỡng bức cáºp nháºt" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "(non-fast-forward)" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "không thể mở %s: %s\n" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s đã không gá»i tất cả các đối tượng cần thiết\n" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "từ chối %s bởi vì các gốc nông thì không được phép cáºp nháºt" + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "Từ %.*s\n" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -5035,57 +5264,57 @@ 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" -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr " (%s sẽ trở thà nh không đầu (không được quản lý))" -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr " (%s đã trở thà nh không đầu (không được quản lý))" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "[đã xóa]" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "(không)" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, 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)" +"Từ chối việc lấy 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:742 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "Không biết là m cách nà o để lấy vá» từ %s" - -#: builtin/fetch.c:823 +#: builtin/fetch.c:794 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Tùy chá»n \"%s\" có giá trị \"%s\" là không hợp lệ cho %s" -#: builtin/fetch.c:826 +#: builtin/fetch.c:797 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Tùy chá»n \"%s\" bị bá» qua vá»›i %s\n" -#: builtin/fetch.c:928 +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "Không biết là m cách nà o để lấy vá» từ %s" + +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "Äang lấy vá» %s\n" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "không thể lấy vá» %s" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -5093,43 +5322,44 @@ 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:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "Bạn phải định rõ tên thẻ." -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "tùy chá»n --depth và --unshallow không thể sá» dụng cùng vá»›i nhau" -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "--unshallow trên kho hoà n chỉnh là không hợp lý" -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "lệnh lấy vá» \"fetch --all\" không lấy đối số kho chứa" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" msgstr "lệnh lấy vá» \"fetch --all\" không hợp lý vá»›i refspecs" -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, 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:1057 +#: builtin/fetch.c:1153 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>]" +"git fmt-merge-msg [-m <chú_thÃch>] [--log[=<n>]|--no-log] [--file <táºp-tin>]" -#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "n" @@ -5153,117 +5383,121 @@ msgstr "dùng <văn bản thưá»ng> để bắt đầu ghi chú" msgid "file to read from" msgstr "táºp tin để Ä‘á»c dữ liệu từ đó" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 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 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "trÃch dẫn để phù hợp cho hệ vá» (shell)" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "trÃch dẫn để phù hợp cho perl" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "trÃch dẫn để phù hợp cho python" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "trÃch dẫn để phù hợp cho tcl" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "hiển thị chỉ <n> tham chiếu khá»›p" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "định dạng" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "định dạng sẽ dùng cho đầu ra" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "khóa" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "tên trưá»ng cần sắp xếp" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "git fsck [các-tùy-chá»n] [<đối-tượng>...]" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "hiển thị các đối tượng không thể Ä‘á»c được" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "hiển thị các đối tượng không được quản lý" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "báo cáo các thẻ" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "báo cáo node gốc" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "tạo “ index objects head nodesâ€" -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "tạo reflogs head nodes (mặc định)" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 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 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "cho phép kiểm tra hạn chế hÆ¡n" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 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 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "hiển thị quá trình" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "git gc [các-tùy-chá»n]" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "%s không hợp lệ: “%sâ€" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, 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:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "xóa bá» các đối tượng không được tham chiếu" -#: builtin/gc.c:181 +#: builtin/gc.c:264 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:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "báºt chế độ auto-gc" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "buá»™c gc chạy ngay cả khi có tiến trình gc khác Ä‘ang chạy" + +#: builtin/gc.c:306 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -5273,43 +5507,52 @@ msgstr "" "chạy lệnh \"git gc\" má»™t cách thá»§ công. Hãy xem \"git help gc\" để biết thêm " "chi tiết.\n" -#: builtin/gc.c:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"gc Ä‘ang được thá»±c hiện trên máy “%s†pid %<PRIuMAX> (dùng --force nếu không " +"phải thế)" + +#: builtin/gc.c:341 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:22 +#: builtin/grep.c:23 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 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: gặp lá»—i tạo tuyến (thread): %s" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "Gặp lá»—i vá»›i lệnh chdir: %s" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "không thể Ä‘á»c cây (%s)" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, 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:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "chuyển đến “%c†cần má»™t giá trị bằng số" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "không mở được “%sâ€" @@ -5332,11 +5575,11 @@ msgstr "tìm cả trong các táºp tin đã bị lá» Ä‘i" #: builtin/grep.c:651 msgid "show non-matching lines" -msgstr "hiển thị những dòng không khá»›p vá»›i mẫu" +msgstr "hiển thị những dòng không khá»›p vá»›i mẫu" #: builtin/grep.c:653 msgid "case insensitive matching" -msgstr "phân biệt chữ hoa/thưá»ng" +msgstr "phân biệt HOA/thưá»ng" #: builtin/grep.c:655 msgid "match patterns only at word boundaries" @@ -5351,161 +5594,165 @@ 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:662 +msgid "process binary files with textconv filters" +msgstr "xá» lý táºp tin nhị phân vá»›i các bá»™ lá»c “textconvâ€" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "giảm xuống Ãt nhất mức <sâu>" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "dùng biểu thức chÃnh qui POSIX có mở rá»™ng" -#: builtin/grep.c:669 +#: builtin/grep.c:671 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:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "diá»…n dịch các mẫu như là chuá»—i cố định" -#: builtin/grep.c:675 +#: builtin/grep.c:677 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:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "hiển thị số cá»§a dòng" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "không hiển thị tên táºp tin" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "hiển thị các tên táºp tin" -#: builtin/grep.c:682 +#: builtin/grep.c:684 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:684 +#: builtin/grep.c:686 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:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "đồng nghÄ©a vá»›i --files-with-matches" -#: builtin/grep.c:689 +#: builtin/grep.c:691 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:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "thêm NUL và o sau tên táºp tin" -#: builtin/grep.c:693 +#: builtin/grep.c:695 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:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "tô sáng cái khá»›p" -#: builtin/grep.c:696 +#: builtin/grep.c:698 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:698 +#: builtin/grep.c:700 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:701 +#: builtin/grep.c:703 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:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "hiển thị <n> dòng ná»™i dung trước khá»›p" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "hiển thị <n> dòng ná»™i dung sau khá»›p" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" -msgstr "Dạng tắt cho -C Sá»" +msgstr "dạng viết tắt cá»§a -C Sá»" -#: builtin/grep.c:710 +#: builtin/grep.c:712 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:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "hiển thị hà m bao quanh" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "Ä‘á»c mẫu từ táºp-tin" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "match <mẫu>" -#: builtin/grep.c:719 +#: builtin/grep.c:721 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:731 +#: builtin/grep.c:733 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:733 +#: builtin/grep.c:735 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:735 +#: builtin/grep.c:737 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:739 +#: builtin/grep.c:741 msgid "pager" -msgstr "trang giấy" +msgstr "giấy" -#: builtin/grep.c:739 +#: builtin/grep.c:741 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:742 +#: builtin/grep.c:744 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:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "hiển thị cách dùng" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "chưa chỉ ra mẫu." -#: builtin/grep.c:865 +#: builtin/grep.c:870 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:888 +#: builtin/grep.c:893 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:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "--no-index hay --untracked không được sá» dụng cùng vá»›i các tùy chá»n liên " "quan đến revs." -#: builtin/grep.c:896 +#: builtin/grep.c:901 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:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "cả hai --cached và các cây phải được chỉ ra." @@ -5610,57 +5857,57 @@ msgstr "" "“%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:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "“%sâ€: không rõ chương trình xem man." -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "không có trình xem trợ giúp dạng manpage tiếp hợp vá»›i yêu cầu" -#: builtin/help.c:374 +#: builtin/help.c:378 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:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "Äịnh nghÄ©a các thuá»™c tÃnh cho má»—i đưá»ng dẫn" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "Thuáºt ngữ chuyên môn Git" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "Chỉ định các táºp tin không cần theo dõi" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "Äịnh nghÄ©a thuá»™c tÃnh mô-Ä‘un-con" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "Chỉ định Ä‘iểm xét duyệt và vùng cho Git" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "Hướng dẫn cách dùng Git ở mức cÆ¡ bản (bản 1.5.1 hay má»›i hÆ¡n)" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "Tổng quan vá» luồng công việc khuyến nghị nên dùng vá»›i Git." -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "Các chỉ dẫn chung vá» cách dùng Git là :\n" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" -msgstr "cách sá» dụng: %s%s" +msgstr "cách dùng: %s%s" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "“git %s†được đặt bà danh thà nh “%sâ€" @@ -5683,7 +5930,7 @@ msgstr[1] "không thể Ä‘iá»n và o %d byte" #: builtin/index-pack.c:254 msgid "early EOF" -msgstr "vừa đúng lúc EOF" +msgstr "gặp kết thúc EOF quá sá»›m" #: builtin/index-pack.c:255 msgid "read error on input" @@ -5747,8 +5994,8 @@ msgstr "không thể chạy hà m pread cho táºp tin pack" #, c-format msgid "premature end of pack file, %lu byte missing" msgid_plural "premature end of pack file, %lu bytes missing" -msgstr[0] "táºp tin pack bị kết thúc sá»›m, %lu byte bị thiếu" -msgstr[1] "táºp tin pack bị kết thúc sá»›m, %lu byte bị thiếu" +msgstr[0] "táºp tin pack bị kết thúc sá»›m, thiếu %lu byte" +msgstr[1] "táºp tin pack bị kết thúc sá»›m, thiếu %lu byte" #: builtin/index-pack.c:575 msgid "serious inflate inconsistency" @@ -5760,8 +6007,8 @@ msgstr "sá»± mâu thuẫn xả nén nghiêm trá»ng" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "Sá»° VA CHẠM SHA1 Äà XẢY RA VỚI %s!" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "không thể Ä‘á»c %s" @@ -5790,155 +6037,155 @@ 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:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "gặp lá»—i khi áp dụng delta" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "Äang nháºn vá» các đối tượng" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "Các đối tượng bảng mục lục" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "pack bị sai há»ng (SHA1 không khá»›p)" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" -msgstr "không thể fstat packfile" +msgstr "không thể lấy thông tin thống kê packfile" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "pack có phần thừa ở cuối" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "lá»™n xá»™n hÆ¡n cả Ä‘iên rồ khi chạy hà m parse_pack_objects()" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "Äang phân giải các delta" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "không thể tạo tuyến: %s" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "lá»™n xá»™n hÆ¡n cả Ä‘iên rồ" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "đầy đủ vá»›i %d đối tượng ná»™i bá»™" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, 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:1151 +#: builtin/index-pack.c:1152 #, 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:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" -msgstr "không thể xả đối tượng nối thêm (%d)" +msgstr "không thể xả nén đối tượng nối thêm (%d)" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "đối tượng ná»™i bá»™ %s bị há»ng" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" -msgstr "gặp lá»—i trong khi đóng táºp tin pack" +msgstr "gặp lá»—i trong khi đóng táºp tin gói (pack)" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "không thể ghi táºp tin giữ lại “%sâ€" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "không thể đóng táºp tin giữ lại đã được ghi “%sâ€" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "không thể lưu táºp tin pack" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "không thể lưu trữ táºp tin ghi mục lục" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "sai pack.indexversion=%<PRIu32>" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, 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:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "không há»— trợ Ä‘a tuyến, bá» qua %s" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Không thể mở táºp tin pack đã sẵn có “%sâ€" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "Không thể mở táºp tin “pack idx†cho “%sâ€" -#: builtin/index-pack.c:1474 +#: builtin/index-pack.c:1475 #, 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:1481 +#: builtin/index-pack.c:1482 #, 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:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "Không thể quay lại cwd" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "%s sai" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 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:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, 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â€" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "dùng tùy chá»n --verify mà không đưa ra tên packfile" @@ -5955,17 +6202,17 @@ 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 thông tin thống kê 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ể lấy thông tin thống kê 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 @@ -5975,27 +6222,27 @@ msgstr "không thể readlink “%sâ€" #: builtin/init-db.c:99 #, c-format msgid "insanely long symlink %s" -msgstr "liên kết tượng trưng dà i má»™t cách Ä‘iên rồ %s" +msgstr "liên kết má»m 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 má»m (symlink) “%s†“%sâ€" #: builtin/init-db.c:106 #, c-format msgid "cannot copy '%s' to '%s'" -msgstr "không thể sao chép %s sang %s" +msgstr "không thể sao chép “%s†sang “%sâ€" #: builtin/init-db.c:110 #, c-format msgid "ignoring template %s" -msgstr "Ä‘ang lá» Ä‘i mẫu %s" +msgstr "Ä‘ang lá» Ä‘i mẫu “%sâ€" #: builtin/init-db.c:133 #, c-format msgid "insanely long template path %s" -msgstr "đưá»ng dẫn mẫu dà i má»™t cách Ä‘iên rồ %s" +msgstr "đưá»ng dẫn mẫu “%s†dà i má»™t cách Ä‘iên rồ" #: builtin/init-db.c:141 #, c-format @@ -6020,18 +6267,13 @@ 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ể nắm (handle) táºp tin kiểu %d" +msgstr "không thể xá» lý (handle) táºp tin kiểu %d" #: builtin/init-db.c:358 #, c-format msgid "unable to move %s to %s" 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â€" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -6060,8 +6302,8 @@ msgstr "không nói chuyện được vá»›i lệnh cwd" #: builtin/init-db.c:467 msgid "" -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared" -"[=<permissions>]] [directory]" +"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]" @@ -6074,21 +6316,21 @@ msgstr "các quyá»n" 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:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "im lặng" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "không thể mkdir (tạo thư mục): %s" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "không thể chdir (chuyển đổi thư mục) sang %s" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -6097,11 +6339,11 @@ 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 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "Không thể truy cáºp thư mục là m việc hiện hà nh" -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "không thể truy cáºp cây (tree) là m việc “%sâ€" @@ -6114,387 +6356,387 @@ msgstr "git log [<các-tùy-chá»n>] [<vùng xem xét>] [[--] <đưá»ng-dẫn>. msgid " or: git show [options] <object>..." msgstr " hay: git show [các-tùy-chá»n] <đối-tượng>..." -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "chặn má»i kết xuất từ diff" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "hiển thị mã nguồn" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "Sá» dụng táºp tin ánh xạ thư" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "các tùy chá»n trang trÃ" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "Kết xuất cuối cùng: %d %s\n" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "Không thể Ä‘á»c đối tượng %s" -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "Không nháºn ra kiểu: %d" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "format.headers không có giá trị cụ thể" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "tên cá»§a thư mục kết xuất quá dà i" -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "Không thể mở táºp tin miếng vá: %s" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "Cần chÃnh xác má»™t vùng." -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "Không phải là má»™t vùng." -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" -msgstr "â€Cover letter†cần cho định dạng thư" +msgstr "“Cover letter†cần cho định dạng thư" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "in-reply-to Ä‘iên rồ: %s" -#: builtin/log.c:995 +#: builtin/log.c:1015 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:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "Hai thư mục kết xuất?" -#: builtin/log.c:1155 +#: builtin/log.c:1175 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:1158 +#: builtin/log.c:1178 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:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "hiển thị miếng vá ra đầu ra chuẩn" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "tạo bì thư" -#: builtin/log.c:1166 +#: builtin/log.c:1186 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:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "sfx" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "sá» dụng <sfx> thay cho “.patchâ€" -#: builtin/log.c:1170 +#: builtin/log.c:1190 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:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "đánh dấu chuá»—i nối tiếp dạng thứ-N re-roll" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" msgstr "Dùng [<tiá»n-tố>] thay cho [VÃ]" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "lưu các táºp tin kết quả trong <t.mục>" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "không strip/add [VÃ]" -#: builtin/log.c:1183 +#: builtin/log.c:1203 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:1185 +#: builtin/log.c:1205 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:1187 +#: builtin/log.c:1207 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:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "Lá»i nhắn" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "đầu đỠthư" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "thêm đầu đỠthư" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "thư Ä‘iện tá»" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "thêm To: đầu đỠthư" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "thêm Cc: đầu đỠthư" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "thụt lá»" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" msgstr "" -"đặt `Äịa chỉ gá»i' thà nh <thụ lá»> (hoặc thụt lá» ngưá»i commit nếu bá» quên)" +"đặt “Äịa chỉ gá»i†thà nh <thụ lá»> (hoặc thụt lá» ngưá»i commit nếu bá» quên)" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "message-id" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "dùng thư đầu tiên để trả lá»i <message-id>" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "ranh giá»›i" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "Ä‘Ãnh kèm miếng vá" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "dùng miếng vá là m ná»™i dung" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "cho phép luồng lá»i nhắn, kiểu: “shallowâ€, “deepâ€" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "chữ ký" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "thêm chữ ký" -#: builtin/log.c:1214 +#: builtin/log.c:1233 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:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "dòng thụt lá» không hợp lệ: %s" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "-n và -k loại từ lẫn nhau." -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix và -k xung khắc nhau." -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "--name-only không hợp lý" -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "--name-status không hợp lý" -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "--check không hợp lý" -#: builtin/log.c:1340 +#: builtin/log.c:1359 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:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "Không thể tạo thư mục “%sâ€" -#: builtin/log.c:1490 +#: builtin/log.c:1509 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:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<thượng-nguồn> [<head> [<giá»›i-hạn>]]]" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, 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 <thượng-nguồn> má»™t cách " -"thá»§ công.\n" +"Không tìm thấy nhánh mạng được theo dõi, hãy chỉ định <thượng-nguồn> má»™t " +"cách thá»§ công.\n" -#: builtin/log.c:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" -msgstr "Không hiểu lần chuyển giao (commit) %s" +msgstr "Không hiểu lần chuyển giao %s" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "git ls-files [các-tùy-chá»n] [<táºp-tin>...]" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 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:467 +#: builtin/ls-files.c:457 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:469 +#: builtin/ls-files.c:459 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:471 +#: builtin/ls-files.c:461 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:473 +#: builtin/ls-files.c:463 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:475 +#: builtin/ls-files.c:465 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:477 +#: builtin/ls-files.c:467 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:480 +#: builtin/ls-files.c:470 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" +msgstr "hiển thị tên đối tượng cá»§a ná»™i dung được đặt lên bệ phóng ra kết xuất" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 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:484 +#: builtin/ls-files.c:474 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:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "không hiển thị thư mục rá»—ng" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 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:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "hiển thị thông tin resolve-undo" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 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:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "mẫu loại trừ được Ä‘á»c từ <táºp tin>" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 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:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "thêm loại trừ tiêu chuẩn kiểu git" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 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:508 +#: builtin/ls-files.c:498 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:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "tree-ish" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 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:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "hiển thị dữ liệu gỡ lá»—i" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 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 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "chỉ hiển thị các tree" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "đệ quy và o các thư mục con" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "hiển thị cây khi đệ quy" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "chấm dứt mục tin vá»›i byte NUL" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 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 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "chỉ liệt kê tên táºp tin" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "dùng tên đưá»ng dẫn đầy đủ" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 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)" @@ -6529,151 +6771,151 @@ 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:198 +#: builtin/merge.c:191 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:201 +#: builtin/merge.c:194 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:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "(đồng nghÄ©a vá»›i --stat)" -#: builtin/merge.c:204 +#: builtin/merge.c:197 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:207 +#: builtin/merge.c:200 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" +msgstr "tạo má»™t lần chuyển giao đưon thay vì thá»±c hiện việc hòa trá»™n" -#: builtin/merge.c:209 +#: builtin/merge.c:202 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:211 +#: builtin/merge.c:204 msgid "edit message before committing" -msgstr "sá»a chú thÃch trước khi chuyển giao (commit)" +msgstr "sá»a chú thÃch trước khi chuyển giao" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "cho phép fast-forward (mặc định)" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "bá» qua nếu fast-forward không thể được" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "Thẩm tra xem lần chuyển giao có tên đó có chữ ký GPG hợp lệ hay không" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "chiến lược" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "chiến lược hòa trá»™n sẽ dùng" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "tùy_chá»n=giá_trị" -#: builtin/merge.c:222 +#: builtin/merge.c:215 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:224 +#: builtin/merge.c:217 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:228 +#: builtin/merge.c:221 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:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "không thể chạy stash." -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "stash gặp lá»—i" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "không phải là má»™t đối tượng hợp lệ: %s" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "read-tree gặp lá»—i" -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr " (không có gì để squash)" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Squash commit -- không cáºp nháºt HEAD\n" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "Äang ghi SQUASH_MSG" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "Hoà n thà nh SQUASH_MSG" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format 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" +msgstr "Không có lá»i chú thÃch hòa trá»™n -- nên không cáºp nháºt HEAD\n" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, 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 nà o cả" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Chuá»—i branch.%s.mergeoptions sai: %s" -#: builtin/merge.c:657 +#: builtin/merge.c:650 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:685 +#: builtin/merge.c:678 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:699 +#: builtin/merge.c:692 #, 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:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "không thể ghi %s" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "Không thể Ä‘á»c từ “%sâ€" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, 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" +"Vẫn chưa hòa trá»™n các lần chuyển giao; sá» dụng lệnh “git commit†để hoà n tất " +"việc hòa trá»™n.\n" -#: builtin/merge.c:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6684,216 +6926,220 @@ msgid "" msgstr "" "Hãy nháºp và o các thông tin để giải thÃch tại sao sá»± hòa trá»™n nà y là cần " "thiết,\n" -"đặc biệt là khi nó hòa trá»™n ngược dòng đã cáºp nháºt và o trong má»™t nhánh " +"đặc biệt là khi nó hòa trá»™n thượng nguồn đã cáºp nháºt và o trong má»™t nhánh " "topic.\n" "\n" "Những dòng được bắt đầu bằng “%c†sẽ được bá» qua, và phần chú thÃch nà y nếu " "rá»—ng\n" -"sẽ há»§y bá» lần chuyển giao (commit).\n" +"sẽ há»§y bá» lần chuyển giao.\n" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "Chú thÃch cá»§a lần commit (chuyển giao) bị trống rá»—ng." -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "Thần kỳ.\n" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, 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" +"Việc tá»± động hòa trá»™n gặp lá»—i; hãy sá»a các xung đột sau đó chuyển giao kết " +"quả.\n" -#: builtin/merge.c:934 +#: builtin/merge.c:927 #, 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:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "không phải nhánh hiện hà nh" -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "Không có máy chá»§ cho nhánh hiện hà nh." -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." 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:984 +#: builtin/merge.c:977 #, 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" +msgstr "Không nhánh mạng theo dõi cho %s từ %s" -#: builtin/merge.c:1140 +#: builtin/merge.c:1133 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ả (thiếu MERGE_HEAD)." -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." 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." +"Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trá»™n." -#: builtin/merge.c:1159 git-pull.sh:34 +#: builtin/merge.c:1152 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:1163 +#: builtin/merge.c:1156 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." 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." +"Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trá»™n." -#: builtin/merge.c:1166 +#: builtin/merge.c:1159 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:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "Bạn không thể kết hợp --squash vá»›i --no-ff." -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 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 và merge.defaultToUpstream chưa được đặt." -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 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" +"Không thể hòa trá»™n má»™t cách đúng đắn má»™t lần chuyển giao và o má»™t head rá»—ng" -#: builtin/merge.c:1219 +#: builtin/merge.c:1212 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:1221 +#: builtin/merge.c:1214 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" +"Chuyển giao không-fast-forward không hợp lý ở trong má»™t head trống rá»—ng" -#: builtin/merge.c:1226 +#: builtin/merge.c:1219 #, 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:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "" "Lần chuyển giao %s có má»™t chữ ký GPG không đáng tin, được cho là bởi %s." -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "Lần chuyển giao %s có má»™t chữ ký GPG sai, được cho là bởi %s." #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." -msgstr "Lần chuyển giao (commit) %s không có chữ ký GPG." +msgstr "Lần chuyển giao %s không có chữ ký GPG." -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "Lần chuyển giao %s có má»™t chữ ký GPG tốt bởi %s\n" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "Äang cáºp nháºt %s..%s\n" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, 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:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "Không.\n" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 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:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, 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:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Äang thá» chiến lược hòa trá»™n %s...\n" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, 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:1543 +#: builtin/merge.c:1536 #, 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:1552 +#: builtin/merge.c:1545 #, 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:1564 +#: builtin/merge.c:1557 #, 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" -#: builtin/merge-base.c:26 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." -msgstr "git merge-base [-a|--all] <commit> <commit>..." +msgstr "git merge-base [-a|--all] <commit> <lần_chuyển_giao>..." -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." -msgstr "git merge-base [-a|--all] --octopus <lần commit>..." +msgstr "git merge-base [-a|--all] --octopus <lần_chuyển_giao>..." -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." -msgstr "git merge-base --independent <lần commit>..." +msgstr "git merge-base --independent <lần_chuyển_giao>..." -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" -msgstr "git merge-base --is-ancestor <commit> <commit>" +msgstr "git merge-base --is-ancestor <commit> <lần_chuyển_giao>" + +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <tham-chiếu> [<lần_chuyển_giao>]" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:214 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 +#: builtin/merge-base.c:216 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 +#: builtin/merge-base.c:218 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 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "là cha mẹ đầu tiên cá»§a cái khác?" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "tìm xem <commit> được rẽ nhánh ở đâu từ reflog cá»§a <th.chiếu>" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -6950,118 +7196,133 @@ msgstr "cho phép thiếu đối tượng" 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 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "git mv [các-tùy-chá»n] <nguồn>... <Ä‘Ãch>" -#: builtin/mv.c:64 +#: builtin/mv.c:71 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 +#: builtin/mv.c:72 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 +#: builtin/mv.c:122 #, 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" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "nguồn sai" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "không thể di chuyển má»™t thư mục và o trong chÃnh nó được" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "không di chuyển được thư mục thông qua táºp tin" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "Hả? Thư mục “%s†trong chỉ mục và không mô-Ä‘un con?" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "" +"Vui lòng đưa các thay đổi cá»§a bạn và o “.gitmodules†hay tạm cất chúng Ä‘i để " +"xá» lý" + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "Hả? %.*s trong bảng mục lục à ?" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "thư mục nguồn là trống rá»—ng" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "không nằm dưới sá»± quản lý mã nguồn" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "Ä‘Ãch đã tồn tại sẵn rồi" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "Ä‘ang ghi đè lên “%sâ€" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "Không thể ghi đè" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "Nhiá»u nguồn cho cùng má»™t Ä‘Ãch" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "thư mục Ä‘Ãch không tồn tại" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s, nguồn=%s, Ä‘Ãch=%s" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "Äổi tên %s thà nh %s\n" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" -msgstr "đổi tên %s gặp lá»—i" +msgstr "gặp lá»—i khi đổi tên “%sâ€" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "git name-rev [các-tùy-chá»n] <commit>..." -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "git name-rev [các-tùy-chá»n] --all" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "git name-rev [các-tùy-chá»n] --stdin" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "chỉ hiển thị tên (không SHA-1)" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 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:316 +#: builtin/name-rev.c:315 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:318 +#: builtin/name-rev.c:317 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:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "Ä‘á»c từ đầu và o tiêu chuẩn" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" -msgstr "cho phép hiển thị các tên “chưa định nghÄ©a“" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "cho phép in các tên “chưa định nghÄ©a†(mặc định)" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "bãi bá» tham chiếu các thẻ trong đầu và o (dùng ná»™i bá»™)" @@ -7213,12 +7474,12 @@ msgstr "không thể ghi đối tượng ghi chú (note)" msgid "The note contents has been left in %s" msgstr "Ná»™i dung ghi chú còn lại %s" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "không thể Ä‘á»c “%sâ€" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "không thể mở hay Ä‘á»c “%sâ€" @@ -7226,7 +7487,7 @@ msgstr "không thể mở hay Ä‘á»c “%sâ€" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Gặp lá»—i khi phân giải “%s†như là má»™t tham chiếu (ref) hợp lệ." @@ -7239,7 +7500,7 @@ msgstr "Gặp lá»—i khi Ä‘á»c đối tượng “%sâ€." #: builtin/notes.c:312 #, c-format msgid "Malformed input line: '%s'." -msgstr "Dòng nháºp và o dị hình: “%sâ€." +msgstr "Dòng đầu và o dị hình: “%sâ€." #: builtin/notes.c:327 #, c-format @@ -7320,7 +7581,7 @@ msgstr "" #: builtin/notes.c:539 #, 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." +msgstr "Thiếu ghi chú trên đối tượng nguồn %s. Không thể sao chép." #: builtin/notes.c:588 #, c-format @@ -7386,7 +7647,7 @@ msgstr "notes_ref" msgid "use notes from <notes_ref>" msgstr "dùng “notes†từ <notes_ref>" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "Không hiểu câu lệnh con: %s" @@ -7403,149 +7664,149 @@ 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 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "lá»—i giải nén (%d)" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "phiên bản mục lục không được há»— trợ %s" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "phiên bản mục lục sai “%sâ€" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "tùy chá»n %s không chấp nháºn dạng thức âm" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, 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" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "không hiển thị bá»™ Ä‘o tiến trình" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "hiển thị bá»™ Ä‘o tiến trình" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 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:2454 +#: builtin/pack-objects.c:2453 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:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "phiên bản[,offset]" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 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:2459 +#: builtin/pack-objects.c:2458 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:2461 +#: builtin/pack-objects.c:2460 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:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "bá» qua các đối tượng đóng gói" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 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:2467 +#: builtin/pack-objects.c:2466 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:2469 +#: builtin/pack-objects.c:2468 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:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "dùng lại các delta sẵn có" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "dùng lại các đối tượng sẵn có" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "dùng các đối tượng OFS_DELTA" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 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:2479 +#: builtin/pack-objects.c:2478 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:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr " Ä‘á»c tham số “revision†từ thiết bị nháºp chuẩn" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 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:2486 +#: builtin/pack-objects.c:2485 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:2489 +#: builtin/pack-objects.c:2488 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:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "xuất gói ra đầu ra tiêu chuẩn" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 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:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "giữ lại các đối tượng không thể Ä‘á»c được" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "thá»i-gian" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 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:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "tạo gói nhẹ" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 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:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "mức nén gói" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" msgstr "không ẩn các lần chuyển giao bởi “graftsâ€" @@ -7569,15 +7830,15 @@ msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <thá»i-gian>] [--] [<head>...]" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "không gỡ bá», chỉ hiển thị" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "báo cáo các đối tượng đã prune" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "các đối tượng hết hạn cÅ© hÆ¡n khoảng <thá»i gian>" @@ -7585,15 +7846,15 @@ msgstr "các đối tượng hết hạn cÅ© hÆ¡n khoảng <thá»i gian>" msgid "git push [<options>] [<repository> [<refspec>...]]" msgstr "git push [<các-tùy-chá»n>] [<kho-chứa> [<refspec>...]]" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "dùng tốc ký tag không có <thẻ>" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "--delete chỉ chấp nháºn các tên tham chiếu (ref) dạng thưá»ng" -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." @@ -7602,7 +7863,7 @@ msgstr "" "Äể 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 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7616,7 +7877,7 @@ msgid "" " git push %s %s\n" "%s" msgstr "" -"Nhánh thượng nguồn (upstream) cá»§a nhánh hiện tại cá»§a bạn không khá»›p\n" +"Nhánh thượng nguồn 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" @@ -7627,7 +7888,7 @@ msgstr "" " git push %s %s\n" "%s" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7642,7 +7903,7 @@ msgstr "" "\n" " git push %s HEAD:<tên-cá»§a-nhánh-máy-chá»§>\n" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7650,18 +7911,18 @@ msgid "" "\n" " git push --set-upstream %s %s\n" msgstr "" -"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 " +"Nhánh hiện tại %s không có nhánh thượng nguồn nà o.\n" +"Äể push (đẩy lên) nhánh hiện tại và đặt máy chá»§ nà y là m thượng nguồn " "(upstream), sá» dụng\n" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:139 +#: builtin/push.c:181 #, 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 thượng nguồn (upstream), từ chối push." +msgstr "Nhánh hiện tại %s có nhiá»u nhánh thượng nguồn, từ chối push." -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7673,7 +7934,7 @@ msgstr "" "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:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7685,6 +7946,13 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" @@ -7692,28 +7960,36 @@ msgid "" 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" +"Äể không hiển thị nhắc nhở nà y và duy trì cách xá» lý hiện nay sau thay đổi " +"mặc định,\n" +"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" +"Äể không hiển thị nhắc nhở nà y và áp dụng cách ứng xá» má»›i, hãy chạy lệnh:\n" "\n" " git config --global push.default simple\n" "\n" +"Khi push.default được đặt thà nh “matchingâ€, git sẽ đẩy các nhánh ná»™i bá»™\n" +"lên các nhánh trên máy chá»§, cái mà có cùng tên.\n" +"\n" +"Trong 2.0, Git sẽ mặc định duy trì các ứng xỠ“simpleâ€,\n" +"cái nà y chỉ đẩy những nhánh hiện hà nh lên các nhánh tương ứng\n" +"trên máy chá»§ cái mà lệnh “git pull†dùng để cáºp nháºt nhánh hiện tại.\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:225 +#: builtin/push.c:274 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:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7727,7 +8003,7 @@ msgstr "" "Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi " "tiết." -#: builtin/push.c:238 +#: builtin/push.c:287 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" @@ -7742,7 +8018,7 @@ msgstr "" "thà nh “simpleâ€, “current†hoặc “upstream†để chỉ push nhánh hiện hà nh mà " "thôi." -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7756,7 +8032,7 @@ msgstr "" "Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi " "tiết." -#: builtin/push.c:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7771,11 +8047,11 @@ msgstr "" "Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi " "tiết." -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "Việc cáºp nháºt bị từ chối bởi vì thẻ đã sẵn có từ trước trên máy chá»§." -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" @@ -7787,22 +8063,22 @@ msgstr "" "tượng\n" "không phải chuyển giao, mà không sá» dụng tùy chá»n “--forceâ€.\n" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "Äang push (đẩy) lên %s\n" -#: builtin/push.c:324 +#: builtin/push.c:379 #, 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â€" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "repository (kho) sai “%sâ€" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7823,88 +8099,95 @@ msgstr "" "\n" " git push <tên>\n" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "--all và --tags xung khắc nhau" -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" -msgstr "--all không thể được tổ hợp cùng vá»›i refspecs" +msgstr "--all không thể được tổ hợp cùng vá»›i đặc tả đưá»ng dẫn" -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "--mirror và --tags xung khắc nhau" -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" -msgstr "--mirror không thể được tổ hợp cùng vá»›i refspecs" +msgstr "--mirror không thể được tổ hợp cùng vá»›i đặc tả đưá»ng dẫn" -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "--all và --mirror xung khắc nhau" -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "kho" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" -msgstr "push tất cả refs" +msgstr "push tất cả các tham chiếu" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" -msgstr "mirror tất cả refs" +msgstr "mirror tất cả các tham chiếu" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" -msgstr "xóa refs" +msgstr "xóa các tham chiếu" -#: builtin/push.c:450 +#: builtin/push.c:505 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)" +msgstr "push các thẻ (không dùng cùng vá»›i --all hay --mirror)" -#: builtin/push.c:453 +#: builtin/push.c:508 msgid "force updates" msgstr "ép buá»™c cáºp nháºt" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "tên-tham-chiếu>:<cần" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "yêu cầu giá-trị cÅ© cá»§a tham chiếu thì là giá-trị nà y" + +#: builtin/push.c:513 msgid "check" msgstr "kiểm tra" -#: builtin/push.c:455 +#: builtin/push.c:514 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:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "tạo gói nhẹ" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" -msgstr "nháºn vá» chương trình pack" +msgstr "chương trình nháºn gói" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" -msgstr "đặt thượng nguồn (upstream) cho git pull/status" +msgstr "đặt thượng nguồn cho git pull/status" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" -msgstr "prune (cắt cụt) những tham chiếu (refs) bị gỡ bá»" +msgstr "xén tỉa những tham chiếu (refs) bị gỡ bá»" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" -msgstr "vòng qua “pre-push hookâ€" +msgstr "vòng qua móc tiá»n-đẩy “pre-pushâ€" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" -msgstr "push bị trượt nhưng các thẻ thÃch hợp" +msgstr "push phần bị thiếu nhưng nhưng các thẻ lại thÃch hợp" -#: builtin/push.c:476 +#: builtin/push.c:535 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:478 +#: builtin/push.c:537 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" @@ -7982,23 +8265,23 @@ msgstr "bá» qua áp dụng bá»™ lá»c lấy ra (checkout) thưa thá»›t" #: builtin/read-tree.c:138 msgid "debug unpack-trees" -msgstr "gỡ lá»—i unpack-trees" +msgstr "gỡ lá»—i “unpack-treesâ€" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" -msgstr "%s' cho '%s' không phải là dấu thá»i gian hợp lệ" +msgstr "giá trị %s dà nh cho “%s†không phải là dấu vết thá»i gian hợp lệ" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "“%s†không phải là dấu thá»i gian hợp lệ" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "git remote [-v | --verbose]" -#: builtin/remote.c:12 +#: builtin/remote.c:13 msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <name> <url>" @@ -8006,78 +8289,82 @@ 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 +#: builtin/remote.c:14 builtin/remote.c:33 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 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "git remote remove <tên>" -#: builtin/remote.c:15 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:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <tên> (-a | --auto | -d | --delete | <nhánh>)" + +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "git remote [-v | --verbose] show [-n] <tên>" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "git remote prune [-n | --dry-run] <tên>" -#: builtin/remote.c:18 +#: builtin/remote.c:19 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 +#: builtin/remote.c:20 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 +#: builtin/remote.c:21 builtin/remote.c:69 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 +#: builtin/remote.c:22 builtin/remote.c:70 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 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "git remote set-url --delete <tên> <url>" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "git remote add [<các-tùy-chá»n>] <tên> <url>" -#: builtin/remote.c:47 +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <tên> (-a | --auto | -d | --delete | <nhánh>)" + +#: builtin/remote.c:48 msgid "git remote set-branches <name> <branch>..." msgstr "git remote set-branches <tên> <nhánh>..." -#: builtin/remote.c:48 +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "git remote set-branches --add <tên> <nhánh>..." -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "git remote show [<các-tùy-chá»n>] <tên>" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "git remote prune [<các-tùy-chá»n>] <tên>" -#: builtin/remote.c:63 +#: builtin/remote.c:64 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 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "Äang cáºp nháºt %s" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" @@ -8085,102 +8372,101 @@ msgstr "" "--mirror nguy hiểm và không dùng nữa; xin hãy\n" "\t sá» dụng tùy chá»n --mirror=fetch hoặc --mirror=push để thay thế" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "không hiểu tham số máy bản sao (mirror): %s" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" -msgstr "lấy vá» (fetch) các nhánh từ máy chá»§" +msgstr "lấy vá» các nhánh từ máy chá»§" -#: builtin/remote.c:165 +#: builtin/remote.c:155 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)" +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á»" -#: builtin/remote.c:168 +#: builtin/remote.c:158 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)" +msgstr "hoặc không lấy vá» bất kỳ thẻ nà o (--no-tags)" -#: builtin/remote.c:170 +#: builtin/remote.c:160 msgid "branch(es) to track" -msgstr "các nhánh theo vết" +msgstr "các nhánh để theo dõi" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "nhánh master" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "push|fetch" -#: builtin/remote.c:173 +#: builtin/remote.c:163 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 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "Ä‘ang chỉ định má»™t nhánh master không hợp lý vá»›i tùy chá»n --mirror" -#: builtin/remote.c:187 +#: builtin/remote.c:177 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â€" +msgstr "chỉ định những nhánh để theo dõi chỉ hợp lý vá»›i các “fetch mirrorâ€" -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, 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:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "“%s†không phải tên máy chá»§ hợp lệ" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "Không thể cà i đặt nhánh master “%sâ€" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "nhiá»u hÆ¡n má»™t %s" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" -msgstr "Không thể lấy ánh xạ (map) fetch cho refspec %s" +msgstr "Không thể lấy ánh xạ (map) fetch cho đặc tả tham chiếu %s" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "(khá»›p)" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "(xóa)" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%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:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "Không có máy chá»§ nà o như thế: %s" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, 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 phần cá»§a cấu hình từ “%s†thà nh “%sâ€" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, 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á» phần cấu hình “%sâ€" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -8191,32 +8477,32 @@ msgstr "" "\t%s\n" "\tXin hãy cáºp nháºt phần cấu hình má»™t cách thá»§ công nếu thấy cần thiết." -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "Không thể nối thêm “%sâ€" -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "Không thể đặt “%sâ€" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" -msgstr "việc xoá %s gặp lá»—i" +msgstr "gặp lá»—i khi xoá “%sâ€" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" -msgstr "tạo %s gặp lá»—i" +msgstr "gặp lá»—i khi tạo “%sâ€" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" -msgstr "Không thể gỡ bá» nhánh %s" +msgstr "Không thể gỡ bá» nhánh “%sâ€" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -8231,265 +8517,330 @@ msgstr[1] "" "Ä‘i;\n" "để xóa Ä‘i, sá» dụng:" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr " má»›i (lần lấy vá» tiếp theo sẽ lưu trong remotes/%s)" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" -msgstr " được theo vết" +msgstr " được theo dõi" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" -msgstr " cÅ© (dùng “git remote prune†để gỡ bá»)" +msgstr " cÅ© rÃch (dùng “git remote prune†để gỡ bá»)" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr " ???" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "branch.%s.merge không hợp lệ; không thể rebase vá» phÃa > 1 nhánh" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "thá»±c hiện rebase trên máy chá»§ %s" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr " hòa trá»™n vá»›i máy chá»§ %s" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr " và vá»›i máy chá»§" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "hòa trá»™n vá»›i máy chá»§ %s" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr " và vá»›i máy chá»§" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "tạo" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "xoá" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "đã cáºp nháºt" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "có-thể-fast-forward" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "dữ liệu ná»™i bá»™ đã cÅ©" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s ép buá»™c thà nh %-*s (%s)" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" -msgstr " %-*s push tá»›i %-*s (%s)" +msgstr " %-*s đẩy lên thà nh %-*s (%s)" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr " %-*s ép buá»™c thà nh %s" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" -msgstr " %-*s push tá»›i %s" +msgstr " %-*s đẩy lên thà nh %s" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "không truy vấn các máy chá»§" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "* máy chá»§ %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" -msgstr " URL để lấy vá» (fetch): %s" +msgstr " URL để lấy vá»: %s" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "(không có URL)" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr " URL để đẩy lên (push): %s" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr " Nhánh HEAD: %s" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format 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 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" 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:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr " (trạng thái không được yêu cầu)" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 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â€:" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 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â€" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, 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:" -#: builtin/remote.c:1199 +#: builtin/remote.c:1252 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 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "xóa refs/remotes/<tên>/HEAD" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "Không thể xác định được HEAD máy chá»§" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "Nhiá»u nhánh HEAD máy chá»§. Hãy chá»n rõ rà ng má»™t:" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "Không thể xóa bá» %s" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" -msgstr "Không phải là tham chiếu (ref) hợp lệ: %s" +msgstr "Không phải là tham chiếu hợp lệ: %s" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "Không thể cà i đặt %s" -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr " %s sẽ trở thà nh không đầu (không được quản lý)!" -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr " %s đã trở thà nh không đầu (không được quản lý)!" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "Äang xén bá»›t %s" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "URL: %s" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr " * [nên xén bá»›t] %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr " *[đã bị xén] %s" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "cắt máy chá»§ sau khi lấy vá»" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "Không có máy chá»§ nà o có tên “%sâ€" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "thêm nhánh" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "chưa chỉ ra máy chá»§ nà o" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "đẩy các “URL†bằng tay" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "thêm URL" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "xóa URLs" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "--add --delete không hợp lý" -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "Kiểu mẫu URL cÅ© không hợp lệ: %s" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "Không tìm thấy URL như váºy: %s" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 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 +#: builtin/remote.c:1564 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/repack.c:15 +msgid "git repack [options]" +msgstr "git repack [các-tùy-chá»n]" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "đóng gói má»i thứ trong má»™t gói đơn" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "giống vá»›i -a, và chỉnh sá»a các đối tượng không Ä‘á»c được thiếu sót" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "xóa bá» các gói dư thừa, và chạy git-prune-packed" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "chuyển --no-reuse-delta cho git-pack-objects" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "chuyển --no-reuse-object cho git-pack-objects" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "không chạy git-update-server-info" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "chuyển --local cho git-pack-objects" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "ngà y ước tÃnh" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "vá»›i -A, các đối tượng cÅ© hÆ¡n khoảng thá»i gian nà y thì không bị mất" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "kÃch thước cá»a sổ được dùng cho nén “deltaâ€" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "byte" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "giống như trên, nhưng giá»›i hạn kÃch thước bá»™ nhá»› hay vì số lượng" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "giá»›i hạn độ sâu tối Ä‘a cá»§a “deltaâ€" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "kcÃh thước tối Ä‘a cho từng táºp tin gói" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "gặp lá»—i khi xóa bỠ“%sâ€" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "git replace [-f] <đối-tượng> <thay-thế>" @@ -8499,26 +8850,30 @@ 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>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<định_dạng>] [-l [<mẫu>]]" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "liệt kê các refs thay thế" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "xóa tham chiếu (refs) thay thế" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "thay thế tham chiếu (ref) nếu nó đã sẵn có" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "dùng định dạng nà y" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 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" @@ -8579,87 +8934,91 @@ msgstr "HEAD hiện giá» tại %s" 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:251 +#: builtin/reset.c:262 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:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "đặt lại (reset) HEAD và bảng mục lục" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "chỉ đặt lại (reset) HEAD" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 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:260 +#: builtin/reset.c:271 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:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "Gặp lá»—i khi phân giải “%s†như là điểm xét duyệt hợp lệ." -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "không thể phân tÃch đối tượng “%sâ€." -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "Gặp lá»—i khi phân giải “%s†như là má»™t cây (tree) hợp lệ." -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "--patch xung khắc vá»›i --{hard,mixed,soft}" -#: builtin/reset.c:304 +#: builtin/reset.c:315 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>â€." -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "Không thể thá»±c hiện lệnh %s reset vá»›i các đưá»ng dẫn." -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" -msgstr "%s reset không được phép trên kho bare (trên máy chá»§)" +msgstr "%s reset không được phép trên kho thuần" + +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "Những thay đổi được đưa ra khá»i bệ phóng sau khi reset:" -#: builtin/reset.c:336 +#: builtin/reset.c:350 #, 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 duyệt “%sâ€." -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" -msgstr "Những thay đổi bị bá» trạng thái (stage) sau khi reset:" - -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "Không thể ghi táºp tin lưu bảng mục lục má»›i." -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "git rev-parse --parseopt [các-tùy-chá»n] -- [<th.số>...]" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" -msgstr "giữ “--“ chuyển qua là m tham số" +msgstr "giữ lại “--†chuyển sang là m tham số" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 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:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "kết xuất trong định dạng gáºy dà i" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8668,8 +9027,8 @@ msgid "" "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" +" hoặc: git rev-parse --sq-quote [<Ä‘.số>...]\n" +" hoặc: 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." @@ -8689,84 +9048,84 @@ msgstr "git cherry-pick [các-tùy-chá»n] <commit-ish>..." msgid "git cherry-pick <subcommand>" msgstr "git cherry-pick <lệnh-con>" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, 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:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "kết thúc cherry-pick hay revert liên tiếp nhau" -#: builtin/revert.c:106 +#: builtin/revert.c:81 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:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "không cherry-pick hay revert liên tiếp nhau" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "không commit má»™t cách tá»± động." -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "sá»a lại chú thÃch cho commit" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "số cá»§a cha mẹ" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "chiến lược hòa trá»™n" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "tùy chá»n" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "tùy chá»n cho chiến lược hòa trá»™n" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" -msgstr "nối thêm tên lần chuyển giao (commit)" +msgstr "nối thêm tên lần chuyển giao" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "cho phép fast-forward" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "cấm khởi tạo lần chuyển giao trống rá»—ng" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" -msgstr "chấp nháºn chuyển giao (commit) mà không ghi chú gì" +msgstr "chấp nháºn chuyển giao mà không ghi chú gì" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "giữ lại các lần chuyển giao dư thừa, rá»—ng" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "lá»—i chương trình" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "revert gặp lá»—i" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "cherry-pick gặp lá»—i" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "git rm [các-tùy-chá»n] [--] <táºp-tin>..." -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8780,7 +9139,7 @@ msgstr[1] "" "các mô-Ä‘un-con sau đây (hay má»™t trong số mô-Ä‘un-con bên trong cá»§a nó)\n" "dùng má»™t thư mục .git:" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -8789,7 +9148,7 @@ msgstr "" "(dùng /\"rm -rf/\" nếu bạn thá»±c sá»± muốn gỡ bá» nó cùng vá»›i tất cả lịch sá» cá»§a " "chúng)" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8803,7 +9162,7 @@ msgstr[1] "" "các táºp tin sau đây có trạng thái khác biệt ná»™i dung từ cả táºp tin\n" "và cả HEAD:" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" @@ -8811,13 +9170,13 @@ msgstr "" "\n" "(dùng -f để buá»™c gỡ bá»)" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "táºp tin sau đây có thay đổi trạng thái trong bảng mục lục:" msgstr[1] "các táºp tin sau đây có thay đổi trạng thái trong bảng mục lục:" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" @@ -8825,38 +9184,38 @@ msgstr "" "\n" "(dùng tùy chá»n --cached để giữ táºp tin, hoặc -f để ép buá»™c gỡ bá»)" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "táºp tin sau đây có những thay đổi ná»™i bá»™:" msgstr[1] "những táºp tin sau đây có những thay đổi ná»™i bá»™:" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "không liệt kê các táºp tin đã gỡ bá»" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "chỉ gỡ bá» từ mục lục" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "ghi đè lên kiểm tra cáºp nháºt" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "cho phép gỡ bỠđệ qui" -#: builtin/rm.c:274 +#: builtin/rm.c:275 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:345 +#: builtin/rm.c:336 #, 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" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm: không thể gỡ bá» %s" @@ -8870,23 +9229,23 @@ msgstr "git shortlog [các-tùy-chá»n] [<vùng-xét-duyệt>] [[--] [<đưá»ng msgid "Missing author: %s" msgstr "Thiếu tên tác giả: %s" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 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:230 +#: builtin/shortlog.c:232 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:232 +#: builtin/shortlog.c:234 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:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "w[,i1[,i2]]" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "Ngắt dòng khi quá dà i" @@ -8906,77 +9265,77 @@ msgstr "" 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:650 +#: builtin/show-branch.c:649 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:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "hiển thị các nhánh remote-tracking" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "mà u “*!+-†tương ứng vá»›i nhánh" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 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:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "đồng nghÄ©a vá»›i more=-1" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "chặn các chuá»—i đặt tên" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "bao gồm nhánh hiện hà nh" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 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:665 +#: builtin/show-branch.c:664 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:667 +#: builtin/show-branch.c:666 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:669 +#: builtin/show-branch.c:668 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 +#: builtin/show-branch.c:671 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 +#: builtin/show-branch.c:673 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 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "sắp xếp hình thái há»c, bảo trì thứ tá»± ngà y nếu có thể" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" -msgstr "<n>[,<cÆ¡ sở>]" +msgstr "<n>[,<cÆ¡_sở>]" -#: builtin/show-branch.c:680 +#: 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*] " +"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*] " +"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" @@ -8996,24 +9355,24 @@ 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:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "hiển thị tham chiếu HEAD, ngay cả khi nó đã được lá»c ra" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 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:180 +#: builtin/show-ref.c:179 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:184 +#: builtin/show-ref.c:183 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:186 +#: builtin/show-ref.c:185 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 ở " @@ -9040,11 +9399,11 @@ msgstr "xóa tham chiếu (ref) tượng trưng" msgid "shorten ref output" msgstr "là m ngắn kết xuất ref (tham chiếu)" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "lý do" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "lý do cáºp nháºt" @@ -9137,7 +9496,7 @@ msgstr "đầu thẻ (tag) quá lá»›n." #: builtin/tag.c:368 msgid "no tag message?" -msgstr "không có thông Ä‘iệp (message) cho thẻ (tag)?" +msgstr "không có chú thÃch gì cho cho thẻ à ?" #: builtin/tag.c:374 #, c-format @@ -9209,187 +9568,199 @@ msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao" msgid "print only tags of the object" msgstr "chỉ hiển thị các thẻ cá»§a đối tượng" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "--column và -n xung khắc nhau" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "tùy chá»n -n chỉ cho phép dùng vá»›i -l." -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "tùy chá»n --contains chỉ cho phép dùng vá»›i -l." -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "tùy chá»n --points-at chỉ cho phép dùng vá»›i -l." -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "chỉ có má»™t tùy chá»n -F hoặc -m là được phép." -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "quá nhiá»u đối số" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "“%s†không phải thẻ hợp lệ." -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "Thẻ “%s†đã tồn tại rồi" -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "%s: không thể khóa ref (tham chiếu)" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "%s: không thể cáºp nháºt ref (tham chiếu)" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "Äã cáºp nháºt thẻ “%s†(trước là %s)\n" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "git update-index [các-tùy-chá»n] [<táºp-tin>...]" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "tiếp tục là m má»›i ngay cả khi bảng mục lục cần được cáºp nháºt" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "refresh: lá» Ä‘i mô-Ä‘un-con" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "không bá» qua các táºp tin má»›i tạo" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 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:728 +#: builtin/update-index.c:730 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:730 +#: builtin/update-index.c:732 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:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "lấy lại thông tin thống kê" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 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:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "<mode> <đối tượng> <đưá»ng dẫn>" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 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:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "(+/-)x" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 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:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "Äánh dấu các táºp tin là \"không thay đổi\"" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "xóa bÃt assumed-unchanged" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "đánh dấu các táºp tin là “chỉ-Ä‘á»câ€" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "xóa bÃt skip-worktree" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 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:765 +#: builtin/update-index.c:767 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:767 +#: builtin/update-index.c:769 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:769 +#: builtin/update-index.c:771 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:773 +#: builtin/update-index.c:775 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:777 +#: builtin/update-index.c:779 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:781 +#: builtin/update-index.c:783 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:785 +#: builtin/update-index.c:787 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:788 +#: builtin/update-index.c:790 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:790 +#: builtin/update-index.c:792 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:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "ghi mục lục ở định dạng nà y" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 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 +#: builtin/update-ref.c:10 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 +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "git update-ref [các-tùy-chá»n] --stdin [-z]" + +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "xóa tham chiếu" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 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-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "đầu và o tiêu chuẩn có các đối số được chấm dứt bởi NUL" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "Ä‘á»c cáºp nháºt từ đầu và o tiêu chuẩn" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "git update-server-info [--force]" @@ -9444,23 +9815,23 @@ msgstr "" "hướng dẫn vá» khái niệm. Xem “git help <lệnh>†hay “git help <khái-niệm>â€\n" "để xem các đặc tả cho lệnh hay khái niệm cụ thể." -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "ngà y hết hạn" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "no-op (tương thÃch ngược)" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "chi tiết hÆ¡n nữa" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "im lặng hÆ¡n nữa" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "sá» dụng <n> chữ số để hiển thị SHA-1s" @@ -9669,7 +10040,7 @@ msgstr "" #: git-am.sh:725 msgid "Patch does not have a valid e-mail address." -msgstr "Miếng vá không có địa chỉ e-mail hợp lệ." +msgstr "Miếng vá không có địa chỉ thư Ä‘iện tá» hợp lệ." #: git-am.sh:772 msgid "cannot be interactive without stdin connected to a terminal." @@ -9678,7 +10049,7 @@ msgstr "" #: git-am.sh:776 msgid "Commit Body is:" -msgstr "Thân cá»§a lần chuyển giao (commit) là :" +msgstr "Thân cá»§a lần chuyển giao là :" #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] #. in your translation. The program will only accept English @@ -9686,8 +10057,8 @@ msgstr "Thân cá»§a lần chuyển giao (commit) là :" #: git-am.sh:783 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] " +"Ãp dụng? đồng ý [y]/khô[n]g/chỉnh sá»a [e]/hiển thị miếng [v]á/đồng ý tất cả " +"[a] " #: git-am.sh:819 #, sh-format @@ -9720,7 +10091,7 @@ msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồ #: git-am.sh:874 #, sh-format msgid "Patch failed at $msgnum $FIRSTLINE" -msgstr "Vá gặp lá»—i tại $msgnum $FIRSTLINE" +msgstr "Gặp lá»—i khi vá tại $msgnum $FIRSTLINE" #: git-am.sh:877 #, sh-format @@ -9769,8 +10140,8 @@ msgstr "" "<nhánh_hợp_lệ>â€." #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "sẽ không bisect trêm cây được seek" +msgid "won't bisect on cg-seek'ed tree" +msgstr "sẽ không bisect trêm cây được cg-seek" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" @@ -9803,8 +10174,7 @@ msgstr "“git bisect bad†có thể lấy chỉ má»™t đối số." #. 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 sai." #. TRANSLATORS: Make sure to include [Y] and [n] in your #. translation. The program will only accept English input @@ -9839,7 +10209,7 @@ msgstr "Chúng tôi không bisect." #: git-bisect.sh:370 #, sh-format msgid "'$invalid' is not a valid commit" -msgstr "â€$invalid†không phải là lần chuyển giao (commit) hợp lệ" +msgstr "â€$invalid†không phải là lần chuyển giao hợp lệ" #: git-bisect.sh:379 #, sh-format @@ -9910,7 +10280,7 @@ 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." -#: git-pull.sh:203 +#: git-pull.sh:223 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 " @@ -9920,7 +10290,7 @@ msgstr "" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -9931,15 +10301,15 @@ msgstr "" "Cảnh báo: Ä‘ang fast-forward cây là m việc cá»§a bạn từ\n" "Cảnh báo: commit $orig_head." -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "Không thể hòa trá»™n nhiá»u nhánh và trong má»™t head trống rá»—ng" -#: git-pull.sh:264 +#: git-pull.sh:276 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:54 +#: git-rebase.sh:55 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" @@ -9952,16 +10322,16 @@ msgstr "" "Äể phục hồi lại thà nh nhánh nguyên thá»§y và dừng việc vá lại thì chạy \"git " "rebase --abort\"." -#: git-rebase.sh:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "Äã áp dụng autostash." -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "Không thể lưu $stash_sha1" -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" @@ -9972,35 +10342,35 @@ msgstr "" "Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc " "nà o.\n" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." msgstr "Móc (hook) pre-rebase từ chối rebase." -#: git-rebase.sh:195 +#: git-rebase.sh:206 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "" "Hình như Ä‘ang trong quá trình thá»±c hiện lệnh git-am. Không thể chạy lệnh " "rebase." -#: git-rebase.sh:329 +#: git-rebase.sh:346 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:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "Không có tiến trình rebase nà o phải không?" -#: git-rebase.sh:345 +#: git-rebase.sh:362 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:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "Không thể Ä‘á»c HEAD" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -10008,12 +10378,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:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "Không thể quay trở lại $head_name" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -10036,66 +10406,66 @@ msgstr "" "\n" "TÔI: là lệnh bạn vừa gá»i!" -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "thượng nguồn không hợp lệ $upstream_name" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: ở đây có nhiá»u hÆ¡n má»™t ná»n móng hòa trá»™n" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ở đây không có ná»n móng hòa trá»™n nà o" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, 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" +msgstr "Không chỉ đến má»™t lần chuyển giao không hợp lệ: $onto_name" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, 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:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "Không thể autostash" -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "Äã tạo autostash: $stash_abbrev" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "Xin hãy commit hoặc tạm cất (stash) chúng." -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, 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:552 +#: git-rebase.sh:581 #, 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:563 +#: git-rebase.sh:592 #, 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:572 +#: git-rebase.sh:601 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh cá»§a nó..." -#: git-rebase.sh:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Fast-forward $branch_name thà nh $onto_name." @@ -10107,7 +10477,7 @@ msgstr "" #: git-stash.sh:74 msgid "You do not have the initial commit yet" -msgstr "Bạn chưa còn có lần chuyển giao (commit) khởi tạo" +msgstr "Bạn chưa còn có lần chuyển giao khởi tạo" #: git-stash.sh:89 msgid "Cannot save the current index state" @@ -10144,109 +10514,95 @@ msgstr "Không thể cáºp nháºt $ref_stash vá»›i $w_commit" #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" " To provide a message, use git stash save -- '$option'" msgstr "" "lá»—i: không hiểu tùy chá»n cho “stash saveâ€: $option\n" -" Äể dùng thông Ä‘iệp có chứa -- ở đầu, sá» dụng git stash save -- \"$option" -"\"" +" Äể có thể dùng lá»i chú thÃch có chứa -- ở đầu,\n" +" dùng git stash save -- \"$option\"" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" msgstr "Không có thay đổi ná»™i bá»™ nà o được ghi lại" -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "" -"Các táºp tin chưa được theo dõi sau đây KHÔNG được ghi lại nhưng cần được gỡ " -"bá» bởi việc ghi lại stash:" - -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "" -"Bãi bá». Cân nhắc dùng má»™t trong hai tùy chá»n --force và --include-untracked." - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "Không thể khởi tạo stash" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "Không thể ghi lại trạng thái hiện hà nh" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "Không thể gỡ bá» các thay đổi cây-là m-việc" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." -msgstr "Không tìm thấy stash nà o." +msgstr "Không tìm thấy lần chuyển giao cất Ä‘i (stash) nà o." -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "Chỉ ra quá nhiá»u Ä‘iểm xét duyệt: $REV" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "$reference không phải là tham chiếu hợp lệ" -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" -msgstr "â€$args†không phải là lần chuyển giao (commit) giống-stash" +msgstr "“$args†không phải là lần chuyển giao kiểu-stash (cất Ä‘i)" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "â€$args†không phải tham chiếu đến stash" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "không thể là m tươi má»›i bảng mục lục" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" msgstr "Không thể áp dụng má»™t stash ở giữa cá»§a quá trình hòa trá»™n" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "Xung đột trong bảng mục lục. Hãy thá» mà không dùng tùy chá»n --index." -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "Không thể ghi lại cây chỉ mục" -#: git-stash.sh:503 +#: git-stash.sh:491 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" +msgstr "Không thể bá» ra khá»i bệ phóng các táºp tin đã được sá»a chữa" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." msgstr "Bảng mục lục đã không được bá» stash." -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Äã xóa ${REV} ($s)" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Không thể xóa bá» mục stash" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "Chưa chỉ ra tên cá»§a nhánh" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "(Äể phục hồi lại chúng hãy gõ \"git stash apply\")" @@ -10366,45 +10722,45 @@ msgstr "Gặp lá»—i khi đăng ký vá»›i hệ thống mô-Ä‘un-con “$sm_path†msgid "Entering '$prefix$displaypath'" msgstr "Äang và o “$prefix$displaypathâ€" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "" "Dừng lại tại “$prefix$displaypathâ€; script trả vá» trạng thái khác không." -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "" "Không tìm thấy url cho đưá»ng dẫn mô-Ä‘un-con “$displaypath†trong .gitmodules" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "Gặp lá»—i khi đăng ký url cho đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "Mô-Ä‘un-con “$name†($url) được đăng ký cho đưá»ng dẫn “$displaypathâ€" -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "" "Gặp lá»—i khi đăng ký chế độ cáºp nháºt cho đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "Dùng “.†nếu bạn thá»±c sá»± muốn gỡ bá» má»i mô-Ä‘un-con" -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "Cây là m việc mô-Ä‘un-con “$displaypath†có chứa thư mục .git" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -10412,7 +10768,7 @@ msgstr "" "(dùng “rm -rf†nếu bạn thá»±c sá»± muốn gỡ bá» nó cùng vá»›i tất cả lịch sá» cá»§a " "chúng)" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " @@ -10421,27 +10777,27 @@ msgstr "" "Cây là m việc mô-Ä‘un-con “$displaypath†chứa các thay đổi ná»™i bá»™; hãy dùng “-" "f†để loại bá» chúng Ä‘i" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" -msgstr "Äã tạo thư mục '$displaypath'" +msgstr "Äã tạo thư mục “$displaypathâ€" -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "Không thể gỡ bá» cây là m việc mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "Không thể tạo thư mục mô-Ä‘un-con rá»—ng “$displaypathâ€" -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "Mô-Ä‘un-con “$name†($url) được bỠđăng ký cho đưá»ng dẫn “$displaypathâ€" -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" @@ -10450,45 +10806,45 @@ msgstr "" "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypath†chưa được khởi tạo.\n" "Có lẽ bạn muốn sá» dụng lệnh “update --initâ€?" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "" "Không tìm thấy Ä‘iểm xét duyệt hiện hà nh trong đưá»ng dẫn mô-Ä‘un-con " "“$displaypathâ€" -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, 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â€" +msgstr "Không thể lấy vá» trong đưá»ng dẫn mô-Ä‘un-con “$sm_pathâ€" -#: git-submodule.sh:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" -msgstr "Không thể lấy vá» (fetch) trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" +msgstr "Không thể lấy vá» trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "Không thể rebase “$sha1†trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: được rebase và o trong “$sha1â€" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "" "Không thể hòa trá»™n (merge) “$sha1†trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: được hòa trá»™n và o “$sha1â€" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" @@ -10496,77 +10852,101 @@ msgstr "" "Thá»±c hiện không thà nh công lệnh “$command $sha1†trong đưá»ng dẫn mô-Ä‘un-con " "“$prefix$sm_pathâ€" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$prefix$sm_pathâ€: “$command $sha1â€" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "Không thể checkout “$sha1†trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: đã checkout “$sha1â€" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "Gặp lá»—i khi đệ quy và o trong đưá»ng dẫn mô-Ä‘un-con “$displaypathâ€" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 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:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "chế độ không như mong chá» $mod_dst" -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" -msgstr "" -" Cảnh báo: $display_name không chứa lần chuyển giao (commit) $sha1_src" +msgstr " Cảnh báo: $display_name không chứa lần chuyển giao $sha1_src" -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" -msgstr "" -" Cảnh báo: $display_name không chứa lần chuyển giao (commit) $sha1_dst" +msgstr " Cảnh báo: $display_name không chứa lần chuyển giao $sha1_dst" -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" -" Cảnh báo: $display_name không chứa những lần chuyển giao (commit) " -"$sha1_src và $sha1_dst" +" Cảnh báo: $display_name không chứa những lần chuyển giao $sha1_src và " +"$sha1_dst" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "blob" -#: git-submodule.sh:1155 -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:1157 -msgid "Submodule changes to be committed:" -msgstr "Những mô-Ä‘un-con thay đổi đã được chuyển giao (commit):" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, 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:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€" +#~ msgid "copied: %s -> %s" +#~ msgstr "đã sao chép: %s -> %s" + +#~ msgid "deleted: %s" +#~ msgstr "đã xóa: %s" + +#~ msgid "modified: %s" +#~ msgstr "đã sá»a đổi: %s" + +#~ msgid "renamed: %s -> %s" +#~ msgstr "đã đổi tên: %s -> %s" + +#~ msgid "unmerged: %s" +#~ msgstr "chưa hòa trá»™n: %s" + +#~ msgid "done\n" +#~ msgstr "xong\n" + +#~ 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" + +#~ msgid "" +#~ "The following untracked files would NOT be saved but need to be removed " +#~ "by stash save:" +#~ msgstr "" +#~ "Các táºp tin chưa được theo dõi sau đây KHÔNG được ghi lại nhưng cần được " +#~ "gỡ bá» bởi việc ghi lại stash:" + +#~ msgid "" +#~ "Aborting. Consider using either the --force or --include-untracked option." +#~ msgstr "" +#~ "Bãi bá». Cân nhắc dùng má»™t trong hai tùy chá»n --force và --include-" +#~ "untracked." + #~ msgid " (fix conflicts and then run \"git am --resolved\")" #~ msgstr " (sá»a các xung đột và sau đó chạy lệnh \"git am --resolved\")" @@ -10602,14 +10982,13 @@ msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€" #~ msgstr "hiển thị tham chiếu cá»§a HEAD" #~ msgid "Unable to fetch in submodule path '$prefix$sm_path'" -#~ msgstr "" -#~ "Không thể lấy vá» (fetch) trong đưá»ng dẫn mô-Ä‘un-con “$prefix$sm_pathâ€" +#~ msgstr "Không thể lấy vá» trong đưá»ng dẫn mô-Ä‘un-con “$prefix$sm_pathâ€" #~ msgid "Failed to recurse into submodule path '$prefix$sm_path'" #~ msgstr "Gặp lá»—i khi đệ quy và o trong đưá»ng dẫn mô-Ä‘un-con “$prefix$sm_pathâ€" #~ msgid "It took %.2f seconds to enumerate untracked files. 'status -uno'" -#~ msgstr "Cần %.2f giây để đếm các táºp tin chưa được theo vết. “status -unoâ€" +#~ msgstr "Cần %.2f giây để đếm các táºp tin chưa được theo dõi. “status -unoâ€" #~ msgid "may speed it up, but you have to be careful not to forget to add" #~ msgstr "" @@ -10688,9 +11067,6 @@ msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€" #~ 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" diff --git a/po/zh_CN.po b/po/zh_CN.po index 1a042af111..0942835711 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: 2013-08-06 14:10+0800\n" -"PO-Revision-Date: 2013-08-06 14:45+0800\n" +"POT-Creation-Date: 2014-02-01 08:06+0800\n" +"PO-Revision-Date: 2014-02-03 10:53+0800\n" "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n" "Language-Team: GitHub <https://github.com/gotgit/git/>\n" "Language: zh_CN\n" @@ -60,71 +60,76 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <版本库> [--exec <命令>] --list" -#: archive.c:323 +#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "路径规则 '%s' 未匹é…任何文件" + +#: archive.c:327 msgid "fmt" msgstr "æ ¼å¼" -#: archive.c:323 +#: archive.c:327 msgid "archive format" msgstr "å½’æ¡£æ ¼å¼" -#: archive.c:324 builtin/log.c:1173 +#: archive.c:328 builtin/log.c:1193 msgid "prefix" msgstr "å‰ç¼€" -#: archive.c:325 +#: archive.c:329 msgid "prepend prefix to each pathname in the archive" msgstr "ä¸ºå½’æ¡£ä¸æ¯ä¸ªè·¯å¾„ååŠ ä¸Šå‰ç¼€" -#: archive.c:326 builtin/archive.c:88 builtin/blame.c:2292 -#: builtin/blame.c:2293 builtin/config.c:56 builtin/fast-export.c:673 -#: builtin/fast-export.c:675 builtin/grep.c:714 builtin/hash-object.c:77 -#: builtin/ls-files.c:496 builtin/ls-files.c:499 builtin/notes.c:408 -#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:152 +#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265 +#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680 +#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77 +#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408 +#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154 msgid "file" msgstr "文件" -#: archive.c:327 builtin/archive.c:89 +#: archive.c:331 builtin/archive.c:89 msgid "write the archive to this file" msgstr "å½’æ¡£å†™å…¥æ¤æ–‡ä»¶" -#: archive.c:329 +#: archive.c:333 msgid "read .gitattributes in working directory" msgstr "读å–工作区ä¸çš„ .gitattributes" -#: archive.c:330 +#: archive.c:334 msgid "report archived files on stderr" msgstr "åœ¨æ ‡å‡†é”™è¯¯ä¸ŠæŠ¥å‘Šå½’æ¡£æ–‡ä»¶" -#: archive.c:331 +#: archive.c:335 msgid "store only" msgstr "åªå˜å‚¨" -#: archive.c:332 +#: archive.c:336 msgid "compress faster" msgstr "压缩速度更快" -#: archive.c:340 +#: archive.c:344 msgid "compress better" msgstr "压缩效果更好" -#: archive.c:343 +#: archive.c:347 msgid "list supported archive formats" msgstr "列出支æŒçš„å½’æ¡£æ ¼å¼" -#: archive.c:345 builtin/archive.c:90 builtin/clone.c:85 +#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84 msgid "repo" msgstr "版本库" -#: archive.c:346 builtin/archive.c:91 +#: archive.c:350 builtin/archive.c:91 msgid "retrieve the archive from remote repository <repo>" msgstr "从远程版本库(<版本库>)æå–归档文件" -#: archive.c:347 builtin/archive.c:92 builtin/notes.c:487 +#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487 msgid "command" msgstr "命令" -#: archive.c:348 builtin/archive.c:93 +#: archive.c:352 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "远程 git-upload-archive 命令的路径" @@ -205,17 +210,17 @@ msgstr "一个分支å '%s' å·²ç»å˜åœ¨ã€‚" msgid "Cannot force update the current branch." msgstr "æ— æ³•å¼ºåˆ¶æ›´æ–°å½“å‰åˆ†æ”¯ã€‚" -#: branch.c:216 +#: branch.c:215 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "æ— æ³•è®¾ç½®è·Ÿè¸ªä¿¡æ¯ï¼›èµ·å§‹ç‚¹ '%s' 䏿˜¯ä¸€ä¸ªåˆ†æ”¯ã€‚" -#: branch.c:218 +#: branch.c:217 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "请求的上游分支 '%s' ä¸å˜åœ¨" -#: branch.c:220 +#: branch.c:219 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -233,87 +238,87 @@ msgstr "" "如果您æ£è®¡åˆ’推é€ä¸€ä¸ªèƒ½ä¸Žå¯¹åº”远程分支建立跟踪的新的本地分支,\n" "您å¯èƒ½éœ€è¦ä½¿ç”¨ \"git push -u\" 推é€åˆ†æ”¯å¹¶é…置和上游的关è”。" -#: branch.c:265 +#: branch.c:264 #, c-format msgid "Not a valid object name: '%s'." msgstr "䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„对象å:'%s'。" -#: branch.c:285 +#: branch.c:284 #, c-format msgid "Ambiguous object name: '%s'." msgstr "æ§ä¹‰çš„对象å:'%s'。" -#: branch.c:290 +#: branch.c:289 #, c-format msgid "Not a valid branch point: '%s'." msgstr "æ— æ•ˆçš„åˆ†æ”¯ç‚¹ï¼š'%s'。" -#: branch.c:296 +#: branch.c:295 msgid "Failed to lock ref for update" msgstr "æ— æ³•ä¸ºæ›´æ–°é”定引用" -#: branch.c:314 +#: branch.c:313 msgid "Failed to write ref" msgstr "ä¸èƒ½å†™å¼•用" -#: bundle.c:36 +#: bundle.c:37 #, c-format msgid "'%s' does not look like a v2 bundle file" msgstr "'%s' ä¸åƒæ˜¯ä¸€ä¸ª v2 版本的包文件" -#: bundle.c:63 +#: bundle.c:64 #, c-format msgid "unrecognized header: %s%s (%d)" msgstr "未能识别的包头:%s%s (%d)" -#: bundle.c:89 builtin/commit.c:697 +#: bundle.c:90 builtin/commit.c:706 #, c-format msgid "could not open '%s'" msgstr "ä¸èƒ½æ‰“å¼€ '%s'" -#: bundle.c:140 +#: bundle.c:141 msgid "Repository lacks these prerequisite commits:" msgstr "版本库缺少这些必备的æäº¤ï¼š" -#: bundle.c:164 sequencer.c:661 sequencer.c:1111 builtin/log.c:331 -#: builtin/log.c:801 builtin/log.c:1399 builtin/log.c:1625 builtin/merge.c:364 -#: builtin/shortlog.c:156 +#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332 +#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357 +#: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "版本é历设置失败" -#: bundle.c:186 +#: bundle.c:187 #, c-format msgid "The bundle contains this ref:" msgid_plural "The bundle contains these %d refs:" msgstr[0] "这个包ä¸å«æœ‰è¿™ä¸ªå¼•用:" msgstr[1] "这个包ä¸å«æœ‰ %d 个引用:" -#: bundle.c:193 +#: bundle.c:194 msgid "The bundle records a complete history." msgstr "这个包记录一个完整历å²ã€‚" -#: bundle.c:195 +#: bundle.c:196 #, c-format msgid "The bundle requires this ref:" msgid_plural "The bundle requires these %d refs:" msgstr[0] "这个包需è¦è¿™ä¸ªå¼•用:" msgstr[1] "è¿™ä¸ªåŒ…éœ€è¦ %d 个引用:" -#: bundle.c:294 +#: bundle.c:296 msgid "rev-list died" msgstr "rev-list 终æ¢" -#: bundle.c:300 builtin/log.c:1310 builtin/shortlog.c:259 +#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "æœªèƒ½è¯†åˆ«çš„å‚æ•°ï¼š%s" -#: bundle.c:335 +#: bundle.c:337 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "引用 '%s' 被 rev-list 选项排除" -#: bundle.c:380 +#: bundle.c:382 msgid "Refusing to create empty bundle." msgstr "ä¸èƒ½åˆ›å»ºç©ºåŒ…。" @@ -348,16 +353,16 @@ msgstr "%s %s 䏿˜¯ä¸€ä¸ªæäº¤!" msgid "memory exhausted" msgstr "内å˜è€—å°½" -#: connected.c:60 +#: connected.c:70 msgid "Could not run 'git rev-list'" msgstr "ä¸èƒ½æ‰§è¡Œ 'git rev-list'" -#: connected.c:80 +#: connected.c:90 #, c-format msgid "failed write to rev-list: %s" msgstr "æ— æ³•å†™å…¥ rev-list:%s" -#: connected.c:88 +#: connected.c:98 #, c-format msgid "failed to close rev-list's stdin: %s" msgstr "æ— æ³•å…³é— rev-list çš„æ ‡å‡†è¾“å…¥ï¼š%s" @@ -429,24 +434,29 @@ msgid_plural "%lu years ago" msgstr[0] "%lu å¹´å‰" msgstr[1] "%lu å¹´å‰" +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "æ— æ³•è¯»å–æŽ’åºæ–‡ä»¶ '%s'" + # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: diff.c:112 +#: diff.c:113 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr " æ— æ³•è§£æž dirstat 截æ¢ï¼ˆcut-off)百分比 '%s'\n" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: diff.c:117 +#: diff.c:118 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " 未知的 dirstat 傿•° '%s'\n" -#: diff.c:210 +#: diff.c:213 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "é…ç½®å˜é‡ 'diff.submodule' 未知的å–值:'%s'" -#: diff.c:260 +#: diff.c:263 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -455,7 +465,7 @@ msgstr "" "å‘现é…ç½®å˜é‡ 'diff.dirstat' ä¸çš„错误:\n" "%s" -#: diff.c:3487 +#: diff.c:3509 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -464,7 +474,7 @@ msgstr "" "æ— æ³•è§£æž --dirstat/-X é€‰é¡¹çš„å‚æ•°ï¼š\n" "%s" -#: diff.c:3501 +#: diff.c:3523 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "æ— æ³•è§£æž --submodule é€‰é¡¹çš„å‚æ•°ï¼š'%s'" @@ -491,17 +501,17 @@ msgstr "ä¸èƒ½åˆ›å»ºä¸´æ—¶æ–‡ä»¶ '%s':%s" msgid "failed writing detached signature to '%s': %s" msgstr "æ— æ³•å°†åˆ†ç¦»å¼ç¾å写入 '%s':%s" -#: grep.c:1623 +#: grep.c:1695 #, c-format msgid "'%s': unable to read %s" msgstr "'%s'ï¼šæ— æ³•è¯»å– %s" -#: grep.c:1640 +#: grep.c:1712 #, c-format msgid "'%s': %s" msgstr "'%s':%s" -#: grep.c:1651 +#: grep.c:1723 #, c-format msgid "'%s': short read %s" msgstr "'%s':读å–ä¸å®Œæ•´ %s" @@ -574,8 +584,8 @@ msgstr "%s:%s - %s" msgid "failed to read the cache" msgstr "æ— æ³•è¯»å–缓å˜" -#: merge.c:110 builtin/checkout.c:365 builtin/checkout.c:566 -#: builtin/clone.c:656 +#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559 +#: builtin/clone.c:661 msgid "unable to write new index file" msgstr "æ— æ³•å†™æ–°çš„ç´¢å¼•æ–‡ä»¶" @@ -624,7 +634,7 @@ msgstr "ä¸èƒ½è¯»å–对象 %s '%s'" msgid "blob expected for %s '%s'" msgstr "%s '%s' 应为数æ®ï¼ˆblob)对象" -#: merge-recursive.c:774 builtin/clone.c:312 +#: merge-recursive.c:774 builtin/clone.c:317 #, c-format msgid "failed to open '%s'" msgstr "æ— æ³•æ‰“å¼€ '%s'" @@ -674,7 +684,7 @@ msgstr "" msgid "rename" msgstr "é‡å‘½å" -#: merge-recursive.c:1082 +#: merge-recursive.c:1082 wt-status.c:283 msgid "renamed" msgstr "é‡å‘½å" @@ -737,7 +747,7 @@ msgstr "对象 %s 䏿˜¯ä¸€ä¸ªæ•°æ®ï¼ˆblob)对象" msgid "modify" msgstr "修改" -#: merge-recursive.c:1565 +#: merge-recursive.c:1565 wt-status.c:281 msgid "modified" msgstr "修改" @@ -759,7 +769,7 @@ msgstr "略过 %s(已ç»åšè¿‡ç›¸åŒåˆå¹¶ï¼‰" msgid "Auto-merging %s" msgstr "自动åˆå¹¶ %s" -#: merge-recursive.c:1634 git-submodule.sh:1118 +#: merge-recursive.c:1634 git-submodule.sh:1148 msgid "submodule" msgstr "忍¡ç»„" @@ -829,7 +839,7 @@ msgstr "åˆå¹¶æœªè¿”回æäº¤" msgid "Could not parse object '%s'" msgstr "ä¸èƒ½è§£æžå¯¹è±¡ '%s'" -#: merge-recursive.c:2010 builtin/merge.c:672 +#: merge-recursive.c:2010 builtin/merge.c:665 msgid "Unable to write index." msgstr "ä¸èƒ½å†™å…¥ç´¢å¼•。" @@ -854,59 +864,154 @@ msgstr "æ‹’ç»å‘ %s(在 refs/notes/ 之外)写入注解" msgid "Bad %s value: '%s'" msgstr "åçš„ %s 值:'%s'" -#: object.c:204 +#: object.c:202 #, c-format msgid "unable to parse object: %s" msgstr "ä¸èƒ½è§£æžå¯¹è±¡ï¼š%s" -#: parse-options.c:489 +#: parse-options.c:537 msgid "..." msgstr "..." -#: parse-options.c:507 +#: parse-options.c:555 #, c-format msgid "usage: %s" msgstr "用法:%s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:511 +#: parse-options.c:559 #, c-format msgid " or: %s" msgstr " 或:%s" # 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: parse-options.c:514 +#: parse-options.c:562 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:548 +#: parse-options.c:596 msgid "-NUM" msgstr "-æ•°å—" -#: pathspec.c:83 +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "全局的 'glob' å’Œ 'noglob' 路径规则设置ä¸å…¼å®¹" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "全局的 'literal' 路径规则设置和其它的全局路径规则设置ä¸å…¼å®¹" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "è·¯å¾„è§„åˆ™åŒ…å«æ— 效的神奇å‰ç¼€" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "在路径规则 '%3$s' 䏿— 效的神奇å‰ç¼€ '%2$.*1$s'" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "路径规则 '%s' 的神奇å‰ç¼€ç»“尾少了一个 ')'" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "路径规则 '%2$s' ä¸åŒ…嫿œªå®žçŽ°çš„ç¥žå¥‡å‰ç¼€ '%1$c'" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s:'literal' å’Œ 'glob' ä¸å…¼å®¹" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "%s:'%s' 在版本库之外" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "路径规则 '%s' åœ¨åæ¨¡ç»„ '%.*s' ä¸" + +#. +#. * We may want to substitute "this command" with a command +#. * name. E.g. when add--interactive dies when running +#. * "checkout -p" +#. +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "%s:路径规则神奇å‰ç¼€ä¸è¢«æ¤å‘½ä»¤æ”¯æŒï¼š%s" + +#: pathspec.c:433 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "路径规则 '%s' ä½äºŽç¬¦å·é“¾æŽ¥ä¸" + +#: pathspec.c:442 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +"没有为 :(exclude) æ¨¡å¼æä¾›è¦å¿½ç•¥çš„内容。也许您忘记了\n" +"æ·»åŠ ':/' 或 '.' ?" + +#: remote.c:753 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "ä¸èƒ½åŒæ—¶èŽ·å– %s å’Œ %s 至 %s" + +#: remote.c:757 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "%s 通常跟踪 %sï¼Œè€Œéž %s" + +#: remote.c:761 #, c-format -msgid "Path '%s' is in submodule '%.*s'" -msgstr "路径 '%s' 属于模组 '%.*s'" +msgid "%s tracks both %s and %s" +msgstr "%s åŒæ—¶è·Ÿè¸ª %s å’Œ %s" -#: pathspec.c:99 +#. +#. * This last possibility doesn't occur because +#. * FETCH_HEAD_IGNORE entries always appear at +#. * the end of the list. +#. +#: remote.c:769 +msgid "Internal error" +msgstr "内部错误" + +#: remote.c:1871 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "您的分支基于 '%s',但æ¤ä¸Šæ¸¸åˆ†æ”¯å·²ç»ä¸å˜åœ¨ã€‚\n" + +#: remote.c:1875 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (使用 \"git branch --unset-upstream\" æ¥ä¿®å¤ï¼‰\n" + +#: remote.c:1878 #, c-format -msgid "'%s' is beyond a symbolic link" -msgstr "'%s' ä½äºŽç¬¦å·é“¾æŽ¥ä¸" +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "您的分支与上游分支 '%s' 一致。\n" -#: remote.c:1788 +#: remote.c:1882 #, 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] "您的分支领先 '%s' å…± %d 个æäº¤ã€‚\n" msgstr[1] "您的分支领先 '%s' å…± %d 个æäº¤ã€‚\n" -#: remote.c:1794 +#: remote.c:1888 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (使用 \"git push\" æ¥å‘布您的本地æäº¤ï¼‰\n" -#: remote.c:1797 +#: remote.c:1891 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -915,11 +1020,11 @@ msgstr[0] "您的分支è½åŽ '%s' å…± %d 个æäº¤ï¼Œå¹¶ä¸”å¯ä»¥å¿«è¿›ã€‚\n" msgstr[1] "您的分支è½åŽ '%s' å…± %d 个æäº¤ï¼Œå¹¶ä¸”å¯ä»¥å¿«è¿›ã€‚\n" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: remote.c:1805 +#: remote.c:1899 msgid " (use \"git pull\" to update your local branch)\n" msgstr " (使用 \"git pull\" æ¥æ›´æ–°æ‚¨çš„æœ¬åœ°åˆ†æ”¯ï¼‰\n" -#: remote.c:1808 +#: remote.c:1902 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -935,7 +1040,7 @@ msgstr[1] "" "并且分别有 %d å’Œ %d 处ä¸åŒçš„æäº¤ã€‚\n" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: remote.c:1818 +#: remote.c:1912 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr " (使用 \"git pull\" æ¥åˆå¹¶è¿œç¨‹åˆ†æ”¯ï¼‰\n" @@ -948,14 +1053,14 @@ msgstr "ä¸èƒ½æ‰“å¼€ /dev/null" msgid "dup2(%d,%d) failed" msgstr "ä¸èƒ½è°ƒç”¨ dup2(%d,%d)" -#: sequencer.c:206 builtin/merge.c:790 builtin/merge.c:903 -#: builtin/merge.c:1013 builtin/merge.c:1023 +#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896 +#: builtin/merge.c:1006 builtin/merge.c:1016 #, c-format msgid "Could not open '%s' for writing" msgstr "ä¸èƒ½ä¸ºå†™å…¥æ‰“å¼€ '%s'" -#: sequencer.c:208 builtin/merge.c:350 builtin/merge.c:793 -#: builtin/merge.c:1015 builtin/merge.c:1028 +#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786 +#: builtin/merge.c:1008 builtin/merge.c:1021 #, c-format msgid "Could not write to '%s'" msgstr "ä¸èƒ½å†™å…¥ '%s'" @@ -977,7 +1082,7 @@ msgstr "" "冲çªè§£å†³å®Œæ¯•åŽï¼Œç”¨ 'git add <paths>' 或 'git rm <paths>'\n" "对修æ£åŽçš„æ–‡ä»¶åšæ ‡è®°ï¼Œç„¶åŽç”¨ 'git commit' æäº¤" -#: sequencer.c:245 sequencer.c:869 sequencer.c:952 +#: sequencer.c:245 sequencer.c:870 sequencer.c:953 #, c-format msgid "Could not write to %s" msgstr "ä¸èƒ½å†™å…¥ %s" @@ -1000,201 +1105,201 @@ msgid "Commit your changes or stash them to proceed." msgstr "æäº¤æ‚¨çš„修改或ä¿å˜è¿›åº¦åŽå†ç»§ç»ã€‚" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:324 +#: sequencer.c:325 #, c-format msgid "%s: Unable to write new index file" msgstr "%sï¼šæ— æ³•å†™å…¥æ–°ç´¢å¼•æ–‡ä»¶" -#: sequencer.c:355 +#: sequencer.c:356 msgid "Could not resolve HEAD commit\n" msgstr "ä¸èƒ½è§£æž HEAD æäº¤\n" -#: sequencer.c:377 +#: sequencer.c:378 msgid "Unable to update cache tree\n" msgstr "ä¸èƒ½æ›´æ–°ç¼“å˜\n" -#: sequencer.c:422 +#: sequencer.c:423 #, c-format msgid "Could not parse commit %s\n" msgstr "ä¸èƒ½è§£æžæäº¤ %s\n" -#: sequencer.c:427 +#: sequencer.c:428 #, c-format msgid "Could not parse parent commit %s\n" msgstr "ä¸èƒ½è§£æžçˆ¶æäº¤ %s\n" -#: sequencer.c:493 +#: sequencer.c:494 msgid "Your index file is unmerged." msgstr "您的索引文件未完æˆåˆå¹¶ã€‚" -#: sequencer.c:512 +#: sequencer.c:513 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "æäº¤ %s 是一个åˆå¹¶æäº¤ä½†æœªæä¾› -m 选项。" -#: sequencer.c:520 +#: sequencer.c:521 #, c-format msgid "Commit %s does not have parent %d" msgstr "æäº¤ %s 没有父æäº¤ %d" -#: sequencer.c:524 +#: sequencer.c:525 #, 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:537 +#: sequencer.c:538 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s:ä¸èƒ½è§£æžçˆ¶æäº¤ %s" -#: sequencer.c:541 +#: sequencer.c:542 #, c-format msgid "Cannot get commit message for %s" msgstr "ä¸èƒ½å¾—到 %s çš„æäº¤è¯´æ˜Ž" -#: sequencer.c:627 +#: sequencer.c:628 #, c-format msgid "could not revert %s... %s" msgstr "ä¸èƒ½è¿˜åŽŸ %s... %s" -#: sequencer.c:628 +#: sequencer.c:629 #, c-format msgid "could not apply %s... %s" msgstr "ä¸èƒ½åº”用 %s... %s" -#: sequencer.c:664 +#: sequencer.c:665 msgid "empty commit set passed" msgstr "æä¾›äº†ç©ºçš„æäº¤é›†" -#: sequencer.c:672 +#: sequencer.c:673 #, c-format msgid "git %s: failed to read the index" msgstr "git %sï¼šæ— æ³•è¯»å–索引" -#: sequencer.c:677 +#: sequencer.c:678 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %sï¼šæ— æ³•åˆ·æ–°ç´¢å¼•" -#: sequencer.c:735 +#: sequencer.c:736 #, c-format msgid "Cannot %s during a %s" msgstr "æ— æ³• %s 在一个 %s 过程ä¸" -#: sequencer.c:757 +#: sequencer.c:758 #, c-format msgid "Could not parse line %d." msgstr "ä¸èƒ½è§£æžç¬¬ %d 行。" -#: sequencer.c:762 +#: sequencer.c:763 msgid "No commits parsed." msgstr "没有æäº¤è¢«è§£æžã€‚" -#: sequencer.c:775 +#: sequencer.c:776 #, c-format msgid "Could not open %s" msgstr "ä¸èƒ½æ‰“å¼€ %s" -#: sequencer.c:779 +#: sequencer.c:780 #, c-format msgid "Could not read %s." msgstr "ä¸èƒ½è¯»å– %s。" -#: sequencer.c:786 +#: sequencer.c:787 #, c-format msgid "Unusable instruction sheet: %s" msgstr "æ— ç”¨çš„æŒ‡ä»¤è¡¨å•:%s" -#: sequencer.c:814 +#: sequencer.c:815 #, c-format msgid "Invalid key: %s" msgstr "æ— æ•ˆé”®å:%s" -#: sequencer.c:817 +#: sequencer.c:818 #, c-format msgid "Invalid value for %s: %s" msgstr "%s çš„å€¼æ— æ•ˆï¼š%s" -#: sequencer.c:829 +#: sequencer.c:830 #, c-format msgid "Malformed options sheet: %s" msgstr "éžæ³•的选项表å•:%s" -#: sequencer.c:850 +#: sequencer.c:851 msgid "a cherry-pick or revert is already in progress" msgstr "一个拣选或还原æ“作已在进行" -#: sequencer.c:851 +#: sequencer.c:852 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "å°è¯• \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:855 +#: sequencer.c:856 #, c-format msgid "Could not create sequencer directory %s" msgstr "ä¸èƒ½åˆ›å»ºåºåˆ—目录 %s" -#: sequencer.c:871 sequencer.c:956 +#: sequencer.c:872 sequencer.c:957 #, c-format msgid "Error wrapping up %s." msgstr "错误收尾 %s。" -#: sequencer.c:890 sequencer.c:1024 +#: sequencer.c:891 sequencer.c:1025 msgid "no cherry-pick or revert in progress" msgstr "拣选或还原æ“作并未进行" -#: sequencer.c:892 +#: sequencer.c:893 msgid "cannot resolve HEAD" msgstr "ä¸èƒ½è§£æž HEAD" -#: sequencer.c:894 +#: sequencer.c:895 msgid "cannot abort from a branch yet to be born" msgstr "ä¸èƒ½ä»Žå°šæœªå»ºç«‹çš„分支终æ¢" -#: sequencer.c:916 builtin/apply.c:4061 +#: sequencer.c:917 builtin/apply.c:4061 #, c-format msgid "cannot open %s: %s" msgstr "ä¸èƒ½æ‰“å¼€ %s:%s" -#: sequencer.c:919 +#: sequencer.c:920 #, c-format msgid "cannot read %s: %s" msgstr "ä¸èƒ½è¯»å– %s:%s" -#: sequencer.c:920 +#: sequencer.c:921 msgid "unexpected end of file" msgstr "æ„外的文件结æŸ" -#: sequencer.c:926 +#: sequencer.c:927 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "ä¿å˜æ‹£é€‰æäº¤å‰çš„ HEAD 文件 '%s' æŸå" -#: sequencer.c:949 +#: sequencer.c:950 #, c-format msgid "Could not format %s." msgstr "ä¸èƒ½æ ¼å¼åŒ– %s。" -#: sequencer.c:1092 +#: sequencer.c:1093 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s:ä¸èƒ½æ‹£é€‰ä¸€ä¸ª%s" -#: sequencer.c:1095 +#: sequencer.c:1096 #, c-format msgid "%s: bad revision" msgstr "%s:错误的版本" -#: sequencer.c:1129 +#: sequencer.c:1130 msgid "Can't revert as initial commit" msgstr "ä¸èƒ½ä½œä¸ºåˆå§‹æäº¤è¿˜åŽŸ" -#: sequencer.c:1130 +#: sequencer.c:1131 msgid "Can't cherry-pick into empty head" msgstr "ä¸èƒ½æ‹£é€‰åˆ°ç©ºåˆ†æ”¯" -#: sha1_name.c:440 +#: sha1_name.c:439 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1215,400 +1320,480 @@ msgstr "" "å¯èƒ½éœ€è¦åˆ 除它们。用 \"git config advice.objectNameWarning false\"\n" "命令关闿œ¬æ¶ˆæ¯é€šçŸ¥ã€‚" -#: sha1_name.c:1097 +#: sha1_name.c:1070 msgid "HEAD does not point to a branch" msgstr "HEAD 没有指å‘一个分支" -#: sha1_name.c:1100 +#: sha1_name.c:1073 #, c-format msgid "No such branch: '%s'" msgstr "没有æ¤åˆ†æ”¯ï¼š'%s'" -#: sha1_name.c:1102 +#: sha1_name.c:1075 #, c-format msgid "No upstream configured for branch '%s'" msgstr "尚未给分支 '%s' 设置上游" -#: sha1_name.c:1106 +#: sha1_name.c:1079 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "上游分支 '%s' 没有å˜å‚¨ä¸ºä¸€ä¸ªè¿œç¨‹è·Ÿè¸ªåˆ†æ”¯" -#: wrapper.c:408 +#: submodule.c:64 submodule.c:98 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "æ— æ³•ä¿®æ”¹æœªåˆå¹¶çš„ .gitmodules,先解决åˆå¹¶å†²çª" + +#: submodule.c:68 submodule.c:102 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "æ— æ³•åœ¨ .gitmodules 䏿‰¾åˆ° path=%s çš„å°èŠ‚" + +#. Maybe the user already did that, don't error out here +#: submodule.c:76 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr "ä¸èƒ½æ›´æ–° .gitmodules æ¡ç›® %s" + +#. Maybe the user already did that, don't error out here +#: submodule.c:109 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "æ— æ³•ç§»é™¤ %s çš„ .gitmodules æ¡ç›®" + +#: submodule.c:127 +msgid "could not find .gitmodules in index" +msgstr "æ— æ³•åœ¨ç´¢å¼•ä¸æ‰¾åˆ° .gitmodules" + +#: submodule.c:133 +msgid "reading updated .gitmodules failed" +msgstr "è¯»å–æ›´æ–°åŽçš„ .gitmodules 失败" + +#: submodule.c:135 +msgid "unable to stat updated .gitmodules" +msgstr "ä¸èƒ½æžšä¸¾æ›´æ–°åŽçš„ .gitmodules" + +#: submodule.c:139 +msgid "unable to remove .gitmodules from index" +msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸ç§»é™¤ .gitmodules" + +#: submodule.c:141 +msgid "adding updated .gitmodules failed" +msgstr "æ·»åŠ æ›´æ–°åŽçš„ .gitmodules 失败" + +#: submodule.c:143 +msgid "staging updated .gitmodules failed" +msgstr "å°†æ›´æ–°åŽ .gitmodules æ·»åŠ æš‚å˜åŒºå¤±è´¥" + +#: submodule.c:1144 builtin/init-db.c:363 +#, c-format +msgid "Could not create git link %s" +msgstr "ä¸èƒ½åˆ›å»º git link %s" + +#: submodule.c:1155 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "ä¸èƒ½åœ¨ %s ä¸è®¾ç½® core.worktree" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "æ— æ•ˆçš„ URL 方案å称或丢失 '://' åŽç¼€" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "æ— æ•ˆçš„ %XX 转义åºåˆ—" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "缺失主机å且URLæ–¹æ¡ˆä¸æ˜¯ 'file:'" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "一个 'file:' URL ä¸åº”该包å«ç«¯å£å·" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "主机åä¸åŒ…嫿— 效的å—符" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "æ— æ•ˆçš„ç«¯å£å·" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "æ— æ•ˆçš„ '..' 路径片段" + +#: wrapper.c:422 #, c-format msgid "unable to access '%s': %s" msgstr "ä¸èƒ½è®¿é—® '%s':%s" -#: wrapper.c:429 +#: wrapper.c:443 #, c-format msgid "unable to access '%s'" msgstr "ä¸èƒ½è®¿é—® '%s'" -#: wrapper.c:440 +#: wrapper.c:454 #, c-format msgid "unable to look up current user in the passwd file: %s" msgstr "æ— æ³•åœ¨å£ä»¤æ–‡ä»¶ä¸æŸ¥è¯¢åˆ°å½“å‰ç”¨æˆ·ï¼š%s" -#: wrapper.c:441 +#: wrapper.c:455 msgid "no such user" msgstr "æ— æ¤ç”¨æˆ·" -#: wt-status.c:141 +#: wt-status.c:150 msgid "Unmerged paths:" msgstr "未åˆå¹¶çš„路径:" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:168 wt-status.c:195 +#: wt-status.c:177 wt-status.c:204 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr " (使用 \"git reset %s <file>...\" 撤出暂å˜åŒºï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:170 wt-status.c:197 +#: wt-status.c:179 wt-status.c:206 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr " (使用 \"git rm --cached <file>...\" 撤出暂å˜åŒºï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:174 +#: wt-status.c:183 msgid " (use \"git add <file>...\" to mark resolution)" msgstr " (使用 \"git add <file>...\" æ ‡è®°è§£å†³æ–¹æ¡ˆï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:176 wt-status.c:180 +#: wt-status.c:185 wt-status.c:189 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr " (酌情使用 \"git add/rm <file>...\" æ ‡è®°è§£å†³æ–¹æ¡ˆï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:178 +#: wt-status.c:187 msgid " (use \"git rm <file>...\" to mark resolution)" msgstr " (使用 \"git rm <file>...\" æ ‡è®°è§£å†³æ–¹æ¡ˆï¼‰" -#: wt-status.c:189 +#: wt-status.c:198 msgid "Changes to be committed:" msgstr "è¦æäº¤çš„å˜æ›´ï¼š" -#: wt-status.c:207 +#: wt-status.c:216 msgid "Changes not staged for commit:" msgstr "尚未暂å˜ä»¥å¤‡æäº¤çš„å˜æ›´ï¼š" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:211 +#: wt-status.c:220 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr " (使用 \"git add <file>...\" æ›´æ–°è¦æäº¤çš„å†…å®¹ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:213 +#: wt-status.c:222 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr " (使用 \"git add/rm <file>...\" æ›´æ–°è¦æäº¤çš„å†…å®¹ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:214 +#: wt-status.c:223 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr " (使用 \"git checkout -- <file>...\" 丢弃工作区的改动)" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:216 +#: wt-status.c:225 msgid " (commit or discard the untracked or modified content in submodules)" msgstr " (æäº¤æˆ–ä¸¢å¼ƒåæ¨¡ç»„䏿œªè·Ÿè¸ªæˆ–修改的内容)" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:228 +#: wt-status.c:237 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr " (使用 \"git %s <file>...\" 以包å«è¦æäº¤çš„内容)" -#: wt-status.c:245 +#: wt-status.c:254 msgid "bug" msgstr "bug" -#: wt-status.c:250 +#: wt-status.c:259 msgid "both deleted:" msgstr "åŒæ–¹åˆ 除:" -#: wt-status.c:251 +#: wt-status.c:260 msgid "added by us:" msgstr "ç”±æˆ‘ä»¬æ·»åŠ ï¼š" -#: wt-status.c:252 +#: wt-status.c:261 msgid "deleted by them:" msgstr "ç”±ä»–ä»¬åˆ é™¤ï¼š" -#: wt-status.c:253 +#: wt-status.c:262 msgid "added by them:" msgstr "ç”±ä»–ä»¬æ·»åŠ ï¼š" -#: wt-status.c:254 +#: wt-status.c:263 msgid "deleted by us:" msgstr "ç”±æˆ‘ä»¬åˆ é™¤ï¼š" -#: wt-status.c:255 +#: wt-status.c:264 msgid "both added:" msgstr "åŒæ–¹æ·»åŠ ï¼š" -#: wt-status.c:256 +#: wt-status.c:265 msgid "both modified:" msgstr "åŒæ–¹ä¿®æ”¹ï¼š" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#: wt-status.c:275 +msgid "new file" +msgstr "新文件" + +#: wt-status.c:277 +msgid "copied" +msgstr "æ‹·è´" + +#: wt-status.c:279 +msgid "deleted" +msgstr "åˆ é™¤" + +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#: wt-status.c:285 +msgid "typechange" +msgstr "ç±»åž‹å˜æ›´" + +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#: wt-status.c:287 +msgid "unknown" +msgstr "未知" + +#: wt-status.c:289 +msgid "unmerged" +msgstr "未åˆå¹¶" + # 译者:末尾两个å—节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚æžœç¿»è¯‘ä¸ºä¸æ–‡æ ‡ç‚¹ä¼šå‡ºçްåŠä¸ªæ±‰å— -#: wt-status.c:286 +#: wt-status.c:336 msgid "new commits, " msgstr "æ–°æäº¤, " # 译者:末尾两个å—节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚æžœç¿»è¯‘ä¸ºä¸æ–‡æ ‡ç‚¹ä¼šå‡ºçްåŠä¸ªæ±‰å— -#: wt-status.c:288 +#: wt-status.c:338 msgid "modified content, " msgstr "修改的内容, " # 译者:末尾两个å—节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚æžœç¿»è¯‘ä¸ºä¸æ–‡æ ‡ç‚¹ä¼šå‡ºçްåŠä¸ªæ±‰å— -#: wt-status.c:290 +#: wt-status.c:340 msgid "untracked content, " msgstr "未跟踪的内容, " -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:307 -#, c-format -msgid "new file: %s" -msgstr "新文件: %s" - -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:310 -#, c-format -msgid "copied: %s -> %s" -msgstr "æ‹·è´ï¼š %s -> %s" - -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:313 +#: wt-status.c:357 #, c-format -msgid "deleted: %s" -msgstr "åˆ é™¤ï¼š %s" - -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:316 -#, c-format -msgid "modified: %s" -msgstr "修改: %s" - -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:319 -#, c-format -msgid "renamed: %s -> %s" -msgstr "é‡å‘½å: %s -> %s" - -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:322 -#, c-format -msgid "typechange: %s" -msgstr "ç±»åž‹å˜æ›´ï¼š %s" +msgid "bug: unhandled diff status %c" +msgstr "bug:未处ç†çš„å·®å¼‚çŠ¶æ€ %c" -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:325 -#, c-format -msgid "unknown: %s" -msgstr "未知: %s" +#: wt-status.c:732 +msgid "Submodules changed but not updated:" +msgstr "忍¡ç»„已修改但尚未更新:" -# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: wt-status.c:328 -#, c-format -msgid "unmerged: %s" -msgstr "未åˆå¹¶ï¼š %s" +#: wt-status.c:734 +msgid "Submodule changes to be committed:" +msgstr "è¦æäº¤çš„åæ¨¡ç»„å˜æ›´ï¼š" -#: wt-status.c:331 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "bug:未处ç†çš„å·®å¼‚çŠ¶æ€ %c" +#: wt-status.c:836 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"ä¸è¦æ”¹åŠ¨ä¸Šé¢çš„一行。\n" +"下é¢çš„æ‰€æœ‰å†…容å‡å°†è¢«åˆ 除。" -#: wt-status.c:803 +#: wt-status.c:899 msgid "You have unmerged paths." msgstr "您有尚未åˆå¹¶çš„路径。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:806 +#: wt-status.c:902 msgid " (fix conflicts and run \"git commit\")" msgstr " (解决冲çªå¹¶è¿è¡Œ \"git commit\")" -#: wt-status.c:809 +#: wt-status.c:905 msgid "All conflicts fixed but you are still merging." msgstr "所有冲çªå·²è§£å†³ä½†æ‚¨ä»å¤„于åˆå¹¶ä¸ã€‚" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:812 +#: wt-status.c:908 msgid " (use \"git commit\" to conclude merge)" msgstr " (使用 \"git commit\" 结æŸåˆå¹¶ï¼‰" -#: wt-status.c:822 +#: wt-status.c:918 msgid "You are in the middle of an am session." -msgstr "您æ£å¤„于一个 am 过程ä¸ã€‚" +msgstr "您æ£å¤„于 am æ“作过程ä¸ã€‚" -#: wt-status.c:825 +#: wt-status.c:921 msgid "The current patch is empty." msgstr "当å‰çš„è¡¥ä¸ä¸ºç©ºã€‚" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:829 +#: wt-status.c:925 msgid " (fix conflicts and then run \"git am --continue\")" msgstr " (解决冲çªï¼Œç„¶åŽè¿è¡Œ \"git am --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:831 +#: wt-status.c:927 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (使用 \"git am --skip\" 跳过æ¤è¡¥ä¸ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:833 +#: wt-status.c:929 msgid " (use \"git am --abort\" to restore the original branch)" msgstr " (使用 \"git am --abort\" æ¢å¤åŽŸæœ‰åˆ†æ”¯ï¼‰" -#: wt-status.c:893 wt-status.c:910 +#: wt-status.c:989 wt-status.c:1006 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." -msgstr "您æ£åœ¨å°†åˆ†æ”¯ '%s' å˜åŸºåˆ° '%s'。" +msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作。" -#: wt-status.c:898 wt-status.c:915 +#: wt-status.c:994 wt-status.c:1011 msgid "You are currently rebasing." -msgstr "您æ£åœ¨å˜åŸºã€‚" +msgstr "您在执行å˜åŸºæ“作。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:901 +#: wt-status.c:997 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr " (解决冲çªï¼Œç„¶åŽè¿è¡Œ \"git rebase --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:903 +#: wt-status.c:999 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (使用 \"git rebase --skip\" 跳过æ¤è¡¥ä¸ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:905 +#: wt-status.c:1001 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr " (使用 \"git rebase --abort\" 以检出原有分支)" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:918 +#: wt-status.c:1014 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git rebase --continue\")" -#: wt-status.c:922 +#: wt-status.c:1018 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." -msgstr "您æ£åœ¨å°†åˆ†æ”¯ '%s' å˜åŸºåˆ° '%s' è¿‡ç¨‹ä¸æ‹†åˆ†ä¸€ä¸ªæäº¤ã€‚" +msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作时拆分æäº¤ã€‚" -#: wt-status.c:927 +#: wt-status.c:1023 msgid "You are currently splitting a commit during a rebase." -msgstr "您æ£åœ¨å˜åŸºè¿‡ç¨‹ä¸æ‹†åˆ†ä¸€ä¸ªæäº¤ã€‚" +msgstr "您在执行å˜åŸºæ“作时拆分æäº¤ã€‚" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:930 +#: wt-status.c:1026 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr " (一旦您工作目录æäº¤å¹²å‡€åŽï¼Œè¿è¡Œ \"git rebase --continue\")" -#: wt-status.c:934 +#: wt-status.c:1030 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." -msgstr "您æ£åœ¨å°†åˆ†æ”¯ '%s' å˜åŸºåˆ° '%s' 过程ä¸ç¼–辑一个æäº¤ã€‚" +msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作时编辑æäº¤ã€‚" -#: wt-status.c:939 +#: wt-status.c:1035 msgid "You are currently editing a commit during a rebase." -msgstr "您æ£åœ¨å˜åŸºè¿‡ç¨‹ä¸ç¼–辑一个æäº¤ã€‚" +msgstr "您在执行å˜åŸºæ“作时编辑æäº¤ã€‚" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:942 +#: wt-status.c:1038 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr " (使用 \"git commit --amend\" ä¿®è¡¥å½“å‰æäº¤ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:944 +#: wt-status.c:1040 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr " (当您对您的修改满æ„åŽæ‰§è¡Œ \"git rebase --continue\")" -#: wt-status.c:954 -msgid "You are currently cherry-picking." -msgstr "您æ£åœ¨å𿋣选æ“作。" +#: wt-status.c:1050 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "您在执行拣选æäº¤ %s çš„æ“作。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:958 +#: wt-status.c:1055 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr " (解决冲çªå¹¶è¿è¡Œ \"git cherry-pick --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:961 +#: wt-status.c:1058 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git cherry-pick --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:963 +#: wt-status.c:1060 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr " (使用 \"git cherry-pick --abort\" 以喿¶ˆæ‹£é€‰æ“作)" -#: wt-status.c:972 +#: wt-status.c:1069 #, c-format msgid "You are currently reverting commit %s." -msgstr "您æ£åœ¨å转æäº¤ %s 。" +msgstr "您在执行å转æäº¤ %s çš„æ“作。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:977 +#: wt-status.c:1074 msgid " (fix conflicts and run \"git revert --continue\")" msgstr " (解决冲çªå¹¶è¿è¡Œ \"git revert --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:980 +#: wt-status.c:1077 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git revert --continue\")" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:982 +#: wt-status.c:1079 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr " (使用 \"git revert --abort\" 以喿¶ˆå转æäº¤æ“作)" -#: wt-status.c:993 +#: wt-status.c:1090 #, c-format msgid "You are currently bisecting, started from branch '%s'." -msgstr "您æ£åœ¨ä»Žåˆ†æ”¯ '%s' 开始åšäºŒåˆ†æŸ¥æ‰¾ã€‚" +msgstr "您在执行从分支 '%s' 开始的二分查找æ“作。" -#: wt-status.c:997 +#: wt-status.c:1094 msgid "You are currently bisecting." -msgstr "您æ£åœ¨åšäºŒåˆ†æŸ¥æ‰¾ã€‚" +msgstr "您在执行二分查找æ“作。" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: wt-status.c:1000 +#: wt-status.c:1097 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr " (使用 \"git bisect reset\" 以回到原有分支)" -#: wt-status.c:1173 +#: wt-status.c:1272 msgid "On branch " msgstr "ä½äºŽåˆ†æ”¯ " -#: wt-status.c:1180 +#: wt-status.c:1279 msgid "rebase in progress; onto " -msgstr "å˜åŸºæ£åœ¨è¿›è¡Œä¸ï¼›è‡³ " +msgstr "å˜åŸºæ“作æ£åœ¨è¿›è¡Œä¸ï¼›è‡³ " -#: wt-status.c:1187 +#: wt-status.c:1286 msgid "HEAD detached at " msgstr "头指针分离于 " -#: wt-status.c:1189 +#: wt-status.c:1288 msgid "HEAD detached from " msgstr "头指针分离自 " -#: wt-status.c:1192 +#: wt-status.c:1291 msgid "Not currently on any branch." msgstr "当å‰ä¸åœ¨ä»»ä½•分支上。" -#: wt-status.c:1209 +#: wt-status.c:1308 msgid "Initial commit" msgstr "åˆå§‹æäº¤" -#: wt-status.c:1223 +#: wt-status.c:1322 msgid "Untracked files" msgstr "未跟踪的文件" -#: wt-status.c:1225 +#: wt-status.c:1324 msgid "Ignored files" msgstr "忽略的文件" -#: wt-status.c:1229 +#: wt-status.c:1328 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -1618,97 +1803,101 @@ msgstr "" "耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能æé«˜é€Ÿåº¦ï¼Œ\n" "但您需è¦å°å¿ƒä¸è¦å¿˜äº†æ·»åŠ æ–°æ–‡ä»¶ï¼ˆå‚è§ 'git help status')。" -#: wt-status.c:1235 +#: wt-status.c:1334 #, c-format msgid "Untracked files not listed%s" msgstr "未跟踪的文件没有列出%s" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1237 +#: wt-status.c:1336 msgid " (use -u option to show untracked files)" msgstr "(使用 -u 傿•°æ˜¾ç¤ºæœªè·Ÿè¸ªçš„æ–‡ä»¶ï¼‰" -#: wt-status.c:1243 +#: wt-status.c:1342 msgid "No changes" msgstr "没有修改" -#: wt-status.c:1248 +#: wt-status.c:1347 #, c-format msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" msgstr "ä¿®æ”¹å°šæœªåŠ å…¥æäº¤ï¼ˆä½¿ç”¨ \"git add\" å’Œ/或 \"git commit -a\")\n" -#: wt-status.c:1251 +#: wt-status.c:1350 #, c-format msgid "no changes added to commit\n" msgstr "ä¿®æ”¹å°šæœªåŠ å…¥æäº¤\n" -#: wt-status.c:1254 +#: wt-status.c:1353 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " "track)\n" msgstr "æäº¤ä¸ºç©ºï¼Œä½†æ˜¯å˜åœ¨å°šæœªè·Ÿè¸ªçš„æ–‡ä»¶ï¼ˆä½¿ç”¨ \"git add\" 建立跟踪)\n" -#: wt-status.c:1257 +#: wt-status.c:1356 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "æäº¤ä¸ºç©ºï¼Œä½†æ˜¯å˜åœ¨å°šæœªè·Ÿè¸ªçš„æ–‡ä»¶\n" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1260 +#: wt-status.c:1359 #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "æ— æ–‡ä»¶è¦æäº¤ï¼ˆåˆ›å»º/æ‹·è´æ–‡ä»¶å¹¶ä½¿ç”¨ \"git add\" 建立跟踪)\n" -#: wt-status.c:1263 wt-status.c:1268 +#: wt-status.c:1362 wt-status.c:1367 #, c-format msgid "nothing to commit\n" msgstr "æ— æ–‡ä»¶è¦æäº¤\n" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1266 +#: wt-status.c:1365 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "æ— æ–‡ä»¶è¦æäº¤ï¼ˆä½¿ç”¨ -u 显示未跟踪的文件)\n" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: wt-status.c:1270 +#: wt-status.c:1369 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "æ— æ–‡ä»¶è¦æäº¤ï¼Œå¹²å‡€çš„å·¥ä½œåŒº\n" -#: wt-status.c:1378 +#: wt-status.c:1478 msgid "HEAD (no branch)" msgstr "HEAD(éžåˆ†æ”¯ï¼‰" # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1384 +#: wt-status.c:1484 msgid "Initial commit on " msgstr "åˆå§‹æäº¤äºŽ " +#: wt-status.c:1514 +msgid "gone" +msgstr "丢失" + # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1399 +#: wt-status.c:1516 msgid "behind " msgstr "è½åŽ " # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1402 wt-status.c:1405 +#: wt-status.c:1519 wt-status.c:1522 msgid "ahead " msgstr "领先 " # 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼ -#: wt-status.c:1407 +#: wt-status.c:1524 msgid ", behind " msgstr ",è½åŽ " -#: compat/precompose_utf8.c:58 builtin/clone.c:351 +#: compat/precompose_utf8.c:55 builtin/clone.c:356 #, c-format msgid "failed to unlink '%s'" msgstr "æ— æ³•åˆ é™¤ '%s'" #: builtin/add.c:20 msgid "git add [options] [--] <pathspec>..." -msgstr "git add [选项] [--] <路径匹é…>..." +msgstr "git add [选项] [--] <路径规则>..." # 译者:å—ç¬¦ä¸²é¦–è¡Œè¡Œé¦–è¦æ·»åŠ â€œwarning: â€å—串,故æ¤é¦–行è¦è¾ƒå…¶ä½™è¡ŒçŸ #. @@ -1774,10 +1963,10 @@ msgstr "" "åƒæœ¬åœ°å·¥ä½œåŒºç§»é™¤çš„路径 '%s'\n" "在æ¤ç‰ˆæœ¬çš„ Git ä¸è¢«å¿½ç•¥ã€‚\n" "\n" -"* 'git add --ignore-removal <pathspec>',是当å‰ç‰ˆæœ¬çš„默认æ“作,\n" +"* 'git add --ignore-removal <路径规则>',是当å‰ç‰ˆæœ¬çš„默认æ“作,\n" " 忽略您本地工作区ä¸ç§»é™¤çš„æ–‡ä»¶ã€‚\n" "\n" -"* 'git add --all <pathspec>' å°†è®©æ‚¨åŒæ—¶å¯¹åˆ 除æ“作进行记录。\n" +"* 'git add --all <路径规则>' å°†è®©æ‚¨åŒæ—¶å¯¹åˆ 除æ“作进行记录。\n" "\n" "è¿è¡Œ 'git status' æ¥æ£€æŸ¥æ‚¨æœ¬åœ°å·¥ä½œåŒºä¸ç§»é™¤çš„路径。\n" @@ -1786,7 +1975,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "æ„å¤–çš„å·®å¼‚çŠ¶æ€ %c" -#: builtin/add.c:149 builtin/commit.c:252 +#: builtin/add.c:149 builtin/commit.c:260 msgid "updating files failed" msgstr "更新文件失败" @@ -1795,140 +1984,135 @@ msgstr "更新文件失败" msgid "remove '%s'\n" msgstr "åˆ é™¤ '%s'\n" -#: builtin/add.c:253 +#: builtin/add.c:237 msgid "Unstaged changes after refreshing the index:" msgstr "刷新索引之åŽå°šæœªè¢«æš‚å˜çš„å˜æ›´ï¼š" -#: builtin/add.c:256 builtin/add.c:573 builtin/rm.c:337 -#, c-format -msgid "pathspec '%s' did not match any files" -msgstr "路径 '%s' 未匹é…任何文件" - -#: builtin/add.c:339 +#: builtin/add.c:299 msgid "Could not read the index" msgstr "ä¸èƒ½è¯»å–索引" -#: builtin/add.c:350 +#: builtin/add.c:310 #, c-format msgid "Could not open '%s' for writing." msgstr "ä¸èƒ½æ‰“å¼€ '%s' 以写入。" -#: builtin/add.c:354 +#: builtin/add.c:314 msgid "Could not write patch" msgstr "ä¸èƒ½ç”Ÿæˆè¡¥ä¸" -#: builtin/add.c:359 +#: builtin/add.c:319 #, c-format msgid "Could not stat '%s'" msgstr "ä¸èƒ½æŸ¥çœ‹æ–‡ä»¶çŠ¶æ€ '%s'" -#: builtin/add.c:361 +#: builtin/add.c:321 msgid "Empty patch. Aborted." msgstr "空补ä¸ã€‚异常终æ¢ã€‚" -#: builtin/add.c:367 +#: builtin/add.c:327 #, c-format msgid "Could not apply '%s'" msgstr "ä¸èƒ½åº”用 '%s'" -#: builtin/add.c:377 +#: builtin/add.c:337 msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "ä¸‹åˆ—è·¯å¾„æ ¹æ®æ‚¨çš„一个 .gitignore 文件而被忽略:\n" -#: builtin/add.c:394 builtin/clean.c:875 builtin/fetch.c:78 builtin/mv.c:63 -#: builtin/prune-packed.c:73 builtin/push.c:451 builtin/remote.c:1253 -#: builtin/rm.c:268 +#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70 +#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344 +#: builtin/rm.c:269 msgid "dry run" msgstr "æ¼”ä¹ " -#: builtin/add.c:395 builtin/apply.c:4410 builtin/check-ignore.c:19 -#: builtin/commit.c:1220 builtin/count-objects.c:95 builtin/fsck.c:613 -#: builtin/log.c:1573 builtin/mv.c:62 builtin/read-tree.c:113 +#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19 +#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612 +#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113 msgid "be verbose" msgstr "冗长输出" -#: builtin/add.c:397 +#: builtin/add.c:357 msgid "interactive picking" msgstr "äº¤äº’å¼æ‹£é€‰" -#: builtin/add.c:398 builtin/checkout.c:1073 builtin/reset.c:261 +#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272 msgid "select hunks interactively" msgstr "äº¤äº’å¼æŒ‘选数æ®å—" -#: builtin/add.c:399 +#: builtin/add.c:359 msgid "edit current diff and apply" msgstr "编辑当å‰å·®å¼‚并应用" -#: builtin/add.c:400 +#: builtin/add.c:360 msgid "allow adding otherwise ignored files" msgstr "å…è®¸æ·»åŠ å¿½ç•¥çš„æ–‡ä»¶" -#: builtin/add.c:401 +#: builtin/add.c:361 msgid "update tracked files" msgstr "更新已跟踪的文件" -#: builtin/add.c:402 +#: builtin/add.c:362 msgid "record only the fact that the path will be added later" msgstr "åªè®°å½•,该路径ç¨åŽå†æ·»åŠ " -#: builtin/add.c:403 +#: builtin/add.c:363 msgid "add changes from all tracked and untracked files" msgstr "æ·»åŠ æ‰€æœ‰æ”¹å˜çš„已跟踪文件和未跟踪文件" #. takes no arguments -#: builtin/add.c:406 +#: builtin/add.c:366 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "忽略工作区ä¸ç§»é™¤çš„路径(和 --no-all 相åŒï¼‰" -#: builtin/add.c:408 +#: builtin/add.c:368 msgid "don't add, only refresh the index" msgstr "䏿·»åŠ ï¼Œåªåˆ·æ–°ç´¢å¼•" -#: builtin/add.c:409 +#: builtin/add.c:369 msgid "just skip files which cannot be added because of errors" msgstr "è·³è¿‡å› å‡ºé”™ä¸èƒ½æ·»åŠ çš„æ–‡ä»¶" -#: builtin/add.c:410 +#: builtin/add.c:370 msgid "check if - even missing - files are ignored in dry run" msgstr "æ£€æŸ¥åœ¨æ¼”ä¹ æ¨¡å¼ä¸‹æ–‡ä»¶ï¼ˆå³ä½¿ä¸å˜åœ¨ï¼‰æ˜¯å¦è¢«å¿½ç•¥" -#: builtin/add.c:432 +#: builtin/add.c:392 #, c-format msgid "Use -f if you really want to add them.\n" msgstr "使用 -f 傿•°å¦‚æžœæ‚¨ç¡®å®žè¦æ·»åŠ å®ƒä»¬ã€‚\n" -#: builtin/add.c:433 +#: builtin/add.c:393 msgid "no files added" msgstr "æ²¡æœ‰æ–‡ä»¶è¢«æ·»åŠ " -#: builtin/add.c:439 +#: builtin/add.c:399 msgid "adding files failed" msgstr "æ·»åŠ æ–‡ä»¶å¤±è´¥" -#: builtin/add.c:478 +#: builtin/add.c:438 msgid "-A and -u are mutually incompatible" msgstr "-A å’Œ -u 选项互斥" -#: builtin/add.c:496 +#: builtin/add.c:456 msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "选项 --ignore-missing åªèƒ½å’Œ --dry-run åŒæ—¶ä½¿ç”¨" -#: builtin/add.c:526 +#: builtin/add.c:486 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "æ²¡æœ‰æŒ‡å®šæ–‡ä»¶ï¼Œä¹Ÿæ²¡æœ‰æ–‡ä»¶è¢«æ·»åŠ ã€‚\n" -#: builtin/add.c:527 +#: builtin/add.c:487 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "ä¹Ÿè®¸æ‚¨æƒ³è¦æ‰§è¡Œ 'git add .'?\n" -#: builtin/add.c:533 builtin/check-ignore.c:161 builtin/clean.c:919 -#: builtin/commit.c:312 builtin/mv.c:82 builtin/rm.c:297 +#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919 +#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299 msgid "index file corrupt" msgstr "索引文件æŸå" -#: builtin/add.c:605 builtin/apply.c:4506 builtin/mv.c:229 builtin/rm.c:432 +#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432 msgid "Unable to write new index file" msgstr "æ— æ³•å†™å…¥æ–°ç´¢å¼•æ–‡ä»¶" @@ -2176,7 +2360,7 @@ msgstr "%sï¼šè¡¥ä¸æœªåº”用" msgid "Checking patch %s..." msgstr "æ£€æŸ¥è¡¥ä¸ %s..." -#: builtin/apply.c:3680 builtin/checkout.c:216 builtin/reset.c:127 +#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "对路径 '%s' çš„ make_cache_entry æ“作失败" @@ -2256,8 +2440,8 @@ msgstr "未能识别的输入" msgid "unable to read index file" msgstr "æ— æ³•è¯»å–索引文件" -#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:91 -#: builtin/fetch.c:63 +#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90 +#: builtin/fetch.c:78 msgid "path" msgstr "路径" @@ -2317,7 +2501,7 @@ msgstr "如果一个补ä¸ä¸èƒ½åº”用则å°è¯•三路åˆå¹¶" msgid "build a temporary index based on embedded index information" msgstr "创建一个临时索引基于嵌入的索引信æ¯" -#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:462 +#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452 msgid "paths are separated with NUL character" msgstr "路径以 NUL å—符分隔" @@ -2447,103 +2631,103 @@ msgstr "执行 'git bisect next'" msgid "update BISECT_HEAD instead of checking out the current commit" msgstr "æ›´æ–° BISECT_HEAD è€Œéžæ£€å‡ºå½“å‰æäº¤" -#: builtin/blame.c:26 +#: builtin/blame.c:27 msgid "git blame [options] [rev-opts] [rev] [--] file" msgstr "git blame [选项] [版本选项] [版本] [--] 文件" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[版本选项] 的文档记录在 git-rev-list(1) ä¸" -#: builtin/blame.c:2276 +#: builtin/blame.c:2249 msgid "Show blame entries as we find them, incrementally" msgstr "增é‡å¼åœ°æ˜¾ç¤ºå‘现的 blame æ¡ç›®" -#: builtin/blame.c:2277 +#: builtin/blame.c:2250 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "边界æäº¤æ˜¾ç¤ºç©ºçš„ SHA-1(默认:关é—)" -#: builtin/blame.c:2278 +#: builtin/blame.c:2251 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "ä¸æŠŠæ ¹æäº¤ä½œä¸ºè¾¹ç•Œï¼ˆé»˜è®¤ï¼šå…³é—)" -#: builtin/blame.c:2279 +#: builtin/blame.c:2252 msgid "Show work cost statistics" msgstr "显示命令消耗统计" -#: builtin/blame.c:2280 +#: builtin/blame.c:2253 msgid "Show output score for blame entries" msgstr "æ˜¾ç¤ºåˆ¤æ– blame æ¡ç›®ä½ç§»çš„得分诊æ–ä¿¡æ¯" -#: builtin/blame.c:2281 +#: builtin/blame.c:2254 msgid "Show original filename (Default: auto)" msgstr "显示原始文件å(默认:自动)" -#: builtin/blame.c:2282 +#: builtin/blame.c:2255 msgid "Show original linenumber (Default: off)" msgstr "显示原始的行å·ï¼ˆé»˜è®¤ï¼šå…³é—)" -#: builtin/blame.c:2283 +#: builtin/blame.c:2256 msgid "Show in a format designed for machine consumption" msgstr "æ˜¾ç¤ºä¸ºä¸€ä¸ªé€‚åˆæœºå™¨è¯»å–çš„æ ¼å¼" -#: builtin/blame.c:2284 +#: builtin/blame.c:2257 msgid "Show porcelain format with per-line commit information" msgstr "为æ¯ä¸€è¡Œæ˜¾ç¤ºæœºå™¨é€‚用的æäº¤ä¿¡æ¯" -#: builtin/blame.c:2285 +#: builtin/blame.c:2258 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "使用和 git-annotate 相åŒçš„输出模å¼ï¼ˆé»˜è®¤ï¼šå…³é—)" -#: builtin/blame.c:2286 +#: builtin/blame.c:2259 msgid "Show raw timestamp (Default: off)" msgstr "显示原始时间戳(默认:关é—)" -#: builtin/blame.c:2287 +#: builtin/blame.c:2260 msgid "Show long commit SHA1 (Default: off)" msgstr "显示长的SHA1æäº¤å·ï¼ˆé»˜è®¤ï¼šå…³é—)" -#: builtin/blame.c:2288 +#: builtin/blame.c:2261 msgid "Suppress author name and timestamp (Default: off)" msgstr "éšè—作者åå—和时间戳(默认:关é—)" -#: builtin/blame.c:2289 +#: builtin/blame.c:2262 msgid "Show author email instead of name (Default: off)" msgstr "æ˜¾ç¤ºä½œè€…çš„é‚®ç®±è€Œä¸æ˜¯åå—(默认:关é—)" -#: builtin/blame.c:2290 +#: builtin/blame.c:2263 msgid "Ignore whitespace differences" msgstr "忽略空白差异" -#: builtin/blame.c:2291 +#: builtin/blame.c:2264 msgid "Spend extra cycles to find better match" msgstr "花费é¢å¤–çš„å¾ªçŽ¯æ¥æ‰¾åˆ°æ›´å¥½çš„匹é…" -#: builtin/blame.c:2292 +#: builtin/blame.c:2265 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "使用æ¥è‡ª <file> çš„ä¿®è®¢é›†è€Œä¸æ˜¯è°ƒç”¨ git-rev-list" -#: builtin/blame.c:2293 +#: builtin/blame.c:2266 msgid "Use <file>'s contents as the final image" msgstr "使用 <file> 的内容作为最终的图片" -#: builtin/blame.c:2294 builtin/blame.c:2295 +#: builtin/blame.c:2267 builtin/blame.c:2268 msgid "score" msgstr "得分" -#: builtin/blame.c:2294 +#: builtin/blame.c:2267 msgid "Find line copies within and across files" msgstr "找到文件内åŠè·¨æ–‡ä»¶çš„行拷è´" -#: builtin/blame.c:2295 +#: builtin/blame.c:2268 msgid "Find line movements within and across files" msgstr "找到文件内åŠè·¨æ–‡ä»¶çš„行移动" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2296 +#: builtin/blame.c:2269 msgid "Process only line range n,m, counting from 1" msgstr "åªå¤„ç†è¡ŒèŒƒå›´åœ¨ n å’Œ m 之间的,从 1 开始" @@ -2649,275 +2833,285 @@ msgstr "å·²åˆ é™¤åˆ†æ”¯ %s(曾为 %s)。\n" msgid "branch '%s' does not point at a commit" msgstr "分支 '%s' 未指å‘一个æäº¤" -#: builtin/branch.c:453 +#: builtin/branch.c:454 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: 丢失]" + +#: builtin/branch.c:459 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:464 #, c-format msgid "[%s: behind %d]" msgstr "[%s:è½åŽ %d]" -#: builtin/branch.c:455 +#: builtin/branch.c:466 #, c-format msgid "[behind %d]" msgstr "[è½åŽ %d]" -#: builtin/branch.c:459 +#: builtin/branch.c:470 #, c-format msgid "[%s: ahead %d]" msgstr "[%s:领先 %d]" -#: builtin/branch.c:461 +#: builtin/branch.c:472 #, c-format msgid "[ahead %d]" msgstr "[领先 %d]" -#: builtin/branch.c:464 +#: builtin/branch.c:475 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s:领先 %d,è½åŽ %d]" -#: builtin/branch.c:467 +#: builtin/branch.c:478 #, c-format msgid "[ahead %d, behind %d]" msgstr "[领先 %d,è½åŽ %d]" -#: builtin/branch.c:490 +#: builtin/branch.c:502 msgid " **** invalid ref ****" msgstr " **** æ— æ•ˆå¼•ç”¨ ****" -#: builtin/branch.c:582 +#: builtin/branch.c:594 #, c-format msgid "(no branch, rebasing %s)" msgstr "(éžåˆ†æ”¯ï¼Œæ£å˜åŸº %s)" -#: builtin/branch.c:585 +#: builtin/branch.c:597 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(éžåˆ†æ”¯ï¼ŒäºŒåˆ†æŸ¥æ‰¾å¼€å§‹äºŽ %s)" -#: builtin/branch.c:588 +#: builtin/branch.c:600 #, c-format msgid "(detached from %s)" msgstr "(分离自 %s)" -#: builtin/branch.c:591 +#: builtin/branch.c:603 msgid "(no branch)" msgstr "(éžåˆ†æ”¯ï¼‰" -#: builtin/branch.c:637 +#: builtin/branch.c:649 #, c-format msgid "object '%s' does not point to a commit" msgstr "对象 '%s' 没有指å‘一个æäº¤" -#: builtin/branch.c:669 +#: builtin/branch.c:681 msgid "some refs could not be read" msgstr "一些引用ä¸èƒ½è¯»å–" -#: builtin/branch.c:682 +#: builtin/branch.c:694 msgid "cannot rename the current branch while not on any." msgstr "æ— æ³•é‡å‘½å当å‰åˆ†æ”¯å› 为ä¸å¤„于任何分支上。" -#: builtin/branch.c:692 +#: builtin/branch.c:704 #, c-format msgid "Invalid branch name: '%s'" msgstr "æ— æ•ˆçš„åˆ†æ”¯å:'%s'" -#: builtin/branch.c:707 +#: builtin/branch.c:719 msgid "Branch rename failed" msgstr "分支é‡å‘½å失败" -#: builtin/branch.c:711 +#: builtin/branch.c:723 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "é‡å‘½å掉一个错误命å的旧分支 '%s'" -#: builtin/branch.c:715 +#: builtin/branch.c:727 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "分支é‡å‘½å为 %s,但 HEAD 没有更新ï¼" -#: builtin/branch.c:722 +#: builtin/branch.c:734 msgid "Branch is renamed, but update of config-file failed" msgstr "分支被é‡å‘½å,但更新 config 文件失败" -#: builtin/branch.c:737 +#: builtin/branch.c:749 #, c-format msgid "malformed object name %s" msgstr "éžæ³•的对象å %s" -#: builtin/branch.c:761 +#: builtin/branch.c:773 #, c-format msgid "could not write branch description template: %s" msgstr "ä¸èƒ½å†™åˆ†æ”¯æè¿°æ¨¡ç‰ˆï¼š%s" -#: builtin/branch.c:791 +#: builtin/branch.c:803 msgid "Generic options" msgstr "通用选项" -#: builtin/branch.c:793 +#: builtin/branch.c:805 msgid "show hash and subject, give twice for upstream branch" msgstr "æ˜¾ç¤ºå“ˆå¸Œå€¼å’Œä¸»é¢˜ï¼Œè‹¥å‚æ•°å‡ºçŽ°ä¸¤æ¬¡åˆ™æ˜¾ç¤ºä¸Šæ¸¸åˆ†æ”¯" -#: builtin/branch.c:794 +#: builtin/branch.c:806 msgid "suppress informational messages" msgstr "䏿˜¾ç¤ºä¿¡æ¯" -#: builtin/branch.c:795 +#: builtin/branch.c:807 msgid "set up tracking mode (see git-pull(1))" msgstr "设置跟踪模å¼ï¼ˆå‚è§ git-pull(1))" -#: builtin/branch.c:797 +#: builtin/branch.c:809 msgid "change upstream info" msgstr "改å˜ä¸Šæ¸¸ä¿¡æ¯" -#: builtin/branch.c:801 +#: builtin/branch.c:813 msgid "use colored output" msgstr "使用彩色输出" -#: builtin/branch.c:802 +#: builtin/branch.c:814 msgid "act on remote-tracking branches" msgstr "作用于远程跟踪分支" -#: builtin/branch.c:805 builtin/branch.c:811 builtin/branch.c:832 -#: builtin/branch.c:838 builtin/commit.c:1433 builtin/commit.c:1434 -#: builtin/commit.c:1435 builtin/commit.c:1436 builtin/tag.c:468 +#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844 +#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461 +#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468 msgid "commit" msgstr "æäº¤" -#: builtin/branch.c:806 builtin/branch.c:812 +#: builtin/branch.c:818 builtin/branch.c:824 msgid "print only branches that contain the commit" msgstr "åªæ‰“å°åŒ…å«è¯¥æäº¤çš„分支" -#: builtin/branch.c:818 +#: builtin/branch.c:830 msgid "Specific git-branch actions:" msgstr "具体的 git-branch 动作:" -#: builtin/branch.c:819 +#: builtin/branch.c:831 msgid "list both remote-tracking and local branches" msgstr "åˆ—å‡ºè¿œç¨‹è·Ÿè¸ªåŠæœ¬åœ°åˆ†æ”¯" -#: builtin/branch.c:821 +#: builtin/branch.c:833 msgid "delete fully merged branch" msgstr "åˆ é™¤å®Œå…¨åˆå¹¶çš„分支" -#: builtin/branch.c:822 +#: builtin/branch.c:834 msgid "delete branch (even if not merged)" msgstr "åˆ é™¤åˆ†æ”¯ï¼ˆå³ä½¿æ²¡æœ‰åˆå¹¶ï¼‰" -#: builtin/branch.c:823 +#: builtin/branch.c:835 msgid "move/rename a branch and its reflog" msgstr "移动/é‡å‘½å一个分支,以åŠå®ƒçš„引用日志" -#: builtin/branch.c:824 +#: builtin/branch.c:836 msgid "move/rename a branch, even if target exists" msgstr "移动/é‡å‘½å一个分支,å³ä½¿ç›®æ ‡å·²å˜åœ¨" -#: builtin/branch.c:825 +#: builtin/branch.c:837 msgid "list branch names" msgstr "列出分支å" -#: builtin/branch.c:826 +#: builtin/branch.c:838 msgid "create the branch's reflog" msgstr "创建分支的引用日志" -#: builtin/branch.c:828 +#: builtin/branch.c:840 msgid "edit the description for the branch" msgstr "æ ‡è®°åˆ†æ”¯çš„æè¿°" -#: builtin/branch.c:829 +#: builtin/branch.c:841 msgid "force creation (when already exists)" msgstr "强制创建(当已ç»å˜åœ¨ï¼‰" -#: builtin/branch.c:832 +#: builtin/branch.c:844 msgid "print only not merged branches" msgstr "åªæ‰“å°æ²¡æœ‰åˆå¹¶çš„分支" -#: builtin/branch.c:838 +#: builtin/branch.c:850 msgid "print only merged branches" msgstr "åªæ‰“å°åˆå¹¶çš„分支" -#: builtin/branch.c:842 +#: builtin/branch.c:854 msgid "list branches in columns" msgstr "ä»¥åˆ—çš„æ–¹å¼æ˜¾ç¤ºåˆ†æ”¯" -#: builtin/branch.c:855 +#: builtin/branch.c:867 msgid "Failed to resolve HEAD as a valid ref." msgstr "æ— æ³•å°† HEAD è§£æžä¸ºæœ‰æ•ˆå¼•用。" -#: builtin/branch.c:860 builtin/clone.c:630 +#: builtin/branch.c:872 builtin/clone.c:635 msgid "HEAD not found below refs/heads!" msgstr "HEAD 没有ä½äºŽ /refs/heads 之下ï¼" -#: builtin/branch.c:883 +#: builtin/branch.c:896 msgid "--column and --verbose are incompatible" msgstr "--column å’Œ --verbose ä¸å…¼å®¹" -#: builtin/branch.c:889 builtin/branch.c:928 +#: builtin/branch.c:902 builtin/branch.c:941 msgid "branch name required" msgstr "å¿…é¡»æä¾›åˆ†æ”¯å" -#: builtin/branch.c:904 +#: builtin/branch.c:917 msgid "Cannot give description to detached HEAD" msgstr "ä¸èƒ½å‘分离头指针æä¾›æè¿°" -#: builtin/branch.c:909 +#: builtin/branch.c:922 msgid "cannot edit description of more than one branch" msgstr "ä¸èƒ½ä¸ºä¸€ä¸ªä»¥ä¸Šçš„分支编辑æè¿°" -#: builtin/branch.c:916 +#: builtin/branch.c:929 #, c-format msgid "No commit on branch '%s' yet." msgstr "分支 '%s' å°šæ— æäº¤ã€‚" -#: builtin/branch.c:919 +#: builtin/branch.c:932 #, c-format msgid "No branch named '%s'." msgstr "没有分支 '%s'。" -#: builtin/branch.c:934 +#: builtin/branch.c:947 msgid "too many branches for a rename operation" msgstr "为é‡å‘½åæ“作æä¾›äº†å¤ªå¤šçš„分支å" -#: builtin/branch.c:939 +#: builtin/branch.c:952 msgid "too many branches to set new upstream" msgstr "为设置新上游æä¾›äº†å¤ªå¤šçš„分支å" -#: builtin/branch.c:943 +#: builtin/branch.c:956 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." msgstr "æ— æ³•è®¾ç½® HEAD 的上游为 %sï¼Œå› ä¸º HEAD 没有指å‘任何分支。" -#: builtin/branch.c:946 builtin/branch.c:968 builtin/branch.c:990 +#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002 #, c-format msgid "no such branch '%s'" msgstr "没有æ¤åˆ†æ”¯ '%s'" -#: builtin/branch.c:950 +#: builtin/branch.c:963 #, c-format msgid "branch '%s' does not exist" msgstr "分支 '%s' ä¸å˜åœ¨" -#: builtin/branch.c:962 +#: builtin/branch.c:975 msgid "too many branches to unset upstream" msgstr "ä¸ºå–æ¶ˆä¸Šæ¸¸è®¾ç½®æ“作æä¾›äº†å¤ªå¤šçš„分支å" -#: builtin/branch.c:966 +#: builtin/branch.c:979 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "æ— æ³•å–æ¶ˆ HEAD çš„ä¸Šæ¸¸è®¾ç½®å› ä¸ºå®ƒæ²¡æœ‰æŒ‡å‘一个分支" -#: builtin/branch.c:972 +#: builtin/branch.c:985 #, c-format msgid "Branch '%s' has no upstream information" msgstr "分支 '%s' 没有上游信æ¯" -#: builtin/branch.c:987 +#: builtin/branch.c:999 msgid "it does not make sense to create 'HEAD' manually" msgstr "手工创建 'HEAD' 没有æ„义" -#: builtin/branch.c:993 +#: builtin/branch.c:1005 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "'git branch' çš„ -a å’Œ -r 选项带一个分支å傿•°æ²¡æœ‰æ„义" -#: builtin/branch.c:996 +#: builtin/branch.c:1008 #, c-format msgid "" "The --set-upstream flag is deprecated and will be removed. Consider using --" @@ -2925,7 +3119,7 @@ msgid "" msgstr "" "选项 --set-upstream 已弃用并将被移除。考虑使用 --track 或 --set-upstream-to\n" -#: builtin/branch.c:1013 +#: builtin/branch.c:1025 #, c-format msgid "" "\n" @@ -2936,12 +3130,12 @@ msgstr "" "å¦‚æžœä½ æƒ³ç”¨ '%s' 跟踪 '%s', 这么åšï¼š\n" "\n" -#: builtin/branch.c:1014 +#: builtin/branch.c:1026 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1015 +#: builtin/branch.c:1027 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr " git branch --set-upstream-to %s\n" @@ -2959,43 +3153,43 @@ msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥åˆ›å»ºåŒ…。" msgid "Need a repository to unbundle." msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥è§£åŒ…。" -#: builtin/cat-file.c:285 +#: builtin/cat-file.c:328 msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>" msgstr "git cat-file (-t|-s|-e|-p|<类型>|--textconv) <对象>" -#: builtin/cat-file.c:286 +#: builtin/cat-file.c:329 msgid "git cat-file (--batch|--batch-check) < <list_of_objects>" msgstr "git cat-file (--batch|--batch-check) < <对象列表>" -#: builtin/cat-file.c:323 +#: builtin/cat-file.c:366 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "<类型> å¯ä»¥æ˜¯å…¶ä¸ä¹‹ä¸€ï¼šblobã€treeã€commitã€tag" -#: builtin/cat-file.c:324 +#: builtin/cat-file.c:367 msgid "show object type" msgstr "显示对象类型" -#: builtin/cat-file.c:325 +#: builtin/cat-file.c:368 msgid "show object size" msgstr "显示对象大å°" -#: builtin/cat-file.c:327 +#: builtin/cat-file.c:370 msgid "exit with zero when there's no error" msgstr "当没有错误时退出并返回零" -#: builtin/cat-file.c:328 +#: builtin/cat-file.c:371 msgid "pretty-print object's content" msgstr "美观地打å°å¯¹è±¡çš„内容" -#: builtin/cat-file.c:330 +#: builtin/cat-file.c:373 msgid "for blob objects, run textconv on object's content" msgstr "对于数æ®ï¼ˆblob)对象,对其内容执行 textconv" -#: builtin/cat-file.c:332 +#: builtin/cat-file.c:375 msgid "show info and content of objects fed from the standard input" msgstr "æ˜¾ç¤ºä»Žæ ‡å‡†è¾“å…¥æä¾›çš„对象的信æ¯å’Œå†…容" -#: builtin/cat-file.c:335 +#: builtin/cat-file.c:378 msgid "show info about objects fed from the standard input" msgstr "æ˜¾ç¤ºä»Žæ ‡å‡†è¾“å…¥æä¾›çš„对象的信æ¯" @@ -3020,10 +3214,10 @@ msgid "read file names from stdin" msgstr "ä»Žæ ‡å‡†è¾“å…¥è¯»å‡ºæ–‡ä»¶å" #: builtin/check-attr.c:23 builtin/check-ignore.c:24 -msgid "input paths are terminated by a null character" -msgstr "输入路径以nullå—符终æ¢" +msgid "terminate input and output records by a NUL character" +msgstr "输入和输出的记录使用 NUL å—符终结" -#: builtin/check-ignore.c:18 builtin/checkout.c:1054 builtin/gc.c:177 +#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260 msgid "suppress progress reporting" msgstr "䏿˜¾ç¤ºè¿›åº¦æŠ¥å‘Š" @@ -3031,27 +3225,31 @@ msgstr "䏿˜¾ç¤ºè¿›åº¦æŠ¥å‘Š" msgid "show non-matching input paths" msgstr "显示未匹é…的输入路径" -#: builtin/check-ignore.c:143 +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "检查时忽略索引" + +#: builtin/check-ignore.c:154 msgid "cannot specify pathnames with --stdin" msgstr "ä¸èƒ½åŒæ—¶æä¾›è·¯å¾„åŠ --stdin 傿•°" -#: builtin/check-ignore.c:146 +#: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "-z 需è¦å’Œ --stdin 傿•°å…±ç”¨æ‰æœ‰æ„义" -#: builtin/check-ignore.c:148 +#: builtin/check-ignore.c:159 msgid "no path specified" msgstr "未指定路径" -#: builtin/check-ignore.c:152 +#: builtin/check-ignore.c:163 msgid "--quiet is only valid with a single pathname" msgstr "傿•° --quiet åªåœ¨æä¾›ä¸€ä¸ªè·¯å¾„åæ—¶æœ‰æ•ˆ" -#: builtin/check-ignore.c:154 +#: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "ä¸èƒ½åŒæ—¶æä¾› --quiet å’Œ --verbose 傿•°" -#: builtin/check-ignore.c:157 +#: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "--non-matching 选项åªåœ¨ä½¿ç”¨ --verbose 时有效" @@ -3124,107 +3322,107 @@ msgstr "git checkout [选项] <分支>" msgid "git checkout [options] [<branch>] -- <file>..." msgstr "git checkout [选项] [<分支>] -- <文件>..." -#: builtin/checkout.c:117 builtin/checkout.c:150 +#: builtin/checkout.c:114 builtin/checkout.c:147 #, c-format msgid "path '%s' does not have our version" msgstr "路径 '%s' 没有我们的版本" -#: builtin/checkout.c:119 builtin/checkout.c:152 +#: builtin/checkout.c:116 builtin/checkout.c:149 #, c-format msgid "path '%s' does not have their version" msgstr "路径 '%s' 没有他们的版本" -#: builtin/checkout.c:135 +#: builtin/checkout.c:132 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "路径 '%s' 没有全部必须的版本" -#: builtin/checkout.c:179 +#: builtin/checkout.c:176 #, c-format msgid "path '%s' does not have necessary versions" msgstr "路径 '%s' 没有必须的版本" -#: builtin/checkout.c:196 +#: builtin/checkout.c:193 #, c-format msgid "path '%s': cannot merge" msgstr "path '%s'ï¼šæ— æ³•åˆå¹¶" -#: builtin/checkout.c:213 +#: builtin/checkout.c:210 #, c-format msgid "Unable to add merge result for '%s'" msgstr "æ— æ³•ä¸º '%s' æ·»åŠ åˆå¹¶ç»“æžœ" -#: builtin/checkout.c:237 builtin/checkout.c:240 builtin/checkout.c:243 -#: builtin/checkout.c:246 +#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238 +#: builtin/checkout.c:241 #, c-format msgid "'%s' cannot be used with updating paths" msgstr "'%s' ä¸èƒ½åœ¨æ›´æ–°è·¯å¾„时使用" -#: builtin/checkout.c:249 builtin/checkout.c:252 +#: builtin/checkout.c:244 builtin/checkout.c:247 #, c-format msgid "'%s' cannot be used with %s" msgstr "'%s' ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:255 +#: builtin/checkout.c:250 #, c-format msgid "Cannot update paths and switch to branch '%s' at the same time." msgstr "ä¸èƒ½åŒæ—¶æ›´æ–°è·¯å¾„并切æ¢åˆ°åˆ†æ”¯'%s'。" -#: builtin/checkout.c:266 builtin/checkout.c:458 +#: builtin/checkout.c:261 builtin/checkout.c:451 msgid "corrupt index file" msgstr "æŸå的索引文件" -#: builtin/checkout.c:329 builtin/checkout.c:336 +#: builtin/checkout.c:322 builtin/checkout.c:329 #, c-format msgid "path '%s' is unmerged" msgstr "路径 '%s' 未åˆå¹¶" -#: builtin/checkout.c:480 +#: builtin/checkout.c:473 msgid "you need to resolve your current index first" msgstr "您需è¦å…ˆè§£å†³å½“å‰ç´¢å¼•的冲çª" -#: builtin/checkout.c:601 +#: builtin/checkout.c:594 #, c-format msgid "Can not do reflog for '%s'\n" msgstr "ä¸èƒ½å¯¹ '%s' 执行 reflog æ“作\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:632 msgid "HEAD is now at" msgstr "HEAD ç›®å‰ä½äºŽ" -#: builtin/checkout.c:646 +#: builtin/checkout.c:639 #, c-format msgid "Reset branch '%s'\n" msgstr "é‡ç½®åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:649 +#: builtin/checkout.c:642 #, c-format msgid "Already on '%s'\n" msgstr "å·²ç»ä½äºŽ '%s'\n" -#: builtin/checkout.c:653 +#: builtin/checkout.c:646 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "切æ¢å¹¶é‡ç½®åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:655 builtin/checkout.c:997 +#: builtin/checkout.c:648 builtin/checkout.c:1033 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "切æ¢åˆ°ä¸€ä¸ªæ–°åˆ†æ”¯ '%s'\n" -#: builtin/checkout.c:657 +#: builtin/checkout.c:650 #, c-format msgid "Switched to branch '%s'\n" msgstr "切æ¢åˆ°åˆ†æ”¯ '%s'\n" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/checkout.c:713 +#: builtin/checkout.c:706 #, c-format msgid " ... and %d more.\n" msgstr " ... åŠå…¶å®ƒ %d 个。\n" #. The singular version -#: builtin/checkout.c:719 +#: builtin/checkout.c:712 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3245,7 +3443,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:737 +#: builtin/checkout.c:730 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -3260,136 +3458,140 @@ msgstr "" " git branch new_branch_name %s\n" "\n" -#: builtin/checkout.c:767 +#: builtin/checkout.c:760 msgid "internal error in revision walk" msgstr "在版本é历时é‡åˆ°å†…部错误" -#: builtin/checkout.c:771 +#: builtin/checkout.c:764 msgid "Previous HEAD position was" msgstr "之å‰çš„ HEAD ä½ç½®æ˜¯" -#: builtin/checkout.c:798 builtin/checkout.c:992 +#: builtin/checkout.c:791 builtin/checkout.c:1028 msgid "You are on a branch yet to be born" msgstr "您ä½äºŽä¸€ä¸ªå°šæœªåˆå§‹åŒ–的分支" -#. case (1) -#: builtin/checkout.c:928 +#: builtin/checkout.c:935 +#, c-format +msgid "only one reference expected, %d given." +msgstr "åªè¦ä¸€ä¸ªå¼•用,å´ç»™å‡ºäº† %d 个" + +#: builtin/checkout.c:974 #, c-format msgid "invalid reference: %s" msgstr "æ— æ•ˆå¼•ç”¨ï¼š%s" #. case (1): want a tree -#: builtin/checkout.c:967 +#: builtin/checkout.c:1003 #, c-format msgid "reference is not a tree: %s" msgstr "å¼•ç”¨ä¸æ˜¯ä¸€ä¸ªæ ‘:%s" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1042 msgid "paths cannot be used with switching branches" msgstr "路径ä¸èƒ½å’Œåˆ‡æ¢åˆ†æ”¯åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:1009 builtin/checkout.c:1013 +#: builtin/checkout.c:1045 builtin/checkout.c:1049 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "'%s' ä¸èƒ½å’Œåˆ‡æ¢åˆ†æ”¯åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:1017 builtin/checkout.c:1020 builtin/checkout.c:1025 -#: builtin/checkout.c:1028 +#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061 +#: builtin/checkout.c:1064 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "'%s' ä¸èƒ½å’Œ '%s' åŒæ—¶ä½¿ç”¨" -#: builtin/checkout.c:1033 +#: builtin/checkout.c:1069 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "ä¸èƒ½åˆ‡æ¢åˆ†æ”¯åˆ°ä¸€ä¸ªéžæäº¤ '%s'" -#: builtin/checkout.c:1055 builtin/checkout.c:1057 builtin/clone.c:89 -#: builtin/remote.c:169 builtin/remote.c:171 +#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88 +#: builtin/remote.c:159 builtin/remote.c:161 msgid "branch" msgstr "分支" -#: builtin/checkout.c:1056 +#: builtin/checkout.c:1092 msgid "create and checkout a new branch" msgstr "创建并检出一个新的分支" -#: builtin/checkout.c:1058 +#: builtin/checkout.c:1094 msgid "create/reset and checkout a branch" msgstr "创建/é‡ç½®å¹¶æ£€å‡ºä¸€ä¸ªåˆ†æ”¯" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1095 msgid "create reflog for new branch" msgstr "为新的分支创建引用日志" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1096 msgid "detach the HEAD at named commit" msgstr "æˆä¸ºæŒ‡å‘该æäº¤çš„分离头指针" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1097 msgid "set upstream info for new branch" msgstr "为新的分支设置上游信æ¯" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new branch" msgstr "新分支" -#: builtin/checkout.c:1063 +#: builtin/checkout.c:1099 msgid "new unparented branch" msgstr "新的没有父æäº¤çš„分支" -#: builtin/checkout.c:1064 +#: builtin/checkout.c:1100 msgid "checkout our version for unmerged files" msgstr "对尚未åˆå¹¶çš„æ–‡ä»¶æ£€å‡ºæˆ‘们的版本" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1102 msgid "checkout their version for unmerged files" msgstr "对尚未åˆå¹¶çš„æ–‡ä»¶æ£€å‡ºä»–们的版本" -#: builtin/checkout.c:1068 +#: builtin/checkout.c:1104 msgid "force checkout (throw away local modifications)" msgstr "强制检出(丢弃本地修改)" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1105 msgid "perform a 3-way merge with the new branch" msgstr "和新的分支执行三路åˆå¹¶" -#: builtin/checkout.c:1070 builtin/merge.c:232 +#: builtin/checkout.c:1106 builtin/merge.c:225 msgid "update ignored files (default)" msgstr "更新忽略的文件(默认)" -#: builtin/checkout.c:1071 builtin/log.c:1208 parse-options.h:249 +#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248 msgid "style" msgstr "é£Žæ ¼" -#: builtin/checkout.c:1072 +#: builtin/checkout.c:1108 msgid "conflict style (merge or diff3)" msgstr "冲çªè¾“å‡ºé£Žæ ¼ï¼ˆmerge 或 diff3)" -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1111 msgid "do not limit pathspecs to sparse entries only" msgstr "对路径ä¸åšç¨€ç–检出的é™åˆ¶" -#: builtin/checkout.c:1077 +#: builtin/checkout.c:1113 msgid "second guess 'git checkout no-such-branch'" msgstr "å†è€…猜测'git checkout no-such-branch'" -#: builtin/checkout.c:1101 +#: builtin/checkout.c:1136 msgid "-b, -B and --orphan are mutually exclusive" msgstr "-bã€-B å’Œ --orphan 是互斥的" -#: builtin/checkout.c:1118 +#: builtin/checkout.c:1153 msgid "--track needs a branch name" msgstr "--track 需è¦ä¸€ä¸ªåˆ†æ”¯å" -#: builtin/checkout.c:1125 +#: builtin/checkout.c:1160 msgid "Missing branch name; try -b" msgstr "缺少分支åï¼›å°è¯• -b" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1197 msgid "invalid path specification" msgstr "æ— æ•ˆçš„è·¯å¾„è§„æ ¼" -#: builtin/checkout.c:1167 +#: builtin/checkout.c:1204 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3398,50 +3600,50 @@ msgstr "" "ä¸èƒ½åŒæ—¶æ›´æ–°è·¯å¾„并切æ¢åˆ°åˆ†æ”¯'%s'。\n" "æ‚¨æ˜¯æƒ³è¦æ£€å‡º '%s' 但其未能解æžä¸ºæäº¤ä¹ˆï¼Ÿ" -#: builtin/checkout.c:1172 +#: builtin/checkout.c:1209 #, c-format msgid "git checkout: --detach does not take a path argument '%s'" msgstr "git checkout:--detach ä¸èƒ½æŽ¥æ”¶è·¯å¾„傿•° '%s'" -#: builtin/checkout.c:1176 +#: builtin/checkout.c:1213 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/clean.c:25 +#: builtin/clean.c:26 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." msgstr "" "git clean [-d] [-f] [-i] [-n] [-q] [-e <模å¼>] [-x | -X] [--] <路径>..." -#: builtin/clean.c:29 +#: builtin/clean.c:30 #, c-format msgid "Removing %s\n" msgstr "æ£åˆ 除 %s\n" -#: builtin/clean.c:30 +#: builtin/clean.c:31 #, c-format msgid "Would remove %s\n" msgstr "å°†åˆ é™¤ %s\n" -#: builtin/clean.c:31 +#: builtin/clean.c:32 #, c-format msgid "Skipping repository %s\n" msgstr "忽略版本库 %s\n" -#: builtin/clean.c:32 +#: builtin/clean.c:33 #, c-format msgid "Would skip repository %s\n" msgstr "将忽略版本库 %s\n" -#: builtin/clean.c:33 +#: builtin/clean.c:34 #, c-format msgid "failed to remove %s" msgstr "æ— æ³•åˆ é™¤ %s" -#: builtin/clean.c:293 +#: builtin/clean.c:294 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -3453,7 +3655,7 @@ msgstr "" "foo - é€šè¿‡æ ‡é¢˜é€‰æ‹©ä¸€ä¸ªé€‰é¡¹\n" " - (空)什么也ä¸é€‰æ‹©" -#: builtin/clean.c:297 +#: builtin/clean.c:298 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -3473,35 +3675,35 @@ msgstr "" "* - 选择所有选项\n" " - (空)结æŸé€‰æ‹©" -#: builtin/clean.c:515 +#: builtin/clean.c:516 #, c-format msgid "Huh (%s)?" msgstr "嗯(%s)?" -#: builtin/clean.c:658 +#: builtin/clean.c:659 #, c-format msgid "Input ignore patterns>> " msgstr "输入模版以排除æ¡ç›®>> " -#: builtin/clean.c:695 +#: builtin/clean.c:696 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "è¦å‘Šï¼šæ— 法找到和 %s 匹é…çš„æ¡ç›®" -#: builtin/clean.c:716 +#: builtin/clean.c:717 msgid "Select items to delete" msgstr "选择è¦åˆ 除的æ¡ç›®" -#: builtin/clean.c:756 +#: builtin/clean.c:757 #, c-format msgid "remove %s? " msgstr "åˆ é™¤ %s?" -#: builtin/clean.c:781 +#: builtin/clean.c:782 msgid "Bye." msgstr "å†è§ã€‚" -#: builtin/clean.c:789 +#: builtin/clean.c:790 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -3519,21 +3721,21 @@ msgstr "" "help - 显示本帮助\n" "? - 显示如何在æç¤ºç¬¦ä¸‹é€‰æ‹©çš„帮助" -#: builtin/clean.c:816 +#: builtin/clean.c:817 msgid "*** Commands ***" msgstr "*** 命令 ***" -#: builtin/clean.c:817 +#: builtin/clean.c:818 msgid "What now" msgstr "请选择" -#: builtin/clean.c:825 +#: builtin/clean.c:826 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "å°†åˆ é™¤å¦‚ä¸‹æ¡ç›®ï¼š" msgstr[1] "å°†åˆ é™¤å¦‚ä¸‹æ¡ç›®ï¼š" -#: builtin/clean.c:842 +#: builtin/clean.c:843 msgid "No more files to clean, exiting." msgstr "æ²¡æœ‰è¦æ¸…ç†çš„æ–‡ä»¶ï¼Œé€€å‡ºã€‚" @@ -3553,8 +3755,8 @@ msgstr "äº¤äº’å¼æ¸…除" msgid "remove whole directories" msgstr "åˆ é™¤æ•´ä¸ªç›®å½•" -#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:716 -#: builtin/ls-files.c:493 builtin/name-rev.c:315 builtin/show-ref.c:186 +#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718 +#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185 msgid "pattern" msgstr "模å¼" @@ -3592,8 +3794,8 @@ msgstr "" msgid "git clone [options] [--] <repo> [<dir>]" msgstr "git clone [选项] [--] <版本库> [<路径>]" -#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:229 -#: builtin/push.c:462 +#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222 +#: builtin/push.c:521 msgid "force progress reporting" msgstr "强制显示进度报告" @@ -3605,123 +3807,133 @@ msgstr "ä¸åˆ›å»ºä¸€ä¸ªæ£€å‡º" msgid "create a bare repository" msgstr "创建一个裸版本库" -#: builtin/clone.c:72 +#: builtin/clone.c:71 msgid "create a mirror repository (implies bare)" msgstr "创建一个镜åƒç‰ˆæœ¬åº“(也是裸版本库)" -#: builtin/clone.c:74 +#: builtin/clone.c:73 msgid "to clone from a local repository" msgstr "从本地版本库克隆" -#: builtin/clone.c:76 +#: builtin/clone.c:75 msgid "don't use local hardlinks, always copy" msgstr "ä¸ä½¿ç”¨æœ¬åœ°ç¡¬é“¾æŽ¥ï¼Œå§‹ç»ˆå¤åˆ¶" -#: builtin/clone.c:78 +#: builtin/clone.c:77 msgid "setup as shared repository" msgstr "设置为共享版本库" -#: builtin/clone.c:80 builtin/clone.c:82 +#: builtin/clone.c:79 builtin/clone.c:81 msgid "initialize submodules in the clone" msgstr "在克隆时åˆå§‹åŒ–忍¡ç»„" -#: builtin/clone.c:83 builtin/init-db.c:485 +#: builtin/clone.c:82 builtin/init-db.c:485 msgid "template-directory" msgstr "模æ¿ç›®å½•" -#: builtin/clone.c:84 builtin/init-db.c:486 +#: builtin/clone.c:83 builtin/init-db.c:486 msgid "directory from which templates will be used" msgstr "模æ¿ç›®å½•将被使用" -#: builtin/clone.c:86 +#: builtin/clone.c:85 msgid "reference repository" -msgstr "引用版本库" +msgstr "å‚考版本库" -#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44 +#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44 msgid "name" msgstr "åç§°" -#: builtin/clone.c:88 +#: builtin/clone.c:87 msgid "use <name> instead of 'origin' to track upstream" msgstr "使用<åç§°>è€Œä¸æ˜¯ 'origin' 去跟踪上游" -#: builtin/clone.c:90 +#: builtin/clone.c:89 msgid "checkout <branch> instead of the remote's HEAD" msgstr "检出<分支>è€Œä¸æ˜¯è¿œç¨‹HEAD" -#: builtin/clone.c:92 +#: builtin/clone.c:91 msgid "path to git-upload-pack on the remote" msgstr "远程 git-upload-pack 路径" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:661 +#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663 msgid "depth" msgstr "深度" -#: builtin/clone.c:94 +#: builtin/clone.c:93 msgid "create a shallow clone of that depth" msgstr "创建一个指定深度的浅克隆" -#: builtin/clone.c:96 +#: builtin/clone.c:95 msgid "clone only one branch, HEAD or --branch" msgstr "åªå…‹éš†ä¸€ä¸ªåˆ†æ”¯ã€HEAD 或 --branch" -#: builtin/clone.c:97 builtin/init-db.c:494 +#: builtin/clone.c:96 builtin/init-db.c:494 msgid "gitdir" msgstr "git目录" -#: builtin/clone.c:98 builtin/init-db.c:495 +#: builtin/clone.c:97 builtin/init-db.c:495 msgid "separate git dir from working tree" msgstr "git目录和工作区分离" -#: builtin/clone.c:99 +#: builtin/clone.c:98 msgid "key=value" msgstr "key=value" -#: builtin/clone.c:100 +#: builtin/clone.c:99 msgid "set config inside the new repository" msgstr "在新版本库ä¸è®¾ç½®é…置信æ¯" -#: builtin/clone.c:253 +#: builtin/clone.c:252 #, c-format msgid "reference repository '%s' is not a local repository." -msgstr "引用版本库 '%s' 䏿˜¯ä¸€ä¸ªæœ¬åœ°ç‰ˆæœ¬åº“。" +msgstr "å‚考版本库 '%s' 䏿˜¯ä¸€ä¸ªæœ¬åœ°ç‰ˆæœ¬åº“。" + +#: builtin/clone.c:256 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "å‚考版本库 '%s' 是一个浅克隆" -#: builtin/clone.c:316 +#: builtin/clone.c:259 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "å‚考版本库 '%s' å·²è¢«å«æŽ¥" + +#: builtin/clone.c:321 #, c-format msgid "failed to create directory '%s'" msgstr "æ— æ³•åˆ›å»ºç›®å½• '%s'" -#: builtin/clone.c:318 builtin/diff.c:77 +#: builtin/clone.c:323 builtin/diff.c:83 #, c-format msgid "failed to stat '%s'" msgstr "æ— æ³•æžšä¸¾ '%s' 状æ€" -#: builtin/clone.c:320 +#: builtin/clone.c:325 #, c-format msgid "%s exists and is not a directory" msgstr "%s å˜åœ¨ä¸”䏿˜¯ä¸€ä¸ªç›®å½•" -#: builtin/clone.c:334 +#: builtin/clone.c:339 #, c-format msgid "failed to stat %s\n" msgstr "æ— æ³•æžšä¸¾ %s 状æ€\n" -#: builtin/clone.c:356 +#: builtin/clone.c:361 #, c-format msgid "failed to create link '%s'" msgstr "æ— æ³•åˆ›å»ºé“¾æŽ¥ '%s'" -#: builtin/clone.c:360 +#: builtin/clone.c:365 #, c-format msgid "failed to copy file to '%s'" msgstr "æ— æ³•æ‹·è´æ–‡ä»¶è‡³ '%s'" -#: builtin/clone.c:383 +#: builtin/clone.c:388 builtin/clone.c:565 #, c-format msgid "done.\n" msgstr "完æˆã€‚\n" -#: builtin/clone.c:396 +#: builtin/clone.c:401 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -3731,104 +3943,108 @@ msgstr "" "您å¯ä»¥é€šè¿‡ 'git status' 检查哪些已被检出,然åŽä½¿ç”¨å‘½ä»¤\n" "'git checkout -f HEAD' é‡è¯•\n" -#: builtin/clone.c:475 +#: builtin/clone.c:480 #, c-format msgid "Could not find remote branch %s to clone." msgstr "ä¸èƒ½å‘现è¦å…‹éš†çš„远程分支 %s。" -#: builtin/clone.c:555 +#: builtin/clone.c:560 #, c-format msgid "Checking connectivity... " msgstr "检查连接... " -#: builtin/clone.c:558 +#: builtin/clone.c:563 msgid "remote did not send all necessary objects" msgstr "远程没有å‘逿‰€æœ‰å¿…须的对象" -#: builtin/clone.c:560 -#, c-format -msgid "done\n" -msgstr "完æˆ\n" - -#: builtin/clone.c:621 +#: builtin/clone.c:626 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "远程 HEAD 指å‘一个ä¸å˜åœ¨çš„å¼•ç”¨ï¼Œæ— æ³•æ£€å‡ºã€‚\n" -#: builtin/clone.c:652 +#: builtin/clone.c:657 msgid "unable to checkout working tree" msgstr "ä¸èƒ½æ£€å‡ºå·¥ä½œåŒº" -#: builtin/clone.c:760 +#: builtin/clone.c:765 msgid "Too many arguments." msgstr "å¤ªå¤šå‚æ•°ã€‚" -#: builtin/clone.c:764 +#: builtin/clone.c:769 msgid "You must specify a repository to clone." msgstr "您必须指定一个版本库æ¥å…‹éš†ã€‚" -#: builtin/clone.c:775 +#: builtin/clone.c:780 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "--bare å’Œ --origin %s 选项ä¸å…¼å®¹ã€‚" -#: builtin/clone.c:778 +#: builtin/clone.c:783 msgid "--bare and --separate-git-dir are incompatible." msgstr "--bare å’Œ --separate-git-dir 选项ä¸å…¼å®¹ã€‚" -#: builtin/clone.c:791 +#: builtin/clone.c:796 #, c-format msgid "repository '%s' does not exist" msgstr "版本库 '%s' ä¸å˜åœ¨" -#: builtin/clone.c:796 +#: builtin/clone.c:802 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth 在本地克隆被忽略,改为 file:// å议试试。" -#: builtin/clone.c:798 +#: builtin/clone.c:805 +msgid "source repository is shallow, ignoring --local" +msgstr "æºç‰ˆæœ¬åº“是浅克隆,忽略 --local" + +#: builtin/clone.c:810 msgid "--local is ignored" msgstr "--local 被忽略" -#: builtin/clone.c:808 +#: builtin/clone.c:814 builtin/fetch.c:1119 +#, c-format +msgid "depth %s is not a positive number" +msgstr "深度 %s 䏿˜¯ä¸€ä¸ªæ£æ•°" + +#: builtin/clone.c:824 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "ç›®æ ‡è·¯å¾„ '%s' å·²ç»å˜åœ¨ï¼Œå¹¶ä¸”䏿˜¯ä¸€ä¸ªç©ºç›®å½•。" -#: builtin/clone.c:818 +#: builtin/clone.c:834 #, c-format msgid "working tree '%s' already exists." msgstr "工作区 '%s' å·²ç»å˜åœ¨ã€‚" -#: builtin/clone.c:831 builtin/clone.c:843 +#: builtin/clone.c:847 builtin/clone.c:859 #, c-format msgid "could not create leading directories of '%s'" msgstr "ä¸èƒ½ä¸º '%s' 创建先导目录" -#: builtin/clone.c:834 +#: builtin/clone.c:850 #, c-format msgid "could not create work tree dir '%s'." msgstr "ä¸èƒ½ä¸º '%s' 创建工作区目录。" -#: builtin/clone.c:853 +#: builtin/clone.c:869 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "克隆到裸版本库 '%s'...\n" -#: builtin/clone.c:855 +#: builtin/clone.c:871 #, c-format msgid "Cloning into '%s'...\n" msgstr "æ£å…‹éš†åˆ° '%s'...\n" -#: builtin/clone.c:890 +#: builtin/clone.c:906 #, c-format msgid "Don't know how to clone %s" msgstr "ä¸çŸ¥é“如何克隆 %s" -#: builtin/clone.c:942 +#: builtin/clone.c:957 builtin/clone.c:965 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "远程分支 %s 在上游 %s 未å‘现" -#: builtin/clone.c:949 +#: builtin/clone.c:968 msgid "You appear to have cloned an empty repository." msgstr "您似乎克隆了一个空版本库。" @@ -3864,15 +4080,15 @@ msgstr "两列之间的填充空间" msgid "--command must be the first argument" msgstr "--command å¿…é¡»æ˜¯ç¬¬ä¸€ä¸ªå‚æ•°" -#: builtin/commit.c:35 +#: builtin/commit.c:36 msgid "git commit [options] [--] <pathspec>..." -msgstr "git commit [选项] [--] <路径匹é…>..." +msgstr "git commit [选项] [--] <路径规则>..." -#: builtin/commit.c:40 +#: builtin/commit.c:41 msgid "git status [options] [--] <pathspec>..." -msgstr "git status [选项] [--] <路径匹é…>..." +msgstr "git status [选项] [--] <路径规则>..." -#: builtin/commit.c:45 +#: builtin/commit.c:46 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3895,7 +4111,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:57 +#: builtin/commit.c:58 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" @@ -3904,7 +4120,7 @@ msgstr "" "您è¦ä¿®è¡¥æœ€è¿‘çš„æäº¤ï¼Œä½†è¿™ä¹ˆåšä¼šè®©å®ƒæˆä¸ºç©ºæäº¤ã€‚您å¯ä»¥é‡å¤æ‚¨çš„命令并带上\n" "--allow-empty 选项,或者您å¯ç”¨å‘½ä»¤ \"git reset HEAD^\" æ•´ä¸ªåˆ é™¤è¯¥æäº¤ã€‚\n" -#: builtin/commit.c:62 +#: builtin/commit.c:63 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3918,11 +4134,11 @@ msgstr "" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:69 +#: builtin/commit.c:70 msgid "Otherwise, please use 'git reset'\n" msgstr "å¦åˆ™ï¼Œè¯·ä½¿ç”¨å‘½ä»¤ 'git reset'\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -3938,93 +4154,93 @@ msgstr "" "ç„¶åŽæ‰§è¡Œ \"git cherry-pick --continue\" ç»§ç»å¯¹å…¶ä½™æäº¤æ‰§è¡Œæ‹£é€‰\n" "æ“作。\n" -#: builtin/commit.c:279 +#: builtin/commit.c:287 msgid "failed to unpack HEAD tree object" msgstr "æ— æ³•è§£åŒ… HEAD æ ‘å¯¹è±¡" -#: builtin/commit.c:321 +#: builtin/commit.c:329 msgid "unable to create temporary index" msgstr "ä¸èƒ½åˆ›å»ºä¸´æ—¶ç´¢å¼•" -#: builtin/commit.c:327 +#: builtin/commit.c:335 msgid "interactive add failed" msgstr "äº¤äº’å¼æ·»åŠ å¤±è´¥" -#: builtin/commit.c:360 builtin/commit.c:381 builtin/commit.c:431 +#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439 msgid "unable to write new_index file" msgstr "æ— æ³•å†™ new_index 文件" -#: builtin/commit.c:412 +#: builtin/commit.c:420 msgid "cannot do a partial commit during a merge." msgstr "在åˆå¹¶è¿‡ç¨‹ä¸ä¸èƒ½åšéƒ¨åˆ†æäº¤ã€‚" -#: builtin/commit.c:414 +#: builtin/commit.c:422 msgid "cannot do a partial commit during a cherry-pick." msgstr "在拣选过程ä¸ä¸èƒ½åšéƒ¨åˆ†æäº¤ã€‚" -#: builtin/commit.c:424 +#: builtin/commit.c:432 msgid "cannot read the index" msgstr "æ— æ³•è¯»å–索引" -#: builtin/commit.c:444 +#: builtin/commit.c:452 msgid "unable to write temporary index file" msgstr "æ— æ³•å†™ä¸´æ—¶ç´¢å¼•æ–‡ä»¶" -#: builtin/commit.c:535 builtin/commit.c:541 +#: builtin/commit.c:543 builtin/commit.c:549 #, c-format msgid "invalid commit: %s" msgstr "æ— æ•ˆçš„æäº¤ï¼š%s" -#: builtin/commit.c:563 +#: builtin/commit.c:571 msgid "malformed --author parameter" msgstr "éžæ³•çš„ --author 傿•°" -#: builtin/commit.c:583 +#: builtin/commit.c:591 #, c-format msgid "Malformed ident string: '%s'" msgstr "éžæ³•的身份å—符串:'%s'" -#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:982 +#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007 #, c-format msgid "could not lookup commit %s" msgstr "ä¸èƒ½æŸ¥è¯¢æäº¤ %s" -#: builtin/commit.c:633 builtin/shortlog.c:271 +#: builtin/commit.c:642 builtin/shortlog.c:273 #, c-format msgid "(reading log message from standard input)\n" msgstr "(æ£ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯ï¼‰\n" -#: builtin/commit.c:635 +#: builtin/commit.c:644 msgid "could not read log from standard input" msgstr "ä¸èƒ½ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–日志信æ¯" -#: builtin/commit.c:639 +#: builtin/commit.c:648 #, c-format msgid "could not read log file '%s'" msgstr "ä¸èƒ½è¯»å–日志文件 '%s'" -#: builtin/commit.c:645 +#: builtin/commit.c:654 msgid "commit has empty message" msgstr "æäº¤è¯´æ˜Žä¸ºç©º" -#: builtin/commit.c:661 +#: builtin/commit.c:670 msgid "could not read MERGE_MSG" msgstr "ä¸èƒ½è¯»å– MERGE_MSG" -#: builtin/commit.c:665 +#: builtin/commit.c:674 msgid "could not read SQUASH_MSG" msgstr "ä¸èƒ½è¯»å– SQUASH_MSG" -#: builtin/commit.c:669 +#: builtin/commit.c:678 #, c-format msgid "could not read '%s'" msgstr "ä¸èƒ½è¯»å– '%s'" -#: builtin/commit.c:730 +#: builtin/commit.c:749 msgid "could not write commit template" msgstr "ä¸èƒ½å†™æäº¤æ¨¡ç‰ˆ" -#: builtin/commit.c:741 +#: builtin/commit.c:760 #, c-format msgid "" "\n" @@ -4038,7 +4254,7 @@ msgstr "" "\t%s\n" "ç„¶åŽé‡è¯•。\n" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "" "\n" @@ -4052,7 +4268,7 @@ msgstr "" "\t%s\n" "ç„¶åŽé‡è¯•。\n" -#: builtin/commit.c:758 +#: builtin/commit.c:777 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4061,7 +4277,7 @@ msgstr "" "è¯·ä¸ºæ‚¨çš„å˜æ›´è¾“å…¥æäº¤è¯´æ˜Žã€‚以 '%c' 开始的行将被忽略,而一个空的æäº¤\n" "è¯´æ˜Žå°†ä¼šç»ˆæ¢æäº¤ã€‚\n" -#: builtin/commit.c:763 +#: builtin/commit.c:782 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -4072,355 +4288,355 @@ msgstr "" "也å¯ä»¥åˆ 除它们。一个空的æäº¤è¯´æ˜Žå°†ä¼šç»ˆæ¢æäº¤ã€‚\n" # 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: builtin/commit.c:776 +#: builtin/commit.c:795 #, c-format msgid "%sAuthor: %s" msgstr "%s作者: %s" # 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ -#: builtin/commit.c:783 +#: builtin/commit.c:802 #, c-format msgid "%sCommitter: %s" msgstr "%sæäº¤è€…: %s" -#: builtin/commit.c:803 +#: builtin/commit.c:822 msgid "Cannot read index" msgstr "æ— æ³•è¯»å–索引" -#: builtin/commit.c:845 +#: builtin/commit.c:865 msgid "Error building trees" msgstr "æ— æ³•åˆ›å»ºæ ‘å¯¹è±¡" -#: builtin/commit.c:860 builtin/tag.c:359 +#: builtin/commit.c:880 builtin/tag.c:359 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "请使用 -m 或 -F 选项æä¾›æäº¤è¯´æ˜Žã€‚\n" -#: builtin/commit.c:957 +#: builtin/commit.c:982 #, c-format msgid "No existing author found with '%s'" msgstr "æ²¡æœ‰æ‰¾åˆ°åŒ¹é… '%s' 的作者" -#: builtin/commit.c:972 builtin/commit.c:1208 +#: builtin/commit.c:997 builtin/commit.c:1237 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "æ— æ•ˆçš„æœªè¿½è¸ªæ–‡ä»¶å‚æ•° '%s'" -#: builtin/commit.c:1009 +#: builtin/commit.c:1034 msgid "--long and -z are incompatible" msgstr "--long å’Œ -z 选项ä¸å…¼å®¹" -#: builtin/commit.c:1039 +#: builtin/commit.c:1064 msgid "Using both --reset-author and --author does not make sense" msgstr "åŒæ—¶ä½¿ç”¨ --reset-author å’Œ --author 没有æ„义" -#: builtin/commit.c:1050 +#: builtin/commit.c:1075 msgid "You have nothing to amend." msgstr "您没有å¯ä¿®è¡¥çš„æäº¤ã€‚" -#: builtin/commit.c:1053 +#: builtin/commit.c:1078 msgid "You are in the middle of a merge -- cannot amend." msgstr "您æ£å¤„于一个åˆå¹¶è¿‡ç¨‹ä¸ -- æ— æ³•ä¿®è¡¥æäº¤ã€‚" -#: builtin/commit.c:1055 +#: builtin/commit.c:1080 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "您æ£å¤„äºŽä¸€ä¸ªæ‹£é€‰è¿‡ç¨‹ä¸ -- æ— æ³•ä¿®è¡¥æäº¤ã€‚" -#: builtin/commit.c:1058 +#: builtin/commit.c:1083 msgid "Options --squash and --fixup cannot be used together" msgstr "选项 --squash å’Œ --fixup ä¸èƒ½åŒæ—¶ä½¿ç”¨" -#: builtin/commit.c:1068 +#: builtin/commit.c:1093 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "åªèƒ½ç”¨ä¸€ä¸ª -c/-C/-F/--fixup 选项。" -#: builtin/commit.c:1070 +#: builtin/commit.c:1095 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "选项 -m ä¸èƒ½å’Œ -c/-C/-F/--fixup åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/commit.c:1078 +#: builtin/commit.c:1103 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author åªèƒ½å’Œ -Cã€-c 或 --amend åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/commit.c:1095 +#: builtin/commit.c:1120 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "åªèƒ½ç”¨ä¸€ä¸ª --include/--only/--all/--interactive/--patch 选项。" -#: builtin/commit.c:1097 +#: builtin/commit.c:1122 msgid "No paths with --include/--only does not make sense." msgstr "傿•° --include/--only ä¸è·Ÿè·¯å¾„没有æ„义。" -#: builtin/commit.c:1099 +#: builtin/commit.c:1124 msgid "Clever... amending the last one with dirty index." msgstr "èªæ˜Ž... 在索引ä¸å¹²å‡€ä¸‹ä¿®è¡¥æœ€åŽçš„æäº¤ã€‚" -#: builtin/commit.c:1101 +#: builtin/commit.c:1126 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "指定了明确的路径而没有使用 -i 或 -o 选项;认为是 --only paths..." -#: builtin/commit.c:1111 builtin/tag.c:575 +#: builtin/commit.c:1136 builtin/tag.c:572 #, c-format msgid "Invalid cleanup mode %s" msgstr "æ— æ•ˆçš„æ¸…ç†æ¨¡å¼ %s" -#: builtin/commit.c:1116 +#: builtin/commit.c:1141 msgid "Paths with -a does not make sense." msgstr "路径和 -a é€‰é¡¹åŒæ—¶ä½¿ç”¨æ²¡æœ‰æ„义。" -#: builtin/commit.c:1222 builtin/commit.c:1455 +#: builtin/commit.c:1251 builtin/commit.c:1482 msgid "show status concisely" msgstr "以简æ´çš„æ ¼å¼æ˜¾ç¤ºçжæ€" -#: builtin/commit.c:1224 builtin/commit.c:1457 +#: builtin/commit.c:1253 builtin/commit.c:1484 msgid "show branch information" msgstr "显示分支信æ¯" -#: builtin/commit.c:1226 builtin/commit.c:1459 builtin/push.c:452 +#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507 msgid "machine-readable output" msgstr "机器å¯è¯»çš„输出" -#: builtin/commit.c:1229 builtin/commit.c:1461 +#: builtin/commit.c:1258 builtin/commit.c:1488 msgid "show status in long format (default)" msgstr "ä»¥é•¿æ ¼å¼æ˜¾ç¤ºçжæ€ï¼ˆé»˜è®¤ï¼‰" -#: builtin/commit.c:1232 builtin/commit.c:1464 +#: builtin/commit.c:1261 builtin/commit.c:1491 msgid "terminate entries with NUL" msgstr "æ¡ç›®ä»¥NULå—符结尾" -#: builtin/commit.c:1234 builtin/commit.c:1467 builtin/fast-export.c:667 -#: builtin/fast-export.c:670 builtin/tag.c:459 +#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674 +#: builtin/fast-export.c:677 builtin/tag.c:459 msgid "mode" msgstr "模å¼" -#: builtin/commit.c:1235 builtin/commit.c:1467 +#: builtin/commit.c:1264 builtin/commit.c:1494 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "显示未跟踪的文件,“模å¼â€çš„å¯é€‰å‚数:allã€normalã€no。(默认:all)" -#: builtin/commit.c:1238 +#: builtin/commit.c:1267 msgid "show ignored files" msgstr "显示忽略的文件" -#: builtin/commit.c:1239 parse-options.h:154 +#: builtin/commit.c:1268 parse-options.h:156 msgid "when" msgstr "何时" -#: builtin/commit.c:1240 +#: builtin/commit.c:1269 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" msgstr "" "å¿½ç•¥åæ¨¡ç»„的更改,“何时â€çš„å¯é€‰å‚数:allã€dirtyã€untracked。(默认:all)" -#: builtin/commit.c:1242 +#: builtin/commit.c:1271 msgid "list untracked files in columns" msgstr "ä»¥åˆ—çš„æ–¹å¼æ˜¾ç¤ºæœªè·Ÿè¸ªçš„æ–‡ä»¶" -#: builtin/commit.c:1313 +#: builtin/commit.c:1340 msgid "couldn't look up newly created commit" msgstr "æ— æ³•æ‰¾åˆ°æ–°åˆ›å»ºçš„æäº¤" -#: builtin/commit.c:1315 +#: builtin/commit.c:1342 msgid "could not parse newly created commit" msgstr "ä¸èƒ½è§£æžæ–°åˆ›å»ºçš„æäº¤" -#: builtin/commit.c:1356 +#: builtin/commit.c:1383 msgid "detached HEAD" msgstr "分离头指针" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: builtin/commit.c:1358 +#: builtin/commit.c:1385 msgid " (root-commit)" msgstr "ï¼ˆæ ¹æäº¤ï¼‰" -#: builtin/commit.c:1425 +#: builtin/commit.c:1452 msgid "suppress summary after successful commit" msgstr "æäº¤æˆåŠŸåŽä¸æ˜¾ç¤ºæ¦‚è¿°ä¿¡æ¯" -#: builtin/commit.c:1426 +#: builtin/commit.c:1453 msgid "show diff in commit message template" msgstr "在æäº¤è¯´æ˜Žæ¨¡æ¿é‡Œæ˜¾ç¤ºå·®å¼‚" -#: builtin/commit.c:1428 +#: builtin/commit.c:1455 msgid "Commit message options" msgstr "æäº¤è¯´æ˜Žé€‰é¡¹" -#: builtin/commit.c:1429 builtin/tag.c:457 +#: builtin/commit.c:1456 builtin/tag.c:457 msgid "read message from file" msgstr "从文件ä¸è¯»å–æäº¤è¯´æ˜Ž" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "author" msgstr "作者" -#: builtin/commit.c:1430 +#: builtin/commit.c:1457 msgid "override author for commit" msgstr "æäº¤æ—¶è¦†ç›–作者" -#: builtin/commit.c:1431 builtin/gc.c:178 +#: builtin/commit.c:1458 builtin/gc.c:261 msgid "date" msgstr "日期" -#: builtin/commit.c:1431 +#: builtin/commit.c:1458 msgid "override date for commit" msgstr "æäº¤æ—¶è¦†ç›–日期" -#: builtin/commit.c:1432 builtin/merge.c:223 builtin/notes.c:405 +#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405 #: builtin/notes.c:562 builtin/tag.c:455 msgid "message" msgstr "说明" -#: builtin/commit.c:1432 +#: builtin/commit.c:1459 msgid "commit message" msgstr "æäº¤è¯´æ˜Ž" -#: builtin/commit.c:1433 +#: builtin/commit.c:1460 msgid "reuse and edit message from specified commit" msgstr "é‡ç”¨å¹¶ç¼–辑指定æäº¤çš„æäº¤è¯´æ˜Ž" -#: builtin/commit.c:1434 +#: builtin/commit.c:1461 msgid "reuse message from specified commit" msgstr "é‡ç”¨æŒ‡å®šæäº¤çš„æäº¤è¯´æ˜Ž" -#: builtin/commit.c:1435 +#: builtin/commit.c:1462 msgid "use autosquash formatted message to fixup specified commit" msgstr "使用 autosquash æ ¼å¼çš„æäº¤è¯´æ˜Žç”¨ä»¥ä¿®æ£æŒ‡å®šçš„æäº¤" -#: builtin/commit.c:1436 +#: builtin/commit.c:1463 msgid "use autosquash formatted message to squash specified commit" msgstr "使用 autosquash æ ¼å¼çš„æäº¤è¯´æ˜Žç”¨ä»¥åŽ‹ç¼©è‡³æŒ‡å®šçš„æäº¤" -#: builtin/commit.c:1437 +#: builtin/commit.c:1464 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "现在将该æäº¤çš„作者改为我(和 -C/-c/--amend 傿•°å…±ç”¨ï¼‰" -#: builtin/commit.c:1438 builtin/log.c:1160 builtin/revert.c:111 +#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "æ·»åŠ Signed-off-by: ç¾å" -#: builtin/commit.c:1439 +#: builtin/commit.c:1466 msgid "use specified template file" msgstr "ä½¿ç”¨æŒ‡å®šçš„æ¨¡æ¿æ–‡ä»¶" -#: builtin/commit.c:1440 +#: builtin/commit.c:1467 msgid "force edit of commit" msgstr "强制编辑æäº¤" # 译者:å¯é€‰å€¼ï¼Œä¸èƒ½ç¿»è¯‘(或是原文ä¸ç¬”误,应为 mode) -#: builtin/commit.c:1441 +#: builtin/commit.c:1468 msgid "default" msgstr "default" -#: builtin/commit.c:1441 builtin/tag.c:460 +#: builtin/commit.c:1468 builtin/tag.c:460 msgid "how to strip spaces and #comments from message" msgstr "è®¾ç½®å¦‚ä½•åˆ é™¤æäº¤è¯´æ˜Žé‡Œçš„ç©ºæ ¼å’Œ#注释" -#: builtin/commit.c:1442 +#: builtin/commit.c:1469 msgid "include status in commit message template" msgstr "在æäº¤è¯´æ˜Žæ¨¡æ¿é‡ŒåŒ…å«çжæ€ä¿¡æ¯" -#: builtin/commit.c:1443 builtin/merge.c:230 builtin/tag.c:461 +#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461 msgid "key id" msgstr "key id" -#: builtin/commit.c:1444 builtin/merge.c:231 +#: builtin/commit.c:1471 builtin/merge.c:224 msgid "GPG sign commit" msgstr "GPG æäº¤ç¾å" #. end commit message options -#: builtin/commit.c:1447 +#: builtin/commit.c:1474 msgid "Commit contents options" msgstr "æäº¤å†…容选项" -#: builtin/commit.c:1448 +#: builtin/commit.c:1475 msgid "commit all changed files" msgstr "æäº¤æ‰€æœ‰æ”¹åŠ¨çš„æ–‡ä»¶" -#: builtin/commit.c:1449 +#: builtin/commit.c:1476 msgid "add specified files to index for commit" msgstr "æ·»åŠ æŒ‡å®šçš„æ–‡ä»¶åˆ°ç´¢å¼•åŒºç‰å¾…æäº¤" -#: builtin/commit.c:1450 +#: builtin/commit.c:1477 msgid "interactively add files" msgstr "äº¤äº’å¼æ·»åŠ æ–‡ä»¶" -#: builtin/commit.c:1451 +#: builtin/commit.c:1478 msgid "interactively add changes" msgstr "äº¤äº’å¼æ·»åŠ å˜æ›´" -#: builtin/commit.c:1452 +#: builtin/commit.c:1479 msgid "commit only specified files" msgstr "åªæäº¤æŒ‡å®šçš„æ–‡ä»¶" -#: builtin/commit.c:1453 +#: builtin/commit.c:1480 msgid "bypass pre-commit hook" msgstr "绕过 pre-commit é’©å" -#: builtin/commit.c:1454 +#: builtin/commit.c:1481 msgid "show what would be committed" msgstr "æ˜¾ç¤ºå°†è¦æäº¤çš„å†…å®¹" -#: builtin/commit.c:1465 +#: builtin/commit.c:1492 msgid "amend previous commit" msgstr "修改先å‰çš„æäº¤" -#: builtin/commit.c:1466 +#: builtin/commit.c:1493 msgid "bypass post-rewrite hook" msgstr "绕过 post-rewrite é’©å" -#: builtin/commit.c:1471 +#: builtin/commit.c:1498 msgid "ok to record an empty change" msgstr "å…许一个空æäº¤" -#: builtin/commit.c:1474 +#: builtin/commit.c:1500 msgid "ok to record a change with an empty message" msgstr "å…许空的æäº¤è¯´æ˜Ž" -#: builtin/commit.c:1507 +#: builtin/commit.c:1529 msgid "could not parse HEAD commit" msgstr "ä¸èƒ½è§£æž HEAD æäº¤" -#: builtin/commit.c:1545 builtin/merge.c:525 +#: builtin/commit.c:1567 builtin/merge.c:518 #, c-format msgid "could not open '%s' for reading" msgstr "ä¸èƒ½ä¸ºè¯»å…¥æ‰“å¼€ '%s'" -#: builtin/commit.c:1552 +#: builtin/commit.c:1574 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "æŸåçš„ MERGE_HEAD 文件(%s)" -#: builtin/commit.c:1559 +#: builtin/commit.c:1581 msgid "could not read MERGE_MODE" msgstr "ä¸èƒ½è¯»å– MERGE_MODE" -#: builtin/commit.c:1578 +#: builtin/commit.c:1600 #, c-format msgid "could not read commit message: %s" msgstr "ä¸èƒ½è¯»å–æäº¤è¯´æ˜Žï¼š%s" -#: builtin/commit.c:1592 +#: builtin/commit.c:1611 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "ç»ˆæ¢æäº¤ï¼›æ‚¨æœªæ›´æ”¹æ¥è‡ªæ¨¡ç‰ˆçš„æäº¤è¯´æ˜Žã€‚\n" -#: builtin/commit.c:1597 +#: builtin/commit.c:1616 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "ç»ˆæ¢æäº¤å› ä¸ºæäº¤è¯´æ˜Žä¸ºç©ºã€‚\n" -#: builtin/commit.c:1612 builtin/merge.c:861 builtin/merge.c:886 +#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879 msgid "failed to write commit object" msgstr "æ— æ³•å†™æäº¤å¯¹è±¡" -#: builtin/commit.c:1633 +#: builtin/commit.c:1652 msgid "cannot lock HEAD ref" msgstr "æ— æ³•é”定 HEAD 引用" -#: builtin/commit.c:1637 +#: builtin/commit.c:1656 msgid "cannot update HEAD ref" msgstr "æ— æ³•æ›´æ–° HEAD 引用" -#: builtin/commit.c:1648 +#: builtin/commit.c:1667 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4429,127 +4645,131 @@ msgstr "" "ç‰ˆæœ¬åº“å·²æ›´æ–°ï¼Œä½†æ— æ³•å†™ new_index 文件。检查是å¦ç£ç›˜å·²æ»¡\n" "或ç£ç›˜é…é¢å·²è€—å°½ï¼Œç„¶åŽæ‰§è¡Œ \"git reset HEAD\" æ¢å¤ã€‚" -#: builtin/config.c:7 +#: builtin/config.c:8 msgid "git config [options]" msgstr "git config [选项]" -#: builtin/config.c:52 +#: builtin/config.c:54 msgid "Config file location" msgstr "é…置文件ä½ç½®" -#: builtin/config.c:53 +#: builtin/config.c:55 msgid "use global config file" msgstr "使用全局é…置文件" -#: builtin/config.c:54 +#: builtin/config.c:56 msgid "use system config file" msgstr "使用系统级é…置文件" -#: builtin/config.c:55 +#: builtin/config.c:57 msgid "use repository config file" msgstr "使用版本库级é…置文件" -#: builtin/config.c:56 +#: builtin/config.c:58 msgid "use given config file" msgstr "使用指定的é…置文件" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "blob-id" msgstr "æ•°æ®å¯¹è±¡ID" -#: builtin/config.c:57 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "从给定的数æ®å¯¹è±¡è¯»å–é…ç½®" -#: builtin/config.c:58 +#: builtin/config.c:60 msgid "Action" msgstr "æ“作" -#: builtin/config.c:59 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "获å–值:name [value-regex]" -#: builtin/config.c:60 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "获得所有的值:key [value-regex]" -#: builtin/config.c:61 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "æ ¹æ®æ£åˆ™è¡¨è¾¾å¼èŽ·å¾—å€¼ï¼šname-regex [value-regex]" -#: builtin/config.c:62 +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "获得 URL å–值:section[.var] URL" + +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "æ›¿æ¢æ‰€æœ‰åŒ¹é…çš„å˜é‡ï¼šname value [value_regex]" -#: builtin/config.c:63 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "æ·»åŠ ä¸€ä¸ªæ–°çš„å˜é‡ï¼šname value" -#: builtin/config.c:64 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "åˆ é™¤ä¸€ä¸ªå˜é‡ï¼šname [value-regex]" -#: builtin/config.c:65 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "åˆ é™¤æ‰€æœ‰åŒ¹é…项:name [value-regex]" -#: builtin/config.c:66 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "é‡å‘½åå°èŠ‚ï¼šold-name new-name" -#: builtin/config.c:67 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "åˆ é™¤ä¸€ä¸ªå°èŠ‚ï¼šname" -#: builtin/config.c:68 +#: builtin/config.c:71 msgid "list all" msgstr "列出所有" -#: builtin/config.c:69 +#: builtin/config.c:72 msgid "open an editor" msgstr "打开一个编辑器" -#: builtin/config.c:70 builtin/config.c:71 +#: builtin/config.c:73 builtin/config.c:74 msgid "slot" msgstr "slot" -#: builtin/config.c:70 +#: builtin/config.c:73 msgid "find the color configured: [default]" msgstr "找到é…置的颜色:[默认]" -#: builtin/config.c:71 +#: builtin/config.c:74 msgid "find the color setting: [stdout-is-tty]" msgstr "找到颜色设置:[stdout-is-tty]" -#: builtin/config.c:72 +#: builtin/config.c:75 msgid "Type" msgstr "类型" -#: builtin/config.c:73 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "值是 \"true\" 或 \"false\"" -#: builtin/config.c:74 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "值是å进制数" -#: builtin/config.c:75 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "值是 --bool or --int" -#: builtin/config.c:76 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "值是一个路径(文件或目录å)" -#: builtin/config.c:77 +#: builtin/config.c:80 msgid "Other" msgstr "其它" -#: builtin/config.c:78 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "终æ¢å€¼æ˜¯NULå—节" -#: builtin/config.c:79 +#: builtin/config.c:82 msgid "respect include directives on lookup" msgstr "查询时å‚ç…§ include 指令递归查找" @@ -4677,7 +4897,7 @@ msgstr "考虑最近 <n> 个 tags(默认:10)" msgid "only consider tags matching <pattern>" msgstr "åªè€ƒè™‘åŒ¹é… <模å¼> çš„ tags" -#: builtin/describe.c:423 builtin/name-rev.c:322 +#: builtin/describe.c:423 builtin/name-rev.c:321 msgid "show abbreviated commit object as fallback" msgstr "显示简写的æäº¤å·ä½œä¸ºåŽå¤‡" @@ -4701,31 +4921,31 @@ msgstr "没有å‘现åç§°ï¼Œæ— æ³•æè¿°ä»»ä½•东西。" msgid "--dirty is incompatible with commit-ishes" msgstr "--dirty ä¸èƒ½ä¸Žæäº¤åŒæ—¶ä½¿ç”¨" -#: builtin/diff.c:79 +#: builtin/diff.c:85 #, c-format msgid "'%s': not a regular file or symlink" msgstr "'%s'ï¼šä¸æ˜¯ä¸€ä¸ªæ£è§„文件或符å·é“¾æŽ¥" -#: builtin/diff.c:230 +#: builtin/diff.c:236 #, c-format msgid "invalid option: %s" msgstr "æ— æ•ˆé€‰é¡¹ï¼š%s" -#: builtin/diff.c:307 +#: builtin/diff.c:357 msgid "Not a git repository" msgstr "䏿˜¯ä¸€ä¸ª git 版本库" -#: builtin/diff.c:350 +#: builtin/diff.c:400 #, c-format msgid "invalid object '%s' given." msgstr "æä¾›äº†æ— 效对象 '%s'。" -#: builtin/diff.c:359 +#: builtin/diff.c:409 #, c-format msgid "more than two blobs given: '%s'" msgstr "æä¾›äº†è¶…过两个数æ®ï¼ˆblob)对象:'%s'" -#: builtin/diff.c:366 +#: builtin/diff.c:416 #, c-format msgid "unhandled object '%s' given." msgstr "æä¾›äº†æ— 法处ç†çš„对象 '%s'。" @@ -4734,45 +4954,45 @@ msgstr "æä¾›äº†æ— 法处ç†çš„对象 '%s'。" msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [rev-list-opts]" -#: builtin/fast-export.c:666 +#: builtin/fast-export.c:673 msgid "show progress after <n> objects" msgstr "在 <n> ä¸ªå¯¹è±¡ä¹‹åŽæ˜¾ç¤ºè¿›åº¦" -#: builtin/fast-export.c:668 +#: builtin/fast-export.c:675 msgid "select handling of signed tags" msgstr "选择如何处ç†ç¾å tags" -#: builtin/fast-export.c:671 +#: builtin/fast-export.c:678 msgid "select handling of tags that tag filtered objects" msgstr "选择当 tag 指å‘被过滤时 tags çš„å¤„ç†æ–¹å¼" -#: builtin/fast-export.c:674 +#: builtin/fast-export.c:681 msgid "Dump marks to this file" msgstr "æŠŠæ ‡è®°å˜å‚¨åˆ°è¿™ä¸ªæ–‡ä»¶" -#: builtin/fast-export.c:676 +#: builtin/fast-export.c:683 msgid "Import marks from this file" msgstr "ä»Žè¿™ä¸ªæ–‡ä»¶å¯¼å…¥æ ‡è®°" -#: builtin/fast-export.c:678 +#: builtin/fast-export.c:685 msgid "Fake a tagger when tags lack one" msgstr "当 tags ç¼ºå°‘æ ‡è®°è€…å—æ®µæ—¶ï¼Œå‡è£…æä¾›ä¸€ä¸ª" -#: builtin/fast-export.c:680 +#: builtin/fast-export.c:687 msgid "Output full tree for each commit" msgstr "æ¯æ¬¡æäº¤éƒ½è¾“å‡ºæ•´ä¸ªæ ‘" -#: builtin/fast-export.c:682 +#: builtin/fast-export.c:689 msgid "Use the done feature to terminate the stream" msgstr "使用 done 功能æ¥ç»ˆæ¢æµ" -#: builtin/fast-export.c:683 +#: builtin/fast-export.c:690 msgid "Skip output of blob data" msgstr "跳过数æ®å¯¹è±¡çš„输出" #: builtin/fetch.c:20 msgid "git fetch [<options>] [<repository> [<refspec>...]]" -msgstr "git fetch [<选项>] [<版本库> [<引用表达å¼>...]]" +msgstr "git fetch [<选项>] [<版本库> [<引用规则>...]]" #: builtin/fetch.c:21 msgid "git fetch [<options>] <group>" @@ -4786,146 +5006,155 @@ msgstr "git fetch --multiple [<选项>] [(<版本库> | <组>)...]" msgid "git fetch --all [<options>]" msgstr "git fetch --all [<选项>]" -#: builtin/fetch.c:60 +#: builtin/fetch.c:75 msgid "fetch from all remotes" msgstr "从所有的远程抓å–" -#: builtin/fetch.c:62 +#: builtin/fetch.c:77 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "è¿½åŠ åˆ° .git/FETCH_HEAD è€Œä¸æ˜¯è¦†ç›–它" -#: builtin/fetch.c:64 +#: builtin/fetch.c:79 msgid "path to upload pack on remote end" msgstr "ä¸Šä¼ åŒ…åˆ°è¿œç¨‹çš„è·¯å¾„" -#: builtin/fetch.c:65 +#: builtin/fetch.c:80 msgid "force overwrite of local branch" msgstr "强制覆盖本地分支" -#: builtin/fetch.c:67 +#: builtin/fetch.c:82 msgid "fetch from multiple remotes" msgstr "从多个远程抓å–" -#: builtin/fetch.c:69 +#: builtin/fetch.c:84 msgid "fetch all tags and associated objects" msgstr "æŠ“å–æ‰€æœ‰çš„ tags 和关è”对象" -#: builtin/fetch.c:71 +#: builtin/fetch.c:86 msgid "do not fetch all tags (--no-tags)" msgstr "䏿Гå–任何 tags (--no-tags)" -#: builtin/fetch.c:73 +#: builtin/fetch.c:88 msgid "prune remote-tracking branches no longer on remote" msgstr "清除远程已ç»ä¸å˜åœ¨çš„分支的跟踪分支" # 译者:å¯é€‰å€¼ï¼Œä¸èƒ½ç¿»è¯‘ -#: builtin/fetch.c:74 +#: builtin/fetch.c:89 msgid "on-demand" msgstr "on-demand" -#: builtin/fetch.c:75 +#: builtin/fetch.c:90 msgid "control recursive fetching of submodules" msgstr "æŽ§åˆ¶åæ¨¡ç»„的递归抓å–" -#: builtin/fetch.c:79 +#: builtin/fetch.c:94 msgid "keep downloaded pack" msgstr "ä¿æŒä¸‹è½½åŒ…" -#: builtin/fetch.c:81 +#: builtin/fetch.c:96 msgid "allow updating of HEAD ref" msgstr "å…许更新 HEAD 引用" -#: builtin/fetch.c:84 +#: builtin/fetch.c:99 msgid "deepen history of shallow clone" msgstr "深化浅克隆的历å²" -#: builtin/fetch.c:86 +#: builtin/fetch.c:101 msgid "convert to a complete repository" msgstr "转æ¢ä¸ºä¸€ä¸ªå®Œæ•´çš„版本库" -#: builtin/fetch.c:88 builtin/log.c:1177 +#: builtin/fetch.c:103 builtin/log.c:1197 msgid "dir" msgstr "目录" -#: builtin/fetch.c:89 +#: builtin/fetch.c:104 msgid "prepend this to submodule path output" msgstr "åœ¨åæ¨¡ç»„路径输出的å‰é¢åŠ ä¸Šæ¤ç›®å½•" -#: builtin/fetch.c:92 +#: builtin/fetch.c:107 msgid "default mode for recursion" msgstr "递归的默认模å¼" -#: builtin/fetch.c:220 +#: builtin/fetch.c:109 +msgid "accept refs that update .git/shallow" +msgstr "æŽ¥å—æ›´æ–° .git/shallow 的引用" + +#: builtin/fetch.c:347 msgid "Couldn't find remote ref HEAD" msgstr "æ— æ³•å‘现远程 HEAD 引用" -#: builtin/fetch.c:273 +#: builtin/fetch.c:411 #, c-format msgid "object %s not found" msgstr "对象 %s 未å‘现" -#: builtin/fetch.c:278 +#: builtin/fetch.c:416 msgid "[up to date]" msgstr "[最新]" -#: builtin/fetch.c:292 +#: builtin/fetch.c:430 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (在当å‰åˆ†æ”¯ä¸‹ä¸èƒ½èŽ·å–)" -#: builtin/fetch.c:293 builtin/fetch.c:379 +#: builtin/fetch.c:431 builtin/fetch.c:517 msgid "[rejected]" msgstr "[已拒ç»]" -#: builtin/fetch.c:304 +#: builtin/fetch.c:442 msgid "[tag update]" msgstr "[tagæ›´æ–°]" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:306 builtin/fetch.c:341 builtin/fetch.c:359 +#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497 msgid " (unable to update local ref)" msgstr " (ä¸èƒ½æ›´æ–°æœ¬åœ°å¼•用)" -#: builtin/fetch.c:324 +#: builtin/fetch.c:462 msgid "[new tag]" msgstr "[æ–°tag]" -#: builtin/fetch.c:327 +#: builtin/fetch.c:465 msgid "[new branch]" msgstr "[新分支]" -#: builtin/fetch.c:330 +#: builtin/fetch.c:468 msgid "[new ref]" msgstr "[新引用]" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "unable to update local ref" msgstr "ä¸èƒ½æ›´æ–°æœ¬åœ°å¼•用" -#: builtin/fetch.c:375 +#: builtin/fetch.c:513 msgid "forced update" msgstr "强制更新" -#: builtin/fetch.c:381 +#: builtin/fetch.c:519 msgid "(non-fast-forward)" msgstr "(éžå¿«è¿›å¼ï¼‰" -#: builtin/fetch.c:412 builtin/fetch.c:718 +#: builtin/fetch.c:552 builtin/fetch.c:785 #, c-format msgid "cannot open %s: %s\n" msgstr "æ— æ³•æ‰“å¼€ %s:%s\n" -#: builtin/fetch.c:421 +#: builtin/fetch.c:561 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s 未å‘逿‰€æœ‰å¿…须的对象\n" -#: builtin/fetch.c:520 +#: builtin/fetch.c:579 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "æ‹’ç» %s å› ä¸ºæµ…å…‹éš†ä¸å…许被更新" + +#: builtin/fetch.c:667 builtin/fetch.c:750 #, c-format msgid "From %.*s\n" msgstr "æ¥è‡ª %.*s\n" -#: builtin/fetch.c:531 +#: builtin/fetch.c:678 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -4935,98 +5164,99 @@ msgstr "" " 'git remote prune %s' æ¥åˆ é™¤æ—§çš„ã€æœ‰å†²çªçš„分支" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:581 +#: builtin/fetch.c:730 #, c-format msgid " (%s will become dangling)" msgstr " (%s å°†æˆä¸ºæ‘‡æ‘†çжæ€ï¼‰" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/fetch.c:582 +#: builtin/fetch.c:731 #, c-format msgid " (%s has become dangling)" msgstr " (%s å·²æˆä¸ºæ‘‡æ‘†çжæ€ï¼‰" -#: builtin/fetch.c:589 +#: builtin/fetch.c:755 msgid "[deleted]" msgstr "[å·²åˆ é™¤]" -#: builtin/fetch.c:590 builtin/remote.c:1055 +#: builtin/fetch.c:756 builtin/remote.c:1050 msgid "(none)" msgstr "ï¼ˆæ— ï¼‰" -#: builtin/fetch.c:708 +#: builtin/fetch.c:775 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "æ‹’ç»èŽ·å–到éžè£¸ç‰ˆæœ¬åº“的当å‰åˆ†æ”¯ %s" -#: builtin/fetch.c:742 -#, c-format -msgid "Don't know how to fetch from %s" -msgstr "ä¸çŸ¥é“如何从 %s 获å–" - -#: builtin/fetch.c:823 +#: builtin/fetch.c:794 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s æ˜¯æ— æ•ˆçš„" -#: builtin/fetch.c:826 +#: builtin/fetch.c:797 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "选项 \"%s\" 为 %s 所忽略\n" -#: builtin/fetch.c:928 +#: builtin/fetch.c:853 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "ä¸çŸ¥é“如何从 %s 获å–" + +#: builtin/fetch.c:1015 #, c-format msgid "Fetching %s\n" msgstr "æ£åœ¨èŽ·å– %s\n" -#: builtin/fetch.c:930 builtin/remote.c:100 +#: builtin/fetch.c:1017 builtin/remote.c:90 #, c-format msgid "Could not fetch %s" msgstr "ä¸èƒ½èŽ·å– %s" -#: builtin/fetch.c:949 +#: builtin/fetch.c:1036 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:969 +#: builtin/fetch.c:1059 msgid "You need to specify a tag name." msgstr "æ‚¨éœ€è¦æŒ‡å®šä¸€ä¸ª tag å称。" -#: builtin/fetch.c:1015 +#: builtin/fetch.c:1107 msgid "--depth and --unshallow cannot be used together" msgstr "--depth å’Œ --unshallow ä¸èƒ½åŒæ—¶ä½¿ç”¨" -#: builtin/fetch.c:1017 +#: builtin/fetch.c:1109 msgid "--unshallow on a complete repository does not make sense" msgstr "å¯¹äºŽä¸€ä¸ªå®Œæ•´çš„ç‰ˆæœ¬åº“ï¼Œå‚æ•° --unshallow 没有æ„义" -#: builtin/fetch.c:1036 +#: builtin/fetch.c:1132 msgid "fetch --all does not take a repository argument" msgstr "fetch --all ä¸èƒ½å¸¦ä¸€ä¸ªç‰ˆæœ¬åº“傿•°" -#: builtin/fetch.c:1038 +#: builtin/fetch.c:1134 msgid "fetch --all does not make sense with refspecs" -msgstr "fetch --all å¸¦å¼•ç”¨è¡¨è¾¾å¼æ²¡æœ‰ä»»ä½•æ„义" +msgstr "fetch --all 带引用规则没有任何æ„义" -#: builtin/fetch.c:1049 +#: builtin/fetch.c:1145 #, c-format msgid "No such remote or remote group: %s" msgstr "æ²¡æœ‰è¿™æ ·çš„è¿œç¨‹æˆ–è¿œç¨‹ç»„ï¼š%s" -#: builtin/fetch.c:1057 +#: builtin/fetch.c:1153 msgid "Fetching a group and specifying refspecs does not make sense" -msgstr "获å–ç»„å¹¶æŒ‡å®šå¼•ç”¨è¡¨è¾¾å¼æ²¡æœ‰æ„义" +msgstr "获å–组并指定引用规则没有æ„义" #: 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 <message>] [--log[=<n>]|--no-log] [--file <file>]" -#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700 -#: builtin/merge.c:203 builtin/show-branch.c:655 builtin/show-ref.c:179 -#: builtin/tag.c:446 parse-options.h:133 parse-options.h:243 +#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702 +#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164 +#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446 +#: parse-options.h:135 parse-options.h:242 msgid "n" msgstr "n" @@ -5050,117 +5280,121 @@ msgstr "使用 <文本> 作为æäº¤è¯´æ˜Žçš„开始" msgid "file to read from" msgstr "从文件ä¸è¯»å–" -#: builtin/for-each-ref.c:979 +#: builtin/for-each-ref.c:1063 msgid "git for-each-ref [options] [<pattern>]" msgstr "git for-each-ref [选项] [<模å¼>]" -#: builtin/for-each-ref.c:994 +#: builtin/for-each-ref.c:1078 msgid "quote placeholders suitably for shells" msgstr "引用å ä½ç¬¦é€‚用于 shells" -#: builtin/for-each-ref.c:996 +#: builtin/for-each-ref.c:1080 msgid "quote placeholders suitably for perl" msgstr "引用å ä½ç¬¦é€‚用于 perl" -#: builtin/for-each-ref.c:998 +#: builtin/for-each-ref.c:1082 msgid "quote placeholders suitably for python" msgstr "引用å ä½ç¬¦é€‚用于 python" -#: builtin/for-each-ref.c:1000 +#: builtin/for-each-ref.c:1084 msgid "quote placeholders suitably for tcl" msgstr "引用å ä½ç¬¦é€‚用于 tcl" -#: builtin/for-each-ref.c:1003 +#: builtin/for-each-ref.c:1087 msgid "show only <n> matched refs" msgstr "åªæ˜¾ç¤º <n> 个匹é…的引用" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 builtin/replace.c:177 msgid "format" msgstr "æ ¼å¼" -#: builtin/for-each-ref.c:1004 +#: builtin/for-each-ref.c:1088 msgid "format to use for the output" msgstr "è¾“å‡ºæ ¼å¼" -#: builtin/for-each-ref.c:1005 +#: builtin/for-each-ref.c:1089 msgid "key" msgstr "key" -#: builtin/for-each-ref.c:1006 +#: builtin/for-each-ref.c:1090 msgid "field name to sort on" msgstr "排åºçš„å—æ®µå" -#: builtin/fsck.c:608 +#: builtin/fsck.c:607 msgid "git fsck [options] [<object>...]" msgstr "git fsck [选项] [<对象>...]" -#: builtin/fsck.c:614 +#: builtin/fsck.c:613 msgid "show unreachable objects" msgstr "显示ä¸å¯è¾¾çš„对象" -#: builtin/fsck.c:615 +#: builtin/fsck.c:614 msgid "show dangling objects" msgstr "显示摇摆的对象" -#: builtin/fsck.c:616 +#: builtin/fsck.c:615 msgid "report tags" msgstr "报告 tags" -#: builtin/fsck.c:617 +#: builtin/fsck.c:616 msgid "report root nodes" msgstr "æŠ¥å‘Šæ ¹èŠ‚ç‚¹" -#: builtin/fsck.c:618 +#: builtin/fsck.c:617 msgid "make index objects head nodes" msgstr "将索引亦作为检查的头节点" -#: builtin/fsck.c:619 +#: builtin/fsck.c:618 msgid "make reflogs head nodes (default)" msgstr "将引用日志作为检查的头节点(默认)" -#: builtin/fsck.c:620 +#: builtin/fsck.c:619 msgid "also consider packs and alternate objects" msgstr "也考虑包和备用对象" -#: builtin/fsck.c:621 +#: builtin/fsck.c:620 msgid "enable more strict checking" msgstr "å¯ç”¨æ›´ä¸¥æ ¼çš„æ£€æŸ¥" -#: builtin/fsck.c:623 +#: builtin/fsck.c:622 msgid "write dangling objects in .git/lost-found" msgstr "将摇摆对象写入 .git/lost-found ä¸" -#: builtin/fsck.c:624 builtin/prune.c:134 +#: builtin/fsck.c:623 builtin/prune.c:144 msgid "show progress" msgstr "显示进度" -#: builtin/gc.c:22 +#: builtin/gc.c:24 msgid "git gc [options]" msgstr "git gc [选项]" -#: builtin/gc.c:63 +#: builtin/gc.c:80 #, c-format msgid "Invalid %s: '%s'" msgstr "æ— æ•ˆçš„ %s:'%s'" -#: builtin/gc.c:90 +#: builtin/gc.c:107 #, c-format msgid "insanely long object directory %.*s" msgstr "䏿£å¸¸çš„长对象目录 %.*s" -#: builtin/gc.c:179 +#: builtin/gc.c:262 msgid "prune unreferenced objects" msgstr "清除未引用的对象" -#: builtin/gc.c:181 +#: builtin/gc.c:264 msgid "be more thorough (increased runtime)" msgstr "æ›´å½»åº•ï¼ˆå¢žåŠ è¿è¡Œæ—¶é—´ï¼‰" -#: builtin/gc.c:182 +#: builtin/gc.c:265 msgid "enable auto-gc mode" msgstr "å¯ç”¨è‡ªåŠ¨åžƒåœ¾å›žæ”¶æ¨¡å¼" -#: builtin/gc.c:222 +#: builtin/gc.c:266 +msgid "force running gc even if there may be another gc running" +msgstr "强制执行 gc å³ä½¿å¦å¤–一个 gc æ£åœ¨æ‰§è¡Œ" + +#: builtin/gc.c:306 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -5169,41 +5403,49 @@ msgstr "" "自动打包版本库以求最佳性能。您还å¯ä»¥æ‰‹åЍè¿è¡Œ \"git gc\"。\n" "å‚è§ \"git help gc\" ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚\n" -#: builtin/gc.c:249 +#. be quiet on --auto +#: builtin/gc.c:316 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "" +"å·²ç»æœ‰ä¸€ä¸ª gc æ£è¿è¡Œåœ¨æœºå™¨ '%s' pid %<PRIuMAX> ï¼ˆå¦‚æžœä¸æ˜¯ï¼Œä½¿ç”¨ --force)" + +#: builtin/gc.c:341 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "有太多ä¸å¯è¾¾çš„æ¾æ•£å¯¹è±¡ï¼Œè¿è¡Œ 'git prune' åˆ é™¤å®ƒä»¬ã€‚" -#: builtin/grep.c:22 +#: builtin/grep.c:23 msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]" msgstr "git grep [选项] [-e] <模å¼> [<修订>...] [[--] <路径>...]" -#: builtin/grep.c:217 +#: builtin/grep.c:218 #, c-format msgid "grep: failed to create thread: %s" msgstr "grepï¼šæ— æ³•åˆ›å»ºçº¿ç¨‹ï¼š%s" -#: builtin/grep.c:364 +#: builtin/grep.c:365 #, c-format msgid "Failed to chdir: %s" msgstr "æ— æ³•åˆ‡æ¢ç›®å½•:%s" -#: builtin/grep.c:442 builtin/grep.c:477 +#: builtin/grep.c:443 builtin/grep.c:478 #, c-format msgid "unable to read tree (%s)" msgstr "æ— æ³•è¯»å–æ ‘(%s)" -#: builtin/grep.c:492 +#: builtin/grep.c:493 #, c-format msgid "unable to grep from object of type %s" msgstr "æ— æ³•æŠ“å–æ¥è‡ªäºŽ %s 类型的对象" -#: builtin/grep.c:550 +#: builtin/grep.c:551 #, c-format msgid "switch `%c' expects a numerical value" msgstr "开关 `%c' 期望一个数å—值" -#: builtin/grep.c:567 +#: builtin/grep.c:568 #, c-format msgid "cannot open '%s'" msgstr "ä¸èƒ½æ‰“å¼€ '%s'" @@ -5246,158 +5488,162 @@ msgid "don't match patterns in binary files" msgstr "ä¸åœ¨äºŒè¿›åˆ¶æ–‡ä»¶ä¸åŒ¹é…模å¼" #: builtin/grep.c:662 +msgid "process binary files with textconv filters" +msgstr "用 textconv 过滤器处ç†äºŒè¿›åˆ¶æ–‡ä»¶" + +#: builtin/grep.c:664 msgid "descend at most <depth> levels" msgstr "最多以指定的深度å‘下寻找" -#: builtin/grep.c:666 +#: builtin/grep.c:668 msgid "use extended POSIX regular expressions" msgstr "使用扩展的 POSIX æ£åˆ™è¡¨è¾¾å¼" -#: builtin/grep.c:669 +#: builtin/grep.c:671 msgid "use basic POSIX regular expressions (default)" msgstr "使用基本的 POSIX æ£åˆ™è¡¨è¾¾å¼ï¼ˆé»˜è®¤ï¼‰" -#: builtin/grep.c:672 +#: builtin/grep.c:674 msgid "interpret patterns as fixed strings" msgstr "把模å¼è§£æžä¸ºå›ºå®šçš„å—符串" -#: builtin/grep.c:675 +#: builtin/grep.c:677 msgid "use Perl-compatible regular expressions" msgstr "使用 Perl 兼容的æ£åˆ™è¡¨è¾¾å¼" -#: builtin/grep.c:678 +#: builtin/grep.c:680 msgid "show line numbers" msgstr "显示行å·" -#: builtin/grep.c:679 +#: builtin/grep.c:681 msgid "don't show filenames" msgstr "䏿˜¾ç¤ºæ–‡ä»¶å" -#: builtin/grep.c:680 +#: builtin/grep.c:682 msgid "show filenames" msgstr "显示文件å" -#: builtin/grep.c:682 +#: builtin/grep.c:684 msgid "show filenames relative to top directory" msgstr "显示相对于顶级目录的文件å" -#: builtin/grep.c:684 +#: builtin/grep.c:686 msgid "show only filenames instead of matching lines" msgstr "åªæ˜¾ç¤ºæ–‡ä»¶åè€Œä¸æ˜¾ç¤ºåŒ¹é…的行" -#: builtin/grep.c:686 +#: builtin/grep.c:688 msgid "synonym for --files-with-matches" msgstr "å’Œ --files-with-matches åŒä¹‰" -#: builtin/grep.c:689 +#: builtin/grep.c:691 msgid "show only the names of files without match" msgstr "åªæ˜¾ç¤ºæœªåŒ¹é…的文件å" -#: builtin/grep.c:691 +#: builtin/grep.c:693 msgid "print NUL after filenames" msgstr "在文件ååŽè¾“出 NUL å—符" -#: builtin/grep.c:693 +#: builtin/grep.c:695 msgid "show the number of matches instead of matching lines" msgstr "显示总匹é…è¡Œæ•°ï¼Œè€Œä¸æ˜¾ç¤ºåŒ¹é…的行" -#: builtin/grep.c:694 +#: builtin/grep.c:696 msgid "highlight matches" msgstr "高亮显示匹é…项" -#: builtin/grep.c:696 +#: builtin/grep.c:698 msgid "print empty line between matches from different files" msgstr "在ä¸åŒæ–‡ä»¶çš„匹é…项之间打å°ç©ºè¡Œ" -#: builtin/grep.c:698 +#: builtin/grep.c:700 msgid "show filename only once above matches from same file" msgstr "åªåœ¨åŒä¸€æ–‡ä»¶çš„匹é…é¡¹çš„ä¸Šé¢æ˜¾ç¤ºä¸€æ¬¡æ–‡ä»¶å" -#: builtin/grep.c:701 +#: builtin/grep.c:703 msgid "show <n> context lines before and after matches" msgstr "显示匹é…项å‰åŽçš„ <n> 行上下文" -#: builtin/grep.c:704 +#: builtin/grep.c:706 msgid "show <n> context lines before matches" msgstr "显示匹é…é¡¹å‰ <n> 行上下文" -#: builtin/grep.c:706 +#: builtin/grep.c:708 msgid "show <n> context lines after matches" msgstr "显示匹é…é¡¹åŽ <n> 行上下文" -#: builtin/grep.c:707 +#: builtin/grep.c:709 msgid "shortcut for -C NUM" msgstr "å¿«æ·é”® -C æ•°å—" -#: builtin/grep.c:710 +#: builtin/grep.c:712 msgid "show a line with the function name before matches" msgstr "在匹é…çš„å‰é¢æ˜¾ç¤ºä¸€è¡Œå‡½æ•°å" -#: builtin/grep.c:712 +#: builtin/grep.c:714 msgid "show the surrounding function" msgstr "显示所在函数的å‰åŽå†…容" -#: builtin/grep.c:715 +#: builtin/grep.c:717 msgid "read patterns from file" msgstr "ä»Žæ–‡ä»¶è¯»å–æ¨¡å¼" -#: builtin/grep.c:717 +#: builtin/grep.c:719 msgid "match <pattern>" msgstr "åŒ¹é… <模å¼>" -#: builtin/grep.c:719 +#: builtin/grep.c:721 msgid "combine patterns specified with -e" msgstr "组åˆç”¨ -e 傿•°è®¾å®šçš„æ¨¡å¼" -#: builtin/grep.c:731 +#: builtin/grep.c:733 msgid "indicate hit with exit status without output" msgstr "ä¸è¾“å‡ºï¼Œè€Œç”¨é€€å‡ºç æ ‡è¯†å‘½ä¸çжæ€" -#: builtin/grep.c:733 +#: builtin/grep.c:735 msgid "show only matches from files that match all patterns" msgstr "åªæ˜¾ç¤ºåŒ¹é…所有模å¼çš„æ–‡ä»¶ä¸çš„匹é…" -#: builtin/grep.c:735 +#: builtin/grep.c:737 msgid "show parse tree for grep expression" msgstr "显示 grep 表达å¼çš„è§£æžæ ‘" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "pager" msgstr "分页" -#: builtin/grep.c:739 +#: builtin/grep.c:741 msgid "show matching files in the pager" msgstr "分页显示匹é…的文件" -#: builtin/grep.c:742 +#: builtin/grep.c:744 msgid "allow calling of grep(1) (ignored by this build)" msgstr "å…许调用 grep(1)(本次构建忽略)" -#: builtin/grep.c:743 builtin/show-ref.c:188 +#: builtin/grep.c:745 builtin/show-ref.c:187 msgid "show usage" msgstr "显示用法" -#: builtin/grep.c:810 +#: builtin/grep.c:812 msgid "no pattern given." msgstr "未æä¾›æ¨¡å¼åŒ¹é…。" -#: builtin/grep.c:865 +#: builtin/grep.c:870 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager 仅用于工作区" -#: builtin/grep.c:888 +#: builtin/grep.c:893 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached 或 --untracked ä¸èƒ½ä¸Ž --no-index åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/grep.c:893 +#: builtin/grep.c:898 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index 或 --untracked ä¸èƒ½å’Œç‰ˆæœ¬åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/grep.c:896 +#: builtin/grep.c:901 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard ä¸èƒ½ç”¨äºŽå·²è·Ÿè¸ªå†…容。" -#: builtin/grep.c:904 +#: builtin/grep.c:909 msgid "both --cached and trees are given." msgstr "åŒæ—¶ç»™å‡ºäº† --cached å’Œæ ‘å¯¹è±¡ã€‚" @@ -5502,57 +5748,57 @@ msgstr "" "'%s': 支æŒçš„ man 手册查看器命令。\n" "请使用 'man.<tool>.path'。" -#: builtin/help.c:349 +#: builtin/help.c:353 #, c-format msgid "'%s': unknown man viewer." msgstr "'%s':未知的 man 查看器。" -#: builtin/help.c:366 +#: builtin/help.c:370 msgid "no man viewer handled the request" msgstr "没有 man æŸ¥çœ‹å™¨å¤„ç†æ¤è¯·æ±‚" -#: builtin/help.c:374 +#: builtin/help.c:378 msgid "no info viewer handled the request" msgstr "没有 info æŸ¥çœ‹å™¨å¤„ç†æ¤è¯·æ±‚" -#: builtin/help.c:420 +#: builtin/help.c:424 msgid "Defining attributes per path" msgstr "定义路径的属性" -#: builtin/help.c:421 +#: builtin/help.c:425 msgid "A Git glossary" msgstr "Git è¯æ±‡è¡¨" -#: builtin/help.c:422 +#: builtin/help.c:426 msgid "Specifies intentionally untracked files to ignore" msgstr "忽略指定的未跟踪文件" -#: builtin/help.c:423 +#: builtin/help.c:427 msgid "Defining submodule properties" msgstr "å®šä¹‰åæ¨¡ç»„属性" -#: builtin/help.c:424 +#: builtin/help.c:428 msgid "Specifying revisions and ranges for Git" msgstr "指定 Git 的版本和版本范围" -#: builtin/help.c:425 +#: builtin/help.c:429 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "一个 Git 教程(针对 1.5.1 或更新版本)" -#: builtin/help.c:426 +#: builtin/help.c:430 msgid "An overview of recommended workflows with Git" msgstr "Git 推èçš„å·¥ä½œæµæ¦‚览" -#: builtin/help.c:438 +#: builtin/help.c:442 msgid "The common Git guides are:\n" msgstr "最常用的 Git å‘导有:\n" -#: builtin/help.c:460 builtin/help.c:476 +#: builtin/help.c:463 builtin/help.c:480 #, c-format msgid "usage: %s%s" msgstr "用法:%s%s" -#: builtin/help.c:492 +#: builtin/help.c:496 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "`git %s' 是 `%s' 的别å" @@ -5652,8 +5898,8 @@ msgstr "解压缩严é‡çš„ä¸ä¸€è‡´" msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "å‘现 %s 出现 SHA1 冲çªï¼" -#: builtin/index-pack.c:669 builtin/pack-objects.c:170 -#: builtin/pack-objects.c:262 +#: builtin/index-pack.c:669 builtin/pack-objects.c:171 +#: builtin/pack-objects.c:263 #, c-format msgid "unable to read %s" msgstr "ä¸èƒ½è¯» %s" @@ -5682,155 +5928,155 @@ msgstr "对象ä¸å‡ºé”™" msgid "Not all child objects of %s are reachable" msgstr "%s 的所有å对象并éžéƒ½å¯è¾¾" -#: builtin/index-pack.c:838 builtin/index-pack.c:868 +#: builtin/index-pack.c:839 builtin/index-pack.c:869 msgid "failed to apply delta" msgstr "æ— æ³•åº”ç”¨ delta" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Receiving objects" msgstr "接收对象ä¸" -#: builtin/index-pack.c:1009 +#: builtin/index-pack.c:1010 msgid "Indexing objects" msgstr "索引对象ä¸" -#: builtin/index-pack.c:1035 +#: builtin/index-pack.c:1036 msgid "pack is corrupted (SHA1 mismatch)" msgstr "包冲çªï¼ˆSHA1 ä¸åŒ¹é…)" -#: builtin/index-pack.c:1040 +#: builtin/index-pack.c:1041 msgid "cannot fstat packfile" msgstr "ä¸èƒ½æžšä¸¾åŒ…文件状æ€" -#: builtin/index-pack.c:1043 +#: builtin/index-pack.c:1044 msgid "pack has junk at the end" msgstr "包的结尾有垃圾数æ®" -#: builtin/index-pack.c:1054 +#: builtin/index-pack.c:1055 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "parse_pack_objects() ä¸é‡åˆ°ä¸å¯ç†å–»çš„问题" -#: builtin/index-pack.c:1077 +#: builtin/index-pack.c:1078 msgid "Resolving deltas" msgstr "å¤„ç† delta ä¸" -#: builtin/index-pack.c:1087 +#: builtin/index-pack.c:1088 #, c-format msgid "unable to create thread: %s" msgstr "ä¸èƒ½åˆ›å»ºçº¿ç¨‹ï¼š%s" -#: builtin/index-pack.c:1129 +#: builtin/index-pack.c:1130 msgid "confusion beyond insanity" msgstr "ä¸å¯ç†å–»" -#: builtin/index-pack.c:1137 +#: builtin/index-pack.c:1138 #, c-format msgid "completed with %d local objects" msgstr "å®Œæˆ %d 个本地对象" -#: builtin/index-pack.c:1147 +#: builtin/index-pack.c:1148 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "对 %s çš„å°¾éƒ¨æ ¡éªŒå‡ºçŽ°æ„外(ç£ç›˜æŸå?)" -#: builtin/index-pack.c:1151 +#: builtin/index-pack.c:1152 #, 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:1176 +#: builtin/index-pack.c:1177 #, c-format msgid "unable to deflate appended object (%d)" msgstr "ä¸èƒ½åŽ‹ç¼©é™„åŠ å¯¹è±¡ï¼ˆ%d)" -#: builtin/index-pack.c:1255 +#: builtin/index-pack.c:1256 #, c-format msgid "local object %s is corrupt" msgstr "本地对象 %s å·²æŸå" -#: builtin/index-pack.c:1279 +#: builtin/index-pack.c:1280 msgid "error while closing pack file" msgstr "å…³é—包文件时出错" -#: builtin/index-pack.c:1292 +#: builtin/index-pack.c:1293 #, c-format msgid "cannot write keep file '%s'" msgstr "æ— æ³•å†™ä¿ç•™æ–‡ä»¶ '%s'" -#: builtin/index-pack.c:1300 +#: builtin/index-pack.c:1301 #, c-format msgid "cannot close written keep file '%s'" msgstr "æ— æ³•å…³é—ä¿ç•™æ–‡ä»¶ '%s'" -#: builtin/index-pack.c:1313 +#: builtin/index-pack.c:1314 msgid "cannot store pack file" msgstr "æ— æ³•å˜å‚¨åŒ…文件" -#: builtin/index-pack.c:1324 +#: builtin/index-pack.c:1325 msgid "cannot store index file" msgstr "æ— æ³•å˜å‚¨ç´¢å¼•文件" -#: builtin/index-pack.c:1357 +#: builtin/index-pack.c:1358 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "åçš„ pack.indexversion=%<PRIu32>" -#: builtin/index-pack.c:1363 +#: builtin/index-pack.c:1364 #, c-format msgid "invalid number of threads specified (%d)" msgstr "æŒ‡å®šçš„çº¿ç¨‹æ•°æ— æ•ˆï¼ˆ%d)" -#: builtin/index-pack.c:1367 builtin/index-pack.c:1545 +#: builtin/index-pack.c:1368 builtin/index-pack.c:1546 #, c-format msgid "no threads support, ignoring %s" msgstr "没有线程支æŒï¼Œå¿½ç•¥ %s" -#: builtin/index-pack.c:1425 +#: builtin/index-pack.c:1426 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "æ— æ³•æ‰“å¼€çŽ°å˜åŒ…文件 '%s'" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1428 #, c-format msgid "Cannot open existing pack idx file for '%s'" msgstr "æ— æ³•ä¸º %s 打开包索引文件" -#: builtin/index-pack.c:1474 +#: builtin/index-pack.c:1475 #, 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:1481 +#: builtin/index-pack.c:1482 #, 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:1509 +#: builtin/index-pack.c:1510 msgid "Cannot come back to cwd" msgstr "æ— æ³•è¿”å›žå½“å‰å·¥ä½œç›®å½•" -#: builtin/index-pack.c:1557 builtin/index-pack.c:1560 -#: builtin/index-pack.c:1572 builtin/index-pack.c:1576 +#: builtin/index-pack.c:1558 builtin/index-pack.c:1561 +#: builtin/index-pack.c:1573 builtin/index-pack.c:1577 #, c-format msgid "bad %s" msgstr "错误选项 %s" -#: builtin/index-pack.c:1590 +#: builtin/index-pack.c:1591 msgid "--fix-thin cannot be used without --stdin" msgstr "--fix-thin ä¸èƒ½å’Œ --stdin åŒæ—¶ä½¿ç”¨" -#: builtin/index-pack.c:1594 builtin/index-pack.c:1604 +#: builtin/index-pack.c:1595 builtin/index-pack.c:1605 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "包å '%s' 没有以 '.pack' 结尾" -#: builtin/index-pack.c:1613 +#: builtin/index-pack.c:1614 msgid "--verify with no packfile name given" msgstr "--verify 没有æä¾›åŒ…å傿•°" @@ -5919,11 +6165,6 @@ msgstr "ä¸èƒ½å¤„ç† %d 类型的文件" msgid "unable to move %s to %s" msgstr "ä¸èƒ½ç§»åЍ %s 至 %s" -#: builtin/init-db.c:363 -#, c-format -msgid "Could not create git link %s" -msgstr "ä¸èƒ½åˆ›å»º git link %s" - #. #. * TRANSLATORS: The first '%s' is either "Reinitialized #. * existing" or "Initialized empty", the second " shared" or @@ -5967,21 +6208,21 @@ msgstr "æƒé™" msgid "specify that the git repository is to be shared amongst several users" msgstr "指定 git 版本库是多个用户之间共享的" -#: builtin/init-db.c:493 builtin/prune-packed.c:75 +#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155 msgid "be quiet" msgstr "ä¿æŒå®‰é™" -#: builtin/init-db.c:522 builtin/init-db.c:529 +#: builtin/init-db.c:525 builtin/init-db.c:530 #, c-format msgid "cannot mkdir %s" msgstr "ä¸èƒ½åˆ›å»ºç›®å½• %s" -#: builtin/init-db.c:533 +#: builtin/init-db.c:534 #, c-format msgid "cannot chdir to %s" msgstr "ä¸èƒ½åˆ‡æ¢ç›®å½•到 %s" -#: builtin/init-db.c:555 +#: builtin/init-db.c:556 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -5990,11 +6231,11 @@ msgstr "" "ä¸å…许 %s(或 --work-tree=<directory>)而没有指定 %s(或 --git-" "dir=<directory>)" -#: builtin/init-db.c:579 +#: builtin/init-db.c:580 msgid "Cannot access current working directory" msgstr "ä¸èƒ½è®¿é—®å½“å‰å·¥ä½œç›®å½•" -#: builtin/init-db.c:586 +#: builtin/init-db.c:587 #, c-format msgid "Cannot access work tree '%s'" msgstr "ä¸èƒ½è®¿é—®å·¥ä½œåŒº '%s'" @@ -6007,381 +6248,381 @@ msgstr "git log [<选项>] [<版本范围>] [[--] <路径>...]\n" msgid " or: git show [options] <object>..." msgstr " 或者:git show [选项] <对象>..." -#: builtin/log.c:124 +#: builtin/log.c:125 msgid "suppress diff output" msgstr "䏿˜¾ç¤ºå·®å¼‚输出" -#: builtin/log.c:125 +#: builtin/log.c:126 msgid "show source" msgstr "显示æº" -#: builtin/log.c:126 +#: builtin/log.c:127 msgid "Use mail map file" msgstr "ä½¿ç”¨é‚®ä»¶æ˜ å°„æ–‡ä»¶" -#: builtin/log.c:127 +#: builtin/log.c:128 msgid "decorate options" msgstr "修饰选项" -#: builtin/log.c:230 +#: builtin/log.c:231 #, c-format msgid "Final output: %d %s\n" msgstr "最终输出:%d %s\n" -#: builtin/log.c:453 builtin/log.c:545 +#: builtin/log.c:473 builtin/log.c:565 #, c-format msgid "Could not read object %s" msgstr "ä¸èƒ½è¯»å–对象 %s" -#: builtin/log.c:569 +#: builtin/log.c:589 #, c-format msgid "Unknown type: %d" msgstr "未知类型:%d" -#: builtin/log.c:669 +#: builtin/log.c:689 msgid "format.headers without value" msgstr "format.headers 没有值" -#: builtin/log.c:751 +#: builtin/log.c:771 msgid "name of output directory is too long" msgstr "输出目录å太长" -#: builtin/log.c:767 +#: builtin/log.c:787 #, c-format msgid "Cannot open patch file %s" msgstr "æ— æ³•æ‰“å¼€è¡¥ä¸æ–‡ä»¶ %s" -#: builtin/log.c:781 +#: builtin/log.c:801 msgid "Need exactly one range." msgstr "åªéœ€è¦ä¸€ä¸ªèŒƒå›´ã€‚" -#: builtin/log.c:789 +#: builtin/log.c:809 msgid "Not a range." msgstr "䏿˜¯ä¸€ä¸ªèŒƒå›´ã€‚" -#: builtin/log.c:891 +#: builtin/log.c:911 msgid "Cover letter needs email format" msgstr "ä¿¡å°éœ€è¦é‚®ä»¶åœ°å€æ ¼å¼" -#: builtin/log.c:967 +#: builtin/log.c:987 #, c-format msgid "insane in-reply-to: %s" msgstr "䏿£å¸¸çš„ in-reply-to:%s" -#: builtin/log.c:995 +#: builtin/log.c:1015 msgid "git format-patch [options] [<since> | <revision range>]" msgstr "git format-patch [选项] [<从> | <修订集范围>]" -#: builtin/log.c:1040 +#: builtin/log.c:1060 msgid "Two output directories?" msgstr "两个输出目录?" -#: builtin/log.c:1155 +#: builtin/log.c:1175 msgid "use [PATCH n/m] even with a single patch" msgstr "使用 [PATCH n/m],å³ä½¿åªæœ‰ä¸€ä¸ªè¡¥ä¸" -#: builtin/log.c:1158 +#: builtin/log.c:1178 msgid "use [PATCH] even with multiple patches" msgstr "使用 [PATCH],å³ä½¿æœ‰å¤šä¸ªè¡¥ä¸" -#: builtin/log.c:1162 +#: builtin/log.c:1182 msgid "print patches to standard out" msgstr "打å°è¡¥ä¸åˆ°æ ‡å‡†è¾“出" -#: builtin/log.c:1164 +#: builtin/log.c:1184 msgid "generate a cover letter" msgstr "生æˆä¸€å°é™„ä¿¡" -#: builtin/log.c:1166 +#: builtin/log.c:1186 msgid "use simple number sequence for output file names" msgstr "使用简å•的数å—åºåˆ—作为输出文件å" -#: builtin/log.c:1167 +#: builtin/log.c:1187 msgid "sfx" msgstr "åŽç¼€" -#: builtin/log.c:1168 +#: builtin/log.c:1188 msgid "use <sfx> instead of '.patch'" msgstr "使用 <åŽç¼€> 代替 '.patch'" -#: builtin/log.c:1170 +#: builtin/log.c:1190 msgid "start numbering patches at <n> instead of 1" msgstr "è¡¥ä¸ä»¥ <n> 开始编å·ï¼Œè€Œä¸æ˜¯1" -#: builtin/log.c:1172 +#: builtin/log.c:1192 msgid "mark the series as Nth re-roll" msgstr "æ ‡è®°è¡¥ä¸ç³»åˆ—æ˜¯ç¬¬å‡ æ¬¡é‡åˆ¶" -#: builtin/log.c:1174 +#: builtin/log.c:1194 msgid "Use [<prefix>] instead of [PATCH]" msgstr "使用 [<å‰ç¼€>] 代替 [PATCH]" -#: builtin/log.c:1177 +#: builtin/log.c:1197 msgid "store resulting files in <dir>" msgstr "把结果文件å˜å‚¨åœ¨ <dir>" -#: builtin/log.c:1180 +#: builtin/log.c:1200 msgid "don't strip/add [PATCH]" msgstr "ä¸åˆ 除/æ·»åŠ [PATCH]" -#: builtin/log.c:1183 +#: builtin/log.c:1203 msgid "don't output binary diffs" msgstr "ä¸è¾“出二进制差异" -#: builtin/log.c:1185 +#: builtin/log.c:1205 msgid "don't include a patch matching a commit upstream" msgstr "ä¸åŒ…å«å·²åœ¨ä¸Šæ¸¸æäº¤ä¸çš„è¡¥ä¸" -#: builtin/log.c:1187 +#: builtin/log.c:1207 msgid "show patch format instead of default (patch + stat)" msgstr "æ˜¾ç¤ºçº¯è¡¥ä¸æ ¼å¼è€Œéžé»˜è®¤çš„(补ä¸+状æ€ï¼‰" -#: builtin/log.c:1189 +#: builtin/log.c:1209 msgid "Messaging" msgstr "邮件å‘é€" -#: builtin/log.c:1190 +#: builtin/log.c:1210 msgid "header" msgstr "header" -#: builtin/log.c:1191 +#: builtin/log.c:1211 msgid "add email header" msgstr "æ·»åŠ é‚®ä»¶å¤´" -#: builtin/log.c:1192 builtin/log.c:1194 +#: builtin/log.c:1212 builtin/log.c:1214 msgid "email" msgstr "邮件地å€" -#: builtin/log.c:1192 +#: builtin/log.c:1212 msgid "add To: header" msgstr "æ·»åŠ æ”¶ä»¶äºº" -#: builtin/log.c:1194 +#: builtin/log.c:1214 msgid "add Cc: header" msgstr "æ·»åŠ æŠ„é€" -#: builtin/log.c:1196 +#: builtin/log.c:1216 msgid "ident" msgstr "ident" -#: builtin/log.c:1197 +#: builtin/log.c:1217 msgid "set From address to <ident> (or committer ident if absent)" msgstr "设置 From 地å€ä¸º <ident>ï¼ˆå¦‚è‹¥ä¸æä¾›ï¼Œç”¨æäº¤è€…IDåšä¸ºåœ°å€ï¼‰" -#: builtin/log.c:1199 +#: builtin/log.c:1219 msgid "message-id" msgstr "message-id" -#: builtin/log.c:1200 +#: builtin/log.c:1220 msgid "make first mail a reply to <message-id>" msgstr "使第一å°é‚®ä»¶ä½œä¸ºå¯¹ <message-id> 的回å¤" -#: builtin/log.c:1201 builtin/log.c:1204 +#: builtin/log.c:1221 builtin/log.c:1224 msgid "boundary" msgstr "边界" -#: builtin/log.c:1202 +#: builtin/log.c:1222 msgid "attach the patch" msgstr "é™„ä»¶æ–¹å¼æ·»åŠ è¡¥ä¸" -#: builtin/log.c:1205 +#: builtin/log.c:1225 msgid "inline the patch" msgstr "å†…è”æ˜¾ç¤ºè¡¥ä¸" -#: builtin/log.c:1209 +#: builtin/log.c:1229 msgid "enable message threading, styles: shallow, deep" msgstr "å¯ç”¨é‚®ä»¶çº¿ç´¢ï¼Œé£Žæ ¼ï¼šæµ…,深" -#: builtin/log.c:1211 +#: builtin/log.c:1231 msgid "signature" msgstr "ç¾å" -#: builtin/log.c:1212 +#: builtin/log.c:1232 msgid "add a signature" msgstr "æ·»åŠ ä¸€ä¸ªç¾å" -#: builtin/log.c:1214 +#: builtin/log.c:1233 msgid "don't print the patch filenames" msgstr "ä¸è¦æ‰“å°è¡¥ä¸æ–‡ä»¶å" -#: builtin/log.c:1288 +#: builtin/log.c:1307 #, c-format msgid "invalid ident line: %s" msgstr "åŒ…å«æ— æ•ˆçš„èº«ä»½æ ‡è¯†ï¼š%s" -#: builtin/log.c:1303 +#: builtin/log.c:1322 msgid "-n and -k are mutually exclusive." msgstr "-n å’Œ -k 互斥。" -#: builtin/log.c:1305 +#: builtin/log.c:1324 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix å’Œ -k 互斥。" -#: builtin/log.c:1313 +#: builtin/log.c:1332 msgid "--name-only does not make sense" msgstr "--name-only æ— æ„义" -#: builtin/log.c:1315 +#: builtin/log.c:1334 msgid "--name-status does not make sense" msgstr "--name-status æ— æ„义" -#: builtin/log.c:1317 +#: builtin/log.c:1336 msgid "--check does not make sense" msgstr "--check æ— æ„义" -#: builtin/log.c:1340 +#: builtin/log.c:1359 msgid "standard output, or directory, which one?" msgstr "æ ‡å‡†è¾“å‡ºæˆ–ç›®å½•ï¼Œå“ªä¸€ä¸ªï¼Ÿ" -#: builtin/log.c:1342 +#: builtin/log.c:1361 #, c-format msgid "Could not create directory '%s'" msgstr "ä¸èƒ½åˆ›å»ºç›®å½• '%s'" -#: builtin/log.c:1490 +#: builtin/log.c:1509 msgid "Failed to create output files" msgstr "æ— æ³•åˆ›å»ºè¾“å‡ºæ–‡ä»¶" -#: builtin/log.c:1539 +#: builtin/log.c:1558 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<上游> [<头> [<é™åˆ¶>]]]" -#: builtin/log.c:1594 +#: builtin/log.c:1613 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "ä¸èƒ½æ‰¾åˆ°è·Ÿè¸ªçš„远程分支,请手工指定 <upstream>。\n" -#: builtin/log.c:1607 builtin/log.c:1609 builtin/log.c:1621 +#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640 #, c-format msgid "Unknown commit %s" msgstr "未知æäº¤ %s" -#: builtin/ls-files.c:408 +#: builtin/ls-files.c:398 msgid "git ls-files [options] [<file>...]" msgstr "git ls-files [选项] [<文件>...]" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:455 msgid "identify the file status with tags" msgstr "ç”¨æ ‡ç¾æ ‡è¯†æ–‡ä»¶çš„状æ€" -#: builtin/ls-files.c:467 +#: builtin/ls-files.c:457 msgid "use lowercase letters for 'assume unchanged' files" msgstr "使用å°å†™å—æ¯è¡¨ç¤º 'å‡è®¾æœªæ”¹å˜çš„' 文件" -#: builtin/ls-files.c:469 +#: builtin/ls-files.c:459 msgid "show cached files in the output (default)" msgstr "显示缓å˜çš„æ–‡ä»¶ï¼ˆé»˜è®¤ï¼‰" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:461 msgid "show deleted files in the output" msgstr "æ˜¾ç¤ºå·²åˆ é™¤çš„æ–‡ä»¶" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:463 msgid "show modified files in the output" msgstr "显示已修改的文件" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:465 msgid "show other files in the output" msgstr "显示其它文件" -#: builtin/ls-files.c:477 +#: builtin/ls-files.c:467 msgid "show ignored files in the output" msgstr "显示忽略的文件" -#: builtin/ls-files.c:480 +#: builtin/ls-files.c:470 msgid "show staged contents' object name in the output" msgstr "显示暂å˜åŒºå†…容的对象åç§°" -#: builtin/ls-files.c:482 +#: builtin/ls-files.c:472 msgid "show files on the filesystem that need to be removed" msgstr "显示文件系统需è¦åˆ 除的文件" -#: builtin/ls-files.c:484 +#: builtin/ls-files.c:474 msgid "show 'other' directories' name only" msgstr "åªæ˜¾ç¤ºâ€œå…¶ä»–â€ç›®å½•çš„åç§°" -#: builtin/ls-files.c:487 +#: builtin/ls-files.c:477 msgid "don't show empty directories" msgstr "䏿˜¾ç¤ºç©ºç›®å½•" -#: builtin/ls-files.c:490 +#: builtin/ls-files.c:480 msgid "show unmerged files in the output" msgstr "显示未åˆå¹¶çš„æ–‡ä»¶" -#: builtin/ls-files.c:492 +#: builtin/ls-files.c:482 msgid "show resolve-undo information" msgstr "显示 resolve-undo ä¿¡æ¯" -#: builtin/ls-files.c:494 +#: builtin/ls-files.c:484 msgid "skip files matching pattern" msgstr "åŒ¹é…æŽ’é™¤æ–‡ä»¶çš„æ¨¡å¼" -#: builtin/ls-files.c:497 +#: builtin/ls-files.c:487 msgid "exclude patterns are read from <file>" msgstr "从 <文件> ä¸è¯»å–排除模å¼" -#: builtin/ls-files.c:500 +#: builtin/ls-files.c:490 msgid "read additional per-directory exclude patterns in <file>" msgstr "从 <文件> 读å–é¢å¤–çš„æ¯ä¸ªç›®å½•的排除模å¼" -#: builtin/ls-files.c:502 +#: builtin/ls-files.c:492 msgid "add the standard git exclusions" msgstr "æ·»åŠ æ ‡å‡†çš„ git 排除" -#: builtin/ls-files.c:505 +#: builtin/ls-files.c:495 msgid "make the output relative to the project top directory" msgstr "显示相对于顶级目录的文件å" -#: builtin/ls-files.c:508 +#: builtin/ls-files.c:498 msgid "if any <file> is not in the index, treat this as an error" msgstr "如果任何 <文件> 都ä¸åœ¨ç´¢å¼•区,视为错误" -#: builtin/ls-files.c:509 +#: builtin/ls-files.c:499 msgid "tree-ish" msgstr "æ ‘æˆ–æäº¤" -#: builtin/ls-files.c:510 +#: builtin/ls-files.c:500 msgid "pretend that paths removed since <tree-ish> are still present" msgstr "å‡è£…自从 <æ ‘æˆ–æäº¤> 之åŽåˆ 除的路径ä»ç„¶å˜åœ¨" -#: builtin/ls-files.c:512 +#: builtin/ls-files.c:502 msgid "show debugging data" msgstr "显示调试数æ®" -#: builtin/ls-tree.c:27 +#: builtin/ls-tree.c:28 msgid "git ls-tree [<options>] <tree-ish> [<path>...]" msgstr "git ls-tree [<选项>] <æ ‘æˆ–æäº¤> [<路径>...]" -#: builtin/ls-tree.c:125 +#: builtin/ls-tree.c:126 msgid "only show trees" msgstr "åªæ˜¾ç¤ºæ ‘" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "recurse into subtrees" msgstr "é€’å½’åˆ°åæ ‘" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "show trees when recursing" msgstr "å½“é€’å½’æ—¶æ˜¾ç¤ºæ ‘" -#: builtin/ls-tree.c:132 +#: builtin/ls-tree.c:133 msgid "terminate entries with NUL byte" msgstr "æ¡ç›®ä»¥NULå—符终æ¢" -#: builtin/ls-tree.c:133 +#: builtin/ls-tree.c:134 msgid "include object size" msgstr "包括对象大å°" -#: builtin/ls-tree.c:135 builtin/ls-tree.c:137 +#: builtin/ls-tree.c:136 builtin/ls-tree.c:138 msgid "list only filenames" msgstr "åªåˆ—出文件å" -#: builtin/ls-tree.c:140 +#: builtin/ls-tree.c:141 msgid "use full path names" msgstr "使用文件的全路径" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "åˆ—å‡ºæ•´ä¸ªæ ‘ï¼›ä¸ä»…仅当å‰ç›®å½•(éšå« --full-name)" @@ -6416,149 +6657,149 @@ msgstr "å¯ç”¨çš„ç–略有:" msgid "Available custom strategies are:" msgstr "å¯ç”¨çš„自定义ç–略有:" -#: builtin/merge.c:198 +#: builtin/merge.c:191 msgid "do not show a diffstat at the end of the merge" msgstr "在åˆå¹¶çš„æœ€åŽä¸æ˜¾ç¤ºå·®å¼‚统计" -#: builtin/merge.c:201 +#: builtin/merge.c:194 msgid "show a diffstat at the end of the merge" msgstr "在åˆå¹¶çš„æœ€åŽæ˜¾ç¤ºå·®å¼‚统计" -#: builtin/merge.c:202 +#: builtin/merge.c:195 msgid "(synonym to --stat)" msgstr "(和 --stat åŒä¹‰ï¼‰" -#: builtin/merge.c:204 +#: builtin/merge.c:197 msgid "add (at most <n>) entries from shortlog to merge commit message" msgstr "在åˆå¹¶æäº¤ä¿¡æ¯ä¸æ·»åŠ ï¼ˆæœ€å¤š <n> æ¡ï¼‰ç²¾ç®€æäº¤è®°å½•" -#: builtin/merge.c:207 +#: builtin/merge.c:200 msgid "create a single commit instead of doing a merge" msgstr "创建一个å•独的æäº¤è€Œä¸æ˜¯åšä¸€æ¬¡åˆå¹¶" -#: builtin/merge.c:209 +#: builtin/merge.c:202 msgid "perform a commit if the merge succeeds (default)" msgstr "如果åˆå¹¶æˆåŠŸï¼Œæ‰§è¡Œä¸€æ¬¡æäº¤ï¼ˆé»˜è®¤ï¼‰" -#: builtin/merge.c:211 +#: builtin/merge.c:204 msgid "edit message before committing" msgstr "在æäº¤å‰ç¼–辑æäº¤è¯´æ˜Ž" -#: builtin/merge.c:212 +#: builtin/merge.c:205 msgid "allow fast-forward (default)" msgstr "å…许快进(默认)" -#: builtin/merge.c:214 +#: builtin/merge.c:207 msgid "abort if fast-forward is not possible" msgstr "如果ä¸èƒ½å¿«è¿›å°±æ”¾å¼ƒåˆå¹¶" -#: builtin/merge.c:218 +#: builtin/merge.c:211 msgid "Verify that the named commit has a valid GPG signature" msgstr "éªŒè¯æŒ‡å®šçš„æäº¤æ˜¯å¦åŒ…å«ä¸€ä¸ªæœ‰æ•ˆçš„ GPG ç¾å" -#: builtin/merge.c:219 builtin/notes.c:738 builtin/revert.c:114 +#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89 msgid "strategy" msgstr "ç–ç•¥" -#: builtin/merge.c:220 +#: builtin/merge.c:213 msgid "merge strategy to use" msgstr "è¦ä½¿ç”¨çš„åˆå¹¶ç–ç•¥" -#: builtin/merge.c:221 +#: builtin/merge.c:214 msgid "option=value" msgstr "option=value" -#: builtin/merge.c:222 +#: builtin/merge.c:215 msgid "option for selected merge strategy" msgstr "所选的åˆå¹¶ç–略的选项" -#: builtin/merge.c:224 +#: builtin/merge.c:217 msgid "merge commit message (for a non-fast-forward merge)" msgstr "åˆå¹¶çš„æäº¤è¯´æ˜Žï¼ˆé’ˆå¯¹éžå¿«è¿›å¼åˆå¹¶ï¼‰" -#: builtin/merge.c:228 +#: builtin/merge.c:221 msgid "abort the current in-progress merge" msgstr "æ”¾å¼ƒå½“å‰æ£åœ¨è¿›è¡Œçš„åˆå¹¶" -#: builtin/merge.c:257 +#: builtin/merge.c:250 msgid "could not run stash." msgstr "ä¸èƒ½è¿›è¡Œè¿›åº¦ä¿å˜ã€‚" -#: builtin/merge.c:262 +#: builtin/merge.c:255 msgid "stash failed" msgstr "进度ä¿å˜å¤±è´¥" -#: builtin/merge.c:267 +#: builtin/merge.c:260 #, c-format msgid "not a valid object: %s" msgstr "䏿˜¯ä¸€ä¸ªæœ‰æ•ˆå¯¹è±¡ï¼š%s" -#: builtin/merge.c:286 builtin/merge.c:303 +#: builtin/merge.c:279 builtin/merge.c:296 msgid "read-tree failed" msgstr "è¯»å–æ ‘失败" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/merge.c:333 +#: builtin/merge.c:326 msgid " (nothing to squash)" msgstr " ï¼ˆæ— å¯åŽ‹ç¼©ï¼‰" -#: builtin/merge.c:346 +#: builtin/merge.c:339 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "压缩æäº¤ -- 未更新 HEAD\n" -#: builtin/merge.c:378 +#: builtin/merge.c:371 msgid "Writing SQUASH_MSG" msgstr "写入 SQUASH_MSG" -#: builtin/merge.c:380 +#: builtin/merge.c:373 msgid "Finishing SQUASH_MSG" msgstr "å®Œæˆ SQUASH_MSG" -#: builtin/merge.c:403 +#: builtin/merge.c:396 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "æ— åˆå¹¶ä¿¡æ¯ -- 未更新 HEAD\n" -#: builtin/merge.c:453 +#: builtin/merge.c:446 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' 没有指å‘一个æäº¤" -#: builtin/merge.c:565 +#: builtin/merge.c:558 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "åçš„ branch.%s.mergeoptions å—符串:%s" -#: builtin/merge.c:657 +#: builtin/merge.c:650 msgid "git write-tree failed to write a tree" msgstr "git write-tree æ— æ³•å†™å…¥ä¸€æ ‘å¯¹è±¡" -#: builtin/merge.c:685 +#: builtin/merge.c:678 msgid "Not handling anything other than two heads merge." msgstr "ä¸èƒ½å¤„ç†ä¸¤ä¸ªå¤´åˆå¹¶ä¹‹å¤–的任何æ“作。" -#: builtin/merge.c:699 +#: builtin/merge.c:692 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "merge-recursive 的未知选项:-X%s" -#: builtin/merge.c:713 +#: builtin/merge.c:706 #, c-format msgid "unable to write %s" msgstr "ä¸èƒ½å†™ %s" -#: builtin/merge.c:802 +#: builtin/merge.c:795 #, c-format msgid "Could not read from '%s'" msgstr "ä¸èƒ½ä»Ž '%s' 读å–" -#: builtin/merge.c:811 +#: builtin/merge.c:804 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "未æäº¤åˆå¹¶ï¼Œä½¿ç”¨ 'git commit' å®Œæˆæ¤æ¬¡åˆå¹¶ã€‚\n" -#: builtin/merge.c:817 +#: builtin/merge.c:810 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -6572,47 +6813,47 @@ msgstr "" "\n" "以 '%c' 开头的行将被忽略,而且空æäº¤è¯´æ˜Žå°†ä¼šç»ˆæ¢æäº¤ã€‚\n" -#: builtin/merge.c:841 +#: builtin/merge.c:834 msgid "Empty commit message." msgstr "空æäº¤ä¿¡æ¯ã€‚" -#: builtin/merge.c:853 +#: builtin/merge.c:846 #, c-format msgid "Wonderful.\n" msgstr "太棒了。\n" -#: builtin/merge.c:918 +#: builtin/merge.c:911 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "自动åˆå¹¶å¤±è´¥ï¼Œä¿®æ£å†²çªç„¶åŽæäº¤ä¿®æ£çš„结果。\n" -#: builtin/merge.c:934 +#: builtin/merge.c:927 #, c-format msgid "'%s' is not a commit" msgstr "'%s' 䏿˜¯ä¸€ä¸ªæäº¤" -#: builtin/merge.c:975 +#: builtin/merge.c:968 msgid "No current branch." msgstr "没有当å‰åˆ†æ”¯ã€‚" -#: builtin/merge.c:977 +#: builtin/merge.c:970 msgid "No remote for the current branch." msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å¯¹åº”的远程版本库。" -#: builtin/merge.c:979 +#: builtin/merge.c:972 msgid "No default upstream defined for the current branch." msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å®šä¹‰é»˜è®¤çš„上游分支。" -#: builtin/merge.c:984 +#: builtin/merge.c:977 #, c-format msgid "No remote-tracking branch for %s from %s" msgstr "对于 %s 没有æ¥è‡ª %s 的远程跟踪分支" -#: builtin/merge.c:1140 +#: builtin/merge.c:1133 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "没有è¦ç»ˆæ¢çš„åˆå¹¶ï¼ˆMERGE_HEAD 丢失)。" -#: builtin/merge.c:1156 git-pull.sh:31 +#: builtin/merge.c:1149 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6620,11 +6861,11 @@ msgstr "" "æ‚¨å°šæœªç»“æŸæ‚¨çš„åˆå¹¶ï¼ˆå˜åœ¨ MERGE_HEAD)。\n" "请在åˆå¹¶å‰å…ˆæäº¤æ‚¨çš„修改。" -#: builtin/merge.c:1159 git-pull.sh:34 +#: builtin/merge.c:1152 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "æ‚¨å°šæœªç»“æŸæ‚¨çš„åˆå¹¶ï¼ˆå˜åœ¨ MERGE_HEAD)。" -#: builtin/merge.c:1163 +#: builtin/merge.c:1156 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -6632,137 +6873,145 @@ msgstr "" "æ‚¨å°šæœªç»“æŸæ‚¨çš„æ‹£é€‰ï¼ˆå˜åœ¨ CHERRY_PICK_HEAD)。\n" "请在åˆå¹¶å‰å…ˆæäº¤æ‚¨çš„修改。" -#: builtin/merge.c:1166 +#: builtin/merge.c:1159 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "æ‚¨å°šæœªç»“æŸæ‚¨çš„æ‹£é€‰ï¼ˆå˜åœ¨ CHERRY_PICK_HEAD)。" -#: builtin/merge.c:1175 +#: builtin/merge.c:1168 msgid "You cannot combine --squash with --no-ff." msgstr "您ä¸èƒ½å°† --squash 与 --no-ff åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/merge.c:1184 +#: builtin/merge.c:1177 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "未指定æäº¤å¹¶ä¸” merge.defaultToUpstream 未设置。" -#: builtin/merge.c:1216 +#: builtin/merge.c:1209 msgid "Can merge only exactly one commit into empty head" msgstr "åªèƒ½å°†ä¸€ä¸ªæäº¤åˆå¹¶åˆ°ç©ºåˆ†æ”¯ä¸Š" -#: builtin/merge.c:1219 +#: builtin/merge.c:1212 msgid "Squash commit into empty head not supported yet" msgstr "å°šä¸æ”¯æŒåˆ°ç©ºåˆ†æ”¯çš„压缩æäº¤" -#: builtin/merge.c:1221 +#: builtin/merge.c:1214 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "到空分支的éžå¿«è¿›å¼æäº¤æ²¡æœ‰æ„义" -#: builtin/merge.c:1226 +#: builtin/merge.c:1219 #, c-format msgid "%s - not something we can merge" msgstr "%s - ä¸èƒ½è¢«åˆå¹¶" -#: builtin/merge.c:1277 +#: builtin/merge.c:1270 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "æäº¤ %s 有一个éžå¯ä¿¡çš„声称æ¥è‡ª %s çš„ GPG ç¾å。" -#: builtin/merge.c:1280 +#: builtin/merge.c:1273 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "æäº¤ %s 有一个错误的声称æ¥è‡ª %s çš„ GPG ç¾å。" #. 'N' -#: builtin/merge.c:1283 +#: builtin/merge.c:1276 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "æäº¤ %s 没有一个 GPG ç¾å。" -#: builtin/merge.c:1286 +#: builtin/merge.c:1279 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "æäº¤ %s 有一个æ¥è‡ª %s 的好的 GPG ç¾å。\n" -#: builtin/merge.c:1370 +#: builtin/merge.c:1363 #, c-format msgid "Updating %s..%s\n" msgstr "æ›´æ–° %s..%s\n" -#: builtin/merge.c:1409 +#: builtin/merge.c:1402 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "å°è¯•éžå¸¸å°çš„索引内åˆå¹¶...\n" -#: builtin/merge.c:1416 +#: builtin/merge.c:1409 #, c-format msgid "Nope.\n" msgstr "æ— ã€‚\n" -#: builtin/merge.c:1448 +#: builtin/merge.c:1441 msgid "Not possible to fast-forward, aborting." msgstr "æ— æ³•å¿«è¿›ï¼Œç»ˆæ¢ã€‚" -#: builtin/merge.c:1471 builtin/merge.c:1550 +#: builtin/merge.c:1464 builtin/merge.c:1543 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "å°†æ ‘å›žæ»šè‡³åŽŸå§‹çŠ¶æ€...\n" -#: builtin/merge.c:1475 +#: builtin/merge.c:1468 #, c-format msgid "Trying merge strategy %s...\n" msgstr "å°è¯•åˆå¹¶ç–ç•¥ %s...\n" -#: builtin/merge.c:1541 +#: builtin/merge.c:1534 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "没有åˆå¹¶ç–ç•¥å¤„ç†æ¤åˆå¹¶ã€‚\n" -#: builtin/merge.c:1543 +#: builtin/merge.c:1536 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "使用ç–ç•¥ %s åˆå¹¶å¤±è´¥ã€‚\n" -#: builtin/merge.c:1552 +#: builtin/merge.c:1545 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "使用 %s 以准备手工解决。\n" -#: builtin/merge.c:1564 +#: builtin/merge.c:1557 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "自动åˆå¹¶è¿›å±•é¡ºåˆ©ï¼ŒæŒ‰è¦æ±‚在æäº¤å‰åœæ¢\n" -#: builtin/merge-base.c:26 +#: builtin/merge-base.c:29 msgid "git merge-base [-a|--all] <commit> <commit>..." msgstr "git merge-base [-a|--all] <æäº¤> <æäº¤>..." -#: builtin/merge-base.c:27 +#: builtin/merge-base.c:30 msgid "git merge-base [-a|--all] --octopus <commit>..." msgstr "git merge-base [-a|--all] --octopus <æäº¤>..." -#: builtin/merge-base.c:28 +#: builtin/merge-base.c:31 msgid "git merge-base --independent <commit>..." msgstr "git merge-base --independent <æäº¤>..." -#: builtin/merge-base.c:29 +#: builtin/merge-base.c:32 msgid "git merge-base --is-ancestor <commit> <commit>" msgstr "git merge-base --is-ancestor <æäº¤> <æäº¤>" -#: builtin/merge-base.c:98 +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <æäº¤> [<æäº¤>]" + +#: builtin/merge-base.c:214 msgid "output all common ancestors" msgstr "输出所有共åŒçš„祖先" -#: builtin/merge-base.c:99 +#: builtin/merge-base.c:216 msgid "find ancestors for a single n-way merge" msgstr "查找一个多路åˆå¹¶çš„祖先æäº¤" -#: builtin/merge-base.c:100 +#: builtin/merge-base.c:218 msgid "list revs not reachable from others" msgstr "显示ä¸èƒ½è¢«å…¶ä»–访问到的版本" -#: builtin/merge-base.c:102 +#: builtin/merge-base.c:220 msgid "is the first one ancestor of the other?" msgstr "第一个是其他的祖先æäº¤ä¹ˆï¼Ÿ" +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "查找 <commit> 从<引用>日志的何处分支的" + #: builtin/merge-file.c:8 msgid "" "git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file " @@ -6818,117 +7067,130 @@ msgstr "å…许丢失的对象" msgid "allow creation of more than one tree" msgstr "å…è®¸åˆ›å»ºä¸€ä¸ªä»¥ä¸Šçš„æ ‘" -#: builtin/mv.c:14 +#: builtin/mv.c:15 msgid "git mv [options] <source>... <destination>" msgstr "git mv [选项] <æº>... <ç›®æ ‡>" -#: builtin/mv.c:64 +#: builtin/mv.c:71 msgid "force move/rename even if target exists" msgstr "强制移动/é‡å‘½ä»¤ï¼Œå³ä½¿ç›®æ ‡å˜åœ¨" -#: builtin/mv.c:65 +#: builtin/mv.c:72 msgid "skip move/rename errors" msgstr "跳过移动/é‡å‘½å错误" -#: builtin/mv.c:108 +#: builtin/mv.c:122 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "检查 '%s' 到 '%s' çš„é‡å‘½å\n" -#: builtin/mv.c:112 +#: builtin/mv.c:126 msgid "bad source" msgstr "åçš„æº" -#: builtin/mv.c:115 +#: builtin/mv.c:129 msgid "can not move directory into itself" msgstr "ä¸èƒ½å°†ç›®å½•移动到自身" -#: builtin/mv.c:118 +#: builtin/mv.c:132 msgid "cannot move directory over file" msgstr "ä¸èƒ½å°†ç›®å½•移动到文件" -#: builtin/mv.c:128 +#: builtin/mv.c:138 +#, c-format +msgid "Huh? Directory %s is in index and no submodule?" +msgstr "嗯?目录 %s 在索引ä¸å¹¶ä¸”䏿˜¯å模组?" + +#: builtin/mv.c:140 builtin/rm.c:318 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "请将您的修改缓å˜åˆ° .gitmodules 䏿ˆ–ä¿å˜è¿›åº¦åŽå†ç»§ç»" + +#: builtin/mv.c:156 #, c-format msgid "Huh? %.*s is in index?" msgstr "嗯?%.*s 在索引ä¸ï¼Ÿ" -#: builtin/mv.c:140 +#: builtin/mv.c:168 msgid "source directory is empty" msgstr "æºç›®å½•为空" -#: builtin/mv.c:171 +#: builtin/mv.c:200 msgid "not under version control" msgstr "ä¸åœ¨ç‰ˆæœ¬æŽ§åˆ¶ä¹‹ä¸‹" -#: builtin/mv.c:173 +#: builtin/mv.c:202 msgid "destination exists" msgstr "ç›®æ ‡å·²å˜åœ¨" -#: builtin/mv.c:181 +#: builtin/mv.c:210 #, c-format msgid "overwriting '%s'" msgstr "覆盖 '%s'" -#: builtin/mv.c:184 +#: builtin/mv.c:213 msgid "Cannot overwrite" msgstr "ä¸èƒ½è¦†ç›–" -#: builtin/mv.c:187 +#: builtin/mv.c:216 msgid "multiple sources for the same target" msgstr "åŒä¸€ç›®æ ‡å…·æœ‰å¤šä¸ªæº" -#: builtin/mv.c:202 +#: builtin/mv.c:218 +msgid "destination directory does not exist" +msgstr "ç›®æ ‡ç›®å½•ä¸å˜åœ¨" + +#: builtin/mv.c:233 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s,æº=%sï¼Œç›®æ ‡=%s" -#: builtin/mv.c:212 +#: builtin/mv.c:243 #, c-format msgid "Renaming %s to %s\n" msgstr "é‡å‘½å %s 至 %s\n" -#: builtin/mv.c:215 builtin/remote.c:731 +#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328 #, c-format msgid "renaming '%s' failed" msgstr "é‡å‘½å '%s' 失败" -#: builtin/name-rev.c:259 +#: builtin/name-rev.c:258 msgid "git name-rev [options] <commit>..." msgstr "git name-rev [选项] <æäº¤>..." -#: builtin/name-rev.c:260 +#: builtin/name-rev.c:259 msgid "git name-rev [options] --all" msgstr "git name-rev [选项] --all" -#: builtin/name-rev.c:261 +#: builtin/name-rev.c:260 msgid "git name-rev [options] --stdin" msgstr "git name-rev [选项] --stdin" -#: builtin/name-rev.c:313 +#: builtin/name-rev.c:312 msgid "print only names (no SHA-1)" msgstr "åªæ‰“å°åç§°ï¼ˆæ— SHA-1)" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:313 msgid "only use tags to name the commits" msgstr "åªä½¿ç”¨ tags æ¥å‘½åæäº¤" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:315 msgid "only use refs matching <pattern>" msgstr "åªä½¿ç”¨å’Œ <模å¼> 相匹é…的引用" -#: builtin/name-rev.c:318 +#: builtin/name-rev.c:317 msgid "list all commits reachable from all refs" msgstr "列出å¯ä»¥ä»Žæ‰€æœ‰å¼•用访问的æäº¤" -#: builtin/name-rev.c:319 +#: builtin/name-rev.c:318 msgid "read from stdin" msgstr "ä»Žæ ‡å‡†è¾“å…¥è¯»å–" -#: builtin/name-rev.c:320 -msgid "allow to print `undefined` names" -msgstr "å…è®¸æ‰“å° `未定义` çš„åç§°" +#: builtin/name-rev.c:319 +msgid "allow to print `undefined` names (default)" +msgstr "å…è®¸æ‰“å° `未定义` çš„å称(默认)" -#: builtin/name-rev.c:326 +#: builtin/name-rev.c:325 msgid "dereference tags in the input (internal use)" msgstr "åå‘è§£æžè¾“å…¥ä¸çš„ tags(内部使用)" @@ -7078,12 +7340,12 @@ msgstr "ä¸èƒ½å†™æ³¨è§£å¯¹è±¡" msgid "The note contents has been left in %s" msgstr "注解内容被留在文件 %s ä¸" -#: builtin/notes.c:248 builtin/tag.c:540 +#: builtin/notes.c:248 builtin/tag.c:537 #, c-format msgid "cannot read '%s'" msgstr "ä¸èƒ½è¯»å– '%s'" -#: builtin/notes.c:250 builtin/tag.c:543 +#: builtin/notes.c:250 builtin/tag.c:540 #, c-format msgid "could not open or read '%s'" msgstr "ä¸èƒ½æ‰“å¼€æˆ–è¯»å– '%s'" @@ -7091,7 +7353,7 @@ msgstr "ä¸èƒ½æ‰“å¼€æˆ–è¯»å– '%s'" #: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318 #: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515 #: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637 -#: builtin/notes.c:839 builtin/tag.c:556 +#: builtin/notes.c:839 builtin/tag.c:553 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "æ— æ³•è§£æž '%s' 为一个有效引用。" @@ -7243,7 +7505,7 @@ msgstr "注解引用" msgid "use notes from <notes_ref>" msgstr "从 <注解引用> 使用注解" -#: builtin/notes.c:974 builtin/remote.c:1598 +#: builtin/notes.c:974 builtin/remote.c:1593 #, c-format msgid "Unknown subcommand: %s" msgstr "未知å命令:%s" @@ -7256,150 +7518,150 @@ msgstr "git pack-objects --stdout [选项...] [< 引用列表 | < 对象列表]" msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" msgstr "git pack-objects [选项...] base-name [< 引用列表 | < 对象列表]" -#: builtin/pack-objects.c:183 builtin/pack-objects.c:186 +#: builtin/pack-objects.c:184 builtin/pack-objects.c:187 #, c-format msgid "deflate error (%d)" msgstr "压缩错误 (%d)" -#: builtin/pack-objects.c:2397 +#: builtin/pack-objects.c:2396 #, c-format msgid "unsupported index version %s" msgstr "䏿”¯æŒçš„索引版本 %s" -#: builtin/pack-objects.c:2401 +#: builtin/pack-objects.c:2400 #, c-format msgid "bad index version '%s'" msgstr "å的索引版本 '%s'" -#: builtin/pack-objects.c:2424 +#: builtin/pack-objects.c:2423 #, c-format msgid "option %s does not accept negative form" msgstr "选项 %s 䏿ޥå—å¦å®šæ ¼å¼" -#: builtin/pack-objects.c:2428 +#: builtin/pack-objects.c:2427 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "ä¸èƒ½è§£æžé€‰é¡¹ %1$s 的值 '%2$s'" -#: builtin/pack-objects.c:2447 +#: builtin/pack-objects.c:2446 msgid "do not show progress meter" msgstr "䏿˜¾ç¤ºè¿›åº¦è¡¨" -#: builtin/pack-objects.c:2449 +#: builtin/pack-objects.c:2448 msgid "show progress meter" msgstr "显示进度表" -#: builtin/pack-objects.c:2451 +#: builtin/pack-objects.c:2450 msgid "show progress meter during object writing phase" msgstr "在对象写入阶段显示进度表" -#: builtin/pack-objects.c:2454 +#: builtin/pack-objects.c:2453 msgid "similar to --all-progress when progress meter is shown" msgstr "当进度表显示时类似于 --all-progress" -#: builtin/pack-objects.c:2455 +#: builtin/pack-objects.c:2454 msgid "version[,offset]" msgstr "版本[,åç§»]" -#: builtin/pack-objects.c:2456 +#: builtin/pack-objects.c:2455 msgid "write the pack index file in the specified idx format version" msgstr "用指定的 idx æ ¼å¼ç‰ˆæœ¬æ¥å†™åŒ…索引文件" -#: builtin/pack-objects.c:2459 +#: builtin/pack-objects.c:2458 msgid "maximum size of each output pack file" msgstr "æ¯ä¸ªè¾“出包的最大尺寸" -#: builtin/pack-objects.c:2461 +#: builtin/pack-objects.c:2460 msgid "ignore borrowed objects from alternate object store" msgstr "忽略从替代对象å˜å‚¨é‡Œå€Ÿç”¨å¯¹è±¡" -#: builtin/pack-objects.c:2463 +#: builtin/pack-objects.c:2462 msgid "ignore packed objects" msgstr "忽略包对象" -#: builtin/pack-objects.c:2465 +#: builtin/pack-objects.c:2464 msgid "limit pack window by objects" msgstr "é™åˆ¶æ‰“包窗å£çš„对象数" -#: builtin/pack-objects.c:2467 +#: builtin/pack-objects.c:2466 msgid "limit pack window by memory in addition to object limit" msgstr "除对象数é‡é™åˆ¶å¤–设置打包窗å£çš„内å˜é™åˆ¶" -#: builtin/pack-objects.c:2469 +#: builtin/pack-objects.c:2468 msgid "maximum length of delta chain allowed in the resulting pack" msgstr "打包å…许的 delta 链的最大长度" -#: builtin/pack-objects.c:2471 +#: builtin/pack-objects.c:2470 msgid "reuse existing deltas" msgstr "é‡ç”¨å·²å˜åœ¨çš„ deltas" -#: builtin/pack-objects.c:2473 +#: builtin/pack-objects.c:2472 msgid "reuse existing objects" msgstr "é‡ç”¨å·²å˜åœ¨çš„对象" -#: builtin/pack-objects.c:2475 +#: builtin/pack-objects.c:2474 msgid "use OFS_DELTA objects" msgstr "使用 OFS_DELTA 对象" -#: builtin/pack-objects.c:2477 +#: builtin/pack-objects.c:2476 msgid "use threads when searching for best delta matches" msgstr "使用线程查询最佳 delta 匹é…" -#: builtin/pack-objects.c:2479 +#: builtin/pack-objects.c:2478 msgid "do not create an empty pack output" msgstr "ä¸åˆ›å»ºç©ºçš„包输出" -#: builtin/pack-objects.c:2481 +#: builtin/pack-objects.c:2480 msgid "read revision arguments from standard input" msgstr "ä»Žæ ‡å‡†è¾“å…¥è¯»å–修订å·å‚æ•°" -#: builtin/pack-objects.c:2483 +#: builtin/pack-objects.c:2482 msgid "limit the objects to those that are not yet packed" msgstr "é™åˆ¶é‚£äº›å°šæœªæ‰“包的对象" -#: builtin/pack-objects.c:2486 +#: builtin/pack-objects.c:2485 msgid "include objects reachable from any reference" msgstr "包括å¯ä»¥ä»Žä»»ä½•引用访问到的对象" -#: builtin/pack-objects.c:2489 +#: builtin/pack-objects.c:2488 msgid "include objects referred by reflog entries" msgstr "包括被引用日志引用到的对象" -#: builtin/pack-objects.c:2492 +#: builtin/pack-objects.c:2491 msgid "output pack to stdout" msgstr "è¾“å‡ºåŒ…åˆ°æ ‡å‡†è¾“å‡º" -#: builtin/pack-objects.c:2494 +#: builtin/pack-objects.c:2493 msgid "include tag objects that refer to objects to be packed" msgstr "包括引用了打包对象的 tag" -#: builtin/pack-objects.c:2496 +#: builtin/pack-objects.c:2495 msgid "keep unreachable objects" msgstr "ç»´æŒä¸å¯è¾¾çš„对象" -#: builtin/pack-objects.c:2497 parse-options.h:141 +#: builtin/pack-objects.c:2496 parse-options.h:143 msgid "time" msgstr "æ—¶é—´" -#: builtin/pack-objects.c:2498 +#: builtin/pack-objects.c:2497 msgid "unpack unreachable objects newer than <time>" msgstr "将比给定 <æ—¶é—´> æ–°çš„æ— æ³•è®¿é—®çš„å¯¹è±¡è§£åŒ…" -#: builtin/pack-objects.c:2501 +#: builtin/pack-objects.c:2500 msgid "create thin packs" msgstr "创建精简包" -#: builtin/pack-objects.c:2503 +#: builtin/pack-objects.c:2502 msgid "ignore packs that have companion .keep file" msgstr "å¿½ç•¥é…æœ‰ .keep 文件的包" -#: builtin/pack-objects.c:2505 +#: builtin/pack-objects.c:2504 msgid "pack compression level" msgstr "打包压缩级别" -#: builtin/pack-objects.c:2507 +#: builtin/pack-objects.c:2506 msgid "do not hide commits by grafts" -msgstr "ä¸éšè—ç§»æ¤è¦†ç›–çš„æäº¤" +msgstr "æ˜¾ç¤ºè¢«å«æŽ¥éšè—çš„æäº¤" #: builtin/pack-refs.c:6 msgid "git pack-refs [options]" @@ -7421,31 +7683,31 @@ msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <æ—¶é—´>] [--] [<头>...]" -#: builtin/prune.c:132 +#: builtin/prune.c:142 msgid "do not remove, show only" msgstr "ä¸åˆ é™¤ï¼Œåªæ˜¾ç¤º" -#: builtin/prune.c:133 +#: builtin/prune.c:143 msgid "report pruned objects" msgstr "报告清除的对象" -#: builtin/prune.c:136 +#: builtin/prune.c:146 msgid "expire objects older than <time>" msgstr "使早于给定时间的对象过期" #: builtin/push.c:14 msgid "git push [<options>] [<repository> [<refspec>...]]" -msgstr "git push [<选项>] [<版本库> [<引用表达å¼>...]]" +msgstr "git push [<选项>] [<版本库> [<引用规则>...]]" -#: builtin/push.c:45 +#: builtin/push.c:86 msgid "tag shorthand without <tag>" msgstr "tag 简写没有跟 <tag> 傿•°" -#: builtin/push.c:64 +#: builtin/push.c:96 msgid "--delete only accepts plain target ref names" msgstr "--delete åªæŽ¥å—简å•çš„ç›®æ ‡å¼•ç”¨å" -#: builtin/push.c:99 +#: builtin/push.c:141 msgid "" "\n" "To choose either option permanently, see push.default in 'git help config'." @@ -7453,7 +7715,7 @@ msgstr "" "\n" "为了永久地选择任一选项,å‚è§ 'git help config' ä¸çš„ push.default。" -#: builtin/push.c:102 +#: builtin/push.c:144 #, c-format msgid "" "The upstream branch of your current branch does not match\n" @@ -7477,7 +7739,7 @@ msgstr "" " git push %s %s\n" "%s" -#: builtin/push.c:117 +#: builtin/push.c:159 #, c-format msgid "" "You are not currently on a branch.\n" @@ -7491,7 +7753,7 @@ msgstr "" "\n" " git push %s HEAD:<name-of-remote-branch>\n" -#: builtin/push.c:131 +#: builtin/push.c:173 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -7504,12 +7766,12 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:139 +#: builtin/push.c:181 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "当å‰åˆ†æ”¯ %s æœ‰å¤šä¸ªä¸Šæ¸¸åˆ†æ”¯ï¼Œæ‹’ç»æŽ¨é€ã€‚" -#: builtin/push.c:142 +#: builtin/push.c:184 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -7520,7 +7782,7 @@ msgstr "" "è€Œæ²¡æœ‰å‘Šè¯‰æˆ‘è¦æŽ¨é€ä»€ä¹ˆã€æ›´æ–°å“ªä¸ªè¿œç¨‹åˆ†æ”¯ã€‚" # 译者:å—ç¬¦ä¸²é¦–è¡Œè¡Œé¦–è¦æ·»åŠ â€œwarning: â€å—串,故æ¤é¦–行è¦è¾ƒå…¶ä½™è¡ŒçŸ -#: builtin/push.c:165 +#: builtin/push.c:207 msgid "" "push.default is unset; its implicit value is changing in\n" "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" @@ -7532,14 +7794,20 @@ msgid "" "\n" " git config --global push.default simple\n" "\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"In Git 2.0, Git will default to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" "See 'git help config' and search for 'push.default' for further " "information.\n" "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" "'current' instead of 'simple' if you sometimes use older versions of Git)" msgstr "" -"push.default 未设置,它的默认值将会在 Git 2.0 ç”± 'matching'\n" -"修改为 'simple'。若è¦ä¸å†æ˜¾ç¤ºæœ¬ä¿¡æ¯å¹¶åœ¨å…¶é»˜è®¤å€¼æ”¹å˜åŽç»´æŒå½“å‰ä½¿ç”¨ä¹ 惯,\n" -"进行如下设置:\n" +"push.default 尚未设置,它的默认值在 Git 2.0 从 'matching'\n" +"å˜æ›´ä¸º 'simple'。若è¦ä¸å†æ˜¾ç¤ºæœ¬ä¿¡æ¯å¹¶ä¿æŒä¼ ç»Ÿä¹ æƒ¯ï¼Œè¿›è¡Œå¦‚ä¸‹è®¾ç½®ï¼š\n" "\n" " git config --global push.default matching\n" "\n" @@ -7547,16 +7815,22 @@ msgstr "" "\n" " git config --global push.default simple\n" "\n" +"当 push.default 设置为 'matching' åŽï¼Œgit 将推é€å’Œè¿œç¨‹åŒå的所有\n" +"本地分支。\n" +"\n" +"从 Git 2.0 开始,Git 缺çœé‡‡ç”¨æ›´ä¸ºä¿å®ˆçš„ 'simple' 模å¼ï¼ŒåªæŽ¨é€å½“å‰\n" +"分支到远程关è”çš„åŒååˆ†æ”¯ï¼Œå³ 'git push' 推é€å½“å‰åˆ†æ”¯ã€‚\n" +"\n" "å‚è§ 'git help config' 并查找 'push.default' ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚\n" "('simple' 模å¼ç”± Git 1.7.11 版本引入。如果您有时è¦ä½¿ç”¨è€ç‰ˆæœ¬çš„ Git,\n" -"ä¸ºä¿æŒå…¼å®¹ï¼Œè¯·ç”¨ 'current' 代替 'simple' 模å¼ï¼‰" +"ä¸ºä¿æŒå…¼å®¹ï¼Œè¯·ç”¨ 'current' 代替 'simple')" -#: builtin/push.c:225 +#: builtin/push.c:274 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." -msgstr "æ‚¨æ²¡æœ‰ä¸ºæŽ¨é€æŒ‡å®šä»»ä½•引用表达å¼ï¼Œå¹¶ä¸” push.default 为 \"nothing\"。" +msgstr "æ‚¨æ²¡æœ‰ä¸ºæŽ¨é€æŒ‡å®šä»»ä½•引用规则,并且 push.default 为 \"nothing\"。" -#: builtin/push.c:232 +#: builtin/push.c:281 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Integrate the remote changes (e.g.\n" @@ -7567,7 +7841,7 @@ msgstr "" "冿¬¡æŽ¨é€å‰ï¼Œå…ˆä¸Žè¿œç¨‹å˜æ›´åˆå¹¶ï¼ˆå¦‚ 'git pull ...')。详è§\n" "'git push --help' ä¸çš„ 'Note about fast-forwards' å°èŠ‚ã€‚" -#: builtin/push.c:238 +#: builtin/push.c:287 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" @@ -7579,7 +7853,7 @@ msgstr "" "é…ç½®å˜é‡ 'push.default' 设置为 'simple'ã€'current' 或 'upstream'\n" "ä»¥ä¾¿åªæŽ¨é€å½“å‰åˆ†æ”¯ã€‚" -#: builtin/push.c:244 +#: builtin/push.c:293 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and integrate the remote changes\n" @@ -7590,7 +7864,7 @@ msgstr "" "检出该分支并整åˆè¿œç¨‹å˜æ›´ï¼ˆå¦‚ 'git pull ...'),然åŽå†æŽ¨é€ã€‚详è§\n" "'git push --help' ä¸çš„ 'Note about fast-forwards' å°èŠ‚ã€‚" -#: builtin/push.c:250 +#: builtin/push.c:299 msgid "" "Updates were rejected because the remote contains work that you do\n" "not have locally. This is usually caused by another repository pushing\n" @@ -7603,11 +7877,11 @@ msgstr "" "(如 'git pull ...')。\n" "è¯¦è§ 'git push --help' ä¸çš„ 'Note about fast-forwards' å°èŠ‚ã€‚" -#: builtin/push.c:257 +#: builtin/push.c:306 msgid "Updates were rejected because the tag already exists in the remote." msgstr "更新被拒ç»å› 为 tag 在远程已ç»å˜åœ¨ã€‚" -#: builtin/push.c:260 +#: builtin/push.c:309 msgid "" "You cannot update a remote ref that points at a non-commit object,\n" "or update a remote ref to make it point at a non-commit object,\n" @@ -7616,22 +7890,22 @@ msgstr "" "如果ä¸ä½¿ç”¨ '--force' 傿•°ï¼Œæ‚¨ä¸èƒ½æ›´æ–°ä¸€ä¸ªæŒ‡å‘éžæäº¤å¯¹è±¡çš„è¿œç¨‹å¼•ç”¨ï¼Œ\n" "也ä¸èƒ½æ›´æ–°è¿œç¨‹å¼•用让其指å‘ä¸€ä¸ªéžæäº¤å¯¹è±¡ã€‚\n" -#: builtin/push.c:320 +#: builtin/push.c:375 #, c-format msgid "Pushing to %s\n" msgstr "推é€åˆ° %s\n" -#: builtin/push.c:324 +#: builtin/push.c:379 #, c-format msgid "failed to push some refs to '%s'" msgstr "æ— æ³•æŽ¨é€ä¸€äº›å¼•用到 '%s'" -#: builtin/push.c:357 +#: builtin/push.c:412 #, c-format msgid "bad repository '%s'" msgstr "å的版本库 '%s'" -#: builtin/push.c:358 +#: builtin/push.c:413 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -7652,87 +7926,95 @@ msgstr "" "\n" " git push <name>\n" -#: builtin/push.c:373 +#: builtin/push.c:428 msgid "--all and --tags are incompatible" msgstr "--all å’Œ --tags ä¸å…¼å®¹" -#: builtin/push.c:374 +#: builtin/push.c:429 msgid "--all can't be combined with refspecs" -msgstr "--all ä¸èƒ½å’Œå¼•用表达å¼åŒæ—¶ä½¿ç”¨" +msgstr "--all ä¸èƒ½å’Œå¼•ç”¨è§„åˆ™åŒæ—¶ä½¿ç”¨" -#: builtin/push.c:379 +#: builtin/push.c:434 msgid "--mirror and --tags are incompatible" msgstr "--mirror å’Œ --tags ä¸å…¼å®¹" -#: builtin/push.c:380 +#: builtin/push.c:435 msgid "--mirror can't be combined with refspecs" -msgstr "--mirror ä¸èƒ½å’Œå¼•用表达å¼åŒæ—¶ä½¿ç”¨" +msgstr "--mirror ä¸èƒ½å’Œå¼•ç”¨è§„åˆ™åŒæ—¶ä½¿ç”¨" -#: builtin/push.c:385 +#: builtin/push.c:440 msgid "--all and --mirror are incompatible" msgstr "--all å’Œ --mirror ä¸å…¼å®¹" -#: builtin/push.c:445 +#: builtin/push.c:500 msgid "repository" msgstr "版本库" -#: builtin/push.c:446 +#: builtin/push.c:501 msgid "push all refs" msgstr "æŽ¨é€æ‰€æœ‰å¼•用" -#: builtin/push.c:447 +#: builtin/push.c:502 msgid "mirror all refs" msgstr "é•œåƒæ‰€æœ‰å¼•用" -#: builtin/push.c:449 +#: builtin/push.c:504 msgid "delete refs" msgstr "åˆ é™¤å¼•ç”¨" -#: builtin/push.c:450 +#: builtin/push.c:505 msgid "push tags (can't be used with --all or --mirror)" msgstr "æŽ¨é€ tags(ä¸èƒ½ä½¿ç”¨ --all or --mirror)" -#: builtin/push.c:453 +#: builtin/push.c:508 msgid "force updates" msgstr "强制更新" -#: builtin/push.c:454 +#: builtin/push.c:510 +msgid "refname>:<expect" +msgstr "引用å>:<期望值" + +#: builtin/push.c:511 +msgid "require old value of ref to be at this value" +msgstr "è¦æ±‚引用旧的å–值为设定值" + +#: builtin/push.c:513 msgid "check" msgstr "检查" -#: builtin/push.c:455 +#: builtin/push.c:514 msgid "control recursive pushing of submodules" msgstr "æŽ§åˆ¶åæ¨¡ç»„的递归推é€" -#: builtin/push.c:457 +#: builtin/push.c:516 msgid "use thin pack" msgstr "使用精简打包" -#: builtin/push.c:458 builtin/push.c:459 +#: builtin/push.c:517 builtin/push.c:518 msgid "receive pack program" msgstr "接收包程åº" -#: builtin/push.c:460 +#: builtin/push.c:519 msgid "set upstream for git pull/status" msgstr "设置 git pull/status 的上游" -#: builtin/push.c:463 +#: builtin/push.c:522 msgid "prune locally removed refs" msgstr "æ¸…é™¤æœ¬åœ°åˆ é™¤çš„å¼•ç”¨" -#: builtin/push.c:465 +#: builtin/push.c:524 msgid "bypass pre-push hook" msgstr "绕过 pre-push é’©å" -#: builtin/push.c:466 +#: builtin/push.c:525 msgid "push missing but relevant tags" msgstr "推é€ç¼ºå¤±çš„æœ‰å…³çš„ tags" -#: builtin/push.c:476 +#: builtin/push.c:535 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete 与 --allã€--mirror åŠ --tags ä¸å…¼å®¹" -#: builtin/push.c:478 +#: builtin/push.c:537 msgid "--delete doesn't make sense without any refs" msgstr "--delete 未接任何引用没有æ„义" @@ -7810,21 +8092,21 @@ msgstr "è·³è¿‡åº”ç”¨ç¨€ç–æ£€å‡ºè¿‡æ»¤å™¨" msgid "debug unpack-trees" msgstr "调试 unpack-trees" -#: builtin/reflog.c:500 +#: builtin/reflog.c:499 #, c-format msgid "%s' for '%s' is not a valid timestamp" msgstr "'%2$s' 的值 '%1$s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æ—¶é—´æˆ³" -#: builtin/reflog.c:616 builtin/reflog.c:621 +#: builtin/reflog.c:615 builtin/reflog.c:620 #, c-format msgid "'%s' is not a valid timestamp" msgstr "'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æ—¶é—´æˆ³" -#: builtin/remote.c:11 +#: builtin/remote.c:12 msgid "git remote [-v | --verbose]" msgstr "git remote [-v | --verbose]" -#: builtin/remote.c:12 +#: builtin/remote.c:13 msgid "" "git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <name> <url>" @@ -7832,77 +8114,81 @@ msgstr "" "git remote add [-t <分支>] [-m <master>] [-f] [--tags|--no-tags] [--" "mirror=<fetch|push>] <åç§°> <url>" -#: builtin/remote.c:13 builtin/remote.c:32 +#: builtin/remote.c:14 builtin/remote.c:33 msgid "git remote rename <old> <new>" msgstr "git remote rename <æ—§åç§°> <æ–°åç§°>" -#: builtin/remote.c:14 builtin/remote.c:37 +#: builtin/remote.c:15 builtin/remote.c:38 msgid "git remote remove <name>" msgstr "git remote remove <åç§°>" -#: builtin/remote.c:15 builtin/remote.c:42 -msgid "git remote set-head <name> (-a | -d | <branch>)" -msgstr "git remote set-head <åç§°> (-a | -d | <分支>)" - #: builtin/remote.c:16 +msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" +msgstr "git remote set-head <åç§°> (-a | --auto | -d | --delete |<分支>)" + +#: builtin/remote.c:17 msgid "git remote [-v | --verbose] show [-n] <name>" msgstr "git remote [-v | --verbose] show [-n] <åç§°>" -#: builtin/remote.c:17 +#: builtin/remote.c:18 msgid "git remote prune [-n | --dry-run] <name>" msgstr "git remote prune [-n | --dry-run] <åç§°>" -#: builtin/remote.c:18 +#: builtin/remote.c:19 msgid "" "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" msgstr "git remote [-v | --verbose] update [-p | --prune] [(<组> | <远程>)...]" -#: builtin/remote.c:19 +#: builtin/remote.c:20 msgid "git remote set-branches [--add] <name> <branch>..." msgstr "git remote set-branches [--add] <åç§°> <分支>..." -#: builtin/remote.c:20 builtin/remote.c:68 +#: builtin/remote.c:21 builtin/remote.c:69 msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" msgstr "git remote set-url [--push] <åç§°> <新的地å€> [<旧的地å€>]" -#: builtin/remote.c:21 builtin/remote.c:69 +#: builtin/remote.c:22 builtin/remote.c:70 msgid "git remote set-url --add <name> <newurl>" msgstr "git remote set-url --add <åç§°> <新的地å€>" -#: builtin/remote.c:22 builtin/remote.c:70 +#: builtin/remote.c:23 builtin/remote.c:71 msgid "git remote set-url --delete <name> <url>" msgstr "git remote set-url --delete <åç§°> <地å€>" -#: builtin/remote.c:27 +#: builtin/remote.c:28 msgid "git remote add [<options>] <name> <url>" msgstr "git remote add [<选项>] <åç§°> <地å€>" -#: builtin/remote.c:47 +#: builtin/remote.c:43 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <åç§°> (-a | --auto | -d | --delete | <分支>)" + +#: builtin/remote.c:48 msgid "git remote set-branches <name> <branch>..." msgstr "git remote set-branches <åç§°> <分支>..." -#: builtin/remote.c:48 +#: builtin/remote.c:49 msgid "git remote set-branches --add <name> <branch>..." msgstr "git remote set-branches --add <åç§°> <分支>..." -#: builtin/remote.c:53 +#: builtin/remote.c:54 msgid "git remote show [<options>] <name>" msgstr "git remote show [<选项>] <åç§°>" -#: builtin/remote.c:58 +#: builtin/remote.c:59 msgid "git remote prune [<options>] <name>" msgstr "git remote prune [<选项>] <åç§°>" -#: builtin/remote.c:63 +#: builtin/remote.c:64 msgid "git remote update [<options>] [<group> | <remote>]..." msgstr "git remote update [<选项>] [<组> | <远程>]..." -#: builtin/remote.c:98 +#: builtin/remote.c:88 #, c-format msgid "Updating %s" msgstr "æ›´æ–° %s ä¸" -#: builtin/remote.c:130 +#: builtin/remote.c:120 msgid "" "--mirror is dangerous and deprecated; please\n" "\t use --mirror=fetch or --mirror=push instead" @@ -7910,137 +8196,137 @@ msgstr "" "--mirror 选项å±é™©ä¸”过时,请使用 --mirror=fetch\n" "\t 或 --mirror=push" -#: builtin/remote.c:147 +#: builtin/remote.c:137 #, c-format msgid "unknown mirror argument: %s" msgstr "未知的镜åƒå‚数:%s" -#: builtin/remote.c:163 +#: builtin/remote.c:153 msgid "fetch the remote branches" msgstr "抓å–远程的分支" -#: builtin/remote.c:165 +#: builtin/remote.c:155 msgid "import all tags and associated objects when fetching" msgstr "æŠ“å–æ—¶å¯¼å…¥æ‰€æœ‰çš„ tags 和关è”对象" -#: builtin/remote.c:168 +#: builtin/remote.c:158 msgid "or do not fetch any tag at all (--no-tags)" msgstr "æˆ–ä¸æŠ“å–任何 tag(--no-tags)" -#: builtin/remote.c:170 +#: builtin/remote.c:160 msgid "branch(es) to track" msgstr "跟踪的分支" -#: builtin/remote.c:171 +#: builtin/remote.c:161 msgid "master branch" msgstr "主线分支" -#: builtin/remote.c:172 +#: builtin/remote.c:162 msgid "push|fetch" msgstr "push|fetch" -#: builtin/remote.c:173 +#: builtin/remote.c:163 msgid "set up remote as a mirror to push to or fetch from" msgstr "æŠŠè¿œç¨‹è®¾ç½®ä¸ºç”¨ä»¥æŽ¨é€æˆ–抓å–的镜åƒ" -#: builtin/remote.c:185 +#: builtin/remote.c:175 msgid "specifying a master branch makes no sense with --mirror" msgstr "指定一个 master 分支并使用 --mirror 选项没有æ„义" -#: builtin/remote.c:187 +#: builtin/remote.c:177 msgid "specifying branches to track makes sense only with fetch mirrors" msgstr "指定è¦è·Ÿè¸ªçš„分支åªåœ¨ä¸ŽèŽ·å–镜åƒåŒæ—¶ä½¿ç”¨æ‰æœ‰æ„义" -#: builtin/remote.c:195 builtin/remote.c:646 +#: builtin/remote.c:185 builtin/remote.c:641 #, c-format msgid "remote %s already exists." msgstr "远程 %s å·²ç»å˜åœ¨ã€‚" -#: builtin/remote.c:199 builtin/remote.c:650 +#: builtin/remote.c:189 builtin/remote.c:645 #, c-format msgid "'%s' is not a valid remote name" msgstr "'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„远程åç§°" -#: builtin/remote.c:243 +#: builtin/remote.c:233 #, c-format msgid "Could not setup master '%s'" msgstr "æ— æ³•è®¾ç½® master '%s'" -#: builtin/remote.c:299 +#: builtin/remote.c:289 #, c-format msgid "more than one %s" msgstr "多于一个 %s" -#: builtin/remote.c:339 +#: builtin/remote.c:334 #, c-format msgid "Could not get fetch map for refspec %s" -msgstr "æ— æ³•å¾—åˆ°å¼•ç”¨è¡¨è¾¾å¼ %s 的获å–列表" +msgstr "æ— æ³•å¾—åˆ°å¼•ç”¨è§„åˆ™ %s 的获å–列表" -#: builtin/remote.c:440 builtin/remote.c:448 +#: builtin/remote.c:435 builtin/remote.c:443 msgid "(matching)" msgstr "(匹é…)" -#: builtin/remote.c:452 +#: builtin/remote.c:447 msgid "(delete)" msgstr "ï¼ˆåˆ é™¤ï¼‰" -#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602 #, c-format msgid "Could not append '%s' to '%s'" msgstr "ä¸èƒ½æ·»åŠ '%s' 至 '%s'" -#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885 #, c-format msgid "No such remote: %s" msgstr "æ²¡æœ‰è¿™æ ·çš„è¿œç¨‹ï¼š%s" -#: builtin/remote.c:656 +#: builtin/remote.c:651 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "ä¸èƒ½é‡å‘½åé…ç½®å°èŠ‚ '%s' 到 '%s'" -#: builtin/remote.c:662 builtin/remote.c:799 +#: builtin/remote.c:657 builtin/remote.c:794 #, c-format msgid "Could not remove config section '%s'" msgstr "ä¸èƒ½ç§»é™¤é…ç½®å°èŠ‚ '%s'" -#: builtin/remote.c:677 +#: builtin/remote.c:672 #, c-format msgid "" "Not updating non-default fetch refspec\n" "\t%s\n" "\tPlease update the configuration manually if necessary." msgstr "" -"没有更新éžé»˜è®¤çš„获å–引用表达å¼\n" +"没有更新éžé»˜è®¤çš„获å–引用规则\n" "\t%s\n" "\t如果必è¦è¯·æ‰‹åŠ¨æ›´æ–°é…置。" -#: builtin/remote.c:683 +#: builtin/remote.c:678 #, c-format msgid "Could not append '%s'" msgstr "ä¸èƒ½è¿½åŠ '%s'" -#: builtin/remote.c:694 +#: builtin/remote.c:689 #, c-format msgid "Could not set '%s'" msgstr "ä¸èƒ½è®¾ç½® '%s'" -#: builtin/remote.c:716 +#: builtin/remote.c:711 #, c-format msgid "deleting '%s' failed" msgstr "åˆ é™¤ '%s' 失败" -#: builtin/remote.c:750 +#: builtin/remote.c:745 #, c-format msgid "creating '%s' failed" msgstr "创建 '%s' 失败" -#: builtin/remote.c:764 +#: builtin/remote.c:759 #, c-format msgid "Could not remove branch %s" msgstr "æ— æ³•ç§»é™¤åˆ†æ”¯ %s" -#: builtin/remote.c:834 +#: builtin/remote.c:829 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -8050,126 +8336,126 @@ msgid_plural "" msgstr[0] "注æ„:ref/remotes 层级之外的一个分支未被移除。è¦åˆ 除它,使用:" msgstr[1] "注æ„:ref/remotes 层级之外的一些分支未被移除。è¦åˆ 除它们,使用:" -#: builtin/remote.c:943 +#: builtin/remote.c:938 #, c-format msgid " new (next fetch will store in remotes/%s)" msgstr " 新的(下一次获å–å°†å˜å‚¨äºŽ remotes/%s)" -#: builtin/remote.c:946 +#: builtin/remote.c:941 msgid " tracked" msgstr " 已跟踪" -#: builtin/remote.c:948 +#: builtin/remote.c:943 msgid " stale (use 'git remote prune' to remove)" msgstr " 过时(使用 'git remote prune' æ¥ç§»é™¤ï¼‰" -#: builtin/remote.c:950 +#: builtin/remote.c:945 msgid " ???" msgstr " ???" -#: builtin/remote.c:991 +#: builtin/remote.c:986 #, c-format msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" msgstr "æ— æ•ˆçš„ branch.%s.merge,ä¸èƒ½å˜åŸºåˆ°ä¸€ä¸ªä»¥ä¸Šçš„分支" -#: builtin/remote.c:998 +#: builtin/remote.c:993 #, c-format msgid "rebases onto remote %s" msgstr "å˜åŸºåˆ°è¿œç¨‹ %s" -#: builtin/remote.c:1001 +#: builtin/remote.c:996 #, c-format msgid " merges with remote %s" msgstr " 与远程 %s åˆå¹¶" -#: builtin/remote.c:1002 +#: builtin/remote.c:997 msgid " and with remote" msgstr " 且有远程" -#: builtin/remote.c:1004 +#: builtin/remote.c:999 #, c-format msgid "merges with remote %s" msgstr "与远程 %s åˆå¹¶" -#: builtin/remote.c:1005 +#: builtin/remote.c:1000 msgid " and with remote" msgstr " 且有远程" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 msgid "create" msgstr "创建" -#: builtin/remote.c:1054 +#: builtin/remote.c:1049 msgid "delete" msgstr "åˆ é™¤" -#: builtin/remote.c:1058 +#: builtin/remote.c:1053 msgid "up to date" msgstr "最新" -#: builtin/remote.c:1061 +#: builtin/remote.c:1056 msgid "fast-forwardable" msgstr "å¯å¿«è¿›" -#: builtin/remote.c:1064 +#: builtin/remote.c:1059 msgid "local out of date" msgstr "本地已过时" -#: builtin/remote.c:1071 +#: builtin/remote.c:1066 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s 强制推é€è‡³ %-*s (%s)" -#: builtin/remote.c:1074 +#: builtin/remote.c:1069 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr " %-*s 推é€è‡³ %-*s (%s)" -#: builtin/remote.c:1078 +#: builtin/remote.c:1073 #, c-format msgid " %-*s forces to %s" msgstr " %-*s 强制推é€è‡³ %s" -#: builtin/remote.c:1081 +#: builtin/remote.c:1076 #, c-format msgid " %-*s pushes to %s" msgstr " %-*s 推é€è‡³ %s" -#: builtin/remote.c:1091 +#: builtin/remote.c:1144 msgid "do not query remotes" msgstr "䏿Ÿ¥è¯¢è¿œç¨‹" -#: builtin/remote.c:1118 +#: builtin/remote.c:1171 #, c-format msgid "* remote %s" msgstr "* 远程 %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1172 #, c-format msgid " Fetch URL: %s" msgstr " 获å–地å€ï¼š%s" -#: builtin/remote.c:1120 builtin/remote.c:1285 +#: builtin/remote.c:1173 builtin/remote.c:1318 msgid "(no URL)" msgstr "(æ— URL)" -#: builtin/remote.c:1129 builtin/remote.c:1131 +#: builtin/remote.c:1182 builtin/remote.c:1184 #, c-format msgid " Push URL: %s" msgstr " 推é€åœ°å€ï¼š%s" -#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190 #, c-format msgid " HEAD branch: %s" msgstr " HEAD分支:%s" -#: builtin/remote.c:1139 +#: builtin/remote.c:1192 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" msgstr " HEAD 分支(远程 HEAD 模糊,å¯èƒ½æ˜¯ä¸‹åˆ—ä¸çš„一个):\n" -#: builtin/remote.c:1151 +#: builtin/remote.c:1204 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" @@ -8177,141 +8463,206 @@ msgstr[0] " 远程分支:%s" msgstr[1] " 远程分支:%s" # è¯‘è€…ï¼šä¸æ–‡å—符串拼接,å¯åˆ 除å‰å¯¼ç©ºæ ¼ -#: builtin/remote.c:1154 builtin/remote.c:1181 +#: builtin/remote.c:1207 builtin/remote.c:1234 msgid " (status not queried)" msgstr "ï¼ˆçŠ¶æ€æœªæŸ¥è¯¢ï¼‰" -#: builtin/remote.c:1163 +#: builtin/remote.c:1216 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" msgstr[0] " 为 'git pull' é…置的本地分支:" msgstr[1] " 为 'git pull' é…置的本地分支:" -#: builtin/remote.c:1171 +#: builtin/remote.c:1224 msgid " Local refs will be mirrored by 'git push'" msgstr " 本地引用将在 'git push' 时被镜åƒ" -#: builtin/remote.c:1178 +#: builtin/remote.c:1231 #, c-format msgid " Local ref configured for 'git push'%s:" msgid_plural " Local refs configured for 'git push'%s:" msgstr[0] " 为 'git push' é…置的本地引用%s:" msgstr[1] " 为 'git push' é…置的本地引用%s:" -#: builtin/remote.c:1199 +#: builtin/remote.c:1252 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "æ ¹æ®è¿œç¨‹è®¾ç½® refs/remotes/<åç§°>/HEAD" -#: builtin/remote.c:1201 +#: builtin/remote.c:1254 msgid "delete refs/remotes/<name>/HEAD" msgstr "åˆ é™¤ refs/remotes/<åç§°>/HEAD" -#: builtin/remote.c:1216 +#: builtin/remote.c:1269 msgid "Cannot determine remote HEAD" msgstr "æ— æ³•ç¡®å®šè¿œç¨‹ HEAD" -#: builtin/remote.c:1218 +#: builtin/remote.c:1271 msgid "Multiple remote HEAD branches. Please choose one explicitly with:" msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:" -#: builtin/remote.c:1228 +#: builtin/remote.c:1281 #, c-format msgid "Could not delete %s" msgstr "æ— æ³•åˆ é™¤ %s" -#: builtin/remote.c:1236 +#: builtin/remote.c:1289 #, c-format msgid "Not a valid ref: %s" msgstr "䏿˜¯ä¸€ä¸ªæœ‰æ•ˆå¼•用:%s" -#: builtin/remote.c:1238 +#: builtin/remote.c:1291 #, c-format msgid "Could not setup %s" msgstr "ä¸èƒ½è®¾ç½® %s" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/remote.c:1274 +#: builtin/remote.c:1307 #, c-format msgid " %s will become dangling!" msgstr " %s å°†æˆä¸ºæ‘‡æ‘†çжæ€ï¼" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: builtin/remote.c:1275 +#: builtin/remote.c:1308 #, c-format msgid " %s has become dangling!" msgstr " %s å·²æˆä¸ºæ‘‡æ‘†çжæ€ï¼" -#: builtin/remote.c:1281 +#: builtin/remote.c:1314 #, c-format msgid "Pruning %s" msgstr "修剪 %s" -#: builtin/remote.c:1282 +#: builtin/remote.c:1315 #, c-format msgid "URL: %s" msgstr "URL:%s" -#: builtin/remote.c:1295 +#: builtin/remote.c:1328 #, c-format msgid " * [would prune] %s" msgstr " * [å°†åˆ é™¤] %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1331 #, c-format msgid " * [pruned] %s" msgstr " * [å·²åˆ é™¤] %s" -#: builtin/remote.c:1321 +#: builtin/remote.c:1374 msgid "prune remotes after fetching" msgstr "抓å–åŽæ¸…除远程" -#: builtin/remote.c:1387 builtin/remote.c:1461 +#: builtin/remote.c:1440 builtin/remote.c:1514 #, c-format msgid "No such remote '%s'" msgstr "没有æ¤è¿œç¨‹ '%s'" -#: builtin/remote.c:1407 +#: builtin/remote.c:1460 msgid "add branch" msgstr "æ·»åŠ åˆ†æ”¯" -#: builtin/remote.c:1414 +#: builtin/remote.c:1467 msgid "no remote specified" msgstr "未指定远程" -#: builtin/remote.c:1436 +#: builtin/remote.c:1489 msgid "manipulate push URLs" msgstr "æ“ä½œæŽ¨é€ URLS" -#: builtin/remote.c:1438 +#: builtin/remote.c:1491 msgid "add URL" msgstr "æ·»åŠ URL" -#: builtin/remote.c:1440 +#: builtin/remote.c:1493 msgid "delete URLs" msgstr "åˆ é™¤ URLS" -#: builtin/remote.c:1447 +#: builtin/remote.c:1500 msgid "--add --delete doesn't make sense" msgstr "--add --delete æ— æ„义" -#: builtin/remote.c:1487 +#: builtin/remote.c:1540 #, c-format msgid "Invalid old URL pattern: %s" msgstr "æ— æ•ˆçš„æ—§URLåŒ¹é…æ¨¡ç‰ˆï¼š%s" -#: builtin/remote.c:1495 +#: builtin/remote.c:1548 #, c-format msgid "No such URL found: %s" msgstr "未找到æ¤URL:%s" -#: builtin/remote.c:1497 +#: builtin/remote.c:1550 msgid "Will not delete all non-push URLs" msgstr "å°†ä¸ä¼šåˆ é™¤æ‰€æœ‰éžæŽ¨é€URL地å€" -#: builtin/remote.c:1569 +#: builtin/remote.c:1564 msgid "be verbose; must be placed before a subcommand" msgstr "冗长输出;必须置于å命令之å‰" +#: builtin/repack.c:15 +msgid "git repack [options]" +msgstr "git repack [选项]" + +#: builtin/repack.c:143 +msgid "pack everything in a single pack" +msgstr "所有内容打包到一个包文件ä¸" + +#: builtin/repack.c:145 +msgid "same as -a, and turn unreachable objects loose" +msgstr "å’Œ -a 相åŒï¼Œå¹¶å°†ä¸å¯è¾¾çš„å¯¹è±¡è®¾ä¸ºæ¾æ•£å¯¹è±¡" + +#: builtin/repack.c:148 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "åˆ é™¤å¤šä½™çš„åŒ…ï¼Œè¿è¡Œ git-prune-packed" + +#: builtin/repack.c:150 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "å‘ git-pack-objects ä¼ é€’å‚æ•° --no-reuse-delta" + +#: builtin/repack.c:152 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "å‘ git-pack-objects ä¼ é€’å‚æ•° --no-reuse-object" + +#: builtin/repack.c:154 +msgid "do not run git-update-server-info" +msgstr "ä¸è¿è¡Œ git-update-server-info" + +#: builtin/repack.c:157 +msgid "pass --local to git-pack-objects" +msgstr "å‘ git-pack-objects ä¼ é€’å‚æ•° --local" + +#: builtin/repack.c:158 +msgid "approxidate" +msgstr "近似日期" + +#: builtin/repack.c:159 +msgid "with -A, do not loosen objects older than this" +msgstr "使用 -A,ä¸è¦å°†æ—©äºŽç»™å®šæ—¶é—´çš„对象过期" + +#: builtin/repack.c:161 +msgid "size of the window used for delta compression" +msgstr "用于增é‡åŽ‹ç¼©çš„çª—å£å€¼" + +#: builtin/repack.c:162 builtin/repack.c:166 +msgid "bytes" +msgstr "å—节" + +#: builtin/repack.c:163 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "和上é¢çš„相似,但é™åˆ¶å†…å˜å¤§å°è€Œéžæ¡ç›®æ•°" + +#: builtin/repack.c:165 +msgid "limits the maximum delta depth" +msgstr "é™åˆ¶æœ€å¤§å¢žé‡æ·±åº¦" + +#: builtin/repack.c:167 +msgid "maximum size of each packfile" +msgstr "æ¯ä¸ªåŒ…的最大尺寸" + +#: builtin/repack.c:343 +#, c-format +msgid "removing '%s' failed" +msgstr "åˆ é™¤ '%s' 失败" + #: builtin/replace.c:17 msgid "git replace [-f] <object> <replacement>" msgstr "git replace [-f] <对象> <替æ¢ç‰©>" @@ -8321,26 +8672,30 @@ msgid "git replace -d <object>..." msgstr "git replace -d <对象>..." #: builtin/replace.c:19 -msgid "git replace -l [<pattern>]" -msgstr "git replace -l [<模å¼>]" +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<æ ¼å¼>] [-l [<模å¼>]]" -#: builtin/replace.c:121 +#: builtin/replace.c:174 msgid "list replace refs" msgstr "列出替æ¢çš„引用" -#: builtin/replace.c:122 +#: builtin/replace.c:175 msgid "delete replace refs" msgstr "åˆ é™¤æ›¿æ¢çš„引用" -#: builtin/replace.c:123 +#: builtin/replace.c:176 msgid "replace the ref if it exists" msgstr "如果å˜åœ¨åˆ™æ›¿æ¢å¼•用" -#: builtin/rerere.c:11 +#: builtin/replace.c:177 +msgid "use this format" +msgstr "ä½¿ç”¨æ¤æ ¼å¼" + +#: builtin/rerere.c:12 msgid "git rerere [clear | forget path... | status | remaining | diff | gc]" msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]" -#: builtin/rerere.c:56 +#: builtin/rerere.c:57 msgid "register clean resolutions in index" msgstr "åœ¨ç´¢å¼•ä¸æ³¨å†Œå¹²å‡€çš„解决方案" @@ -8401,87 +8756,91 @@ msgstr "HEAD 现在ä½äºŽ %s" msgid "Cannot do a %s reset in the middle of a merge." msgstr "在åˆå¹¶è¿‡ç¨‹ä¸ä¸èƒ½åš%sé‡ç½®æ“作。" -#: builtin/reset.c:251 +#: builtin/reset.c:262 msgid "be quiet, only report errors" msgstr "安陿¨¡å¼ï¼ŒåªæŠ¥å‘Šé”™è¯¯" -#: builtin/reset.c:253 +#: builtin/reset.c:264 msgid "reset HEAD and index" msgstr "é‡ç½® HEAD 和索引" -#: builtin/reset.c:254 +#: builtin/reset.c:265 msgid "reset only HEAD" msgstr "åªé‡ç½® HEAD" -#: builtin/reset.c:256 builtin/reset.c:258 +#: builtin/reset.c:267 builtin/reset.c:269 msgid "reset HEAD, index and working tree" msgstr "é‡ç½® HEADã€ç´¢å¼•和工作区" -#: builtin/reset.c:260 +#: builtin/reset.c:271 msgid "reset HEAD but keep local changes" msgstr "é‡ç½® HEAD 但ä¿å˜æœ¬åœ°å˜æ›´" -#: builtin/reset.c:278 +#: builtin/reset.c:289 #, c-format msgid "Failed to resolve '%s' as a valid revision." msgstr "æ— æ³•å°† '%s' è§£æžä¸ºä¸€ä¸ªæœ‰æ•ˆçš„版本。" -#: builtin/reset.c:281 builtin/reset.c:289 +#: builtin/reset.c:292 builtin/reset.c:300 #, c-format msgid "Could not parse object '%s'." msgstr "ä¸èƒ½è§£æžå¯¹è±¡ '%s'。" -#: builtin/reset.c:286 +#: builtin/reset.c:297 #, c-format msgid "Failed to resolve '%s' as a valid tree." msgstr "æ— æ³•å°† '%s' è§£æžä¸ºä¸€ä¸ªæœ‰æ•ˆçš„æ ‘对象。" -#: builtin/reset.c:295 +#: builtin/reset.c:306 msgid "--patch is incompatible with --{hard,mixed,soft}" msgstr "--patch 与 --{hardã€mixedã€soft} 选项ä¸å…¼å®¹" -#: builtin/reset.c:304 +#: builtin/reset.c:315 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." msgstr "--mixed 带路径已弃用,而是用 'git reset -- <paths>'。" # 译者:汉å—ä¹‹é—´æ— ç©ºæ ¼ï¼Œæ•…åˆ é™¤%så‰åŽç©ºæ ¼ -#: builtin/reset.c:306 +#: builtin/reset.c:317 #, c-format msgid "Cannot do %s reset with paths." msgstr "ä¸èƒ½å¸¦è·¯å¾„进行%sé‡ç½®ã€‚" # 译者:汉å—ä¹‹é—´æ— ç©ºæ ¼ï¼Œæ•…åˆ é™¤%så‰åŽç©ºæ ¼ -#: builtin/reset.c:316 +#: builtin/reset.c:327 #, c-format msgid "%s reset is not allowed in a bare repository" msgstr "ä¸èƒ½å¯¹è£¸ç‰ˆæœ¬åº“进行%sé‡ç½®" -#: builtin/reset.c:336 +#: builtin/reset.c:344 +msgid "Unstaged changes after reset:" +msgstr "é‡ç½®åŽæ’¤å‡ºæš‚å˜åŒºçš„å˜æ›´ï¼š" + +#: builtin/reset.c:350 #, c-format msgid "Could not reset index file to revision '%s'." msgstr "ä¸èƒ½é‡ç½®ç´¢å¼•文件至版本 '%s'。" -#: builtin/reset.c:342 -msgid "Unstaged changes after reset:" -msgstr "é‡ç½®åŽæ’¤å‡ºæš‚å˜åŒºçš„å˜æ›´ï¼š" - -#: builtin/reset.c:347 +#: builtin/reset.c:355 msgid "Could not write new index file." msgstr "ä¸èƒ½å†™å…¥æ–°çš„索引文件。" -#: builtin/rev-parse.c:345 +#: builtin/rev-parse.c:359 msgid "git rev-parse --parseopt [options] -- [<args>...]" msgstr "git rev-parse --parseopt [选项] -- [<傿•°>...]" -#: builtin/rev-parse.c:350 +#: builtin/rev-parse.c:364 msgid "keep the `--` passed as an arg" msgstr "ä¿æŒ `--` ä½œä¸ºä¸€ä¸ªå‚æ•°ä¼ 递" -#: builtin/rev-parse.c:352 +#: builtin/rev-parse.c:366 msgid "stop parsing after the first non-option argument" msgstr "é‡åˆ°ç¬¬ä¸€ä¸ªéžé€‰é¡¹å‚æ•°åŽåœæ¢è§£æž" -#: builtin/rev-parse.c:470 +#: builtin/rev-parse.c:369 +msgid "output in stuck long form" +msgstr "ä»¥å›ºå®šé•¿æ ¼å¼è¾“出" + +#: builtin/rev-parse.c:486 msgid "" "git rev-parse --parseopt [options] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" @@ -8490,8 +8849,8 @@ msgid "" "Run \"git rev-parse --parseopt -h\" for more information on the first usage." msgstr "" "git rev-parse --parseopt [选项] -- [<傿•°>...]\n" -" 或者:git rev-parse --sq-quote [<选项>...]\n" -" 或者:git rev-parse [options] [<选项>...]\n" +" 或者:git rev-parse --sq-quote [<傿•°>...]\n" +" 或者:git rev-parse [选项] [<傿•°>...]\n" "\n" "åˆæ¬¡ä½¿ç”¨æ—¶æ‰§è¡Œ \"git rev-parse --parseopt -h\" æ¥èŽ·å¾—æ›´å¤šä¿¡æ¯ã€‚" @@ -8511,84 +8870,84 @@ msgstr "git cherry-pick [选项] <æäº¤å·>..." msgid "git cherry-pick <subcommand>" msgstr "git cherry-pick <å命令>" -#: builtin/revert.c:71 builtin/revert.c:94 +#: builtin/revert.c:71 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s:%s ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨" -#: builtin/revert.c:105 +#: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" msgstr "终æ¢å转或拣选æ“作" -#: builtin/revert.c:106 +#: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" msgstr "ç»§ç»å转或拣选æ“作" -#: builtin/revert.c:107 +#: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" msgstr "å–æ¶ˆå转或拣选æ“作" -#: builtin/revert.c:108 +#: builtin/revert.c:83 msgid "don't automatically commit" msgstr "ä¸è¦è‡ªåЍæäº¤" -#: builtin/revert.c:109 +#: builtin/revert.c:84 msgid "edit the commit message" msgstr "编辑æäº¤è¯´æ˜Ž" -#: builtin/revert.c:112 +#: builtin/revert.c:87 msgid "parent number" msgstr "父编å·" -#: builtin/revert.c:114 +#: builtin/revert.c:89 msgid "merge strategy" msgstr "åˆå¹¶ç–ç•¥" -#: builtin/revert.c:115 +#: builtin/revert.c:90 msgid "option" msgstr "选项" -#: builtin/revert.c:116 +#: builtin/revert.c:91 msgid "option for merge strategy" msgstr "åˆå¹¶ç–略的选项" -#: builtin/revert.c:127 +#: builtin/revert.c:102 msgid "append commit name" msgstr "è¿½åŠ æäº¤åç§°" -#: builtin/revert.c:128 +#: builtin/revert.c:103 msgid "allow fast-forward" msgstr "å…许快进å¼" -#: builtin/revert.c:129 +#: builtin/revert.c:104 msgid "preserve initially empty commits" msgstr "ä¿ç•™åˆå§‹åŒ–的空æäº¤" -#: builtin/revert.c:130 +#: builtin/revert.c:105 msgid "allow commits with empty messages" msgstr "å…许æäº¤è¯´æ˜Žä¸ºç©º" -#: builtin/revert.c:131 +#: builtin/revert.c:106 msgid "keep redundant, empty commits" msgstr "ä¿æŒå¤šä½™çš„ã€ç©ºçš„æäº¤" -#: builtin/revert.c:135 +#: builtin/revert.c:110 msgid "program error" msgstr "程åºé”™è¯¯" -#: builtin/revert.c:225 +#: builtin/revert.c:195 msgid "revert failed" msgstr "还原失败" -#: builtin/revert.c:240 +#: builtin/revert.c:210 msgid "cherry-pick failed" msgstr "拣选失败" -#: builtin/rm.c:16 +#: builtin/rm.c:17 msgid "git rm [options] [--] <file>..." msgstr "git rm [选项] [--] <文件>..." -#: builtin/rm.c:64 +#: builtin/rm.c:65 msgid "" "the following submodule (or one of its nested submodules)\n" "uses a .git directory:" @@ -8598,7 +8957,7 @@ msgid_plural "" msgstr[0] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—åæ¨¡ç»„)使用了一个 .git 目录:" msgstr[1] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—åæ¨¡ç»„)使用了一个 .git 目录:" -#: builtin/rm.c:70 +#: builtin/rm.c:71 msgid "" "\n" "(use 'rm -rf' if you really want to remove it including all of its history)" @@ -8606,7 +8965,7 @@ msgstr "" "\n" "(使用 'rm -rf' å‘½ä»¤å¦‚æžœæ‚¨çœŸçš„æƒ³åˆ é™¤å®ƒåŠå…¶å…¨éƒ¨åކå²ï¼‰" -#: builtin/rm.c:230 +#: builtin/rm.c:231 msgid "" "the following file has staged content different from both the\n" "file and the HEAD:" @@ -8616,7 +8975,7 @@ msgid_plural "" msgstr[0] "如下文件其暂å˜çš„å†…å®¹å’Œå·¥ä½œåŒºåŠ HEAD ä¸çš„都ä¸ä¸€æ ·ï¼š" msgstr[1] "如下文件其暂å˜çš„å†…å®¹å’Œå·¥ä½œåŒºåŠ HEAD ä¸çš„都ä¸ä¸€æ ·ï¼š" -#: builtin/rm.c:235 +#: builtin/rm.c:236 msgid "" "\n" "(use -f to force removal)" @@ -8624,13 +8983,13 @@ msgstr "" "\n" "(使用 -f å¼ºåˆ¶åˆ é™¤ï¼‰" -#: builtin/rm.c:239 +#: builtin/rm.c:240 msgid "the following file has changes staged in the index:" msgid_plural "the following files have changes staged in the index:" msgstr[0] "如下文件相对索引区的内容有修改" msgstr[1] "如下文件相对索引区的内容有修改" -#: builtin/rm.c:243 builtin/rm.c:254 +#: builtin/rm.c:244 builtin/rm.c:255 msgid "" "\n" "(use --cached to keep the file, or -f to force removal)" @@ -8638,38 +8997,38 @@ msgstr "" "\n" "(使用 --cached ä¿ç•™æœ¬åœ°æ–‡ä»¶ï¼Œæˆ–用 -f å¼ºåˆ¶åˆ é™¤ï¼‰" -#: builtin/rm.c:251 +#: builtin/rm.c:252 msgid "the following file has local modifications:" msgid_plural "the following files have local modifications:" msgstr[0] "如下文件有本地修改:" msgstr[1] "如下文件有本地修改:" -#: builtin/rm.c:269 +#: builtin/rm.c:270 msgid "do not list removed files" msgstr "ä¸åˆ—å‡ºåˆ é™¤çš„æ–‡ä»¶" -#: builtin/rm.c:270 +#: builtin/rm.c:271 msgid "only remove from the index" msgstr "åªä»Žç´¢å¼•åŒºåˆ é™¤" -#: builtin/rm.c:271 +#: builtin/rm.c:272 msgid "override the up-to-date check" msgstr "å¿½ç•¥æ–‡ä»¶æ›´æ–°çŠ¶æ€æ£€æŸ¥" -#: builtin/rm.c:272 +#: builtin/rm.c:273 msgid "allow recursive removal" msgstr "å…è®¸é€’å½’åˆ é™¤" -#: builtin/rm.c:274 +#: builtin/rm.c:275 msgid "exit with a zero status even if nothing matched" msgstr "å³ä½¿æ²¡æœ‰åŒ¹é…,也以零状æ€é€€å‡º" -#: builtin/rm.c:345 +#: builtin/rm.c:336 #, c-format msgid "not removing '%s' recursively without -r" msgstr "未æä¾› -r 选项ä¸ä¼šé€’å½’åˆ é™¤ '%s'" -#: builtin/rm.c:384 +#: builtin/rm.c:375 #, c-format msgid "git rm: unable to remove %s" msgstr "git rm:ä¸èƒ½åˆ 除 %s" @@ -8683,23 +9042,23 @@ msgstr "git shortlog [<选项>] [<版本范围>] [[--] [<路径>...]]" msgid "Missing author: %s" msgstr "缺少作者:%s" -#: builtin/shortlog.c:228 +#: builtin/shortlog.c:230 msgid "sort output according to the number of commits per author" msgstr "æ ¹æ®æ¯ä¸ªä½œè€…çš„æäº¤æ•°é‡æŽ’åº" -#: builtin/shortlog.c:230 +#: builtin/shortlog.c:232 msgid "Suppress commit descriptions, only provides commit count" msgstr "éšè—æäº¤è¯´æ˜Žï¼Œåªæä¾›æäº¤æ•°é‡" -#: builtin/shortlog.c:232 +#: builtin/shortlog.c:234 msgid "Show the email address of each author" msgstr "显示æ¯ä¸ªä½œè€…的电å邮件地å€" -#: builtin/shortlog.c:233 +#: builtin/shortlog.c:235 msgid "w[,i1[,i2]]" msgstr "w[,i1[,i2]]" -#: builtin/shortlog.c:234 +#: builtin/shortlog.c:236 msgid "Linewrap output" msgstr "折行输出" @@ -8719,67 +9078,67 @@ msgstr "" msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" msgstr "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]" -#: builtin/show-branch.c:650 +#: builtin/show-branch.c:649 msgid "show remote-tracking and local branches" msgstr "显示远程跟踪的和本地的分支" -#: builtin/show-branch.c:652 +#: builtin/show-branch.c:651 msgid "show remote-tracking branches" msgstr "显示远程跟踪的分支" -#: builtin/show-branch.c:654 +#: builtin/show-branch.c:653 msgid "color '*!+-' corresponding to the branch" msgstr "ç€è‰² '*!+-' 到相应的分支" -#: builtin/show-branch.c:656 +#: builtin/show-branch.c:655 msgid "show <n> more commits after the common ancestor" msgstr "显示共åŒç¥–å…ˆåŽçš„ <n> 个æäº¤" -#: builtin/show-branch.c:658 +#: builtin/show-branch.c:657 msgid "synonym to more=-1" msgstr "å’Œ more=-1 åŒä¹‰" -#: builtin/show-branch.c:659 +#: builtin/show-branch.c:658 msgid "suppress naming strings" msgstr "䏿˜¾ç¤ºå—符串命å" -#: builtin/show-branch.c:661 +#: builtin/show-branch.c:660 msgid "include the current branch" msgstr "包括当å‰åˆ†æ”¯" -#: builtin/show-branch.c:663 +#: builtin/show-branch.c:662 msgid "name commits with their object names" msgstr "以对象åå—命åæäº¤" -#: builtin/show-branch.c:665 +#: builtin/show-branch.c:664 msgid "show possible merge bases" msgstr "显示å¯èƒ½åˆå¹¶çš„基线" -#: builtin/show-branch.c:667 +#: builtin/show-branch.c:666 msgid "show refs unreachable from any other ref" msgstr "显示没有任何引用的的引用" -#: builtin/show-branch.c:669 +#: builtin/show-branch.c:668 msgid "show commits in topological order" msgstr "ä»¥æ‹“æ‰‘é¡ºåºæ˜¾ç¤ºæäº¤" -#: builtin/show-branch.c:672 +#: builtin/show-branch.c:671 msgid "show only commits not on the first branch" msgstr "åªæ˜¾ç¤ºä¸åœ¨ç¬¬ä¸€ä¸ªåˆ†æ”¯ä¸Šçš„æäº¤" -#: builtin/show-branch.c:674 +#: builtin/show-branch.c:673 msgid "show merges reachable from only one tip" msgstr "显示仅一个分支å¯è®¿é—®çš„åˆå¹¶æäº¤" -#: builtin/show-branch.c:676 +#: builtin/show-branch.c:675 msgid "topologically sort, maintaining date order where possible" msgstr "æ‹“æ‰‘æ–¹å¼æŽ’åºï¼Œå¹¶å°½å¯èƒ½åœ°ä¿æŒæ—¥æœŸé¡ºåº" -#: builtin/show-branch.c:679 +#: builtin/show-branch.c:678 msgid "<n>[,<base>]" msgstr "<n>[,<base>]" -#: builtin/show-branch.c:680 +#: builtin/show-branch.c:679 msgid "show <n> most recent ref-log entries starting at base" msgstr "显示从 base 开始的 <n> æ¡æœ€è¿‘的引用日志记录" @@ -8807,23 +9166,23 @@ msgstr "åªæ˜¾ç¤ºå¤´ï¼ˆå¯ä»¥å’Œ tags 共用)" msgid "stricter reference checking, requires exact ref path" msgstr "æ›´ä¸¥æ ¼çš„å¼•ç”¨æ£€æµ‹ï¼Œéœ€è¦ç²¾ç¡®çš„引用路径" -#: builtin/show-ref.c:173 builtin/show-ref.c:176 +#: builtin/show-ref.c:173 builtin/show-ref.c:175 msgid "show the HEAD reference, even if it would be filtered out" msgstr "显示 HEAD 引用,å³ä½¿è¢«è¿‡æ»¤æŽ‰" -#: builtin/show-ref.c:178 +#: builtin/show-ref.c:177 msgid "dereference tags into object IDs" msgstr "è½¬æ¢ tags 到对象ID" -#: builtin/show-ref.c:180 +#: builtin/show-ref.c:179 msgid "only show SHA1 hash using <n> digits" msgstr "åªæ˜¾ç¤ºä½¿ç”¨ <n> 个数å—çš„ SHA1 哈希" -#: builtin/show-ref.c:184 +#: builtin/show-ref.c:183 msgid "do not print results to stdout (useful with --verify)" msgstr "䏿‰“å°ç»“æžœåˆ°æ ‡å‡†è¾“å‡ºï¼ˆä¾‹å¦‚ä¸Ž --verify 傿•°å…±ç”¨ï¼‰" -#: builtin/show-ref.c:186 +#: builtin/show-ref.c:185 msgid "show refs from stdin that aren't in local repository" msgstr "æ˜¾ç¤ºä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å…¥çš„ä¸åœ¨æœ¬åœ°ç‰ˆæœ¬åº“ä¸çš„引用" @@ -8847,11 +9206,11 @@ msgstr "åˆ é™¤ç¬¦å·å¼•用" msgid "shorten ref output" msgstr "简çŸçš„引用输出" -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason" msgstr "åŽŸå› " -#: builtin/symbolic-ref.c:43 builtin/update-ref.c:18 +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254 msgid "reason of the update" msgstr "æ›´æ–°çš„åŽŸå› " @@ -9014,183 +9373,195 @@ msgstr "åªæ‰“å°åŒ…å«æäº¤çš„tags" msgid "print only tags of the object" msgstr "åªæ‰“å°tags对象" -#: builtin/tag.c:504 +#: builtin/tag.c:501 msgid "--column and -n are incompatible" msgstr "--column å’Œ -n ä¸å…¼å®¹" -#: builtin/tag.c:521 +#: builtin/tag.c:518 msgid "-n option is only allowed with -l." msgstr "-n 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/tag.c:523 +#: builtin/tag.c:520 msgid "--contains option is only allowed with -l." msgstr "--contains 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/tag.c:525 +#: builtin/tag.c:522 msgid "--points-at option is only allowed with -l." msgstr "--points-at 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚" -#: builtin/tag.c:533 +#: builtin/tag.c:530 msgid "only one -F or -m option is allowed." msgstr "åªå…许一个 -F 或 -m 选项。" -#: builtin/tag.c:553 +#: builtin/tag.c:550 msgid "too many params" msgstr "å¤ªå¤šå‚æ•°" -#: builtin/tag.c:559 +#: builtin/tag.c:556 #, c-format msgid "'%s' is not a valid tag name." msgstr "'%s' 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„tagå称。" -#: builtin/tag.c:564 +#: builtin/tag.c:561 #, c-format msgid "tag '%s' already exists" msgstr "tag '%s' å·²å˜åœ¨" -#: builtin/tag.c:582 +#: builtin/tag.c:579 #, c-format msgid "%s: cannot lock the ref" msgstr "%s:ä¸èƒ½é”定引用" -#: builtin/tag.c:584 +#: builtin/tag.c:581 #, c-format msgid "%s: cannot update the ref" msgstr "%s:ä¸èƒ½æ›´æ–°å¼•用" -#: builtin/tag.c:586 +#: builtin/tag.c:583 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "已更新tag '%s'(曾为 %s)\n" -#: builtin/update-index.c:401 +#: builtin/update-index.c:402 msgid "git update-index [options] [--] [<file>...]" msgstr "git update-index [选项] [--] [<文件>...]" -#: builtin/update-index.c:718 +#: builtin/update-index.c:720 msgid "continue refresh even when index needs update" msgstr "å½“ç´¢å¼•éœ€è¦æ›´æ–°æ—¶ç»§ç»åˆ·æ–°" -#: builtin/update-index.c:721 +#: builtin/update-index.c:723 msgid "refresh: ignore submodules" msgstr "åˆ·æ–°ï¼šå¿½ç•¥åæ¨¡ç»„" -#: builtin/update-index.c:724 +#: builtin/update-index.c:726 msgid "do not ignore new files" msgstr "ä¸å¿½ç•¥æ–°çš„æ–‡ä»¶" -#: builtin/update-index.c:726 +#: builtin/update-index.c:728 msgid "let files replace directories and vice-versa" msgstr "让文件替æ¢ç›®å½•(å之亦然)" -#: builtin/update-index.c:728 +#: builtin/update-index.c:730 msgid "notice files missing from worktree" msgstr "通知文件从工作区丢失" -#: builtin/update-index.c:730 +#: builtin/update-index.c:732 msgid "refresh even if index contains unmerged entries" msgstr "å³ä½¿ç´¢å¼•åŒºåŒ…å«æœªåˆå¹¶çš„æ¡ç›®ä¹Ÿæ‰§è¡Œåˆ·æ–°" -#: builtin/update-index.c:733 +#: builtin/update-index.c:735 msgid "refresh stat information" msgstr "刷新统计信æ¯" -#: builtin/update-index.c:737 +#: builtin/update-index.c:739 msgid "like --refresh, but ignore assume-unchanged setting" msgstr "类似于 --refresh,但是忽略 assume-unchanged 设置" -#: builtin/update-index.c:741 +#: builtin/update-index.c:743 msgid "<mode> <object> <path>" msgstr "<mode> <object> <path>" -#: builtin/update-index.c:742 +#: builtin/update-index.c:744 msgid "add the specified entry to the index" msgstr "æ·»åŠ æŒ‡å®šçš„æ¡ç›®åˆ°ç´¢å¼•区" -#: builtin/update-index.c:746 +#: builtin/update-index.c:748 msgid "(+/-)x" msgstr "(+/-)x" -#: builtin/update-index.c:747 +#: builtin/update-index.c:749 msgid "override the executable bit of the listed files" msgstr "è¦†ç›–åˆ—è¡¨é‡Œæ–‡ä»¶çš„å¯æ‰§è¡Œä½" -#: builtin/update-index.c:751 +#: builtin/update-index.c:753 msgid "mark files as \"not changing\"" msgstr "æŠŠæ–‡ä»¶æ ‡è®°ä¸º \"æ²¡æœ‰å˜æ›´\"" -#: builtin/update-index.c:754 +#: builtin/update-index.c:756 msgid "clear assumed-unchanged bit" msgstr "清除 assumed-unchanged ä½" -#: builtin/update-index.c:757 +#: builtin/update-index.c:759 msgid "mark files as \"index-only\"" msgstr "æŠŠæ–‡ä»¶æ ‡è®°ä¸º \"仅索引\"" -#: builtin/update-index.c:760 +#: builtin/update-index.c:762 msgid "clear skip-worktree bit" msgstr "清除 skip-worktree ä½" -#: builtin/update-index.c:763 +#: builtin/update-index.c:765 msgid "add to index only; do not add content to object database" msgstr "åªæ·»åŠ åˆ°ç´¢å¼•åŒºï¼›ä¸æ·»åŠ å¯¹è±¡åˆ°å¯¹è±¡åº“" -#: builtin/update-index.c:765 +#: builtin/update-index.c:767 msgid "remove named paths even if present in worktree" msgstr "å³ä½¿å˜åœ¨å·¥ä½œåŒºé‡Œï¼Œä¹Ÿåˆ 除路径" -#: builtin/update-index.c:767 +#: builtin/update-index.c:769 msgid "with --stdin: input lines are terminated by null bytes" msgstr "æºå¸¦ --stdin:输入的行以 null å—符终æ¢" -#: builtin/update-index.c:769 +#: builtin/update-index.c:771 msgid "read list of paths to be updated from standard input" msgstr "ä»Žæ ‡å‡†è¾“å…¥ä¸è¯»å–éœ€è¦æ›´æ–°çš„路径列表" -#: builtin/update-index.c:773 +#: builtin/update-index.c:775 msgid "add entries from standard input to the index" msgstr "ä»Žæ ‡å‡†è¾“å…¥æ·»åŠ æ¡ç›®åˆ°ç´¢å¼•区" -#: builtin/update-index.c:777 +#: builtin/update-index.c:779 msgid "repopulate stages #2 and #3 for the listed paths" msgstr "ä¸ºæŒ‡å®šæ–‡ä»¶é‡æ–°ç”Ÿæˆç¬¬2和第3æš‚å˜åŒº" -#: builtin/update-index.c:781 +#: builtin/update-index.c:783 msgid "only update entries that differ from HEAD" msgstr "åªæ›´æ–°ä¸Ž HEAD ä¸åŒçš„æ¡ç›®" -#: builtin/update-index.c:785 +#: builtin/update-index.c:787 msgid "ignore files missing from worktree" msgstr "忽略工作区丢失的文件" -#: builtin/update-index.c:788 +#: builtin/update-index.c:790 msgid "report actions to standard output" msgstr "åœ¨æ ‡å‡†è¾“å‡ºæ˜¾ç¤ºæ“作" -#: builtin/update-index.c:790 +#: builtin/update-index.c:792 msgid "(for porcelains) forget saved unresolved conflicts" msgstr "(for porcelains) 忘记ä¿å˜çš„æœªè§£å†³çš„冲çª" -#: builtin/update-index.c:794 +#: builtin/update-index.c:796 msgid "write index in this format" msgstr "ä»¥è¿™ç§æ ¼å¼å†™å…¥ç´¢å¼•区" -#: builtin/update-ref.c:7 +#: builtin/update-ref.c:9 msgid "git update-ref [options] -d <refname> [<oldval>]" -msgstr "git update-ref [options] -d <引用å> [<旧值>]" +msgstr "git update-ref [选项] -d <引用å> [<旧值>]" -#: builtin/update-ref.c:8 +#: builtin/update-ref.c:10 msgid "git update-ref [options] <refname> <newval> [<oldval>]" -msgstr "git update-ref [options] <引用å> <新值> [<旧值>]" +msgstr "git update-ref [选项] <引用å> <新值> [<旧值>]" + +#: builtin/update-ref.c:11 +msgid "git update-ref [options] --stdin [-z]" +msgstr "git update-ref [选项] --stdin [-z]" -#: builtin/update-ref.c:19 +#: builtin/update-ref.c:255 msgid "delete the reference" msgstr "åˆ é™¤å¼•ç”¨" -#: builtin/update-ref.c:21 +#: builtin/update-ref.c:257 msgid "update <refname> not the one it points to" msgstr "æ›´æ–° <引用å> æœ¬èº«è€Œä¸æ˜¯å®ƒæŒ‡å‘的引用" +#: builtin/update-ref.c:258 +msgid "stdin has NUL-terminated arguments" +msgstr "æ ‡å‡†è¾“å…¥æœ‰ä»¥ NUL å—符终æ¢çš„傿•°" + +#: builtin/update-ref.c:259 +msgid "read updates from stdin" +msgstr "ä»Žæ ‡å‡†è¾“å…¥è¯»å–æ›´æ–°" + #: builtin/update-server-info.c:6 msgid "git update-server-info [--force]" msgstr "git update-server-info [--force]" @@ -9244,23 +9615,23 @@ msgstr "" "命令 'git help -a' å’Œ 'git help -g' 显示å¯ç”¨çš„å命令和一些指å—。å‚è§\n" "'git help <命令>' 或 'git help <指å—>' æ¥æŸ¥çœ‹ç»™å®šçš„å命令帮助或指å—。" -#: parse-options.h:144 +#: parse-options.h:146 msgid "expiry date" msgstr "逾期日期" -#: parse-options.h:159 +#: parse-options.h:161 msgid "no-op (backward compatibility)" msgstr "空æ“作(å‘åŽå…¼å®¹ï¼‰" -#: parse-options.h:236 +#: parse-options.h:235 msgid "be more verbose" msgstr "æ›´åŠ è¯¦ç»†" -#: parse-options.h:238 +#: parse-options.h:237 msgid "be more quiet" msgstr "æ›´åŠ å®‰é™" -#: parse-options.h:244 +#: parse-options.h:243 msgid "use <n> digits to display SHA-1s" msgstr "用 <n> 使•°å—显示 SHA-1 哈希值" @@ -9552,8 +9923,8 @@ msgid "" msgstr "检出 '$start_head' 失败。å°è¯• 'git bisect reset <validbranch>'。" #: git-bisect.sh:140 -msgid "won't bisect on seeked tree" -msgstr "ä¸ä¼šåœ¨å·²æŸ¥æ‰¾è¿‡çš„æ ‘上二分查找" +msgid "won't bisect on cg-seek'ed tree" +msgstr "ä¸ä¼šåœ¨åšäº† cg-seek çš„æ ‘ä¸ŠåšäºŒåˆ†æŸ¥æ‰¾" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" @@ -9690,7 +10061,7 @@ msgstr "" msgid "Pull is not possible because you have unmerged files." msgstr "Pull ä¸å¯ç”¨ï¼Œå› 为您尚有未åˆå¹¶çš„æ–‡ä»¶ã€‚" -#: git-pull.sh:203 +#: git-pull.sh:223 msgid "updating an unborn branch with changes added to the index" msgstr "æ›´æ–°å°šæœªè¯žç”Ÿçš„åˆ†æ”¯ï¼Œå˜æ›´æ·»åŠ è‡³ç´¢å¼•" @@ -9698,7 +10069,7 @@ msgstr "æ›´æ–°å°šæœªè¯žç”Ÿçš„åˆ†æ”¯ï¼Œå˜æ›´æ·»åŠ è‡³ç´¢å¼•" #. The working tree and the index file is still based on the #. $orig_head commit, but we are merging into $curr_head. #. First update the working tree to match $curr_head. -#: git-pull.sh:235 +#: git-pull.sh:247 #, sh-format msgid "" "Warning: fetch updated the current branch head.\n" @@ -9708,15 +10079,15 @@ msgstr "" "è¦å‘Šï¼šfetch 更新了当å‰çš„分支。您的工作区\n" "è¦å‘Šï¼šä»ŽåŽŸæäº¤ $orig_head 快进。" -#: git-pull.sh:260 +#: git-pull.sh:272 msgid "Cannot merge multiple branches into empty head" msgstr "æ— æ³•å°†å¤šä¸ªåˆ†æ”¯åˆå¹¶åˆ°ç©ºåˆ†æ”¯" -#: git-pull.sh:264 +#: git-pull.sh:276 msgid "Cannot rebase onto multiple branches" msgstr "æ— æ³•å˜åŸºåˆ°å¤šä¸ªåˆ†æ”¯" -#: git-rebase.sh:54 +#: git-rebase.sh:55 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" @@ -9727,16 +10098,16 @@ msgstr "" "如果您想跳过æ¤è¡¥ä¸ï¼Œåˆ™æ‰§è¡Œ \"git rebase --skip\"。\n" "è¦æ¢å¤åŽŸåˆ†æ”¯å¹¶åœæ¢å˜åŸºï¼Œæ‰§è¡Œ \"git rebase --abort\"。" -#: git-rebase.sh:156 +#: git-rebase.sh:158 msgid "Applied autostash." msgstr "æˆåŠŸåº”ç”¨ autostash。" -#: git-rebase.sh:159 +#: git-rebase.sh:161 #, sh-format msgid "Cannot store $stash_sha1" msgstr "æ— æ³•ä¿å˜ $stash_sha1" -#: git-rebase.sh:160 +#: git-rebase.sh:162 msgid "" "Applying autostash resulted in conflicts.\n" "Your changes are safe in the stash.\n" @@ -9746,31 +10117,31 @@ msgstr "" "您的修改安全地ä¿å˜åœ¨ stash ä¸ã€‚\n" "您å¯ä»¥åœ¨ä»»ä½•时候è¿è¡Œ \"git stash pop\" 或 \"git stash drop\"。\n" -#: git-rebase.sh:190 +#: git-rebase.sh:201 msgid "The pre-rebase hook refused to rebase." -msgstr "é’©å pre-rebase æ‹’ç»å˜åŸºã€‚" +msgstr "é’©å pre-rebase æ‹’ç»å˜åŸºæ“作。" -#: git-rebase.sh:195 +#: git-rebase.sh:206 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "似乎æ£å¤„于在 git-am 的执行过程ä¸ã€‚æ— æ³•å˜åŸºã€‚" -#: git-rebase.sh:329 +#: git-rebase.sh:346 msgid "The --exec option must be used with the --interactive option" msgstr "选项 --exec 必须和选项 --interactive åŒæ—¶ä½¿ç”¨" -#: git-rebase.sh:334 +#: git-rebase.sh:351 msgid "No rebase in progress?" msgstr "没有æ£åœ¨è¿›è¡Œçš„å˜åŸºï¼Ÿ" -#: git-rebase.sh:345 +#: git-rebase.sh:362 msgid "The --edit-todo action can only be used during interactive rebase." msgstr "动作 --edit-todo åªèƒ½ç”¨åœ¨äº¤äº’å¼å˜åŸºè¿‡ç¨‹ä¸ã€‚" -#: git-rebase.sh:352 +#: git-rebase.sh:369 msgid "Cannot read HEAD" msgstr "ä¸èƒ½è¯»å– HEAD" -#: git-rebase.sh:355 +#: git-rebase.sh:372 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -9778,12 +10149,12 @@ msgstr "" "您必须编辑所有的åˆå¹¶å†²çªï¼Œç„¶åŽé€šè¿‡ git add\n" "å‘½ä»¤å°†å®ƒä»¬æ ‡è®°ä¸ºå·²è§£å†³" -#: git-rebase.sh:373 +#: git-rebase.sh:390 #, sh-format msgid "Could not move back to $head_name" msgstr "æ— æ³•ç§»å›ž $head_name" -#: git-rebase.sh:392 +#: git-rebase.sh:409 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9795,72 +10166,72 @@ msgid "" "and run me again. I am stopping in case you still have something\n" "valuable there." msgstr "" -"好åƒå·²æœ‰ä¸€ä¸ª $state_dir_base 目录,我怀疑您æ£å¤„于å¦å¤–一个å˜åŸºè¿‡ç¨‹ä¸ã€‚\n" -"å¦‚æžœæ˜¯è¿™æ ·ï¼Œè¯·å°è¯•执行\n" +"好åƒå·²æœ‰ $state_dir_base 目录,我怀疑您æ£å¤„于å¦å¤–一个å˜åŸºæ“作\n" +"过程ä¸ã€‚ å¦‚æžœæ˜¯è¿™æ ·ï¼Œè¯·æ‰§è¡Œ\n" "\t$cmd_live_rebase\n" "å¦‚æžœä¸æ˜¯è¿™æ ·ï¼Œè¯·æ‰§è¡Œ\n" "\t$cmd_clear_stale_rebase\n" -"ç„¶åŽå†é‡æ–°æ‰§è¡Œå˜åŸºã€‚为é¿å…您丢失é‡è¦æ•°æ®ï¼Œæˆ‘å·²ç»åœæ¢å½“剿“作。" +"ç„¶åŽå†é‡æ–°æ‰§è¡Œå˜åŸºæ“作。 为é¿å…丢失é‡è¦æ•°æ®ï¼Œæˆ‘å·²ç»åœæ¢å½“剿“作。" -#: git-rebase.sh:437 +#: git-rebase.sh:456 #, sh-format msgid "invalid upstream $upstream_name" msgstr "æ— æ•ˆçš„ä¸Šæ¸¸ $upstream_name" -#: git-rebase.sh:461 +#: git-rebase.sh:480 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: 有一个以上的åˆå¹¶åŸºå‡†" -#: git-rebase.sh:464 git-rebase.sh:468 +#: git-rebase.sh:483 git-rebase.sh:487 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: 没有åˆå¹¶åŸºå‡†" -#: git-rebase.sh:473 +#: git-rebase.sh:492 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "没有指å‘一个有效的æäº¤ï¼š$onto_name" -#: git-rebase.sh:496 +#: git-rebase.sh:515 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "严é‡é”™è¯¯ï¼šæ— æ¤åˆ†æ”¯ï¼š$branch_name" -#: git-rebase.sh:519 +#: git-rebase.sh:548 msgid "Cannot autostash" msgstr "æ— æ³• autostash" -#: git-rebase.sh:524 +#: git-rebase.sh:553 #, sh-format msgid "Created autostash: $stash_abbrev" msgstr "创建了 autostash: $stash_abbrev" -#: git-rebase.sh:528 +#: git-rebase.sh:557 msgid "Please commit or stash them." msgstr "请æäº¤æˆ–为它们ä¿å˜è¿›åº¦ã€‚" -#: git-rebase.sh:548 +#: git-rebase.sh:577 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "当å‰åˆ†æ”¯ $branch_name 是最新的。" -#: git-rebase.sh:552 +#: git-rebase.sh:581 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "当å‰åˆ†æ”¯ $branch_name 是最新的,强制å˜åŸºã€‚" -#: git-rebase.sh:563 +#: git-rebase.sh:592 #, sh-format msgid "Changes from $mb to $onto:" msgstr "å˜æ›´ä»Ž $mb 到 $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:572 +#: git-rebase.sh:601 msgid "First, rewinding head to replay your work on top of it..." msgstr "首先,é‡ç½®å¤´æŒ‡é’ˆä»¥ä¾¿åœ¨ä¸Šé¢é‡æ”¾æ‚¨çš„工作..." -#: git-rebase.sh:582 +#: git-rebase.sh:611 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "å¿«è¿› $branch_name 至 $onto_name。" @@ -9908,7 +10279,7 @@ msgstr "æ— æ³•ç”¨ $w_commit æ›´æ–° $ref_stash" #. $ git stash save --blah-blah 2>&1 | head -n 2 #. error: unknown option for 'stash save': --blah-blah #. To provide a message, use git stash save -- '--blah-blah' -#: git-stash.sh:241 +#: git-stash.sh:237 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" @@ -9917,96 +10288,85 @@ msgstr "" "错误:'stash save' 的未知选项:$option\n" " è¦æä¾›ä¸€ä¸ªæè¿°ä¿¡æ¯ï¼Œä½¿ç”¨ git stash save -- '$option'" -#: git-stash.sh:262 +#: git-stash.sh:258 msgid "No local changes to save" msgstr "没有è¦ä¿å˜çš„æœ¬åœ°ä¿®æ”¹" -#: git-stash.sh:268 -msgid "" -"The following untracked files would NOT be saved but need to be removed by " -"stash save:" -msgstr "如下未跟踪文件将ä¸ä¼šè¢«ä¿å˜ä½†æ˜¯å°†ä¼šå› 为进度ä¿å˜è€Œéœ€è¦è¢«åˆ 除:" - -#: git-stash.sh:270 -msgid "" -"Aborting. Consider using either the --force or --include-untracked option." -msgstr "终æ¢ã€‚考虑使用 --force 或者 --include-untracked 选项。" - -#: git-stash.sh:274 +#: git-stash.sh:262 msgid "Cannot initialize stash" msgstr "æ— æ³•åˆå§‹åŒ– stash" -#: git-stash.sh:278 +#: git-stash.sh:266 msgid "Cannot save the current status" msgstr "æ— æ³•ä¿å˜å½“å‰çжæ€" -#: git-stash.sh:296 +#: git-stash.sh:284 msgid "Cannot remove worktree changes" msgstr "æ— æ³•åˆ é™¤å·¥ä½œåŒºå˜æ›´" -#: git-stash.sh:395 +#: git-stash.sh:383 msgid "No stash found." msgstr "未å‘现 stash。" -#: git-stash.sh:402 +#: git-stash.sh:390 #, sh-format msgid "Too many revisions specified: $REV" msgstr "指定了太多的版本:$REV" -#: git-stash.sh:408 +#: git-stash.sh:396 #, sh-format msgid "$reference is not valid reference" msgstr "$reference 䏿˜¯æœ‰æ•ˆçš„引用" -#: git-stash.sh:436 +#: git-stash.sh:424 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "'$args' 䏿˜¯ stash æ ·æäº¤" -#: git-stash.sh:447 +#: git-stash.sh:435 #, sh-format msgid "'$args' is not a stash reference" msgstr "'$args' 䏿˜¯ä¸€ä¸ª stash 引用" -#: git-stash.sh:455 +#: git-stash.sh:443 msgid "unable to refresh index" msgstr "æ— æ³•åˆ·æ–°ç´¢å¼•" -#: git-stash.sh:459 +#: git-stash.sh:447 msgid "Cannot apply a stash in the middle of a merge" msgstr "æ— æ³•åœ¨åˆå¹¶è¿‡ç¨‹ä¸æ¢å¤è¿›åº¦" -#: git-stash.sh:467 +#: git-stash.sh:455 msgid "Conflicts in index. Try without --index." msgstr "ç´¢å¼•ä¸æœ‰å†²çªã€‚å°è¯•ä¸ä½¿ç”¨ --index。" -#: git-stash.sh:469 +#: git-stash.sh:457 msgid "Could not save index tree" msgstr "ä¸èƒ½ä¿å˜ç´¢å¼•æ ‘" -#: git-stash.sh:503 +#: git-stash.sh:491 msgid "Cannot unstage modified files" msgstr "æ— æ³•è¿˜åŽŸä¿®æ”¹çš„æ–‡ä»¶" -#: git-stash.sh:518 +#: git-stash.sh:506 msgid "Index was not unstashed." msgstr "索引的进度没有被æ¢å¤ã€‚" -#: git-stash.sh:535 +#: git-stash.sh:523 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "丢弃了 ${REV} ($s)" -#: git-stash.sh:536 +#: git-stash.sh:524 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}:ä¸èƒ½ä¸¢å¼ƒè¿›åº¦æ¡ç›®" -#: git-stash.sh:543 +#: git-stash.sh:531 msgid "No branch name specified" msgstr "未指定分支å" -#: git-stash.sh:615 +#: git-stash.sh:603 msgid "(To restore them type \"git stash apply\")" msgstr "(为æ¢å¤æ•°æ®è¾“å…¥ \"git stash apply\")" @@ -10114,75 +10474,75 @@ msgstr "æ— æ³•æ³¨å†Œåæ¨¡ç»„ '$sm_path'" msgid "Entering '$prefix$displaypath'" msgstr "æ£åœ¨è¿›å…¥ '$prefix$displaypath'" -#: git-submodule.sh:554 +#: git-submodule.sh:559 #, sh-format msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." msgstr "åœæ¢äºŽ '$prefix$displaypath',脚本返回éžé›¶å€¼ã€‚" -#: git-submodule.sh:600 +#: git-submodule.sh:605 #, sh-format msgid "No url found for submodule path '$displaypath' in .gitmodules" msgstr "在 .gitmodules 䏿œªæ‰¾åˆ°å模组路径 '$displaypath' çš„ url" -#: git-submodule.sh:609 +#: git-submodule.sh:614 #, sh-format msgid "Failed to register url for submodule path '$displaypath'" msgstr "æ— æ³•ä¸ºåæ¨¡ç»„路径 '$displaypath' 注册 url" -#: git-submodule.sh:611 +#: git-submodule.sh:616 #, sh-format msgid "Submodule '$name' ($url) registered for path '$displaypath'" msgstr "忍¡ç»„ '$name' ($url) 未对路径 '$displaypath' 注册" -#: git-submodule.sh:619 +#: git-submodule.sh:633 #, sh-format msgid "Failed to register update mode for submodule path '$displaypath'" msgstr "æ— æ³•ä¸ºåæ¨¡ç»„路径 '$displaypath' 注册更新模å¼" -#: git-submodule.sh:656 +#: git-submodule.sh:671 #, sh-format msgid "Use '.' if you really want to deinitialize all submodules" msgstr "使用 '.' 如果您真的想è¦å¯¹æ‰€æœ‰åæ¨¡ç»„å–æ¶ˆåˆå§‹åŒ–" -#: git-submodule.sh:673 +#: git-submodule.sh:688 #, sh-format msgid "Submodule work tree '$displaypath' contains a .git directory" msgstr "忍¡ç»„工作区 '$displaypath' 包å«ä¸€ä¸ª .git 目录" -#: git-submodule.sh:674 +#: git-submodule.sh:689 #, sh-format msgid "" "(use 'rm -rf' if you really want to remove it including all of its history)" msgstr "(使用 'rm -rf' å‘½ä»¤å¦‚æžœæ‚¨çœŸçš„æƒ³åˆ é™¤å®ƒåŠå…¶å…¨éƒ¨åކå²ï¼‰" -#: git-submodule.sh:680 +#: git-submodule.sh:695 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " "discard them" msgstr "忍¡ç»„工作区 '$displaypath' åŒ…å«æœ¬åœ°ä¿®æ”¹ï¼›ä½¿ç”¨ '-f' 丢弃它们" -#: git-submodule.sh:683 +#: git-submodule.sh:698 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "已清除目录 '$displaypath'" -#: git-submodule.sh:684 +#: git-submodule.sh:699 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "æ— æ³•ç§»é™¤åæ¨¡ç»„工作区 '$displaypath'" -#: git-submodule.sh:687 +#: git-submodule.sh:702 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "ä¸èƒ½åˆ›å»ºç©ºçš„忍¡ç»„目录 '$displaypath'" -#: git-submodule.sh:696 +#: git-submodule.sh:711 #, sh-format msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" msgstr "忍¡ç»„ '$name' ($url) 未对路径 '$displaypath' 注册" -#: git-submodule.sh:811 +#: git-submodule.sh:834 #, sh-format msgid "" "Submodule path '$displaypath' not initialized\n" @@ -10191,158 +10551,182 @@ msgstr "" "忍¡ç»„路径 '$displaypath' 没有åˆå§‹åŒ–\n" "也许您想用 'update --init'?" -#: git-submodule.sh:824 +#: git-submodule.sh:847 #, sh-format msgid "Unable to find current revision in submodule path '$displaypath'" msgstr "æ— æ³•åœ¨åæ¨¡ç»„路径 '$displaypath' 䏿‰¾åˆ°å½“å‰ç‰ˆæœ¬" -#: git-submodule.sh:833 +#: git-submodule.sh:856 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "æ— æ³•åœ¨åæ¨¡ç»„路径 '$sm_path' ä¸èŽ·å–" -#: git-submodule.sh:857 +#: git-submodule.sh:880 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "æ— æ³•åœ¨åæ¨¡ç»„路径 '$displaypath' ä¸èŽ·å–" -#: git-submodule.sh:871 +#: git-submodule.sh:894 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" msgstr "æ— æ³•åœ¨åæ¨¡ç»„路径 '$displaypath' ä¸å˜åŸº '$sha1'" -#: git-submodule.sh:872 +#: git-submodule.sh:895 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "忍¡ç»„路径 '$displaypath':å˜åŸºè‡³ '$sha1'" -#: git-submodule.sh:877 +#: git-submodule.sh:900 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "æ— æ³•åˆå¹¶ '$sha1' åˆ°åæ¨¡ç»„路径 '$displaypath' ä¸" -#: git-submodule.sh:878 +#: git-submodule.sh:901 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "忍¡ç»„路径 '$displaypath':已åˆå¹¶å…¥ '$sha1'" -#: git-submodule.sh:883 +#: git-submodule.sh:906 #, sh-format msgid "" "Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" msgstr "åœ¨åæ¨¡ç»„路径 '$prefix$sm_path' 䏿‰§è¡Œ '$command $sha1' 失败" -#: git-submodule.sh:884 +#: git-submodule.sh:907 #, sh-format msgid "Submodule path '$prefix$sm_path': '$command $sha1'" msgstr "忍¡ç»„路径 '$prefix$sm_path': '$command $sha1'" -#: git-submodule.sh:889 +#: git-submodule.sh:912 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "æ— æ³•åœ¨åæ¨¡ç»„路径 '$displaypath' 䏿£€å‡º '$sha1'" -#: git-submodule.sh:890 +#: git-submodule.sh:913 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "忍¡ç»„路径 '$displaypath':检出 '$sha1'" -#: git-submodule.sh:917 +#: git-submodule.sh:940 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "æ— æ³•é€’å½’è¿›åæ¨¡ç»„路径 '$displaypath'" -#: git-submodule.sh:1025 +#: git-submodule.sh:1048 msgid "The --cached option cannot be used with the --files option" msgstr "选项 --cached ä¸èƒ½å’Œé€‰é¡¹ --files åŒæ—¶ä½¿ç”¨" #. unexpected type -#: git-submodule.sh:1066 +#: git-submodule.sh:1096 #, sh-format msgid "unexpected mode $mod_dst" msgstr "æ„å¤–çš„æ¨¡å¼ $mod_dst" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:1086 +#: git-submodule.sh:1116 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr " è¦å‘Šï¼š$display_name æœªåŒ…å«æäº¤ $sha1_src" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:1089 +#: git-submodule.sh:1119 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr " è¦å‘Šï¼š$display_name æœªåŒ…å«æäº¤ $sha1_dst" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ -#: git-submodule.sh:1092 +#: git-submodule.sh:1122 #, sh-format msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" msgstr " è¦å‘Šï¼š$display_name æœªåŒ…å«æäº¤ $sha1_src å’Œ $sha1_dst" -#: git-submodule.sh:1117 +#: git-submodule.sh:1147 msgid "blob" msgstr "æ•°æ®å¯¹è±¡" -#: git-submodule.sh:1155 -msgid "Submodules changed but not updated:" -msgstr "忍¡ç»„已修改但尚未更新:" - -#: git-submodule.sh:1157 -msgid "Submodule changes to be committed:" -msgstr "è¦æäº¤çš„åæ¨¡ç»„å˜æ›´ï¼š" - -#: git-submodule.sh:1242 +#: git-submodule.sh:1261 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "æ— æ³•é€’å½’è¿›åæ¨¡ç»„路径 '$sm_path'" -#: git-submodule.sh:1306 +#: git-submodule.sh:1325 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "为 '$displaypath' åŒæ¥å模组 url" -#~ msgid "" -#~ "the following submodule (or one of its nested submodule)\n" -#~ "uses a .git directory:" -#~ msgid_plural "" -#~ "the following submodules (or one of its nested submodule)\n" -#~ "use a .git directory:" -#~ msgstr[0] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—çš„åæ¨¡ç»„)使用了一个 .git 目录:" -#~ msgstr[1] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—çš„åæ¨¡ç»„)使用了一个 .git 目录:" - -#~ msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" -#~ msgstr "æ— æ³•ä¿®æ”¹æœªåˆå¹¶çš„ .gitmodules,先解决åˆå¹¶å†²çª" - -#~ msgid "Could not find section in .gitmodules where path=%s" -#~ msgstr "æ— æ³•åœ¨ .gitmodules 䏿‰¾åˆ° path=%s çš„å°èŠ‚" - -#~ msgid "Could not update .gitmodules entry %s" -#~ msgstr "ä¸èƒ½æ›´æ–° .gitmodules æ¡ç›® %s" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#~ msgid "copied: %s -> %s" +#~ msgstr "æ‹·è´ï¼š %s -> %s" -#~ msgid "Could not remove .gitmodules entry for %s" -#~ msgstr "æ— æ³•ç§»é™¤ %s çš„ .gitmodules æ¡ç›®" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#~ msgid "deleted: %s" +#~ msgstr "åˆ é™¤ï¼š %s" -#~ msgid "could not find .gitmodules in index" -#~ msgstr "æ— æ³•åœ¨ç´¢å¼•ä¸æ‰¾åˆ° .gitmodules" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#~ msgid "modified: %s" +#~ msgstr "修改: %s" -#~ msgid "reading updated .gitmodules failed" -#~ msgstr "è¯»å–æ›´æ–°åŽçš„ .gitmodules 失败" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#~ msgid "renamed: %s -> %s" +#~ msgstr "é‡å‘½å: %s -> %s" -#~ msgid "unable to stat updated .gitmodules" -#~ msgstr "ä¸èƒ½æžšä¸¾æ›´æ–°åŽçš„ .gitmodules" +# 译者:为ä¿è¯åœ¨è¾“出ä¸å¯¹é½ï¼Œæ³¨æ„调整å¥ä¸ç©ºæ ¼ï¼ +#~ msgid "unmerged: %s" +#~ msgstr "未åˆå¹¶ï¼š %s" -#~ msgid "unable to remove .gitmodules from index" -#~ msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸ç§»é™¤ .gitmodules" +# 译者:å—ç¬¦ä¸²é¦–è¡Œè¡Œé¦–è¦æ·»åŠ â€œwarning: â€å—串,故æ¤é¦–行è¦è¾ƒå…¶ä½™è¡ŒçŸ +#~ 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" +#~ " 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')" + +#~ msgid "done\n" +#~ msgstr "完æˆ\n" + +#~ msgid "input paths are terminated by a null character" +#~ msgstr "输入路径以nullå—符终æ¢" -#~ msgid "adding updated .gitmodules failed" -#~ msgstr "æ·»åŠ æ›´æ–°åŽçš„ .gitmodules 失败" +#~ msgid "" +#~ "The following untracked files would NOT be saved but need to be removed " +#~ "by stash save:" +#~ msgstr "如下未跟踪文件将ä¸ä¼šè¢«ä¿å˜ä½†æ˜¯å°†ä¼šå› 为进度ä¿å˜è€Œéœ€è¦è¢«åˆ 除:" -#~ msgid "staging updated .gitmodules failed" -#~ msgstr "å°†æ›´æ–°åŽ .gitmodules æ·»åŠ æš‚å˜åŒºå¤±è´¥" +#~ msgid "" +#~ "Aborting. Consider using either the --force or --include-untracked option." +#~ msgstr "终æ¢ã€‚考虑使用 --force 或者 --include-untracked 选项。" -#~ msgid "Could not set core.worktree in %s" -#~ msgstr "ä¸èƒ½åœ¨ %s ä¸è®¾ç½® core.worktree" +#~ msgid "" +#~ "the following submodule (or one of its nested submodule)\n" +#~ "uses a .git directory:" +#~ msgid_plural "" +#~ "the following submodules (or one of its nested submodule)\n" +#~ "use a .git directory:" +#~ msgstr[0] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—çš„åæ¨¡ç»„)使用了一个 .git 目录:" +#~ msgstr[1] "如䏋忍¡ç»„ï¼ˆæˆ–ä¸€ä¸ªå…¶åµŒå¥—çš„åæ¨¡ç»„)使用了一个 .git 目录:" # 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼ #~ msgid " (fix conflicts and then run \"git am --resolved\")" @@ -10358,9 +10742,6 @@ msgstr "为 '$displaypath' åŒæ¥å模组 url" #~ msgid "You cannot combine --no-ff with --ff-only." #~ msgstr "您ä¸èƒ½å°† --no-ff 与 --ff-only åŒæ—¶ä½¿ç”¨ã€‚" -#~ msgid "Huh? Directory %s is in index and no submodule?" -#~ msgstr "嗯?目录 %s 在索引ä¸å¹¶ä¸”䏿˜¯å模组?" - #~ msgid "" #~ "submodule '%s' (or one of its nested submodules) uses a .git directory\n" #~ "(use 'rm -rf' if you really want to remove it including all of its " @@ -10479,9 +10860,6 @@ msgstr "为 '$displaypath' åŒæ¥å模组 url" #~ 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 åŒæ—¶ä½¿ç”¨" diff --git a/preload-index.c b/preload-index.c index 8c44ceb2c7..968ee25eae 100644 --- a/preload-index.c +++ b/preload-index.c @@ -3,6 +3,7 @@ */ #include "cache.h" #include "pathspec.h" +#include "dir.h" #ifdef NO_PTHREADS static void preload_index(struct index_state *index, @@ -53,7 +54,7 @@ static void *preload_thread(void *_data) continue; if (ce_uptodate(ce)) continue; - if (!ce_path_match(ce, &p->pathspec)) + if (!ce_path_match(ce, &p->pathspec, NULL)) continue; if (threaded_has_symlink_leading_path(&cache, ce->name, ce_namelen(ce))) continue; @@ -40,7 +40,7 @@ static int git_pretty_formats_config(const char *var, const char *value, void *c const char *fmt; int i; - if (prefixcmp(var, "pretty.")) + if (!starts_with(var, "pretty.")) return 0; name = var + strlen("pretty."); @@ -67,7 +67,7 @@ static int git_pretty_formats_config(const char *var, const char *value, void *c commit_format->name = xstrdup(name); commit_format->format = CMIT_FMT_USERFORMAT; git_config_string(&fmt, var, value); - if (!prefixcmp(fmt, "format:") || !prefixcmp(fmt, "tformat:")) { + if (starts_with(fmt, "format:") || starts_with(fmt, "tformat:")) { commit_format->is_tformat = fmt[0] == 't'; fmt = strchr(fmt, ':') + 1; } else if (strchr(fmt, '%')) @@ -115,7 +115,7 @@ static struct cmt_fmt_map *find_commit_format_recursive(const char *sought, for (i = 0; i < commit_formats_len; i++) { size_t match_len; - if (prefixcmp(commit_formats[i].name, sought)) + if (!starts_with(commit_formats[i].name, sought)) continue; match_len = strlen(commit_formats[i].name); @@ -151,7 +151,7 @@ void get_commit_format(const char *arg, struct rev_info *rev) rev->commit_format = CMIT_FMT_DEFAULT; return; } - if (!prefixcmp(arg, "format:") || !prefixcmp(arg, "tformat:")) { + if (starts_with(arg, "format:") || starts_with(arg, "tformat:")) { save_user_format(rev, strchr(arg, ':') + 1, arg[0] == 't'); return; } @@ -397,12 +397,18 @@ static const char *show_ident_date(const struct ident_split *ident, enum date_mode mode) { unsigned long date = 0; - int tz = 0; + long tz = 0; if (ident->date_begin && ident->date_end) date = strtoul(ident->date_begin, NULL, 10); - if (ident->tz_begin && ident->tz_end) - tz = strtol(ident->tz_begin, NULL, 10); + if (date_overflows(date)) + date = 0; + else { + if (ident->tz_begin && ident->tz_end) + tz = strtol(ident->tz_begin, NULL, 10); + if (tz >= INT_MAX || tz <= INT_MIN) + tz = 0; + } return show_date(date, tz, mode); } @@ -497,7 +503,7 @@ void pp_user_info(struct pretty_print_context *pp, static int is_empty_line(const char *line, int *len_p) { int len = *len_p; - while (len && isspace(line[len-1])) + while (len && isspace(line[len - 1])) len--; *len_p = len; return !len; @@ -840,10 +846,10 @@ static void parse_commit_header(struct format_commit_context *context) if (i == eol) { break; - } else if (!prefixcmp(msg + i, "author ")) { + } else if (starts_with(msg + i, "author ")) { context->author.off = i + 7; context->author.len = eol - i - 7; - } else if (!prefixcmp(msg + i, "committer ")) { + } else if (starts_with(msg + i, "committer ")) { context->committer.off = i + 10; context->committer.len = eol - i - 10; } @@ -983,7 +989,7 @@ static size_t parse_color(struct strbuf *sb, /* in UTF-8 */ if (!end) return 0; - if (!prefixcmp(begin, "auto,")) { + if (starts_with(begin, "auto,")) { if (!want_color(c->pretty_ctx->color)) return end - placeholder + 1; begin += 5; @@ -994,16 +1000,16 @@ static size_t parse_color(struct strbuf *sb, /* in UTF-8 */ strbuf_addstr(sb, color); return end - placeholder + 1; } - if (!prefixcmp(placeholder + 1, "red")) { + if (starts_with(placeholder + 1, "red")) { strbuf_addstr(sb, GIT_COLOR_RED); return 4; - } else if (!prefixcmp(placeholder + 1, "green")) { + } else if (starts_with(placeholder + 1, "green")) { strbuf_addstr(sb, GIT_COLOR_GREEN); return 6; - } else if (!prefixcmp(placeholder + 1, "blue")) { + } else if (starts_with(placeholder + 1, "blue")) { strbuf_addstr(sb, GIT_COLOR_BLUE); return 5; - } else if (!prefixcmp(placeholder + 1, "reset")) { + } else if (starts_with(placeholder + 1, "reset")) { strbuf_addstr(sb, GIT_COLOR_RESET); return 6; } else @@ -1060,11 +1066,11 @@ static size_t parse_padding_placeholder(struct strbuf *sb, end = strchr(start, ')'); if (!end || end == start) return 0; - if (!prefixcmp(start, "trunc)")) + if (starts_with(start, "trunc)")) c->truncate = trunc_right; - else if (!prefixcmp(start, "ltrunc)")) + else if (starts_with(start, "ltrunc)")) c->truncate = trunc_left; - else if (!prefixcmp(start, "mtrunc)")) + else if (starts_with(start, "mtrunc)")) c->truncate = trunc_middle; else return 0; @@ -1089,7 +1095,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ /* these are independent of the commit */ switch (placeholder[0]) { case 'C': - if (!prefixcmp(placeholder + 1, "(auto)")) { + if (starts_with(placeholder + 1, "(auto)")) { c->auto_color = 1; return 7; /* consumed 7 bytes, "C(auto)" */ } else { @@ -1556,7 +1562,7 @@ static void pp_header(struct pretty_print_context *pp, continue; } - if (!prefixcmp(line, "parent ")) { + if (starts_with(line, "parent ")) { if (linelen != 48) die("bad parent line in commit"); continue; @@ -1580,11 +1586,11 @@ static void pp_header(struct pretty_print_context *pp, * FULL shows both authors but not dates. * FULLER shows both authors and dates. */ - if (!prefixcmp(line, "author ")) { + if (starts_with(line, "author ")) { strbuf_grow(sb, linelen + 80); pp_user_info(pp, "Author", sb, line + 7, encoding); } - if (!prefixcmp(line, "committer ") && + if (starts_with(line, "committer ") && (pp->fmt == CMIT_FMT_FULL || pp->fmt == CMIT_FMT_FULLER)) { strbuf_grow(sb, linelen + 80); pp_user_info(pp, "Commit", sb, line + 10, encoding); diff --git a/progress.c b/progress.c index 10652b174d..261314ef3c 100644 --- a/progress.c +++ b/progress.c @@ -9,6 +9,7 @@ */ #include "git-compat-util.h" +#include "gettext.h" #include "progress.h" #include "strbuf.h" @@ -220,7 +221,7 @@ struct progress *start_progress(const char *title, unsigned total) void stop_progress(struct progress **p_progress) { - stop_progress_msg(p_progress, "done"); + stop_progress_msg(p_progress, _("done")); } void stop_progress_msg(struct progress **p_progress, const char *msg) @@ -22,6 +22,7 @@ static char *do_askpass(const char *cmd, const char *prompt) if (start_command(&pass)) return NULL; + strbuf_reset(&buffer); if (strbuf_read(&buffer, pass.out, 20) < 0) err = 1; @@ -38,7 +39,7 @@ static char *do_askpass(const char *cmd, const char *prompt) strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n")); - return strbuf_detach(&buffer, NULL); + return buffer.buf; } char *git_prompt(const char *prompt, int flags) diff --git a/read-cache.c b/read-cache.c index 33dd676ccb..f23c44a81a 100644 --- a/read-cache.c +++ b/read-cache.c @@ -15,7 +15,8 @@ #include "strbuf.h" #include "varint.h" -static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int really); +static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, + unsigned int options); /* Mask for the name length in ce_flags in the on-disk index */ @@ -47,6 +48,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache struct cache_entry *old = istate->cache[nr]; remove_name_hash(istate, old); + free(old); set_index_entry(istate, nr, ce); istate->cache_changed = 1; } @@ -58,7 +60,7 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n new = xmalloc(cache_entry_size(namelen)); copy_cache_entry(new, old); - new->ce_flags &= ~CE_STATE_MASK; + new->ce_flags &= ~CE_HASHED; new->ce_namelen = namelen; memcpy(new->name, new_name, namelen + 1); @@ -478,6 +480,7 @@ int remove_index_entry_at(struct index_state *istate, int pos) record_resolve_undo(istate, ce); remove_name_hash(istate, ce); + free(ce); istate->cache_changed = 1; istate->cache_nr--; if (pos >= istate->cache_nr) @@ -499,8 +502,10 @@ void remove_marked_cache_entries(struct index_state *istate) unsigned int i, j; for (i = j = 0; i < istate->cache_nr; i++) { - if (ce_array[i]->ce_flags & CE_REMOVE) + if (ce_array[i]->ce_flags & CE_REMOVE) { remove_name_hash(istate, ce_array[i]); + free(ce_array[i]); + } else ce_array[j++] = ce_array[i]; } @@ -579,7 +584,7 @@ static struct cache_entry *create_alias_ce(struct cache_entry *ce, struct cache_ return new; } -static void record_intent_to_add(struct cache_entry *ce) +void set_object_name_for_intent_to_add_entry(struct cache_entry *ce) { unsigned char sha1[20]; if (write_sha1_file("", 0, blob_type, sha1)) @@ -665,7 +670,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, if (index_path(ce->sha1, path, st, HASH_WRITE_OBJECT)) return error("unable to index file %s", path); } else - record_intent_to_add(ce); + set_object_name_for_intent_to_add_entry(ce); if (ignore_case && alias && different_name(ce, alias)) ce = create_alias_ce(ce, alias); @@ -696,7 +701,7 @@ int add_file_to_index(struct index_state *istate, const char *path, int flags) struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, - int refresh) + unsigned int refresh_options) { int size, len; struct cache_entry *ce; @@ -716,10 +721,7 @@ struct cache_entry *make_cache_entry(unsigned int mode, ce->ce_namelen = len; ce->ce_mode = create_ce_mode(mode); - if (refresh) - return refresh_cache_entry(ce, 0); - - return ce; + return refresh_cache_entry(ce, refresh_options); } int ce_same_name(const struct cache_entry *a, const struct cache_entry *b) @@ -728,11 +730,6 @@ int ce_same_name(const struct cache_entry *a, const struct cache_entry *b) return ce_namelen(b) == len && !memcmp(a->name, b->name, len); } -int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec) -{ - return match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL); -} - /* * We fundamentally don't like some paths: we don't want * dot or dot-dot anywhere, and for obvious reasons don't @@ -1029,10 +1026,12 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate, struct stat st; struct cache_entry *updated; int changed, size; + int refresh = options & CE_MATCH_REFRESH; int ignore_valid = options & CE_MATCH_IGNORE_VALID; int ignore_skip_worktree = options & CE_MATCH_IGNORE_SKIP_WORKTREE; + int ignore_missing = options & CE_MATCH_IGNORE_MISSING; - if (ce_uptodate(ce)) + if (!refresh || ce_uptodate(ce)) return ce; /* @@ -1050,6 +1049,8 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate, } if (lstat(ce->name, &st) < 0) { + if (ignore_missing && errno == ENOENT) + return ce; if (err) *err = errno; return NULL; @@ -1127,7 +1128,9 @@ int refresh_index(struct index_state *istate, unsigned int flags, int ignore_submodules = (flags & REFRESH_IGNORE_SUBMODULES) != 0; int first = 1; int in_porcelain = (flags & REFRESH_IN_PORCELAIN); - unsigned int options = really ? CE_MATCH_IGNORE_VALID : 0; + unsigned int options = (CE_MATCH_REFRESH | + (really ? CE_MATCH_IGNORE_VALID : 0) | + (not_new ? CE_MATCH_IGNORE_MISSING : 0)); const char *modified_fmt; const char *deleted_fmt; const char *typechange_fmt; @@ -1149,8 +1152,7 @@ int refresh_index(struct index_state *istate, unsigned int flags, if (ignore_submodules && S_ISGITLINK(ce->ce_mode)) continue; - if (pathspec && - !match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, seen)) + if (pathspec && !ce_path_match(ce, pathspec, seen)) filtered = 1; if (ce_stage(ce)) { @@ -1176,8 +1178,6 @@ int refresh_index(struct index_state *istate, unsigned int flags, if (!new) { const char *fmt; - if (not_new && cache_errno == ENOENT) - continue; if (really && cache_errno == EINVAL) { /* If we are doing --really-refresh that * means the index is not valid anymore. @@ -1207,9 +1207,10 @@ int refresh_index(struct index_state *istate, unsigned int flags, return has_errors; } -static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int really) +static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, + unsigned int options) { - return refresh_cache_ent(&the_index, ce, really, NULL, NULL); + return refresh_cache_ent(&the_index, ce, options, NULL, NULL); } @@ -1219,6 +1220,42 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int reall #define INDEX_FORMAT_DEFAULT 3 +static int index_format_config(const char *var, const char *value, void *cb) +{ + unsigned int *version = cb; + if (!strcmp(var, "index.version")) { + *version = git_config_int(var, value); + return 0; + } + return 1; +} + +static unsigned int get_index_format_default(void) +{ + char *envversion = getenv("GIT_INDEX_VERSION"); + char *endp; + unsigned int version = INDEX_FORMAT_DEFAULT; + + if (!envversion) { + git_config(index_format_config, &version); + if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) { + warning(_("index.version set, but the value is invalid.\n" + "Using version %i"), INDEX_FORMAT_DEFAULT); + return INDEX_FORMAT_DEFAULT; + } + return version; + } + + version = strtoul(envversion, &endp, 10); + if (*endp || + version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) { + warning(_("GIT_INDEX_VERSION set, but the value is invalid.\n" + "Using version %i"), INDEX_FORMAT_DEFAULT); + version = INDEX_FORMAT_DEFAULT; + } + return version; +} + /* * dev/ino/uid/gid/size are also just tracked to the low 32 bits * Again - this is just a (very strong in practice) heuristic that @@ -1313,26 +1350,6 @@ int read_index(struct index_state *istate) return read_index_from(istate, get_index_file()); } -#ifndef NEEDS_ALIGNED_ACCESS -#define ntoh_s(var) ntohs(var) -#define ntoh_l(var) ntohl(var) -#else -static inline uint16_t ntoh_s_force_align(void *p) -{ - uint16_t x; - memcpy(&x, p, sizeof(x)); - return ntohs(x); -} -static inline uint32_t ntoh_l_force_align(void *p) -{ - uint32_t x; - memcpy(&x, p, sizeof(x)); - return ntohl(x); -} -#define ntoh_s(var) ntoh_s_force_align(&(var)) -#define ntoh_l(var) ntoh_l_force_align(&(var)) -#endif - static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk, unsigned int flags, const char *name, @@ -1340,16 +1357,16 @@ static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *on { struct cache_entry *ce = xmalloc(cache_entry_size(len)); - ce->ce_stat_data.sd_ctime.sec = ntoh_l(ondisk->ctime.sec); - ce->ce_stat_data.sd_mtime.sec = ntoh_l(ondisk->mtime.sec); - ce->ce_stat_data.sd_ctime.nsec = ntoh_l(ondisk->ctime.nsec); - ce->ce_stat_data.sd_mtime.nsec = ntoh_l(ondisk->mtime.nsec); - ce->ce_stat_data.sd_dev = ntoh_l(ondisk->dev); - ce->ce_stat_data.sd_ino = ntoh_l(ondisk->ino); - ce->ce_mode = ntoh_l(ondisk->mode); - ce->ce_stat_data.sd_uid = ntoh_l(ondisk->uid); - ce->ce_stat_data.sd_gid = ntoh_l(ondisk->gid); - ce->ce_stat_data.sd_size = ntoh_l(ondisk->size); + ce->ce_stat_data.sd_ctime.sec = get_be32(&ondisk->ctime.sec); + ce->ce_stat_data.sd_mtime.sec = get_be32(&ondisk->mtime.sec); + ce->ce_stat_data.sd_ctime.nsec = get_be32(&ondisk->ctime.nsec); + ce->ce_stat_data.sd_mtime.nsec = get_be32(&ondisk->mtime.nsec); + ce->ce_stat_data.sd_dev = get_be32(&ondisk->dev); + ce->ce_stat_data.sd_ino = get_be32(&ondisk->ino); + ce->ce_mode = get_be32(&ondisk->mode); + ce->ce_stat_data.sd_uid = get_be32(&ondisk->uid); + ce->ce_stat_data.sd_gid = get_be32(&ondisk->gid); + ce->ce_stat_data.sd_size = get_be32(&ondisk->size); ce->ce_flags = flags & ~CE_NAMEMASK; ce->ce_namelen = len; hashcpy(ce->sha1, ondisk->sha1); @@ -1389,14 +1406,14 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk, unsigned int flags; /* On-disk flags are just 16 bits */ - flags = ntoh_s(ondisk->flags); + flags = get_be16(&ondisk->flags); len = flags & CE_NAMEMASK; if (flags & CE_EXTENDED) { struct ondisk_cache_entry_extended *ondisk2; int extended_flags; ondisk2 = (struct ondisk_cache_entry_extended *)ondisk; - extended_flags = ntoh_s(ondisk2->flags2) << 16; + extended_flags = get_be16(&ondisk2->flags2) << 16; /* We do not yet understand any bit out of CE_EXTENDED_FLAGS */ if (extended_flags & ~CE_EXTENDED_FLAGS) die("Unknown index entry format %08x", extended_flags); @@ -1795,7 +1812,7 @@ int write_index(struct index_state *istate, int newfd) } if (!istate->version) - istate->version = INDEX_FORMAT_DEFAULT; + istate->version = get_index_format_default(); /* demote version 3 to version 2 when the latter suffices */ if (istate->version == 3 || istate->version == 2) @@ -1894,7 +1911,7 @@ int read_index_unmerged(struct index_state *istate) new_ce->ce_mode = ce->ce_mode; if (add_index_entry(istate, new_ce, 0)) return error("%s: cannot drop to stage #0", - ce->name); + new_ce->name); i = index_name_pos(istate, new_ce->name, len); } return unmerged; @@ -637,7 +637,7 @@ static int do_one_ref(struct ref_entry *entry, void *cb_data) struct ref_entry *old_current_ref; int retval; - if (prefixcmp(entry->name, data->base)) + if (!starts_with(entry->name, data->base)) return 0; if (!(data->flags & DO_FOR_EACH_INCLUDE_BROKEN) && @@ -947,13 +947,6 @@ static struct ref_cache *get_ref_cache(const char *submodule) return refs; } -void invalidate_ref_cache(const char *submodule) -{ - struct ref_cache *refs = get_ref_cache(submodule); - clear_packed_ref_cache(refs); - clear_loose_ref_cache(refs); -} - /* The length of a peeled reference line in packed-refs, including EOL: */ #define PEELED_LINE_LENGTH 42 @@ -1049,7 +1042,7 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir) if (refname) { last = create_ref_entry(refname, sha1, REF_ISPACKED, 1); if (peeled == PEELED_FULLY || - (peeled == PEELED_TAGS && !prefixcmp(refname, "refs/tags/"))) + (peeled == PEELED_TAGS && starts_with(refname, "refs/tags/"))) last->flag |= REF_KNOWS_PEELED; add_ref(dir, last); continue; @@ -1383,7 +1376,7 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea return NULL; } buffer[len] = 0; - if (!prefixcmp(buffer, "refs/") && + if (starts_with(buffer, "refs/") && !check_refname_format(buffer, 0)) { strcpy(refname_buffer, buffer); refname = refname_buffer; @@ -1422,7 +1415,7 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea /* * Is it a symbolic ref? */ - if (prefixcmp(buffer, "ref:")) { + if (!starts_with(buffer, "ref:")) { /* * Please note that FETCH_HEAD has a second * line containing other data. @@ -1484,7 +1477,7 @@ static int filter_refs(const char *refname, const unsigned char *sha1, int flags void *data) { struct ref_filter *filter = (struct ref_filter *)data; - if (fnmatch(filter->pattern, refname, 0)) + if (wildmatch(filter->pattern, refname, 0, NULL)) return 0; return filter->fn(refname, sha1, flags, filter->cb_data); } @@ -1844,7 +1837,7 @@ int for_each_glob_ref_in(each_ref_fn fn, const char *pattern, struct ref_filter filter; int ret; - if (!prefix && prefixcmp(pattern, "refs/")) + if (!prefix && !starts_with(pattern, "refs/")) strbuf_addstr(&real_pattern, "refs/"); else if (prefix) strbuf_addstr(&real_pattern, prefix); @@ -1881,13 +1874,13 @@ int for_each_rawref(each_ref_fn fn, void *cb_data) const char *prettify_refname(const char *name) { return name + ( - !prefixcmp(name, "refs/heads/") ? 11 : - !prefixcmp(name, "refs/tags/") ? 10 : - !prefixcmp(name, "refs/remotes/") ? 13 : + starts_with(name, "refs/heads/") ? 11 : + starts_with(name, "refs/tags/") ? 10 : + starts_with(name, "refs/remotes/") ? 13 : 0); } -const char *ref_rev_parse_rules[] = { +static const char *ref_rev_parse_rules[] = { "%.*s", "refs/%.*s", "refs/tags/%.*s", @@ -1897,12 +1890,12 @@ const char *ref_rev_parse_rules[] = { NULL }; -int refname_match(const char *abbrev_name, const char *full_name, const char **rules) +int refname_match(const char *abbrev_name, const char *full_name) { const char **p; const int abbrev_name_len = strlen(abbrev_name); - for (p = rules; *p; p++) { + for (p = ref_rev_parse_rules; *p; p++) { if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) { return 1; } @@ -2046,6 +2039,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, int type, lflags; int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int missing = 0; + int attempts_remaining = 3; lock = xcalloc(1, sizeof(struct ref_lock)); lock->lock_fd = -1; @@ -2087,7 +2081,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, lock->lk = xcalloc(1, sizeof(struct lock_file)); - lflags = LOCK_DIE_ON_ERROR; + lflags = 0; if (flags & REF_NODEREF) { refname = orig_refname; lflags |= LOCK_NODEREF; @@ -2100,13 +2094,32 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) lock->force_write = 1; - if (safe_create_leading_directories(ref_file)) { + retry: + switch (safe_create_leading_directories(ref_file)) { + case SCLD_OK: + break; /* success */ + case SCLD_VANISHED: + if (--attempts_remaining > 0) + goto retry; + /* fall through */ + default: last_errno = errno; error("unable to create directory for %s", ref_file); goto error_return; } lock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, lflags); + if (lock->lock_fd < 0) { + if (errno == ENOENT && --attempts_remaining > 0) + /* + * Maybe somebody just deleted one of the + * directories leading to ref_file. Try + * again: + */ + goto retry; + else + unable_to_lock_index_die(ref_file, errno); + } return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock; error_return: @@ -2251,7 +2264,7 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data) struct pack_refs_cb_data *cb = cb_data; enum peel_status peel_status; struct ref_entry *packed_entry; - int is_tag_ref = !prefixcmp(entry->name, "refs/tags/"); + int is_tag_ref = starts_with(entry->name, "refs/tags/"); /* ALWAYS pack tags */ if (!(cb->flags & PACK_REFS_ALL) && !is_tag_ref) @@ -2515,6 +2528,51 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt) */ #define TMP_RENAMED_LOG "logs/refs/.tmp-renamed-log" +static int rename_tmp_log(const char *newrefname) +{ + int attempts_remaining = 4; + + retry: + switch (safe_create_leading_directories(git_path("logs/%s", newrefname))) { + case SCLD_OK: + break; /* success */ + case SCLD_VANISHED: + if (--attempts_remaining > 0) + goto retry; + /* fall through */ + default: + error("unable to create directory for %s", newrefname); + return -1; + } + + if (rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) { + if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) { + /* + * rename(a, b) when b is an existing + * directory ought to result in ISDIR, but + * Solaris 5.8 gives ENOTDIR. Sheesh. + */ + if (remove_empty_directories(git_path("logs/%s", newrefname))) { + error("Directory not empty: logs/%s", newrefname); + return -1; + } + goto retry; + } else if (errno == ENOENT && --attempts_remaining > 0) { + /* + * Maybe another process just deleted one of + * the directories in the path to newrefname. + * Try again from the beginning. + */ + goto retry; + } else { + error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s", + newrefname, strerror(errno)); + return -1; + } + } + return 0; +} + int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg) { unsigned char sha1[20], orig_sha1[20]; @@ -2562,30 +2620,9 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms } } - if (log && safe_create_leading_directories(git_path("logs/%s", newrefname))) { - error("unable to create directory for %s", newrefname); + if (log && rename_tmp_log(newrefname)) goto rollback; - } - retry: - if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) { - if (errno==EISDIR || errno==ENOTDIR) { - /* - * rename(a, b) when b is an existing - * directory ought to result in ISDIR, but - * Solaris 5.8 gives ENOTDIR. Sheesh. - */ - if (remove_empty_directories(git_path("logs/%s", newrefname))) { - error("Directory not empty: logs/%s", newrefname); - goto rollback; - } - goto retry; - } else { - error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s", - newrefname, strerror(errno)); - goto rollback; - } - } logmoved = log; lock = lock_ref_sha1_basic(newrefname, NULL, 0, NULL); @@ -2686,9 +2723,9 @@ int log_ref_setup(const char *refname, char *logfile, int bufsize) git_snpath(logfile, bufsize, "logs/%s", refname); if (log_all_ref_updates && - (!prefixcmp(refname, "refs/heads/") || - !prefixcmp(refname, "refs/remotes/") || - !prefixcmp(refname, "refs/notes/") || + (starts_with(refname, "refs/heads/") || + starts_with(refname, "refs/remotes/") || + starts_with(refname, "refs/notes/") || !strcmp(refname, "HEAD"))) { if (safe_create_leading_directories(logfile) < 0) return error("unable to create directory for %s", @@ -2758,7 +2795,7 @@ static int log_ref_write(const char *refname, const unsigned char *old_sha1, static int is_branch(const char *refname) { - return !strcmp(refname, "HEAD") || !prefixcmp(refname, "refs/heads/"); + return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/"); } int write_ref_sha1(struct ref_lock *lock, @@ -3341,29 +3378,6 @@ cleanup: return ret; } -/* - * generate a format suitable for scanf from a ref_rev_parse_rules - * rule, that is replace the "%.*s" spec with a "%s" spec - */ -static void gen_scanf_fmt(char *scanf_fmt, const char *rule) -{ - char *spec; - - spec = strstr(rule, "%.*s"); - if (!spec || strstr(spec + 4, "%.*s")) - die("invalid rule in ref_rev_parse_rules: %s", rule); - - /* copy all until spec */ - strncpy(scanf_fmt, rule, spec - rule); - scanf_fmt[spec - rule] = '\0'; - /* copy new spec */ - strcat(scanf_fmt, "%s"); - /* copy remaining rule */ - strcat(scanf_fmt, spec + 4); - - return; -} - char *shorten_unambiguous_ref(const char *refname, int strict) { int i; @@ -3371,23 +3385,29 @@ char *shorten_unambiguous_ref(const char *refname, int strict) static int nr_rules; char *short_name; - /* pre generate scanf formats from ref_rev_parse_rules[] */ if (!nr_rules) { + /* + * Pre-generate scanf formats from ref_rev_parse_rules[]. + * Generate a format suitable for scanf from a + * ref_rev_parse_rules rule by interpolating "%s" at the + * location of the "%.*s". + */ size_t total_len = 0; + size_t offset = 0; /* the rule list is NULL terminated, count them first */ - for (; ref_rev_parse_rules[nr_rules]; nr_rules++) - /* no +1 because strlen("%s") < strlen("%.*s") */ - total_len += strlen(ref_rev_parse_rules[nr_rules]); + for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++) + /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */ + total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1; scanf_fmts = xmalloc(nr_rules * sizeof(char *) + total_len); - total_len = 0; + offset = 0; for (i = 0; i < nr_rules; i++) { - scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] - + total_len; - gen_scanf_fmt(scanf_fmts[i], ref_rev_parse_rules[i]); - total_len += strlen(ref_rev_parse_rules[i]); + assert(offset < total_len); + scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset; + offset += snprintf(scanf_fmts[i], total_len - offset, + ref_rev_parse_rules[i], 2, "%s") + 1; } } @@ -3457,7 +3477,7 @@ int parse_hide_refs_config(const char *var, const char *value, const char *secti { if (!strcmp("transfer.hiderefs", var) || /* NEEDSWORK: use parse_config_key() once both are merged */ - (!prefixcmp(var, section) && var[strlen(section)] == '.' && + (starts_with(var, section) && var[strlen(section)] == '.' && !strcmp(var + strlen(section), ".hiderefs"))) { char *ref; int len; @@ -3485,7 +3505,7 @@ int ref_is_hidden(const char *refname) return 0; for_each_string_list_item(item, hide_refs) { int len; - if (prefixcmp(refname, item->string)) + if (!starts_with(refname, item->string)) continue; len = strlen(item->string); if (!refname[len] || refname[len] == '/') @@ -165,14 +165,6 @@ extern void unlock_ref(struct ref_lock *lock); /** Writes sha1 into the ref specified by the lock. **/ extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, const char *msg); -/* - * Invalidate the reference cache for the specified submodule. Use - * submodule=NULL to invalidate the cache for the main module. This - * function must be called if references are changed via a mechanism - * other than the refs API. - */ -extern void invalidate_ref_cache(const char *submodule); - /** Setup reflog before using. **/ int log_ref_setup(const char *ref_name, char *logfile, int bufsize); diff --git a/remote-curl.c b/remote-curl.c index b5ebe01800..52c2d96ce6 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -9,15 +9,20 @@ #include "string-list.h" #include "sideband.h" #include "argv-array.h" +#include "credential.h" +#include "sha1-array.h" static struct remote *remote; -static const char *url; /* always ends with a trailing slash */ +/* always ends with a trailing slash */ +static struct strbuf url = STRBUF_INIT; struct options { int verbosity; unsigned long depth; unsigned progress : 1, check_self_contained_and_connected : 1, + cloning : 1, + update_shallow : 1, followtags : 1, dry_run : 1, thin : 1; @@ -85,8 +90,23 @@ static int set_option(const char *name, const char *value) string_list_append(&cas_options, val.buf); strbuf_release(&val); return 0; - } - else { + } else if (!strcmp(name, "cloning")) { + if (!strcmp(value, "true")) + options.cloning = 1; + else if (!strcmp(value, "false")) + options.cloning = 0; + else + return -1; + return 0; + } else if (!strcmp(name, "update-shallow")) { + if (!strcmp(value, "true")) + options.update_shallow = 1; + else if (!strcmp(value, "false")) + options.update_shallow = 0; + else + return -1; + return 0; + } else { return 1 /* unsupported */; } } @@ -97,6 +117,7 @@ struct discovery { char *buf; size_t len; struct ref *refs; + struct sha1_array shallow; unsigned proto_git : 1; }; static struct discovery *last_discovery; @@ -105,7 +126,7 @@ static struct ref *parse_git_refs(struct discovery *heads, int for_push) { struct ref *list = NULL; get_remote_heads(-1, heads->buf, heads->len, &list, - for_push ? REF_NORMAL : 0, NULL); + for_push ? REF_NORMAL : 0, NULL, &heads->shallow); return list; } @@ -130,7 +151,8 @@ static struct ref *parse_info_refs(struct discovery *heads) mid = &data[i]; if (data[i] == '\n') { if (mid - start != 40) - die("%sinfo/refs not valid: is this a git repository?", url); + die("%sinfo/refs not valid: is this a git repository?", + url.buf); data[i] = 0; ref_name = mid + 1; ref = xmalloc(sizeof(struct ref) + @@ -149,7 +171,7 @@ static struct ref *parse_info_refs(struct discovery *heads) } ref = alloc_ref("HEAD"); - if (!http_fetch_ref(url, ref) && + if (!http_fetch_ref(url.buf, ref) && !resolve_remote_symref(ref, refs)) { ref->next = refs; refs = ref; @@ -165,6 +187,7 @@ static void free_discovery(struct discovery *d) if (d) { if (d == last_discovery) last_discovery = NULL; + free(d->shallow.sha1); free(d->buf_alloc); free_refs(d->refs); free(d); @@ -203,40 +226,47 @@ static struct discovery* discover_refs(const char *service, int for_push) struct strbuf exp = STRBUF_INIT; struct strbuf type = STRBUF_INIT; struct strbuf buffer = STRBUF_INIT; + struct strbuf refs_url = STRBUF_INIT; + struct strbuf effective_url = STRBUF_INIT; struct discovery *last = last_discovery; - char *refs_url; int http_ret, maybe_smart = 0; + struct http_get_options options; if (last && !strcmp(service, last->service)) return last; free_discovery(last); - strbuf_addf(&buffer, "%sinfo/refs", url); - if ((!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) && + strbuf_addf(&refs_url, "%sinfo/refs", url.buf); + if ((starts_with(url.buf, "http://") || starts_with(url.buf, "https://")) && git_env_bool("GIT_SMART_HTTP", 1)) { maybe_smart = 1; - if (!strchr(url, '?')) - strbuf_addch(&buffer, '?'); + if (!strchr(url.buf, '?')) + strbuf_addch(&refs_url, '?'); else - strbuf_addch(&buffer, '&'); - strbuf_addf(&buffer, "service=%s", service); + strbuf_addch(&refs_url, '&'); + strbuf_addf(&refs_url, "service=%s", service); } - refs_url = strbuf_detach(&buffer, NULL); - http_ret = http_get_strbuf(refs_url, &type, &buffer, - HTTP_NO_CACHE | HTTP_KEEP_ERROR); + memset(&options, 0, sizeof(options)); + options.content_type = &type; + options.effective_url = &effective_url; + options.base_url = &url; + options.no_cache = 1; + options.keep_error = 1; + + http_ret = http_get_strbuf(refs_url.buf, &buffer, &options); switch (http_ret) { case HTTP_OK: break; case HTTP_MISSING_TARGET: show_http_message(&type, &buffer); - die("repository '%s' not found", url); + die("repository '%s' not found", url.buf); case HTTP_NOAUTH: show_http_message(&type, &buffer); - die("Authentication failed for '%s'", url); + die("Authentication failed for '%s'", url.buf); default: show_http_message(&type, &buffer); - die("unable to access '%s': %s", url, curl_errorstr); + die("unable to access '%s': %s", url.buf, curl_errorstr); } last= xcalloc(1, sizeof(*last_discovery)); @@ -277,9 +307,10 @@ static struct discovery* discover_refs(const char *service, int for_push) else last->refs = parse_info_refs(last); - free(refs_url); + strbuf_release(&refs_url); strbuf_release(&exp); strbuf_release(&type); + strbuf_release(&effective_url); strbuf_release(&buffer); last_discovery = last; return last; @@ -383,25 +414,26 @@ static size_t rpc_in(char *ptr, size_t eltsize, return size; } -static int run_slot(struct active_request_slot *slot) +static int run_slot(struct active_request_slot *slot, + struct slot_results *results) { int err; - struct slot_results results; + struct slot_results results_buf; + + if (!results) + results = &results_buf; - slot->results = &results; - slot->curl_result = curl_easy_perform(slot->curl); - finish_active_slot(slot); + err = run_one_slot(slot, results); - err = handle_curl_result(&results); if (err != HTTP_OK && err != HTTP_REAUTH) { error("RPC failed; result=%d, HTTP code = %ld", - results.curl_result, results.http_code); + results->curl_result, results->http_code); } return err; } -static int probe_rpc(struct rpc_state *rpc) +static int probe_rpc(struct rpc_state *rpc, struct slot_results *results) { struct active_request_slot *slot; struct curl_slist *headers = NULL; @@ -423,7 +455,7 @@ static int probe_rpc(struct rpc_state *rpc) curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); curl_easy_setopt(slot->curl, CURLOPT_FILE, &buf); - err = run_slot(slot); + err = run_slot(slot, results); curl_slist_free_all(headers); strbuf_release(&buf); @@ -438,6 +470,7 @@ static int post_rpc(struct rpc_state *rpc) char *gzip_body = NULL; size_t gzip_size = 0; int err, large_request = 0; + int needs_100_continue = 0; /* Try to load the entire request, if we can fit it into the * allocated buffer space we can use HTTP/1.0 and avoid the @@ -461,16 +494,24 @@ static int post_rpc(struct rpc_state *rpc) } if (large_request) { + struct slot_results results; + do { - err = probe_rpc(rpc); + err = probe_rpc(rpc, &results); + if (err == HTTP_REAUTH) + credential_fill(&http_auth); } while (err == HTTP_REAUTH); if (err != HTTP_OK) return -1; + + if (results.auth_avail & CURLAUTH_GSSNEGOTIATE) + needs_100_continue = 1; } headers = curl_slist_append(headers, rpc->hdr_content_type); headers = curl_slist_append(headers, rpc->hdr_accept); - headers = curl_slist_append(headers, "Expect:"); + headers = curl_slist_append(headers, needs_100_continue ? + "Expect: 100-continue" : "Expect:"); retry: slot = get_active_slot(); @@ -561,9 +602,11 @@ retry: curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, rpc_in); curl_easy_setopt(slot->curl, CURLOPT_FILE, rpc); - err = run_slot(slot); - if (err == HTTP_REAUTH && !large_request) + err = run_slot(slot, NULL); + if (err == HTTP_REAUTH && !large_request) { + credential_fill(&http_auth); goto retry; + } if (err != HTTP_OK) err = -1; @@ -598,7 +641,7 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads) rpc->out = client.out; strbuf_init(&rpc->result, 0); - strbuf_addf(&buf, "%s%s", url, svc); + strbuf_addf(&buf, "%s%s", url.buf, svc); rpc->service_url = strbuf_detach(&buf, NULL); strbuf_addf(&buf, "Content-Type: application/x-%s-request", svc); @@ -650,7 +693,7 @@ static int fetch_dumb(int nr_heads, struct ref **to_fetch) for (i = 0; i < nr_heads; i++) targets[i] = xstrdup(sha1_to_hex(to_fetch[i]->old_sha1)); - walker = get_http_walker(url); + walker = get_http_walker(url.buf); walker->get_all = 1; walker->get_tree = 1; walker->get_history = 1; @@ -673,7 +716,7 @@ static int fetch_git(struct discovery *heads, struct strbuf preamble = STRBUF_INIT; char *depth_arg = NULL; int argc = 0, i, err; - const char *argv[16]; + const char *argv[17]; argv[argc++] = "fetch-pack"; argv[argc++] = "--stateless-rpc"; @@ -689,6 +732,10 @@ static int fetch_git(struct discovery *heads, } if (options.check_self_contained_and_connected) argv[argc++] = "--check-self-contained-and-connected"; + if (options.cloning) + argv[argc++] = "--cloning"; + if (options.update_shallow) + argv[argc++] = "--update-shallow"; if (!options.progress) argv[argc++] = "--no-progress"; if (options.depth) { @@ -697,14 +744,15 @@ static int fetch_git(struct discovery *heads, depth_arg = strbuf_detach(&buf, NULL); argv[argc++] = depth_arg; } - argv[argc++] = url; + argv[argc++] = url.buf; argv[argc++] = NULL; for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; if (!ref->name || !*ref->name) die("cannot fetch by sha1 over smart http"); - packet_buf_write(&preamble, "%s\n", ref->name); + packet_buf_write(&preamble, "%s %s\n", + sha1_to_hex(ref->old_sha1), ref->name); } packet_buf_flush(&preamble); @@ -740,7 +788,7 @@ static void parse_fetch(struct strbuf *buf) int alloc_heads = 0, nr_heads = 0; do { - if (!prefixcmp(buf->buf, "fetch ")) { + if (starts_with(buf->buf, "fetch ")) { char *p = buf->buf + strlen("fetch "); char *name; struct ref *ref; @@ -795,7 +843,7 @@ static int push_dav(int nr_spec, char **specs) argv[argc++] = "--dry-run"; if (options.verbosity > 1) argv[argc++] = "--verbose"; - argv[argc++] = url; + argv[argc++] = url.buf; for (i = 0; i < nr_spec; i++) argv[argc++] = specs[i]; argv[argc++] = NULL; @@ -828,7 +876,7 @@ static int push_git(struct discovery *heads, int nr_spec, char **specs) argv_array_push(&args, options.progress ? "--progress" : "--no-progress"); for_each_string_list_item(cas_option, &cas_options) argv_array_push(&args, cas_option->string); - argv_array_push(&args, url); + argv_array_push(&args, url.buf); for (i = 0; i < nr_spec; i++) argv_array_push(&args, specs[i]); @@ -863,7 +911,7 @@ static void parse_push(struct strbuf *buf) int alloc_spec = 0, nr_spec = 0, i, ret; do { - if (!prefixcmp(buf->buf, "push ")) { + if (starts_with(buf->buf, "push ")) { ALLOC_GROW(specs, nr_spec + 1, alloc_spec); specs[nr_spec++] = xstrdup(buf->buf + 5); } @@ -909,14 +957,12 @@ int main(int argc, const char **argv) remote = remote_get(argv[1]); if (argc > 2) { - end_url_with_slash(&buf, argv[2]); + end_url_with_slash(&url, argv[2]); } else { - end_url_with_slash(&buf, remote->url[0]); + end_url_with_slash(&url, remote->url[0]); } - url = strbuf_detach(&buf, NULL); - - http_init(remote, url, 0); + http_init(remote, url.buf, 0); do { if (strbuf_getline(&buf, stdin, '\n') == EOF) { @@ -928,19 +974,19 @@ int main(int argc, const char **argv) } if (buf.len == 0) break; - if (!prefixcmp(buf.buf, "fetch ")) { + if (starts_with(buf.buf, "fetch ")) { if (nongit) die("Fetch attempted without a local repo"); parse_fetch(&buf); - } else if (!strcmp(buf.buf, "list") || !prefixcmp(buf.buf, "list ")) { + } else if (!strcmp(buf.buf, "list") || starts_with(buf.buf, "list ")) { int for_push = !!strstr(buf.buf + 4, "for-push"); output_refs(get_refs(for_push)); - } else if (!prefixcmp(buf.buf, "push ")) { + } else if (starts_with(buf.buf, "push ")) { parse_push(&buf); - } else if (!prefixcmp(buf.buf, "option ")) { + } else if (starts_with(buf.buf, "option ")) { char *name = buf.buf + strlen("option "); char *value = strchr(name, ' '); int result; diff --git a/remote-testsvn.c b/remote-testsvn.c index d7cd5d272f..078f1ffa41 100644 --- a/remote-testsvn.c +++ b/remote-testsvn.c @@ -82,7 +82,7 @@ static int parse_rev_note(const char *msg, struct rev_note *res) len = end ? end - msg : strlen(msg); key = "Revision-number: "; - if (!prefixcmp(msg, key)) { + if (starts_with(msg, key)) { long i; char *end; value = msg + strlen(key); @@ -154,7 +154,7 @@ static void check_or_regenerate_marks(int latestrev) } else { strbuf_addf(&sb, ":%d ", latestrev); while (strbuf_getline(&line, marksfile, '\n') != EOF) { - if (!prefixcmp(line.buf, sb.buf)) { + if (starts_with(line.buf, sb.buf)) { found++; break; } @@ -264,7 +264,7 @@ static int do_command(struct strbuf *line) return 1; /* end of command stream, quit */ } if (batch_cmd) { - if (prefixcmp(batch_cmd->name, line->buf)) + if (!starts_with(batch_cmd->name, line->buf)) die("Active %s batch interrupted by %s", batch_cmd->name, line->buf); /* buffer batch lines */ string_list_append(&batchlines, line->buf); @@ -272,7 +272,7 @@ static int do_command(struct strbuf *line) } for (p = input_command_list; p->name; p++) { - if (!prefixcmp(line->buf, p->name) && (strlen(p->name) == line->len || + if (starts_with(line->buf, p->name) && (strlen(p->name) == line->len || line->buf[strlen(p->name)] == ' ')) { if (p->batchable) { batch_cmd = p; @@ -304,7 +304,7 @@ int main(int argc, char **argv) remote = remote_get(argv[1]); url_in = (argc == 3) ? argv[2] : remote->url[0]; - if (!prefixcmp(url_in, "file://")) { + if (starts_with(url_in, "file://")) { dump_from_file = 1; url = url_decode(url_in + sizeof("file://")-1); } else { @@ -49,6 +49,7 @@ static int branches_nr; static struct branch *current_branch; static const char *default_remote_name; +static const char *branch_pushremote_name; static const char *pushremote_name; static int explicit_default_remote_name; @@ -76,7 +77,7 @@ static const char *alias_url(const char *url, struct rewrites *r) if (!r->rewrite[i]) continue; for (j = 0; j < r->rewrite[i]->instead_of_nr; j++) { - if (!prefixcmp(url, r->rewrite[i]->instead_of[j].s) && + if (starts_with(url, r->rewrite[i]->instead_of[j].s) && (!longest || longest->len < r->rewrite[i]->instead_of[j].len)) { longest = &(r->rewrite[i]->instead_of[j]); @@ -239,13 +240,13 @@ static void read_remotes_file(struct remote *remote) int value_list; char *s, *p; - if (!prefixcmp(buffer, "URL:")) { + if (starts_with(buffer, "URL:")) { value_list = 0; s = buffer + 4; - } else if (!prefixcmp(buffer, "Push:")) { + } else if (starts_with(buffer, "Push:")) { value_list = 1; s = buffer + 5; - } else if (!prefixcmp(buffer, "Pull:")) { + } else if (starts_with(buffer, "Pull:")) { value_list = 2; s = buffer + 5; } else @@ -337,7 +338,7 @@ static int handle_config(const char *key, const char *value, void *cb) const char *subkey; struct remote *remote; struct branch *branch; - if (!prefixcmp(key, "branch.")) { + if (starts_with(key, "branch.")) { name = key + 7; subkey = strrchr(name, '.'); if (!subkey) @@ -352,7 +353,7 @@ static int handle_config(const char *key, const char *value, void *cb) } } else if (!strcmp(subkey, ".pushremote")) { if (branch == current_branch) - if (git_config_string(&pushremote_name, key, value)) + if (git_config_string(&branch_pushremote_name, key, value)) return -1; } else if (!strcmp(subkey, ".merge")) { if (!value) @@ -361,7 +362,7 @@ static int handle_config(const char *key, const char *value, void *cb) } return 0; } - if (!prefixcmp(key, "url.")) { + if (starts_with(key, "url.")) { struct rewrite *rewrite; name = key + 4; subkey = strrchr(name, '.'); @@ -380,7 +381,7 @@ static int handle_config(const char *key, const char *value, void *cb) } } - if (prefixcmp(key, "remote.")) + if (!starts_with(key, "remote.")) return 0; name = key + 7; @@ -483,15 +484,19 @@ static void read_config(void) int flag; if (default_remote_name) /* did this already */ return; - default_remote_name = xstrdup("origin"); + default_remote_name = "origin"; current_branch = NULL; head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && - !prefixcmp(head_ref, "refs/heads/")) { + starts_with(head_ref, "refs/heads/")) { current_branch = make_branch(head_ref + strlen("refs/heads/"), 0); } git_config(handle_config, NULL); + if (branch_pushremote_name) { + free((char *)pushremote_name); + pushremote_name = branch_pushremote_name; + } alias_all_urls(); } @@ -745,35 +750,66 @@ int for_each_remote(each_remote_fn fn, void *priv) return result; } -void ref_remove_duplicates(struct ref *ref_map) +static void handle_duplicate(struct ref *ref1, struct ref *ref2) +{ + if (strcmp(ref1->name, ref2->name)) { + if (ref1->fetch_head_status != FETCH_HEAD_IGNORE && + ref2->fetch_head_status != FETCH_HEAD_IGNORE) { + die(_("Cannot fetch both %s and %s to %s"), + ref1->name, ref2->name, ref2->peer_ref->name); + } else if (ref1->fetch_head_status != FETCH_HEAD_IGNORE && + ref2->fetch_head_status == FETCH_HEAD_IGNORE) { + warning(_("%s usually tracks %s, not %s"), + ref2->peer_ref->name, ref2->name, ref1->name); + } else if (ref1->fetch_head_status == FETCH_HEAD_IGNORE && + ref2->fetch_head_status == FETCH_HEAD_IGNORE) { + die(_("%s tracks both %s and %s"), + ref2->peer_ref->name, ref1->name, ref2->name); + } else { + /* + * This last possibility doesn't occur because + * FETCH_HEAD_IGNORE entries always appear at + * the end of the list. + */ + die(_("Internal error")); + } + } + free(ref2->peer_ref); + free(ref2); +} + +struct ref *ref_remove_duplicates(struct ref *ref_map) { struct string_list refs = STRING_LIST_INIT_NODUP; - struct string_list_item *item = NULL; - struct ref *prev = NULL, *next = NULL; - for (; ref_map; prev = ref_map, ref_map = next) { - next = ref_map->next; - if (!ref_map->peer_ref) - continue; + struct ref *retval = NULL; + struct ref **p = &retval; - item = string_list_lookup(&refs, ref_map->peer_ref->name); - if (item) { - if (strcmp(((struct ref *)item->util)->name, - ref_map->name)) - die("%s tracks both %s and %s", - ref_map->peer_ref->name, - ((struct ref *)item->util)->name, - ref_map->name); - prev->next = ref_map->next; - free(ref_map->peer_ref); - free(ref_map); - ref_map = prev; /* skip this; we freed it */ - continue; - } + while (ref_map) { + struct ref *ref = ref_map; - item = string_list_insert(&refs, ref_map->peer_ref->name); - item->util = ref_map; + ref_map = ref_map->next; + ref->next = NULL; + + if (!ref->peer_ref) { + *p = ref; + p = &ref->next; + } else { + struct string_list_item *item = + string_list_insert(&refs, ref->peer_ref->name); + + if (item->util) { + /* Entry already existed */ + handle_duplicate((struct ref *)item->util, ref); + } else { + *p = ref; + p = &ref->next; + item->util = ref; + } + } } + string_list_clear(&refs, 0); + return retval; } int remote_has_url(struct remote *remote, const char *url) @@ -821,10 +857,12 @@ static int match_name_with_pattern(const char *key, const char *name, return ret; } -static int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query) +int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query) { int i; int find_src = !query->src; + const char *needle = find_src ? query->dst : query->src; + char **result = find_src ? &query->src : &query->dst; if (find_src && !query->dst) return error("query_refspecs: need either src or dst"); @@ -833,8 +871,6 @@ static int query_refspecs(struct refspec *refs, int ref_count, struct refspec *q struct refspec *refspec = &refs[i]; const char *key = find_src ? refspec->dst : refspec->src; const char *value = find_src ? refspec->src : refspec->dst; - const char *needle = find_src ? query->dst : query->src; - char **result = find_src ? &query->src : &query->dst; if (!refspec->dst) continue; @@ -955,9 +991,9 @@ void sort_ref_list(struct ref **l, int (*cmp)(const void *, const void *)) *l = llist_mergesort(*l, ref_list_get_next, ref_list_set_next, cmp); } -static int count_refspec_match(const char *pattern, - struct ref *refs, - struct ref **matched_ref) +int count_refspec_match(const char *pattern, + struct ref *refs, + struct ref **matched_ref) { int patlen = strlen(pattern); struct ref *matched_weak = NULL; @@ -969,7 +1005,7 @@ static int count_refspec_match(const char *pattern, char *name = refs->name; int namelen = strlen(name); - if (!refname_match(pattern, name, ref_rev_parse_rules)) + if (!refname_match(pattern, name)) continue; /* A match is "weak" if it is with refs outside @@ -982,8 +1018,8 @@ static int count_refspec_match(const char *pattern, */ if (namelen != patlen && patlen != namelen - 5 && - prefixcmp(name, "refs/heads/") && - prefixcmp(name, "refs/tags/")) { + !starts_with(name, "refs/heads/") && + !starts_with(name, "refs/tags/")) { /* We want to catch the case where only weak * matches are found and there are multiple * matches, and where more than one strong @@ -1054,9 +1090,9 @@ static char *guess_ref(const char *name, struct ref *peer) if (!r) return NULL; - if (!prefixcmp(r, "refs/heads/")) + if (starts_with(r, "refs/heads/")) strbuf_addstr(&buf, "refs/heads/"); - else if (!prefixcmp(r, "refs/tags/")) + else if (starts_with(r, "refs/tags/")) strbuf_addstr(&buf, "refs/tags/"); else return NULL; @@ -1104,7 +1140,7 @@ static int match_explicit(struct ref *src, struct ref *dst, dst_value = resolve_ref_unsafe(matched_src->name, sha1, 1, &flag); if (!dst_value || ((flag & REF_ISSYMREF) && - prefixcmp(dst_value, "refs/heads/"))) + !starts_with(dst_value, "refs/heads/"))) die("%s cannot be resolved to branch.", matched_src->name); } @@ -1193,7 +1229,7 @@ static char *get_ref_match(const struct refspec *rs, int rs_nr, const struct ref * including refs outside refs/heads/ hierarchy, but * that does not make much sense these days. */ - if (!send_mirror && prefixcmp(ref->name, "refs/heads/")) + if (!send_mirror && !starts_with(ref->name, "refs/heads/")) return NULL; name = xstrdup(ref->name); } @@ -1248,7 +1284,7 @@ static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***ds add_to_tips(&sent_tips, ref->peer_ref->new_sha1); else add_to_tips(&sent_tips, ref->old_sha1); - if (!prefixcmp(ref->name, "refs/tags/")) + if (starts_with(ref->name, "refs/tags/")) string_list_append(&dst_tag, ref->name); } clear_commit_marks_many(sent_tips.nr, sent_tips.tip, TMP_MARK); @@ -1257,7 +1293,7 @@ static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***ds /* Collect tags they do not have. */ for (ref = src; ref; ref = ref->next) { - if (prefixcmp(ref->name, "refs/tags/")) + if (!starts_with(ref->name, "refs/tags/")) continue; /* not a tag */ if (string_list_has_string(&dst_tag, ref->name)) continue; /* they already have it */ @@ -1481,7 +1517,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror, */ else if (!ref->deletion && !is_null_sha1(ref->old_sha1)) { - if (!prefixcmp(ref->name, "refs/tags/")) + if (starts_with(ref->name, "refs/tags/")) reject_reason = REF_STATUS_REJECT_ALREADY_EXISTS; else if (!has_sha1_file(ref->old_sha1)) reject_reason = REF_STATUS_REJECT_FETCH_FIRST; @@ -1540,7 +1576,7 @@ int branch_merge_matches(struct branch *branch, { if (!branch || i < 0 || i >= branch->merge_nr) return 0; - return refname_match(branch->merge[i]->src, refname, ref_fetch_rules); + return refname_match(branch->merge[i]->src, refname); } static int ignore_symref_update(const char *refname) @@ -1553,6 +1589,13 @@ static int ignore_symref_update(const char *refname) return (flag & REF_ISSYMREF); } +/* + * Create and return a list of (struct ref) consisting of copies of + * each remote_ref that matches refspec. refspec must be a pattern. + * Fill in the copies' peer_ref to describe the local tracking refs to + * which they map. Omit any references that would map to an existing + * local symbolic ref. + */ static struct ref *get_expanded_map(const struct ref *remote_refs, const struct refspec *refspec) { @@ -1560,9 +1603,9 @@ static struct ref *get_expanded_map(const struct ref *remote_refs, struct ref *ret = NULL; struct ref **tail = &ret; - char *expn_name; - for (ref = remote_refs; ref; ref = ref->next) { + char *expn_name = NULL; + if (strchr(ref->name, '^')) continue; /* a dereference item */ if (match_name_with_pattern(refspec->src, ref->name, @@ -1571,12 +1614,12 @@ static struct ref *get_expanded_map(const struct ref *remote_refs, struct ref *cpy = copy_ref(ref); cpy->peer_ref = alloc_ref(expn_name); - free(expn_name); if (refspec->force) cpy->peer_ref->force = 1; *tail = cpy; tail = &cpy->next; } + free(expn_name); } return ret; @@ -1586,7 +1629,7 @@ static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const c { const struct ref *ref; for (ref = refs; ref; ref = ref->next) { - if (refname_match(name, ref->name, ref_fetch_rules)) + if (refname_match(name, ref->name)) return ref; } return NULL; @@ -1607,12 +1650,12 @@ static struct ref *get_local_ref(const char *name) if (!name || name[0] == '\0') return NULL; - if (!prefixcmp(name, "refs/")) + if (starts_with(name, "refs/")) return alloc_ref(name); - if (!prefixcmp(name, "heads/") || - !prefixcmp(name, "tags/") || - !prefixcmp(name, "remotes/")) + if (starts_with(name, "heads/") || + starts_with(name, "tags/") || + starts_with(name, "remotes/")) return alloc_ref_with_prefix("refs/", 5, name); return alloc_ref_with_prefix("refs/heads/", 11, name); @@ -1647,7 +1690,7 @@ int get_fetch_map(const struct ref *remote_refs, for (rmp = &ref_map; *rmp; ) { if ((*rmp)->peer_ref) { - if (prefixcmp((*rmp)->peer_ref->name, "refs/") || + if (!starts_with((*rmp)->peer_ref->name, "refs/") || check_refname_format((*rmp)->peer_ref->name, 0)) { struct ref *ignore = *rmp; error("* Ignoring funny ref '%s' locally", @@ -1931,7 +1974,7 @@ struct ref *guess_remote_head(const struct ref *head, /* Look for another ref that points there */ for (r = refs; r; r = r->next) { if (r != head && - !prefixcmp(r->name, "refs/heads/") && + starts_with(r->name, "refs/heads/") && !hashcmp(r->old_sha1, head->old_sha1)) { *tail = copy_ref(r); tail = &((*tail)->next); @@ -2083,7 +2126,7 @@ static void apply_cas(struct push_cas_option *cas, /* Find an explicit --<option>=<name>[:<value>] entry */ for (i = 0; i < cas->nr; i++) { struct push_cas *entry = &cas->entry[i]; - if (!refname_match(entry->refname, ref->name, ref_rev_parse_rules)) + if (!refname_match(entry->refname, ref->name)) continue; ref->expect_old_sha1 = 1; if (!entry->use_tracking) @@ -109,6 +109,7 @@ struct ref { REF_STATUS_REJECT_FETCH_FIRST, REF_STATUS_REJECT_NEEDS_FORCE, REF_STATUS_REJECT_STALE, + REF_STATUS_REJECT_SHALLOW, REF_STATUS_UPTODATE, REF_STATUS_REMOTE_REJECT, REF_STATUS_EXPECTING_REPORT @@ -128,6 +129,7 @@ struct ref *alloc_ref(const char *name); struct ref *copy_ref(const struct ref *ref); struct ref *copy_ref_list(const struct ref *ref); void sort_ref_list(struct ref **, int (*cmp)(const void *, const void *)); +extern int count_refspec_match(const char *, struct ref *refs, struct ref **matched_ref); int ref_compare_name(const void *, const void *); int check_ref_type(const struct ref *ref, int flags); @@ -137,27 +139,30 @@ int check_ref_type(const struct ref *ref, int flags); */ void free_refs(struct ref *ref); -struct extra_have_objects { - int nr, alloc; - unsigned char (*array)[20]; -}; +struct sha1_array; extern struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, struct ref **list, unsigned int flags, - struct extra_have_objects *); + struct sha1_array *extra_have, + struct sha1_array *shallow); int resolve_remote_symref(struct ref *ref, struct ref *list); int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1); /* - * Removes and frees any duplicate refs in the map. + * Remove and free all but the first of any entries in the input list + * that map the same remote reference to the same local reference. If + * there are two entries that map different remote references to the + * same local reference, emit an error message and die. Return a + * pointer to the head of the resulting list. */ -void ref_remove_duplicates(struct ref *ref_map); +struct ref *ref_remove_duplicates(struct ref *ref_map); int valid_fetch_refspec(const char *refspec); struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec); void free_refspec(int nr_refspec, struct refspec *refspec); +extern int query_refspecs(struct refspec *specs, int nr, struct refspec *query); char *apply_refspecs(struct refspec *refspecs, int nr_refspec, const char *name); diff --git a/replace_object.c b/replace_object.c index d0b1548726..4ee4c8d104 100644 --- a/replace_object.c +++ b/replace_object.c @@ -3,8 +3,13 @@ #include "refs.h" #include "commit.h" +/* + * An array of replacements. The array is kept sorted by the original + * sha1. + */ static struct replace_object { - unsigned char sha1[2][20]; + unsigned char original[20]; + unsigned char replacement[20]; } **replace_object; static int replace_object_alloc, replace_object_nr; @@ -12,7 +17,7 @@ static int replace_object_alloc, replace_object_nr; static const unsigned char *replace_sha1_access(size_t index, void *table) { struct replace_object **replace = table; - return replace[index]->sha1[0]; + return replace[index]->original; } static int replace_object_pos(const unsigned char *sha1) @@ -24,7 +29,7 @@ static int replace_object_pos(const unsigned char *sha1) static int register_replace_object(struct replace_object *replace, int ignore_dups) { - int pos = replace_object_pos(replace->sha1[0]); + int pos = replace_object_pos(replace->original); if (0 <= pos) { if (ignore_dups) @@ -60,14 +65,14 @@ static int register_replace_ref(const char *refname, const char *hash = slash ? slash + 1 : refname; struct replace_object *repl_obj = xmalloc(sizeof(*repl_obj)); - if (strlen(hash) != 40 || get_sha1_hex(hash, repl_obj->sha1[0])) { + if (strlen(hash) != 40 || get_sha1_hex(hash, repl_obj->original)) { free(repl_obj); warning("bad replace ref name: %s", refname); return 0; } /* Copy sha1 from the read ref */ - hashcpy(repl_obj->sha1[1], sha1); + hashcpy(repl_obj->replacement, sha1); /* Register new object */ if (register_replace_object(repl_obj, 1)) @@ -86,20 +91,24 @@ static void prepare_replace_object(void) for_each_replace_ref(register_replace_ref, NULL); replace_object_prepared = 1; if (!replace_object_nr) - read_replace_refs = 0; + check_replace_refs = 0; } /* We allow "recursive" replacement. Only within reason, though */ #define MAXREPLACEDEPTH 5 +/* + * If a replacement for object sha1 has been set up, return the + * replacement object's name (replaced recursively, if necessary). + * The return value is either sha1 or a pointer to a + * permanently-allocated value. This function always respects replace + * references, regardless of the value of check_replace_refs. + */ const unsigned char *do_lookup_replace_object(const unsigned char *sha1) { int pos, depth = MAXREPLACEDEPTH; const unsigned char *cur = sha1; - if (!read_replace_refs) - return sha1; - prepare_replace_object(); /* Try to recursively replace the object */ @@ -110,7 +119,7 @@ const unsigned char *do_lookup_replace_object(const unsigned char *sha1) pos = replace_object_pos(cur); if (0 <= pos) - cur = replace_object[pos]->sha1[1]; + cur = replace_object[pos]->replacement; } while (0 <= pos); return cur; @@ -672,8 +672,8 @@ int rerere_forget(struct pathspec *pathspec) find_conflict(&conflict); for (i = 0; i < conflict.nr; i++) { struct string_list_item *it = &conflict.items[i]; - if (!match_pathspec_depth(pathspec, it->string, strlen(it->string), - 0, NULL)) + if (!match_pathspec(pathspec, it->string, + strlen(it->string), 0, NULL, 0)) continue; rerere_forget_one_path(it->string, &merge_rr); } diff --git a/resolve-undo.c b/resolve-undo.c index c09b00664e..44c697c36d 100644 --- a/resolve-undo.c +++ b/resolve-undo.c @@ -119,6 +119,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos) struct string_list_item *item; struct resolve_undo_info *ru; int i, err = 0, matched; + char *name; if (!istate->resolve_undo) return pos; @@ -138,20 +139,22 @@ int unmerge_index_entry_at(struct index_state *istate, int pos) if (!ru) return pos; matched = ce->ce_flags & CE_MATCHED; + name = xstrdup(ce->name); remove_index_entry_at(istate, pos); for (i = 0; i < 3; i++) { struct cache_entry *nce; if (!ru->mode[i]) continue; nce = make_cache_entry(ru->mode[i], ru->sha1[i], - ce->name, i + 1, 0); + name, i + 1, 0); if (matched) nce->ce_flags |= CE_MATCHED; if (add_index_entry(istate, nce, ADD_CACHE_OK_TO_ADD)) { err = 1; - error("cannot unmerge '%s'", ce->name); + error("cannot unmerge '%s'", name); } } + free(name); if (err) return pos; free(ru); @@ -182,7 +185,7 @@ void unmerge_index(struct index_state *istate, const struct pathspec *pathspec) for (i = 0; i < istate->cache_nr; i++) { const struct cache_entry *ce = istate->cache[i]; - if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL)) + if (!ce_path_match(ce, pathspec, NULL)) continue; i = unmerge_index_entry_at(istate, i); } diff --git a/revision.c b/revision.c index 0173e0148b..78b5c3ac0b 100644 --- a/revision.c +++ b/revision.c @@ -16,6 +16,7 @@ #include "line-log.h" #include "mailmap.h" #include "commit-slab.h" +#include "dir.h" volatile show_early_output_fn_t show_early_output; @@ -104,17 +105,12 @@ static void mark_blob_uninteresting(struct blob *blob) blob->object.flags |= UNINTERESTING; } -void mark_tree_uninteresting(struct tree *tree) +static void mark_tree_contents_uninteresting(struct tree *tree) { struct tree_desc desc; struct name_entry entry; struct object *obj = &tree->object; - if (!tree) - return; - if (obj->flags & UNINTERESTING) - return; - obj->flags |= UNINTERESTING; if (!has_sha1_file(obj->sha1)) return; if (parse_tree(tree) < 0) @@ -142,6 +138,18 @@ void mark_tree_uninteresting(struct tree *tree) free_tree_buffer(tree); } +void mark_tree_uninteresting(struct tree *tree) +{ + struct object *obj = &tree->object; + + if (!tree) + return; + if (obj->flags & UNINTERESTING) + return; + obj->flags |= UNINTERESTING; + mark_tree_contents_uninteresting(tree); +} + void mark_parents_uninteresting(struct commit *commit) { struct commit_list *parents = NULL, *l; @@ -276,6 +284,7 @@ static struct commit *handle_commit(struct rev_info *revs, return NULL; die("bad object %s", sha1_to_hex(tag->tagged->sha1)); } + object->flags |= flags; } /* @@ -287,7 +296,6 @@ static struct commit *handle_commit(struct rev_info *revs, if (parse_commit(commit) < 0) die("unable to parse commit %s", name); if (flags & UNINTERESTING) { - commit->object.flags |= UNINTERESTING; mark_parents_uninteresting(commit); revs->limited = 1; } @@ -305,7 +313,7 @@ static struct commit *handle_commit(struct rev_info *revs, if (!revs->tree_objects) return NULL; if (flags & UNINTERESTING) { - mark_tree_uninteresting(tree); + mark_tree_contents_uninteresting(tree); return NULL; } add_pending_object(revs, object, ""); @@ -316,13 +324,10 @@ static struct commit *handle_commit(struct rev_info *revs, * Blob object? You know the drill by now.. */ if (object->type == OBJ_BLOB) { - struct blob *blob = (struct blob *)object; if (!revs->blob_objects) return NULL; - if (flags & UNINTERESTING) { - mark_blob_uninteresting(blob); + if (flags & UNINTERESTING) return NULL; - } add_pending_object(revs, object, ""); return NULL; } @@ -492,24 +497,14 @@ static int rev_compare_tree(struct rev_info *revs, static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit) { int retval; - void *tree; - unsigned long size; - struct tree_desc empty, real; struct tree *t1 = commit->tree; if (!t1) return 0; - tree = read_object_with_reference(t1->object.sha1, tree_type, &size, NULL); - if (!tree) - return 0; - init_tree_desc(&real, tree, size); - init_tree_desc(&empty, "", 0); - tree_difference = REV_TREE_SAME; DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES); - retval = diff_tree(&empty, &real, "", &revs->pruning); - free(tree); + retval = diff_tree_sha1(NULL, t1->object.sha1, "", &revs->pruning); return retval >= 0 && (tree_difference == REV_TREE_SAME); } @@ -779,6 +774,10 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, return 0; commit->object.flags |= ADDED; + if (revs->include_check && + !revs->include_check(commit, revs->include_check_data)) + return 0; + /* * If the commit is uninteresting, don't try to * prune parents - we want the maximal uninteresting @@ -1180,11 +1179,28 @@ struct all_refs_cb { const char *name_for_errormsg; }; +int ref_excluded(struct string_list *ref_excludes, const char *path) +{ + struct string_list_item *item; + + if (!ref_excludes) + return 0; + for_each_string_list_item(item, ref_excludes) { + if (!wildmatch(item->string, path, 0, NULL)) + return 1; + } + return 0; +} + static int handle_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) { struct all_refs_cb *cb = cb_data; - struct object *object = get_reference(cb->all_revs, path, sha1, - cb->all_flags); + struct object *object; + + if (ref_excluded(cb->all_revs->ref_excludes, path)) + return 0; + + object = get_reference(cb->all_revs, path, sha1, cb->all_flags); add_rev_cmdline(cb->all_revs, object, path, REV_CMD_REF, cb->all_flags); add_pending_sha1(cb->all_revs, path, sha1, cb->all_flags); return 0; @@ -1197,6 +1213,24 @@ static void init_all_refs_cb(struct all_refs_cb *cb, struct rev_info *revs, cb->all_flags = flags; } +void clear_ref_exclusion(struct string_list **ref_excludes_p) +{ + if (*ref_excludes_p) { + string_list_clear(*ref_excludes_p, 0); + free(*ref_excludes_p); + } + *ref_excludes_p = NULL; +} + +void add_ref_exclusion(struct string_list **ref_excludes_p, const char *exclude) +{ + if (!*ref_excludes_p) { + *ref_excludes_p = xcalloc(1, sizeof(**ref_excludes_p)); + (*ref_excludes_p)->strdup_strings = 1; + } + string_list_append(*ref_excludes_p, exclude); +} + static void handle_refs(const char *submodule, struct rev_info *revs, unsigned flags, int (*for_each)(const char *, each_ref_fn, void *)) { @@ -1361,7 +1395,7 @@ static void prepare_show_merge(struct rev_info *revs) const struct cache_entry *ce = active_cache[i]; if (!ce_stage(ce)) continue; - if (ce_path_match(ce, &revs->prune_data)) { + if (ce_path_match(ce, &revs->prune_data, NULL)) { prune_num++; prune = xrealloc(prune, sizeof(*prune) * prune_num); prune[prune_num-2] = ce->name; @@ -1372,7 +1406,8 @@ static void prepare_show_merge(struct rev_info *revs) i++; } free_pathspec(&revs->prune_data); - parse_pathspec(&revs->prune_data, PATHSPEC_ALL_MAGIC, 0, "", prune); + parse_pathspec(&revs->prune_data, PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL, + PATHSPEC_PREFER_FULL | PATHSPEC_LITERAL_PATH, "", prune); revs->limited = 1; } @@ -1419,26 +1454,40 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi } if (!get_sha1_committish(this, from_sha1) && !get_sha1_committish(next, sha1)) { - struct commit *a, *b; - struct commit_list *exclude; - - a = lookup_commit_reference(from_sha1); - b = lookup_commit_reference(sha1); - if (!a || !b) { - if (revs->ignore_missing) - return 0; - die(symmetric ? - "Invalid symmetric difference expression %s...%s" : - "Invalid revision range %s..%s", - arg, next); - } + struct object *a_obj, *b_obj; if (!cant_be_filename) { *dotdot = '.'; verify_non_filename(revs->prefix, arg); } - if (symmetric) { + a_obj = parse_object(from_sha1); + b_obj = parse_object(sha1); + if (!a_obj || !b_obj) { + missing: + if (revs->ignore_missing) + return 0; + die(symmetric + ? "Invalid symmetric difference expression %s" + : "Invalid revision range %s", arg); + } + + if (!symmetric) { + /* just A..B */ + a_flags = flags_exclude; + } else { + /* A...B -- find merge bases between the two */ + struct commit *a, *b; + struct commit_list *exclude; + + a = (a_obj->type == OBJ_COMMIT + ? (struct commit *)a_obj + : lookup_commit_reference(a_obj->sha1)); + b = (b_obj->type == OBJ_COMMIT + ? (struct commit *)b_obj + : lookup_commit_reference(b_obj->sha1)); + if (!a || !b) + goto missing; exclude = get_merge_bases(a, b, 1); add_rev_cmdline_list(revs, exclude, REV_CMD_MERGE_BASE, @@ -1446,17 +1495,18 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi add_pending_commit_list(revs, exclude, flags_exclude); free_commit_list(exclude); + a_flags = flags | SYMMETRIC_LEFT; - } else - a_flags = flags_exclude; - a->object.flags |= a_flags; - b->object.flags |= flags; - add_rev_cmdline(revs, &a->object, this, + } + + a_obj->flags |= a_flags; + b_obj->flags |= flags; + add_rev_cmdline(revs, a_obj, this, REV_CMD_LEFT, a_flags); - add_rev_cmdline(revs, &b->object, next, + add_rev_cmdline(revs, b_obj, next, REV_CMD_RIGHT, flags); - add_pending_object(revs, &a->object, this); - add_pending_object(revs, &b->object, next); + add_pending_object(revs, a_obj, this); + add_pending_object(revs, b_obj, next); return 0; } *dotdot = '.'; @@ -1503,7 +1553,7 @@ struct cmdline_pathspec { static void append_prune_data(struct cmdline_pathspec *prune, const char **av) { while (*av) { - ALLOC_GROW(prune->path, prune->nr+1, prune->alloc); + ALLOC_GROW(prune->path, prune->nr + 1, prune->alloc); prune->path[prune->nr++] = *(av++); } } @@ -1515,7 +1565,7 @@ static void read_pathspec_from_stdin(struct rev_info *revs, struct strbuf *sb, int len = sb->len; if (len && sb->buf[len - 1] == '\n') sb->buf[--len] = '\0'; - ALLOC_GROW(prune->path, prune->nr+1, prune->alloc); + ALLOC_GROW(prune->path, prune->nr + 1, prune->alloc); prune->path[prune->nr++] = xstrdup(sb->buf); } } @@ -1576,9 +1626,9 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg !strcmp(arg, "--tags") || !strcmp(arg, "--remotes") || !strcmp(arg, "--reflog") || !strcmp(arg, "--not") || !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, "--no-walk=")) + !strcmp(arg, "--bisect") || starts_with(arg, "--glob=") || + starts_with(arg, "--branches=") || starts_with(arg, "--tags=") || + starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk=")) { unkv[(*unkc)++] = arg; return 1; @@ -1601,7 +1651,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->max_count = atoi(argv[1]); revs->no_walk = 0; return 2; - } else if (!prefixcmp(arg, "-n")) { + } else if (starts_with(arg, "-n")) { revs->max_count = atoi(arg + 2); revs->no_walk = 0; } else if ((argcount = parse_long_opt("max-age", argv, &optarg))) { @@ -1661,7 +1711,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if (!strcmp(arg, "--author-date-order")) { revs->sort_order = REV_SORT_BY_AUTHOR_DATE; revs->topo_order = 1; - } else if (!prefixcmp(arg, "--early-output")) { + } else if (starts_with(arg, "--early-output")) { int count = 100; switch (arg[14]) { case '=': @@ -1686,13 +1736,13 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->min_parents = 2; } else if (!strcmp(arg, "--no-merges")) { revs->max_parents = 1; - } else if (!prefixcmp(arg, "--min-parents=")) { + } else if (starts_with(arg, "--min-parents=")) { revs->min_parents = atoi(arg+14); - } else if (!prefixcmp(arg, "--no-min-parents")) { + } else if (starts_with(arg, "--no-min-parents")) { revs->min_parents = 0; - } else if (!prefixcmp(arg, "--max-parents=")) { + } else if (starts_with(arg, "--max-parents=")) { revs->max_parents = atoi(arg+14); - } else if (!prefixcmp(arg, "--no-max-parents")) { + } else if (starts_with(arg, "--no-max-parents")) { revs->max_parents = -1; } else if (!strcmp(arg, "--boundary")) { revs->boundary = 1; @@ -1742,7 +1792,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->verify_objects = 1; } else if (!strcmp(arg, "--unpacked")) { revs->unpacked = 1; - } else if (!prefixcmp(arg, "--unpacked=")) { + } else if (starts_with(arg, "--unpacked=")) { die("--unpacked=<packfile> no longer supported."); } else if (!strcmp(arg, "-r")) { revs->diff = 1; @@ -1767,7 +1817,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->verbose_header = 1; revs->pretty_given = 1; get_commit_format(arg+8, revs); - } else if (!prefixcmp(arg, "--pretty=") || !prefixcmp(arg, "--format=")) { + } else if (starts_with(arg, "--pretty=") || starts_with(arg, "--format=")) { /* * Detached form ("--pretty X" as opposed to "--pretty=X") * not allowed, since the argument is optional. @@ -1781,12 +1831,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->notes_opt.use_default_notes = 1; } else if (!strcmp(arg, "--show-signature")) { revs->show_signature = 1; - } else if (!prefixcmp(arg, "--show-notes=") || - !prefixcmp(arg, "--notes=")) { + } else if (starts_with(arg, "--show-notes=") || + starts_with(arg, "--notes=")) { struct strbuf buf = STRBUF_INIT; revs->show_notes = 1; revs->show_notes_given = 1; - if (!prefixcmp(arg, "--show-notes")) { + if (starts_with(arg, "--show-notes")) { if (revs->notes_opt.use_default_notes < 0) revs->notes_opt.use_default_notes = 1; strbuf_addstr(&buf, arg+13); @@ -1829,7 +1879,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->abbrev = 0; } else if (!strcmp(arg, "--abbrev")) { revs->abbrev = DEFAULT_ABBREV; - } else if (!prefixcmp(arg, "--abbrev=")) { + } else if (starts_with(arg, "--abbrev=")) { revs->abbrev = strtoul(arg + 9, NULL, 10); if (revs->abbrev < MINIMUM_ABBREV) revs->abbrev = MINIMUM_ABBREV; @@ -1953,40 +2003,51 @@ static int handle_revision_pseudo_opt(const char *submodule, if (!strcmp(arg, "--all")) { handle_refs(submodule, revs, *flags, for_each_ref_submodule); handle_refs(submodule, revs, *flags, head_ref_submodule); + clear_ref_exclusion(&revs->ref_excludes); } else if (!strcmp(arg, "--branches")) { handle_refs(submodule, revs, *flags, for_each_branch_ref_submodule); + clear_ref_exclusion(&revs->ref_excludes); } else if (!strcmp(arg, "--bisect")) { handle_refs(submodule, revs, *flags, for_each_bad_bisect_ref); handle_refs(submodule, revs, *flags ^ (UNINTERESTING | BOTTOM), for_each_good_bisect_ref); revs->bisect = 1; } else if (!strcmp(arg, "--tags")) { handle_refs(submodule, revs, *flags, for_each_tag_ref_submodule); + clear_ref_exclusion(&revs->ref_excludes); } else if (!strcmp(arg, "--remotes")) { handle_refs(submodule, revs, *flags, for_each_remote_ref_submodule); + clear_ref_exclusion(&revs->ref_excludes); } else if ((argcount = parse_long_opt("glob", argv, &optarg))) { struct all_refs_cb cb; init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref(handle_one_ref, optarg, &cb); + clear_ref_exclusion(&revs->ref_excludes); return argcount; - } else if (!prefixcmp(arg, "--branches=")) { + } else if ((argcount = parse_long_opt("exclude", argv, &optarg))) { + add_ref_exclusion(&revs->ref_excludes, optarg); + return argcount; + } else if (starts_with(arg, "--branches=")) { struct all_refs_cb cb; init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb); - } else if (!prefixcmp(arg, "--tags=")) { + clear_ref_exclusion(&revs->ref_excludes); + } else if (starts_with(arg, "--tags=")) { struct all_refs_cb cb; init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb); - } else if (!prefixcmp(arg, "--remotes=")) { + clear_ref_exclusion(&revs->ref_excludes); + } else if (starts_with(arg, "--remotes=")) { struct all_refs_cb cb; init_all_refs_cb(&cb, revs, *flags); for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb); + clear_ref_exclusion(&revs->ref_excludes); } else if (!strcmp(arg, "--reflog")) { handle_reflog(revs, *flags); } else if (!strcmp(arg, "--not")) { *flags ^= UNINTERESTING | BOTTOM; } else if (!strcmp(arg, "--no-walk")) { revs->no_walk = REVISION_WALK_NO_WALK_SORTED; - } else if (!prefixcmp(arg, "--no-walk=")) { + } else if (starts_with(arg, "--no-walk=")) { /* * Detached form ("--no-walk X" as opposed to "--no-walk=X") * not allowed, since the argument is optional. @@ -2118,7 +2179,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s * call init_pathspec() to set revs->prune_data here. * } */ - ALLOC_GROW(prune_data.path, prune_data.nr+1, prune_data.alloc); + ALLOC_GROW(prune_data.path, prune_data.nr + 1, prune_data.alloc); prune_data.path[prune_data.nr++] = NULL; parse_pathspec(&revs->prune_data, 0, 0, revs->prefix, prune_data.path); @@ -2971,7 +3032,7 @@ static struct commit *get_revision_internal(struct rev_info *revs) if (revs->max_count) { c = get_revision_1(revs); if (c) { - while (0 < revs->skip_count) { + while (revs->skip_count > 0) { revs->skip_count--; c = get_revision_1(revs); if (!c) @@ -2986,9 +3047,8 @@ static struct commit *get_revision_internal(struct rev_info *revs) if (c) c->object.flags |= SHOWN; - if (!revs->boundary) { + if (!revs->boundary) return c; - } if (!c) { /* @@ -3034,9 +3094,8 @@ struct commit *get_revision(struct rev_info *revs) if (revs->reverse) { reversed = NULL; - while ((c = get_revision_internal(revs))) { + while ((c = get_revision_internal(revs))) commit_list_insert(c, &reversed); - } revs->commits = reversed; revs->reverse = 0; revs->reverse_output_stage = 1; diff --git a/revision.h b/revision.h index e7f1d211bf..1eb94c1548 100644 --- a/revision.h +++ b/revision.h @@ -5,6 +5,7 @@ #include "grep.h" #include "notes.h" #include "commit.h" +#include "diff.h" #define SEEN (1u<<0) #define UNINTERESTING (1u<<1) @@ -60,6 +61,9 @@ struct rev_info { /* The end-points specified by the end user */ struct rev_cmdline_info cmdline; + /* excluding from --branches, --refs, etc. expansion */ + struct string_list *ref_excludes; + /* Basic information */ const char *prefix; const char *def; @@ -168,6 +172,8 @@ struct rev_info { unsigned long min_age; int min_parents; int max_parents; + int (*include_check)(struct commit *, void *); + void *include_check_data; /* diff info for patches and for paths limiting */ struct diff_options diffopt; @@ -193,6 +199,11 @@ struct rev_info { struct saved_parents *saved_parents_slab; }; +extern int ref_excluded(struct string_list *, const char *path); +void clear_ref_exclusion(struct string_list **); +void add_ref_exclusion(struct string_list **, const char *exclude); + + #define REV_TREE_SAME 0 #define REV_TREE_NEW 1 /* Only new files */ #define REV_TREE_OLD 2 /* Only files removed */ diff --git a/run-command.c b/run-command.c index 1b7f88eeb1..3914d9c511 100644 --- a/run-command.c +++ b/run-command.c @@ -406,13 +406,12 @@ fail_pipe: unsetenv(*cmd->env); } } - if (cmd->git_cmd) { + if (cmd->git_cmd) execv_git_cmd(cmd->argv); - } else if (cmd->use_shell) { + else if (cmd->use_shell) execv_shell_cmd(cmd->argv); - } else { + else sane_execvp(cmd->argv[0], (char *const*) cmd->argv); - } if (errno == ENOENT) { if (!cmd->silent_exec_failure) error("cannot run %s: %s", cmd->argv[0], @@ -446,7 +445,6 @@ fail_pipe: cmd->pid = -1; } close(notify_pipe[0]); - } #else { @@ -480,11 +478,10 @@ fail_pipe: if (cmd->env) env = make_augmented_environ(cmd->env); - if (cmd->git_cmd) { + if (cmd->git_cmd) cmd->argv = prepare_git_cmd(cmd->argv); - } else if (cmd->use_shell) { + else if (cmd->use_shell) cmd->argv = prepare_shell_cmd(cmd->argv); - } cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env, cmd->dir, fhin, fhout, fherr); diff --git a/send-pack.c b/send-pack.c index b228d65613..6129b0fd8e 100644 --- a/send-pack.c +++ b/send-pack.c @@ -10,6 +10,7 @@ #include "quote.h" #include "transport.h" #include "version.h" +#include "sha1-array.h" static int feed_object(const unsigned char *sha1, int fd, int negative) { @@ -28,7 +29,7 @@ static int feed_object(const unsigned char *sha1, int fd, int negative) /* * Make a pack stream and spit it out into file descriptor fd */ -static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *extra, struct send_pack_args *args) +static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, struct send_pack_args *args) { /* * The child becomes pack-objects --revs; we feed @@ -71,7 +72,7 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext * parameters by writing to the pipe. */ for (i = 0; i < extra->nr; i++) - if (!feed_object(extra->array[i], po.in, 1)) + if (!feed_object(extra->sha1[i], po.in, 1)) break; while (refs) { @@ -109,7 +110,7 @@ static int receive_status(int in, struct ref *refs) struct ref *hint; int ret = 0; char *line = packet_read_line(in, NULL); - if (prefixcmp(line, "unpack ")) + if (!starts_with(line, "unpack ")) return error("did not receive remote status"); if (strcmp(line, "unpack ok")) { error("unpack failed: %s", line + 7); @@ -122,7 +123,7 @@ static int receive_status(int in, struct ref *refs) line = packet_read_line(in, NULL); if (!line) break; - if (prefixcmp(line, "ok ") && prefixcmp(line, "ng ")) { + if (!starts_with(line, "ok ") && !starts_with(line, "ng ")) { error("invalid ref status from remote: %s", line); ret = -1; break; @@ -174,10 +175,25 @@ static int sideband_demux(int in, int out, void *data) return ret; } +static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *cb) +{ + struct strbuf *sb = cb; + if (graft->nr_parent == -1) + packet_buf_write(sb, "shallow %s\n", sha1_to_hex(graft->sha1)); + return 0; +} + +static void advertise_shallow_grafts_buf(struct strbuf *sb) +{ + if (!is_repository_shallow()) + return; + for_each_commit_graft(advertise_shallow_grafts_cb, sb); +} + int send_pack(struct send_pack_args *args, int fd[], struct child_process *conn, struct ref *remote_refs, - struct extra_have_objects *extra_have) + struct sha1_array *extra_have) { int in = fd[0]; int out = fd[1]; @@ -206,6 +222,8 @@ int send_pack(struct send_pack_args *args, quiet_supported = 1; if (server_supports("agent")) agent_supported = 1; + if (server_supports("no-thin")) + args->use_thin_pack = 0; if (!remote_refs) { fprintf(stderr, "No refs in common and none specified; doing nothing.\n" @@ -213,6 +231,9 @@ int send_pack(struct send_pack_args *args, return 0; } + if (!args->dry_run) + advertise_shallow_grafts_buf(&req_buf); + /* * Finally, tell the other end! */ @@ -272,7 +293,7 @@ int send_pack(struct send_pack_args *args, } if (args->stateless_rpc) { - if (!args->dry_run && cmds_sent) { + if (!args->dry_run && (cmds_sent || is_repository_shallow())) { packet_buf_flush(&req_buf); send_sideband(out, -1, req_buf.buf, req_buf.len, LARGE_PACKET_MAX); } @@ -302,8 +323,12 @@ int send_pack(struct send_pack_args *args, shutdown(fd[0], SHUT_WR); if (use_sideband) finish_async(&demux); + fd[1] = -1; return -1; } + if (!args->stateless_rpc) + /* Closed by pack_objects() via start_command() */ + fd[1] = -1; } if (args->stateless_rpc && cmds_sent) packet_flush(out); diff --git a/send-pack.h b/send-pack.h index 05d7ab118b..8e843924cf 100644 --- a/send-pack.h +++ b/send-pack.h @@ -16,6 +16,6 @@ struct send_pack_args { int send_pack(struct send_pack_args *args, int fd[], struct child_process *conn, - struct ref *remote_refs, struct extra_have_objects *extra_have); + struct ref *remote_refs, struct sha1_array *extra_have); #endif diff --git a/sequencer.c b/sequencer.c index 06e52b4c83..bde5f047b0 100644 --- a/sequencer.c +++ b/sequencer.c @@ -41,7 +41,7 @@ static int is_cherry_picked_from_line(const char *buf, int len) * We only care that it looks roughly like (cherry picked from ...) */ return len > strlen(cherry_picked_prefix) + 1 && - !prefixcmp(buf, cherry_picked_prefix) && buf[len - 1] == ')'; + starts_with(buf, cherry_picked_prefix) && buf[len - 1] == ')'; } /* @@ -180,7 +180,7 @@ static char *get_encoding(const char *message) while (*p && *p != '\n') { for (eol = p + 1; *eol && *eol != '\n'; eol++) ; /* do nothing */ - if (!prefixcmp(p, "encoding ")) { + if (starts_with(p, "encoding ")) { char *result = xmalloc(eol - 8 - p); strlcpy(result, p + 9, eol - 8 - p); return result; @@ -392,11 +392,18 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, { struct argv_array array; int rc; + char *gpg_sign; argv_array_init(&array); argv_array_push(&array, "commit"); argv_array_push(&array, "-n"); + if (opts->gpg_sign) { + gpg_sign = xmalloc(3 + strlen(opts->gpg_sign)); + sprintf(gpg_sign, "-S%s", opts->gpg_sign); + argv_array_push(&array, gpg_sign); + free(gpg_sign); + } if (opts->signoff) argv_array_push(&array, "-s"); if (!opts->edit) { @@ -705,10 +712,10 @@ static struct commit *parse_insn_line(char *bol, char *eol, struct replay_opts * char *end_of_object_name; int saved, status, padding; - if (!prefixcmp(bol, "pick")) { + if (starts_with(bol, "pick")) { action = REPLAY_PICK; bol += strlen("pick"); - } else if (!prefixcmp(bol, "revert")) { + } else if (starts_with(bol, "revert")) { action = REPLAY_REVERT; bol += strlen("revert"); } else @@ -808,6 +815,8 @@ static int populate_opts_cb(const char *key, const char *value, void *data) opts->mainline = git_config_int(key, value); else if (!strcmp(key, "options.strategy")) git_config_string(&opts->strategy, key, value); + else if (!strcmp(key, "options.gpg-sign")) + git_config_string(&opts->gpg_sign, key, value); else if (!strcmp(key, "options.strategy-option")) { ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc); opts->xopts[opts->xopts_nr++] = xstrdup(value); @@ -981,6 +990,8 @@ static void save_opts(struct replay_opts *opts) } if (opts->strategy) git_config_set_in_file(opts_file, "options.strategy", opts->strategy); + if (opts->gpg_sign) + git_config_set_in_file(opts_file, "options.gpg-sign", opts->gpg_sign); if (opts->xopts) { int i; for (i = 0; i < opts->xopts_nr; i++) diff --git a/sequencer.h b/sequencer.h index 1fc22dcabe..db43e9cf86 100644 --- a/sequencer.h +++ b/sequencer.h @@ -37,6 +37,8 @@ struct replay_opts { int mainline; + const char *gpg_sign; + /* Merge strategy */ const char *strategy; const char **xopts; @@ -6,6 +6,70 @@ static int inside_git_dir = -1; static int inside_work_tree = -1; /* + * The input parameter must contain an absolute path, and it must already be + * normalized. + * + * Find the part of an absolute path that lies inside the work tree by + * dereferencing symlinks outside the work tree, for example: + * /dir1/repo/dir2/file (work tree is /dir1/repo) -> dir2/file + * /dir/file (work tree is /) -> dir/file + * /dir/symlink1/symlink2 (symlink1 points to work tree) -> symlink2 + * /dir/repolink/file (repolink points to /dir/repo) -> file + * /dir/repo (exactly equal to work tree) -> (empty string) + */ +static int abspath_part_inside_repo(char *path) +{ + size_t len; + size_t wtlen; + char *path0; + int off; + const char *work_tree = get_git_work_tree(); + + if (!work_tree) + return -1; + wtlen = strlen(work_tree); + len = strlen(path); + off = 0; + + /* check if work tree is already the prefix */ + if (wtlen <= len && !strncmp(path, work_tree, wtlen)) { + if (path[wtlen] == '/') { + memmove(path, path + wtlen + 1, len - wtlen); + return 0; + } else if (path[wtlen - 1] == '/' || path[wtlen] == '\0') { + /* work tree is the root, or the whole path */ + memmove(path, path + wtlen, len - wtlen + 1); + return 0; + } + /* work tree might match beginning of a symlink to work tree */ + off = wtlen; + } + path0 = path; + path += offset_1st_component(path) + off; + + /* check each '/'-terminated level */ + while (*path) { + path++; + if (*path == '/') { + *path = '\0'; + if (strcmp(real_path(path0), work_tree) == 0) { + memmove(path0, path + 1, len - (path - path0)); + return 0; + } + *path = '/'; + } + } + + /* check whole path */ + if (strcmp(real_path(path0), work_tree) == 0) { + *path0 = '\0'; + return 0; + } + + return -1; +} + +/* * Normalize "path", prepending the "prefix" for relative paths. If * remaining_prefix is not NULL, return the actual prefix still * remains in the path. For example, prefix = sub1/sub2/ and path is @@ -22,11 +86,17 @@ char *prefix_path_gently(const char *prefix, int len, const char *orig = path; char *sanitized; if (is_absolute_path(orig)) { - const char *temp = real_path(path); - sanitized = xmalloc(len + strlen(temp) + 1); - strcpy(sanitized, temp); + sanitized = xmalloc(strlen(path) + 1); if (remaining_prefix) *remaining_prefix = 0; + if (normalize_path_copy_len(sanitized, path, remaining_prefix)) { + free(sanitized); + return NULL; + } + if (abspath_part_inside_repo(sanitized)) { + free(sanitized); + return NULL; + } } else { sanitized = xmalloc(len + strlen(path) + 1); if (len) @@ -34,26 +104,10 @@ char *prefix_path_gently(const char *prefix, int len, strcpy(sanitized + len, path); if (remaining_prefix) *remaining_prefix = len; - } - if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) - goto error_out; - if (is_absolute_path(orig)) { - size_t root_len, len, total; - const char *work_tree = get_git_work_tree(); - if (!work_tree) - goto error_out; - len = strlen(work_tree); - root_len = offset_1st_component(work_tree); - total = strlen(sanitized) + 1; - if (strncmp(sanitized, work_tree, len) || - (len > root_len && sanitized[len] != '\0' && sanitized[len] != '/')) { - error_out: + if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) { free(sanitized); return NULL; } - if (sanitized[len] == '/') - len++; - memmove(sanitized, sanitized + len, total - len); } return sanitized; } @@ -82,7 +136,7 @@ int check_filename(const char *prefix, const char *arg) const char *name; struct stat st; - if (!prefixcmp(arg, ":/")) { + if (starts_with(arg, ":/")) { if (arg[2] == '\0') /* ":/" is root dir, always exists */ return 1; name = arg + 2; @@ -227,7 +281,6 @@ int is_inside_work_tree(void) void setup_work_tree(void) { - struct strbuf sb = STRBUF_INIT; const char *work_tree, *git_dir; static int initialized = 0; @@ -247,10 +300,8 @@ void setup_work_tree(void) if (getenv(GIT_WORK_TREE_ENVIRONMENT)) setenv(GIT_WORK_TREE_ENVIRONMENT, ".", 1); - set_git_dir(relative_path(git_dir, work_tree, &sb)); + set_git_dir(remove_leading_path(git_dir, work_tree)); initialized = 1; - - strbuf_release(&sb); } static int check_repository_format_gently(const char *gitdir, int *nongit_ok) @@ -307,7 +358,7 @@ const char *read_gitfile(const char *path) if (len != st.st_size) die("Error reading %s", path); buf[len] = '\0'; - if (prefixcmp(buf, "gitdir: ")) + if (!starts_with(buf, "gitdir: ")) die("Invalid gitfile format: %s", path); while (buf[len - 1] == '\n' || buf[len - 1] == '\r') len--; @@ -566,7 +617,7 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) { const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT); struct string_list ceiling_dirs = STRING_LIST_INIT_DUP; - static char cwd[PATH_MAX+1]; + static char cwd[PATH_MAX + 1]; const char *gitdirenv, *ret; char *gitfile; int len, offset, offset_parent, ceil_offset = -1; @@ -581,7 +632,7 @@ static const char *setup_git_directory_gently_1(int *nongit_ok) if (nongit_ok) *nongit_ok = 0; - if (!getcwd(cwd, sizeof(cwd)-1)) + if (!getcwd(cwd, sizeof(cwd) - 1)) die_errno("Unable to read current working directory"); offset = len = strlen(cwd); @@ -790,3 +841,27 @@ void sanitize_stdfds(void) if (fd > 2) close(fd); } + +int daemonize(void) +{ +#ifdef NO_POSIX_GOODIES + errno = ENOSYS; + return -1; +#else + switch (fork()) { + case 0: + break; + case -1: + die_errno("fork failed"); + default: + exit(0); + } + if (setsid() == -1) + die_errno("setsid failed"); + close(0); + close(1); + close(2); + sanitize_stdfds(); + return 0; +#endif +} diff --git a/sha1_file.c b/sha1_file.c index f80bbe4674..18b2378d8a 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -60,6 +60,12 @@ static struct cached_object empty_tree = { 0 }; +/* + * A pointer to the last packed_git in which an object was found. + * When an object is sought, we look in this packfile first, because + * objects that are looked up at similar times are often in the same + * packfile as one another. + */ static struct packed_git *last_found_pack; static struct cached_object *find_cached_object(const unsigned char *sha1) @@ -105,50 +111,63 @@ int mkdir_in_gitdir(const char *path) return adjust_shared_perm(path); } -int safe_create_leading_directories(char *path) +enum scld_error safe_create_leading_directories(char *path) { - char *pos = path + offset_1st_component(path); - struct stat st; + char *next_component = path + offset_1st_component(path); + enum scld_error ret = SCLD_OK; - while (pos) { - pos = strchr(pos, '/'); - if (!pos) + while (ret == SCLD_OK && next_component) { + struct stat st; + char *slash = next_component, slash_character; + + while (*slash && !is_dir_sep(*slash)) + slash++; + + if (!*slash) break; - while (*++pos == '/') - ; - if (!*pos) + + next_component = slash + 1; + while (is_dir_sep(*next_component)) + next_component++; + if (!*next_component) break; - *--pos = '\0'; + + slash_character = *slash; + *slash = '\0'; if (!stat(path, &st)) { /* path exists */ - if (!S_ISDIR(st.st_mode)) { - *pos = '/'; - return -3; - } - } - else if (mkdir(path, 0777)) { + if (!S_ISDIR(st.st_mode)) + ret = SCLD_EXISTS; + } else if (mkdir(path, 0777)) { if (errno == EEXIST && - !stat(path, &st) && S_ISDIR(st.st_mode)) { + !stat(path, &st) && S_ISDIR(st.st_mode)) ; /* somebody created it since we checked */ - } else { - *pos = '/'; - return -1; - } - } - else if (adjust_shared_perm(path)) { - *pos = '/'; - return -2; + else if (errno == ENOENT) + /* + * Either mkdir() failed because + * somebody just pruned the containing + * directory, or stat() failed because + * the file that was in our way was + * just removed. Either way, inform + * the caller that it might be worth + * trying again: + */ + ret = SCLD_VANISHED; + else + ret = SCLD_FAILED; + } else if (adjust_shared_perm(path)) { + ret = SCLD_PERMS; } - *pos++ = '/'; + *slash = slash_character; } - return 0; + return ret; } -int safe_create_leading_directories_const(const char *path) +enum scld_error safe_create_leading_directories_const(const char *path) { /* path points to cache entries, so xstrdup before messing with it */ char *buf = xstrdup(path); - int result = safe_create_leading_directories(buf); + enum scld_error result = safe_create_leading_directories(buf); free(buf); return result; } @@ -165,17 +184,7 @@ static void fill_sha1_path(char *pathbuf, const unsigned char *sha1) } } -/* - * NOTE! This returns a statically allocated buffer, so you have to be - * careful about using it. Do an "xstrdup()" if you need to save the - * filename. - * - * Also note that this returns the location for creating. Reading - * SHA1 file can happen from any alternate directory listed in the - * DB_ENVIRONMENT environment variable if it is not found in - * the primary object database. - */ -char *sha1_file_name(const unsigned char *sha1) +const char *sha1_file_name(const unsigned char *sha1) { static char buf[PATH_MAX]; const char *objdir; @@ -195,6 +204,11 @@ char *sha1_file_name(const unsigned char *sha1) return buf; } +/* + * Return the name of the pack or index file with the specified sha1 + * in its filename. *base and *name are scratch space that must be + * provided by the caller. which should be "pack" or "idx". + */ static char *sha1_get_pack_name(const unsigned char *sha1, char **name, char **base, const char *which) { @@ -239,8 +253,6 @@ char *sha1_pack_index_name(const unsigned char *sha1) struct alternate_object_database *alt_odb_list; static struct alternate_object_database **alt_odb_tail; -static int git_open_noatime(const char *name); - /* * Prepare alternate object database registry. * @@ -425,8 +437,7 @@ void prepare_alt_odb(void) static int has_loose_object_local(const unsigned char *sha1) { - char *name = sha1_file_name(sha1); - return !access(name, F_OK); + return !access(sha1_file_name(sha1), F_OK); } int has_loose_object_nonlocal(const unsigned char *sha1) @@ -478,7 +489,12 @@ void pack_report(void) sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped)); } -static int check_packed_git_idx(const char *path, struct packed_git *p) +/* + * Open and mmap the index file at path, perform a couple of + * consistency checks, then record its information to p. Return 0 on + * success. + */ +static int check_packed_git_idx(const char *path, struct packed_git *p) { void *idx_map; struct pack_idx_header *hdr; @@ -807,15 +823,38 @@ void free_pack_by_name(const char *pack_name) static unsigned int get_max_fd_limit(void) { #ifdef RLIMIT_NOFILE - struct rlimit lim; + { + struct rlimit lim; - if (getrlimit(RLIMIT_NOFILE, &lim)) - die_errno("cannot get RLIMIT_NOFILE"); + if (!getrlimit(RLIMIT_NOFILE, &lim)) + return lim.rlim_cur; + } +#endif - return lim.rlim_cur; -#elif defined(_SC_OPEN_MAX) - return sysconf(_SC_OPEN_MAX); -#elif defined(OPEN_MAX) +#ifdef _SC_OPEN_MAX + { + long open_max = sysconf(_SC_OPEN_MAX); + if (0 < open_max) + return open_max; + /* + * Otherwise, we got -1 for one of the two + * reasons: + * + * (1) sysconf() did not understand _SC_OPEN_MAX + * and signaled an error with -1; or + * (2) sysconf() said there is no limit. + * + * We _could_ clear errno before calling sysconf() to + * tell these two cases apart and return a huge number + * in the latter case to let the caller cap it to a + * value that is not so selfish, but letting the + * fallback OPEN_MAX codepath take care of these cases + * is a lot simpler. + */ + } +#endif + +#ifdef OPEN_MAX return OPEN_MAX; #else return 1; /* see the caller ;-) */ @@ -1196,6 +1235,7 @@ static void prepare_packed_git_one(char *objdir, int local) if (has_extension(de->d_name, ".idx") || has_extension(de->d_name, ".pack") || + has_extension(de->d_name, ".bitmap") || has_extension(de->d_name, ".keep")) string_list_append(&garbage, path); else @@ -1280,7 +1320,6 @@ void prepare_packed_git(void) void reprepare_packed_git(void) { - discard_revindex(); prepare_packed_git_run_once = 0; prepare_packed_git(); } @@ -1357,7 +1396,7 @@ int check_sha1_signature(const unsigned char *sha1, void *map, return hashcmp(sha1, real_sha1) ? -1 : 0; } -static int git_open_noatime(const char *name) +int git_open_noatime(const char *name) { static int sha1_file_open_flag = O_NOATIME; @@ -1378,17 +1417,15 @@ static int git_open_noatime(const char *name) static int stat_sha1_file(const unsigned char *sha1, struct stat *st) { - char *name = sha1_file_name(sha1); struct alternate_object_database *alt; - if (!lstat(name, st)) + if (!lstat(sha1_file_name(sha1), st)) return 0; prepare_alt_odb(); errno = ENOENT; for (alt = alt_odb_list; alt; alt = alt->next) { - name = alt->name; - fill_sha1_path(name, sha1); + fill_sha1_path(alt->name, sha1); if (!lstat(alt->base, st)) return 0; } @@ -1399,18 +1436,16 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st) static int open_sha1_file(const unsigned char *sha1) { int fd; - char *name = sha1_file_name(sha1); struct alternate_object_database *alt; - fd = git_open_noatime(name); + fd = git_open_noatime(sha1_file_name(sha1)); if (fd >= 0) return fd; prepare_alt_odb(); errno = ENOENT; for (alt = alt_odb_list; alt; alt = alt->next) { - name = alt->name; - fill_sha1_path(name, sha1); + fill_sha1_path(alt->name, sha1); fd = git_open_noatime(alt->base); if (fd >= 0) return fd; @@ -1442,51 +1477,6 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size) return map; } -/* - * There used to be a second loose object header format which - * was meant to mimic the in-pack format, allowing for direct - * copy of the object data. This format turned up not to be - * really worth it and we no longer write loose objects in that - * format. - */ -static int experimental_loose_object(unsigned char *map) -{ - unsigned int word; - - /* - * We must determine if the buffer contains the standard - * zlib-deflated stream or the experimental format based - * on the in-pack object format. Compare the header byte - * for each format: - * - * RFC1950 zlib w/ deflate : 0www1000 : 0 <= www <= 7 - * Experimental pack-based : Stttssss : ttt = 1,2,3,4 - * - * If bit 7 is clear and bits 0-3 equal 8, the buffer MUST be - * in standard loose-object format, UNLESS it is a Git-pack - * format object *exactly* 8 bytes in size when inflated. - * - * However, RFC1950 also specifies that the 1st 16-bit word - * must be divisible by 31 - this checksum tells us our buffer - * is in the standard format, giving a false positive only if - * the 1st word of the Git-pack format object happens to be - * divisible by 31, ie: - * ((byte0 * 256) + byte1) % 31 = 0 - * => 0ttt10000www1000 % 31 = 0 - * - * As it happens, this case can only arise for www=3 & ttt=1 - * - ie, a Commit object, which would have to be 8 bytes in - * size. As no Commit can be that small, we find that the - * combination of these two criteria (bitmask & checksum) - * can always correctly determine the buffer format. - */ - word = (map[0] << 8) + map[1]; - if ((map[0] & 0x8F) == 0x08 && !(word % 31)) - return 0; - else - return 1; -} - unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep) { @@ -1514,14 +1504,6 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf, int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz) { - unsigned long size, used; - static const char valid_loose_object_type[8] = { - 0, /* OBJ_EXT */ - 1, 1, 1, 1, /* "commit", "tree", "blob", "tag" */ - 0, /* "delta" and others are invalid in a loose object */ - }; - enum object_type type; - /* Get the data stream */ memset(stream, 0, sizeof(*stream)); stream->next_in = map; @@ -1529,27 +1511,6 @@ int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long ma stream->next_out = buffer; stream->avail_out = bufsiz; - if (experimental_loose_object(map)) { - /* - * The old experimental format we no longer produce; - * we can still read it. - */ - used = unpack_object_header_buffer(map, mapsize, &type, &size); - if (!used || !valid_loose_object_type[type]) - return -1; - map += used; - mapsize -= used; - - /* Set up the stream for the rest.. */ - stream->next_in = map; - stream->avail_in = mapsize; - git_inflate_init(stream); - - /* And generate the fake traditional header */ - stream->total_out = 1 + snprintf(buffer, bufsiz, "%s %lu", - typename(type), size); - return 0; - } git_inflate_init(stream); return git_inflate(stream, 0); } @@ -1741,6 +1702,38 @@ static off_t get_delta_base(struct packed_git *p, return base_offset; } +/* + * Like get_delta_base above, but we return the sha1 instead of the pack + * offset. This means it is cheaper for REF deltas (we do not have to do + * the final object lookup), but more expensive for OFS deltas (we + * have to load the revidx to convert the offset back into a sha1). + */ +static const unsigned char *get_delta_base_sha1(struct packed_git *p, + struct pack_window **w_curs, + off_t curpos, + enum object_type type, + off_t delta_obj_offset) +{ + if (type == OBJ_REF_DELTA) { + unsigned char *base = use_pack(p, w_curs, curpos, NULL); + return base; + } else if (type == OBJ_OFS_DELTA) { + struct revindex_entry *revidx; + off_t base_offset = get_delta_base(p, w_curs, &curpos, + type, delta_obj_offset); + + if (!base_offset) + return NULL; + + revidx = find_pack_revindex(p, base_offset); + if (!revidx) + return NULL; + + return nth_packed_object_sha1(p, revidx->nr); + } else + return NULL; +} + int unpack_object_header(struct packed_git *p, struct pack_window **w_curs, off_t *curpos, @@ -1898,6 +1891,22 @@ static int packed_object_info(struct packed_git *p, off_t obj_offset, } } + if (oi->delta_base_sha1) { + if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) { + const unsigned char *base; + + base = get_delta_base_sha1(p, &w_curs, curpos, + type, obj_offset); + if (!base) { + type = OBJ_BAD; + goto out; + } + + hashcpy(oi->delta_base_sha1, base); + } else + hashclr(oi->delta_base_sha1); + } + out: unuse_pack(&w_curs); return type; @@ -2279,6 +2288,10 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset, *final_size = size; unuse_pack(&w_curs); + + if (delta_stack != small_delta_stack) + free(delta_stack); + return data; } @@ -2438,6 +2451,10 @@ static int fill_pack_entry(const unsigned char *sha1, return 1; } +/* + * Iff a pack file contains the object named by sha1, return true and + * store its location to e. + */ static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e) { struct packed_git *p; @@ -2450,11 +2467,13 @@ static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e) return 1; for (p = packed_git; p; p = p->next) { - if (p == last_found_pack || !fill_pack_entry(sha1, e, p)) - continue; + if (p == last_found_pack) + continue; /* we already checked this one */ - last_found_pack = p; - return 1; + if (fill_pack_entry(sha1, e, p)) { + last_found_pack = p; + return 1; + } } return 0; } @@ -2481,17 +2500,23 @@ static int sha1_loose_object_info(const unsigned char *sha1, git_zstream stream; char hdr[32]; + if (oi->delta_base_sha1) + hashclr(oi->delta_base_sha1); + /* * If we don't care about type or size, then we don't - * need to look inside the object at all. + * need to look inside the object at all. Note that we + * do not optimize out the stat call, even if the + * caller doesn't care about the disk-size, since our + * return value implicitly indicates whether the + * object even exists. */ if (!oi->typep && !oi->sizep) { - if (oi->disk_sizep) { - struct stat st; - if (stat_sha1_file(sha1, &st) < 0) - return -1; + struct stat st; + if (stat_sha1_file(sha1, &st) < 0) + return -1; + if (oi->disk_sizep) *oi->disk_sizep = st.st_size; - } return 0; } @@ -2514,14 +2539,14 @@ static int sha1_loose_object_info(const unsigned char *sha1, return 0; } -/* returns enum object_type or negative */ -int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) +int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags) { struct cached_object *co; struct pack_entry e; int rtype; + const unsigned char *real = lookup_replace_object_extended(sha1, flags); - co = find_cached_object(sha1); + co = find_cached_object(real); if (co) { if (oi->typep) *(oi->typep) = co->type; @@ -2529,27 +2554,29 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) *(oi->sizep) = co->size; if (oi->disk_sizep) *(oi->disk_sizep) = 0; + if (oi->delta_base_sha1) + hashclr(oi->delta_base_sha1); oi->whence = OI_CACHED; return 0; } - if (!find_pack_entry(sha1, &e)) { + if (!find_pack_entry(real, &e)) { /* Most likely it's a loose object. */ - if (!sha1_loose_object_info(sha1, oi)) { + if (!sha1_loose_object_info(real, oi)) { oi->whence = OI_LOOSE; return 0; } /* Not a loose object; someone else may have just packed it. */ reprepare_packed_git(); - if (!find_pack_entry(sha1, &e)) + if (!find_pack_entry(real, &e)) return -1; } rtype = packed_object_info(e.p, e.offset, oi); if (rtype < 0) { - mark_bad_packed_object(e.p, sha1); - return sha1_object_info_extended(sha1, oi); + mark_bad_packed_object(e.p, real); + return sha1_object_info_extended(real, oi, 0); } else if (in_delta_base_cache(e.p, e.offset)) { oi->whence = OI_DBCACHED; } else { @@ -2563,6 +2590,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) return 0; } +/* returns enum object_type or negative */ int sha1_object_info(const unsigned char *sha1, unsigned long *sizep) { enum object_type type; @@ -2570,7 +2598,7 @@ int sha1_object_info(const unsigned char *sha1, unsigned long *sizep) oi.typep = &type; oi.sizep = sizep; - if (sha1_object_info_extended(sha1, &oi) < 0) + if (sha1_object_info_extended(sha1, &oi, LOOKUP_REPLACE_OBJECT) < 0) return -1; return type; } @@ -2660,10 +2688,8 @@ void *read_sha1_file_extended(const unsigned char *sha1, unsigned flag) { void *data; - char *path; const struct packed_git *p; - const unsigned char *repl = (flag & READ_SHA1_FILE_REPLACE) - ? lookup_replace_object(sha1) : sha1; + const unsigned char *repl = lookup_replace_object_extended(sha1, flag); errno = 0; data = read_object(repl, type, size); @@ -2679,7 +2705,8 @@ void *read_sha1_file_extended(const unsigned char *sha1, sha1_to_hex(repl), sha1_to_hex(sha1)); if (has_loose_object(repl)) { - path = sha1_file_name(sha1); + const char *path = sha1_file_name(sha1); + die("loose object %s (stored in %s) is corrupt", sha1_to_hex(repl), path); } @@ -2857,7 +2884,9 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename) /* Make sure the directory exists */ memcpy(buffer, filename, dirlen); buffer[dirlen-1] = 0; - if (mkdir(buffer, 0777) || adjust_shared_perm(buffer)) + if (mkdir(buffer, 0777) && errno != EEXIST) + return -1; + if (adjust_shared_perm(buffer)) return -1; /* Try again */ @@ -2875,10 +2904,9 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, git_zstream stream; git_SHA_CTX c; unsigned char parano_sha1[20]; - char *filename; static char tmp_file[PATH_MAX]; + const char *filename = sha1_file_name(sha1); - filename = sha1_file_name(sha1); fd = create_tmpfile(tmp_file, sizeof(tmp_file), filename); if (fd < 0) { if (errno == EACCES) diff --git a/sha1_name.c b/sha1_name.c index 0e5fe7f937..6fca8692d2 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -343,7 +343,6 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1, return status; } - int for_each_abbrev(const char *prefix, each_abbrev_fn fn, void *cb_data) { char hex_pfx[40]; @@ -431,7 +430,7 @@ static inline int upstream_mark(const char *string, int len) } static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags); -static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf); +static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf); static int get_sha1_basic(const char *str, int len, unsigned char *sha1) { @@ -452,9 +451,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) int at, reflog_len, nth_prior = 0; if (len == 40 && !get_sha1_hex(str, sha1)) { - if (warn_on_object_refname_ambiguity) { + if (warn_ambiguous_refs && warn_on_object_refname_ambiguity) { refs_found = dwim_ref(str, len, tmp_sha1, &real_ref); - if (refs_found > 0 && warn_ambiguous_refs) { + if (refs_found > 0) { warning(warn_msg, len, str); if (advice_object_name_warning) fprintf(stderr, "%s\n", _(object_name_msg)); @@ -493,7 +492,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) struct strbuf buf = STRBUF_INIT; int detached; - if (interpret_nth_prior_checkout(str, &buf) > 0) { + if (interpret_nth_prior_checkout(str, len, &buf) > 0) { detached = (buf.len == 40 && !get_sha1_hex(buf.buf, sha1)); strbuf_release(&buf); if (detached) @@ -547,7 +546,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) if (read_ref_at(real_ref, at_time, nth, sha1, NULL, &co_time, &co_tz, &co_cnt)) { if (!len) { - if (!prefixcmp(real_ref, "refs/heads/")) { + if (starts_with(real_ref, "refs/heads/")) { str = real_ref + 11; len = strlen(real_ref + 11); } else { @@ -582,8 +581,6 @@ static int get_parent(const char *name, int len, if (ret) return ret; commit = lookup_commit_reference(sha1); - if (!commit) - return -1; if (parse_commit(commit)) return -1; if (!idx) { @@ -677,15 +674,15 @@ static int peel_onion(const char *name, int len, unsigned char *sha1) return -1; sp++; /* beginning of type name, or closing brace for empty */ - if (!prefixcmp(sp, "commit}")) + if (starts_with(sp, "commit}")) expected_type = OBJ_COMMIT; - else if (!prefixcmp(sp, "tag}")) + else if (starts_with(sp, "tag}")) expected_type = OBJ_TAG; - else if (!prefixcmp(sp, "tree}")) + else if (starts_with(sp, "tree}")) expected_type = OBJ_TREE; - else if (!prefixcmp(sp, "blob}")) + else if (starts_with(sp, "blob}")) expected_type = OBJ_BLOB; - else if (!prefixcmp(sp, "object}")) + else if (starts_with(sp, "object}")) expected_type = OBJ_ANY; else if (sp[0] == '}') expected_type = OBJ_NONE; @@ -912,7 +909,7 @@ static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1, const char *match = NULL, *target = NULL; size_t len; - if (!prefixcmp(message, "checkout: moving from ")) { + if (starts_with(message, "checkout: moving from ")) { match = message + strlen("checkout: moving from "); target = strstr(match, " to "); } @@ -932,7 +929,8 @@ static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1, * Parse @{-N} syntax, return the number of characters parsed * if successful; otherwise signal an error with negative value. */ -static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf) +static int interpret_nth_prior_checkout(const char *name, int namelen, + struct strbuf *buf) { long nth; int retval; @@ -940,9 +938,11 @@ static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf) const char *brace; char *num_end; + if (namelen < 4) + return -1; if (name[0] != '@' || name[1] != '{' || name[2] != '-') return -1; - brace = strchr(name, '}'); + brace = memchr(name, '}', namelen); if (!brace) return -1; nth = strtol(name + 3, &num_end, 10); @@ -1015,7 +1015,7 @@ static int interpret_empty_at(const char *name, int namelen, int len, struct str return -1; /* make sure it's a single @, or @@{.*}, not @foo */ - next = strchr(name + len + 1, '@'); + next = memchr(name + len + 1, '@', namelen - len - 1); if (next && next[1] != '{') return -1; if (!next) @@ -1049,6 +1049,57 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu return ret - used + len; } +static void set_shortened_ref(struct strbuf *buf, const char *ref) +{ + char *s = shorten_unambiguous_ref(ref, 0); + strbuf_reset(buf); + strbuf_addstr(buf, s); + free(s); +} + +static const char *get_upstream_branch(const char *branch_buf, int len) +{ + char *branch = xstrndup(branch_buf, len); + struct branch *upstream = branch_get(*branch ? branch : NULL); + + /* + * Upstream can be NULL only if branch refers to HEAD and HEAD + * points to something different than a branch. + */ + if (!upstream) + die(_("HEAD does not point to a branch")); + if (!upstream->merge || !upstream->merge[0]->dst) { + if (!ref_exists(upstream->refname)) + die(_("No such branch: '%s'"), branch); + if (!upstream->merge) { + die(_("No upstream configured for branch '%s'"), + upstream->name); + } + die( + _("Upstream branch '%s' not stored as a remote-tracking branch"), + upstream->merge[0]->src); + } + free(branch); + + return upstream->merge[0]->dst; +} + +static int interpret_upstream_mark(const char *name, int namelen, + int at, struct strbuf *buf) +{ + int len; + + len = upstream_mark(name + at, namelen - at); + if (!len) + return -1; + + if (memchr(name, ':', at)) + return -1; + + set_shortened_ref(buf, get_upstream_branch(name, at)); + return len + at; +} + /* * This reads short-hand syntax that not only evaluates to a commit * object name, but also can act as if the end user spelled the name @@ -1072,10 +1123,9 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu */ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf) { - char *cp; - struct branch *upstream; - int len = interpret_nth_prior_checkout(name, buf); - int tmp_len; + char *at; + const char *start; + int len = interpret_nth_prior_checkout(name, namelen, buf); if (!namelen) namelen = strlen(name); @@ -1089,44 +1139,20 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf) return reinterpret(name, namelen, len, buf); } - cp = strchr(name, '@'); - if (!cp) - return -1; + for (start = name; + (at = memchr(start, '@', namelen - (start - name))); + start = at + 1) { - len = interpret_empty_at(name, namelen, cp - name, buf); - if (len > 0) - return reinterpret(name, namelen, len, buf); - - tmp_len = upstream_mark(cp, namelen - (cp - name)); - if (!tmp_len) - return -1; + len = interpret_empty_at(name, namelen, at - name, buf); + if (len > 0) + return reinterpret(name, namelen, len, buf); - len = cp + tmp_len - name; - cp = xstrndup(name, cp - name); - upstream = branch_get(*cp ? cp : NULL); - /* - * Upstream can be NULL only if cp refers to HEAD and HEAD - * points to something different than a branch. - */ - if (!upstream) - die(_("HEAD does not point to a branch")); - if (!upstream->merge || !upstream->merge[0]->dst) { - if (!ref_exists(upstream->refname)) - die(_("No such branch: '%s'"), cp); - if (!upstream->merge) { - die(_("No upstream configured for branch '%s'"), - upstream->name); - } - die( - _("Upstream branch '%s' not stored as a remote-tracking branch"), - upstream->merge[0]->src); + len = interpret_upstream_mark(name, namelen, at - name, buf); + if (len > 0) + return len; } - free(cp); - cp = shorten_unambiguous_ref(upstream->merge[0]->dst, 0); - strbuf_reset(buf); - strbuf_addstr(buf, cp); - free(cp); - return len; + + return -1; } int strbuf_branchname(struct strbuf *sb, const char *name) @@ -1305,7 +1331,7 @@ static void diagnose_invalid_index_path(int stage, static char *resolve_relative_path(const char *rel) { - if (prefixcmp(rel, "./") && prefixcmp(rel, "../")) + if (!starts_with(rel, "./") && !starts_with(rel, "../")) return NULL; if (!startup_info) @@ -2,15 +2,23 @@ #include "commit.h" #include "tag.h" #include "pkt-line.h" +#include "remote.h" +#include "refs.h" +#include "sha1-array.h" +#include "diff.h" +#include "revision.h" +#include "commit-slab.h" static int is_shallow = -1; static struct stat shallow_stat; static char *alternate_shallow_file; -void set_alternate_shallow_file(const char *path) +void set_alternate_shallow_file(const char *path, int override) { if (is_shallow != -1) die("BUG: is_repository_shallow must not be called before set_alternate_shallow_file"); + if (alternate_shallow_file && !override) + return; free(alternate_shallow_file); alternate_shallow_file = path ? xstrdup(path) : NULL; } @@ -69,6 +77,7 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth, struct commit_list *result = NULL; struct object_array stack = OBJECT_ARRAY_INIT; struct commit *commit = NULL; + struct commit_graft *graft; while (commit || i < heads->nr || stack.nr) { struct commit_list *p; @@ -90,10 +99,12 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth, cur_depth = *(int *)commit->util; } } - if (parse_commit(commit)) - die("invalid commit"); + parse_commit_or_die(commit); cur_depth++; - if (cur_depth >= depth) { + if ((depth != INFINITE_DEPTH && cur_depth >= depth) || + (is_repository_shallow() && !commit->parents && + (graft = lookup_commit_graft(commit->object.sha1)) != NULL && + graft->nr_parent < 0)) { commit_list_insert(commit, &result); commit->object.flags |= shallow_flag; commit = NULL; @@ -143,10 +154,14 @@ void check_shallow_file_for_update(void) die("shallow file was changed during fetch"); } +#define SEEN_ONLY 1 +#define VERBOSE 2 + struct write_shallow_data { struct strbuf *out; int use_pack_protocol; int count; + unsigned flags; }; static int write_one_shallow(const struct commit_graft *graft, void *cb_data) @@ -155,6 +170,15 @@ static int write_one_shallow(const struct commit_graft *graft, void *cb_data) const char *hex = sha1_to_hex(graft->sha1); if (graft->nr_parent != -1) return 0; + if (data->flags & SEEN_ONLY) { + struct commit *c = lookup_commit(graft->sha1); + if (!c || !(c->object.flags & SEEN)) { + if (data->flags & VERBOSE) + printf("Removing %s from .git/shallow\n", + sha1_to_hex(c->object.sha1)); + return 0; + } + } data->count++; if (data->use_pack_protocol) packet_buf_write(data->out, "shallow %s", hex); @@ -165,22 +189,39 @@ static int write_one_shallow(const struct commit_graft *graft, void *cb_data) return 0; } -int write_shallow_commits(struct strbuf *out, int use_pack_protocol) +static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol, + const struct sha1_array *extra, + unsigned flags) { struct write_shallow_data data; + int i; data.out = out; data.use_pack_protocol = use_pack_protocol; data.count = 0; + data.flags = flags; for_each_commit_graft(write_one_shallow, &data); + if (!extra) + return data.count; + for (i = 0; i < extra->nr; i++) { + strbuf_addstr(out, sha1_to_hex(extra->sha1[i])); + strbuf_addch(out, '\n'); + data.count++; + } return data.count; } -char *setup_temporary_shallow(void) +int write_shallow_commits(struct strbuf *out, int use_pack_protocol, + const struct sha1_array *extra) +{ + return write_shallow_commits_1(out, use_pack_protocol, extra, 0); +} + +char *setup_temporary_shallow(const struct sha1_array *extra) { struct strbuf sb = STRBUF_INIT; int fd; - if (write_shallow_commits(&sb, 0)) { + if (write_shallow_commits(&sb, 0, extra)) { struct strbuf path = STRBUF_INIT; strbuf_addstr(&path, git_path("shallow_XXXXXX")); fd = xmkstemp(path.buf); @@ -199,7 +240,8 @@ char *setup_temporary_shallow(void) } void setup_alternate_shallow(struct lock_file *shallow_lock, - const char **alternate_shallow_file) + const char **alternate_shallow_file, + const struct sha1_array *extra) { struct strbuf sb = STRBUF_INIT; int fd; @@ -207,7 +249,7 @@ void setup_alternate_shallow(struct lock_file *shallow_lock, check_shallow_file_for_update(); fd = hold_lock_file_for_update(shallow_lock, git_path("shallow"), LOCK_DIE_ON_ERROR); - if (write_shallow_commits(&sb, 0)) { + if (write_shallow_commits(&sb, 0, extra)) { if (write_in_full(fd, sb.buf, sb.len) != sb.len) die_errno("failed to write to %s", shallow_lock->filename); @@ -220,3 +262,415 @@ void setup_alternate_shallow(struct lock_file *shallow_lock, *alternate_shallow_file = ""; strbuf_release(&sb); } + +static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *cb) +{ + int fd = *(int *)cb; + if (graft->nr_parent == -1) + packet_write(fd, "shallow %s\n", sha1_to_hex(graft->sha1)); + return 0; +} + +void advertise_shallow_grafts(int fd) +{ + if (!is_repository_shallow()) + return; + for_each_commit_graft(advertise_shallow_grafts_cb, &fd); +} + +/* + * mark_reachable_objects() should have been run prior to this and all + * reachable commits marked as "SEEN". + */ +void prune_shallow(int show_only) +{ + static struct lock_file shallow_lock; + struct strbuf sb = STRBUF_INIT; + int fd; + + if (show_only) { + write_shallow_commits_1(&sb, 0, NULL, SEEN_ONLY | VERBOSE); + strbuf_release(&sb); + return; + } + check_shallow_file_for_update(); + fd = hold_lock_file_for_update(&shallow_lock, git_path("shallow"), + LOCK_DIE_ON_ERROR); + if (write_shallow_commits_1(&sb, 0, NULL, SEEN_ONLY)) { + if (write_in_full(fd, sb.buf, sb.len) != sb.len) + die_errno("failed to write to %s", + shallow_lock.filename); + commit_lock_file(&shallow_lock); + } else { + unlink(git_path("shallow")); + rollback_lock_file(&shallow_lock); + } + strbuf_release(&sb); +} + +#define TRACE_KEY "GIT_TRACE_SHALLOW" + +/* + * Step 1, split sender shallow commits into "ours" and "theirs" + * Step 2, clean "ours" based on .git/shallow + */ +void prepare_shallow_info(struct shallow_info *info, struct sha1_array *sa) +{ + int i; + trace_printf_key(TRACE_KEY, "shallow: prepare_shallow_info\n"); + memset(info, 0, sizeof(*info)); + info->shallow = sa; + if (!sa) + return; + info->ours = xmalloc(sizeof(*info->ours) * sa->nr); + info->theirs = xmalloc(sizeof(*info->theirs) * sa->nr); + for (i = 0; i < sa->nr; i++) { + if (has_sha1_file(sa->sha1[i])) { + struct commit_graft *graft; + graft = lookup_commit_graft(sa->sha1[i]); + if (graft && graft->nr_parent < 0) + continue; + info->ours[info->nr_ours++] = i; + } else + info->theirs[info->nr_theirs++] = i; + } +} + +void clear_shallow_info(struct shallow_info *info) +{ + free(info->ours); + free(info->theirs); +} + +/* Step 4, remove non-existent ones in "theirs" after getting the pack */ + +void remove_nonexistent_theirs_shallow(struct shallow_info *info) +{ + unsigned char (*sha1)[20] = info->shallow->sha1; + int i, dst; + trace_printf_key(TRACE_KEY, "shallow: remove_nonexistent_theirs_shallow\n"); + for (i = dst = 0; i < info->nr_theirs; i++) { + if (i != dst) + info->theirs[dst] = info->theirs[i]; + if (has_sha1_file(sha1[info->theirs[i]])) + dst++; + } + info->nr_theirs = dst; +} + +define_commit_slab(ref_bitmap, uint32_t *); + +struct paint_info { + struct ref_bitmap ref_bitmap; + unsigned nr_bits; + char **slab; + char *free, *end; + unsigned slab_count; +}; + +static uint32_t *paint_alloc(struct paint_info *info) +{ + unsigned nr = (info->nr_bits + 31) / 32; + unsigned size = nr * sizeof(uint32_t); + void *p; + if (!info->slab_count || info->free + size > info->end) { + info->slab_count++; + info->slab = xrealloc(info->slab, + info->slab_count * sizeof(*info->slab)); + info->free = xmalloc(COMMIT_SLAB_SIZE); + info->slab[info->slab_count - 1] = info->free; + info->end = info->free + COMMIT_SLAB_SIZE; + } + p = info->free; + info->free += size; + return p; +} + +/* + * Given a commit SHA-1, walk down to parents until either SEEN, + * UNINTERESTING or BOTTOM is hit. Set the id-th bit in ref_bitmap for + * all walked commits. + */ +static void paint_down(struct paint_info *info, const unsigned char *sha1, + int id) +{ + unsigned int i, nr; + struct commit_list *head = NULL; + int bitmap_nr = (info->nr_bits + 31) / 32; + int bitmap_size = bitmap_nr * sizeof(uint32_t); + uint32_t *tmp = xmalloc(bitmap_size); /* to be freed before return */ + uint32_t *bitmap = paint_alloc(info); + struct commit *c = lookup_commit_reference_gently(sha1, 1); + if (!c) + return; + memset(bitmap, 0, bitmap_size); + bitmap[id / 32] |= (1 << (id % 32)); + commit_list_insert(c, &head); + while (head) { + struct commit_list *p; + struct commit *c = head->item; + uint32_t **refs = ref_bitmap_at(&info->ref_bitmap, c); + + p = head; + head = head->next; + free(p); + + /* XXX check "UNINTERESTING" from pack bitmaps if available */ + if (c->object.flags & (SEEN | UNINTERESTING)) + continue; + else + c->object.flags |= SEEN; + + if (*refs == NULL) + *refs = bitmap; + else { + memcpy(tmp, *refs, bitmap_size); + for (i = 0; i < bitmap_nr; i++) + tmp[i] |= bitmap[i]; + if (memcmp(tmp, *refs, bitmap_size)) { + *refs = paint_alloc(info); + memcpy(*refs, tmp, bitmap_size); + } + } + + if (c->object.flags & BOTTOM) + continue; + + if (parse_commit(c)) + die("unable to parse commit %s", + sha1_to_hex(c->object.sha1)); + + for (p = c->parents; p; p = p->next) { + uint32_t **p_refs = ref_bitmap_at(&info->ref_bitmap, + p->item); + if (p->item->object.flags & SEEN) + continue; + if (*p_refs == NULL || *p_refs == *refs) + *p_refs = *refs; + commit_list_insert(p->item, &head); + } + } + + nr = get_max_object_index(); + for (i = 0; i < nr; i++) { + struct object *o = get_indexed_object(i); + if (o && o->type == OBJ_COMMIT) + o->flags &= ~SEEN; + } + + free(tmp); +} + +static int mark_uninteresting(const char *refname, + const unsigned char *sha1, + int flags, void *cb_data) +{ + struct commit *commit = lookup_commit_reference_gently(sha1, 1); + if (!commit) + return 0; + commit->object.flags |= UNINTERESTING; + mark_parents_uninteresting(commit); + return 0; +} + +static void post_assign_shallow(struct shallow_info *info, + struct ref_bitmap *ref_bitmap, + int *ref_status); +/* + * Step 6(+7), associate shallow commits with new refs + * + * info->ref must be initialized before calling this function. + * + * If used is not NULL, it's an array of info->shallow->nr + * bitmaps. The n-th bit set in the m-th bitmap if ref[n] needs the + * m-th shallow commit from info->shallow. + * + * If used is NULL, "ours" and "theirs" are updated. And if ref_status + * is not NULL it's an array of ref->nr ints. ref_status[i] is true if + * the ref needs some shallow commits from either info->ours or + * info->theirs. + */ +void assign_shallow_commits_to_refs(struct shallow_info *info, + uint32_t **used, int *ref_status) +{ + unsigned char (*sha1)[20] = info->shallow->sha1; + struct sha1_array *ref = info->ref; + unsigned int i, nr; + int *shallow, nr_shallow = 0; + struct paint_info pi; + + trace_printf_key(TRACE_KEY, "shallow: assign_shallow_commits_to_refs\n"); + shallow = xmalloc(sizeof(*shallow) * (info->nr_ours + info->nr_theirs)); + for (i = 0; i < info->nr_ours; i++) + shallow[nr_shallow++] = info->ours[i]; + for (i = 0; i < info->nr_theirs; i++) + shallow[nr_shallow++] = info->theirs[i]; + + /* + * Prepare the commit graph to track what refs can reach what + * (new) shallow commits. + */ + nr = get_max_object_index(); + for (i = 0; i < nr; i++) { + struct object *o = get_indexed_object(i); + if (!o || o->type != OBJ_COMMIT) + continue; + + o->flags &= ~(UNINTERESTING | BOTTOM | SEEN); + } + + memset(&pi, 0, sizeof(pi)); + init_ref_bitmap(&pi.ref_bitmap); + pi.nr_bits = ref->nr; + + /* + * "--not --all" to cut short the traversal if new refs + * connect to old refs. If not (e.g. force ref updates) it'll + * have to go down to the current shallow commits. + */ + head_ref(mark_uninteresting, NULL); + for_each_ref(mark_uninteresting, NULL); + + /* Mark potential bottoms so we won't go out of bound */ + for (i = 0; i < nr_shallow; i++) { + struct commit *c = lookup_commit(sha1[shallow[i]]); + c->object.flags |= BOTTOM; + } + + for (i = 0; i < ref->nr; i++) + paint_down(&pi, ref->sha1[i], i); + + if (used) { + int bitmap_size = ((pi.nr_bits + 31) / 32) * sizeof(uint32_t); + memset(used, 0, sizeof(*used) * info->shallow->nr); + for (i = 0; i < nr_shallow; i++) { + const struct commit *c = lookup_commit(sha1[shallow[i]]); + uint32_t **map = ref_bitmap_at(&pi.ref_bitmap, c); + if (*map) + used[shallow[i]] = xmemdupz(*map, bitmap_size); + } + /* + * unreachable shallow commits are not removed from + * "ours" and "theirs". The user is supposed to run + * step 7 on every ref separately and not trust "ours" + * and "theirs" any more. + */ + } else + post_assign_shallow(info, &pi.ref_bitmap, ref_status); + + clear_ref_bitmap(&pi.ref_bitmap); + for (i = 0; i < pi.slab_count; i++) + free(pi.slab[i]); + free(pi.slab); + free(shallow); +} + +struct commit_array { + struct commit **commits; + int nr, alloc; +}; + +static int add_ref(const char *refname, + const unsigned char *sha1, int flags, void *cb_data) +{ + struct commit_array *ca = cb_data; + ALLOC_GROW(ca->commits, ca->nr + 1, ca->alloc); + ca->commits[ca->nr] = lookup_commit_reference_gently(sha1, 1); + if (ca->commits[ca->nr]) + ca->nr++; + return 0; +} + +static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap) +{ + int i; + if (!ref_status) + return; + for (i = 0; i < nr; i++) + if (bitmap[i / 32] & (1 << (i % 32))) + ref_status[i]++; +} + +/* + * Step 7, reachability test on "ours" at commit level + */ +static void post_assign_shallow(struct shallow_info *info, + struct ref_bitmap *ref_bitmap, + int *ref_status) +{ + unsigned char (*sha1)[20] = info->shallow->sha1; + struct commit *c; + uint32_t **bitmap; + int dst, i, j; + int bitmap_nr = (info->ref->nr + 31) / 32; + struct commit_array ca; + + trace_printf_key(TRACE_KEY, "shallow: post_assign_shallow\n"); + if (ref_status) + memset(ref_status, 0, sizeof(*ref_status) * info->ref->nr); + + /* Remove unreachable shallow commits from "theirs" */ + for (i = dst = 0; i < info->nr_theirs; i++) { + if (i != dst) + info->theirs[dst] = info->theirs[i]; + c = lookup_commit(sha1[info->theirs[i]]); + bitmap = ref_bitmap_at(ref_bitmap, c); + if (!*bitmap) + continue; + for (j = 0; j < bitmap_nr; j++) + if (bitmap[0][j]) { + update_refstatus(ref_status, info->ref->nr, *bitmap); + dst++; + break; + } + } + info->nr_theirs = dst; + + memset(&ca, 0, sizeof(ca)); + head_ref(add_ref, &ca); + for_each_ref(add_ref, &ca); + + /* Remove unreachable shallow commits from "ours" */ + for (i = dst = 0; i < info->nr_ours; i++) { + if (i != dst) + info->ours[dst] = info->ours[i]; + c = lookup_commit(sha1[info->ours[i]]); + bitmap = ref_bitmap_at(ref_bitmap, c); + if (!*bitmap) + continue; + for (j = 0; j < bitmap_nr; j++) + if (bitmap[0][j] && + /* Step 7, reachability test at commit level */ + !in_merge_bases_many(c, ca.nr, ca.commits)) { + update_refstatus(ref_status, info->ref->nr, *bitmap); + dst++; + break; + } + } + info->nr_ours = dst; + + free(ca.commits); +} + +/* (Delayed) step 7, reachability test at commit level */ +int delayed_reachability_test(struct shallow_info *si, int c) +{ + if (si->need_reachability_test[c]) { + struct commit *commit = lookup_commit(si->shallow->sha1[c]); + + if (!si->commits) { + struct commit_array ca; + memset(&ca, 0, sizeof(ca)); + head_ref(add_ref, &ca); + for_each_ref(add_ref, &ca); + si->commits = ca.commits; + si->nr_commits = ca.nr; + } + + si->reachable[c] = in_merge_bases_many(commit, + si->nr_commits, + si->commits); + si->need_reachability_test[c] = 0; + } + return si->reachable[c]; +} @@ -15,7 +15,7 @@ static int do_generic_cmd(const char *me, char *arg) setup_path(); if (!arg || !(arg = sq_dequote(arg))) die("bad argument"); - if (prefixcmp(me, "git-")) + if (!starts_with(me, "git-")) die("bad command"); my_argv[0] = me + 4; @@ -1,22 +1,22 @@ #include "cache.h" #include "refs.h" -int prefixcmp(const char *str, const char *prefix) +int starts_with(const char *str, const char *prefix) { for (; ; str++, prefix++) if (!*prefix) - return 0; + return 1; else if (*str != *prefix) - return (unsigned char)*prefix - (unsigned char)*str; + return 0; } -int suffixcmp(const char *str, const char *suffix) +int ends_with(const char *str, const char *suffix) { int len = strlen(str), suflen = strlen(suffix); if (len < suflen) - return -1; + return 0; else - return strcmp(str + len - suflen, suffix); + return !strcmp(str + len - suflen, suffix); } /* @@ -17,20 +17,23 @@ extern void strbuf_init(struct strbuf *, size_t); extern void strbuf_release(struct strbuf *); extern char *strbuf_detach(struct strbuf *, size_t *); extern void strbuf_attach(struct strbuf *, void *, size_t, size_t); -static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) { +static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) +{ struct strbuf tmp = *a; *a = *b; *b = tmp; } /*----- strbuf size related -----*/ -static inline size_t strbuf_avail(const struct strbuf *sb) { +static inline size_t strbuf_avail(const struct strbuf *sb) +{ return sb->alloc ? sb->alloc - sb->len - 1 : 0; } extern void strbuf_grow(struct strbuf *, size_t); -static inline void strbuf_setlen(struct strbuf *sb, size_t len) { +static inline void strbuf_setlen(struct strbuf *sb, size_t len) +{ if (len > (sb->alloc ? sb->alloc - 1 : 0)) die("BUG: strbuf_setlen() beyond buffer"); sb->len = len; @@ -97,7 +100,8 @@ static inline struct strbuf **strbuf_split(const struct strbuf *sb, extern void strbuf_list_free(struct strbuf **); /*----- add data in your buffer -----*/ -static inline void strbuf_addch(struct strbuf *sb, int c) { +static inline void strbuf_addch(struct strbuf *sb, int c) +{ strbuf_grow(sb, 1); sb->buf[sb->len++] = c; sb->buf[sb->len] = '\0'; @@ -113,10 +117,12 @@ extern void strbuf_splice(struct strbuf *, size_t pos, size_t len, extern void strbuf_add_commented_lines(struct strbuf *out, const char *buf, size_t size); extern void strbuf_add(struct strbuf *, const void *, size_t); -static inline void strbuf_addstr(struct strbuf *sb, const char *s) { +static inline void strbuf_addstr(struct strbuf *sb, const char *s) +{ strbuf_add(sb, s, strlen(s)); } -static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) { +static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) +{ strbuf_grow(sb, sb2->len); strbuf_add(sb, sb2->buf, sb2->len); } diff --git a/streaming.c b/streaming.c index debe904523..2ff036a0fa 100644 --- a/streaming.c +++ b/streaming.c @@ -113,7 +113,7 @@ static enum input_source istream_source(const unsigned char *sha1, oi->typep = type; oi->sizep = &size; - status = sha1_object_info_extended(sha1, oi); + status = sha1_object_info_extended(sha1, oi, 0); if (status < 0) return stream_error; @@ -152,8 +152,10 @@ struct git_istream *open_istream(const unsigned char *sha1, if (filter) { /* Add "&& !is_null_stream_filter(filter)" for performance */ struct git_istream *nst = attach_stream_filter(st, filter); - if (!nst) + if (!nst) { close_istream(st); + return NULL; + } st = nst; } @@ -538,7 +540,7 @@ int stream_blob_to_fd(int fd, unsigned const char *sha1, struct stream_filter *f goto close_and_exit; } if (kept && (lseek(fd, kept - 1, SEEK_CUR) == (off_t) -1 || - write(fd, "", 1) != 1)) + xwrite(fd, "", 1) != 1)) goto close_and_exit; result = 0; diff --git a/submodule.c b/submodule.c index 1905d75b2b..b80ecacf60 100644 --- a/submodule.c +++ b/submodule.c @@ -116,30 +116,7 @@ int remove_path_from_gitmodules(const char *path) void stage_updated_gitmodules(void) { - struct strbuf buf = STRBUF_INIT; - struct stat st; - int pos; - struct cache_entry *ce; - int namelen = strlen(".gitmodules"); - - pos = cache_name_pos(".gitmodules", namelen); - if (pos < 0) { - warning(_("could not find .gitmodules in index")); - return; - } - ce = active_cache[pos]; - ce->ce_flags = namelen; - if (strbuf_read_file(&buf, ".gitmodules", 0) < 0) - die(_("reading updated .gitmodules failed")); - if (lstat(".gitmodules", &st) < 0) - die_errno(_("unable to stat updated .gitmodules")); - fill_stat_cache_info(ce, &st); - ce->ce_mode = ce_mode_from_stat(ce, st.st_mode); - if (remove_cache_entry_at(pos) < 0) - die(_("unable to remove .gitmodules from index")); - if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1)) - die(_("adding updated .gitmodules failed")); - if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE)) + if (add_file_to_cache(".gitmodules", 0)) die(_("staging updated .gitmodules failed")); } @@ -201,7 +178,7 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt, int submodule_config(const char *var, const char *value, void *cb) { - if (!prefixcmp(var, "submodule.")) + if (starts_with(var, "submodule.")) return parse_submodule_config_option(var, value); else if (!strcmp(var, "fetch.recursesubmodules")) { config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value); diff --git a/t/Git-SVN/00compile.t b/t/Git-SVN/00compile.t index c92fee453f..c92fee453f 100644..100755 --- a/t/Git-SVN/00compile.t +++ b/t/Git-SVN/00compile.t diff --git a/t/Git-SVN/Utils/add_path_to_url.t b/t/Git-SVN/Utils/add_path_to_url.t index bfbd87845f..bfbd87845f 100644..100755 --- a/t/Git-SVN/Utils/add_path_to_url.t +++ b/t/Git-SVN/Utils/add_path_to_url.t diff --git a/t/Git-SVN/Utils/can_compress.t b/t/Git-SVN/Utils/can_compress.t index d7b49b8d54..d7b49b8d54 100644..100755 --- a/t/Git-SVN/Utils/can_compress.t +++ b/t/Git-SVN/Utils/can_compress.t diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/t/Git-SVN/Utils/canonicalize_url.t index 05795ab636..05795ab636 100644..100755 --- a/t/Git-SVN/Utils/canonicalize_url.t +++ b/t/Git-SVN/Utils/canonicalize_url.t diff --git a/t/Git-SVN/Utils/collapse_dotdot.t b/t/Git-SVN/Utils/collapse_dotdot.t index 1da1cce156..1da1cce156 100644..100755 --- a/t/Git-SVN/Utils/collapse_dotdot.t +++ b/t/Git-SVN/Utils/collapse_dotdot.t diff --git a/t/Git-SVN/Utils/fatal.t b/t/Git-SVN/Utils/fatal.t index 49e1438295..49e1438295 100644..100755 --- a/t/Git-SVN/Utils/fatal.t +++ b/t/Git-SVN/Utils/fatal.t diff --git a/t/Git-SVN/Utils/join_paths.t b/t/Git-SVN/Utils/join_paths.t index d4488e7162..d4488e7162 100644..100755 --- a/t/Git-SVN/Utils/join_paths.t +++ b/t/Git-SVN/Utils/join_paths.t @@ -340,7 +340,11 @@ Don't: - use perl without spelling it as "$PERL_PATH". This is to help our friends on Windows where the platform Perl often adds CR before the end of line, and they bundle Git with a version of Perl that - does not do so, whose path is specified with $PERL_PATH. + does not do so, whose path is specified with $PERL_PATH. Note that we + provide a "perl" function which uses $PERL_PATH under the hood, so + you do not need to worry when simply running perl in the test scripts + (but you do, for example, on a shebang line or in a sub script + created via "write_script"). - use sh without spelling it as "$SHELL_PATH", when the script can be misinterpreted by broken platform shell (e.g. Solaris). @@ -387,7 +391,7 @@ of the test_* functions (see the "Test harness library" section below), e.g.: test_expect_success PERL 'I need Perl' ' - "$PERL_PATH" -e "hlagh() if unf_unf()" + perl -e "hlagh() if unf_unf()" ' The advantage of skipping tests like this is that platforms that don't @@ -520,7 +524,7 @@ library for your script to use. test_external \ 'GitwebCache::*FileCache*' \ - "$PERL_PATH" "$TEST_DIRECTORY"/t9503/test_cache_interface.pl + perl "$TEST_DIRECTORY"/t9503/test_cache_interface.pl If the test is outputting its own TAP you should set the test_external_has_tap variable somewhere before calling the first @@ -536,7 +540,7 @@ library for your script to use. test_external_without_stderr \ 'Perl API' \ - "$PERL_PATH" "$TEST_DIRECTORY"/t9700/test.pl + perl "$TEST_DIRECTORY"/t9700/test.pl - test_expect_code <exit-code> <command> @@ -629,11 +633,18 @@ See the prereq argument to the test_* functions in the "Test harness library" section above and the "test_have_prereq" function for how to use these, and "test_set_prereq" for how to define your own. - - PERL & PYTHON + - PYTHON - Git wasn't compiled with NO_PERL=YesPlease or - NO_PYTHON=YesPlease. Wrap any tests that need Perl or Python in - these. + Git wasn't compiled with NO_PYTHON=YesPlease. Wrap any tests that + need Python with this. + + - PERL + + Git wasn't compiled with NO_PERL=YesPlease. + + Even without the PERL prerequisite, tests can assume there is a + usable perl interpreter at $PERL_PATH, though it need not be + particularly modern. - POSIXPERM diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh index 99caa42f5c..304c7b7d87 100644 --- a/t/annotate-tests.sh +++ b/t/annotate-tests.sh @@ -92,7 +92,7 @@ test_expect_success 'blame 2 authors + 1 branch2 author' ' ' test_expect_success 'merge branch1 & branch2' ' - git pull . branch1 + git merge branch1 ' test_expect_success 'blame 2 authors + 2 merged-in authors' ' @@ -116,6 +116,27 @@ test_expect_success 'blame evil merge' ' check_count A 2 B 1 B1 2 B2 1 "A U Thor" 1 ' +test_expect_success 'blame huge graft' ' + test_when_finished "git checkout branch2" && + test_when_finished "rm -f .git/info/grafts" && + graft= && + for i in 0 1 2 + do + for j in 0 1 2 3 4 5 6 7 8 9 + do + git checkout --orphan "$i$j" && + printf "%s\n" "$i" "$j" >file && + test_tick && + GIT_AUTHOR_NAME=$i$j GIT_AUTHOR_EMAIL=$i$j@test.git \ + git commit -a -m "$i$j" && + commit=$(git rev-parse --verify HEAD) && + graft="$graft$commit " + done + done && + printf "%s " $graft >.git/info/grafts && + check_count -h 00 01 1 10 1 +' + test_expect_success 'setup incomplete line' ' echo "incomplete" | tr -d "\\012" >>file && GIT_AUTHOR_NAME="C" GIT_AUTHOR_EMAIL="C@test.git" \ diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh index 9e381e000f..d5dab5a94f 100644 --- a/t/gitweb-lib.sh +++ b/t/gitweb-lib.sh @@ -1,4 +1,5 @@ -#!/bin/sh +# Initialization and helpers for Gitweb tests, which source this +# shell library instead of test-lib.sh. # # Copyright (c) 2007 Jakub Narebski # @@ -69,7 +70,7 @@ gitweb_run () { # written to web server logs, so we are not interested in that: # we are interested only in properly formatted errors/warnings rm -f gitweb.log && - "$PERL_PATH" -- "$SCRIPT_NAME" \ + perl -- "$SCRIPT_NAME" \ >gitweb.output 2>gitweb.log && perl -w -e ' open O, ">gitweb.headers"; diff --git a/t/lib-bash.sh b/t/lib-bash.sh index 11397f747b..2be955fafb 100644 --- a/t/lib-bash.sh +++ b/t/lib-bash.sh @@ -1,7 +1,6 @@ -#!/bin/sh -# -# Ensures that tests are run under Bash; primarily intended for running tests -# of the completion script. +# Shell library sourced instead of ./test-lib.sh by tests that need +# to run under Bash; primarily intended for tests of the completion +# script. if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then # we are in full-on bash mode diff --git a/t/lib-credential.sh b/t/lib-credential.sh index 3c43ff11b3..957ae936e8 100755 --- a/t/lib-credential.sh +++ b/t/lib-credential.sh @@ -18,10 +18,6 @@ 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-cvs.sh b/t/lib-cvs.sh index 44263ade25..5076718916 100644 --- a/t/lib-cvs.sh +++ b/t/lib-cvs.sh @@ -1,4 +1,4 @@ -#!/bin/sh +# Shell library sourced instead of ./test-lib.sh by cvsimport tests. . ./test-lib.sh diff --git a/t/lib-diff-alternative.sh b/t/lib-diff-alternative.sh index 75ffd9174f..8b4dbf22d2 100644 --- a/t/lib-diff-alternative.sh +++ b/t/lib-diff-alternative.sh @@ -1,4 +1,5 @@ -#!/bin/sh +# Helpers shared by the test scripts for diff algorithms (patience, +# histogram, etc). test_diff_frobnitz() { cat >file1 <<\EOF diff --git a/t/lib-gettext.sh b/t/lib-gettext.sh index ae8883a075..eec757f104 100644 --- a/t/lib-gettext.sh +++ b/t/lib-gettext.sh @@ -1,4 +1,5 @@ -#!/bin/sh +# Initialization and Icelandic locale for basic git i18n tests, +# which source this scriptlet instead of ./test-lib.sh. # # Copyright (c) 2010 Ævar Arnfjörð Bjarmason # diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh index 87f0ad8f41..bc4b3412fb 100644 --- a/t/lib-git-daemon.sh +++ b/t/lib-git-daemon.sh @@ -1,12 +1,29 @@ -#!/bin/sh +# Shell library to run git-daemon in tests. Ends the test early if +# GIT_TEST_GIT_DAEMON is not set. +# +# Usage: +# +# . ./test-lib.sh +# . "$TEST_DIRECTORY"/lib-git-daemon.sh +# start_git_daemon +# +# test_expect_success '...' ' +# ... +# ' +# +# test_expect_success ... +# +# stop_git_daemon +# test_done -if test -z "$GIT_TEST_GIT_DAEMON" +test_tristate GIT_TEST_GIT_DAEMON +if test "$GIT_TEST_GIT_DAEMON" = false then - skip_all="git-daemon testing disabled (define GIT_TEST_GIT_DAEMON to enable)" + skip_all="git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)" test_done fi -LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-'8121'} +LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-${this_test#t}} GIT_DAEMON_PID= GIT_DAEMON_DOCUMENT_ROOT_PATH="$PWD"/repo @@ -42,7 +59,8 @@ start_git_daemon() { kill "$GIT_DAEMON_PID" wait "$GIT_DAEMON_PID" trap 'die' EXIT - error "git daemon failed to start" + test_skip_or_die $GIT_TEST_GIT_DAEMON \ + "git daemon failed to start" fi } diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh index ccd918e79e..5aa8adcf9c 100644 --- a/t/lib-git-p4.sh +++ b/t/lib-git-p4.sh @@ -47,15 +47,22 @@ P4DPORT=$((10669 + ($testid - $git_p4_test_start))) P4PORT=localhost:$P4DPORT P4CLIENT=client -P4EDITOR=: +P4USER=author +P4EDITOR=true unset P4CHARSET -export P4PORT P4CLIENT P4EDITOR P4CHARSET +export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET db="$TRASH_DIRECTORY/db" cli="$TRASH_DIRECTORY/cli" git="$TRASH_DIRECTORY/git" pidfile="$TRASH_DIRECTORY/p4d.pid" +# git p4 submit generates a temp file, which will +# not get cleaned up if the submission fails. Don't +# clutter up /tmp on the test machine. +TMPDIR="$TRASH_DIRECTORY" +export TMPDIR + start_p4d() { mkdir -p "$db" "$cli" "$git" && rm -f "$pidfile" && @@ -96,12 +103,24 @@ start_p4d() { return 1 fi + # build a p4 user so author@example.com has an entry + p4_add_user author + # build a client client_view "//depot/... //client/..." && return 0 } +p4_add_user() { + name=$1 && + p4 user -f -i <<-EOF + User: $name + Email: $name@example.com + FullName: Dr. $name + EOF +} + kill_p4d() { pid=$(cat "$pidfile") # it had better exist for the first kill diff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh index c5e55b190b..b0ec12ff6c 100644 --- a/t/lib-git-svn.sh +++ b/t/lib-git-svn.sh @@ -29,7 +29,7 @@ export svnrepo svnconf=$PWD/svnconf export svnconf -"$PERL_PATH" -w -e " +perl -w -e " use SVN::Core; use SVN::Repos; \$SVN::Core::VERSION gt '1.1.0' or exit(42); @@ -146,7 +146,7 @@ stop_httpd () { } convert_to_rev_db () { - "$PERL_PATH" -w -- - "$@" <<\EOF + perl -w -- - "$@" <<\EOF use strict; @ARGV == 2 or die "usage: convert_to_rev_db <input> <output>"; open my $wr, '+>', $ARGV[1] or die "$!: couldn't open: $ARGV[1]"; diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index 54dbbfe5ce..252cbf163b 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -1,11 +1,39 @@ -#!/bin/sh +# Shell library to run an HTTP server for use in tests. +# Ends the test early if httpd tests should not be run, +# for example because the user has not enabled them. +# +# Usage: +# +# . ./test-lib.sh +# . "$TEST_DIRECTORY"/lib-httpd.sh +# start_httpd +# +# test_expect_success '...' ' +# ... +# ' +# +# test_expect_success ... +# +# stop_httpd +# test_done +# +# Can be configured using the following variables. +# +# GIT_TEST_HTTPD enable HTTPD tests +# LIB_HTTPD_PATH web server path +# LIB_HTTPD_MODULE_PATH web server modules path +# LIB_HTTPD_PORT listening port +# LIB_HTTPD_DAV enable DAV +# LIB_HTTPD_SVN enable SVN +# LIB_HTTPD_SSL enable SSL # # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at> # -if test -z "$GIT_TEST_HTTPD" +test_tristate GIT_TEST_HTTPD +if test "$GIT_TEST_HTTPD" = false then - skip_all="Network testing disabled (define GIT_TEST_HTTPD to enable)" + skip_all="Network testing disabled (unset GIT_TEST_HTTPD to enable)" test_done fi @@ -37,7 +65,7 @@ case $(uname) in esac LIB_HTTPD_PATH=${LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH"} -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'8111'} +LIB_HTTPD_PORT=${LIB_HTTPD_PORT-${this_test#t}} TEST_PATH="$TEST_DIRECTORY"/lib-httpd HTTPD_ROOT_PATH="$PWD"/httpd @@ -49,8 +77,7 @@ GIT_VALGRIND_OPTIONS=$GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS if ! test -x "$LIB_HTTPD_PATH" then - skip_all="skipping test, no web server found at '$LIB_HTTPD_PATH'" - test_done + test_skip_or_die $GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'" fi HTTPD_VERSION=`$LIB_HTTPD_PATH -v | \ @@ -62,19 +89,20 @@ then then if ! test $HTTPD_VERSION -ge 2 then - skip_all="skipping test, at least Apache version 2 is required" - test_done + test_skip_or_die $GIT_TEST_HTTPD \ + "at least Apache version 2 is required" fi if ! test -d "$DEFAULT_HTTPD_MODULE_PATH" then - skip_all="Apache module directory not found. Skipping tests." - test_done + test_skip_or_die $GIT_TEST_HTTPD \ + "Apache module directory not found" fi LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH" fi else - error "Could not identify web server at '$LIB_HTTPD_PATH'" + test_skip_or_die $GIT_TEST_HTTPD \ + "Could not identify web server at '$LIB_HTTPD_PATH'" fi prepare_httpd() { @@ -102,7 +130,7 @@ prepare_httpd() { HTTPD_DEST=127.0.0.1:$LIB_HTTPD_PORT HTTPD_URL=$HTTPD_PROTO://$HTTPD_DEST HTTPD_URL_USER=$HTTPD_PROTO://user%40host@$HTTPD_DEST - HTTPD_URL_USER_PASS=$HTTPD_PROTO://user%40host:user%40host@$HTTPD_DEST + HTTPD_URL_USER_PASS=$HTTPD_PROTO://user%40host:pass%40host@$HTTPD_DEST if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN" then @@ -128,9 +156,8 @@ start_httpd() { >&3 2>&4 if test $? -ne 0 then - skip_all="skipping test, web server setup failed" trap 'die' EXIT - test_done + test_skip_or_die $GIT_TEST_HTTPD "web server setup failed" fi } @@ -190,7 +217,15 @@ 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" + case "$*" in + *Username*) + what=user + ;; + *Password*) + what=pass + ;; + esac && + cat "$TRASH_DIRECTORY/askpass-$what" EOF GIT_ASKPASS="$TRASH_DIRECTORY/askpass" && export GIT_ASKPASS && @@ -200,11 +235,13 @@ setup_askpass_helper() { set_askpass() { >"$TRASH_DIRECTORY/askpass-query" && - echo "$*" >"$TRASH_DIRECTORY/askpass-response" + echo "$1" >"$TRASH_DIRECTORY/askpass-user" && + echo "$2" >"$TRASH_DIRECTORY/askpass-pass" } expect_askpass() { - dest=$HTTPD_DEST + dest=$HTTPD_DEST${3+/$3} + { case "$1" in none) diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 397c480401..3a03e8263d 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -110,6 +110,8 @@ ScriptAlias /broken_smart/ broken-smart-http.sh/ RewriteEngine on RewriteRule ^/smart-redir-perm/(.*)$ /smart/$1 [R=301] RewriteRule ^/smart-redir-temp/(.*)$ /smart/$1 [R=302] +RewriteRule ^/smart-redir-auth/(.*)$ /auth/smart/$1 [R=301] +RewriteRule ^/smart-redir-limited/(.*)/info/refs$ /smart/$1/info/refs [R=301] <IfDefine SSL> LoadModule ssl_module modules/mod_ssl.so diff --git a/t/lib-httpd/passwd b/t/lib-httpd/passwd index f2fbcad33e..99a34d6487 100644 --- a/t/lib-httpd/passwd +++ b/t/lib-httpd/passwd @@ -1 +1 @@ -user@host:nKpa8pZUHx/ic +user@host:xb4E8pqD81KQs diff --git a/t/lib-pack.sh b/t/lib-pack.sh index 7e8685b44c..7509846571 100644 --- a/t/lib-pack.sh +++ b/t/lib-pack.sh @@ -1,5 +1,3 @@ -#!/bin/sh -# # Support routines for hand-crafting weird or malicious packs. # # You can make a complete pack like: @@ -12,10 +10,10 @@ # Print the big-endian 4-byte octal representation of $1 uint32_octal () { n=$1 - printf '\%o' $(($n / 16777216)); n=$((n % 16777216)) - printf '\%o' $(($n / 65536)); n=$((n % 65536)) - printf '\%o' $(($n / 256)); n=$((n % 256)) - printf '\%o' $(($n )); + printf '\\%o' $(($n / 16777216)); n=$((n % 16777216)) + printf '\\%o' $(($n / 65536)); n=$((n % 65536)) + printf '\\%o' $(($n / 256)); n=$((n % 256)) + printf '\\%o' $(($n )); } # Print the big-endian 4-byte binary representation of $1 diff --git a/t/lib-pager.sh b/t/lib-pager.sh index ba03eab14f..3aa7a3ffd8 100644 --- a/t/lib-pager.sh +++ b/t/lib-pager.sh @@ -1,4 +1,4 @@ -#!/bin/sh +# Helpers for tests of git's choice of pager. test_expect_success 'determine default pager' ' test_might_fail git config --unset core.pager && diff --git a/t/lib-prereq-FILEMODE.sh b/t/lib-prereq-FILEMODE.sh deleted file mode 100644 index bce5a4c8bd..0000000000 --- a/t/lib-prereq-FILEMODE.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2010 Ævar Arnfjörð Bjarmason -# - -if test "$(git config --bool core.filemode)" = false -then - say 'filemode disabled on the filesystem' -else - test_set_prereq FILEMODE -fi diff --git a/t/lib-read-tree.sh b/t/lib-read-tree.sh index abc2c6f57f..b95f485606 100644 --- a/t/lib-read-tree.sh +++ b/t/lib-read-tree.sh @@ -1,43 +1,41 @@ -#!/bin/sh -# # Helper functions to check if read-tree would succeed/fail as expected with # and without the dry-run option. They also test that the dry-run does not # write the index and that together with -u it doesn't touch the work tree. # read_tree_must_succeed () { - git ls-files -s >pre-dry-run && - git read-tree -n "$@" && - git ls-files -s >post-dry-run && - test_cmp pre-dry-run post-dry-run && - git read-tree "$@" + git ls-files -s >pre-dry-run && + git read-tree -n "$@" && + git ls-files -s >post-dry-run && + test_cmp pre-dry-run post-dry-run && + git read-tree "$@" } read_tree_must_fail () { - git ls-files -s >pre-dry-run && - test_must_fail git read-tree -n "$@" && - git ls-files -s >post-dry-run && - test_cmp pre-dry-run post-dry-run && - test_must_fail git read-tree "$@" + git ls-files -s >pre-dry-run && + test_must_fail git read-tree -n "$@" && + git ls-files -s >post-dry-run && + test_cmp pre-dry-run post-dry-run && + test_must_fail git read-tree "$@" } read_tree_u_must_succeed () { - git ls-files -s >pre-dry-run && - git diff-files -p >pre-dry-run-wt && - git read-tree -n "$@" && - git ls-files -s >post-dry-run && - git diff-files -p >post-dry-run-wt && - test_cmp pre-dry-run post-dry-run && - test_cmp pre-dry-run-wt post-dry-run-wt && - git read-tree "$@" + git ls-files -s >pre-dry-run && + git diff-files -p >pre-dry-run-wt && + git read-tree -n "$@" && + git ls-files -s >post-dry-run && + git diff-files -p >post-dry-run-wt && + test_cmp pre-dry-run post-dry-run && + test_cmp pre-dry-run-wt post-dry-run-wt && + git read-tree "$@" } read_tree_u_must_fail () { - git ls-files -s >pre-dry-run && - git diff-files -p >pre-dry-run-wt && - test_must_fail git read-tree -n "$@" && - git ls-files -s >post-dry-run && - git diff-files -p >post-dry-run-wt && - test_cmp pre-dry-run post-dry-run && - test_cmp pre-dry-run-wt post-dry-run-wt && - test_must_fail git read-tree "$@" + git ls-files -s >pre-dry-run && + git diff-files -p >pre-dry-run-wt && + test_must_fail git read-tree -n "$@" && + git ls-files -s >post-dry-run && + git diff-files -p >post-dry-run-wt && + test_cmp pre-dry-run post-dry-run && + test_cmp pre-dry-run-wt post-dry-run-wt && + test_must_fail git read-tree "$@" } diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh index 8ff87fb3f9..6bd252212a 100644 --- a/t/lib-rebase.sh +++ b/t/lib-rebase.sh @@ -1,4 +1,4 @@ -#!/bin/sh +# Helper functions used by interactive rebase tests. # After setting the fake editor with this function, you can # diff --git a/t/lib-terminal.sh b/t/lib-terminal.sh index 58d911d21b..9a2dca506a 100644 --- a/t/lib-terminal.sh +++ b/t/lib-terminal.sh @@ -1,4 +1,4 @@ -#!/bin/sh +# Helpers for terminal output tests. test_expect_success PERL 'set up terminal for tests' ' # Reading from the pty master seems to get stuck _sometimes_ @@ -19,7 +19,7 @@ test_expect_success PERL 'set up terminal for tests' ' then : elif - "$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl \ + perl "$TEST_DIRECTORY"/test-terminal.perl \ sh -c "test -t 1 && test -t 2" then test_set_prereq TTY && @@ -29,7 +29,7 @@ test_expect_success PERL 'set up terminal for tests' ' echo >&4 "test_terminal: need to declare TTY prerequisite" return 127 fi - "$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl "$@" + perl "$TEST_DIRECTORY"/test-terminal.perl "$@" } fi ' diff --git a/t/perf/p0001-rev-list.sh b/t/perf/p0001-rev-list.sh index 4f71a63b0a..16359d51ae 100755 --- a/t/perf/p0001-rev-list.sh +++ b/t/perf/p0001-rev-list.sh @@ -14,4 +14,16 @@ test_perf 'rev-list --all --objects' ' git rev-list --all --objects >/dev/null ' +test_expect_success 'create new unreferenced commit' ' + commit=$(git commit-tree HEAD^{tree} -p HEAD) +' + +test_perf 'rev-list $commit --not --all' ' + git rev-list $commit --not --all >/dev/null +' + +test_perf 'rev-list --objects $commit --not --all' ' + git rev-list --objects $commit --not --all >/dev/null +' + test_done diff --git a/t/perf/p4001-diff-no-index.sh b/t/perf/p4001-diff-no-index.sh new file mode 100755 index 0000000000..683be6984f --- /dev/null +++ b/t/perf/p4001-diff-no-index.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +test_description="Test diff --no-index performance" + +. ./perf-lib.sh + +test_perf_large_repo +test_checkout_worktree + +file1=$(git ls-files | tail -n 2 | head -1) +file2=$(git ls-files | tail -n 1 | head -1) + +test_expect_success "empty files, so they take no time to diff" " + echo >$file1 && + echo >$file2 +" + +test_perf "diff --no-index" " + git diff --no-index $file1 $file2 >/dev/null +" + +test_done diff --git a/t/perf/p5310-pack-bitmaps.sh b/t/perf/p5310-pack-bitmaps.sh new file mode 100755 index 0000000000..685d46f8b7 --- /dev/null +++ b/t/perf/p5310-pack-bitmaps.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +test_description='Tests pack performance using bitmaps' +. ./perf-lib.sh + +test_perf_large_repo + +# note that we do everything through config, +# since we want to be able to compare bitmap-aware +# git versus non-bitmap git +test_expect_success 'setup bitmap config' ' + git config pack.writebitmaps true && + git config pack.writebitmaphashcache true +' + +test_perf 'repack to disk' ' + git repack -ad +' + +test_perf 'simulated clone' ' + git pack-objects --stdout --all </dev/null >/dev/null +' + +test_perf 'simulated fetch' ' + have=$(git rev-list HEAD~100 -1) && + { + echo HEAD && + echo ^$have + } | git pack-objects --revs --stdout >/dev/null +' + +test_expect_success 'create partial bitmap state' ' + # pick a commit to represent the repo tip in the past + cutoff=$(git rev-list HEAD~100 -1) && + orig_tip=$(git rev-parse HEAD) && + + # now kill off all of the refs and pretend we had + # just the one tip + rm -rf .git/logs .git/refs/* .git/packed-refs + git update-ref HEAD $cutoff + + # and then repack, which will leave us with a nice + # big bitmap pack of the "old" history, and all of + # the new history will be loose, as if it had been pushed + # up incrementally and exploded via unpack-objects + git repack -Ad + + # and now restore our original tip, as if the pushes + # had happened + git update-ref HEAD $orig_tip +' + +test_perf 'partial bitmap' ' + git pack-objects --stdout --all </dev/null >/dev/null +' + +test_done diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh index f4eecaa171..a8c9574291 100644 --- a/t/perf/perf-lib.sh +++ b/t/perf/perf-lib.sh @@ -1,4 +1,6 @@ -#!/bin/sh +# Performance testing framework. Each perf script starts much like +# a normal test script, except it sources this library instead of +# test-lib.sh. See t/perf/README for documentation. # # Copyright (c) 2011 Thomas Rast # diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index 10be52beed..a2bb63ce8e 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -41,20 +41,17 @@ test_expect_success '.git/objects should have 3 subdirectories' ' test_expect_success 'success is reported like this' ' : ' -test_expect_failure 'pretend we have a known breakage' ' - false -' run_sub_test_lib_test () { name="$1" descr="$2" # stdin is the body of the test code shift 2 mkdir "$name" && ( - # Pretend we're a test harness. This prevents - # test-lib from writing the counts to a file that will - # later be summarized, showing spurious "failed" tests - HARNESS_ACTIVE=t && - export HARNESS_ACTIVE && + # Pretend we're not running under a test harness, whether we + # are or not. The test-lib output depends on the setting of + # this variable, so we need a stable setting under which to run + # the sub-test. + sane_unset HARNESS_ACTIVE && cd "$name" && cat >"$name.sh" <<-EOF && #!$SHELL_PATH @@ -71,6 +68,8 @@ run_sub_test_lib_test () { cat >>"$name.sh" && chmod +x "$name.sh" && export TEST_DIRECTORY && + TEST_OUTPUT_DIRECTORY=$(pwd) && + export TEST_OUTPUT_DIRECTORY && ./"$name.sh" "$@" >out 2>err ) } @@ -233,16 +232,13 @@ test_expect_success 'test --verbose' ' grep -v "^Initialized empty" test-verbose/out+ >test-verbose/out && check_sub_test_lib_test test-verbose <<-\EOF > expecting success: true - > Z > ok 1 - passing test > Z > expecting success: echo foo > foo - > Z > ok 2 - test with output > Z > expecting success: false - > Z > not ok 3 - failing test > # false > Z @@ -265,7 +261,6 @@ test_expect_success 'test --verbose-only' ' > Z > expecting success: echo foo > foo - > Z > ok 2 - test with output > Z > not ok 3 - failing test diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh index cb144258cc..37e9396e5d 100755 --- a/t/t0002-gitfile.sh +++ b/t/t0002-gitfile.sh @@ -7,7 +7,7 @@ Verify that plumbing commands work when .git is a file . ./test-lib.sh objpath() { - echo "$1" | sed -e 's|\(..\)|\1/|' + echo "$1" | sed -e 's|\(..\)|\1/|' } objck() { @@ -19,7 +19,6 @@ objck() { fi } - test_expect_success 'initial setup' ' REAL="$(pwd)/.real" && mv .git "$REAL" diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 0b98b6f8d0..f0fbb42554 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -13,7 +13,6 @@ attr_check () { test_line_count = 0 err } - test_expect_success 'setup' ' mkdir -p a/b/d a/c b && ( @@ -244,40 +243,58 @@ EOF test_line_count = 0 err ' +test_expect_success 'using --git-dir and --work-tree' ' + mkdir unreal real && + git init real && + echo "file test=in-real" >real/.gitattributes && + ( + cd unreal && + attr_check file in-real "--git-dir ../real/.git --work-tree ../real" + ) +' + test_expect_success 'setup bare' ' - git clone --bare . bare.git && - cd bare.git + git clone --bare . bare.git ' test_expect_success 'bare repository: check that .gitattribute is ignored' ' ( - echo "f test=f" - echo "a/i test=a/i" - ) >.gitattributes && - attr_check f unspecified && - attr_check a/f unspecified && - attr_check a/c/f unspecified && - attr_check a/i unspecified && - attr_check subdir/a/i unspecified + cd bare.git && + ( + echo "f test=f" + echo "a/i test=a/i" + ) >.gitattributes && + attr_check f unspecified && + attr_check a/f unspecified && + attr_check a/c/f unspecified && + attr_check a/i unspecified && + attr_check subdir/a/i unspecified + ) ' test_expect_success 'bare repository: check that --cached honors index' ' - GIT_INDEX_FILE=../.git/index \ - git check-attr --cached --stdin --all <../stdin-all | - sort >actual && - test_cmp ../specified-all actual + ( + cd bare.git && + GIT_INDEX_FILE=../.git/index \ + git check-attr --cached --stdin --all <../stdin-all | + sort >actual && + test_cmp ../specified-all actual + ) ' test_expect_success 'bare repository: test info/attributes' ' ( - echo "f test=f" - echo "a/i test=a/i" - ) >info/attributes && - attr_check f f && - attr_check a/f f && - attr_check a/c/f f && - attr_check a/i a/i && - attr_check subdir/a/i unspecified + cd bare.git && + ( + echo "f test=f" + echo "a/i test=a/i" + ) >info/attributes && + attr_check f f && + attr_check a/f f && + attr_check a/c/f f && + attr_check a/i a/i && + attr_check subdir/a/i unspecified + ) ' test_done diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index 181513ab4f..63beb99828 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -37,6 +37,14 @@ test_stderr () { test_cmp "$HOME/expected-stderr" "$HOME/stderr" } +broken_c_unquote () { + "$PERL_PATH" -pe 's/^"//; s/\\//; s/"$//; tr/\n/\0/' "$@" +} + +broken_c_unquote_verbose () { + "$PERL_PATH" -pe 's/ "/ /; s/\\//; s/"$//; tr/:\t\n/\0/' "$@" +} + stderr_contains () { regexp="$1" if grep "$regexp" "$HOME/stderr" @@ -606,12 +614,11 @@ cat <<-EOF >expected-verbose $global_excludes:2:!globaltwo b/globaltwo EOF -sed -e 's/^"//' -e 's/\\//' -e 's/"$//' stdin | \ - tr "\n" "\0" >stdin0 -sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \ - tr "\n" "\0" >expected-default0 -sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \ - tr ":\t\n" "\0" >expected-verbose0 +broken_c_unquote stdin >stdin0 + +broken_c_unquote expected-default >expected-default0 + +broken_c_unquote_verbose expected-verbose >expected-verbose0 test_expect_success '--stdin' ' expect_from_stdin <expected-default && @@ -692,12 +699,11 @@ EOF grep -v '^:: ' expected-all >expected-verbose sed -e 's/.* //' expected-verbose >expected-default -sed -e 's/^"//' -e 's/\\//' -e 's/"$//' stdin | \ - tr "\n" "\0" >stdin0 -sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \ - tr "\n" "\0" >expected-default0 -sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \ - tr ":\t\n" "\0" >expected-verbose0 +broken_c_unquote stdin >stdin0 + +broken_c_unquote expected-default >expected-default0 + +broken_c_unquote_verbose expected-verbose >expected-verbose0 test_expect_success '--stdin from subdirectory' ' expect_from_stdin <expected-default && @@ -769,4 +775,35 @@ test_expect_success PIPE 'streaming support for --stdin' ' echo "$response" | grep "^:: two" ' +############################################################################ +# +# test whitespace handling + +test_expect_success 'trailing whitespace is ignored' ' + mkdir whitespace && + >whitespace/trailing && + >whitespace/untracked && + echo "whitespace/trailing " >ignore && + cat >expect <<EOF && +whitespace/untracked +EOF + : >err.expect && + git ls-files -o -X ignore whitespace >actual 2>err && + test_cmp expect actual && + test_cmp err.expect err +' + +test_expect_success !MINGW 'quoting allows trailing whitespace' ' + rm -rf whitespace && + mkdir whitespace && + >"whitespace/trailing " && + >whitespace/untracked && + echo "whitespace/trailing\\ \\ " >ignore && + echo whitespace/untracked >expect && + : >err.expect && + git ls-files -o -X ignore whitespace >actual 2>err && + test_cmp expect actual && + test_cmp err.expect err +' + test_done diff --git a/t/t0011-hashmap.sh b/t/t0011-hashmap.sh new file mode 100755 index 0000000000..391e2b6492 --- /dev/null +++ b/t/t0011-hashmap.sh @@ -0,0 +1,240 @@ +#!/bin/sh + +test_description='test hashmap and string hash functions' +. ./test-lib.sh + +test_hashmap() { + echo "$1" | test-hashmap $3 > actual && + echo "$2" > expect && + test_cmp expect actual +} + +test_expect_success 'hash functions' ' + +test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" && +test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" && +test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" && +test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727" + +' + +test_expect_success 'put' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +put foobarfrotz value4 +size" "NULL +NULL +NULL +NULL +64 4" + +' + +test_expect_success 'put (case insensitive)' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +size" "NULL +NULL +NULL +64 3" ignorecase + +' + +test_expect_success 'replace' ' + +test_hashmap "put key1 value1 +put key1 value2 +put fooBarFrotz value3 +put fooBarFrotz value4 +size" "NULL +value1 +NULL +value3 +64 2" + +' + +test_expect_success 'replace (case insensitive)' ' + +test_hashmap "put key1 value1 +put Key1 value2 +put fooBarFrotz value3 +put foobarfrotz value4 +size" "NULL +value1 +NULL +value3 +64 2" ignorecase + +' + +test_expect_success 'get' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +put foobarfrotz value4 +get key1 +get key2 +get fooBarFrotz +get notInMap" "NULL +NULL +NULL +NULL +value1 +value2 +value3 +NULL" + +' + +test_expect_success 'get (case insensitive)' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +get Key1 +get keY2 +get foobarfrotz +get notInMap" "NULL +NULL +NULL +value1 +value2 +value3 +NULL" ignorecase + +' + +test_expect_success 'add' ' + +test_hashmap "add key1 value1 +add key1 value2 +add fooBarFrotz value3 +add fooBarFrotz value4 +get key1 +get fooBarFrotz +get notInMap" "value2 +value1 +value4 +value3 +NULL" + +' + +test_expect_success 'add (case insensitive)' ' + +test_hashmap "add key1 value1 +add Key1 value2 +add fooBarFrotz value3 +add foobarfrotz value4 +get key1 +get Foobarfrotz +get notInMap" "value2 +value1 +value4 +value3 +NULL" ignorecase + +' + +test_expect_success 'remove' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +remove key1 +remove key2 +remove notInMap +size" "NULL +NULL +NULL +value1 +value2 +NULL +64 1" + +' + +test_expect_success 'remove (case insensitive)' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +remove Key1 +remove keY2 +remove notInMap +size" "NULL +NULL +NULL +value1 +value2 +NULL +64 1" ignorecase + +' + +test_expect_success 'iterate' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +iterate" "NULL +NULL +NULL +key2 value2 +key1 value1 +fooBarFrotz value3" + +' + +test_expect_success 'iterate (case insensitive)' ' + +test_hashmap "put key1 value1 +put key2 value2 +put fooBarFrotz value3 +iterate" "NULL +NULL +NULL +fooBarFrotz value3 +key2 value2 +key1 value1" ignorecase + +' + +test_expect_success 'grow / shrink' ' + + rm -f in && + rm -f expect && + for n in $(test_seq 51) + do + echo put key$n value$n >> in && + echo NULL >> expect + done && + echo size >> in && + echo 64 51 >> expect && + echo put key52 value52 >> in && + echo NULL >> expect + echo size >> in && + echo 256 52 >> expect && + for n in $(test_seq 12) + do + echo remove key$n >> in && + echo value$n >> expect + done && + echo size >> in && + echo 256 40 >> expect && + echo remove key40 >> in && + echo value40 >> expect && + echo size >> in && + echo 64 39 >> expect && + cat in | test-hashmap > out && + test_cmp expect out + +' + +test_done diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index 2bd5e32745..c0143a0a70 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -190,33 +190,58 @@ test_expect_success SYMLINKS 'real path works on symlinks' ' test "$sym" = "$(test-path-utils real_path "$dir2/syml")" ' -relative_path /a/b/c/ /a/b/ c/ -relative_path /a/b/c/ /a/b c/ -relative_path /a//b//c/ //a/b// c/ POSIX -relative_path /a/b /a/b ./ -relative_path /a/b/ /a/b ./ -relative_path /a /a/b ../ -relative_path / /a/b/ ../../ -relative_path /a/c /a/b/ ../c -relative_path /a/c /a/b ../c -relative_path /x/y /a/b/ ../../x/y -relative_path /a/b "<empty>" /a/b -relative_path /a/b "<null>" /a/b -relative_path a/b/c/ a/b/ c/ -relative_path a/b/c/ a/b c/ -relative_path a/b//c a//b c -relative_path a/b/ a/b/ ./ -relative_path a/b/ a/b ./ -relative_path a a/b ../ -relative_path x/y a/b ../../x/y -relative_path a/c a/b ../c -relative_path a/b "<empty>" a/b -relative_path a/b "<null>" a/b -relative_path "<empty>" /a/b ./ -relative_path "<empty>" "<empty>" ./ -relative_path "<empty>" "<null>" ./ -relative_path "<null>" "<empty>" ./ -relative_path "<null>" "<null>" ./ -relative_path "<null>" /a/b ./ +test_expect_success SYMLINKS 'prefix_path works with absolute paths to work tree symlinks' ' + ln -s target symlink && + test "$(test-path-utils prefix_path prefix "$(pwd)/symlink")" = "symlink" +' + +test_expect_success 'prefix_path works with only absolute path to work tree' ' + echo "" >expected && + test-path-utils prefix_path prefix "$(pwd)" >actual && + test_cmp expected actual +' + +test_expect_success 'prefix_path rejects absolute path to dir with same beginning as work tree' ' + test_must_fail test-path-utils prefix_path prefix "$(pwd)a" +' + +test_expect_success SYMLINKS 'prefix_path works with absolute path to a symlink to work tree having same beginning as work tree' ' + git init repo && + ln -s repo repolink && + test "a" = "$(cd repo && test-path-utils prefix_path prefix "$(pwd)/../repolink/a")" +' + +relative_path /foo/a/b/c/ /foo/a/b/ c/ +relative_path /foo/a/b/c/ /foo/a/b c/ +relative_path /foo/a//b//c/ ///foo/a/b// c/ POSIX +relative_path /foo/a/b /foo/a/b ./ +relative_path /foo/a/b/ /foo/a/b ./ +relative_path /foo/a /foo/a/b ../ +relative_path / /foo/a/b/ ../../../ +relative_path /foo/a/c /foo/a/b/ ../c +relative_path /foo/a/c /foo/a/b ../c +relative_path /foo/x/y /foo/a/b/ ../../x/y +relative_path /foo/a/b "<empty>" /foo/a/b +relative_path /foo/a/b "<null>" /foo/a/b +relative_path foo/a/b/c/ foo/a/b/ c/ +relative_path foo/a/b/c/ foo/a/b c/ +relative_path foo/a/b//c foo/a//b c +relative_path foo/a/b/ foo/a/b/ ./ +relative_path foo/a/b/ foo/a/b ./ +relative_path foo/a foo/a/b ../ +relative_path foo/x/y foo/a/b ../../x/y +relative_path foo/a/c foo/a/b ../c +relative_path foo/a/b /foo/x/y foo/a/b +relative_path /foo/a/b foo/x/y /foo/a/b +relative_path d:/a/b D:/a/c ../b MINGW +relative_path C:/a/b D:/a/c C:/a/b MINGW +relative_path foo/a/b "<empty>" foo/a/b +relative_path foo/a/b "<null>" foo/a/b +relative_path "<empty>" /foo/a/b ./ +relative_path "<empty>" "<empty>" ./ +relative_path "<empty>" "<null>" ./ +relative_path "<null>" "<empty>" ./ +relative_path "<null>" "<null>" ./ +relative_path "<null>" /foo/a/b ./ test_done diff --git a/t/t0202-gettext-perl.sh b/t/t0202-gettext-perl.sh index 428ebb0080..a29d166e00 100755 --- a/t/t0202-gettext-perl.sh +++ b/t/t0202-gettext-perl.sh @@ -12,7 +12,7 @@ if ! test_have_prereq PERL; then test_done fi -"$PERL_PATH" -MTest::More -e 0 2>/dev/null || { +perl -MTest::More -e 0 2>/dev/null || { skip_all="Perl Test::More unavailable, skipping test" test_done } @@ -22,6 +22,6 @@ test_external_has_tap=1 test_external_without_stderr \ 'Perl Git::I18N API' \ - "$PERL_PATH" "$TEST_DIRECTORY"/t0202/test.pl + perl "$TEST_DIRECTORY"/t0202/test.pl test_done diff --git a/t/t0202/test.pl b/t/t0202/test.pl index 2c10cb4693..2c10cb4693 100644..100755 --- a/t/t0202/test.pl +++ b/t/t0202/test.pl diff --git a/t/t1005-read-tree-reset.sh b/t/t1005-read-tree-reset.sh index f53de79e56..074568500a 100755 --- a/t/t1005-read-tree-reset.sh +++ b/t/t1005-read-tree-reset.sh @@ -8,84 +8,99 @@ test_description='read-tree -u --reset' # two-tree test test_expect_success 'setup' ' - git init && - mkdir df && - echo content >df/file && - git add df/file && - git commit -m one && - git ls-files >expect && - rm -rf df && - echo content >df && - git add df && - echo content >new && - git add new && - git commit -m two + git init && + mkdir df && + echo content >df/file && + git add df/file && + git commit -m one && + git ls-files >expect && + rm -rf df && + echo content >df && + git add df && + echo content >new && + git add new && + git commit -m two ' test_expect_success 'reset should work' ' - read_tree_u_must_succeed -u --reset HEAD^ && - git ls-files >actual && - test_cmp expect actual + read_tree_u_must_succeed -u --reset HEAD^ && + git ls-files >actual && + test_cmp expect actual ' test_expect_success 'reset should remove remnants from a failed merge' ' - read_tree_u_must_succeed --reset -u HEAD && - git ls-files -s >expect && - sha1=$(git rev-parse :new) && - ( - echo "100644 $sha1 1 old" - echo "100644 $sha1 3 old" - ) | git update-index --index-info && - >old && - git ls-files -s && - read_tree_u_must_succeed --reset -u HEAD && - git ls-files -s >actual && - ! test -f old + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >expect && + sha1=$(git rev-parse :new) && + ( + echo "100644 $sha1 1 old" + echo "100644 $sha1 3 old" + ) | git update-index --index-info && + >old && + git ls-files -s && + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >actual && + ! test -f old +' + +test_expect_success 'two-way reset should remove remnants too' ' + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >expect && + sha1=$(git rev-parse :new) && + ( + echo "100644 $sha1 1 old" + echo "100644 $sha1 3 old" + ) | git update-index --index-info && + >old && + git ls-files -s && + read_tree_u_must_succeed --reset -u HEAD HEAD && + git ls-files -s >actual && + ! test -f old ' test_expect_success 'Porcelain reset should remove remnants too' ' - read_tree_u_must_succeed --reset -u HEAD && - git ls-files -s >expect && - sha1=$(git rev-parse :new) && - ( - echo "100644 $sha1 1 old" - echo "100644 $sha1 3 old" - ) | git update-index --index-info && - >old && - git ls-files -s && - git reset --hard && - git ls-files -s >actual && - ! test -f old + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >expect && + sha1=$(git rev-parse :new) && + ( + echo "100644 $sha1 1 old" + echo "100644 $sha1 3 old" + ) | git update-index --index-info && + >old && + git ls-files -s && + git reset --hard && + git ls-files -s >actual && + ! test -f old ' test_expect_success 'Porcelain checkout -f should remove remnants too' ' - read_tree_u_must_succeed --reset -u HEAD && - git ls-files -s >expect && - sha1=$(git rev-parse :new) && - ( - echo "100644 $sha1 1 old" - echo "100644 $sha1 3 old" - ) | git update-index --index-info && - >old && - git ls-files -s && - git checkout -f && - git ls-files -s >actual && - ! test -f old + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >expect && + sha1=$(git rev-parse :new) && + ( + echo "100644 $sha1 1 old" + echo "100644 $sha1 3 old" + ) | git update-index --index-info && + >old && + git ls-files -s && + git checkout -f && + git ls-files -s >actual && + ! test -f old ' test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' ' - read_tree_u_must_succeed --reset -u HEAD && - git ls-files -s >expect && - sha1=$(git rev-parse :new) && - ( - echo "100644 $sha1 1 old" - echo "100644 $sha1 3 old" - ) | git update-index --index-info && - >old && - git ls-files -s && - git checkout -f HEAD && - git ls-files -s >actual && - ! test -f old + read_tree_u_must_succeed --reset -u HEAD && + git ls-files -s >expect && + sha1=$(git rev-parse :new) && + ( + echo "100644 $sha1 1 old" + echo "100644 $sha1 3 old" + ) | git update-index --index-info && + >old && + git ls-files -s && + git checkout -f HEAD && + git ls-files -s >actual && + ! test -f old ' test_done diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh index a420742494..a72e700ae4 100755 --- a/t/t1006-cat-file.sh +++ b/t/t1006-cat-file.sh @@ -85,6 +85,28 @@ $content" git cat-file --batch-check="%(objecttype) %(rest)" >actual && test_cmp expect actual ' + + test -z "$content" || + test_expect_success "--batch without type ($type)" ' + { + echo "$size" && + maybe_remove_timestamp "$content" $no_ts + } >expect && + echo $sha1 | git cat-file --batch="%(objectsize)" >actual.full && + maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual && + test_cmp expect actual + ' + + test -z "$content" || + test_expect_success "--batch without size ($type)" ' + { + echo "$type" && + maybe_remove_timestamp "$content" $no_ts + } >expect && + echo $sha1 | git cat-file --batch="%(objecttype)" >actual.full && + maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual && + test_cmp expect actual + ' } hello_content="Hello World" @@ -194,6 +216,12 @@ test_expect_success "--batch-check for an emtpy line" ' test " missing" = "$(echo | git cat-file --batch-check)" ' +test_expect_success 'empty --batch-check notices missing object' ' + echo "$_z40 missing" >expect && + echo "$_z40" | git cat-file --batch-check="" >actual && + test_cmp expect actual +' + batch_input="$hello_sha1 $commit_sha1 $tag_sha1 @@ -234,4 +262,38 @@ test_expect_success "--batch-check with multiple sha1s gives correct format" ' "$(echo_without_newline "$batch_check_input" | git cat-file --batch-check)" ' +test_expect_success 'setup blobs which are likely to delta' ' + test-genrandom foo 10240 >foo && + { cat foo; echo plus; } >foo-plus && + git add foo foo-plus && + git commit -m foo && + cat >blobs <<-\EOF + HEAD:foo + HEAD:foo-plus + EOF +' + +test_expect_success 'confirm that neither loose blob is a delta' ' + cat >expect <<-EOF + $_z40 + $_z40 + EOF + git cat-file --batch-check="%(deltabase)" <blobs >actual && + test_cmp expect actual +' + +# To avoid relying too much on the current delta heuristics, +# we will check only that one of the two objects is a delta +# against the other, but not the order. We can do so by just +# asking for the base of both, and checking whether either +# sha1 appears in the output. +test_expect_success '%(deltabase) reports packed delta bases' ' + git repack -ad && + git cat-file --batch-check="%(deltabase)" <blobs >actual && + { + grep "$(git rev-parse HEAD:foo)" actual || + grep "$(git rev-parse HEAD:foo-plus)" actual + } +' + test_done diff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh index df573c4978..b946f87686 100755 --- a/t/t1010-mktree.sh +++ b/t/t1010-mktree.sh @@ -42,13 +42,13 @@ test_expect_success 'ls-tree piped to mktree (2)' ' ' test_expect_success 'ls-tree output in wrong order given to mktree (1)' ' - "$PERL_PATH" -e "print reverse <>" <top | + perl -e "print reverse <>" <top | git mktree >actual && test_cmp tree actual ' test_expect_success 'ls-tree output in wrong order given to mktree (2)' ' - "$PERL_PATH" -e "print reverse <>" <top.withsub | + perl -e "print reverse <>" <top.withsub | git mktree >actual && test_cmp tree.withsub actual ' diff --git a/t/t1013-loose-object-format.sh b/t/t1013-loose-object-format.sh deleted file mode 100755 index fbf5f2fc00..0000000000 --- a/t/t1013-loose-object-format.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2011 Roberto Tyley -# - -test_description='Correctly identify and parse loose object headers - -There are two file formats for loose objects - the original standard -format, and the experimental format introduced with Git v1.4.3, later -deprecated with v1.5.3. Although Git no longer writes the -experimental format, objects in both formats must be read, with the -format for a given file being determined by the header. - -Detecting file format based on header is not entirely trivial, not -least because the first byte of a zlib-deflated stream will vary -depending on how much memory was allocated for the deflation window -buffer when the object was written out (for example 4KB on Android, -rather that 32KB on a normal PC). - -The loose objects used as test vectors have been generated with the -following Git versions: - -standard format: Git v1.7.4.1 -experimental format: Git v1.4.3 (legacyheaders=false) -standard format, deflated with 4KB window size: Agit/JGit on Android -' - -. ./test-lib.sh - -assert_blob_equals() { - printf "%s" "$2" >expected && - git cat-file -p "$1" >actual && - test_cmp expected actual -} - -test_expect_success setup ' - cp -R "$TEST_DIRECTORY/t1013/objects" .git/ && - git --version -' - -test_expect_success 'read standard-format loose objects' ' - git cat-file tag 8d4e360d6c70fbd72411991c02a09c442cf7a9fa && - git cat-file commit 6baee0540ea990d9761a3eb9ab183003a71c3696 && - git ls-tree 7a37b887a73791d12d26c0d3e39568a8fb0fa6e8 && - assert_blob_equals "257cc5642cb1a054f08cc83f2d943e56fd3ebe99" "foo$LF" -' - -test_expect_success 'read experimental-format loose objects' ' - git cat-file tag 76e7fa9941f4d5f97f64fea65a2cba436bc79cbb && - git cat-file commit 7875c6237d3fcdd0ac2f0decc7d3fa6a50b66c09 && - git ls-tree 95b1625de3ba8b2214d1e0d0591138aea733f64f && - assert_blob_equals "2e65efe2a145dda7ee51d1741299f848e5bf752e" "a" && - assert_blob_equals "9ae9e86b7bd6cb1472d9373702d8249973da0832" "ab" && - assert_blob_equals "85df50785d62d3b05ab03d9cbf7e4a0b49449730" "abcd" && - assert_blob_equals "1656f9233d999f61ef23ef390b9c71d75399f435" "abcdefgh" && - assert_blob_equals "1e72a6b2c4a577ab0338860fa9fe87f761fc9bbd" "abcdefghi" && - assert_blob_equals "70e6a83d8dcb26fc8bc0cf702e2ddeb6adca18fd" "abcdefghijklmnop" && - assert_blob_equals "bd15045f6ce8ff75747562173640456a394412c8" "abcdefghijklmnopqrstuvwx" -' - -test_expect_success 'read standard-format objects deflated with smaller window buffer' ' - git cat-file tag f816d5255855ac160652ee5253b06cd8ee14165a && - git cat-file tag 149cedb5c46929d18e0f118e9fa31927487af3b6 -' - -test_done diff --git a/t/t1013/objects/14/9cedb5c46929d18e0f118e9fa31927487af3b6 b/t/t1013/objects/14/9cedb5c46929d18e0f118e9fa31927487af3b6 Binary files differdeleted file mode 100644 index 472fd1458e..0000000000 --- a/t/t1013/objects/14/9cedb5c46929d18e0f118e9fa31927487af3b6 +++ /dev/null diff --git a/t/t1013/objects/16/56f9233d999f61ef23ef390b9c71d75399f435 b/t/t1013/objects/16/56f9233d999f61ef23ef390b9c71d75399f435 Binary files differdeleted file mode 100644 index c379d74ae2..0000000000 --- a/t/t1013/objects/16/56f9233d999f61ef23ef390b9c71d75399f435 +++ /dev/null diff --git a/t/t1013/objects/1e/72a6b2c4a577ab0338860fa9fe87f761fc9bbd b/t/t1013/objects/1e/72a6b2c4a577ab0338860fa9fe87f761fc9bbd Binary files differdeleted file mode 100644 index 93706305bc..0000000000 --- a/t/t1013/objects/1e/72a6b2c4a577ab0338860fa9fe87f761fc9bbd +++ /dev/null diff --git a/t/t1013/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 b/t/t1013/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 Binary files differdeleted file mode 100644 index bdcf704c9e..0000000000 --- a/t/t1013/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 +++ /dev/null diff --git a/t/t1013/objects/2e/65efe2a145dda7ee51d1741299f848e5bf752e b/t/t1013/objects/2e/65efe2a145dda7ee51d1741299f848e5bf752e Binary files differdeleted file mode 100644 index ad62c43e41..0000000000 --- a/t/t1013/objects/2e/65efe2a145dda7ee51d1741299f848e5bf752e +++ /dev/null diff --git a/t/t1013/objects/6b/aee0540ea990d9761a3eb9ab183003a71c3696 b/t/t1013/objects/6b/aee0540ea990d9761a3eb9ab183003a71c3696 Binary files differdeleted file mode 100644 index 3d2f0337db..0000000000 --- a/t/t1013/objects/6b/aee0540ea990d9761a3eb9ab183003a71c3696 +++ /dev/null diff --git a/t/t1013/objects/70/e6a83d8dcb26fc8bc0cf702e2ddeb6adca18fd b/t/t1013/objects/70/e6a83d8dcb26fc8bc0cf702e2ddeb6adca18fd Binary files differdeleted file mode 100644 index b3f71a6ee5..0000000000 --- a/t/t1013/objects/70/e6a83d8dcb26fc8bc0cf702e2ddeb6adca18fd +++ /dev/null diff --git a/t/t1013/objects/76/e7fa9941f4d5f97f64fea65a2cba436bc79cbb b/t/t1013/objects/76/e7fa9941f4d5f97f64fea65a2cba436bc79cbb deleted file mode 100644 index af4e9a7b0c..0000000000 --- a/t/t1013/objects/76/e7fa9941f4d5f97f64fea65a2cba436bc79cbb +++ /dev/null @@ -1,2 +0,0 @@ -Âxœ%ÌA‚0@Ñ}O1{cSZ(˜ãνáÃthª”’ZŒÜÞ Ëÿ?
¦m×6dµiÉ9…¤Gå˜h´Ø¨ÁZR'Q¶…RŒ¡ˆ‚ø³p‘ç‚ÓqL9âÏ=g¸§sIÐoopÎÿ”eÏ«_1»€³¤$×ç*Si«ëNwpP•RBôûÅÁú -³‡[(ð®d-øÁL9á
\ No newline at end of file diff --git a/t/t1013/objects/78/75c6237d3fcdd0ac2f0decc7d3fa6a50b66c09 b/t/t1013/objects/78/75c6237d3fcdd0ac2f0decc7d3fa6a50b66c09 Binary files differdeleted file mode 100644 index 3dd28be5c6..0000000000 --- a/t/t1013/objects/78/75c6237d3fcdd0ac2f0decc7d3fa6a50b66c09 +++ /dev/null diff --git a/t/t1013/objects/7a/37b887a73791d12d26c0d3e39568a8fb0fa6e8 b/t/t1013/objects/7a/37b887a73791d12d26c0d3e39568a8fb0fa6e8 Binary files differdeleted file mode 100644 index 2b97b264c3..0000000000 --- a/t/t1013/objects/7a/37b887a73791d12d26c0d3e39568a8fb0fa6e8 +++ /dev/null diff --git a/t/t1013/objects/85/df50785d62d3b05ab03d9cbf7e4a0b49449730 b/t/t1013/objects/85/df50785d62d3b05ab03d9cbf7e4a0b49449730 Binary files differdeleted file mode 100644 index 6dff746876..0000000000 --- a/t/t1013/objects/85/df50785d62d3b05ab03d9cbf7e4a0b49449730 +++ /dev/null diff --git a/t/t1013/objects/8d/4e360d6c70fbd72411991c02a09c442cf7a9fa b/t/t1013/objects/8d/4e360d6c70fbd72411991c02a09c442cf7a9fa Binary files differdeleted file mode 100644 index cb41e92d07..0000000000 --- a/t/t1013/objects/8d/4e360d6c70fbd72411991c02a09c442cf7a9fa +++ /dev/null diff --git a/t/t1013/objects/95/b1625de3ba8b2214d1e0d0591138aea733f64f b/t/t1013/objects/95/b1625de3ba8b2214d1e0d0591138aea733f64f Binary files differdeleted file mode 100644 index 7ac46b4f70..0000000000 --- a/t/t1013/objects/95/b1625de3ba8b2214d1e0d0591138aea733f64f +++ /dev/null diff --git a/t/t1013/objects/9a/e9e86b7bd6cb1472d9373702d8249973da0832 b/t/t1013/objects/9a/e9e86b7bd6cb1472d9373702d8249973da0832 Binary files differdeleted file mode 100644 index 9d8316d4e5..0000000000 --- a/t/t1013/objects/9a/e9e86b7bd6cb1472d9373702d8249973da0832 +++ /dev/null diff --git a/t/t1013/objects/bd/15045f6ce8ff75747562173640456a394412c8 b/t/t1013/objects/bd/15045f6ce8ff75747562173640456a394412c8 Binary files differdeleted file mode 100644 index eebf23956e..0000000000 --- a/t/t1013/objects/bd/15045f6ce8ff75747562173640456a394412c8 +++ /dev/null diff --git a/t/t1013/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/t/t1013/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 Binary files differdeleted file mode 100644 index 134cf19379..0000000000 --- a/t/t1013/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +++ /dev/null diff --git a/t/t1013/objects/f8/16d5255855ac160652ee5253b06cd8ee14165a b/t/t1013/objects/f8/16d5255855ac160652ee5253b06cd8ee14165a deleted file mode 100644 index 26b75aec56..0000000000 --- a/t/t1013/objects/f8/16d5255855ac160652ee5253b06cd8ee14165a +++ /dev/null @@ -1 +0,0 @@ -H‰ÌÁ‚0€aÏ{ŠÞ
I»e&Æø*¥ˆG°ß^¸ýù¿ËDåÒ†wU‡Ò—¬S±4ªŠÆªž ,fÅ[ðßVAÛºÎüxÈÇö6[wtG§Lu¸?—¦²¼Ú×@‰"gì{†+by¾%M
\ No newline at end of file diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh index 967359344d..c9c426c273 100755 --- a/t/t1300-repo-config.sh +++ b/t/t1300-repo-config.sh @@ -475,15 +475,28 @@ ein.bahn=strasse EOF test_expect_success 'alternative GIT_CONFIG' ' - GIT_CONFIG=other-config git config -l >output && + GIT_CONFIG=other-config git config --list >output && test_cmp expect output ' test_expect_success 'alternative GIT_CONFIG (--file)' ' - git config --file other-config -l > output && + git config --file other-config --list >output && test_cmp expect output ' +test_expect_success 'alternative GIT_CONFIG (--file=-)' ' + git config --file - --list <other-config >output && + test_cmp expect output +' + +test_expect_success 'setting a value in stdin is an error' ' + test_must_fail git config --file - some.value foo +' + +test_expect_success 'editing stdin is an error' ' + test_must_fail git config --file - --edit +' + test_expect_success 'refer config from subdirectory' ' mkdir x && ( diff --git a/t/t1303-wacky-config.sh b/t/t1303-wacky-config.sh index 46103a1591..3a2c81968c 100755 --- a/t/t1303-wacky-config.sh +++ b/t/t1303-wacky-config.sh @@ -3,17 +3,28 @@ test_description='Test wacky input to git config' . ./test-lib.sh +# Leaving off the newline is intentional! setup() { (printf "[section]\n" && printf " key = foo") >.git/config } +# 'check section.key value' verifies that the entry for section.key is +# 'value' check() { echo "$2" >expected git config --get "$1" >actual 2>&1 test_cmp actual expected } +# 'check section.key regex value' verifies that the entry for +# section.key *that matches 'regex'* is 'value' +check_regex() { + echo "$3" >expected + git config --get "$1" "$2" >actual 2>&1 + test_cmp actual expected +} + test_expect_success 'modify same key' ' setup && git config section.key bar && @@ -47,4 +58,57 @@ test_expect_success 'do not crash on special long config line' ' check section.key "$LONG_VALUE" ' +setup_many() { + setup && + # This time we want the newline so that we can tack on more + # entries. + echo >>.git/config && + # Semi-efficient way of concatenating 5^5 = 3125 lines. Note + # that because 'setup' already put one line, this means 3126 + # entries for section.key in the config file. + cat >5to1 <<-\EOF && + key = foo + key = foo + key = foo + key = foo + key = foo + EOF + cat 5to1 5to1 5to1 5to1 5to1 >5to2 && # 25 + cat 5to2 5to2 5to2 5to2 5to2 >5to3 && # 125 + cat 5to3 5to3 5to3 5to3 5to3 >5to4 && # 635 + cat 5to4 5to4 5to4 5to4 5to4 >>.git/config # 3125 +} + +test_expect_success 'get many entries' ' + setup_many && + git config --get-all section.key >actual && + test_line_count = 3126 actual +' + +test_expect_success 'get many entries by regex' ' + setup_many && + git config --get-regexp "sec.*ke." >actual && + test_line_count = 3126 actual +' + +test_expect_success 'add and replace one of many entries' ' + setup_many && + git config --add section.key bar && + check_regex section.key "b.*r" bar && + git config section.key beer "b.*r" && + check_regex section.key "b.*r" beer +' + +test_expect_success 'replace many entries' ' + setup_many && + git config --replace-all section.key bar && + check section.key bar +' + +test_expect_success 'unset many entries' ' + setup_many && + git config --unset-all section.key && + test_must_fail git config section.key +' + test_done diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh index a70707620f..9ba2ba11c3 100755 --- a/t/t1305-config-include.sh +++ b/t/t1305-config-include.sh @@ -113,7 +113,7 @@ test_expect_success 'missing include files are ignored' ' test_expect_success 'absolute includes from command line work' ' echo "[test]one = 1" >one && echo 1 >expect && - git -c include.path="$PWD/one" config test.one >actual && + git -c include.path="$(pwd)/one" config test.one >actual && test_cmp expect actual ' @@ -122,6 +122,36 @@ test_expect_success 'relative includes from command line fail' ' test_must_fail git -c include.path=one config test.one ' +test_expect_success 'absolute includes from blobs work' ' + echo "[test]one = 1" >one && + echo "[include]path=$(pwd)/one" >blob && + blob=$(git hash-object -w blob) && + echo 1 >expect && + git config --blob=$blob test.one >actual && + test_cmp expect actual +' + +test_expect_success 'relative includes from blobs fail' ' + echo "[test]one = 1" >one && + echo "[include]path=one" >blob && + blob=$(git hash-object -w blob) && + test_must_fail git config --blob=$blob test.one +' + +test_expect_success 'absolute includes from stdin work' ' + echo "[test]one = 1" >one && + echo 1 >expect && + echo "[include]path=\"$(pwd)/one\"" | + git config --file - test.one >actual && + test_cmp expect actual +' + +test_expect_success 'relative includes from stdin line fail' ' + echo "[test]one = 1" >one && + echo "[include]path=one" | + test_must_fail git config --file - test.one +' + test_expect_success 'include cycles are detected' ' cat >.gitconfig <<-\EOF && [test]value = gitconfig diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index d730734fde..8c739c9613 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -142,6 +142,20 @@ test_expect_success '> in name is reported' ' grep "error in commit $new" out ' +# date is 2^64 + 1 +test_expect_success 'integer overflow in timestamps is reported' ' + git cat-file commit HEAD >basis && + sed "s/^\\(author .*>\\) [0-9]*/\\1 18446744073709551617/" \ + <basis >bad-timestamp && + new=$(git hash-object -t commit -w --stdin <bad-timestamp) && + test_when_finished "remove_object $new" && + git update-ref refs/heads/bogus "$new" && + test_when_finished "git update-ref -d refs/heads/bogus" && + git fsck 2>out && + cat out && + grep "error in commit $new.*integer overflow" out +' + test_expect_success 'tag pointing to nonexistent' ' cat >invalid-tag <<-\EOF && object ffffffffffffffffffffffffffffffffffffffff diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index 13c88c9aae..83b1300cef 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -12,9 +12,11 @@ usage: some-command [options] <args>... -h, --help show the help --foo some nifty option --foo --bar ... some cool option --bar with an argument + -b, --baz a short and long option An option group Header -C[...] option C with an optional argument + -d, --data[=...] short and long option with an optional argument Extras --extra1 line above used to cause a segfault but no longer does @@ -31,9 +33,11 @@ h,help show the help foo some nifty option --foo bar= some cool option --bar with an argument +b,baz a short and long option An option group Header C? option C with an optional argument +d,data? short and long option with an optional argument Extras extra1 line above used to cause a segfault but no longer does @@ -45,16 +49,16 @@ test_expect_success 'test --parseopt help output' ' ' cat > expect <<EOF -set -- --foo --bar 'ham' -- 'arg' +set -- --foo --bar 'ham' -b -- 'arg' EOF test_expect_success 'test --parseopt' ' - git rev-parse --parseopt -- --foo --bar=ham arg < optionspec > output && + git rev-parse --parseopt -- --foo --bar=ham --baz arg < optionspec > output && test_cmp expect output ' test_expect_success 'test --parseopt with mixed options and arguments' ' - git rev-parse --parseopt -- --foo arg --bar=ham < optionspec > output && + git rev-parse --parseopt -- --foo arg --bar=ham --baz < optionspec > output && test_cmp expect output ' @@ -99,4 +103,36 @@ test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option withou test_cmp expect output ' +cat > expect <<EOF +set -- --foo --bar='z' --baz -C'Z' --data='A' -- 'arg' +EOF + +test_expect_success 'test --parseopt --stuck-long' ' + git rev-parse --parseopt --stuck-long -- --foo --bar=z -b arg -CZ -dA <optionspec >output && + test_cmp expect output +' + +cat > expect <<EOF +set -- --data='' -C --baz -- 'arg' +EOF + +test_expect_success 'test --parseopt --stuck-long and empty optional argument' ' + git rev-parse --parseopt --stuck-long -- --data= arg -C -b <optionspec >output && + test_cmp expect output +' + +cat > expect <<EOF +set -- --data --baz -- 'arg' +EOF + +test_expect_success 'test --parseopt --stuck-long and long option with unset optional argument' ' + git rev-parse --parseopt --stuck-long -- --data arg -b <optionspec >output && + test_cmp expect output +' + +test_expect_success 'test --parseopt --stuck-long and short option with unset optional argument' ' + git rev-parse --parseopt --stuck-long -- -d arg -b <optionspec >output && + test_cmp expect output +' + test_done diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh index f950c10128..613d9bfe1b 100755 --- a/t/t1506-rev-parse-diagnosis.sh +++ b/t/t1506-rev-parse-diagnosis.sh @@ -196,4 +196,28 @@ test_expect_success 'dotdot is not an empty set' ' test_cmp expect actual ' +test_expect_success 'arg before dashdash must be a revision (missing)' ' + test_must_fail git rev-parse foobar -- 2>stderr && + test_i18ngrep "bad revision" stderr +' + +test_expect_success 'arg before dashdash must be a revision (file)' ' + >foobar && + test_must_fail git rev-parse foobar -- 2>stderr && + test_i18ngrep "bad revision" stderr +' + +test_expect_success 'arg before dashdash must be a revision (ambiguous)' ' + >foobar && + git update-ref refs/heads/foobar HEAD && + { + # we do not want to use rev-parse here, because + # we are testing it + cat .git/refs/heads/foobar && + printf "%s\n" -- + } >expect && + git rev-parse foobar -- >actual && + test_cmp expect actual +' + test_done diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh index 2a19e797eb..178694ee63 100755 --- a/t/t1507-rev-parse-upstream.sh +++ b/t/t1507-rev-parse-upstream.sh @@ -17,6 +17,9 @@ test_expect_success 'setup' ' test_commit 4 && git branch --track my-side origin/side && git branch --track local-master master && + git branch --track fun@ny origin/side && + git branch --track @funny origin/side && + git branch --track funny@ origin/side && git remote add -t master master-only .. && git fetch master-only && git branch bad-upstream && @@ -54,6 +57,24 @@ test_expect_success 'my-side@{upstream} resolves to correct full name' ' test refs/remotes/origin/side = "$(full_name my-side@{u})" ' +test_expect_success 'upstream of branch with @ in middle' ' + full_name fun@ny@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + +test_expect_success 'upstream of branch with @ at start' ' + full_name @funny@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + +test_expect_success 'upstream of branch with @ at end' ' + full_name funny@@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + test_expect_success 'refs/heads/my-side@{upstream} does not resolve to my-side{upstream}' ' test_must_fail full_name refs/heads/my-side@{upstream} ' @@ -210,4 +231,20 @@ test_expect_success 'log -g other@{u}@{now}' ' test_cmp expect actual ' +test_expect_success '@{reflog}-parsing does not look beyond colon' ' + echo content >@{yesterday} && + git add @{yesterday} && + git commit -m "funny reflog file" && + git hash-object @{yesterday} >expect && + git rev-parse HEAD:@{yesterday} >actual +' + +test_expect_success '@{upstream}-parsing does not look beyond colon' ' + echo content >@{upstream} && + git add @{upstream} && + git commit -m "funny upstream file" && + git hash-object @{upstream} >expect && + git rev-parse HEAD:@{upstream} >actual +' + test_done diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh index ceb844985f..078e1195df 100755 --- a/t/t1508-at-combinations.sh +++ b/t/t1508-at-combinations.sh @@ -9,8 +9,11 @@ check() { if test '$2' = 'commit' then git log -1 --format=%s '$1' >actual - else + elif test '$2' = 'ref' + then git rev-parse --symbolic-full-name '$1' >actual + else + git cat-file -p '$1' >actual fi && test_cmp expect actual " @@ -82,4 +85,14 @@ check HEAD ref refs/heads/old-branch check "HEAD@{1}" commit new-two check "@{1}" commit old-one +test_expect_success 'create path with @' ' + echo content >normal && + echo content >fun@ny && + git add normal fun@ny && + git commit -m "funny path" +' + +check "@:normal" blob content +check "@:fun@ny" blob content + test_done diff --git a/t/t1600-index.sh b/t/t1600-index.sh new file mode 100755 index 0000000000..079d241145 --- /dev/null +++ b/t/t1600-index.sh @@ -0,0 +1,76 @@ +#!/bin/sh + +test_description='index file specific tests' + +. ./test-lib.sh + +test_expect_success 'setup' ' + echo 1 >a +' + +test_expect_success 'bogus GIT_INDEX_VERSION issues warning' ' + ( + rm -f .git/index && + GIT_INDEX_VERSION=2bogus && + export GIT_INDEX_VERSION && + git add a 2>&1 | sed "s/[0-9]//" >actual.err && + sed -e "s/ Z$/ /" <<-\EOF >expect.err && + warning: GIT_INDEX_VERSION set, but the value is invalid. + Using version Z + EOF + test_i18ncmp expect.err actual.err + ) +' + +test_expect_success 'out of bounds GIT_INDEX_VERSION issues warning' ' + ( + rm -f .git/index && + GIT_INDEX_VERSION=1 && + export GIT_INDEX_VERSION && + git add a 2>&1 | sed "s/[0-9]//" >actual.err && + sed -e "s/ Z$/ /" <<-\EOF >expect.err && + warning: GIT_INDEX_VERSION set, but the value is invalid. + Using version Z + EOF + test_i18ncmp expect.err actual.err + ) +' + +test_expect_success 'no warning with bogus GIT_INDEX_VERSION and existing index' ' + ( + GIT_INDEX_VERSION=1 && + export GIT_INDEX_VERSION && + git add a 2>actual.err && + >expect.err && + test_i18ncmp expect.err actual.err + ) +' + +test_expect_success 'out of bounds index.version issues warning' ' + ( + sane_unset GIT_INDEX_VERSION && + rm -f .git/index && + git config --add index.version 1 && + git add a 2>&1 | sed "s/[0-9]//" >actual.err && + sed -e "s/ Z$/ /" <<-\EOF >expect.err && + warning: index.version set, but the value is invalid. + Using version Z + EOF + test_i18ncmp expect.err actual.err + ) +' + +test_expect_success 'GIT_INDEX_VERSION takes precedence over config' ' + ( + rm -f .git/index && + GIT_INDEX_VERSION=4 && + export GIT_INDEX_VERSION && + git config --add index.version 2 && + git add a 2>&1 && + echo 4 >expect && + test-index-version <.git/index >actual && + test_cmp expect actual + ) +' + +test_done diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh index 7cc0a3582e..87bdf9c96b 100755 --- a/t/t2010-checkout-ambiguous.sh +++ b/t/t2010-checkout-ambiguous.sh @@ -47,4 +47,10 @@ test_expect_success 'disambiguate checking out from a tree-ish' ' git diff --exit-code --quiet ' +test_expect_success 'accurate error message with more than one ref' ' + test_must_fail git checkout HEAD master -- 2>actual && + grep 2 actual && + test_i18ngrep "one reference expected, 2 given" actual +' + test_done diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index 094b92ef48..6ecb559465 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -164,4 +164,25 @@ test_expect_success 'checkout of branch from a single remote succeeds #4' ' test_branch_upstream eggs repo_d eggs ' +test_expect_success 'checkout of branch with a file having the same name fails' ' + git checkout -B master && + test_might_fail git branch -D spam && + + >spam && + test_must_fail git checkout spam && + test_must_fail git rev-parse --verify refs/heads/spam && + test_branch master +' + +test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' ' + git checkout -B master && + test_might_fail git branch -D spam && + + >spam && + git checkout spam -- && + test_branch spam && + test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD && + test_branch_upstream spam repo_c spam +' + test_done diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh index 1d0879be06..29c1fb10ca 100755 --- a/t/t2104-update-index-skip-worktree.sh +++ b/t/t2104-update-index-skip-worktree.sh @@ -7,6 +7,8 @@ test_description='skip-worktree bit test' . ./test-lib.sh +test_set_index_version 3 + cat >expect.full <<EOF H 1 H 2 diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh index 9bf2bdffd2..e16b15d3e5 100755 --- a/t/t2200-add-update.sh +++ b/t/t2200-add-update.sh @@ -80,18 +80,13 @@ test_expect_success 'change gets noticed' ' ' -# Note that this is scheduled to change in Git 2.0, when -# "git add -u" will become full-tree by default. -test_expect_success 'non-limited update in subdir leaves root alone' ' +test_expect_success 'non-qualified update in subdir updates from the root' ' ( cd dir1 && echo even more >>sub2 && git add -u ) && - cat >expect <<-\EOF && - check - top - EOF + : >expect && git diff-files --name-only >actual && test_cmp expect actual ' diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh index 8d9bc3c2af..9c7adbdbe1 100755 --- a/t/t3004-ls-files-basic.sh +++ b/t/t3004-ls-files-basic.sh @@ -36,4 +36,21 @@ test_expect_success 'ls-files -h in corrupt repository' ' test_i18ngrep "[Uu]sage: git ls-files " broken/usage ' +test_expect_success SYMLINKS 'ls-files with absolute paths to symlinks' ' + mkdir subs && + ln -s nosuch link && + ln -s ../nosuch subs/link && + git add link subs/link && + git ls-files -s link subs/link >expect && + git ls-files -s "$(pwd)/link" "$(pwd)/subs/link" >actual && + test_cmp expect actual && + + ( + cd subs && + git ls-files -s link >../expect && + git ls-files -s "$(pwd)/link" >../actual + ) && + test_cmp expect actual +' + test_done diff --git a/t/t3030-merge-recursive.sh b/t/t3030-merge-recursive.sh index 2f96100a5f..82e18548c3 100755 --- a/t/t3030-merge-recursive.sh +++ b/t/t3030-merge-recursive.sh @@ -257,6 +257,7 @@ test_expect_success 'setup 8' ' git add e && test_tick && git commit -m "rename a->e" && + c7=$(git rev-parse --verify HEAD) && git checkout rename-ln && git mv a e && test_ln_s_add e a && @@ -517,6 +518,52 @@ test_expect_success 'reset and bind merge' ' ' +test_expect_success 'merge-recursive w/ empty work tree - ours has rename' ' + ( + GIT_WORK_TREE="$PWD/ours-has-rename-work" && + export GIT_WORK_TREE && + GIT_INDEX_FILE="$PWD/ours-has-rename-index" && + export GIT_INDEX_FILE && + mkdir "$GIT_WORK_TREE" && + git read-tree -i -m $c7 && + git update-index --ignore-missing --refresh && + git merge-recursive $c0 -- $c7 $c3 && + git ls-files -s >actual-files + ) 2>actual-err && + >expected-err && + cat >expected-files <<-EOF && + 100644 $o3 0 b/c + 100644 $o0 0 c + 100644 $o0 0 d/e + 100644 $o0 0 e + EOF + test_cmp expected-files actual-files && + test_cmp expected-err actual-err +' + +test_expect_success 'merge-recursive w/ empty work tree - theirs has rename' ' + ( + GIT_WORK_TREE="$PWD/theirs-has-rename-work" && + export GIT_WORK_TREE && + GIT_INDEX_FILE="$PWD/theirs-has-rename-index" && + export GIT_INDEX_FILE && + mkdir "$GIT_WORK_TREE" && + git read-tree -i -m $c3 && + git update-index --ignore-missing --refresh && + git merge-recursive $c0 -- $c3 $c7 && + git ls-files -s >actual-files + ) 2>actual-err && + >expected-err && + cat >expected-files <<-EOF && + 100644 $o3 0 b/c + 100644 $o0 0 c + 100644 $o0 0 d/e + 100644 $o0 0 e + EOF + test_cmp expected-files actual-files && + test_cmp expected-err actual-err +' + test_expect_success 'merge removes empty directories' ' git reset --hard master && diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh index 38446a0e87..ef509df351 100755 --- a/t/t3070-wildmatch.sh +++ b/t/t3070-wildmatch.sh @@ -14,19 +14,6 @@ match() { ! test-wildmatch wildmatch '$3' '$4' " fi - if [ $2 = 1 ]; then - test_expect_success "fnmatch: match '$3' '$4'" " - test-wildmatch fnmatch '$3' '$4' - " - elif [ $2 = 0 ]; then - test_expect_success "fnmatch: no match '$3' '$4'" " - ! test-wildmatch fnmatch '$3' '$4' - " -# else -# test_expect_success BROKEN_FNMATCH "fnmatch: '$3' '$4'" " -# ! test-wildmatch fnmatch '$3' '$4' -# " - fi } imatch() { diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 0fe7647928..fcdb867748 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -18,7 +18,7 @@ test_expect_success 'prepare a trivial repository' ' ' test_expect_success 'git branch --help should not have created a bogus branch' ' - test_might_fail git branch --help </dev/null >/dev/null 2>/dev/null && + test_might_fail git branch --man --help </dev/null >/dev/null 2>&1 && test_path_is_missing .git/refs/heads/--help ' diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh index 7480d6e7c2..9a146f1335 100755 --- a/t/t3300-funny-names.sh +++ b/t/t3300-funny-names.sh @@ -69,7 +69,7 @@ test_expect_success 'ls-files -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git ls-files -z >ls-files.z && - "$PERL_PATH" -pe "y/\000/\012/" <ls-files.z >current && + perl -pe "y/\000/\012/" <ls-files.z >current && test_cmp expected current ' @@ -106,7 +106,7 @@ test_expect_success 'diff-index -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git diff-index -z --name-status $t0 >diff-index.z && - "$PERL_PATH" -pe "y/\000/\012/" <diff-index.z >current && + perl -pe "y/\000/\012/" <diff-index.z >current && test_cmp expected current ' @@ -116,7 +116,7 @@ test_expect_success 'diff-tree -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git diff-tree -z --name-status $t0 $t1 >diff-tree.z && - "$PERL_PATH" -pe y/\\000/\\012/ <diff-tree.z >current && + perl -pe y/\\000/\\012/ <diff-tree.z >current && test_cmp expected current ' diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index 16de05aff9..3bb79a47af 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -812,6 +812,33 @@ test_expect_success 'create note from non-existing note with "git notes add -C" test_must_fail git notes list HEAD ' +test_expect_success 'create note from non-blob with "git notes add -C" fails' ' + commit=$(git rev-parse --verify HEAD) && + tree=$(git rev-parse --verify HEAD:) && + test_must_fail git notes add -C $commit && + test_must_fail git notes add -C $tree && + test_must_fail git notes list HEAD +' + +cat > expect << EOF +commit 80d796defacd5db327b7a4e50099663902fbdc5c +Author: A U Thor <author@example.com> +Date: Thu Apr 7 15:20:13 2005 -0700 + + 8th + +Notes (other): + This is a blob object +EOF + +test_expect_success 'create note from blob with "git notes add -C" reuses blob id' ' + blob=$(echo "This is a blob object" | git hash-object -w --stdin) && + git notes add -C $blob && + git log -1 > actual && + test_cmp expect actual && + test "$(git notes list HEAD)" = "$blob" +' + cat > expect << EOF commit 016e982bad97eacdbda0fcbd7ce5b0ba87c81f1b Author: A U Thor <author@example.com> diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index ebf93b0695..6d94b1fcd9 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -134,12 +134,22 @@ test_expect_success 'fail when upstream arg is missing and not configured' ' test_must_fail git rebase ' -test_expect_success 'default to @{upstream} when upstream arg is missing' ' +test_expect_success 'default to common base in @{upstream}s reflog if no upstream arg' ' + git checkout -b default-base master && git checkout -b default topic && git config branch.default.remote . && - git config branch.default.merge refs/heads/master && + git config branch.default.merge refs/heads/default-base && git rebase && - test "$(git rev-parse default~1)" = "$(git rev-parse master)" + git rev-parse --verify default-base >expect && + git rev-parse default~1 >actual && + test_cmp expect actual && + git checkout default-base && + git reset --hard HEAD^ && + git checkout default && + git rebase && + git rev-parse --verify default-base >expect && + git rev-parse default~1 >actual && + test_cmp expect actual ' test_expect_success 'rebase -q is quiet' ' diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 639cb70941..3d305814b9 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -240,18 +240,15 @@ test_expect_success 'refresh index before checking if it is up-to-date' ' test_expect_success 'choking "git rm" should not let it die with cruft' ' git reset -q --hard && + test_when_finished "rm -f .git/index.lock && git reset -q --hard" && i=0 && while test $i -lt 12000 do - echo "100644 $_z40 0 some-file-$i" + echo "100644 1234567890123456789012345678901234567890 0 some-file-$i" i=$(( $i + 1 )) done | git update-index --index-info && - git rm -n "some-file-*" | :; - test -f .git/index.lock - status=$? - rm -f .git/index.lock - git reset -q --hard - test "$status" != 0 + git rm -n "some-file-*" | : && + test_path_is_missing .git/index.lock ' test_expect_success 'rm removes subdirectories recursively' ' @@ -708,6 +705,22 @@ test_expect_success 'rm of a populated nested submodule with a nested .git direc rm -rf submod ' +test_expect_success 'checking out a commit after submodule removal needs manual updates' ' + git commit -m "submodule removal" submod && + git checkout HEAD^ && + git submodule update && + git checkout -q HEAD^ 2>actual && + git checkout -q master 2>actual && + echo "warning: unable to rmdir submod: Directory not empty" >expected && + test_i18ncmp expected actual && + git status -s submod >actual && + echo "?? submod/" >expected && + test_cmp expected actual && + rm -rf submod && + git status -s -uno --ignore-submodules=none > actual && + ! test -s actual +' + test_expect_success 'rm of d/f when d has become a non-directory' ' rm -rf d && mkdir d && diff --git a/t/t3700-add.sh b/t/t3700-add.sh index aab86e838b..fe274e2fb1 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -272,6 +272,25 @@ test_expect_success '"add non-existent" should fail' ' ! (git ls-files | grep "non-existent") ' +test_expect_success 'git add -A on empty repo does not error out' ' + rm -fr empty && + git init empty && + ( + cd empty && + git add -A . && + git add -A + ) +' + +test_expect_success '"git add ." in empty repo' ' + rm -fr empty && + git init empty && + ( + cd empty && + git add . + ) +' + test_expect_success 'git add --dry-run of existing changed file' " echo new >>track-this && git add --dry-run track-this >actual 2>&1 && diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index 9dc91d09d7..24ddd8a704 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -2,7 +2,6 @@ test_description='add -i basic tests' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh if ! test_have_prereq PERL then diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index debda7a678..5b79b216e2 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -673,4 +673,16 @@ test_expect_success 'store updates stash ref and reflog' ' grep quux bazzy ' +test_expect_success 'handle stash specification with spaces' ' + git stash clear && + echo pig >file && + git stash && + stamp=$(git log -g --format="%cd" -1 refs/stash) && + test_tick && + echo cow >file && + git stash && + git stash apply "stash@{$stamp}" && + grep pig file +' + test_done diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh index af5134b70c..2bb973655b 100755 --- a/t/t4010-diff-pathspec.sh +++ b/t/t4010-diff-pathspec.sh @@ -110,4 +110,40 @@ test_expect_success 'diff-tree -r with wildcard' ' test_cmp expected result ' +test_expect_success 'setup submodules' ' + test_tick && + git init submod && + ( cd submod && test_commit first; ) && + git add submod && + git commit -m first && + ( cd submod && test_commit second; ) && + git add submod && + git commit -m second +' + +test_expect_success 'diff-tree ignores trailing slash on submodule path' ' + git diff --name-only HEAD^ HEAD submod >expect && + git diff --name-only HEAD^ HEAD submod/ >actual && + test_cmp expect actual +' + +test_expect_success 'diff multiple wildcard pathspecs' ' + mkdir path2 && + echo rezrov >path2/file1 && + git update-index --add path2/file1 && + tree3=`git write-tree` && + git diff --name-only $tree $tree3 -- "path2*1" "path1*1" >actual && + cat <<-\EOF >expect && + path1/file1 + path2/file1 + EOF + test_cmp expect actual +' + +test_expect_success 'diff-cache ignores trailing slash on submodule path' ' + git diff --name-only HEAD^ submod >expect && + git diff --name-only HEAD^ submod/ >actual && + test_cmp expect actual +' + test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 8f272bce84..73194b2c3d 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -293,7 +293,7 @@ check_threading () { (git format-patch --stdout "$@"; echo $? > status.out) | # Prints everything between the Message-ID and In-Reply-To, # and replaces all Message-ID-lookalikes by a sequence number - "$PERL_PATH" -ne ' + perl -ne ' if (/^(message-id|references|in-reply-to)/i) { $printing = 1; } elsif (/^\S/) { diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index 3fb4b976a2..604a838c1a 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -145,7 +145,7 @@ test_expect_success 'another test, with --ignore-space-at-eol' 'test_cmp expect test_expect_success 'ignore-blank-lines: only new lines' ' test_seq 5 >x && git update-index x && - test_seq 5 | sed "/3/i \\ + test_seq 5 | sed "/3/i\\ " >x && git diff --ignore-blank-lines >out && >expect && @@ -155,7 +155,8 @@ test_expect_success 'ignore-blank-lines: only new lines' ' test_expect_success 'ignore-blank-lines: only new lines with space' ' test_seq 5 >x && git update-index x && - test_seq 5 | sed "/3/i \ " >x && + test_seq 5 | sed "/3/i\\ + " >x && git diff -w --ignore-blank-lines >out && >expect && test_cmp out expect diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh index 2e7d73f090..044620186d 100755 --- a/t/t4020-diff-external.sh +++ b/t/t4020-diff-external.sh @@ -177,7 +177,7 @@ test_expect_success 'no diff with -diff' ' git diff | grep Binary ' -echo NULZbetweenZwords | "$PERL_PATH" -pe 'y/Z/\000/' > file +echo NULZbetweenZwords | perl -pe 'y/Z/\000/' > file test_expect_success 'force diff with "diff"' ' echo >.gitattributes "file diff" && @@ -193,6 +193,19 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' ' GIT_EXTERNAL_DIFF=echo git diff ' +test_expect_success 'GIT_EXTERNAL_DIFF path counter/total' ' + write_script external-diff.sh <<-\EOF && + echo $GIT_DIFF_PATH_COUNTER of $GIT_DIFF_PATH_TOTAL >>counter.txt + EOF + >counter.txt && + cat >expect <<-\EOF && + 1 of 2 + 2 of 2 + EOF + GIT_EXTERNAL_DIFF=./external-diff.sh git diff && + test_cmp expect counter.txt +' + test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' ' touch file.ext && git add file.ext && @@ -213,12 +226,13 @@ keep_only_cr () { } test_expect_success 'external diff with autocrlf = true' ' - git config core.autocrlf true && + test_config core.autocrlf true && GIT_EXTERNAL_DIFF=./fake-diff.sh git diff && test $(wc -l < crlfed.txt) = $(cat crlfed.txt | keep_only_cr | wc -c) ' test_expect_success 'diff --cached' ' + test_config core.autocrlf true && git add file && git update-index --assume-unchanged file && echo second >file && @@ -226,4 +240,31 @@ test_expect_success 'diff --cached' ' test_cmp "$TEST_DIRECTORY"/t4020/diff.NUL actual ' +test_expect_success 'clean up crlf leftovers' ' + git update-index --no-assume-unchanged file && + rm -f file* && + git reset --hard +' + +test_expect_success 'submodule diff' ' + git init sub && + ( cd sub && test_commit sub1 ) && + git add sub && + test_tick && + git commit -m "add submodule" && + ( cd sub && test_commit sub2 ) && + write_script gather_pre_post.sh <<-\EOF && + echo "$1 $4" # path, mode + cat "$2" # old file + cat "$5" # new file + EOF + GIT_EXTERNAL_DIFF=./gather_pre_post.sh git diff >actual && + cat >expected <<-EOF && + sub 160000 + Subproject commit $(git rev-parse HEAD:sub) + Subproject commit $(cd sub && git rev-parse HEAD) + EOF + test_cmp expected actual +' + test_done diff --git a/t/t4029-diff-trailing-space.sh b/t/t4029-diff-trailing-space.sh index 36e2f075c9..3ccc237a8d 100755 --- a/t/t4029-diff-trailing-space.sh +++ b/t/t4029-diff-trailing-space.sh @@ -27,7 +27,7 @@ test_expect_success \ git config --bool diff.suppressBlankEmpty true && git diff f > actual && test_cmp exp actual && - "$PERL_PATH" -i.bak -p -e "s/^\$/ /" exp && + perl -i.bak -p -e "s/^\$/ /" exp && git config --bool diff.suppressBlankEmpty false && git diff f > actual && test_cmp exp actual && diff --git a/t/t4034/ada/expect b/t/t4034/ada/expect index be2376e904..a682d288b2 100644 --- a/t/t4034/ada/expect +++ b/t/t4034/ada/expect @@ -4,7 +4,7 @@ <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>' +1 <RED>1e-10<RESET><GREEN>1e10<RESET> 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> diff --git a/t/t4035-diff-quiet.sh b/t/t4035-diff-quiet.sh index 231412d100..e8ae2a03fd 100755 --- a/t/t4035-diff-quiet.sh +++ b/t/t4035-diff-quiet.sh @@ -148,4 +148,10 @@ test_expect_success 'git diff --ignore-all-space, both files outside repo' ' ) ' +test_expect_success 'git diff --quiet ignores stat-change only entries' ' + test-chmtime +10 a && + echo modified >>b && + test_expect_code 1 git diff --quiet +' + test_done diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh index 979e98398b..2ab3c48734 100755 --- a/t/t4053-diff-no-index.sh +++ b/t/t4053-diff-no-index.sh @@ -29,4 +29,30 @@ test_expect_success 'git diff --no-index relative path outside repo' ' ) ' +test_expect_success 'git diff --no-index with broken index' ' + ( + cd repo && + echo broken >.git/index && + git diff --no-index a ../non/git/a + ) +' + +test_expect_success 'git diff outside repo with broken index' ' + ( + cd repo && + git diff ../non/git/a ../non/git/b + ) +' + +test_expect_success 'git diff --no-index executed outside repo gives correct error message' ' + ( + GIT_CEILING_DIRECTORIES=$TRASH_DIRECTORY/non && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_must_fail git diff --no-index a 2>actual.err && + echo "usage: git diff --no-index <path> <path>" >expect.err && + test_cmp expect.err actual.err + ) +' + test_done diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh new file mode 100755 index 0000000000..c0460bb0e5 --- /dev/null +++ b/t/t4056-diff-order.sh @@ -0,0 +1,121 @@ +#!/bin/sh + +test_description='diff order' + +. ./test-lib.sh + +create_files () { + echo "$1" >a.h && + echo "$1" >b.c && + echo "$1" >c/Makefile && + echo "$1" >d.txt && + git add a.h b.c c/Makefile d.txt && + git commit -m"$1" +} + +test_expect_success 'setup' ' + mkdir c && + create_files 1 && + create_files 2 && + + cat >order_file_1 <<-\EOF && + *Makefile + *.txt + *.h + EOF + + cat >order_file_2 <<-\EOF && + *Makefile + *.h + *.c + EOF + + cat >expect_none <<-\EOF && + a.h + b.c + c/Makefile + d.txt + EOF + + cat >expect_1 <<-\EOF && + c/Makefile + d.txt + a.h + b.c + EOF + + cat >expect_2 <<-\EOF + c/Makefile + a.h + b.c + d.txt + EOF +' + +test_expect_success "no order (=tree object order)" ' + git diff --name-only HEAD^..HEAD >actual && + test_cmp expect_none actual +' + +test_expect_success 'missing orderfile' ' + rm -f bogus_file && + test_must_fail git diff -Obogus_file --name-only HEAD^..HEAD +' + +test_expect_success POSIXPERM,SANITY 'unreadable orderfile' ' + >unreadable_file && + chmod -r unreadable_file && + test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD +' + +for i in 1 2 +do + test_expect_success "orderfile using option ($i)" ' + git diff -Oorder_file_$i --name-only HEAD^..HEAD >actual && + test_cmp expect_$i actual + ' + + test_expect_success PIPE "orderfile is fifo ($i)" ' + rm -f order_fifo && + mkfifo order_fifo && + { + cat order_file_$i >order_fifo & + } && + git diff -O order_fifo --name-only HEAD^..HEAD >actual && + wait && + test_cmp expect_$i actual + ' + + test_expect_success "orderfile using config ($i)" ' + git -c diff.orderfile=order_file_$i diff --name-only HEAD^..HEAD >actual && + test_cmp expect_$i actual + ' + + test_expect_success "cancelling configured orderfile ($i)" ' + git -c diff.orderfile=order_file_$i diff -O/dev/null --name-only HEAD^..HEAD >actual && + test_cmp expect_none actual + ' +done + +test_expect_success 'setup for testing combine-diff order' ' + git checkout -b tmp HEAD~ && + create_files 3 && + git checkout master && + git merge --no-commit -s ours tmp && + create_files 5 +' + +test_expect_success "combine-diff: no order (=tree object order)" ' + git diff --name-only HEAD HEAD^ HEAD^2 >actual && + test_cmp expect_none actual +' + +for i in 1 2 +do + test_expect_success "combine-diff: orderfile using option ($i)" ' + git diff -Oorder_file_$i --name-only HEAD HEAD^ HEAD^2 >actual && + test_cmp expect_$i actual + ' +done + +test_done diff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh new file mode 100755 index 0000000000..097e63215e --- /dev/null +++ b/t/t4057-diff-combined-paths.sh @@ -0,0 +1,106 @@ +#!/bin/sh + +test_description='combined diff show only paths that are different to all parents' + +. ./test-lib.sh + +# verify that diffc.expect matches output of +# `git diff -c --name-only HEAD HEAD^ HEAD^2` +diffc_verify () { + git diff -c --name-only HEAD HEAD^ HEAD^2 >diffc.actual && + test_cmp diffc.expect diffc.actual +} + +test_expect_success 'trivial merge - combine-diff empty' ' + for i in $(test_seq 1 9) + do + echo $i >$i.txt && + git add $i.txt + done && + git commit -m "init" && + git checkout -b side && + for i in $(test_seq 2 9) + do + echo $i/2 >>$i.txt + done && + git commit -a -m "side 2-9" && + git checkout master && + echo 1/2 >1.txt && + git commit -a -m "master 1" && + git merge side && + >diffc.expect && + diffc_verify +' + + +test_expect_success 'only one trully conflicting path' ' + git checkout side && + for i in $(test_seq 2 9) + do + echo $i/3 >>$i.txt + done && + echo "4side" >>4.txt && + git commit -a -m "side 2-9 +4" && + git checkout master && + for i in $(test_seq 1 9) + do + echo $i/3 >>$i.txt + done && + echo "4master" >>4.txt && + git commit -a -m "master 1-9 +4" && + test_must_fail git merge side && + cat <<-\EOF >4.txt && + 4 + 4/2 + 4/3 + 4master + 4side + EOF + git add 4.txt && + git commit -m "merge side (2)" && + echo 4.txt >diffc.expect && + diffc_verify +' + +test_expect_success 'merge introduces new file' ' + git checkout side && + for i in $(test_seq 5 9) + do + echo $i/4 >>$i.txt + done && + git commit -a -m "side 5-9" && + git checkout master && + for i in $(test_seq 1 3) + do + echo $i/4 >>$i.txt + done && + git commit -a -m "master 1-3 +4hello" && + git merge side && + echo "Hello World" >4hello.txt && + git add 4hello.txt && + git commit --amend && + echo 4hello.txt >diffc.expect && + diffc_verify +' + +test_expect_success 'merge removed a file' ' + git checkout side && + for i in $(test_seq 5 9) + do + echo $i/5 >>$i.txt + done && + git commit -a -m "side 5-9" && + git checkout master && + for i in $(test_seq 1 3) + do + echo $i/4 >>$i.txt + done && + git commit -a -m "master 1-3" && + git merge side && + git rm 4.txt && + git commit --amend && + echo 4.txt >diffc.expect && + diffc_verify +' + +test_done diff --git a/t/t4102-apply-rename.sh b/t/t4102-apply-rename.sh index e3ea3d5114..49e2d6c349 100755 --- a/t/t4102-apply-rename.sh +++ b/t/t4102-apply-rename.sh @@ -7,7 +7,6 @@ test_description='git apply handling copy/rename patch. ' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh # setup diff --git a/t/t4103-apply-binary.sh b/t/t4103-apply-binary.sh index b1b906b1bb..1b420e3b5f 100755 --- a/t/t4103-apply-binary.sh +++ b/t/t4103-apply-binary.sh @@ -23,10 +23,10 @@ test_expect_success 'setup' ' git commit -m "Initial Version" 2>/dev/null && git checkout -b binary && - "$PERL_PATH" -pe "y/x/\000/" <file1 >file3 && + perl -pe "y/x/\000/" <file1 >file3 && cat file3 >file4 && git add file2 && - "$PERL_PATH" -pe "y/\000/v/" <file3 >file1 && + perl -pe "y/\000/v/" <file3 >file1 && rm -f file2 && git update-index --add --remove file1 file2 file3 file4 && git commit -m "Second Version" && diff --git a/t/t4116-apply-reverse.sh b/t/t4116-apply-reverse.sh index fca815392e..1e4d4380bf 100755 --- a/t/t4116-apply-reverse.sh +++ b/t/t4116-apply-reverse.sh @@ -12,14 +12,14 @@ test_description='git apply in reverse test_expect_success setup ' for i in a b c d e f g h i j k l m n; do echo $i; done >file1 && - "$PERL_PATH" -pe "y/ijk/\\000\\001\\002/" <file1 >file2 && + perl -pe "y/ijk/\\000\\001\\002/" <file1 >file2 && git add file1 file2 && git commit -m initial && git tag initial && for i in a b c g h i J K L m o n p q; do echo $i; done >file1 && - "$PERL_PATH" -pe "y/mon/\\000\\001\\002/" <file1 >file2 && + perl -pe "y/mon/\\000\\001\\002/" <file1 >file2 && git commit -a -m second && git tag second && @@ -48,12 +48,12 @@ test_expect_success 'apply in reverse' ' test_expect_success 'setup separate repository lacking postimage' ' - git tar-tree initial initial | $TAR xf - && + git archive --format=tar --prefix=initial/ initial | $TAR xf - && ( cd initial && git init && git add . ) && - git tar-tree second second | $TAR xf - && + git archive --format=tar --prefix=second/ second | $TAR xf - && ( cd second && git init && git add . ) diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh index c5fecdfed4..497b62868d 100755 --- a/t/t4120-apply-popt.sh +++ b/t/t4120-apply-popt.sh @@ -6,7 +6,6 @@ test_description='git apply -p handling.' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh test_expect_success setup ' mkdir sub && diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh index 0d36ebdc86..c268298eaf 100755 --- a/t/t4129-apply-samemode.sh +++ b/t/t4129-apply-samemode.sh @@ -3,7 +3,6 @@ test_description='applying patch with mode bits' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh test_expect_success setup ' echo original >file && diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index 7f6666fcd3..ed9c91e25b 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -78,7 +78,7 @@ test_expect_success 'activate rerere, old style (conflicting merge)' ' test_might_fail git config --unset rerere.enabled && test_must_fail git merge first && - sha1=$("$PERL_PATH" -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && grep "^=======\$" $rr/preimage && ! test -f $rr/postimage && @@ -91,7 +91,7 @@ test_expect_success 'rerere.enabled works, too' ' git reset --hard && test_must_fail git merge first && - sha1=$("$PERL_PATH" -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && grep ^=======$ $rr/preimage ' @@ -101,7 +101,7 @@ test_expect_success 'set up rr-cache' ' git config rerere.enabled true && git reset --hard && test_must_fail git merge first && - sha1=$("$PERL_PATH" -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 ' @@ -172,7 +172,7 @@ test_expect_success 'first postimage wins' ' git show second^:a1 | sed "s/To die: t/To die! T/" >a1 && git commit -q -a -m third && - test_must_fail git pull . first && + test_must_fail git merge first && # rerere kicked in ! grep "^=======\$" a1 && test_cmp expect a1 @@ -185,7 +185,7 @@ test_expect_success 'rerere updates postimage timestamp' ' test_expect_success 'rerere clear' ' rm $rr/postimage && - echo "$sha1 a1" | "$PERL_PATH" -pe "y/\012/\000/" >.git/MERGE_RR && + echo "$sha1 a1" | perl -pe "y/\012/\000/" >.git/MERGE_RR && git rerere clear && ! test -d $rr ' diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index fb00041139..2a6278bb33 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -310,4 +310,19 @@ EOF test_cmp expected actual ' +test_expect_success 'log decoration properly follows tag chain' ' + git tag -a tag1 -m tag1 && + git tag -a tag2 -m tag2 tag1 && + git tag -d tag1 && + git commit --amend -m shorter && + git log --no-walk --tags --pretty="%H %d" --decorate=full >actual && + cat <<EOF >expected && +6a908c10688b2503073c39c9ba26322c73902bb5 (tag: refs/tags/tag2) +9f716384d92283fb915a4eee5073f030638e05f9 (tag: refs/tags/message-one) +b87e4cccdb77336ea79d89224737be7ea8e95367 (tag: refs/tags/message-two) +EOF + sort actual >actual1 && + test_cmp expected actual1 +' + test_done diff --git a/t/t4208-log-magic-pathspec.sh b/t/t4208-log-magic-pathspec.sh index 72300b5f24..d8f23f488e 100755 --- a/t/t4208-log-magic-pathspec.sh +++ b/t/t4208-log-magic-pathspec.sh @@ -46,4 +46,19 @@ test_expect_success 'git log HEAD -- :/' ' test_cmp expected actual ' +test_expect_success 'command line pathspec parsing for "git log"' ' + git reset --hard && + >a && + git add a && + git commit -m "add an empty a" --allow-empty && + echo 1 >a && + git commit -a -m "update a to 1" && + git checkout HEAD^ && + echo 2 >a && + git commit -a -m "update a to 2" && + test_must_fail git merge master && + git add a && + git log --merge -- a +' + test_done diff --git a/t/t4212-log-corrupt.sh b/t/t4212-log-corrupt.sh index ec5099b83d..3fa171541a 100755 --- a/t/t4212-log-corrupt.sh +++ b/t/t4212-log-corrupt.sh @@ -13,11 +13,16 @@ test_expect_success 'setup' ' git update-ref refs/heads/broken_email $(cat broken_email.hash) ' +test_expect_success 'fsck notices broken commit' ' + git fsck 2>actual && + test_i18ngrep invalid.author actual +' + test_expect_success 'git log with broken author email' ' { echo commit $(cat broken_email.hash) echo "Author: A U Thor <author@example.com>" - echo "Date: Thu Jan 1 00:00:00 1970 +0000" + echo "Date: Thu Apr 7 15:13:13 2005 -0700" echo echo " foo" } >expect.out && @@ -30,7 +35,7 @@ test_expect_success 'git log with broken author email' ' ' test_expect_success 'git log --format with broken author email' ' - echo "A U Thor+author@example.com+" >expect.out && + echo "A U Thor+author@example.com+Thu Apr 7 15:13:13 2005 -0700" >expect.out && : >expect.err && git log --format="%an+%ae+%ad" broken_email >actual.out 2>actual.err && @@ -39,4 +44,49 @@ test_expect_success 'git log --format with broken author email' ' test_cmp expect.err actual.err ' +munge_author_date () { + git cat-file commit "$1" >commit.orig && + sed "s/^\(author .*>\) [0-9]*/\1 $2/" <commit.orig >commit.munge && + git hash-object -w -t commit commit.munge +} + +test_expect_success 'unparsable dates produce sentinel value' ' + commit=$(munge_author_date HEAD totally_bogus) && + echo "Date: Thu Jan 1 00:00:00 1970 +0000" >expect && + git log -1 $commit >actual.full && + grep Date <actual.full >actual && + test_cmp expect actual +' + +test_expect_success 'unparsable dates produce sentinel value (%ad)' ' + commit=$(munge_author_date HEAD totally_bogus) && + echo >expect && + git log -1 --format=%ad $commit >actual + test_cmp expect actual +' + +# date is 2^64 + 1 +test_expect_success 'date parser recognizes integer overflow' ' + commit=$(munge_author_date HEAD 18446744073709551617) && + echo "Thu Jan 1 00:00:00 1970 +0000" >expect && + git log -1 --format=%ad $commit >actual && + test_cmp expect actual +' + +# date is 2^64 - 2 +test_expect_success 'date parser recognizes time_t overflow' ' + commit=$(munge_author_date HEAD 18446744073709551614) && + echo "Thu Jan 1 00:00:00 1970 +0000" >expect && + git log -1 --format=%ad $commit >actual && + test_cmp expect actual +' + +# date is within 2^63-1, but enough to choke glibc's gmtime +test_expect_success 'absurdly far-in-future dates produce sentinel' ' + commit=$(munge_author_date HEAD 999999999999999999) && + echo "Thu Jan 1 00:00:00 1970 +0000" >expect && + git log -1 --format=%ad $commit >actual && + test_cmp expect actual +' + test_done diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index c2023b1a3d..1cf0a4e103 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -3,7 +3,7 @@ # Copyright (C) 2005 Rene Scharfe # -test_description='git tar-tree and git get-tar-commit-id test +test_description='git archive and git get-tar-commit-id test This test covers the topics of file contents, commit date handling and commit id embedding: @@ -13,11 +13,11 @@ commit id embedding: binary file (/bin/sh). Only paths shorter than 99 characters are used. - git tar-tree applies the commit date to every file in the archive it + git archive applies the commit date to every file in the archive it creates. The test sets the commit date to a specific value and checks if the tar archive contains that value. - When giving git tar-tree a commit id (in contrast to a tree id) it + When giving git archive a commit id (in contrast to a tree id) it embeds this commit id into the tar archive as a comment. The test checks the ability of git get-tar-commit-id to figure it out from the tar file. @@ -25,8 +25,6 @@ commit id embedding: ' . ./test-lib.sh -GZIP=${GZIP:-gzip} -GUNZIP=${GUNZIP:-gzip -d} SUBSTFORMAT=%H%n @@ -39,6 +37,8 @@ test_lazy_prereq TAR_NEEDS_PAX_FALLBACK ' ) ' +test_lazy_prereq GZIP 'gzip --version' + get_pax_header() { file=$1 header=$2= @@ -196,16 +196,6 @@ test_expect_success \ 'git get-tar-commit-id <b.tar >b.commitid && test_cmp .git/$(git symbolic-ref HEAD) b.commitid' -test_expect_success 'git tar-tree' ' - git tar-tree HEAD >tar-tree.tar && - test_cmp b.tar tar-tree.tar -' - -test_expect_success 'git tar-tree with prefix' ' - git tar-tree HEAD prefix >tar-tree_with_prefix.tar && - test_cmp with_prefix.tar tar-tree_with_prefix.tar -' - test_expect_success 'git archive with --output, override inferred format' ' git archive --format=tar --output=d4.zip HEAD && test_cmp b.tar d4.zip @@ -223,6 +213,15 @@ test_expect_success 'clients cannot access unreachable commits' ' test_must_fail git archive --remote=. $sha1 >remote.tar ' +test_expect_success 'upload-archive can allow unreachable commits' ' + test_commit unreachable1 && + sha1=`git rev-parse HEAD` && + git reset --hard HEAD^ && + git archive $sha1 >remote.tar && + test_config uploadarchive.allowUnreachable true && + git archive --remote=. $sha1 >remote.tar +' + test_expect_success 'setup tar filters' ' git config tar.tar.foo.command "tr ab ba" && git config tar.bar.command "tr ab ba" && @@ -275,12 +274,6 @@ test_expect_success 'only enabled filters are available remotely' ' test_cmp remote.bar config.bar ' -if $GZIP --version >/dev/null 2>&1; then - test_set_prereq GZIP -else - say "Skipping some tar.gz tests because gzip not found" -fi - test_expect_success GZIP 'git archive --format=tgz' ' git archive --format=tgz HEAD >j.tgz ' @@ -300,14 +293,8 @@ test_expect_success GZIP 'infer tgz from .tar.gz filename' ' test_cmp j.tgz j3.tar.gz ' -if $GUNZIP --version >/dev/null 2>&1; then - test_set_prereq GUNZIP -else - say "Skipping some tar.gz tests because gunzip was not found" -fi - -test_expect_success GZIP,GUNZIP 'extract tgz file' ' - $GUNZIP -c <j.tgz >j.tar && +test_expect_success GZIP 'extract tgz file' ' + gzip -d -c <j.tgz >j.tar && test_cmp b.tar j.tar ' diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh index f47d8717fd..51dedab29b 100755 --- a/t/t5001-archive-attr.sh +++ b/t/t5001-archive-attr.sh @@ -87,14 +87,4 @@ test_expect_success 'export-subst' ' test_cmp substfile2 archive/substfile2 ' -test_expect_success 'git tar-tree vs. git archive with worktree attributes' ' - git tar-tree HEAD >tar-tree.tar && - test_cmp worktree.tar tar-tree.tar -' - -test_expect_success 'git tar-tree vs. git archive with worktree attrs, bare' ' - (cd bare && git tar-tree HEAD) >bare-tar-tree.tar && - test_cmp bare-worktree.tar bare-tar-tree.tar -' - test_done diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index a07c871797..20c1961515 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -13,9 +13,9 @@ TRASH=`pwd` test_expect_success \ 'setup' \ 'rm -f .git/index* && - "$PERL_PATH" -e "print \"a\" x 4096;" > a && - "$PERL_PATH" -e "print \"b\" x 4096;" > b && - "$PERL_PATH" -e "print \"c\" x 4096;" > c && + perl -e "print \"a\" x 4096;" > a && + perl -e "print \"b\" x 4096;" > b && + perl -e "print \"c\" x 4096;" > c && test-genrandom "seed a" 2097152 > a_big && test-genrandom "seed b" 2097152 > b_big && git update-index --add a a_big b b_big c && @@ -129,7 +129,7 @@ test_expect_success \ cd "$TRASH" test_expect_success 'compare delta flavors' ' - "$PERL_PATH" -e '\'' + perl -e '\'' defined($_ = -s $_) or die for @ARGV; exit 1 if $ARGV[0] <= $ARGV[1]; '\'' test-2-$packname_2.pack test-3-$packname_3.pack @@ -151,7 +151,7 @@ test_expect_success \ git cat-file $t $object || return 1 done <obj-list } >current && - test_cmp expect current' + cmp expect current' test_expect_success \ 'use packed deltified (REF_DELTA) objects' \ @@ -166,7 +166,7 @@ test_expect_success \ git cat-file $t $object || return 1 done <obj-list } >current && - test_cmp expect current' + cmp expect current' test_expect_success \ 'use packed deltified (OFS_DELTA) objects' \ @@ -181,7 +181,7 @@ test_expect_success \ git cat-file $t $object || return 1 done <obj-list } >current && - test_cmp expect current' + cmp expect current' unset GIT_OBJECT_DIRECTORY @@ -195,9 +195,9 @@ test_expect_success 'survive missing objects/pack directory' ' rm -fr $GOP && git index-pack --stdin --keep=test <../test-3-${packname_3}.pack && test -f $GOP/pack-${packname_3}.pack && - test_cmp $GOP/pack-${packname_3}.pack ../test-3-${packname_3}.pack && + cmp $GOP/pack-${packname_3}.pack ../test-3-${packname_3}.pack && test -f $GOP/pack-${packname_3}.idx && - test_cmp $GOP/pack-${packname_3}.idx ../test-3-${packname_3}.idx && + cmp $GOP/pack-${packname_3}.idx ../test-3-${packname_3}.idx && test -f $GOP/pack-${packname_3}.keep ) ' diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh index fe82025d4a..4bbb718751 100755 --- a/t/t5302-pack-index.sh +++ b/t/t5302-pack-index.sh @@ -174,11 +174,11 @@ test_expect_success \ test_expect_success \ '[index v1] 5) pack-objects happily reuses corrupted data' \ 'pack4=$(git pack-objects test-4 <obj-list) && - test -f "test-4-${pack1}.pack"' + test -f "test-4-${pack4}.pack"' test_expect_success \ '[index v1] 6) newly created pack is BAD !' \ - 'test_must_fail git verify-pack -v "test-4-${pack1}.pack"' + 'test_must_fail git verify-pack -v "test-4-${pack4}.pack"' test_expect_success \ '[index v2] 1) stream pack to repository' \ diff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh index 35926debe3..663b02bbb1 100755 --- a/t/t5303-pack-corruption-resilience.sh +++ b/t/t5303-pack-corruption-resilience.sh @@ -98,7 +98,7 @@ test_expect_success \ 'create_new_pack && git prune-packed && chmod +w ${pack}.pack && - "$PERL_PATH" -i.bak -pe "s/ base /abcdef/" ${pack}.pack && + perl -i.bak -pe "s/ base /abcdef/" ${pack}.pack && test_must_fail git cat-file blob $blob_1 > /dev/null && test_must_fail git cat-file blob $blob_2 > /dev/null && test_must_fail git cat-file blob $blob_3 > /dev/null' @@ -155,7 +155,7 @@ test_expect_success \ 'create_new_pack && git prune-packed && chmod +w ${pack}.pack && - "$PERL_PATH" -i.bak -pe "s/ delta1 /abcdefgh/" ${pack}.pack && + perl -i.bak -pe "s/ delta1 /abcdefgh/" ${pack}.pack && git cat-file blob $blob_1 > /dev/null && test_must_fail git cat-file blob $blob_2 > /dev/null && test_must_fail git cat-file blob $blob_3 > /dev/null' diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index e4bb3a1457..66c9a41739 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -221,4 +221,14 @@ EOF test_cmp expected actual ' +test_expect_success 'prune .git/shallow' ' + SHA1=`echo hi|git commit-tree HEAD^{tree}` && + echo $SHA1 >.git/shallow && + git prune --dry-run >out && + grep $SHA1 .git/shallow && + grep $SHA1 out && + git prune && + ! test -f .git/shallow +' + test_done diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh new file mode 100755 index 0000000000..d3a3afaba8 --- /dev/null +++ b/t/t5310-pack-bitmaps.sh @@ -0,0 +1,139 @@ +#!/bin/sh + +test_description='exercise basic bitmap functionality' +. ./test-lib.sh + +test_expect_success 'setup repo with moderate-sized history' ' + for i in $(test_seq 1 10); do + test_commit $i + done && + git checkout -b other HEAD~5 && + for i in $(test_seq 1 10); do + test_commit side-$i + done && + git checkout master && + blob=$(echo tagged-blob | git hash-object -w --stdin) && + git tag tagged-blob $blob && + git config pack.writebitmaps true && + git config pack.writebitmaphashcache true +' + +test_expect_success 'full repack creates bitmaps' ' + git repack -ad && + ls .git/objects/pack/ | grep bitmap >output && + test_line_count = 1 output +' + +test_expect_success 'rev-list --test-bitmap verifies bitmaps' ' + git rev-list --test-bitmap HEAD +' + +rev_list_tests() { + state=$1 + + test_expect_success "counting commits via bitmap ($state)" ' + git rev-list --count HEAD >expect && + git rev-list --use-bitmap-index --count HEAD >actual && + test_cmp expect actual + ' + + test_expect_success "counting partial commits via bitmap ($state)" ' + git rev-list --count HEAD~5..HEAD >expect && + git rev-list --use-bitmap-index --count HEAD~5..HEAD >actual && + test_cmp expect actual + ' + + test_expect_success "counting non-linear history ($state)" ' + git rev-list --count other...master >expect && + git rev-list --use-bitmap-index --count other...master >actual && + test_cmp expect actual + ' + + test_expect_success "enumerate --objects ($state)" ' + git rev-list --objects --use-bitmap-index HEAD >tmp && + cut -d" " -f1 <tmp >tmp2 && + sort <tmp2 >actual && + git rev-list --objects HEAD >tmp && + cut -d" " -f1 <tmp >tmp2 && + sort <tmp2 >expect && + test_cmp expect actual + ' + + test_expect_success "bitmap --objects handles non-commit objects ($state)" ' + git rev-list --objects --use-bitmap-index HEAD tagged-blob >actual && + grep $blob actual + ' +} + +rev_list_tests 'full bitmap' + +test_expect_success 'clone from bitmapped repository' ' + git clone --no-local --bare . clone.git && + git rev-parse HEAD >expect && + git --git-dir=clone.git rev-parse HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'setup further non-bitmapped commits' ' + for i in $(test_seq 1 10); do + test_commit further-$i + done +' + +rev_list_tests 'partial bitmap' + +test_expect_success 'fetch (partial bitmap)' ' + git --git-dir=clone.git fetch origin master:master && + git rev-parse HEAD >expect && + git --git-dir=clone.git rev-parse HEAD >actual && + test_cmp expect actual +' + +test_expect_success 'incremental repack cannot create bitmaps' ' + test_commit more-1 && + test_must_fail git repack -d +' + +test_expect_success 'incremental repack can disable bitmaps' ' + test_commit more-2 && + git repack -d --no-write-bitmap-index +' + +test_expect_success 'full repack, reusing previous bitmaps' ' + git repack -ad && + ls .git/objects/pack/ | grep bitmap >output && + test_line_count = 1 output +' + +test_expect_success 'fetch (full bitmap)' ' + git --git-dir=clone.git fetch origin master:master && + git rev-parse HEAD >expect && + git --git-dir=clone.git rev-parse HEAD >actual && + test_cmp expect actual +' + +test_lazy_prereq JGIT ' + type jgit +' + +test_expect_success JGIT 'we can read jgit bitmaps' ' + git clone . compat-jgit && + ( + cd compat-jgit && + rm -f .git/objects/pack/*.bitmap && + jgit gc && + git rev-list --test-bitmap HEAD + ) +' + +test_expect_success JGIT 'jgit can read our bitmaps' ' + git clone . compat-us && + ( + cd compat-us && + git repack -adb && + # jgit gc will barf if it does not like our bitmaps + jgit gc + ) +' + +test_done diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index 129fc88bd2..0736bcbcd5 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -164,6 +164,7 @@ test_expect_success 'receive-pack runs auto-gc in remote repo' ' # Set the child to auto-pack if more than one pack exists cd child && git config gc.autopacklimit 1 && + git config gc.autodetach false && git branch test_auto_gc && # And create a file that follows the temporary object naming # convention for the auto-gc to remove diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index d87ddf73b7..5b2b1c2c13 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -531,5 +531,92 @@ test_expect_success 'shallow fetch with tags does not break the repository' ' git fsck ) ' +check_prot_path () { + cat >expected <<-EOF && + Diag: url=$1 + Diag: protocol=$2 + Diag: path=$3 + EOF + git fetch-pack --diag-url "$1" | grep -v hostandport= >actual && + test_cmp expected actual +} + +check_prot_host_path () { + cat >expected <<-EOF && + Diag: url=$1 + Diag: protocol=$2 + Diag: hostandport=$3 + Diag: path=$4 + EOF + git fetch-pack --diag-url "$1" >actual && + test_cmp expected actual +} + +for r in repo re:po re/po +do + # git or ssh with scheme + for p in "ssh+git" "git+ssh" git ssh + do + for h in host host:12 [::1] [::1]:23 + do + case "$p" in + *ssh*) + pp=ssh + ;; + *) + pp=$p + ;; + esac + test_expect_success "fetch-pack --diag-url $p://$h/$r" ' + check_prot_host_path $p://$h/$r $pp "$h" "/$r" + ' + # "/~" -> "~" conversion + test_expect_success "fetch-pack --diag-url $p://$h/~$r" ' + check_prot_host_path $p://$h/~$r $pp "$h" "~$r" + ' + done + done + # file with scheme + for p in file + do + test_expect_success "fetch-pack --diag-url $p://$h/$r" ' + check_prot_path $p://$h/$r $p "/$r" + ' + # No "/~" -> "~" conversion for file + test_expect_success "fetch-pack --diag-url $p://$h/~$r" ' + check_prot_path $p://$h/~$r $p "/~$r" + ' + done + # file without scheme + for h in nohost nohost:12 [::1] [::1]:23 [ [:aa + do + test_expect_success "fetch-pack --diag-url ./$h:$r" ' + check_prot_path ./$h:$r $p "./$h:$r" + ' + # No "/~" -> "~" conversion for file + test_expect_success "fetch-pack --diag-url ./$p:$h/~$r" ' + check_prot_path ./$p:$h/~$r $p "./$p:$h/~$r" + ' + done + #ssh without scheme + p=ssh + for h in host [::1] + do + test_expect_success "fetch-pack --diag-url $h:$r" ' + check_prot_path $h:$r $p "$r" + ' + # Do "/~" -> "~" conversion + test_expect_success "fetch-pack --diag-url $h:/~$r" ' + check_prot_host_path $h:/~$r $p "$h" "~$r" + ' + done +done + +test_expect_success MINGW 'fetch-pack --diag-url file://c:/repo' ' + check_prot_path file://c:/repo file c:/repo +' +test_expect_success MINGW 'fetch-pack --diag-url c:repo' ' + check_prot_path c:repo file c:repo +' test_done diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 8f6e3922dc..ac79dd915d 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -160,9 +160,7 @@ cat >test/expect <<EOF * remote two Fetch URL: ../two Push URL: ../three - HEAD branch (remote HEAD is ambiguous, may be one of the following): - another - master + HEAD branch: master Local refs configured for 'git push': ahead forces to master (fast-forwardable) master pushes to another (up to date) @@ -262,16 +260,12 @@ test_expect_success 'set-head --auto' ' ) ' -cat >test/expect <<\EOF -error: Multiple remote HEAD branches. Please choose one explicitly with: - git remote set-head two another - git remote set-head two master -EOF - -test_expect_success 'set-head --auto fails w/multiple HEADs' ' +test_expect_success 'set-head --auto has no problem w/multiple HEADs' ' ( cd test && - test_must_fail git remote set-head --auto two >output 2>&1 && + git fetch two "refs/heads/*:refs/remotes/two/*" && + git remote set-head --auto two >output 2>&1 && + echo "two/HEAD set to master" >expect && test_i18ncmp expect output ) ' diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 1f0f8e6827..ab28594c62 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -88,7 +88,7 @@ test_expect_success 'fetch --prune on its own works as expected' ' cd "$D" && git clone . prune && cd prune && - git fetch origin refs/heads/master:refs/remotes/origin/extrabranch && + git update-ref refs/remotes/origin/extrabranch master && git fetch --prune origin && test_must_fail git rev-parse origin/extrabranch @@ -98,7 +98,7 @@ test_expect_success 'fetch --prune with a branch name keeps branches' ' cd "$D" && git clone . prune-branch && cd prune-branch && - git fetch origin refs/heads/master:refs/remotes/origin/extrabranch && + git update-ref refs/remotes/origin/extrabranch master && git fetch --prune origin master && git rev-parse origin/extrabranch @@ -113,25 +113,45 @@ test_expect_success 'fetch --prune with a namespace keeps other namespaces' ' git rev-parse origin/master ' -test_expect_success 'fetch --prune --tags does not delete the remote-tracking branches' ' +test_expect_success 'fetch --prune --tags prunes branches but not tags' ' cd "$D" && git clone . prune-tags && cd prune-tags && - git fetch origin refs/heads/master:refs/tags/sometag && + git tag sometag master && + # Create what looks like a remote-tracking branch from an earlier + # fetch that has since been deleted from the remote: + git update-ref refs/remotes/origin/fake-remote master && git fetch --prune --tags origin && git rev-parse origin/master && - test_must_fail git rev-parse somebranch + test_must_fail git rev-parse origin/fake-remote && + git rev-parse sometag ' -test_expect_success 'fetch --prune --tags with branch does not delete other remote-tracking branches' ' +test_expect_success 'fetch --prune --tags with branch does not prune other things' ' cd "$D" && git clone . prune-tags-branch && cd prune-tags-branch && - git fetch origin refs/heads/master:refs/remotes/origin/extrabranch && + git tag sometag master && + git update-ref refs/remotes/origin/extrabranch master && git fetch --prune --tags origin master && - git rev-parse origin/extrabranch + git rev-parse origin/extrabranch && + git rev-parse sometag +' + +test_expect_success 'fetch --prune --tags with refspec prunes based on refspec' ' + cd "$D" && + git clone . prune-tags-refspec && + cd prune-tags-refspec && + git tag sometag master && + git update-ref refs/remotes/origin/foo/otherbranch master && + git update-ref refs/remotes/origin/extrabranch master && + + git fetch --prune --tags origin refs/heads/foo/*:refs/remotes/origin/foo/* && + test_must_fail git rev-parse refs/remotes/origin/foo/otherbranch && + git rev-parse origin/extrabranch && + git rev-parse sometag ' test_expect_success 'fetch tags when there is no tags' ' @@ -594,4 +614,41 @@ test_expect_success 'all boundary commits are excluded' ' test_bundle_object_count .git/objects/pack/pack-${pack##pack }.pack 3 ' +test_expect_success 'fetch --prune prints the remotes url' ' + git branch goodbye && + git clone . only-prunes && + git branch -D goodbye && + ( + cd only-prunes && + git fetch --prune origin 2>&1 | head -n1 >../actual + ) && + echo "From ${D}/." >expect && + test_cmp expect actual +' + +test_expect_success 'branchname D/F conflict resolved by --prune' ' + git branch dir/file && + git clone . prune-df-conflict && + git branch -D dir/file && + git branch dir && + ( + cd prune-df-conflict && + git fetch --prune && + git rev-parse origin/dir >../actual + ) && + git rev-parse dir >expect && + test_cmp expect actual +' + +test_expect_success 'fetching a one-level ref works' ' + test_commit extra && + git reset --hard HEAD^ && + git update-ref refs/foo extra && + git init one-level && + ( + cd one-level && + git fetch .. HEAD refs/foo + ) +' + test_done diff --git a/t/t5515/fetch.br-unconfig_--tags_.._.git b/t/t5515/fetch.br-unconfig_--tags_.._.git index 1669cc4af0..0f70f66c70 100644 --- a/t/t5515/fetch.br-unconfig_--tags_.._.git +++ b/t/t5515/fetch.br-unconfig_--tags_.._.git @@ -1,4 +1,5 @@ # br-unconfig --tags ../.git +0567da4d5edd2ff4bb292a465ba9e64dcad9536b ../ 6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ diff --git a/t/t5515/fetch.master_--tags_.._.git b/t/t5515/fetch.master_--tags_.._.git index 8a7493537b..ab473a6e1f 100644 --- a/t/t5515/fetch.master_--tags_.._.git +++ b/t/t5515/fetch.master_--tags_.._.git @@ -1,4 +1,5 @@ # master --tags ../.git +0567da4d5edd2ff4bb292a465ba9e64dcad9536b ../ 6c9dec2b923228c9ff994c6cfe4ae16c12408dc5 not-for-merge tag 'tag-master' of ../ 8e32a6d901327a23ef831511badce7bf3bf46689 not-for-merge tag 'tag-one' of ../ 22feea448b023a2d864ef94b013735af34d238ba not-for-merge tag 'tag-one-tree' of ../ diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 99c32d7539..67e0ab3462 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -536,6 +536,19 @@ test_expect_success 'push with config branch.*.pushremote' ' check_push_result down_repo $the_commit heads/master ' +test_expect_success 'branch.*.pushremote config order is irrelevant' ' + mk_test one_repo heads/master && + mk_test two_repo heads/master && + test_config remote.one.url one_repo && + test_config remote.two.url two_repo && + test_config branch.master.pushremote two_repo && + test_config remote.pushdefault one_repo && + test_config push.default matching && + git push && + check_push_result one_repo $the_first_commit heads/master && + check_push_result two_repo $the_commit heads/master +' + test_expect_success 'push with dry-run' ' mk_test testrepo heads/master && @@ -1126,6 +1139,81 @@ test_expect_success 'fetch follows tags by default' ' test_cmp expect actual ' +test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' ' + mk_test testrepo heads/master && + rm -fr src dst && + git init src && + git init --bare dst && + ( + cd src && + git pull ../testrepo master && + git branch next && + git config remote.dst.url ../dst && + git config remote.dst.push "+refs/heads/*:refs/remotes/src/*" && + git push dst master && + git show-ref refs/heads/master | + sed -e "s|refs/heads/|refs/remotes/src/|" >../dst/expect + ) && + ( + cd dst && + test_must_fail git show-ref refs/heads/next && + test_must_fail git show-ref refs/heads/master && + git show-ref refs/remotes/src/master >actual + ) && + test_cmp dst/expect dst/actual +' + +test_expect_success 'with no remote.$name.push, it is not used as refmap' ' + mk_test testrepo heads/master && + rm -fr src dst && + git init src && + git init --bare dst && + ( + cd src && + git pull ../testrepo master && + git branch next && + git config remote.dst.url ../dst && + git config push.default matching && + git push dst master && + git show-ref refs/heads/master >../dst/expect + ) && + ( + cd dst && + test_must_fail git show-ref refs/heads/next && + git show-ref refs/heads/master >actual + ) && + test_cmp dst/expect dst/actual +' + +test_expect_success 'with no remote.$name.push, upstream mapping is used' ' + mk_test testrepo heads/master && + rm -fr src dst && + git init src && + git init --bare dst && + ( + cd src && + git pull ../testrepo master && + git branch next && + git config remote.dst.url ../dst && + git config remote.dst.fetch "+refs/heads/*:refs/remotes/dst/*" && + git config push.default upstream && + + git config branch.master.merge refs/heads/trunk && + git config branch.master.remote dst && + + git push dst master && + git show-ref refs/heads/master | + sed -e "s|refs/heads/master|refs/heads/trunk|" >../dst/expect + ) && + ( + cd dst && + test_must_fail git show-ref refs/heads/master && + test_must_fail git show-ref refs/heads/next && + git show-ref refs/heads/trunk >actual + ) && + test_cmp dst/expect dst/actual +' + test_expect_success 'push does not follow tags by default' ' mk_test testrepo heads/master && rm -fr src dst && diff --git a/t/t5525-fetch-tagopt.sh b/t/t5525-fetch-tagopt.sh index 4fbf7a120f..45815f7378 100755 --- a/t/t5525-fetch-tagopt.sh +++ b/t/t5525-fetch-tagopt.sh @@ -8,7 +8,8 @@ setup_clone () { git clone --mirror . $1 && git remote add remote_$1 $1 && (cd $1 && - git tag tag_$1) + git tag tag_$1 && + git branch branch_$1) } test_expect_success setup ' @@ -21,21 +22,33 @@ test_expect_success setup ' test_expect_success "fetch with tagopt=--no-tags does not get tag" ' git fetch remote_one && - test_must_fail git show-ref tag_one + test_must_fail git show-ref tag_one && + git show-ref remote_one/branch_one ' test_expect_success "fetch --tags with tagopt=--no-tags gets tag" ' + ( + cd one && + git branch second_branch_one + ) && git fetch --tags remote_one && - git show-ref tag_one + git show-ref tag_one && + git show-ref remote_one/second_branch_one ' test_expect_success "fetch --no-tags with tagopt=--tags does not get tag" ' git fetch --no-tags remote_two && - test_must_fail git show-ref tag_two + test_must_fail git show-ref tag_two && + git show-ref remote_two/branch_two ' test_expect_success "fetch with tagopt=--tags gets tag" ' + ( + cd two && + git branch second_branch_two + ) && git fetch remote_two && - git show-ref tag_two + git show-ref tag_two && + git show-ref remote_two/second_branch_two ' test_done diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index 8c16e045a0..445bb5fe26 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -12,6 +12,7 @@ test_expect_success setup ' ( cd work && git init && + git config push.default matching && mkdir -p gar/bage && ( cd gar/bage && diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh new file mode 100755 index 0000000000..6c5d3a4ce0 --- /dev/null +++ b/t/t5536-fetch-conflicts.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +test_description='fetch handles conflicting refspecs correctly' + +. ./test-lib.sh + +D=$(pwd) + +setup_repository () { + git init "$1" && ( + cd "$1" && + git config remote.origin.url "$D" && + shift && + for refspec in "$@" + do + git config --add remote.origin.fetch "$refspec" + done + ) +} + +verify_stderr () { + cat >expected && + # We're not interested in the error + # "fatal: The remote end hung up unexpectedly": + grep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort && + test_cmp expected actual +} + +test_expect_success 'setup' ' + git commit --allow-empty -m "Initial" && + git branch branch1 && + git tag tag1 && + git commit --allow-empty -m "First" && + git branch branch2 && + git tag tag2 +' + +test_expect_success 'fetch with no conflict' ' + setup_repository ok "+refs/heads/*:refs/remotes/origin/*" && ( + cd ok && + git fetch origin + ) +' + +test_expect_success 'fetch conflict: config vs. config' ' + setup_repository ccc \ + "+refs/heads/branch1:refs/remotes/origin/branch1" \ + "+refs/heads/branch2:refs/remotes/origin/branch1" && ( + cd ccc && + test_must_fail git fetch origin 2>error && + verify_stderr <<-\EOF + fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 + EOF + ) +' + +test_expect_success 'fetch duplicate: config vs. config' ' + setup_repository dcc \ + "+refs/heads/*:refs/remotes/origin/*" \ + "+refs/heads/branch1:refs/remotes/origin/branch1" && ( + cd dcc && + git fetch origin + ) +' + +test_expect_success 'fetch conflict: arg overrides config' ' + setup_repository aoc \ + "+refs/heads/*:refs/remotes/origin/*" && ( + cd aoc && + git fetch origin refs/heads/branch2:refs/remotes/origin/branch1 + ) +' + +test_expect_success 'fetch conflict: arg vs. arg' ' + setup_repository caa && ( + cd caa && + test_must_fail git fetch origin \ + refs/heads/*:refs/remotes/origin/* \ + refs/heads/branch2:refs/remotes/origin/branch1 2>error && + verify_stderr <<-\EOF + fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 + EOF + ) +' + +test_expect_success 'fetch conflict: criss-cross args' ' + setup_repository xaa \ + "+refs/heads/*:refs/remotes/origin/*" && ( + cd xaa && + git fetch origin \ + refs/heads/branch1:refs/remotes/origin/branch2 \ + refs/heads/branch2:refs/remotes/origin/branch1 2>error && + verify_stderr <<-\EOF + warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2 + warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1 + EOF + ) +' + +test_done diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh new file mode 100755 index 0000000000..3ae9092f5c --- /dev/null +++ b/t/t5537-fetch-shallow.sh @@ -0,0 +1,176 @@ +#!/bin/sh + +test_description='fetch/clone from a shallow clone' + +. ./test-lib.sh + +commit() { + echo "$1" >tracked && + git add tracked && + git commit -m "$1" +} + +test_expect_success 'setup' ' + commit 1 && + commit 2 && + commit 3 && + commit 4 && + git config --global transfer.fsckObjects true +' + +test_expect_success 'setup shallow clone' ' + git clone --no-local --depth=2 .git shallow && + git --git-dir=shallow/.git log --format=%s >actual && + cat <<EOF >expect && +4 +3 +EOF + test_cmp expect actual +' + +test_expect_success 'clone from shallow clone' ' + git clone --no-local shallow shallow2 && + ( + cd shallow2 && + git fsck && + git log --format=%s >actual && + cat <<EOF >expect && +4 +3 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'fetch from shallow clone' ' + ( + cd shallow && + commit 5 + ) && + ( + cd shallow2 && + git fetch && + git fsck && + git log --format=%s origin/master >actual && + cat <<EOF >expect && +5 +4 +3 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'fetch --depth from shallow clone' ' + ( + cd shallow && + commit 6 + ) && + ( + cd shallow2 && + git fetch --depth=2 && + git fsck && + git log --format=%s origin/master >actual && + cat <<EOF >expect && +6 +5 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'fetch --unshallow from shallow clone' ' + ( + cd shallow2 && + git fetch --unshallow && + git fsck && + git log --format=%s origin/master >actual && + cat <<EOF >expect && +6 +5 +4 +3 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'fetch something upstream has but hidden by clients shallow boundaries' ' + # the blob "1" is available in .git but hidden by the + # shallow2/.git/shallow and it should be resent + ! git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` >/dev/null && + echo 1 >1.t && + git add 1.t && + git commit -m add-1-back && + ( + cd shallow2 && + git fetch ../.git +refs/heads/master:refs/remotes/top/master && + git fsck && + git log --format=%s top/master >actual && + cat <<EOF >expect && +add-1-back +4 +3 +EOF + test_cmp expect actual + ) && + git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` >/dev/null + +' + +test_expect_success 'fetch that requires changes in .git/shallow is filtered' ' + ( + cd shallow && + git checkout --orphan no-shallow && + commit no-shallow + ) && + git init notshallow && + ( + cd notshallow && + git fetch ../shallow/.git refs/heads/*:refs/remotes/shallow/*&& + git for-each-ref --format="%(refname)" >actual.refs && + cat <<EOF >expect.refs && +refs/remotes/shallow/no-shallow +EOF + test_cmp expect.refs actual.refs && + git log --format=%s shallow/no-shallow >actual && + cat <<EOF >expect && +no-shallow +EOF + test_cmp expect actual + ) +' + +test_expect_success 'fetch --update-shallow' ' + ( + cd shallow && + git checkout master && + commit 7 && + git tag -m foo heavy-tag HEAD^ && + git tag light-tag HEAD^:tracked + ) && + ( + cd notshallow && + git fetch --update-shallow ../shallow/.git refs/heads/*:refs/remotes/shallow/* && + git fsck && + git for-each-ref --sort=refname --format="%(refname)" >actual.refs && + cat <<EOF >expect.refs && +refs/remotes/shallow/master +refs/remotes/shallow/no-shallow +refs/tags/heavy-tag +refs/tags/light-tag +EOF + test_cmp expect.refs actual.refs && + git log --format=%s shallow/master >actual && + cat <<EOF >expect && +7 +6 +5 +4 +3 +EOF + test_cmp expect actual + ) +' + +test_done diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh new file mode 100755 index 0000000000..8e54ac5746 --- /dev/null +++ b/t/t5538-push-shallow.sh @@ -0,0 +1,182 @@ +#!/bin/sh + +test_description='push from/to a shallow clone' + +. ./test-lib.sh + +commit() { + echo "$1" >tracked && + git add tracked && + git commit -m "$1" +} + +test_expect_success 'setup' ' + git config --global transfer.fsckObjects true && + commit 1 && + commit 2 && + commit 3 && + commit 4 && + git clone . full && + ( + git init full-abc && + cd full-abc && + commit a && + commit b && + commit c + ) && + git clone --no-local --depth=2 .git shallow && + git --git-dir=shallow/.git log --format=%s >actual && + cat <<EOF >expect && +4 +3 +EOF + test_cmp expect actual && + git clone --no-local --depth=2 full-abc/.git shallow2 && + git --git-dir=shallow2/.git log --format=%s >actual && + cat <<EOF >expect && +c +b +EOF + test_cmp expect actual +' + +test_expect_success 'push from shallow clone' ' + ( + cd shallow && + commit 5 && + git push ../.git +master:refs/remotes/shallow/master + ) && + git log --format=%s shallow/master >actual && + git fsck && + cat <<EOF >expect && +5 +4 +3 +2 +1 +EOF + test_cmp expect actual +' + +test_expect_success 'push from shallow clone, with grafted roots' ' + ( + cd shallow2 && + test_must_fail git push ../.git +master:refs/remotes/shallow2/master 2>err && + grep "shallow2/master.*shallow update not allowed" err + ) && + test_must_fail git rev-parse shallow2/master && + git fsck +' + +test_expect_success 'add new shallow root with receive.updateshallow on' ' + test_config receive.shallowupdate true && + ( + cd shallow2 && + git push ../.git +master:refs/remotes/shallow2/master + ) && + git log --format=%s shallow2/master >actual && + git fsck && + cat <<EOF >expect && +c +b +EOF + test_cmp expect actual +' + +test_expect_success 'push from shallow to shallow' ' + ( + cd shallow && + git --git-dir=../shallow2/.git config receive.shallowupdate true && + git push ../shallow2/.git +master:refs/remotes/shallow/master && + git --git-dir=../shallow2/.git config receive.shallowupdate false + ) && + ( + cd shallow2 && + git log --format=%s shallow/master >actual && + git fsck && + cat <<EOF >expect && +5 +4 +3 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'push from full to shallow' ' + ! git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` && + commit 1 && + git push shallow2/.git +master:refs/remotes/top/master && + ( + cd shallow2 && + git log --format=%s top/master >actual && + git fsck && + cat <<EOF >expect && +1 +4 +3 +EOF + test_cmp expect actual && + git cat-file blob `echo 1|git hash-object --stdin` >/dev/null + ) +' + +if test -n "$NO_CURL" -o -z "$GIT_TEST_HTTPD"; then + say 'skipping remaining tests, git built without http support' + test_done +fi + +. "$TEST_DIRECTORY"/lib-httpd.sh +start_httpd + +test_expect_success 'push to shallow repo via http' ' + git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + ( + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + git config http.receivepack true + ) && + ( + cd full && + commit 9 && + git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master + ) && + ( + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + git fsck && + git log --format=%s top/master >actual && + cat <<EOF >expect && +9 +4 +3 +EOF + test_cmp expect actual + ) +' + +test_expect_success 'push from shallow repo via http' ' + mv "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" shallow-upstream.git && + git clone --bare --no-local full "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + ( + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + git config http.receivepack true + ) && + commit 10 && + git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master && + ( + cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + git fsck && + git log --format=%s top/master >actual && + cat <<EOF >expect && +10 +1 +4 +3 +2 +1 +EOF + test_cmp expect actual + ) +' + +stop_httpd +test_done diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh new file mode 100755 index 0000000000..94553e1039 --- /dev/null +++ b/t/t5539-fetch-http-shallow.sh @@ -0,0 +1,82 @@ +#!/bin/sh + +test_description='fetch/clone from a shallow clone over http' + +. ./test-lib.sh + +if test -n "$NO_CURL"; then + skip_all='skipping test, git built without http support' + test_done +fi + +. "$TEST_DIRECTORY"/lib-httpd.sh +start_httpd + +commit() { + echo "$1" >tracked && + git add tracked && + git commit -m "$1" +} + +test_expect_success 'setup shallow clone' ' + commit 1 && + commit 2 && + commit 3 && + commit 4 && + commit 5 && + commit 6 && + commit 7 && + git clone --no-local --depth=5 .git shallow && + git config --global transfer.fsckObjects true +' + +test_expect_success 'clone http repository' ' + git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && + git clone $HTTPD_URL/smart/repo.git clone && + ( + cd clone && + git fsck && + git log --format=%s origin/master >actual && + cat <<EOF >expect && +7 +6 +5 +4 +3 +EOF + test_cmp expect actual + ) +' + +# This test is tricky. We need large enough "have"s that fetch-pack +# will put pkt-flush in between. Then we need a "have" the server +# does not have, it'll send "ACK %s ready" +test_expect_success 'no shallow lines after receiving ACK ready' ' + ( + cd shallow && + for i in $(test_seq 15) + do + git checkout --orphan unrelated$i && + test_commit unrelated$i && + git push -q "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ + refs/heads/unrelated$i:refs/heads/unrelated$i && + git push -q ../clone/.git \ + refs/heads/unrelated$i:refs/heads/unrelated$i || + exit 1 + done && + git checkout master && + test_commit new && + git push "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" master + ) && + ( + cd clone && + git checkout --orphan newnew && + test_commit new-too && + GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" git fetch --depth=2 && + grep "fetch-pack< ACK .* ready" ../trace && + ! grep "fetch-pack> done" ../trace + ) +' + +stop_httpd +test_done diff --git a/t/t5540-http-push.sh b/t/t5540-http-push-webdav.sh index 01d0d95b4d..8d7b3c57e3 100755 --- a/t/t5540-http-push.sh +++ b/t/t5540-http-push-webdav.sh @@ -16,7 +16,6 @@ then fi LIB_HTTPD_DAV=t -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5540'} . "$TEST_DIRECTORY"/lib-httpd.sh ROOT_PATH="$PWD" start_httpd @@ -154,7 +153,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 && + set_askpass user@host pass@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" \ @@ -168,7 +167,7 @@ test_expect_failure 'user was prompted only once for password' ' test_expect_failure 'push to password-protected repository (no user in URL)' ' test_commit pw-nouser && - set_askpass user@host && + set_askpass user@host pass@host && git push "$HTTPD_URL/auth/dumb/test_repo.git" HEAD && expect_askpass both user@host git rev-parse --verify HEAD >expect && diff --git a/t/t5541-http-push.sh b/t/t5541-http-push-smart.sh index 470ac54295..73af16f481 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push-smart.sh @@ -12,7 +12,6 @@ if test -n "$NO_CURL"; then fi ROOT_PATH="$PWD" -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5541'} . "$TEST_DIRECTORY"/lib-httpd.sh . "$TEST_DIRECTORY"/lib-terminal.sh start_httpd @@ -274,7 +273,7 @@ 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 && + set_askpass user@host pass@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 && @@ -286,7 +285,7 @@ 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 && + set_askpass user@host pass@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 && @@ -316,7 +315,7 @@ test_expect_success 'push into half-auth-complete requires password' ' cd "$ROOT_PATH/half-auth-clone" && echo two >expect && test_commit two && - set_askpass user@host && + set_askpass user@host pass@host && git push "$HTTPD_URL/half-auth-complete/smart/half-auth.git" && git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git" \ log -1 --format=%s >actual && diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch-dumb.sh index f7d0f146f0..1a3a2b6c1a 100755 --- a/t/t5550-http-fetch.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then test_done fi -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5550'} . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -62,13 +61,13 @@ test_expect_success 'http auth can use user/pass in URL' ' ' test_expect_success 'http auth can use just user in URL' ' - set_askpass user@host && + set_askpass wrong pass@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' ' - set_askpass user@host && + set_askpass user@host pass@host && git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both && expect_askpass both user@host ' @@ -77,7 +76,7 @@ test_expect_success 'http auth respects credential helper config' ' test_config_global credential.helper "!f() { cat >/dev/null echo username=user@host - echo password=user@host + echo password=pass@host }; f" && set_askpass wrong && git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-helper && @@ -86,14 +85,14 @@ test_expect_success 'http auth respects credential helper config' ' test_expect_success 'http auth can get username from config' ' test_config_global "credential.$HTTPD_URL.username" user@host && - set_askpass user@host && + set_askpass wrong pass@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 && - set_askpass user@host && + set_askpass wrong pass@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-smart.sh index 8196af19f6..e07eaf35f1 100755 --- a/t/t5551-http-fetch.sh +++ b/t/t5551-http-fetch-smart.sh @@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then test_done fi -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5551'} . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd @@ -113,9 +112,13 @@ test_expect_success 'follow redirects (302)' ' git clone $HTTPD_URL/smart-redir-temp/repo.git --quiet repo-t ' +test_expect_success 'redirects re-root further requests' ' + git clone $HTTPD_URL/smart-redir-limited/repo.git repo-redir-limited +' + test_expect_success 'clone from password-protected repository' ' echo two >expect && - set_askpass user@host && + set_askpass user@host pass@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 && @@ -133,7 +136,7 @@ test_expect_success 'clone from auth-only-for-push repository' ' test_expect_success 'clone from auth-only-for-objects repository' ' echo two >expect && - set_askpass user@host && + set_askpass user@host pass@host && git clone --bare "$HTTPD_URL/auth-fetch/smart/repo.git" half-auth && expect_askpass both user@host && git --git-dir=half-auth log -1 --format=%s >actual && @@ -146,6 +149,13 @@ test_expect_success 'no-op half-auth fetch does not require a password' ' expect_askpass none ' +test_expect_success 'redirects send auth to new location' ' + set_askpass user@host pass@host && + git -c credential.useHttpPath=true \ + clone $HTTPD_URL/smart-redir-auth/repo.git repo-redir-auth && + expect_askpass both user@host auth/smart/repo.git +' + test_expect_success 'disable dumb http on server' ' git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ config http.getanyfile false @@ -224,7 +234,7 @@ test_expect_success EXPENSIVE 'create 50,000 tags in the repo' ' done | git fast-import --export-marks=marks && # now assign tags to all the dangling commits we created above - tag=$("$PERL_PATH" -e "print \"bla\" x 30") && + tag=$(perl -e "print \"bla\" x 30") && sed -e "s|^:\([^ ]*\) \(.*\)$|\2 refs/tags/$tag-\1|" <marks >>packed-refs ) ' diff --git a/t/t5561-http-backend.sh b/t/t5561-http-backend.sh index b5d7fbc381..d23fb02384 100755 --- a/t/t5561-http-backend.sh +++ b/t/t5561-http-backend.sh @@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then test_done fi -LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5561'} . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index f01edffa3c..6b16379951 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -3,7 +3,6 @@ test_description='test fetching over git protocol' . ./test-lib.sh -LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-5570} . "$TEST_DIRECTORY"/lib-git-daemon.sh start_git_daemon @@ -37,7 +36,7 @@ test_expect_success 'fetch changes via git protocol' ' test_cmp file clone/file ' -test_expect_failure 'remote detects correct HEAD' ' +test_expect_success 'remote detects correct HEAD' ' git push public master:other && (cd clone && git remote set-head -d origin && @@ -122,8 +121,7 @@ test_remote_error() fi test_must_fail git "$cmd" "$GIT_DAEMON_URL/$repo" "$@" 2>output && - echo "fatal: remote error: $msg: /$repo" >expect && - test_cmp expect output + test_i18ngrep "fatal: remote error: $msg: /$repo" output && ret=$? chmod +x "$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo.git" (exit $ret) diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 8f3cd44d51..5e67035be8 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -280,25 +280,26 @@ test_expect_success 'clone checking out a tag' ' test_cmp fetch.expected fetch.actual ' -test_expect_success 'setup ssh wrapper' ' - write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF && - echo >>"$TRASH_DIRECTORY/ssh-output" "ssh: $*" && - # throw away all but the last argument, which should be the - # command - while test $# -gt 1; do shift; done - eval "$1" - EOF - - GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" && - export GIT_SSH && - export TRASH_DIRECTORY -' - -clear_ssh () { - >"$TRASH_DIRECTORY/ssh-output" +setup_ssh_wrapper () { + test_expect_success 'setup ssh wrapper' ' + write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF && + echo >>"$TRASH_DIRECTORY/ssh-output" "ssh: $*" && + # throw away all but the last argument, which should be the + # command + while test $# -gt 1; do shift; done + eval "$1" + EOF + GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" && + export GIT_SSH && + export TRASH_DIRECTORY && + >"$TRASH_DIRECTORY"/ssh-output + ' } expect_ssh () { + test_when_finished ' + (cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output) + ' && { case "$1" in none) @@ -310,23 +311,130 @@ expect_ssh () { (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output) } -test_expect_success 'cloning myhost:src uses ssh' ' - clear_ssh && +setup_ssh_wrapper + +test_expect_success 'clone myhost:src uses ssh' ' git clone myhost:src ssh-clone && expect_ssh myhost src ' test_expect_success NOT_MINGW,NOT_CYGWIN 'clone local path foo:bar' ' - clear_ssh && cp -R src "foo:bar" && - git clone "./foo:bar" foobar && + git clone "foo:bar" foobar && expect_ssh none ' test_expect_success 'bracketed hostnames are still ssh' ' - clear_ssh && git clone "[myhost:123]:src" ssh-bracket-clone && expect_ssh myhost:123 src ' +counter=0 +# $1 url +# $2 none|host +# $3 path +test_clone_url () { + counter=$(($counter + 1)) + test_might_fail git clone "$1" tmp$counter && + expect_ssh "$2" "$3" +} + +test_expect_success NOT_MINGW 'clone c:temp is ssl' ' + test_clone_url c:temp c temp +' + +test_expect_success MINGW 'clone c:temp is dos drive' ' + test_clone_url c:temp none +' + +#ip v4 +for repo in rep rep/home/project 123 +do + test_expect_success "clone host:$repo" ' + test_clone_url host:$repo host $repo + ' +done + +#ipv6 +for repo in rep rep/home/project 123 +do + test_expect_success "clone [::1]:$repo" ' + test_clone_url [::1]:$repo ::1 $repo + ' +done +#home directory +test_expect_success "clone host:/~repo" ' + test_clone_url host:/~repo host "~repo" +' + +test_expect_success "clone [::1]:/~repo" ' + test_clone_url [::1]:/~repo ::1 "~repo" +' + +# Corner cases +for url in foo/bar:baz [foo]bar/baz:qux [foo/bar]:baz +do + test_expect_success "clone $url is not ssh" ' + test_clone_url $url none + ' +done + +#with ssh:// scheme +test_expect_success 'clone ssh://host.xz/home/user/repo' ' + test_clone_url "ssh://host.xz/home/user/repo" host.xz "/home/user/repo" +' + +# from home directory +test_expect_success 'clone ssh://host.xz/~repo' ' + test_clone_url "ssh://host.xz/~repo" host.xz "~repo" +' + +# with port number +test_expect_success 'clone ssh://host.xz:22/home/user/repo' ' + test_clone_url "ssh://host.xz:22/home/user/repo" "-p 22 host.xz" "/home/user/repo" +' + +# from home directory with port number +test_expect_success 'clone ssh://host.xz:22/~repo' ' + test_clone_url "ssh://host.xz:22/~repo" "-p 22 host.xz" "~repo" +' + +#IPv6 +test_expect_success 'clone ssh://[::1]/home/user/repo' ' + test_clone_url "ssh://[::1]/home/user/repo" "::1" "/home/user/repo" +' + +#IPv6 from home directory +test_expect_success 'clone ssh://[::1]/~repo' ' + test_clone_url "ssh://[::1]/~repo" "::1" "~repo" +' + +#IPv6 with port number +test_expect_success 'clone ssh://[::1]:22/home/user/repo' ' + test_clone_url "ssh://[::1]:22/home/user/repo" "-p 22 ::1" "/home/user/repo" +' + +#IPv6 from home directory with port number +test_expect_success 'clone ssh://[::1]:22/~repo' ' + test_clone_url "ssh://[::1]:22/~repo" "-p 22 ::1" "~repo" +' + +test_expect_success 'clone from a repository with two identical branches' ' + + ( + cd src && + git checkout -b another master + ) && + git clone src target-11 && + test "z$( cd target-11 && git symbolic-ref HEAD )" = zrefs/heads/another + +' + +test_expect_success 'shallow clone locally' ' + git clone --depth=1 --no-local src ssrrcc && + git clone ssrrcc ddsstt && + test_cmp ssrrcc/.git/shallow ddsstt/.git/shallow && + ( cd ddsstt && git fsck ) +' + test_done diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index b10685af4e..3794e4ceaf 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -48,4 +48,29 @@ test_expect_success 'rev-list --objects with pathspecs and copied files' ' ! grep one output ' +test_expect_success 'rev-list A..B and rev-list ^A B are the same' ' + git commit --allow-empty -m another && + git tag -a -m "annotated" v1.0 && + git rev-list --objects ^v1.0^ v1.0 >expect && + git rev-list --objects v1.0^..v1.0 >actual && + test_cmp expect actual +' + +test_expect_success 'propagate uninteresting flag down correctly' ' + git rev-list --objects ^HEAD^{tree} HEAD^{tree} >actual && + >expect && + test_cmp expect actual +' + +test_expect_success 'symleft flag bit is propagated down from tag' ' + git log --format="%m %s" --left-right v1.0...master >actual && + cat >expect <<-\EOF && + > two + > one + < another + < that + EOF + test_cmp expect actual +' + test_done diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh index f80bba871c..39b3238da2 100755 --- a/t/t6010-merge-base.sh +++ b/t/t6010-merge-base.sh @@ -230,4 +230,71 @@ test_expect_success 'criss-cross merge-base for octopus-step' ' test_cmp expected.sorted actual.sorted ' +test_expect_success 'using reflog to find the fork point' ' + git reset --hard && + git checkout -b base $E && + + ( + for count in 1 2 3 + do + git commit --allow-empty -m "Base commit #$count" && + git rev-parse HEAD >expect$count && + git checkout -B derived && + git commit --allow-empty -m "Derived #$count" && + git rev-parse HEAD >derived$count && + git checkout -B base $E || exit 1 + done + + for count in 1 2 3 + do + git merge-base --fork-point base $(cat derived$count) >actual && + test_cmp expect$count actual || exit 1 + done + + ) && + # check that we correctly default to HEAD + git checkout derived && + git merge-base --fork-point base >actual && + test_cmp expect3 actual +' + +test_expect_success 'merge-base --octopus --all for complex tree' ' + # Best common ancestor for JE, JAA and JDD is JC + # JE + # / | + # / | + # / | + # JAA / | + # |\ / | + # | \ | JDD | + # | \ |/ | | + # | JC JD | + # | | /| | + # | |/ | | + # JA | | | + # |\ /| | | + # X JB | X X + # \ \ | / / + # \__\|/___/ + # J + test_commit J && + test_commit JB && + git reset --hard J && + test_commit JC && + git reset --hard J && + test_commit JTEMP1 && + test_merge JA JB && + test_merge JAA JC && + git reset --hard J && + test_commit JTEMP2 && + test_merge JD JB && + test_merge JDD JC && + git reset --hard J && + test_commit JTEMP3 && + test_merge JE JC && + git rev-parse JC >expected && + git merge-base --all --octopus JAA JDD JE >actual && + test_cmp expected actual +' + test_done diff --git a/t/t6011-rev-list-with-bad-commit.sh b/t/t6011-rev-list-with-bad-commit.sh index bbb0581f88..e51eb41f4b 100755 --- a/t/t6011-rev-list-with-bad-commit.sh +++ b/t/t6011-rev-list-with-bad-commit.sh @@ -37,7 +37,7 @@ test_expect_success 'verify number of revisions' \ test_expect_success 'corrupt second commit object' \ ' - "$PERL_PATH" -i.bak -pe "s/second commit/socond commit/" .git/objects/pack/*.pack && + perl -i.bak -pe "s/second commit/socond commit/" .git/objects/pack/*.pack && test_must_fail git fsck --full ' diff --git a/t/t6013-rev-list-reverse-parents.sh b/t/t6013-rev-list-reverse-parents.sh index 892a537989..59fc2f06e0 100755 --- a/t/t6013-rev-list-reverse-parents.sh +++ b/t/t6013-rev-list-reverse-parents.sh @@ -25,7 +25,7 @@ test_expect_success 'set up --reverse example' ' test_expect_success '--reverse --parents --full-history combines correctly' ' git rev-list --parents --full-history master -- foo | - "$PERL_PATH" -e "print reverse <>" > expected && + perl -e "print reverse <>" > expected && git rev-list --reverse --parents --full-history master -- foo \ > actual && test_cmp actual expected @@ -33,7 +33,7 @@ test_expect_success '--reverse --parents --full-history combines correctly' ' test_expect_success '--boundary does too' ' git rev-list --boundary --parents --full-history master ^root -- foo | - "$PERL_PATH" -e "print reverse <>" > expected && + perl -e "print reverse <>" > expected && git rev-list --boundary --reverse --parents --full-history \ master ^root -- foo > actual && test_cmp actual expected diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh index f00cebff3e..d00f7db868 100755 --- a/t/t6018-rev-list-glob.sh +++ b/t/t6018-rev-list-glob.sh @@ -129,6 +129,18 @@ test_expect_success 'rev-parse --remotes=foo' ' ' +test_expect_success 'rev-parse --exclude with --branches' ' + compare rev-parse "--exclude=*/* --branches" "master someref subspace-x" +' + +test_expect_success 'rev-parse --exclude with --all' ' + compare rev-parse "--exclude=refs/remotes/* --all" "--branches --tags" +' + +test_expect_success 'rev-parse accumulates multiple --exclude' ' + compare rev-parse "--exclude=refs/remotes/* --exclude=refs/tags/* --all" --branches +' + test_expect_success 'rev-list --glob=refs/heads/subspace/*' ' compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/*" @@ -231,6 +243,48 @@ test_expect_success 'rev-list --remotes=foo' ' ' +test_expect_success 'rev-list --exclude with --branches' ' + compare rev-list "--exclude=*/* --branches" "master someref subspace-x" +' + +test_expect_success 'rev-list --exclude with --all' ' + compare rev-list "--exclude=refs/remotes/* --all" "--branches --tags" +' + +test_expect_success 'rev-list accumulates multiple --exclude' ' + compare rev-list "--exclude=refs/remotes/* --exclude=refs/tags/* --all" --branches +' + + +# "git rev-list<ENTER>" is likely to be a bug in the calling script and may +# deserve an error message, but do cases where set of refs programatically +# given using globbing and/or --stdin need to fail with the same error, or +# are we better off reporting a success with no output? The following few +# tests document the current behaviour to remind us that we might want to +# think about this issue. + +test_expect_failure 'rev-list may want to succeed with empty output on no input (1)' ' + >expect && + git rev-list --stdin <expect >actual && + test_cmp expect actual +' + +test_expect_failure 'rev-list may want to succeed with empty output on no input (2)' ' + >expect && + git rev-list --exclude=* --all >actual && + test_cmp expect actual +' + +test_expect_failure 'rev-list may want to succeed with empty output on no input (3)' ' + ( + test_create_repo empty && + cd empty && + >expect && + git rev-list --all >actual && + test_cmp expect actual + ) +' + test_expect_success 'shortlog accepts --glob/--tags/--remotes' ' compare shortlog "subspace/one subspace/two" --branches=subspace && diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh index 1cd649e245..a953f1b55c 100755 --- a/t/t6031-merge-recursive.sh +++ b/t/t6031-merge-recursive.sh @@ -2,7 +2,6 @@ test_description='merge-recursive: handle file mode' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh test_expect_success 'mode change in one branch: keep changed version' ' : >file1 && diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh index ba26cfe923..7ac8fd06c3 100755 --- a/t/t6040-tracking-info.sh +++ b/t/t6040-tracking-info.sh @@ -39,12 +39,14 @@ test_expect_success setup ' advance h ' -script='s/^..\(b.\)[ 0-9a-f]*\[\([^]]*\)\].*/\1 \2/p' +script='s/^..\(b.\) *[0-9a-f]* \(.*\)$/\1 \2/p' cat >expect <<\EOF -b1 ahead 1, behind 1 -b2 ahead 1, behind 1 -b3 behind 1 -b4 ahead 2 +b1 [ahead 1, behind 1] d +b2 [ahead 1, behind 1] d +b3 [behind 1] b +b4 [ahead 2] f +b5 g +b6 c EOF test_expect_success 'branch -v' ' @@ -57,12 +59,12 @@ test_expect_success 'branch -v' ' ' cat >expect <<\EOF -b1 origin/master: ahead 1, behind 1 -b2 origin/master: ahead 1, behind 1 -b3 origin/master: behind 1 -b4 origin/master: ahead 2 -b5 brokenbase: gone -b6 origin/master +b1 [origin/master: ahead 1, behind 1] d +b2 [origin/master: ahead 1, behind 1] d +b3 [origin/master: behind 1] b +b4 [origin/master: ahead 2] f +b5 [brokenbase: gone] g +b6 [origin/master] c EOF test_expect_success 'branch -vv' ' diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index 7d47984352..719a11673b 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -276,6 +276,48 @@ test_expect_success '-f option bypasses the type check' ' git replace -f HEAD^ $BLOB ' +test_expect_success 'git cat-file --batch works on replace objects' ' + git replace | grep $PARA3 && + echo $PARA3 | git cat-file --batch +' + +test_expect_success 'test --format bogus' ' + test_must_fail git replace --format bogus >/dev/null 2>&1 +' + +test_expect_success 'test --format short' ' + git replace --format=short >actual && + git replace >expected && + test_cmp expected actual +' + +test_expect_success 'test --format medium' ' + H1=$(git --no-replace-objects rev-parse HEAD~1) && + HT=$(git --no-replace-objects rev-parse HEAD^{tree}) && + MYTAG=$(git --no-replace-objects rev-parse mytag) && + { + echo "$H1 -> $BLOB" && + echo "$BLOB -> $REPLACED" && + echo "$HT -> $H1" && + echo "$PARA3 -> $S" && + echo "$MYTAG -> $HASH1" + } | sort >expected && + git replace -l --format medium | sort > actual && + test_cmp expected actual +' + +test_expect_success 'test --format long' ' + { + echo "$H1 (commit) -> $BLOB (blob)" && + echo "$BLOB (blob) -> $REPLACED (blob)" && + echo "$HT (tree) -> $H1 (commit)" && + echo "$PARA3 (commit) -> $S (commit)" && + echo "$MYTAG (tag) -> $HASH1 (commit)" + } | sort >expected && + git replace --format=long | sort > actual && + test_cmp expected actual +' + test_expect_success 'replace ref cleanup' ' test -n "$(git replace)" && git replace -d $(git replace) && diff --git a/t/t6101-rev-parse-parents.sh b/t/t6101-rev-parse-parents.sh index 7ea14ced31..10b1452766 100755 --- a/t/t6101-rev-parse-parents.sh +++ b/t/t6101-rev-parse-parents.sh @@ -20,7 +20,17 @@ test_expect_success 'setup' ' test_commit start2 && git checkout master && git merge -m next start2 && - test_commit final + test_commit final && + + test_seq 40 | + while read i + do + git checkout --orphan "b$i" && + test_tick && + git commit --allow-empty -m "$i" && + commit=$(git rev-parse --verify HEAD) && + printf "$commit " >>.git/info/grafts + done ' test_expect_success 'start is valid' ' @@ -79,6 +89,10 @@ test_expect_success 'final^1^! = final^1 ^final^1^1 ^final^1^2' ' test_cmp expect actual ' +test_expect_success 'large graft octopus' ' + test_cmp_rev_output b31 "git rev-parse --verify b1^30" +' + test_expect_success 'repack for next test' ' git repack -a -d ' diff --git a/t/t6130-pathspec-noglob.sh b/t/t6130-pathspec-noglob.sh index ea00d71e77..658353277e 100755 --- a/t/t6130-pathspec-noglob.sh +++ b/t/t6130-pathspec-noglob.sh @@ -108,6 +108,13 @@ test_expect_success 'no-glob environment variable works' ' test_cmp expect actual ' +test_expect_success 'blame takes global pathspec flags' ' + git --literal-pathspecs blame -- foo && + git --icase-pathspecs blame -- foo && + git --glob-pathspecs blame -- foo && + git --noglob-pathspecs blame -- foo +' + test_expect_success 'setup xxx/bar' ' mkdir xxx && test_commit xxx xxx/bar diff --git a/t/t6131-pathspec-icase.sh b/t/t6131-pathspec-icase.sh index 8d4a7fcb91..39fc3f6769 100755 --- a/t/t6131-pathspec-icase.sh +++ b/t/t6131-pathspec-icase.sh @@ -69,7 +69,7 @@ test_expect_success 'tree_entry_interesting matches :(icase)bar with empty prefi test_cmp expect actual ' -test_expect_success 'match_pathspec_depth matches :(icase)bar' ' +test_expect_success 'match_pathspec matches :(icase)bar' ' cat <<-EOF >expect && BAR bAr @@ -79,7 +79,7 @@ test_expect_success 'match_pathspec_depth matches :(icase)bar' ' test_cmp expect actual ' -test_expect_success 'match_pathspec_depth matches :(icase)bar with prefix' ' +test_expect_success 'match_pathspec matches :(icase)bar with prefix' ' cat <<-EOF >expect && fOo/BAR fOo/bAr @@ -89,7 +89,7 @@ test_expect_success 'match_pathspec_depth matches :(icase)bar with prefix' ' test_cmp expect actual ' -test_expect_success 'match_pathspec_depth matches :(icase)bar with empty prefix' ' +test_expect_success 'match_pathspec matches :(icase)bar with empty prefix' ' cat <<-EOF >expect && bar fOo/BAR @@ -100,4 +100,10 @@ test_expect_success 'match_pathspec_depth matches :(icase)bar with empty prefix' test_cmp expect actual ' +test_expect_success '"git diff" can take magic :(icase) pathspec' ' + echo FOO/BAR >expect && + git diff --name-only HEAD^ HEAD -- ":(icase)foo/bar" >actual && + test_cmp expect actual +' + test_done diff --git a/t/t6132-pathspec-exclude.sh b/t/t6132-pathspec-exclude.sh new file mode 100755 index 0000000000..62049be0c7 --- /dev/null +++ b/t/t6132-pathspec-exclude.sh @@ -0,0 +1,184 @@ +#!/bin/sh + +test_description='test case exclude pathspec' + +. ./test-lib.sh + +test_expect_success 'setup' ' + for p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do + if echo $p | grep /; then + mkdir -p `dirname $p` + fi && + : >$p && + git add $p && + git commit -m $p + done && + git log --oneline --format=%s >actual && + cat <<EOF >expect && +sub2/file +sub/sub/sub/file +sub/file2 +sub/sub/file +sub/file +file +EOF + test_cmp expect actual +' + +test_expect_success 'exclude only should error out' ' + test_must_fail git log --oneline --format=%s -- ":(exclude)sub" +' + +test_expect_success 't_e_i() exclude sub' ' + git log --oneline --format=%s -- . ":(exclude)sub" >actual + cat <<EOF >expect && +sub2/file +file +EOF + test_cmp expect actual +' + +test_expect_success 't_e_i() exclude sub/sub/file' ' + git log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual + cat <<EOF >expect && +sub2/file +sub/sub/sub/file +sub/file2 +sub/file +file +EOF + test_cmp expect actual +' + +test_expect_success 't_e_i() exclude sub using mnemonic' ' + git log --oneline --format=%s -- . ":!sub" >actual + cat <<EOF >expect && +sub2/file +file +EOF + test_cmp expect actual +' + +test_expect_success 't_e_i() exclude :(icase)SUB' ' + git log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual + cat <<EOF >expect && +sub2/file +file +EOF + test_cmp expect actual +' + +test_expect_success 't_e_i() exclude sub2 from sub' ' + ( + cd sub && + git log --oneline --format=%s -- :/ ":/!sub2" >actual + cat <<EOF >expect && +sub/sub/sub/file +sub/file2 +sub/sub/file +sub/file +file +EOF + test_cmp expect actual + ) +' + +test_expect_success 't_e_i() exclude sub/*file' ' + git log --oneline --format=%s -- . ":(exclude)sub/*file" >actual + cat <<EOF >expect && +sub2/file +sub/file2 +file +EOF + test_cmp expect actual +' + +test_expect_success 't_e_i() exclude :(glob)sub/*/file' ' + git log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual + cat <<EOF >expect && +sub2/file +sub/sub/sub/file +sub/file2 +sub/file +file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude sub' ' + git ls-files -- . ":(exclude)sub" >actual + cat <<EOF >expect && +file +sub2/file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude sub/sub/file' ' + git ls-files -- . ":(exclude)sub/sub/file" >actual + cat <<EOF >expect && +file +sub/file +sub/file2 +sub/sub/sub/file +sub2/file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude sub using mnemonic' ' + git ls-files -- . ":!sub" >actual + cat <<EOF >expect && +file +sub2/file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude :(icase)SUB' ' + git ls-files -- . ":(exclude,icase)SUB" >actual + cat <<EOF >expect && +file +sub2/file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude sub2 from sub' ' + ( + cd sub && + git ls-files -- :/ ":/!sub2" >actual + cat <<EOF >expect && +../file +file +file2 +sub/file +sub/sub/file +EOF + test_cmp expect actual + ) +' + +test_expect_success 'm_p_d() exclude sub/*file' ' + git ls-files -- . ":(exclude)sub/*file" >actual + cat <<EOF >expect && +file +sub/file2 +sub2/file +EOF + test_cmp expect actual +' + +test_expect_success 'm_p_d() exclude :(glob)sub/*/file' ' + git ls-files -- . ":(exclude,glob)sub/*/file" >actual + cat <<EOF >expect && +file +sub/file +sub/file2 +sub/sub/sub/file +sub2/file +EOF + test_cmp expect actual +' + +test_done diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 752f5cb7d0..bda354c1c4 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -18,16 +18,13 @@ setdate_and_increment () { export GIT_COMMITTER_DATE GIT_AUTHOR_DATE } -test_expect_success 'Create sample commit with known timestamp' ' +test_expect_success setup ' setdate_and_increment && echo "Using $datestamp" > one && git add one && git commit -m "Initial" && setdate_and_increment && - git tag -a -m "Tagging at $datestamp" testtag -' - -test_expect_success 'Create upstream config' ' + git tag -a -m "Tagging at $datestamp" testtag && git update-ref refs/remotes/origin/master master && git remote add origin nowhere && git config branch.master.remote origin && @@ -52,12 +49,14 @@ test_atom head refname refs/heads/master test_atom head upstream refs/remotes/origin/master test_atom head objecttype commit test_atom head objectsize 171 -test_atom head objectname 67a36f10722846e891fbada1ba48ed035de75581 -test_atom head tree 0e51c00fcb93dffc755546f27593d511e1bdb46f +test_atom head objectname $(git rev-parse refs/heads/master) +test_atom head tree $(git rev-parse refs/heads/master^{tree}) test_atom head parent '' test_atom head numparent 0 test_atom head object '' test_atom head type '' +test_atom head '*objectname' '' +test_atom head '*objecttype' '' test_atom head author 'A U Thor <author@example.com> 1151939924 +0200' test_atom head authorname 'A U Thor' test_atom head authoremail '<author@example.com>' @@ -80,17 +79,20 @@ test_atom head contents:body '' test_atom head contents:signature '' test_atom head contents 'Initial ' +test_atom head HEAD '*' test_atom tag refname refs/tags/testtag test_atom tag upstream '' test_atom tag objecttype tag test_atom tag objectsize 154 -test_atom tag objectname 98b46b1d36e5b07909de1b3886224e3e81e87322 +test_atom tag objectname $(git rev-parse refs/tags/testtag) test_atom tag tree '' test_atom tag parent '' test_atom tag numparent '' -test_atom tag object '67a36f10722846e891fbada1ba48ed035de75581' +test_atom tag object $(git rev-parse refs/tags/testtag^0) test_atom tag type 'commit' +test_atom tag '*objectname' '67a36f10722846e891fbada1ba48ed035de75581' +test_atom tag '*objecttype' 'commit' test_atom tag author '' test_atom tag authorname '' test_atom tag authoremail '' @@ -113,6 +115,7 @@ test_atom tag contents:body '' test_atom tag contents:signature '' test_atom tag contents 'Tagging at 1151939927 ' +test_atom tag HEAD ' ' test_expect_success 'Check invalid atoms names are errors' ' test_must_fail git for-each-ref --format="%(INVALID)" refs/heads @@ -304,8 +307,35 @@ test_expect_success 'Check short upstream format' ' test_cmp expected actual ' +test_expect_success 'setup for upstream:track[short]' ' + test_commit two +' + +cat >expected <<EOF +[ahead 1] +EOF + +test_expect_success 'Check upstream:track format' ' + git for-each-ref --format="%(upstream:track)" refs/heads >actual && + test_cmp expected actual +' + +cat >expected <<EOF +> +EOF + +test_expect_success 'Check upstream:trackshort format' ' + git for-each-ref --format="%(upstream:trackshort)" refs/heads >actual && + test_cmp expected actual +' + +test_expect_success 'Check that :track[short] cannot be used with other atoms' ' + test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null && + test_must_fail git for-each-ref --format="%(refname:trackshort)" 2>/dev/null +' + cat >expected <<EOF -67a36f1 +$(git rev-parse --short HEAD) EOF test_expect_success 'Check short objectname format' ' @@ -317,6 +347,23 @@ test_expect_success 'Check for invalid refname format' ' test_must_fail git for-each-ref --format="%(refname:INVALID)" ' +get_color () +{ + git config --get-color no.such.slot "$1" +} + +cat >expected <<EOF +$(git rev-parse --short refs/heads/master) $(get_color green)master$(get_color reset) +$(git rev-parse --short refs/remotes/origin/master) $(get_color green)origin/master$(get_color reset) +$(git rev-parse --short refs/tags/testtag) $(get_color green)testtag$(get_color reset) +$(git rev-parse --short refs/tags/two) $(get_color green)two$(get_color reset) +EOF + +test_expect_success 'Check %(color:...) ' ' + git for-each-ref --format="%(objectname:short) %(color:green)%(refname:short)" >actual && + test_cmp expected actual +' + cat >expected <<\EOF heads/master tags/master @@ -456,9 +503,9 @@ 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 +cat >expected <<EOF +$(git rev-parse refs/tags/master) <committer@example.com> refs/tags/master +$(git rev-parse refs/tags/bogo) <committer@example.com> refs/tags/bogo EOF test_expect_success 'Verify sort with multiple keys' ' diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh index b1a63655f9..63194d819e 100755 --- a/t/t6500-gc.sh +++ b/t/t6500-gc.sh @@ -9,6 +9,11 @@ test_expect_success 'gc empty repository' ' git gc ' +test_expect_success 'gc does not leave behind pid file' ' + git gc && + test_path_is_missing .git/gc.pid +' + test_expect_success 'gc --gobbledegook' ' test_expect_code 129 git gc --nonsense 2>err && test_i18ngrep "[Uu]sage: git gc" err diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index d432f42bcb..e3c8c2c1b8 100755 --- a/t/t7001-mv.sh +++ b/t/t7001-mv.sh @@ -70,6 +70,35 @@ test_expect_success \ rm -f idontexist untracked1 untracked2 \ path0/idontexist path0/untracked1 path0/untracked2 \ .git/index.lock +rmdir path1 + +test_expect_success \ + 'moving to absent target with trailing slash' \ + 'test_must_fail git mv path0/COPYING no-such-dir/ && + test_must_fail git mv path0/COPYING no-such-dir// && + git mv path0/ no-such-dir/ && + test_path_is_dir no-such-dir' + +test_expect_success \ + 'clean up' \ + 'git reset --hard' + +test_expect_success \ + 'moving to existing untracked target with trailing slash' \ + 'mkdir path1 && + git mv path0/ path1/ && + test_path_is_dir path1/path0/' + +test_expect_success \ + 'moving to existing tracked target with trailing slash' \ + 'mkdir path2 && + >path2/file && git add path2/file && + git mv path1/path0/ path2/ && + test_path_is_dir path2/path0/' + +test_expect_success \ + 'clean up' \ + 'git reset --hard' test_expect_success \ 'adding another file' \ @@ -293,6 +322,32 @@ test_expect_success 'git mv moves a submodule with a .git directory and no .gitm git diff-files --quiet ' +test_expect_success 'git mv moves a submodule with a .git directory and .gitmodules' ' + rm -rf mod && + git reset --hard && + git submodule update && + entry="$(git ls-files --stage sub | cut -f 1)" && + ( + cd sub && + rm -f .git && + cp -a ../.git/modules/sub .git && + GIT_WORK_TREE=. git config --unset core.worktree + ) && + mkdir mod && + git mv sub mod/sub && + ! test -e sub && + [ "$entry" = "$(git ls-files --stage mod/sub | cut -f 1)" ] && + ( + cd mod/sub && + git status + ) && + echo mod/sub >expected && + git config -f .gitmodules submodule.sub.path >actual && + test_cmp expected actual && + git update-index --refresh && + git diff-files --quiet +' + test_expect_success 'git mv moves a submodule with gitfile' ' rm -rf mod/sub && git reset --hard && @@ -387,4 +442,25 @@ test_expect_success 'mv --dry-run does not touch the submodule or .gitmodules' ' git diff-files --quiet -- sub .gitmodules ' +test_expect_success 'checking out a commit before submodule moved needs manual updates' ' + git mv sub sub2 && + git commit -m "moved sub to sub2" && + git checkout -q HEAD^ 2>actual && + echo "warning: unable to rmdir sub2: Directory not empty" >expected && + test_i18ncmp expected actual && + git status -s sub2 >actual && + echo "?? sub2/" >expected && + test_cmp expected actual && + ! test -f sub/.git && + test -f sub2/.git && + git submodule update && + test -f sub/.git && + rm -rf sub2 && + git diff-index --exit-code HEAD && + git update-index --refresh && + git diff-files --quiet -- sub .gitmodules && + git status -s sub2 >actual && + ! test -s actual +' + test_done diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index ff2590849d..b9365b431d 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -37,6 +37,18 @@ test_expect_failure TTY 'pager runs from subdir' ' test_cmp expected actual ' +test_expect_success TTY 'LESS and LV envvars are set for pagination' ' + ( + sane_unset LESS LV && + PAGER="env >pager-env.out; wc" && + export PAGER && + + test_terminal git log + ) && + grep ^LESS= pager-env.out && + grep ^LV= pager-env.out +' + test_expect_success TTY 'some commands do not use a pager' ' rm -f paginated.out && test_terminal git rev-list HEAD && diff --git a/t/t7101-reset.sh b/t/t7101-reset-empty-subdirs.sh index 96e163f084..96e163f084 100755 --- a/t/t7101-reset.sh +++ b/t/t7101-reset-empty-subdirs.sh diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh index 8d4b50d1b5..450529404c 100755 --- a/t/t7102-reset.sh +++ b/t/t7102-reset.sh @@ -535,4 +535,30 @@ test_expect_success 'reset with paths accepts tree' ' git diff HEAD --exit-code ' +test_expect_success 'reset -N keeps removed files as intent-to-add' ' + echo new-file >new-file && + git add new-file && + git reset -N HEAD && + + tree=$(git write-tree) && + git ls-tree $tree new-file >actual && + >expect && + test_cmp expect actual && + + git diff --name-only >actual && + echo new-file >expect && + test_cmp expect actual +' + +test_expect_success 'reset --mixed sets up work tree' ' + git init mixed_worktree && + ( + cd mixed_worktree && + test_commit dummy + ) && + : >expect && + git --git-dir=mixed_worktree/.git --work-tree=mixed_worktree reset >actual && + test_cmp expect actual +' + test_done diff --git a/t/t7104-reset.sh b/t/t7104-reset-hard.sh index f136ee7bb5..f136ee7bb5 100755 --- a/t/t7104-reset.sh +++ b/t/t7104-reset-hard.sh diff --git a/t/t7105-reset-patch.sh b/t/t7105-reset-patch.sh index 95fab20361..98b7d7b969 100755 --- a/t/t7105-reset-patch.sh +++ b/t/t7105-reset-patch.sh @@ -25,15 +25,17 @@ test_expect_success PERL 'saying "n" does nothing' ' ' test_expect_success PERL 'git reset -p' ' - (echo n; echo y) | git reset -p && + (echo n; echo y) | git reset -p >output && verify_state dir/foo work head && - verify_saved_state bar + verify_saved_state bar && + test_i18ngrep "Unstage" output ' test_expect_success PERL 'git reset -p HEAD^' ' - (echo n; echo y) | git reset -p HEAD^ && + (echo n; echo y) | git reset -p HEAD^ >output && verify_state dir/foo work parent && - verify_saved_state bar + verify_saved_state bar && + test_i18ngrep "Apply" output ' # The idea in the rest is that bar sorts first, so we always say 'y' diff --git a/t/t7106-reset-unborn-branch.sh b/t/t7106-reset-unborn-branch.sh index af00ab4d88..0f95f00477 100755 --- a/t/t7106-reset-unborn-branch.sh +++ b/t/t7106-reset-unborn-branch.sh @@ -37,11 +37,12 @@ test_expect_success PERL 'reset -p' ' rm .git/index && git add a && echo y >yes && - git reset -p <yes && + git reset -p <yes >output && >expect && git ls-files >actual && - test_cmp expect actual + test_cmp expect actual && + test_i18ngrep "Unstage" output ' test_expect_success 'reset --soft is a no-op' ' diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh index 710be90489..74de814aec 100755 --- a/t/t7300-clean.sh +++ b/t/t7300-clean.sh @@ -511,4 +511,20 @@ test_expect_success SANITY 'git clean -d with an unreadable empty directory' ' ! test -d foo ' +test_expect_success 'git clean -d respects pathspecs (dir is prefix of pathspec)' ' + mkdir -p foo && + mkdir -p foobar && + git clean -df foobar && + test_path_is_dir foo && + test_path_is_missing foobar +' + +test_expect_success 'git clean -d respects pathspecs (pathspec is prefix of dir)' ' + mkdir -p foo && + mkdir -p foobar && + git clean -df foo && + test_path_is_missing foo && + test_path_is_dir foobar +' + test_done diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index f0b33053ab..28ca76384f 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -63,6 +63,9 @@ test_expect_success 'setup a submodule tree' ' git submodule add ../none none && test_tick && git commit -m "none" + ) && + (cd super && + git tag initial-setup ) ' @@ -323,6 +326,21 @@ test_expect_success 'submodule update - command in .git/config catches failure' ) ' +test_expect_success 'submodule init does not copy command into .git/config' ' + (cd super && + H=$(git ls-files -s submodule | cut -d" " -f2) && + mkdir submodule1 && + git update-index --add --cacheinfo 160000 $H submodule1 && + git config -f .gitmodules submodule.submodule1.path submodule1 && + git config -f .gitmodules submodule.submodule1.url ../submodule && + git config -f .gitmodules submodule.submodule1.update !false && + git submodule init submodule1 && + echo "none" >expect && + git config submodule.submodule1.update >actual && + test_cmp expect actual + ) +' + test_expect_success 'submodule init picks up rebase' ' (cd super && git config -f .gitmodules submodule.rebasing.update rebase && @@ -688,7 +706,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re git clone super_update_r super_update_r2 && (cd super_update_r2 && git submodule update --init --recursive >actual && - test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual && + test_i18ngrep "Submodule path .submodule/subsubmodule.: .git reset --hard -q" actual && (cd submodule/subsubmodule && git log > ../../expected ) && @@ -747,6 +765,50 @@ test_expect_success 'submodule update clone shallow submodule' ' (cd submodule && test 1 = $(git log --oneline | wc -l) ) +) +' + +test_expect_success 'submodule update --recursive drops module name before recursing' ' + (cd super2 && + (cd deeper/submodule/subsubmodule && + git checkout HEAD^ + ) && + git submodule update --recursive deeper/submodule >actual && + test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual ) ' + +test_expect_success 'submodule update --checkout clones detached HEAD' ' + git clone super super4 && + echo "detached HEAD" >expected && + (cd super4 && + git reset --hard initial-setup && + git submodule init submodule && + git submodule update >> /tmp/log 2>&1 && + (cd submodule && + git symbolic-ref HEAD > ../../actual || + echo "detached HEAD" > ../../actual + ) + ) && + test_cmp actual expected && + rm -rf super4 +' + +test_expect_success 'submodule update --merge clones attached HEAD' ' + git clone super super4 && + echo "refs/heads/master" >expected && + (cd super4 && + git reset --hard initial-setup && + git submodule init submodule && + git config submodule.submodule.update merge && + git submodule update --merge && + (cd submodule && + git symbolic-ref HEAD > ../../actual || + echo "detached HEAD" > ../../actual + ) + ) && + test_cmp actual expected && + rm -rf super4 +' + test_done diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index be93f10cf0..7ca10b8606 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -254,10 +254,6 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached ) && git submodule status --cached --recursive -- nested1 > ../actual ) && - if test_have_prereq MINGW - then - dos2unix actual - fi && test_cmp expect actual ' @@ -329,4 +325,13 @@ test_expect_success 'command passed to foreach --recursive retains notion of std test_cmp expected actual ' +test_expect_success 'multi-argument command passed to foreach is not shell-evaluated twice' ' + ( + cd super && + git submodule foreach "echo \\\"quoted\\\"" > ../expected && + git submodule foreach echo \"quoted\" > ../actual + ) && + test_cmp expected actual +' + test_done diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh index f04798f872..94eec83b37 100755 --- a/t/t7501-commit.sh +++ b/t/t7501-commit.sh @@ -57,6 +57,7 @@ test_expect_success 'using invalid commit with -C' ' ' test_expect_success 'nothing to commit' ' + git reset --hard && test_must_fail git commit -m initial ' diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh index da5bd3b5a5..2ddf28c984 100755 --- a/t/t7507-commit-verbose.sh +++ b/t/t7507-commit-verbose.sh @@ -65,9 +65,35 @@ test_expect_success 'diff in message is retained without -v' ' check_message diff ' -test_expect_failure 'diff in message is retained with -v' ' +test_expect_success 'diff in message is retained with -v' ' git commit --amend -F diff -v && check_message diff ' +test_expect_success 'submodule log is stripped out too with -v' ' + git config diff.submodule log && + git submodule add ./. sub && + git commit -m "sub added" && + ( + cd sub && + echo "more" >>file && + git commit -a -m "submodule commit" + ) && + ( + GIT_EDITOR=cat && + export GIT_EDITOR && + test_must_fail git commit -a -v 2>err + ) && + test_i18ngrep "Aborting commit due to empty commit message." err +' + +test_expect_success 'verbose diff is stripped out with set core.commentChar' ' + ( + GIT_EDITOR=cat && + export GIT_EDITOR && + test_must_fail git -c core.commentchar=";" commit -a -v 2>err + ) && + test_i18ngrep "Aborting commit due to empty commit message." err +' + test_done diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 6fb59f3293..c987b5ed65 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -994,7 +994,7 @@ test_expect_success 'status -s submodule summary (clean submodule)' ' test_expect_success 'status -z implies porcelain' ' git status --porcelain | - "$PERL_PATH" -pe "s/\012/\000/g" >expect && + perl -pe "s/\012/\000/g" >expect && git status -z >output && test_cmp expect output ' diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh index 1d3c56fe61..5ddac1a9f7 100755 --- a/t/t7510-signed-commit.sh +++ b/t/t7510-signed-commit.sh @@ -5,6 +5,8 @@ test_description='signed commit tests' . "$TEST_DIRECTORY/lib-gpg.sh" test_expect_success GPG 'create signed commits' ' + test_when_finished "test_unconfig commit.gpgsign" && + echo 1 >file && git add file && test_tick && git commit -S -m initial && git tag initial && @@ -25,12 +27,27 @@ test_expect_success GPG 'create signed commits' ' git tag fourth-unsigned && test_tick && git commit --amend -S -m "fourth signed" && - git tag fourth-signed + git tag fourth-signed && + + git config commit.gpgsign true && + echo 5 >file && test_tick && git commit -a -m "fifth signed" && + git tag fifth-signed && + + git config commit.gpgsign false && + echo 6 >file && test_tick && git commit -a -m "sixth" && + git tag sixth-unsigned && + + git config commit.gpgsign true && + echo 7 >file && test_tick && git commit -a -m "seventh" --no-gpg-sign && + git tag seventh-unsigned && + + test_tick && git rebase -f HEAD^^ && git tag sixth-signed HEAD^ && + git tag seventh-signed ' test_expect_success GPG 'show signatures' ' ( - for commit in initial second merge master + for commit in initial second merge fourth-signed fifth-signed sixth-signed master do git show --pretty=short --show-signature $commit >actual && grep "Good signature from" actual || exit 1 @@ -39,7 +56,7 @@ test_expect_success GPG 'show signatures' ' done ) && ( - for commit in merge^2 fourth-unsigned + for commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned do git show --pretty=short --show-signature $commit >actual && grep "Good signature from" actual && exit 1 @@ -52,7 +69,7 @@ test_expect_success GPG 'show signatures' ' test_expect_success GPG 'detect fudged signature' ' git cat-file commit master >raw && - sed -e "s/fourth signed/4th forged/" raw >forged1 && + sed -e "s/seventh/7th forged/" raw >forged1 && git hash-object -w -t commit forged1 >forged1.commit && git show --pretty=short --show-signature $(cat forged1.commit) >actual1 && grep "BAD signature from" actual1 && diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh index 830a4c3e9d..f768c900ab 100755 --- a/t/t7601-merge-pull-config.sh +++ b/t/t7601-merge-pull-config.sh @@ -38,6 +38,27 @@ test_expect_success 'merge c1 with c2' ' test -f c2.c ' +test_expect_success 'fast-forward pull succeeds with "true" in pull.ff' ' + git reset --hard c0 && + test_config pull.ff true && + git pull . c1 && + test "$(git rev-parse HEAD)" = "$(git rev-parse c1)" +' + +test_expect_success 'fast-forward pull creates merge with "false" in pull.ff' ' + git reset --hard c0 && + test_config pull.ff false && + git pull . c1 && + test "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" && + test "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)" +' + +test_expect_success 'pull prevents non-fast-forward with "only" in pull.ff' ' + git reset --hard c1 && + test_config pull.ff only && + test_must_fail git pull . c3 +' + test_expect_success 'merge c1 with c2 (ours in pull.twohead)' ' git reset --hard c1 && git config pull.twohead ours && diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index d954b846a1..b45bd1e76c 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -17,7 +17,7 @@ test_expect_success 'objects in packs marked .keep are not repacked' ' # The second pack will contain the excluded object packsha1=$(git rev-list --objects --all | grep file2 | git pack-objects pack) && - touch -r pack-$packsha1.pack pack-$packsha1.keep && + >pack-$packsha1.keep && objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 | sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") && mv pack-* .git/objects/pack/ && diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 2418528487..5a193c500d 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -434,4 +434,18 @@ test_expect_success PERL 'difftool --no-symlinks detects conflict ' ' ) ' +test_expect_success PERL 'difftool properly honors gitlink and core.worktree' ' + git submodule add ./. submod/ule && + ( + cd submod/ule && + test_config diff.tool checktrees && + test_config difftool.checktrees.cmd '\'' + test -d "$LOCAL" && test -d "$REMOTE" && echo good + '\'' && + echo good >expect && + git difftool --tool=checktrees --dir-diff HEAD~ >actual && + test_cmp expect actual + ) +' + test_done diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 2813aa9a61..3119c8c523 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -23,7 +23,6 @@ test_expect_success $PREREQ \ echo do echo " echo \"!\$a!\"" echo "done >commandline\$output" - test_have_prereq MINGW && echo "dos2unix commandline\$output" echo "cat > msgtxt\$output" ) >fake.sendmail && chmod +x ./fake.sendmail && diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh index f524d2f383..d33d714006 100755 --- a/t/t9114-git-svn-dcommit-merge.sh +++ b/t/t9114-git-svn-dcommit-merge.sh @@ -62,7 +62,7 @@ test_expect_success 'setup git mirror and merge' ' echo friend > README && cat tmp >> README && git commit -a -m "friend" && - git pull . merge + git merge merge ' test_debug 'gitk --all & sleep 1' diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh index 9a40f1e199..8cfdfe790f 100755 --- a/t/t9129-git-svn-i18n-commitencoding.sh +++ b/t/t9129-git-svn-i18n-commitencoding.sh @@ -29,7 +29,7 @@ fi compare_svn_head_with () { # extract just the log message and strip out committer info. # don't use --limit here since svn 1.1.x doesn't have it, - LC_ALL="$a_utf8_locale" svn log `git svn info --url` | "$PERL_PATH" -w -e ' + LC_ALL="$a_utf8_locale" svn log `git svn info --url` | perl -w -e ' use bytes; $/ = ("-"x72) . "\n"; my @x = <STDIN>; diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/t/t9137-git-svn-dcommit-clobber-series.sh index c17aa3186f..d60da63f7a 100755 --- a/t/t9137-git-svn-dcommit-clobber-series.sh +++ b/t/t9137-git-svn-dcommit-clobber-series.sh @@ -20,8 +20,8 @@ test_expect_success '(supposedly) non-conflicting change from SVN' ' test x"`sed -n -e 61p < file`" = x61 && svn_cmd co "$svnrepo" tmp && (cd tmp && - "$PERL_PATH" -i.bak -p -e "s/^58$/5588/" file && - "$PERL_PATH" -i.bak -p -e "s/^61$/6611/" file && + perl -i.bak -p -e "s/^58$/5588/" file && + perl -i.bak -p -e "s/^61$/6611/" file && poke file && test x"`sed -n -e 58p < file`" = x5588 && test x"`sed -n -e 61p < file`" = x6611 && @@ -40,8 +40,8 @@ test_expect_success 'some unrelated changes to git' " test_expect_success 'change file but in unrelated area' " test x\"\`sed -n -e 4p < file\`\" = x4 && test x\"\`sed -n -e 7p < file\`\" = x7 && - "$PERL_PATH" -i.bak -p -e 's/^4\$/4444/' file && - "$PERL_PATH" -i.bak -p -e 's/^7\$/7777/' file && + perl -i.bak -p -e 's/^4\$/4444/' file && + perl -i.bak -p -e 's/^7\$/7777/' file && test x\"\`sed -n -e 4p < file\`\" = x4444 && test x\"\`sed -n -e 7p < file\`\" = x7777 && git commit -m '4 => 4444, 7 => 7777' file && diff --git a/t/t9150/make-svk-dump b/t/t9150/make-svk-dump index 2242f14ebe..2242f14ebe 100644..100755 --- a/t/t9150/make-svk-dump +++ b/t/t9150/make-svk-dump diff --git a/t/t9151/make-svnmerge-dump b/t/t9151/make-svnmerge-dump index e1e138cb1a..e1e138cb1a 100644..100755 --- a/t/t9151/make-svnmerge-dump +++ b/t/t9151/make-svnmerge-dump diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh index 3fb3368903..812c9cd462 100755 --- a/t/t9200-git-cvsexportcommit.sh +++ b/t/t9200-git-cvsexportcommit.sh @@ -5,7 +5,6 @@ test_description='Test export of commits to CVS' . ./test-lib.sh -. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh if ! test_have_prereq PERL; then skip_all='skipping git cvsexportcommit tests, perl not available' diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 88fc407ed6..27263dfb80 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -12,7 +12,7 @@ test_description='test git fast-import utility' # This could be written as "head -c $1", but IRIX "head" does not # support the -c option. head_c () { - "$PERL_PATH" -e ' + perl -e ' my $len = $ARGV[1]; while ($len > 0) { my $s; diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 34c2d8f49a..2312dec8f0 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -429,7 +429,7 @@ test_expect_success 'fast-export quotes pathnames' ' --cacheinfo 100644 $blob "path with \\backslash" \ --cacheinfo 100644 $blob "path with space" && git commit -m addition && - git ls-files -z -s | "$PERL_PATH" -0pe "s{\\t}{$&subdir/}" >index && + git ls-files -z -s | perl -0pe "s{\\t}{$&subdir/}" >index && git read-tree --empty && git update-index -z --index-info <index && git commit -m rename && diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh index 043138631b..3edc4086d8 100755 --- a/t/t9400-git-cvsserver-server.sh +++ b/t/t9400-git-cvsserver-server.sh @@ -20,7 +20,7 @@ then skip_all='skipping git-cvsserver tests, cvs not found' test_done fi -"$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { +perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable' test_done } diff --git a/t/t9401-git-cvsserver-crlf.sh b/t/t9401-git-cvsserver-crlf.sh index 8c3db76301..5a4ed28e49 100755 --- a/t/t9401-git-cvsserver-crlf.sh +++ b/t/t9401-git-cvsserver-crlf.sh @@ -68,7 +68,7 @@ then skip_all='skipping git-cvsserver tests, perl not available' test_done fi -"$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { +perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable' test_done } diff --git a/t/t9402-git-cvsserver-refs.sh b/t/t9402-git-cvsserver-refs.sh index db69af2cff..1e266effff 100755 --- a/t/t9402-git-cvsserver-refs.sh +++ b/t/t9402-git-cvsserver-refs.sh @@ -76,7 +76,7 @@ then skip_all='skipping git-cvsserver tests, perl not available' test_done fi -"$PERL_PATH" -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { +perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || { skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable' test_done } diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh index 718014d5de..e74b9ab1e1 100755 --- a/t/t9500-gitweb-standalone-no-errors.sh +++ b/t/t9500-gitweb-standalone-no-errors.sh @@ -328,7 +328,7 @@ test_expect_success \ git add b && git commit -a -m "On branch" && git checkout master && - git pull . b && + git merge b && git tag merge_commit' test_expect_success \ diff --git a/t/t9700-perl-git.sh b/t/t9700-perl-git.sh index 435d896476..102c133112 100755 --- a/t/t9700-perl-git.sh +++ b/t/t9700-perl-git.sh @@ -11,7 +11,7 @@ if ! test_have_prereq PERL; then test_done fi -"$PERL_PATH" -MTest::More -e 0 2>/dev/null || { +perl -MTest::More -e 0 2>/dev/null || { skip_all="Perl Test::More unavailable, skipping test" test_done } @@ -55,6 +55,6 @@ test_external_has_tap=1 test_external_without_stderr \ 'Perl API' \ - "$PERL_PATH" "$TEST_DIRECTORY"/t9700/test.pl + perl "$TEST_DIRECTORY"/t9700/test.pl test_done diff --git a/t/t9802-git-p4-filetype.sh b/t/t9802-git-p4-filetype.sh index a82744bab0..66d3fc91a7 100755 --- a/t/t9802-git-p4-filetype.sh +++ b/t/t9802-git-p4-filetype.sh @@ -250,6 +250,89 @@ test_expect_success 'ignore apple' ' ) ' +test_expect_success SYMLINKS 'create p4 symlink' ' + cd "$cli" && + ln -s symlink-target symlink && + p4 add symlink && + p4 submit -d "add symlink" +' + +test_expect_success SYMLINKS 'ensure p4 symlink parsed correctly' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot@all && + ( + cd "$git" && + test -L symlink && + test $(readlink symlink) = symlink-target + ) +' + +test_expect_success SYMLINKS 'empty symlink target' ' + ( + # first create the file as a file + cd "$cli" && + >empty-symlink && + p4 add empty-symlink && + p4 submit -d "add empty-symlink as a file" + ) && + ( + # now change it to be a symlink to "target1" + cd "$cli" && + p4 edit empty-symlink && + p4 reopen -t symlink empty-symlink && + rm empty-symlink && + ln -s target1 empty-symlink && + p4 add empty-symlink && + p4 submit -d "make empty-symlink point to target1" + ) && + ( + # Hack the p4 depot to make the symlink point to nothing; + # this should not happen in reality, but shows up + # in p4 repos in the wild. + # + # The sed expression changes this: + # @@ + # text + # @target1 + # @ + # to this: + # @@ + # text + # @@ + # + cd "$db/depot" && + sed "/@target1/{; s/target1/@/; n; d; }" \ + empty-symlink,v >empty-symlink,v.tmp && + mv empty-symlink,v.tmp empty-symlink,v + ) && + ( + # Make sure symlink really is empty. Asking + # p4 to sync here will make it generate errors. + cd "$cli" && + p4 print -q //depot/empty-symlink#2 >out && + test ! -s out + ) && + test_when_finished cleanup_git && + + # make sure git p4 handles it without error + git p4 clone --dest="$git" //depot@all && + + # fix the symlink, make it point to "target2" + ( + cd "$cli" && + p4 open empty-symlink && + rm empty-symlink && + ln -s target2 empty-symlink && + p4 submit -d "make empty-symlink point to target2" + ) && + cleanup_git && + git p4 clone --dest="$git" //depot@all && + ( + cd "$git" && + test $(readlink empty-symlink) = target2 + ) +' + 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 ff2cc79701..89311886db 100755 --- a/t/t9805-git-p4-skip-submit-edit.sh +++ b/t/t9805-git-p4-skip-submit-edit.sh @@ -17,7 +17,7 @@ test_expect_success 'init depot' ' ) ' -# this works because EDITOR is set to : +# this works because P4EDITOR is set to true test_expect_success 'no config, unedited, say yes' ' git p4 clone --dest="$git" //depot && test_when_finished cleanup_git && @@ -90,7 +90,9 @@ test_expect_success 'no config, edited' ' cd "$git" && echo line >>file1 && git commit -a -m "change 5" && - P4EDITOR="" EDITOR="\"$TRASH_DIRECTORY/ed.sh\"" git p4 submit && + P4EDITOR="$TRASH_DIRECTORY/ed.sh" && + export P4EDITOR && + git p4 submit && p4 changes //depot/... >wc && test_line_count = 5 wc ) diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index 1fb7bc7cf9..4caf36e006 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -17,7 +17,7 @@ test_expect_success 'init depot' ' ) ' -test_expect_failure 'is_cli_file_writeable function' ' +test_expect_success 'is_cli_file_writeable function' ' ( cd "$cli" && echo a >a && diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh index 77f63492d9..23a827fa77 100755 --- a/t/t9809-git-p4-client-view.sh +++ b/t/t9809-git-p4-client-view.sh @@ -76,28 +76,28 @@ test_expect_success 'init depot' ' ' # double % for printf -test_expect_success 'unsupported view wildcard %%n' ' +test_expect_success 'view wildcard %%n' ' client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'unsupported view wildcard *' ' +test_expect_success 'view wildcard *' ' client_view "//depot/*/bar/... //client/*/bar/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'wildcard ... only supported at end of spec 1' ' +test_expect_success 'wildcard ... in the middle' ' client_view "//depot/.../file11 //client/.../file11" && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'wildcard ... only supported at end of spec 2' ' +test_expect_success 'wildcard ... in the middle and at the end' ' client_view "//depot/.../a/... //client/.../a/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' test_expect_success 'basic map' ' diff --git a/t/t9810-git-p4-rcs.sh b/t/t9810-git-p4-rcs.sh index 34fbc90005..8134ab439b 100755 --- a/t/t9810-git-p4-rcs.sh +++ b/t/t9810-git-p4-rcs.sh @@ -263,7 +263,7 @@ test_expect_success 'cope with rcs keyword expansion damage' ' git config git-p4.attemptRCSCleanup true && (cd "$cli" && p4_append_to_file kwfile1.c) && old_lines=$(wc -l <kwfile1.c) && - "$PERL_PATH" -n -i -e "print unless m/Revision:/" kwfile1.c && + perl -n -i -e "print unless m/Revision:/" kwfile1.c && new_lines=$(wc -l <kwfile1.c) && test $new_lines = $(($old_lines - 1)) && diff --git a/t/t9812-git-p4-wildcards.sh b/t/t9812-git-p4-wildcards.sh index 67633257f3..c7472cbf54 100755 --- a/t/t9812-git-p4-wildcards.sh +++ b/t/t9812-git-p4-wildcards.sh @@ -161,6 +161,56 @@ test_expect_success 'wildcard files submit back to p4, delete' ' ) ' +test_expect_success 'p4 deleted a wildcard file' ' + ( + cd "$cli" && + echo "wild delete test" >wild@delete && + p4 add -f wild@delete && + p4 submit -d "add wild@delete" + ) && + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + test_path_is_file wild@delete + ) && + ( + cd "$cli" && + # must use its encoded name + p4 delete wild%40delete && + p4 submit -d "delete wild@delete" + ) && + ( + cd "$git" && + git p4 sync && + git merge --ff-only p4/master && + test_path_is_missing wild@delete + ) +' + +test_expect_success 'wildcard files requiring keyword scrub' ' + ( + cd "$cli" && + cat <<-\EOF >scrub@wild && + $Id$ + line2 + EOF + p4 add -t text+k -f scrub@wild && + p4 submit -d "scrub at wild" + ) && + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + git config git-p4.attemptRCSCleanup true && + sed "s/^line2/line2 edit/" <scrub@wild >scrub@wild.tmp && + mv -f scrub@wild.tmp scrub@wild && + git commit -m "scrub at wild line2 edit" scrub@wild && + git p4 submit + ) +' + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9813-git-p4-preserve-users.sh b/t/t9813-git-p4-preserve-users.sh index f2e85e518b..166b840bfa 100755 --- a/t/t9813-git-p4-preserve-users.sh +++ b/t/t9813-git-p4-preserve-users.sh @@ -19,16 +19,6 @@ test_expect_success 'create files' ' ) ' -p4_add_user() { - name=$1 fullname=$2 && - p4 user -f -i <<-EOF && - User: $name - Email: $name@localhost - FullName: $fullname - EOF - p4 passwd -P secret $name -} - p4_grant_admin() { name=$1 && { @@ -51,8 +41,8 @@ make_change_by_user() { # Test username support, submitting as user 'alice' test_expect_success 'preserve users' ' - p4_add_user alice Alice && - p4_add_user bob Bob && + p4_add_user alice && + p4_add_user bob && p4_grant_admin alice && git p4 clone --dest="$git" //depot && test_when_finished cleanup_git && @@ -60,8 +50,8 @@ test_expect_success 'preserve users' ' cd "$git" && echo "username: a change by alice" >>file1 && echo "username: a change by bob" >>file2 && - git commit --author "Alice <alice@localhost>" -m "a change by alice" file1 && - git commit --author "Bob <bob@localhost>" -m "a change by bob" file2 && + git commit --author "Alice <alice@example.com>" -m "a change by alice" file1 && + git commit --author "Bob <bob@example.com>" -m "a change by bob" file2 && git config git-p4.skipSubmitEditCheck true && P4EDITOR=touch P4USER=alice P4PASSWD=secret git p4 commit --preserve-user && p4_check_commit_author file1 alice && @@ -78,7 +68,7 @@ test_expect_success 'refuse to preserve users without perms' ' cd "$git" && git config git-p4.skipSubmitEditCheck true && echo "username-noperms: a change by alice" >>file1 && - git commit --author "Alice <alice@localhost>" -m "perms: a change by alice" file1 && + git commit --author "Alice <alice@example.com>" -m "perms: a change by alice" file1 && P4EDITOR=touch P4USER=bob P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && test_must_fail git p4 commit --preserve-user && @@ -94,9 +84,9 @@ test_expect_success 'preserve user where author is unknown to p4' ' cd "$git" && git config git-p4.skipSubmitEditCheck true && echo "username-bob: a change by bob" >>file1 && - git commit --author "Bob <bob@localhost>" -m "preserve: a change by bob" file1 && + git commit --author "Bob <bob@example.com>" -m "preserve: a change by bob" file1 && echo "username-unknown: a change by charlie" >>file1 && - git commit --author "Charlie <charlie@localhost>" -m "preserve: a change by charlie" file1 && + git commit --author "Charlie <charlie@example.com>" -m "preserve: a change by charlie" file1 && P4EDITOR=touch P4USER=alice P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && test_must_fail git p4 commit --preserve-user && @@ -121,24 +111,24 @@ test_expect_success 'not preserving user with mixed authorship' ' ( cd "$git" && git config git-p4.skipSubmitEditCheck true && - p4_add_user derek Derek && + p4_add_user derek && - make_change_by_user usernamefile3 Derek derek@localhost && + make_change_by_user usernamefile3 Derek derek@example.com && P4EDITOR=cat P4USER=alice P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && git p4 commit |\ - grep "git author derek@localhost does not match" && + grep "git author derek@example.com does not match" && - make_change_by_user usernamefile3 Charlie charlie@localhost && + make_change_by_user usernamefile3 Charlie charlie@example.com && git p4 commit |\ - grep "git author charlie@localhost does not match" && + grep "git author charlie@example.com does not match" && - make_change_by_user usernamefile3 alice alice@localhost && + make_change_by_user usernamefile3 alice alice@example.com && git p4 commit |\ test_must_fail grep "git author.*does not match" && git config git-p4.skipUserNameCheck true && - make_change_by_user usernamefile3 Charlie charlie@localhost && + make_change_by_user usernamefile3 Charlie charlie@example.com && git p4 commit |\ test_must_fail grep "git author.*does not match" && diff --git a/t/t9816-git-p4-locked.sh b/t/t9816-git-p4-locked.sh new file mode 100755 index 0000000000..e71e543343 --- /dev/null +++ b/t/t9816-git-p4-locked.sh @@ -0,0 +1,145 @@ +#!/bin/sh + +test_description='git p4 locked file behavior' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +# See +# http://www.perforce.com/perforce/doc.current/manuals/p4sag/03_superuser.html#1088563 +# for suggestions on how to configure "sitewide pessimistic locking" +# where only one person can have a file open for edit at a time. +test_expect_success 'init depot' ' + ( + cd "$cli" && + echo "TypeMap: +l //depot/..." | p4 typemap -i && + echo file1 >file1 && + p4 add file1 && + p4 submit -d "add file1" + ) +' + +test_expect_success 'edit with lock not taken' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line2 >>file1 && + git add file1 && + git commit -m "line2 in file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) +' + +test_expect_failure 'add with lock not taken' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line1 >>add-lock-not-taken && + git add file2 && + git commit -m "add add-lock-not-taken" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +lock_in_another_client() { + # build a different client + cli2="$TRASH_DIRECTORY/cli2" && + mkdir -p "$cli2" && + test_when_finished "p4 client -f -d client2 && rm -rf \"$cli2\"" && + ( + cd "$cli2" && + P4CLIENT=client2 && + cli="$cli2" && + client_view "//depot/... //client2/..." && + p4 sync && + p4 open file1 + ) +} + +test_expect_failure 'edit with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line3 >>file1 && + git add file1 && + git commit -m "line3 in file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'delete with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git rm file1 && + git commit -m "delete file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'chmod with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + chmod +x file1 && + git add file1 && + git commit -m "chmod +x file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'copy with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 revert file2 && rm -f file2" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + cp file1 file2 && + git add file2 && + git commit -m "cp file1 to file2" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectCopies true && + git p4 submit --verbose + ) +' + +test_expect_failure 'move with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync file1 && rm -f file2" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git mv file1 file2 && + git commit -m "mv file1 to file2" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectRenames true && + git p4 submit --verbose + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index a7e9aacbb2..158e10a67e 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -1,4 +1,5 @@ -#!/bin/sh +# Library of functions shared by all tests scripts, included by +# test-lib.sh. # # Copyright (c) 2005 Junio C Hamano # @@ -31,6 +32,11 @@ test_set_editor () { export EDITOR } +test_set_index_version () { + GIT_INDEX_VERSION="$1" + export GIT_INDEX_VERSION +} + test_decode_color () { awk ' function name(n) { @@ -76,11 +82,11 @@ test_decode_color () { } nul_to_q () { - "$PERL_PATH" -pe 'y/\000/Q/' + perl -pe 'y/\000/Q/' } q_to_nul () { - "$PERL_PATH" -pe 'y/Q/\000/' + perl -pe 'y/Q/\000/' } q_to_cr () { @@ -648,7 +654,7 @@ test_seq () { 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]' -- "$@" + perl -le 'print for $ARGV[0]..$ARGV[1]' -- "$@" } # This function can be used to schedule some commands to be run @@ -710,3 +716,131 @@ test_ln_s_add () { git update-index --add --cacheinfo 120000 $ln_s_obj "$2" fi } + +perl () { + command "$PERL_PATH" "$@" +} + +# Is the value one of the various ways to spell a boolean true/false? +test_normalize_bool () { + git -c magic.variable="$1" config --bool magic.variable 2>/dev/null +} + +# Given a variable $1, normalize the value of it to one of "true", +# "false", or "auto" and store the result to it. +# +# test_tristate GIT_TEST_HTTPD +# +# A variable set to an empty string is set to 'false'. +# A variable set to 'false' or 'auto' keeps its value. +# Anything else is set to 'true'. +# An unset variable defaults to 'auto'. +# +# The last rule is to allow people to set the variable to an empty +# string and export it to decline testing the particular feature +# for versions both before and after this change. We used to treat +# both unset and empty variable as a signal for "do not test" and +# took any non-empty string as "please test". + +test_tristate () { + if eval "test x\"\${$1+isset}\" = xisset" + then + # explicitly set + eval " + case \"\$$1\" in + '') $1=false ;; + auto) ;; + *) $1=\$(test_normalize_bool \$$1 || echo true) ;; + esac + " + else + eval "$1=auto" + fi +} + +# Exit the test suite, either by skipping all remaining tests or by +# exiting with an error. If "$1" is "auto", we then we assume we were +# opportunistically trying to set up some tests and we skip. If it is +# "true", then we report a failure. +# +# The error/skip message should be given by $2. +# +test_skip_or_die () { + case "$1" in + auto) + skip_all=$2 + test_done + ;; + true) + error "$2" + ;; + *) + error "BUG: test tristate is '$1' (real error: $2)" + esac +} + +# The following mingw_* functions obey POSIX shell syntax, but are actually +# bash scripts, and are meant to be used only with bash on Windows. + +# A test_cmp function that treats LF and CRLF equal and avoids to fork +# diff when possible. +mingw_test_cmp () { + # Read text into shell variables and compare them. If the results + # are different, use regular diff to report the difference. + local test_cmp_a= test_cmp_b= + + # When text came from stdin (one argument is '-') we must feed it + # to diff. + local stdin_for_diff= + + # Since it is difficult to detect the difference between an + # empty input file and a failure to read the files, we go straight + # to diff if one of the inputs is empty. + if test -s "$1" && test -s "$2" + then + # regular case: both files non-empty + mingw_read_file_strip_cr_ test_cmp_a <"$1" + mingw_read_file_strip_cr_ test_cmp_b <"$2" + elif test -s "$1" && test "$2" = - + then + # read 2nd file from stdin + mingw_read_file_strip_cr_ test_cmp_a <"$1" + mingw_read_file_strip_cr_ test_cmp_b + stdin_for_diff='<<<"$test_cmp_b"' + elif test "$1" = - && test -s "$2" + then + # read 1st file from stdin + mingw_read_file_strip_cr_ test_cmp_a + mingw_read_file_strip_cr_ test_cmp_b <"$2" + stdin_for_diff='<<<"$test_cmp_a"' + fi + test -n "$test_cmp_a" && + test -n "$test_cmp_b" && + test "$test_cmp_a" = "$test_cmp_b" || + eval "diff -u \"\$@\" $stdin_for_diff" +} + +# $1 is the name of the shell variable to fill in +mingw_read_file_strip_cr_ () { + # Read line-wise using LF as the line separator + # and use IFS to strip CR. + local line + while : + do + if IFS=$'\r' read -r -d $'\n' line + then + # good + line=$line$'\n' + else + # we get here at EOF, but also if the last line + # was not terminated by LF; in the latter case, + # some text was read + if test -z "$line" + then + # EOF, really + break + fi + fi + eval "$1=\$$1\$line" + done +} diff --git a/t/test-lib.sh b/t/test-lib.sh index 0fa7dfde7b..569b52dc0f 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -1,4 +1,4 @@ -#!/bin/sh +# Test framework for git. See t/README for usage. # # Copyright (c) 2005 Junio C Hamano # @@ -26,6 +26,10 @@ then # outside of t/, e.g. for running tests on the test library # itself. TEST_DIRECTORY=$(pwd) +else + # ensure that TEST_DIRECTORY is an absolute path so that it + # is valid even if the current working directory is changed + TEST_DIRECTORY=$(cd "$TEST_DIRECTORY" && pwd) || exit 1 fi if test -z "$TEST_OUTPUT_DIRECTORY" then @@ -104,6 +108,12 @@ export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME export EDITOR +if test -n "${TEST_GIT_INDEX_VERSION:+isset}" +then + GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION" + export GIT_INDEX_VERSION +fi + # 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 || @@ -205,29 +215,17 @@ do --valgrind-only=*) valgrind_only=$(expr "z$1" : 'z[^=]*=\(.*\)') shift ;; - --valgrind-parallel=*) - valgrind_parallel=$(expr "z$1" : 'z[^=]*=\(.*\)') - shift ;; - --valgrind-only-stride=*) - valgrind_only_stride=$(expr "z$1" : 'z[^=]*=\(.*\)') - shift ;; - --valgrind-only-offset=*) - valgrind_only_offset=$(expr "z$1" : 'z[^=]*=\(.*\)') - shift ;; --tee) shift ;; # was handled already --root=*) root=$(expr "z$1" : 'z[^=]*=\(.*\)') shift ;; - --statusprefix=*) - statusprefix=$(expr "z$1" : 'z[^=]*=\(.*\)') - shift ;; *) echo "error: unknown test option '$1'" >&2; exit 1 ;; esac done -if test -n "$valgrind_only" || test -n "$valgrind_only_stride" +if test -n "$valgrind_only" then test -z "$valgrind" && valgrind=memcheck test -z "$verbose" && verbose_only="$valgrind_only" @@ -325,16 +323,16 @@ trap 'die' EXIT . "$TEST_DIRECTORY/test-lib-functions.sh" # You are not expected to call test_ok_ and test_failure_ directly, use -# the text_expect_* functions instead. +# the test_expect_* functions instead. test_ok_ () { test_success=$(($test_success + 1)) - say_color "" "${statusprefix}ok $test_count - $@" + say_color "" "ok $test_count - $@" } test_failure_ () { test_failure=$(($test_failure + 1)) - say_color error "${statusprefix}not ok $test_count - $1" + say_color error "not ok $test_count - $1" shift echo "$@" | sed -e 's/^/# /' test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } @@ -342,12 +340,12 @@ test_failure_ () { test_known_broken_ok_ () { test_fixed=$(($test_fixed+1)) - say_color error "${statusprefix}ok $test_count - $@ # TODO known breakage vanished" + say_color error "ok $test_count - $@ # TODO known breakage vanished" } test_known_broken_failure_ () { test_broken=$(($test_broken+1)) - say_color warn "${statusprefix}not ok $test_count - $@ # TODO known breakage" + say_color warn "not ok $test_count - $@ # TODO known breakage" } test_debug () { @@ -377,9 +375,7 @@ maybe_teardown_verbose () { last_verbose=t maybe_setup_verbose () { test -z "$verbose_only" && return - if match_pattern_list $test_count $verbose_only || - { test -n "$valgrind_only_stride" && - expr $test_count "%" $valgrind_only_stride - $valgrind_only_offset = 0 >/dev/null; } + if match_pattern_list $test_count $verbose_only then exec 4>&2 3>&1 # Emit a delimiting blank line when going from @@ -403,7 +399,7 @@ maybe_teardown_valgrind () { maybe_setup_valgrind () { test -z "$GIT_VALGRIND" && return - if test -z "$valgrind_only" && test -z "$valgrind_only_stride" + if test -z "$valgrind_only" then GIT_VALGRIND_ENABLED=t return @@ -412,10 +408,6 @@ maybe_setup_valgrind () { if match_pattern_list $test_count $valgrind_only then GIT_VALGRIND_ENABLED=t - elif test -n "$valgrind_only_stride" && - expr $test_count "%" $valgrind_only_stride - $valgrind_only_offset = 0 >/dev/null - then - GIT_VALGRIND_ENABLED=t fi } @@ -477,8 +469,8 @@ test_skip () { of_prereq=" of $test_prereq" fi - say_color skip >&3 "${statusprefix}skipping test: $@" - say_color skip "${statusprefix}ok $test_count # skip $1 (missing $missing_prereq${of_prereq})" + say_color skip >&3 "skipping test: $@" + say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})" : true ;; *) @@ -495,8 +487,6 @@ test_at_end_hook_ () { test_done () { GIT_EXIT_OK=t - # Note: t0000 relies on $HARNESS_ACTIVE disabling the .counts - # output file if test -z "$HARNESS_ACTIVE" then test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" @@ -516,11 +506,11 @@ test_done () { if test "$test_fixed" != 0 then - say_color error "${statusprefix}# $test_fixed known breakage(s) vanished; please update test(s)" + say_color error "# $test_fixed known breakage(s) vanished; please update test(s)" fi if test "$test_broken" != 0 then - say_color warn "${statusprefix}# still have $test_broken known breakage(s)" + say_color warn "# still have $test_broken known breakage(s)" fi if test "$test_broken" != 0 || test "$test_fixed" != 0 then @@ -543,9 +533,9 @@ test_done () { then if test $test_remaining -gt 0 then - say_color pass "${statusprefix}# passed all $msg" + say_color pass "# passed all $msg" fi - say "${statusprefix}1..$test_count$skip_all" + say "1..$test_count$skip_all" fi test -d "$remove_trash" && @@ -559,8 +549,8 @@ test_done () { *) if test $test_external_has_tap -eq 0 then - say_color error "${statusprefix}# failed $test_failure among $msg" - say "${statusprefix}1..$test_count" + say_color error "# failed $test_failure among $msg" + say "1..$test_count" fi exit 1 ;; @@ -568,9 +558,6 @@ test_done () { esac } - -# Set up a directory that we can put in PATH which redirects all git -# calls to 'valgrind git ...'. if test -n "$valgrind" then make_symlink () { @@ -594,11 +581,9 @@ then make_valgrind_symlink () { # handle only executables, unless they are shell libraries that - # need to be in the exec-path. We will just use "#!" as a - # guess for a shell-script, since we have no idea what the user - # may have configured as the shell path. + # need to be in the exec-path. test -x "$1" || - test "#!" = "$(head -c 2 <"$1")" || + test "# " = "$(head -c 2 <"$1")" || return; base=$(basename "$1") @@ -618,42 +603,33 @@ then make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit } - # In the case of --valgrind-parallel, we only need to do the - # wrapping once, in the main script. The worker children all - # have $valgrind_only_stride set, so we can skip based on that. - if test -z "$valgrind_only_stride" - then - # override all git executables in TEST_DIRECTORY/.. - GIT_VALGRIND=$TEST_DIRECTORY/valgrind - mkdir -p "$GIT_VALGRIND"/bin - for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-* - do - make_valgrind_symlink $file - done - # special-case the mergetools loadables - make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" - OLDIFS=$IFS - IFS=: - for path in $PATH + # override all git executables in TEST_DIRECTORY/.. + GIT_VALGRIND=$TEST_DIRECTORY/valgrind + mkdir -p "$GIT_VALGRIND"/bin + for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-* + do + make_valgrind_symlink $file + done + # special-case the mergetools loadables + make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" + OLDIFS=$IFS + IFS=: + for path in $PATH + do + ls "$path"/git-* 2> /dev/null | + while read file do - ls "$path"/git-* 2> /dev/null | - while read file - do - make_valgrind_symlink "$file" - done + make_valgrind_symlink "$file" done - IFS=$OLDIFS - fi + done + IFS=$OLDIFS PATH=$GIT_VALGRIND/bin:$PATH GIT_EXEC_PATH=$GIT_VALGRIND/bin export GIT_VALGRIND GIT_VALGRIND_MODE="$valgrind" export GIT_VALGRIND_MODE GIT_VALGRIND_ENABLED=t - if test -n "$valgrind_only" || test -n "$valgrind_only_stride" - then - GIT_VALGRIND_ENABLED= - fi + test -n "$valgrind_only" && GIT_VALGRIND_ENABLED= export GIT_VALGRIND_ENABLED elif test -n "$GIT_TEST_INSTALLED" then @@ -730,41 +706,6 @@ then else mkdir -p "$TRASH_DIRECTORY" fi - -# Gross hack to spawn N sub-instances of the tests in parallel, and -# summarize the results. Note that if this is enabled, the script -# terminates at the end of this 'if' block. -if test -n "$valgrind_parallel" -then - for i in $(test_seq 1 $valgrind_parallel) - do - root="$TRASH_DIRECTORY/vgparallel-$i" - mkdir "$root" - TEST_OUTPUT_DIRECTORY="$root" \ - ${SHELL_PATH} "$0" \ - --root="$root" --statusprefix="[$i] " \ - --valgrind="$valgrind" \ - --valgrind-only-stride="$valgrind_parallel" \ - --valgrind-only-offset="$i" & - pids="$pids $!" - done - trap "kill $pids" INT TERM HUP - wait $pids - trap - INT TERM HUP - for i in $(test_seq 1 $valgrind_parallel) - do - root="$TRASH_DIRECTORY/vgparallel-$i" - eval "$(cat "$root/test-results/$(basename "$0" .sh)"-*.counts | - sed 's/^\([a-z][a-z]*\) \([0-9][0-9]*\)/inner_\1=\2/')" - test_count=$(expr $test_count + $inner_total) - test_success=$(expr $test_success + $inner_success) - test_fixed=$(expr $test_fixed + $inner_fixed) - test_broken=$(expr $test_broken + $inner_broken) - test_failure=$(expr $test_failure + $inner_failed) - done - test_done -fi - # Use -P to resolve symlinks in our working directory so that the cwd # in subprocesses like git equals our $PWD (for pathname comparisons). cd -P "$TRASH_DIRECTORY" || exit 1 @@ -817,6 +758,7 @@ case $(uname -s) in test_set_prereq NOT_CYGWIN test_set_prereq SED_STRIPS_CR test_set_prereq GREP_STRIPS_CR + GIT_TEST_CMP=mingw_test_cmp ;; *CYGWIN*) test_set_prereq POSIXPERM @@ -894,6 +836,10 @@ test_lazy_prereq SYMLINKS ' ln -s x y && test -h y ' +test_lazy_prereq FILEMODE ' + test "$(git config --bool core.filemode)" = true +' + test_lazy_prereq CASE_INSENSITIVE_FS ' echo good >CamelCase && echo bad >camelcase && @@ -86,7 +86,7 @@ int parse_tag_buffer(struct tag *item, const void *data, unsigned long size) return -1; bufptr += 48; /* "object " + sha1 + "\n" */ - if (prefixcmp(bufptr, "type ")) + if (!starts_with(bufptr, "type ")) return -1; bufptr += 5; nl = memchr(bufptr, '\n', tail - bufptr); @@ -109,7 +109,7 @@ int parse_tag_buffer(struct tag *item, const void *data, unsigned long size) item->tagged = NULL; } - if (bufptr + 4 < tail && !prefixcmp(bufptr, "tag ")) + if (bufptr + 4 < tail && starts_with(bufptr, "tag ")) ; /* good */ else return -1; @@ -120,7 +120,7 @@ int parse_tag_buffer(struct tag *item, const void *data, unsigned long size) item->tag = xmemdupz(bufptr, nl - bufptr); bufptr = nl + 1; - if (bufptr + 7 < tail && !prefixcmp(bufptr, "tagger ")) + if (bufptr + 7 < tail && starts_with(bufptr, "tagger ")) item->date = parse_tag_date(bufptr, tail); else item->date = 0; @@ -160,8 +160,8 @@ size_t parse_signature(const char *buf, unsigned long size) { char *eol; size_t len = 0; - while (len < size && prefixcmp(buf + len, PGP_SIGNATURE) && - prefixcmp(buf + len, PGP_MESSAGE)) { + while (len < size && !starts_with(buf + len, PGP_SIGNATURE) && + !starts_with(buf + len, PGP_MESSAGE)) { eol = memchr(buf + len, '\n', size - len); len += eol ? eol - (buf + len) + 1 : size - len; } diff --git a/test-hashmap.c b/test-hashmap.c new file mode 100644 index 0000000000..f5183fb9e8 --- /dev/null +++ b/test-hashmap.c @@ -0,0 +1,255 @@ +#include "git-compat-util.h" +#include "hashmap.h" + +struct test_entry +{ + struct hashmap_entry ent; + /* key and value as two \0-terminated strings */ + char key[FLEX_ARRAY]; +}; + +static const char *get_value(const struct test_entry *e) +{ + return e->key + strlen(e->key) + 1; +} + +static int test_entry_cmp(const struct test_entry *e1, + const struct test_entry *e2, const char* key) +{ + return strcmp(e1->key, key ? key : e2->key); +} + +static int test_entry_cmp_icase(const struct test_entry *e1, + const struct test_entry *e2, const char* key) +{ + return strcasecmp(e1->key, key ? key : e2->key); +} + +static struct test_entry *alloc_test_entry(int hash, char *key, int klen, + char *value, int vlen) +{ + struct test_entry *entry = malloc(sizeof(struct test_entry) + klen + + vlen + 2); + hashmap_entry_init(entry, hash); + memcpy(entry->key, key, klen + 1); + memcpy(entry->key + klen + 1, value, vlen + 1); + return entry; +} + +#define HASH_METHOD_FNV 0 +#define HASH_METHOD_I 1 +#define HASH_METHOD_IDIV10 2 +#define HASH_METHOD_0 3 +#define HASH_METHOD_X2 4 +#define TEST_SPARSE 8 +#define TEST_ADD 16 +#define TEST_SIZE 100000 + +static unsigned int hash(unsigned int method, unsigned int i, const char *key) +{ + unsigned int hash; + switch (method & 3) + { + case HASH_METHOD_FNV: + hash = strhash(key); + break; + case HASH_METHOD_I: + hash = i; + break; + case HASH_METHOD_IDIV10: + hash = i / 10; + break; + case HASH_METHOD_0: + hash = 0; + break; + } + + if (method & HASH_METHOD_X2) + hash = 2 * hash; + return hash; +} + +/* + * Test performance of hashmap.[ch] + * Usage: time echo "perfhashmap method rounds" | test-hashmap + */ +static void perf_hashmap(unsigned int method, unsigned int rounds) +{ + struct hashmap map; + char buf[16]; + struct test_entry **entries; + unsigned int *hashes; + unsigned int i, j; + + entries = malloc(TEST_SIZE * sizeof(struct test_entry *)); + hashes = malloc(TEST_SIZE * sizeof(int)); + for (i = 0; i < TEST_SIZE; i++) { + snprintf(buf, sizeof(buf), "%i", i); + entries[i] = alloc_test_entry(0, buf, strlen(buf), "", 0); + hashes[i] = hash(method, i, entries[i]->key); + } + + if (method & TEST_ADD) { + /* test adding to the map */ + for (j = 0; j < rounds; j++) { + hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0); + + /* add entries */ + for (i = 0; i < TEST_SIZE; i++) { + hashmap_entry_init(entries[i], hashes[i]); + hashmap_add(&map, entries[i]); + } + + hashmap_free(&map, 0); + } + } else { + /* test map lookups */ + hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0); + + /* fill the map (sparsely if specified) */ + j = (method & TEST_SPARSE) ? TEST_SIZE / 10 : TEST_SIZE; + for (i = 0; i < j; i++) { + hashmap_entry_init(entries[i], hashes[i]); + hashmap_add(&map, entries[i]); + } + + for (j = 0; j < rounds; j++) { + for (i = 0; i < TEST_SIZE; i++) { + struct hashmap_entry key; + hashmap_entry_init(&key, hashes[i]); + hashmap_get(&map, &key, entries[i]->key); + } + } + + hashmap_free(&map, 0); + } +} + +#define DELIM " \t\r\n" + +/* + * Read stdin line by line and print result of commands to stdout: + * + * hash key -> strhash(key) memhash(key) strihash(key) memihash(key) + * put key value -> NULL / old value + * get key -> NULL / value + * remove key -> NULL / old value + * iterate -> key1 value1\nkey2 value2\n... + * size -> tablesize numentries + * + * perfhashmap method rounds -> test hashmap.[ch] performance + */ +int main(int argc, char *argv[]) +{ + char line[1024]; + struct hashmap map; + int icase; + + /* init hash map */ + icase = argc > 1 && !strcmp("ignorecase", argv[1]); + hashmap_init(&map, (hashmap_cmp_fn) (icase ? test_entry_cmp_icase + : test_entry_cmp), 0); + + /* process commands from stdin */ + while (fgets(line, sizeof(line), stdin)) { + char *cmd, *p1 = NULL, *p2 = NULL; + int l1 = 0, l2 = 0, hash = 0; + struct test_entry *entry; + + /* break line into command and up to two parameters */ + cmd = strtok(line, DELIM); + /* ignore empty lines */ + if (!cmd || *cmd == '#') + continue; + + p1 = strtok(NULL, DELIM); + if (p1) { + l1 = strlen(p1); + hash = icase ? strihash(p1) : strhash(p1); + p2 = strtok(NULL, DELIM); + if (p2) + l2 = strlen(p2); + } + + if (!strcmp("hash", cmd) && l1) { + + /* print results of different hash functions */ + printf("%u %u %u %u\n", strhash(p1), memhash(p1, l1), + strihash(p1), memihash(p1, l1)); + + } else if (!strcmp("add", cmd) && l1 && l2) { + + /* create entry with key = p1, value = p2 */ + entry = alloc_test_entry(hash, p1, l1, p2, l2); + + /* add to hashmap */ + hashmap_add(&map, entry); + + } else if (!strcmp("put", cmd) && l1 && l2) { + + /* create entry with key = p1, value = p2 */ + entry = alloc_test_entry(hash, p1, l1, p2, l2); + + /* add / replace entry */ + entry = hashmap_put(&map, entry); + + /* print and free replaced entry, if any */ + puts(entry ? get_value(entry) : "NULL"); + free(entry); + + } else if (!strcmp("get", cmd) && l1) { + + /* setup static key */ + struct hashmap_entry key; + hashmap_entry_init(&key, hash); + + /* lookup entry in hashmap */ + entry = hashmap_get(&map, &key, p1); + + /* print result */ + if (!entry) + puts("NULL"); + while (entry) { + puts(get_value(entry)); + entry = hashmap_get_next(&map, entry); + } + + } else if (!strcmp("remove", cmd) && l1) { + + /* setup static key */ + struct hashmap_entry key; + hashmap_entry_init(&key, hash); + + /* remove entry from hashmap */ + entry = hashmap_remove(&map, &key, p1); + + /* print result and free entry*/ + puts(entry ? get_value(entry) : "NULL"); + free(entry); + + } else if (!strcmp("iterate", cmd)) { + + struct hashmap_iter iter; + hashmap_iter_init(&map, &iter); + while ((entry = hashmap_iter_next(&iter))) + printf("%s %s\n", entry->key, get_value(entry)); + + } else if (!strcmp("size", cmd)) { + + /* print table sizes */ + printf("%u %u\n", map.tablesize, map.size); + + } else if (!strcmp("perfhashmap", cmd) && l1 && l2) { + + perf_hashmap(atoi(p1), atoi(p2)); + + } else { + + printf("Unknown command %s\n", cmd); + + } + } + + hashmap_free(&map, 1); + return 0; +} diff --git a/test-line-buffer.c b/test-line-buffer.c index ef1d7bae14..1e58f0476f 100644 --- a/test-line-buffer.c +++ b/test-line-buffer.c @@ -19,7 +19,7 @@ static void handle_command(const char *command, const char *arg, struct line_buf { switch (*command) { case 'b': - if (!prefixcmp(command, "binary ")) { + if (starts_with(command, "binary ")) { struct strbuf sb = STRBUF_INIT; strbuf_addch(&sb, '>'); buffer_read_binary(buf, &sb, strtouint32(arg)); @@ -28,12 +28,12 @@ static void handle_command(const char *command, const char *arg, struct line_buf return; } case 'c': - if (!prefixcmp(command, "copy ")) { + if (starts_with(command, "copy ")) { buffer_copy_bytes(buf, strtouint32(arg)); return; } case 's': - if (!prefixcmp(command, "skip ")) { + if (starts_with(command, "skip ")) { buffer_skip_bytes(buf, strtouint32(arg)); return; } diff --git a/test-string-list.c b/test-string-list.c index 00ce6c9a12..14bdf9d215 100644 --- a/test-string-list.c +++ b/test-string-list.c @@ -38,7 +38,7 @@ static void write_list_compact(const struct string_list *list) static int prefix_cb(struct string_list_item *item, void *cb_data) { const char *prefix = (const char *)cb_data; - return !prefixcmp(item->string, prefix); + return starts_with(item->string, prefix); } int main(int argc, char **argv) diff --git a/test-wildmatch.c b/test-wildmatch.c index a3e2643fbc..578b164fe6 100644 --- a/test-wildmatch.c +++ b/test-wildmatch.c @@ -1,85 +1,8 @@ -#ifdef USE_WILDMATCH -#undef USE_WILDMATCH /* We need real fnmatch implementation here */ -#endif #include "cache.h" -#include "wildmatch.h" - -static int perf(int ac, char **av) -{ - struct timeval tv1, tv2; - struct stat st; - int fd, i, n, flags1 = 0, flags2 = 0; - char *buffer, *p; - uint32_t usec1, usec2; - const char *lang; - const char *file = av[0]; - const char *pattern = av[1]; - - lang = getenv("LANG"); - if (lang && strcmp(lang, "C")) - die("Please test it on C locale."); - - if ((fd = open(file, O_RDONLY)) == -1 || fstat(fd, &st)) - die_errno("file open"); - - buffer = xmalloc(st.st_size + 2); - if (read(fd, buffer, st.st_size) != st.st_size) - die_errno("read"); - - buffer[st.st_size] = '\0'; - buffer[st.st_size + 1] = '\0'; - for (i = 0; i < st.st_size; i++) - if (buffer[i] == '\n') - buffer[i] = '\0'; - - n = atoi(av[2]); - if (av[3] && !strcmp(av[3], "pathname")) { - flags1 = WM_PATHNAME; - flags2 = FNM_PATHNAME; - } - - gettimeofday(&tv1, NULL); - for (i = 0; i < n; i++) { - for (p = buffer; *p; p += strlen(p) + 1) - wildmatch(pattern, p, flags1, NULL); - } - gettimeofday(&tv2, NULL); - - usec1 = (uint32_t)tv2.tv_sec * 1000000 + tv2.tv_usec; - usec1 -= (uint32_t)tv1.tv_sec * 1000000 + tv1.tv_usec; - printf("wildmatch %ds %dus\n", - (int)(usec1 / 1000000), - (int)(usec1 % 1000000)); - - gettimeofday(&tv1, NULL); - for (i = 0; i < n; i++) { - for (p = buffer; *p; p += strlen(p) + 1) - fnmatch(pattern, p, flags2); - } - gettimeofday(&tv2, NULL); - - usec2 = (uint32_t)tv2.tv_sec * 1000000 + tv2.tv_usec; - usec2 -= (uint32_t)tv1.tv_sec * 1000000 + tv1.tv_usec; - if (usec2 > usec1) - printf("fnmatch %ds %dus or %.2f%% slower\n", - (int)((usec2 - usec1) / 1000000), - (int)((usec2 - usec1) % 1000000), - (float)(usec2 - usec1) / usec1 * 100); - else - printf("fnmatch %ds %dus or %.2f%% faster\n", - (int)((usec1 - usec2) / 1000000), - (int)((usec1 - usec2) % 1000000), - (float)(usec1 - usec2) / usec1 * 100); - return 0; -} int main(int argc, char **argv) { int i; - - if (!strcmp(argv[1], "perf")) - return perf(argc - 2, argv + 2); - for (i = 2; i < argc; i++) { if (argv[i][0] == '/') die("Forward slash is not allowed at the beginning of the\n" @@ -93,8 +16,6 @@ int main(int argc, char **argv) return !!wildmatch(argv[3], argv[2], WM_PATHNAME | WM_CASEFOLD, NULL); else if (!strcmp(argv[1], "pathmatch")) return !!wildmatch(argv[3], argv[2], 0, NULL); - else if (!strcmp(argv[1], "fnmatch")) - return !!fnmatch(argv[3], argv[2], FNM_PATHNAME); else return 1; } @@ -76,7 +76,7 @@ static void trace_vprintf(const char *key, const char *fmt, va_list ap) } __attribute__((format (printf, 2, 3))) -static void trace_printf_key(const char *key, const char *fmt, ...) +void trace_printf_key(const char *key, const char *fmt, ...) { va_list ap; va_start(ap, fmt); diff --git a/transport-helper.c b/transport-helper.c index 705dce7e04..86e1679c1e 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -190,7 +190,7 @@ static struct child_process *get_helper(struct transport *transport) data->export = 1; else if (!strcmp(capname, "check-connectivity")) data->check_connectivity = 1; - else if (!data->refspecs && !prefixcmp(capname, "refspec ")) { + else if (!data->refspecs && starts_with(capname, "refspec ")) { ALLOC_GROW(refspecs, refspec_nr + 1, refspec_alloc); @@ -199,17 +199,17 @@ static struct child_process *get_helper(struct transport *transport) data->connect = 1; } else if (!strcmp(capname, "signed-tags")) { data->signed_tags = 1; - } else if (!prefixcmp(capname, "export-marks ")) { + } else if (starts_with(capname, "export-marks ")) { struct strbuf arg = STRBUF_INIT; strbuf_addstr(&arg, "--export-marks="); strbuf_addstr(&arg, capname + strlen("export-marks ")); data->export_marks = strbuf_detach(&arg, NULL); - } else if (!prefixcmp(capname, "import-marks")) { + } else if (starts_with(capname, "import-marks")) { struct strbuf arg = STRBUF_INIT; strbuf_addstr(&arg, "--import-marks="); strbuf_addstr(&arg, capname + strlen("import-marks ")); data->import_marks = strbuf_detach(&arg, NULL); - } else if (!prefixcmp(capname, "no-private-update")) { + } else if (starts_with(capname, "no-private-update")) { data->no_private_update = 1; } else if (mandatory) { die("Unknown mandatory capability %s. This remote " @@ -269,6 +269,7 @@ static const char *unsupported_options[] = { TRANS_OPT_THIN, TRANS_OPT_KEEP }; + static const char *boolean_options[] = { TRANS_OPT_THIN, TRANS_OPT_KEEP, @@ -310,7 +311,7 @@ static int set_helper_option(struct transport *transport, if (!strcmp(buf.buf, "ok")) ret = 0; - else if (!prefixcmp(buf.buf, "error")) { + else if (starts_with(buf.buf, "error")) { ret = -1; } else if (!strcmp(buf.buf, "unsupported")) ret = 1; @@ -359,6 +360,12 @@ static int fetch_with_fetch(struct transport *transport, data->transport_options.check_self_contained_and_connected) set_helper_option(transport, "check-connectivity", "true"); + if (transport->cloning) + set_helper_option(transport, "cloning", "true"); + + if (data->transport_options.update_shallow) + set_helper_option(transport, "update-shallow", "true"); + for (i = 0; i < nr_heads; i++) { const struct ref *posn = to_fetch[i]; if (posn->status & REF_STATUS_UPTODATE) @@ -374,7 +381,7 @@ static int fetch_with_fetch(struct transport *transport, while (1) { recvline(data, &buf); - if (!prefixcmp(buf.buf, "lock ")) { + if (starts_with(buf.buf, "lock ")) { const char *name = buf.buf + 5; if (transport->pack_lockfile) warning("%s also locked %s", data->name, name); @@ -645,10 +652,10 @@ static int push_update_ref_status(struct strbuf *buf, char *refname, *msg; int status, forced = 0; - if (!prefixcmp(buf->buf, "ok ")) { + if (starts_with(buf->buf, "ok ")) { status = REF_STATUS_OK; refname = buf->buf + 3; - } else if (!prefixcmp(buf->buf, "error ")) { + } else if (starts_with(buf->buf, "error ")) { status = REF_STATUS_REMOTE_REJECT; refname = buf->buf + 6; } else @@ -1137,9 +1144,8 @@ static int udt_do_write(struct unidirectional_transfer *t) return 0; /* Nothing to write. */ transfer_debug("%s is writable", t->dest_name); - bytes = write(t->dest, t->buf, t->bufuse); - if (bytes < 0 && errno != EWOULDBLOCK && errno != EAGAIN && - errno != EINTR) { + bytes = xwrite(t->dest, t->buf, t->bufuse); + if (bytes < 0 && errno != EWOULDBLOCK) { error("write(%s) failed: %s", t->dest_name, strerror(errno)); return -1; } else if (bytes > 0) { diff --git a/transport.c b/transport.c index 7202b7777d..ca7bb441bf 100644 --- a/transport.c +++ b/transport.c @@ -14,6 +14,7 @@ #include "url.h" #include "submodule.h" #include "string-list.h" +#include "sha1-array.h" /* rsync support */ @@ -169,13 +170,13 @@ static void set_upstreams(struct transport *transport, struct ref *refs, remotename = ref->name; tmp = resolve_ref_unsafe(localname, sha, 1, &flag); if (tmp && flag & REF_ISSYMREF && - !prefixcmp(tmp, "refs/heads/")) + starts_with(tmp, "refs/heads/")) localname = tmp; /* Both source and destination must be local branches. */ - if (!localname || prefixcmp(localname, "refs/heads/")) + if (!localname || !starts_with(localname, "refs/heads/")) continue; - if (!remotename || prefixcmp(remotename, "refs/heads/")) + if (!remotename || !starts_with(remotename, "refs/heads/")) continue; if (!pretend) @@ -191,7 +192,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs, static const char *rsync_url(const char *url) { - return prefixcmp(url, "rsync://") ? skip_prefix(url, "rsync:") : url; + return !starts_with(url, "rsync://") ? skip_prefix(url, "rsync:") : url; } static struct ref *get_refs_via_rsync(struct transport *transport, int for_push) @@ -296,8 +297,8 @@ static int write_one_ref(const char *name, const unsigned char *sha1, FILE *f; /* when called via for_each_ref(), flags is non-zero */ - if (flags && prefixcmp(name, "refs/heads/") && - prefixcmp(name, "refs/tags/")) + if (flags && !starts_with(name, "refs/heads/") && + !starts_with(name, "refs/tags/")) return 0; strbuf_addstr(buf, name); @@ -454,7 +455,8 @@ struct git_transport_data { struct child_process *conn; int fd[2]; unsigned got_remote_heads : 1; - struct extra_have_objects extra_have; + struct sha1_array extra_have; + struct sha1_array shallow; }; static int set_git_option(struct git_transport_options *opts, @@ -475,6 +477,9 @@ static int set_git_option(struct git_transport_options *opts, } else if (!strcmp(name, TRANS_OPT_KEEP)) { opts->keep = !!value; return 0; + } else if (!strcmp(name, TRANS_OPT_UPDATE_SHALLOW)) { + opts->update_shallow = !!value; + return 0; } else if (!strcmp(name, TRANS_OPT_DEPTH)) { if (!value) opts->depth = 0; @@ -511,7 +516,9 @@ static struct ref *get_refs_via_connect(struct transport *transport, int for_pus connect_setup(transport, for_push, 0); get_remote_heads(data->fd[0], NULL, 0, &refs, - for_push ? REF_NORMAL : 0, &data->extra_have); + for_push ? REF_NORMAL : 0, + &data->extra_have, + &data->shallow); data->got_remote_heads = 1; return refs; @@ -538,16 +545,19 @@ static int fetch_refs_via_pack(struct transport *transport, args.depth = data->options.depth; args.check_self_contained_and_connected = data->options.check_self_contained_and_connected; + args.cloning = transport->cloning; + args.update_shallow = data->options.update_shallow; if (!data->got_remote_heads) { connect_setup(transport, 0, 0); - get_remote_heads(data->fd[0], NULL, 0, &refs_tmp, 0, NULL); + get_remote_heads(data->fd[0], NULL, 0, &refs_tmp, 0, + NULL, &data->shallow); data->got_remote_heads = 1; } refs = fetch_pack(&args, data->fd, data->conn, refs_tmp ? refs_tmp : transport->remote_refs, - dest, to_fetch, nr_heads, + dest, to_fetch, nr_heads, &data->shallow, &transport->pack_lockfile); close(data->fd[0]); close(data->fd[1]); @@ -652,7 +662,7 @@ static void print_ok_ref_status(struct ref *ref, int porcelain) print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain); else if (is_null_sha1(ref->old_sha1)) print_ref_status('*', - (!prefixcmp(ref->name, "refs/tags/") ? "[new tag]" : + (starts_with(ref->name, "refs/tags/") ? "[new tag]" : "[new branch]"), ref, ref->peer_ref, NULL, porcelain); else { @@ -713,6 +723,10 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i print_ref_status('!', "[rejected]", ref, ref->peer_ref, "stale info", porcelain); break; + case REF_STATUS_REJECT_SHALLOW: + print_ref_status('!', "[rejected]", ref, ref->peer_ref, + "new shallow roots not allowed", porcelain); + break; case REF_STATUS_REMOTE_REJECT: print_ref_status('!', "[remote rejected]", ref, ref->deletion ? NULL : ref->peer_ref, @@ -805,7 +819,8 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re struct ref *tmp_refs; connect_setup(transport, 1, 0); - get_remote_heads(data->fd[0], NULL, 0, &tmp_refs, REF_NORMAL, NULL); + get_remote_heads(data->fd[0], NULL, 0, &tmp_refs, REF_NORMAL, + NULL, &data->shallow); data->got_remote_heads = 1; } @@ -885,14 +900,6 @@ void transport_take_over(struct transport *transport, transport->cannot_reuse = 1; } -static int is_local(const char *url) -{ - const char *colon = strchr(url, ':'); - const char *slash = strchr(url, '/'); - return !colon || (slash && slash < colon) || - has_dos_drive_prefix(url); -} - static int is_file(const char *url) { struct stat buf; @@ -930,18 +937,18 @@ struct transport *transport_get(struct remote *remote, const char *url) while (is_urlschemechar(p == url, *p)) p++; - if (!prefixcmp(p, "::")) + if (starts_with(p, "::")) helper = xstrndup(url, p - url); } if (helper) { transport_helper_init(ret, helper); - } else if (!prefixcmp(url, "rsync:")) { + } else if (starts_with(url, "rsync:")) { ret->get_refs_list = get_refs_via_rsync; ret->fetch = fetch_objs_via_rsync; ret->push = rsync_transport_push; ret->smart_options = NULL; - } else if (is_local(url) && is_file(url) && is_bundle(url, 1)) { + } else if (url_is_local_not_ssh(url) && is_file(url) && is_bundle(url, 1)) { struct bundle_transport_data *data = xcalloc(1, sizeof(*data)); ret->data = data; ret->get_refs_list = get_refs_from_bundle; @@ -949,11 +956,11 @@ struct transport *transport_get(struct remote *remote, const char *url) ret->disconnect = close_bundle; ret->smart_options = NULL; } else if (!is_url(url) - || !prefixcmp(url, "file://") - || !prefixcmp(url, "git://") - || !prefixcmp(url, "ssh://") - || !prefixcmp(url, "git+ssh://") - || !prefixcmp(url, "ssh+git://")) { + || starts_with(url, "file://") + || starts_with(url, "git://") + || starts_with(url, "ssh://") + || starts_with(url, "git+ssh://") + || starts_with(url, "ssh+git://")) { /* These are builtin smart transports. */ struct git_transport_data *data = xcalloc(1, sizeof(*data)); ret->data = data; @@ -1297,7 +1304,7 @@ char *transport_anonymize_url(const char *url) size_t anon_len, prefix_len = 0; anon_part = strchr(url, '@'); - if (is_local(url) || !anon_part) + if (url_is_local_not_ssh(url) || !anon_part) goto literal_copy; anon_len = strlen(++anon_part); diff --git a/transport.h b/transport.h index 8f96bed775..02ea248db1 100644 --- a/transport.h +++ b/transport.h @@ -11,6 +11,7 @@ struct git_transport_options { unsigned followtags : 1; unsigned check_self_contained_and_connected : 1; unsigned self_contained_and_connected : 1; + unsigned update_shallow : 1; int depth; const char *uploadpack; const char *receivepack; @@ -35,6 +36,12 @@ struct transport { */ unsigned cannot_reuse : 1; + /* + * A hint from caller that it will be performing a clone, not + * normal fetch. IOW the repository is guaranteed empty. + */ + unsigned cloning : 1; + /** * Returns 0 if successful, positive if the option is not * recognized or is inapplicable, and negative if the option @@ -146,6 +153,9 @@ struct transport *transport_get(struct remote *, const char *); /* Aggressively fetch annotated tags if possible */ #define TRANS_OPT_FOLLOWTAGS "followtags" +/* Accept refs that may update .git/shallow without --depth */ +#define TRANS_OPT_UPDATE_SHALLOW "updateshallow" + /** * Returns 0 if the option was used, non-zero otherwise. Prints a * message to stderr if the option is not used. @@ -193,10 +203,4 @@ void transport_print_push_status(const char *dest, struct ref *refs, typedef void alternate_ref_fn(const struct ref *, void *); extern void for_each_alternate_ref(alternate_ref_fn, void *); - -struct send_pack_args; -extern int send_pack(struct send_pack_args *args, - int fd[], struct child_process *conn, - struct ref *remote_refs, - struct extra_have_objects *extra_have); #endif diff --git a/tree-diff.c b/tree-diff.c index ccf9d7c8fd..11c3550177 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -254,7 +254,9 @@ static void try_to_follow_renames(struct tree_desc *t1, struct tree_desc *t2, co path[0] = p->one->path; path[1] = NULL; free_pathspec(&opt->pathspec); - parse_pathspec(&opt->pathspec, PATHSPEC_ALL_MAGIC, 0, "", path); + parse_pathspec(&opt->pathspec, + PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL, + PATHSPEC_LITERAL_PATH, "", path); /* * The caller expects us to return a set of vanilla @@ -292,14 +294,10 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha unsigned long size1, size2; int retval; - tree1 = read_object_with_reference(old, tree_type, &size1, NULL); - if (!tree1) - die("unable to read source tree (%s)", sha1_to_hex(old)); - tree2 = read_object_with_reference(new, tree_type, &size2, NULL); - if (!tree2) - die("unable to read destination tree (%s)", sha1_to_hex(new)); - init_tree_desc(&t1, tree1, size1); - init_tree_desc(&t2, tree2, size2); + tree1 = fill_tree_descriptor(&t1, old); + tree2 = fill_tree_descriptor(&t2, new); + size1 = t1.size; + size2 = t2.size; retval = diff_tree(&t1, &t2, base, opt); if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) { init_tree_desc(&t1, tree1, size1); @@ -313,18 +311,5 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt) { - int retval; - void *tree; - unsigned long size; - struct tree_desc empty, real; - - tree = read_object_with_reference(new, tree_type, &size, NULL); - if (!tree) - die("unable to read root tree (%s)", sha1_to_hex(new)); - init_tree_desc(&real, tree, size); - - init_tree_desc(&empty, "", 0); - retval = diff_tree(&empty, &real, base, opt); - free(tree); - return retval; + return diff_tree_sha1(NULL, new, base, opt); } diff --git a/tree-walk.c b/tree-walk.c index 5ece8c3477..4dc86c7fe5 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -37,7 +37,7 @@ static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned /* Initialize the descriptor entry */ desc->entry.path = path; - desc->entry.mode = mode; + desc->entry.mode = canon_mode(mode); desc->entry.sha1 = (const unsigned char *)(path + len); } @@ -543,7 +543,7 @@ static int match_entry(const struct pathspec_item *item, if (matchlen > pathlen) { if (match[pathlen] != '/') return 0; - if (!S_ISDIR(entry->mode)) + if (!S_ISDIR(entry->mode) && !S_ISGITLINK(entry->mode)) return 0; } @@ -662,9 +662,10 @@ static int match_wildcard_base(const struct pathspec_item *item, * Pre-condition: either baselen == base_offset (i.e. empty path) * or base[baselen-1] == '/' (i.e. with trailing slash). */ -enum interesting tree_entry_interesting(const struct name_entry *entry, - struct strbuf *base, int base_offset, - const struct pathspec *ps) +static enum interesting do_match(const struct name_entry *entry, + struct strbuf *base, int base_offset, + const struct pathspec *ps, + int exclude) { int i; int pathlen, baselen = base->len - base_offset; @@ -676,7 +677,8 @@ enum interesting tree_entry_interesting(const struct name_entry *entry, PATHSPEC_MAXDEPTH | PATHSPEC_LITERAL | PATHSPEC_GLOB | - PATHSPEC_ICASE); + PATHSPEC_ICASE | + PATHSPEC_EXCLUDE); if (!ps->nr) { if (!ps->recursive || @@ -697,6 +699,10 @@ enum interesting tree_entry_interesting(const struct name_entry *entry, const char *base_str = base->buf + base_offset; int matchlen = item->len, matched = 0; + if ((!exclude && item->magic & PATHSPEC_EXCLUDE) || + ( exclude && !(item->magic & PATHSPEC_EXCLUDE))) + continue; + if (baselen >= matchlen) { /* If it doesn't match, move along... */ if (!match_dir_prefix(item, base_str, match, matchlen)) @@ -743,7 +749,7 @@ match_wildcards: if (item->nowildcard_len && !match_wildcard_base(item, base_str, baselen, &matched)) - return entry_not_interesting; + continue; /* * Concatenate base and entry->path into one and do @@ -782,3 +788,72 @@ match_wildcards: } return never_interesting; /* No matches */ } + +/* + * Is a tree entry interesting given the pathspec we have? + * + * Pre-condition: either baselen == base_offset (i.e. empty path) + * or base[baselen-1] == '/' (i.e. with trailing slash). + */ +enum interesting tree_entry_interesting(const struct name_entry *entry, + struct strbuf *base, int base_offset, + const struct pathspec *ps) +{ + enum interesting positive, negative; + positive = do_match(entry, base, base_offset, ps, 0); + + /* + * case | entry | positive | negative | result + * -----+-------+----------+----------+------- + * 1 | file | -1 | -1..2 | -1 + * 2 | file | 0 | -1..2 | 0 + * 3 | file | 1 | -1 | 1 + * 4 | file | 1 | 0 | 1 + * 5 | file | 1 | 1 | 0 + * 6 | file | 1 | 2 | 0 + * 7 | file | 2 | -1 | 2 + * 8 | file | 2 | 0 | 2 + * 9 | file | 2 | 1 | 0 + * 10 | file | 2 | 2 | -1 + * -----+-------+----------+----------+------- + * 11 | dir | -1 | -1..2 | -1 + * 12 | dir | 0 | -1..2 | 0 + * 13 | dir | 1 | -1 | 1 + * 14 | dir | 1 | 0 | 1 + * 15 | dir | 1 | 1 | 1 (*) + * 16 | dir | 1 | 2 | 0 + * 17 | dir | 2 | -1 | 2 + * 18 | dir | 2 | 0 | 2 + * 19 | dir | 2 | 1 | 1 (*) + * 20 | dir | 2 | 2 | -1 + * + * (*) An exclude pattern interested in a directory does not + * necessarily mean it will exclude all of the directory. In + * wildcard case, it can't decide until looking at individual + * files inside. So don't write such directories off yet. + */ + + if (!(ps->magic & PATHSPEC_EXCLUDE) || + positive <= entry_not_interesting) /* #1, #2, #11, #12 */ + return positive; + + negative = do_match(entry, base, base_offset, ps, 1); + + /* #3, #4, #7, #8, #13, #14, #17, #18 */ + if (negative <= entry_not_interesting) + return positive; + + /* #15, #19 */ + if (S_ISDIR(entry->mode) && + positive >= entry_interesting && + negative == entry_interesting) + return entry_interesting; + + if ((positive == entry_interesting && + negative >= entry_interesting) || /* #5, #6, #16 */ + (positive == all_entries_interesting && + negative == entry_interesting)) /* #9 */ + return entry_not_interesting; + + return all_entries_not_interesting; /* #10, #20 */ +} diff --git a/tree-walk.h b/tree-walk.h index ae04b6417d..ae7fb3a824 100644 --- a/tree-walk.h +++ b/tree-walk.h @@ -16,7 +16,7 @@ struct tree_desc { static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep) { *pathp = desc->entry.path; - *modep = canon_mode(desc->entry.mode); + *modep = desc->entry.mode; return desc->entry.sha1; } diff --git a/unpack-trees.c b/unpack-trees.c index 35cb05e92b..97fc995467 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -105,12 +105,11 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, static void do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce, unsigned int set, unsigned int clear) { - clear |= CE_HASHED | CE_UNHASHED; + clear |= CE_HASHED; if (set & CE_REMOVE) set |= CE_WT_REMOVE; - ce->next = NULL; ce->ce_flags = (ce->ce_flags & ~clear) | set; add_index_entry(&o->result, ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); @@ -204,7 +203,7 @@ static int check_updates(struct unpack_trees_options *o) total++; } - progress = start_progress_delay("Checking out files", + progress = start_progress_delay(_("Checking out files"), total, 50, 1); cnt = 0; } @@ -830,23 +829,24 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str } static int clear_ce_flags_1(struct cache_entry **cache, int nr, - char *prefix, int prefix_len, + struct strbuf *prefix, int select_mask, int clear_mask, struct exclude_list *el, int defval); /* Whole directory matching */ static int clear_ce_flags_dir(struct cache_entry **cache, int nr, - char *prefix, int prefix_len, + struct strbuf *prefix, char *basename, int select_mask, int clear_mask, struct exclude_list *el, int defval) { struct cache_entry **cache_end; int dtype = DT_DIR; - int ret = is_excluded_from_list(prefix, prefix_len, + int ret = is_excluded_from_list(prefix->buf, prefix->len, basename, &dtype, el); + int rc; - prefix[prefix_len++] = '/'; + strbuf_addch(prefix, '/'); /* If undecided, use matching result of parent dir in defval */ if (ret < 0) @@ -854,7 +854,7 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr, for (cache_end = cache; cache_end != cache + nr; cache_end++) { struct cache_entry *ce = *cache_end; - if (strncmp(ce->name, prefix, prefix_len)) + if (strncmp(ce->name, prefix->buf, prefix->len)) break; } @@ -865,10 +865,12 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr, * calling clear_ce_flags_1(). That function will call * the expensive is_excluded_from_list() on every entry. */ - return clear_ce_flags_1(cache, cache_end - cache, - prefix, prefix_len, - select_mask, clear_mask, - el, ret); + rc = clear_ce_flags_1(cache, cache_end - cache, + prefix, + select_mask, clear_mask, + el, ret); + strbuf_setlen(prefix, prefix->len - 1); + return rc; } /* @@ -887,7 +889,7 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr, * Top level path has prefix_len zero. */ static int clear_ce_flags_1(struct cache_entry **cache, int nr, - char *prefix, int prefix_len, + struct strbuf *prefix, int select_mask, int clear_mask, struct exclude_list *el, int defval) { @@ -907,10 +909,10 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr, continue; } - if (prefix_len && strncmp(ce->name, prefix, prefix_len)) + if (prefix->len && strncmp(ce->name, prefix->buf, prefix->len)) break; - name = ce->name + prefix_len; + name = ce->name + prefix->len; slash = strchr(name, '/'); /* If it's a directory, try whole directory match first */ @@ -918,29 +920,26 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr, int processed; len = slash - name; - memcpy(prefix + prefix_len, name, len); + strbuf_add(prefix, name, len); - /* - * terminate the string (no trailing slash), - * clear_c_f_dir needs it - */ - prefix[prefix_len + len] = '\0'; processed = clear_ce_flags_dir(cache, cache_end - cache, - prefix, prefix_len + len, - prefix + prefix_len, + prefix, + prefix->buf + prefix->len - len, select_mask, clear_mask, el, defval); /* clear_c_f_dir eats a whole dir already? */ if (processed) { cache += processed; + strbuf_setlen(prefix, prefix->len - len); continue; } - prefix[prefix_len + len++] = '/'; + strbuf_addch(prefix, '/'); cache += clear_ce_flags_1(cache, cache_end - cache, - prefix, prefix_len + len, + prefix, select_mask, clear_mask, el, defval); + strbuf_setlen(prefix, prefix->len - len - 1); continue; } @@ -961,9 +960,12 @@ static int clear_ce_flags(struct cache_entry **cache, int nr, int select_mask, int clear_mask, struct exclude_list *el) { - char prefix[PATH_MAX]; + static struct strbuf prefix = STRBUF_INIT; + + strbuf_reset(&prefix); + return clear_ce_flags_1(cache, nr, - prefix, 0, + &prefix, select_mask, clear_mask, el, 0); } @@ -1763,14 +1765,23 @@ int twoway_merge(const struct cache_entry * const *src, newtree = NULL; if (current) { - if ((!oldtree && !newtree) || /* 4 and 5 */ - (!oldtree && newtree && - same(current, newtree)) || /* 6 and 7 */ - (oldtree && newtree && - same(oldtree, newtree)) || /* 14 and 15 */ - (oldtree && newtree && - !same(oldtree, newtree) && /* 18 and 19 */ - same(current, newtree))) { + if (current->ce_flags & CE_CONFLICTED) { + if (same(oldtree, newtree) || o->reset) { + if (!newtree) + return deleted_entry(current, current, o); + else + return merged_entry(newtree, current, o); + } + return o->gently ? -1 : reject_merge(current, o); + } + else if ((!oldtree && !newtree) || /* 4 and 5 */ + (!oldtree && newtree && + same(current, newtree)) || /* 6 and 7 */ + (oldtree && newtree && + same(oldtree, newtree)) || /* 14 and 15 */ + (oldtree && newtree && + !same(oldtree, newtree) && /* 18 and 19 */ + same(current, newtree))) { return keep_entry(current, o); } else if (oldtree && !newtree && same(current, oldtree)) { diff --git a/upload-pack.c b/upload-pack.c index a6c54e06bb..9314c250ff 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -84,7 +84,7 @@ static void create_pack_file(void) char *shallow_file = NULL; if (shallow_nr) { - shallow_file = setup_temporary_shallow(); + shallow_file = setup_temporary_shallow(NULL); argv[arg++] = "--shallow-file"; argv[arg++] = shallow_file; } @@ -394,7 +394,7 @@ static int get_common_commits(void) got_other = 0; continue; } - if (!prefixcmp(line, "have ")) { + if (starts_with(line, "have ")) { switch (got_sha1(line+5, sha1)) { case -1: /* they have what we do not */ got_other = 1; @@ -540,7 +540,7 @@ static void receive_needs(void) if (!line) break; - if (!prefixcmp(line, "shallow ")) { + if (starts_with(line, "shallow ")) { unsigned char sha1[20]; struct object *object; if (get_sha1_hex(line + 8, sha1)) @@ -556,14 +556,14 @@ static void receive_needs(void) } continue; } - if (!prefixcmp(line, "deepen ")) { + if (starts_with(line, "deepen ")) { char *end; depth = strtol(line + 7, &end, 0); if (end == line + 7 || depth <= 0) die("Invalid deepen: %s", line); continue; } - if (prefixcmp(line, "want ") || + if (!starts_with(line, "want ") || get_sha1_hex(line+5, sha1_buf)) die("git upload-pack: protocol error, " "expected to get sha, not '%s'", line); @@ -619,7 +619,7 @@ static void receive_needs(void) if (depth > 0) { struct commit_list *result = NULL, *backup = NULL; int i; - if (depth == INFINITE_DEPTH) + if (depth == INFINITE_DEPTH && !is_repository_shallow()) for (i = 0; i < shallows.nr; i++) { struct object *object = shallows.objects[i].item; object->flags |= NOT_SHALLOW; @@ -649,8 +649,7 @@ static void receive_needs(void) /* make sure the real parents are parsed */ unregister_shallow(object->sha1); object->parsed = 0; - if (parse_commit((struct commit *)object)) - die("invalid commit"); + parse_commit_or_die((struct commit *)object); parents = ((struct commit *)object)->parents; while (parents) { add_object_array(&parents->item->object, @@ -689,6 +688,16 @@ static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag return 0; } +static void format_symref_info(struct strbuf *buf, struct string_list *symref) +{ + struct string_list_item *item; + + if (!symref->nr) + return; + for_each_string_list_item(item, symref) + strbuf_addf(buf, " symref=%s:%s", item->string, (char *)item->util); +} + static int send_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { static const char *capabilities = "multi_ack thin-pack side-band" @@ -697,35 +706,64 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo const char *refname_nons = strip_namespace(refname); unsigned char peeled[20]; - if (mark_our_ref(refname, sha1, flag, cb_data)) + if (mark_our_ref(refname, sha1, flag, NULL)) return 0; - if (capabilities) - packet_write(1, "%s %s%c%s%s%s agent=%s\n", + if (capabilities) { + struct strbuf symref_info = STRBUF_INIT; + + format_symref_info(&symref_info, cb_data); + packet_write(1, "%s %s%c%s%s%s%s agent=%s\n", sha1_to_hex(sha1), refname_nons, 0, capabilities, allow_tip_sha1_in_want ? " allow-tip-sha1-in-want" : "", stateless_rpc ? " no-done" : "", + symref_info.buf, git_user_agent_sanitized()); - else + strbuf_release(&symref_info); + } else { packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname_nons); + } capabilities = NULL; if (!peel_ref(refname, peeled)) packet_write(1, "%s %s^{}\n", sha1_to_hex(peeled), refname_nons); return 0; } +static int find_symref(const char *refname, const unsigned char *sha1, int flag, + void *cb_data) +{ + const char *symref_target; + struct string_list_item *item; + unsigned char unused[20]; + + if ((flag & REF_ISSYMREF) == 0) + return 0; + symref_target = resolve_ref_unsafe(refname, unused, 0, &flag); + if (!symref_target || (flag & REF_ISSYMREF) == 0) + die("'%s' is a symref but it is not?", refname); + item = string_list_append(cb_data, refname); + item->util = xstrdup(symref_target); + return 0; +} + static void upload_pack(void) { + struct string_list symref = STRING_LIST_INIT_DUP; + + head_ref_namespaced(find_symref, &symref); + if (advertise_refs || !stateless_rpc) { reset_timeout(); - head_ref_namespaced(send_ref, NULL); - for_each_namespaced_ref(send_ref, NULL); + head_ref_namespaced(send_ref, &symref); + for_each_namespaced_ref(send_ref, &symref); + advertise_shallow_grafts(1); packet_flush(1); } else { head_ref_namespaced(mark_our_ref, NULL); for_each_namespaced_ref(mark_our_ref, NULL); } + string_list_clear(&symref, 1); if (advertise_refs) return; @@ -758,7 +796,7 @@ int main(int argc, char **argv) packet_trace_identity("upload-pack"); git_extract_argv0_path(argv[0]); - read_replace_refs = 0; + check_replace_refs = 0; for (i = 1; i < argc; i++) { char *arg = argv[i]; @@ -777,7 +815,7 @@ int main(int argc, char **argv) strict = 1; continue; } - if (!prefixcmp(arg, "--timeout=")) { + if (starts_with(arg, "--timeout=")) { timeout = atoi(arg+10); daemon_mode = 1; continue; @@ -797,8 +835,7 @@ int main(int argc, char **argv) if (!enter_repo(dir, strict)) die("'%s' does not appear to be a git repository", dir); - if (is_repository_shallow()) - die("attempt to fetch/clone from a shallow repository"); + git_config(upload_pack_config, NULL); upload_pack(); return 0; diff --git a/userdiff.c b/userdiff.c index ea43a0306f..10b61ec37d 100644 --- a/userdiff.c +++ b/userdiff.c @@ -15,13 +15,13 @@ static int drivers_alloc; word_regex "|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+" } static struct userdiff_driver builtin_drivers[] = { IPATTERN("ada", - "!^(.*[ \t])?(is new|renames|is separate)([ \t].*)?$\n" + "!^(.*[ \t])?(is[ \t]+new|renames|is[ \t]+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]" + "|[-+]?[0-9][0-9#_.aAbBcCdDeEfF]*([eE][+-]?[0-9_]+)?" "|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"), IPATTERN("fortran", "!^([C*]|[ \t]*!)\n" @@ -5,8 +5,8 @@ /* This code is originally from http://www.cl.cam.ac.uk/~mgk25/ucs/ */ struct interval { - int first; - int last; + ucs_char_t first; + ucs_char_t last; }; size_t display_mode_esc_sequence_len(const char *s) @@ -529,7 +529,7 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs while (1) { size_t cnt = iconv(conv, &cp, &insz, &outpos, &outsz); - if (cnt == -1) { + if (cnt == (size_t) -1) { size_t sofar; if (errno != E2BIG) { free(out); diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c index f2b23c81de..bd0f2c2b86 100644 --- a/vcs-svn/fast_export.c +++ b/vcs-svn/fast_export.c @@ -162,22 +162,13 @@ static void die_short_read(struct line_buffer *input) die("invalid dump: unexpected end of file"); } -static int ends_with(const char *s, size_t len, const char *suffix) -{ - const size_t suffixlen = strlen(suffix); - if (len < suffixlen) - return 0; - return !memcmp(s + len - suffixlen, suffix, suffixlen); -} - static int parse_cat_response_line(const char *header, off_t *len) { - size_t headerlen = strlen(header); uintmax_t n; const char *type; const char *end; - if (ends_with(header, headerlen, " missing")) + if (ends_with(header, " missing")) return error("cat-blob reports missing blob: %s", header); type = strstr(header, " blob "); if (!type) @@ -133,7 +133,7 @@ void *xcalloc(size_t nmemb, size_t size) /* * Limit size of IO chunks, because huge chunks only cause pain. OS X * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in - * the absense of bugs, large chunks can result in bad latencies when + * the absence of bugs, large chunks can result in bad latencies when * you decide to kill the process. */ #define MAX_IO_SIZE (8*1024*1024) diff --git a/wt-status.c b/wt-status.c index b4e44baa29..a452407dad 100644 --- a/wt-status.c +++ b/wt-status.c @@ -15,6 +15,10 @@ #include "submodule.h" #include "column.h" #include "strbuf.h" +#include "utf8.h" + +static char cut_line[] = +"------------------------ >8 ------------------------\n"; static char default_wt_status_colors[][COLOR_MAXLEN] = { GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */ @@ -264,6 +268,30 @@ static void wt_status_print_unmerged_data(struct wt_status *s, strbuf_release(&onebuf); } +static const char *wt_status_diff_status_string(int status) +{ + switch (status) { + case DIFF_STATUS_ADDED: + return _("new file"); + case DIFF_STATUS_COPIED: + return _("copied"); + case DIFF_STATUS_DELETED: + return _("deleted"); + case DIFF_STATUS_MODIFIED: + return _("modified"); + case DIFF_STATUS_RENAMED: + return _("renamed"); + case DIFF_STATUS_TYPE_CHANGED: + return _("typechange"); + case DIFF_STATUS_UNKNOWN: + return _("unknown"); + case DIFF_STATUS_UNMERGED: + return _("unmerged"); + default: + return NULL; + } +} + static void wt_status_print_change_data(struct wt_status *s, int change_type, struct string_list_item *it) @@ -276,6 +304,23 @@ static void wt_status_print_change_data(struct wt_status *s, const char *one, *two; struct strbuf onebuf = STRBUF_INIT, twobuf = STRBUF_INIT; struct strbuf extra = STRBUF_INIT; + static char *padding; + const char *what; + int len; + + if (!padding) { + int width = 0; + /* If DIFF_STATUS_* uses outside this range, we're in trouble */ + for (status = 'A'; status <= 'Z'; status++) { + what = wt_status_diff_status_string(status); + len = what ? strlen(what) : 0; + if (len > width) + width = len; + } + width += 2; /* colon and a space */ + padding = xmallocz(width); + memset(padding, ' ', width); + } one_name = two_name = it->string; switch (change_type) { @@ -307,34 +352,18 @@ static void wt_status_print_change_data(struct wt_status *s, two = quote_path(two_name, s->prefix, &twobuf); status_printf(s, color(WT_STATUS_HEADER, s), "\t"); - switch (status) { - case DIFF_STATUS_ADDED: - status_printf_more(s, c, _("new file: %s"), one); - break; - case DIFF_STATUS_COPIED: - status_printf_more(s, c, _("copied: %s -> %s"), one, two); - break; - case DIFF_STATUS_DELETED: - status_printf_more(s, c, _("deleted: %s"), one); - break; - case DIFF_STATUS_MODIFIED: - status_printf_more(s, c, _("modified: %s"), one); - break; - case DIFF_STATUS_RENAMED: - status_printf_more(s, c, _("renamed: %s -> %s"), one, two); - break; - case DIFF_STATUS_TYPE_CHANGED: - status_printf_more(s, c, _("typechange: %s"), one); - break; - case DIFF_STATUS_UNKNOWN: - status_printf_more(s, c, _("unknown: %s"), one); - break; - case DIFF_STATUS_UNMERGED: - status_printf_more(s, c, _("unmerged: %s"), one); - break; - default: + what = wt_status_diff_status_string(status); + if (!what) die(_("bug: unhandled diff status %c"), status); - } + /* 1 for colon, which is not part of "what" */ + len = strlen(padding) - (utf8_strwidth(what) + 1); + assert(len >= 0); + if (status == DIFF_STATUS_COPIED || status == DIFF_STATUS_RENAMED) + status_printf_more(s, c, "%s:%.*s%s -> %s", + what, len, padding, one, two); + else + status_printf_more(s, c, "%s:%.*s%s", + what, len, padding, one); if (extra.len) { status_printf_more(s, color(WT_STATUS_HEADER, s), "%s", extra.buf); strbuf_release(&extra); @@ -481,7 +510,7 @@ static void wt_status_collect_changes_initial(struct wt_status *s) struct wt_status_change_data *d; const struct cache_entry *ce = active_cache[i]; - if (!ce_path_match(ce, &s->pathspec)) + if (!ce_path_match(ce, &s->pathspec, NULL)) continue; it = string_list_insert(&s->change, ce->name); d = it->util; @@ -523,7 +552,7 @@ static void wt_status_collect_untracked(struct wt_status *s) for (i = 0; i < dir.nr; i++) { struct dir_entry *ent = dir.entries[i]; if (cache_name_is_other(ent->name, ent->len) && - match_pathspec_depth(&s->pathspec, ent->name, ent->len, 0, NULL)) + dir_path_match(ent, &s->pathspec, 0, NULL)) string_list_insert(&s->untracked, ent->name); free(ent); } @@ -531,7 +560,7 @@ static void wt_status_collect_untracked(struct wt_status *s) for (i = 0; i < dir.ignored_nr; i++) { struct dir_entry *ent = dir.ignored[i]; if (cache_name_is_other(ent->name, ent->len) && - match_pathspec_depth(&s->pathspec, ent->name, ent->len, 0, NULL)) + dir_path_match(ent, &s->pathspec, 0, NULL)) string_list_insert(&s->ignored, ent->name); free(ent); } @@ -767,6 +796,18 @@ conclude: status_printf_ln(s, GIT_COLOR_NORMAL, ""); } +void wt_status_truncate_message_at_cut_line(struct strbuf *buf) +{ + const char *p; + struct strbuf pattern = STRBUF_INIT; + + strbuf_addf(&pattern, "%c %s", comment_line_char, cut_line); + p = strstr(buf->buf, pattern.buf); + if (p && (p == buf->buf || p[-1] == '\n')) + strbuf_setlen(buf, p - buf->buf); + strbuf_release(&pattern); +} + static void wt_status_print_verbose(struct wt_status *s) { struct rev_info rev; @@ -787,10 +828,20 @@ static void wt_status_print_verbose(struct wt_status *s) * If we're not going to stdout, then we definitely don't * want color, since we are going to the commit message * file (and even the "auto" setting won't work, since it - * will have checked isatty on stdout). + * will have checked isatty on stdout). But we then do want + * to insert the scissor line here to reliably remove the + * diff before committing. */ - if (s->fp != stdout) + if (s->fp != stdout) { + const char *explanation = _("Do not touch the line above.\nEverything below will be removed."); + struct strbuf buf = STRBUF_INIT; + rev.diffopt.use_color = 0; + fprintf(s->fp, "%c %s", comment_line_char, cut_line); + strbuf_add_commented_lines(&buf, explanation, strlen(explanation)); + fputs(buf.buf, s->fp); + strbuf_release(&buf); + } run_diff_index(&rev, 1); } @@ -803,7 +854,7 @@ static void wt_status_print_tracking(struct wt_status *s) int i; assert(s->branch && !s->is_initial); - if (prefixcmp(s->branch, "refs/heads/")) + if (!starts_with(s->branch, "refs/heads/")) return; branch = branch_get(s->branch + 11); if (!format_tracking_info(branch, &sb)) @@ -1062,9 +1113,9 @@ static char *read_and_strip_branch(const char *path) strbuf_setlen(&sb, sb.len - 1); if (!sb.len) goto got_nothing; - if (!prefixcmp(sb.buf, "refs/heads/")) + if (starts_with(sb.buf, "refs/heads/")) strbuf_remove(&sb,0, strlen("refs/heads/")); - else if (!prefixcmp(sb.buf, "refs/")) + else if (starts_with(sb.buf, "refs/")) ; else if (!get_sha1_hex(sb.buf, sha1)) { const char *abbrev; @@ -1094,7 +1145,7 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1, struct grab_1st_switch_cbdata *cb = cb_data; const char *target = NULL, *end; - if (prefixcmp(message, "checkout: moving from ")) + if (!starts_with(message, "checkout: moving from ")) return 0; message += strlen("checkout: moving from "); target = strstr(message, " to "); @@ -1129,9 +1180,9 @@ static void wt_status_get_detached_from(struct wt_status_state *state) ((commit = lookup_commit_reference_gently(sha1, 1)) != NULL && !hashcmp(cb.nsha1, commit->object.sha1)))) { int ofs; - if (!prefixcmp(ref, "refs/tags/")) + if (starts_with(ref, "refs/tags/")) ofs = strlen("refs/tags/"); - else if (!prefixcmp(ref, "refs/remotes/")) + else if (starts_with(ref, "refs/remotes/")) ofs = strlen("refs/remotes/"); else ofs = 0; @@ -1220,7 +1271,7 @@ void wt_status_print(struct wt_status *s) if (s->branch) { const char *on_what = _("On branch "); const char *branch_name = s->branch; - if (!prefixcmp(branch_name, "refs/heads/")) + if (starts_with(branch_name, "refs/heads/")) branch_name += 11; else if (!strcmp(branch_name, "HEAD")) { branch_status_color = color(WT_STATUS_NOBRANCH, s); @@ -1421,7 +1472,7 @@ static void wt_shortstatus_print_tracking(struct wt_status *s) return; branch_name = s->branch; - if (!prefixcmp(branch_name, "refs/heads/")) + if (starts_with(branch_name, "refs/heads/")) branch_name += 11; else if (!strcmp(branch_name, "HEAD")) { branch_name = _("HEAD (no branch)"); diff --git a/wt-status.h b/wt-status.h index 6c29e6f5e5..30a4812583 100644 --- a/wt-status.h +++ b/wt-status.h @@ -91,6 +91,7 @@ struct wt_status_state { unsigned char cherry_pick_head_sha1[20]; }; +void wt_status_truncate_message_at_cut_line(struct strbuf *); void wt_status_prepare(struct wt_status *s); void wt_status_print(struct wt_status *s); void wt_status_collect(struct wt_status *s); diff --git a/xdiff/xemit.c b/xdiff/xemit.c index 4d8645867e..4266ada23f 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -108,7 +108,7 @@ static long def_ff(const char *rec, long len, char *buf, long sz, void *priv) { if (len > 0 && (isalpha((unsigned char)*rec) || /* identifier? */ - *rec == '_' || /* also identifier? */ + *rec == '_' || /* also identifier? */ *rec == '$')) { /* identifiers from VMS and other esoterico */ if (len > sz) len = sz; |