diff options
165 files changed, 9962 insertions, 5767 deletions
diff --git a/.travis.yml b/.travis.yml index 37a1e1fb6d..9a65514d82 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,7 @@ env: - LINUX_GIT_LFS_VERSION="1.2.0" - DEFAULT_TEST_TARGET=prove - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save" - - GIT_TEST_OPTS="--verbose --tee" + - GIT_TEST_OPTS="--verbose-log" - GIT_TEST_HTTPD=true - GIT_TEST_CLONE_2GB=YesPlease # t9810 occasionally fails on Travis CI OS X diff --git a/Documentation/RelNotes/2.10.2.txt b/Documentation/RelNotes/2.10.2.txt index ed2de0dc20..c4d4397023 100644 --- a/Documentation/RelNotes/2.10.2.txt +++ b/Documentation/RelNotes/2.10.2.txt @@ -41,5 +41,71 @@ Fixes since v2.10.1 that were detected without dying itself, but under some conditions it didn't and died instead, which has been fixed. + * When "git fetch" tries to find where the history of the repository + it runs in has diverged from what the other side has, it has a + mechanism to avoid digging too deep into irrelevant side branches. + This however did not work well over the "smart-http" transport due + to a design bug, which has been fixed. + + * When we started cURL to talk to imap server when a new enough + version of cURL library is available, we forgot to explicitly add + imap(s):// before the destination. To some folks, that didn't work + and the library tried to make HTTP(s) requests instead. + + * The ./configure script generated from configure.ac was taught how + to detect support of SSL by libcurl better. + + * http.emptyauth configuration is a way to allow an empty username to + pass when attempting to authenticate using mechanisms like + Kerberos. We took an unspecified (NULL) username and sent ":" + (i.e. no username, no password) to CURLOPT_USERPWD, but did not do + the same when the username is explicitly set to an empty string. + + * "git clone" of a local repository can be done at the filesystem + level, but the codepath did not check errors while copying and + adjusting the file that lists alternate object stores. + + * Documentation for "git commit" was updated to clarify that "commit + -p <paths>" adds to the current contents of the index to come up + with what to commit. + + * A stray symbolic link in $GIT_DIR/refs/ directory could make name + resolution loop forever, which has been corrected. + + * The "submodule.<name>.path" stored in .gitmodules is never copied + to .git/config and such a key in .git/config has no meaning, but + the documentation described it and submodule.<name>.url next to + each other as if both belong to .git/config. This has been fixed. + + * Recent git allows submodule.<name>.branch to use a special token + "." instead of the branch name; the documentation has been updated + to describe it. + + * In a worktree connected to a repository elsewhere, created via "git + worktree", "git checkout" attempts to protect users from confusion + by refusing to check out a branch that is already checked out in + another worktree. However, this also prevented checking out a + branch, which is designated as the primary branch of a bare + reopsitory, in a worktree that is connected to the bare + repository. The check has been corrected to allow it. + + * "git rebase" immediately after "git clone" failed to find the fork + point from the upstream. + + * When fetching from a remote that has many tags that are irrelevant + to branches we are following, we used to waste way too many cycles + when checking if the object pointed at by a tag (that we are not + going to fetch!) exists in our repository too carefully. + + * The Travis CI configuration we ship ran the tests with --verbose + option but this risks non-TAP output that happens to be "ok" to be + misinterpreted as TAP signalling a test that passed. This resulted + in unnecessary failure. This has been corrected by introducing a + new mode to run our tests in the test harness to send the verbose + output separately to the log file. + + * Some AsciiDoc formatter mishandles a displayed illustration with + tabs in it. Adjust a few of them in merge-base documentation to + work around them. Also contains minor documentation updates and code clean-ups. diff --git a/Documentation/RelNotes/2.11.0.txt b/Documentation/RelNotes/2.11.0.txt index 8608e86e4e..3590620000 100644 --- a/Documentation/RelNotes/2.11.0.txt +++ b/Documentation/RelNotes/2.11.0.txt @@ -1,11 +1,37 @@ Git 2.11 Release Notes ====================== +Backward compatibility notes. + + * An empty string used as a pathspec element has always meant + 'everything matches', but it is too easy to write a script that + finds a path to remove in $path and run 'git rm "$paht"', which + ends up removing everything. This release starts warning about the + use of an empty string that is used for 'everything matches' and + asks users to use a more explicit '.' for that instead. + + The hope is that existing users will not mind this change, and + eventually the warning can be turned into a hard error, upgrading + the deprecation into removal of this (mis)feature. + + * The historical argument order "git merge <msg> HEAD <commit>..." + has been deprecated for quite some time, and will be removed in the + next release (not this one). + + * The default abbreviation length, which has historically been 7, now + scales as the repository grows, using the approximate number of + objects in the reopsitory and a bit of math around the birthday + paradox. The logic suggests to use 12 hexdigits for the Linux + kernel, and 9 to 10 for Git itself. + + Updates since v2.10 ------------------- UI, Workflows & Features + * Comes with new version of git-gui, now at its 0.21.0 tag. + * "git format-patch --cover-letter HEAD^" to format a single patch with a separate cover letter now numbers the output as [PATCH 0/1] and [PATCH 1/1] by default. @@ -86,6 +112,38 @@ UI, Workflows & Features to selectively allow enabling this. (merge 26a7b23429 ps/http-gssapi-cred-delegation later to maint). + * "git mergetool" learned to honor "-O<orderfile>" to control the + order of paths to present to the end user. + + * "git diff/log --ws-error-highlight=<kind>" lacked the corresponding + configuration variable to set it by default. + + * "git ls-files" learned "--recurse-submodules" option that can be + used to get a listing of tracked files across submodules (i.e. this + only works with "--cached" option, not for listing untracked or + ignored files). This would be a useful tool to sit on the upstream + side of a pipe that is read with xargs to work on all working tree + files from the top-level superproject. + + * A new credential helper that talks via "libsecret" with + implementations of XDG Secret Service API has been added to + contrib/credential/. + + * The GPG verification status shown in "%G?" pretty format specifier + was not rich enough to differentiate a signature made by an expired + key, a signature made by a revoked key, etc. New output letters + have been assigned to express them. + + * In addition to purely abbreviated commit object names, "gitweb" + learned to turn "git describe" output (e.g. v2.9.3-599-g2376d31787) + into clickable links in its output. + + * When new paths were added by "git add -N" to the index, it was + enough to circumvent the check by "git commit" to refrain from + making an empty commit without "--allow-empty". The same logic + prevented "git status" to show such a path as "new file" in the + "Changes not staged for commit" section. + Performance, Internal Implementation, Development Support etc. @@ -143,6 +201,35 @@ Performance, Internal Implementation, Development Support etc. packfile first. (merge c9af708b1a jk/pack-objects-optim-mru later to maint). + * Codepaths involved in interacting alternate object store have + been cleaned up. + + * In order for the receiving end of "git push" to inspect the + received history and decide to reject the push, the objects sent + from the sending end need to be made available to the hook and + the mechanism for the connectivity check, and this was done + traditionally by storing the objects in the receiving repository + and letting "git gc" to expire it. Instead, store the newly + received objects in a temporary area, and make them available by + reusing the alternate object store mechanism to them only while we + decide if we accept the check, and once we decide, either migrate + them to the repository or purge them immediately. + + * The require_clean_work_tree() helper was recreated in C when "git + pull" was rewritten from shell; the helper is now made available to + other callers in preparation for upcoming "rebase -i" work. + + * "git upload-pack" had its code cleaned-up and performance improved + by reducing use of timestamp-ordered commit-list, which was + replaced with a priority queue. + + * "git diff --no-index" codepath has been updated not to try to peek + into .git/ directory that happens to be under the current + directory, when we know we are operating outside any repository. + + * Update of the sequencer codebase to make it reusable to reimplement + "rebase -i" continues. + Also contains various documentation updates and code clean-ups. @@ -219,7 +306,6 @@ notes for details). include the body of the entire current function up to the header line of the next one. This process may have to merge to adjacent hunks, but the code forgot to do so in some cases. - (merge 45d2f75 rs/xdiff-merge-overlapping-hunks-for-W-context later to maint). * Performance tests done via "t/perf" did not use the same set of build configuration if the user relied on autoconf generated @@ -231,7 +317,6 @@ notes for details). has been moved above the signature line. * More i18n. - (merge 43073f8 va/i18n later to maint). * Even when "git pull --rebase=preserve" (and the underlying "git rebase --preserve") can complete without creating any new commit @@ -256,7 +341,7 @@ notes for details). * The pretty-format specifier "%C(auto)" used by the "log" family of commands to enable coloring of the output is taught to also issue a color-reset sequence to the output. - (merge c99ad27 rs/c-auto-resets-attributes later to maint). + (merge 82b83da8d3 rs/c-auto-resets-attributes later to maint). * A shell script example in check-ref-format documentation has been fixed. @@ -273,7 +358,7 @@ notes for details). beyond the end of the mapped region. This was fixed by introducing a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND extension. - (merge b7d36ff js/regexec-buf later to maint). + (merge 842a516cb0 js/regexec-buf later to maint). * The procedure to build Git on Mac OS X for Travis CI hardcoded the internal directory structure we assumed HomeBrew uses, which was a @@ -292,7 +377,6 @@ notes for details). * A low-level function verify_packfile() was meant to show errors that were detected without dying itself, but under some conditions it didn't and died instead, which has been fixed. - (merge a9445d859e jk/verify-packfile-gently later to maint). * When "git fetch" tries to find where the history of the repository it runs in has diverged from what the other side has, it has a @@ -309,7 +393,6 @@ notes for details). ought to be affected by core.abbrev configuration variable, ignored the variable setting. The command has been taught to read the default set of configuration variables to correct this. - (merge d49028e6e7 jc/worktree-config later to maint). * "git init" tried to record core.worktree in the repository's 'config' file when GIT_WORK_TREE environment variable was set and @@ -322,36 +405,29 @@ notes for details). validating what they are reading is a proper object file and sometimes read past the data they read from the disk, which has been corrected. H/t to Gustavo Grieco for reporting. - (merge d21f842690 jc/verify-loose-object-header later to maint). * The original command line syntax for "git merge", which was "git merge <msg> HEAD <parent>...", has been deprecated for quite some time, and "git gui" was the last in-tree user of the syntax. This is finally fixed, so that we can move forward with the deprecation. - (merge ff65e796f0 rs/git-gui-use-modern-git-merge-syntax later to maint). * An author name, that spelled a backslash-quoted double quote in the human readable part "My \"double quoted\" name", was not unquoted correctly while applying a patch from a piece of e-mail. - (merge f357e5de31 kd/mailinfo-quoted-string later to maint). * Doc update to clarify what "log -3 --reverse" does. - (merge 04be69478f pb/rev-list-reverse-with-count later to maint). * Almost everybody uses DEFAULT_ABBREV to refer to the default setting for the abbreviation, but "git blame" peeked into underlying variable bypassing the macro for no good reason. - (merge 5293284b4d jc/blame-abbrev later to maint). * The "graph" API used in "git log --graph" miscounted the number of output columns consumed so far when drawing a padding line, which has been fixed; this did not affect any existing code as nobody tried to write anything after the padding on such a line, though. - (merge 1647793524 jk/graph-padding-fix later to maint). * The code that parses the format parameter of for-each-ref command has seen a micro-optimization. - (merge e94ce1394e sg/ref-filter-parse-optim later to maint). * When we started cURL to talk to imap server when a new enough version of cURL library is available, we forgot to explicitly add @@ -383,7 +459,105 @@ notes for details). commit. (merge e1d09701a4 jc/blame-reverse later to maint). + * http.emptyauth configuration is a way to allow an empty username to + pass when attempting to authenticate using mechanisms like + Kerberos. We took an unspecified (NULL) username and sent ":" + (i.e. no username, no password) to CURLOPT_USERPWD, but did not do + the same when the username is explicitly set to an empty string. + (merge 5275c3081c dt/http-empty-auth later to maint). + + * "git clone" of a local repository can be done at the filesystem + level, but the codepath did not check errors while copying and + adjusting the file that lists alternate object stores. + (merge 22d3b8de1b jk/clone-copy-alternates-fix later to maint). + + * Documentation for "git commit" was updated to clarify that "commit + -p <paths>" adds to the current contents of the index to come up + with what to commit. + (merge 7431596ab1 nd/commit-p-doc later to maint). + + * A stray symbolic link in $GIT_DIR/refs/ directory could make name + resolution loop forever, which has been corrected. + (merge e8c42cb9ce jk/ref-symlink-loop later to maint). + + * The "submodule.<name>.path" stored in .gitmodules is never copied + to .git/config and such a key in .git/config has no meaning, but + the documentation described it and submodule.<name>.url next to + each other as if both belong to .git/config. This has been fixed. + (merge 72710165c9 sb/submodule-config-doc-drop-path later to maint). + + * In a worktree connected to a repository elsewhere, created via "git + worktree", "git checkout" attempts to protect users from confusion + by refusing to check out a branch that is already checked out in + another worktree. However, this also prevented checking out a + branch, which is designated as the primary branch of a bare + reopsitory, in a worktree that is connected to the bare + repository. The check has been corrected to allow it. + (merge 171c646f8c dk/worktree-dup-checkout-with-bare-is-ok later to maint). + + * "git rebase" immediately after "git clone" failed to find the fork + point from the upstream. + (merge 4f21454b55 jk/merge-base-fork-point-without-reflog later to maint). + + * When fetching from a remote that has many tags that are irrelevant + to branches we are following, we used to waste way too many cycles + when checking if the object pointed at by a tag (that we are not + going to fetch!) exists in our repository too carefully. + (merge 5827a03545 jk/fetch-quick-tag-following later to maint). + + * Protect our code from over-eager compilers. + (merge 0ac52a38e8 jk/tighten-alloc later to maint). + + * Recent git allows submodule.<name>.branch to use a special token + "." instead of the branch name; the documentation has been updated + to describe it. + (merge 15ef78008a bw/submodule-branch-dot-doc later to maint). + + * A hot-fix for a test added by a recent topic that went to both + 'master' and 'maint' already. + (merge 76e368c378 tg/add-chmod+x-fix later to maint). + + * "git send-email" attempts to pick up valid e-mails from the + trailers, but people in real world write non-addresses there, like + "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending + on the availability and vintage of Mail::Address perl module. + (merge dcfafc5214 mm/send-email-cc-cruft-after-address later to maint). + + * The Travis CI configuration we ship ran the tests with --verbose + option but this risks non-TAP output that happens to be "ok" to be + misinterpreted as TAP signalling a test that passed. This resulted + in unnecessary failure. This has been corrected by introducing a + new mode to run our tests in the test harness to send the verbose + output separately to the log file. + (merge 614fe01521 jk/tap-verbose-fix later to maint). + + * Some AsciiDoc formatter mishandles a displayed illustration with + tabs in it. Adjust a few of them in merge-base documentation to + work around them. + (merge 6750f62699 po/fix-doc-merge-base-illustration later to maint). + + * A minor regression fix for "git submodule" that was introduced + when more helper functions were reimplemented in C. + (merge 77b63ac31e sb/submodule-ignore-trailing-slash later to maint). + + * The code that we have used for the past 10+ years to cycle + 4-element ring buffers turns out to be not quite portable in + theoretical world. + (merge bb84735c80 rs/ring-buffer-wraparound later to maint). + + * "git daemon" used fixed-length buffers to turn URL to the + repository the client asked for into the server side directory + path, using snprintf() to avoid overflowing these buffers, but + allowed possibly truncated paths to the directory. This has been + tightened to reject such a request that causes overlong path to be + required to serve. + (merge 6bdb0083be jk/daemon-path-ok-check-truncation later to maint). + * Other minor doc, test and build updates and code cleanups. - (merge a22ae75 rs/cocci later to maint). - (merge 45ccef87b3 rs/copy-array later to maint). - (merge 8201688ecd dt/mailinfo later to maint). + (merge a94bb68397 rs/cocci later to maint). + (merge 641c900b2c js/reset-usage later to maint). + (merge 30cfe72d37 rs/pretty-format-color-doc-fix later to maint). + (merge d709f1fb9d jc/diff-unique-abbrev-comments later to maint). + (merge 13092a916d jc/cocci-xstrdup-or-null later to maint). + (merge 86009f32bb pb/test-parse-options-expect later to maint). + (merge 749a2279a4 yk/git-tag-remove-mention-of-old-layout-in-doc later to maint). diff --git a/Documentation/config.txt b/Documentation/config.txt index a17947462a..27069ac032 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2825,12 +2825,13 @@ stash.showStat:: option will show diffstat of the stash. Defaults to true. See description of 'show' command in linkgit:git-stash[1]. -submodule.<name>.path:: submodule.<name>.url:: - The path within this project and URL for a submodule. These - variables are initially populated by 'git submodule init'. See - linkgit:git-submodule[1] and linkgit:gitmodules[5] for - details. + The URL for a submodule. This variable is copied from the .gitmodules + file to the git config via 'git submodule init'. The user can change + the configured URL before obtaining the submodule via 'git submodule + update'. After obtaining the submodule, the presence of this variable + is used as a sign whether the submodule is of interest to git commands. + See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details. submodule.<name>.update:: The default update procedure for a submodule. This variable diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt index b27a38f896..58f4bd6afa 100644 --- a/Documentation/diff-config.txt +++ b/Documentation/diff-config.txt @@ -193,3 +193,9 @@ diff.algorithm:: low-occurrence common elements". -- + + +diff.wsErrorHighlight:: + A comma separated list of `old`, `new`, `context`, that + specifies how whitespace errors on lines are highlighted + with `color.diff.whitespace`. Can be overridden by the + command line option `--ws-error-highlight=<kind>` diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 2d77a19626..e6215c372c 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -308,6 +308,8 @@ ifndef::git-format-patch[] lines are highlighted. E.g. `--ws-error-highlight=new,old` highlights whitespace errors on both deleted and added lines. `all` can be used as a short-hand for `old,new,context`. + The `diff.wsErrorHighlight` configuration variable can be + used to specify the default behaviour. endif::git-format-patch[] @@ -570,5 +572,13 @@ endif::git-format-patch[] --line-prefix=<prefix>:: Prepend an additional prefix to every line of output. +--ita-invisible-in-index:: + By default entries added by "git add -N" appear as an existing + empty file in "git diff" and a new file in "git diff --cached". + This option makes the entry appear as a new file in "git diff" + and non-existent in "git diff --cached". This option could be + reverted with `--ita-visible-in-index`. Both options are + experimental and could be removed in future. + For more detailed explanation on these common options, see also linkgit:gitdiffcore[7]. diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index b0a294d3b5..f2ab0ee2e7 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -29,7 +29,8 @@ The content to be added can be specified in several ways: 2. by using 'git rm' to remove files from the working tree and the index, again before using the 'commit' command; -3. by listing files as arguments to the 'commit' command, in which +3. by listing files as arguments to the 'commit' command + (without --interactive or --patch switch), in which case the commit will ignore changes staged in the index, and instead record the current content of the listed files (which must already be known to Git); @@ -41,7 +42,8 @@ The content to be added can be specified in several ways: actual commit; 5. by using the --interactive or --patch switches with the 'commit' command - to decide one by one which files or hunks should be part of the commit, + to decide one by one which files or hunks should be part of the commit + in addition to contents in the index, before finalizing the operation. See the ``Interactive Mode'' section of linkgit:git-add[1] to learn how to operate these modes. diff --git a/Documentation/git-count-objects.txt b/Documentation/git-count-objects.txt index 2ff35683e5..cb9b4d2e46 100644 --- a/Documentation/git-count-objects.txt +++ b/Documentation/git-count-objects.txt @@ -38,6 +38,11 @@ objects nor valid packs + size-garbage: disk space consumed by garbage files, in KiB (unless -H is specified) ++ +alternate: absolute path of alternate object databases; may appear +multiple times, one line per path. Note that if the path contains +non-printable characters, it may be surrounded by double-quotes and +contain C-style backslashed escape sequences. -H:: --human-readable:: diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index 0d933ac355..446209e206 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -18,7 +18,8 @@ SYNOPSIS [--exclude-per-directory=<file>] [--exclude-standard] [--error-unmatch] [--with-tree=<tree-ish>] - [--full-name] [--abbrev] [--] [<file>...] + [--full-name] [--recurse-submodules] + [--abbrev] [--] [<file>...] DESCRIPTION ----------- @@ -137,6 +138,10 @@ a space) at the start of each line: option forces paths to be output relative to the project top directory. +--recurse-submodules:: + Recursively calls ls-files on each submodule in the repository. + Currently there is only support for the --cached mode. + --abbrev[=<n>]:: Instead of showing the full 40-byte hexadecimal object lines, show only a partial prefix. diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt index 808426faac..b968b64c38 100644 --- a/Documentation/git-merge-base.txt +++ b/Documentation/git-merge-base.txt @@ -80,8 +80,8 @@ which is reachable from both 'A' and 'B' through the parent relationship. For example, with this topology: - o---o---o---B - / + o---o---o---B + / ---o---1---o---o---o---A the merge base between 'A' and 'B' is '1'. @@ -116,11 +116,11 @@ the best common ancestor of all commits. When the history involves criss-cross merges, there can be more than one 'best' common ancestor for two commits. For example, with this topology: - ---1---o---A - \ / - X - / \ - ---2---o---o---B + ---1---o---A + \ / + X + / \ + ---2---o---o---B both '1' and '2' are merge-bases of A and B. Neither one is better than the other (both are 'best' merge bases). When the `--all` option is not given, @@ -154,13 +154,13 @@ 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---B1 + / ---o---o---B2--o---o---o---B (origin/master) - \ - B3 - \ - Derived (topic) + \ + 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 diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt index e846c2ed7f..3622d66488 100644 --- a/Documentation/git-mergetool.txt +++ b/Documentation/git-mergetool.txt @@ -79,6 +79,13 @@ success of the resolution after the custom tool has exited. Prompt before each invocation of the merge resolution program to give the user a chance to skip the path. +-O<orderfile>:: + Process files 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`. + TEMPORARY FILES --------------- `git mergetool` creates `*.orig` backup files while resolving merges. diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index bf3bb372ee..d841573475 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -259,7 +259,9 @@ OPTIONS --branch:: Branch of repository to add as submodule. The name of the branch is recorded as `submodule.<name>.branch` in - `.gitmodules` for `update --remote`. + `.gitmodules` for `update --remote`. A special value of `.` is used to + indicate that the name of the branch in the submodule should be the + same name as the current branch in the current repository. -f:: --force:: diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 7ecca8e247..80019c584b 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -253,9 +253,8 @@ On Automatic following ~~~~~~~~~~~~~~~~~~~~~~ If you are following somebody else's tree, you are most likely -using remote-tracking branches (`refs/heads/origin` in traditional -layout, or `refs/remotes/origin/master` in the separate-remote -layout). You usually want the tags from the other end. +using remote-tracking branches (eg. `refs/remotes/origin/master`). +You usually want the tags from the other end. On the other hand, if you are fetching because you would want a one-shot merge from somebody else, you typically do not want to diff --git a/Documentation/git.txt b/Documentation/git.txt index b8bec711f4..ab7215eee2 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -13,6 +13,7 @@ SYNOPSIS [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] + [--super-prefix=<path>] <command> [<args>] DESCRIPTION @@ -43,9 +44,10 @@ unreleased) version of Git, that is available from the 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v2.10.1/git.html[documentation for release 2.10.1] +* link:v2.10.2/git.html[documentation for release 2.10.2] * release notes for + link:RelNotes/2.10.2.txt[2.10.2], link:RelNotes/2.10.1.txt[2.10.1], link:RelNotes/2.10.0.txt[2.10]. @@ -602,6 +604,11 @@ foo.bar= ...`) sets `foo.bar` to the empty string. details. Equivalent to setting the `GIT_NAMESPACE` environment variable. +--super-prefix=<path>:: + Currently for internal use only. Set a prefix which gives a path from + above a repository down to its root. One use is to give submodules + context about the superproject that invoked it. + --bare:: Treat the repository as a bare repository. If GIT_DIR environment is not set, it is set to the current working diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index 7aff940202..976243a63e 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -293,7 +293,15 @@ checkout, when the `smudge` command is specified, the command is fed the blob object from its standard input, and its standard output is used to update the worktree file. Similarly, the `clean` command is used to convert the contents of worktree file -upon checkin. +upon checkin. By default these commands process only a single +blob and terminate. If a long running `process` filter is used +in place of `clean` and/or `smudge` filters, then Git can process +all blobs with a single filter command invocation for the entire +life of a single Git command, for example `git add --all`. If a +long running `process` filter is configured then it always takes +precedence over a configured single blob filter. See section +below for the description of the protocol used to communicate with +a `process` filter. One use of the content filtering is to massage the content into a shape that is more convenient for the platform, filesystem, and the user to use. @@ -373,6 +381,153 @@ not exist, or may have different contents. So, smudge and clean commands should not try to access the file on disk, but only act as filters on the content provided to them on standard input. +Long Running Filter Process +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If the filter command (a string value) is defined via +`filter.<driver>.process` then Git can process all blobs with a +single filter invocation for the entire life of a single Git +command. This is achieved by using a packet format (pkt-line, +see technical/protocol-common.txt) based protocol over standard +input and standard output as follows. All packets, except for the +"*CONTENT" packets and the "0000" flush packet, are considered +text and therefore are terminated by a LF. + +Git starts the filter when it encounters the first file +that needs to be cleaned or smudged. After the filter started +Git sends a welcome message ("git-filter-client"), a list of supported +protocol version numbers, and a flush packet. Git expects to read a welcome +response message ("git-filter-server"), exactly one protocol version number +from the previously sent list, and a flush packet. All further +communication will be based on the selected version. The remaining +protocol description below documents "version=2". Please note that +"version=42" in the example below does not exist and is only there +to illustrate how the protocol would look like with more than one +version. + +After the version negotiation Git sends a list of all capabilities that +it supports and a flush packet. Git expects to read a list of desired +capabilities, which must be a subset of the supported capabilities list, +and a flush packet as response: +------------------------ +packet: git> git-filter-client +packet: git> version=2 +packet: git> version=42 +packet: git> 0000 +packet: git< git-filter-server +packet: git< version=2 +packet: git< 0000 +packet: git> capability=clean +packet: git> capability=smudge +packet: git> capability=not-yet-invented +packet: git> 0000 +packet: git< capability=clean +packet: git< capability=smudge +packet: git< 0000 +------------------------ +Supported filter capabilities in version 2 are "clean" and +"smudge". + +Afterwards Git sends a list of "key=value" pairs terminated with +a flush packet. The list will contain at least the filter command +(based on the supported capabilities) and the pathname of the file +to filter relative to the repository root. Right after the flush packet +Git sends the content split in zero or more pkt-line packets and a +flush packet to terminate content. Please note, that the filter +must not send any response before it received the content and the +final flush packet. +------------------------ +packet: git> command=smudge +packet: git> pathname=path/testfile.dat +packet: git> 0000 +packet: git> CONTENT +packet: git> 0000 +------------------------ + +The filter is expected to respond with a list of "key=value" pairs +terminated with a flush packet. If the filter does not experience +problems then the list must contain a "success" status. Right after +these packets the filter is expected to send the content in zero +or more pkt-line packets and a flush packet at the end. Finally, a +second list of "key=value" pairs terminated with a flush packet +is expected. The filter can change the status in the second list +or keep the status as is with an empty list. Please note that the +empty list must be terminated with a flush packet regardless. + +------------------------ +packet: git< status=success +packet: git< 0000 +packet: git< SMUDGED_CONTENT +packet: git< 0000 +packet: git< 0000 # empty list, keep "status=success" unchanged! +------------------------ + +If the result content is empty then the filter is expected to respond +with a "success" status and a flush packet to signal the empty content. +------------------------ +packet: git< status=success +packet: git< 0000 +packet: git< 0000 # empty content! +packet: git< 0000 # empty list, keep "status=success" unchanged! +------------------------ + +In case the filter cannot or does not want to process the content, +it is expected to respond with an "error" status. +------------------------ +packet: git< status=error +packet: git< 0000 +------------------------ + +If the filter experiences an error during processing, then it can +send the status "error" after the content was (partially or +completely) sent. +------------------------ +packet: git< status=success +packet: git< 0000 +packet: git< HALF_WRITTEN_ERRONEOUS_CONTENT +packet: git< 0000 +packet: git< status=error +packet: git< 0000 +------------------------ + +In case the filter cannot or does not want to process the content +as well as any future content for the lifetime of the Git process, +then it is expected to respond with an "abort" status at any point +in the protocol. +------------------------ +packet: git< status=abort +packet: git< 0000 +------------------------ + +Git neither stops nor restarts the filter process in case the +"error"/"abort" status is set. However, Git sets its exit code +according to the `filter.<driver>.required` flag, mimicking the +behavior of the `filter.<driver>.clean` / `filter.<driver>.smudge` +mechanism. + +If the filter dies during the communication or does not adhere to +the protocol then Git will stop the filter process and restart it +with the next file that needs to be processed. Depending on the +`filter.<driver>.required` flag Git will interpret that as error. + +After the filter has processed a blob it is expected to wait for +the next "key=value" list containing a command. Git will close +the command pipe on exit. The filter is expected to detect EOF +and exit gracefully on its own. Git will wait until the filter +process has stopped. + +A long running filter demo implementation can be found in +`contrib/long-running-filter/example.pl` located in the Git +core repository. If you develop your own long running filter +process then the `GIT_TRACE_PACKET` environment variables can be +very helpful for debugging (see linkgit:git[1]). + +Please note that you cannot use an existing `filter.<driver>.clean` +or `filter.<driver>.smudge` command with `filter.<driver>.process` +because the former two use a different inter process communication +protocol than the latter one. + + Interaction between checkin/checkout attributes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index 10dcc08ff9..8f7c50f330 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -50,8 +50,11 @@ submodule.<name>.update:: 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. + If the option is not specified, it defaults to 'master'. A special + value of `.` is used to indicate that the name of the branch in the + submodule should be the same name as the current branch in the + current repository. See the `--remote` 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/howto/revert-a-faulty-merge.txt b/Documentation/howto/revert-a-faulty-merge.txt index 462255ed5d..19f59cc888 100644 --- a/Documentation/howto/revert-a-faulty-merge.txt +++ b/Documentation/howto/revert-a-faulty-merge.txt @@ -30,7 +30,7 @@ The history immediately after the "revert of the merge" would look like this: ---o---o---o---M---x---x---W - / + / ---A---B where A and B are on the side development that was not so good, M is the @@ -47,7 +47,7 @@ After the developers of the side branch fix their mistakes, the history may look like this: ---o---o---o---M---x---x---W---x - / + / ---A---B-------------------C---D where C and D are to fix what was broken in A and B, and you may already @@ -81,7 +81,7 @@ In such a situation, you would want to first revert the previous revert, which would make the history look like this: ---o---o---o---M---x---x---W---x---Y - / + / ---A---B-------------------C---D where Y is the revert of W. Such a "revert of the revert" can be done @@ -93,14 +93,14 @@ This history would (ignoring possible conflicts between what W and W..Y changed) be equivalent to not having W or Y at all in the history: ---o---o---o---M---x---x-------x---- - / + / ---A---B-------------------C---D and merging the side branch again will not have conflict arising from an earlier revert and revert of the revert. ---o---o---o---M---x---x-------x-------* - / / + / / ---A---B-------------------C---D Of course the changes made in C and D still can conflict with what was @@ -111,13 +111,13 @@ faulty A and B, and redone the changes on top of the updated mainline after the revert, the history would have looked like this: ---o---o---o---M---x---x---W---x---x - / \ + / \ ---A---B A'--B'--C' If you reverted the revert in such a case as in the previous example: ---o---o---o---M---x---x---W---x---x---Y---* - / \ / + / \ / ---A---B A'--B'--C' where Y is the revert of W, A' and B' are rerolled A and B, and there may @@ -129,7 +129,7 @@ lot of overlapping changes that result in conflicts. So do not do "revert of revert" blindly without thinking.. ---o---o---o---M---x---x---W---x---x - / \ + / \ ---A---B A'--B'--C' In the history with rebased side branch, W (and M) are behind the merge diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index a942d57f73..3bcee2ddb1 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -143,8 +143,14 @@ ifndef::git-rev-list[] - '%N': commit notes endif::git-rev-list[] - '%GG': raw verification message from GPG for a signed commit -- '%G?': show "G" for a good (valid) signature, "B" for a bad signature, - "U" for a good signature with unknown validity and "N" for no signature +- '%G?': show "G" for a good (valid) signature, + "B" for a bad signature, + "U" for a good signature with unknown validity, + "X" for a good signature that has expired, + "Y" for a good signature made by an expired key, + "R" for a good signature made by a revoked key, + "E" if the signature cannot be checked (e.g. missing key) + and "N" for no signature - '%GS': show the name of the signer for a signed commit - '%GK': show the key used to sign a signed commit - '%gD': reflog selector, e.g., `refs/stash@{1}` or @@ -166,7 +172,8 @@ endif::git-rev-list[] - '%Cgreen': switch color to green - '%Cblue': switch color to blue - '%Creset': reset color -- '%C(...)': color specification, as described in color.branch.* config option; +- '%C(...)': color specification, as described under Values in the + "CONFIGURATION FILE" section of linkgit:git-config[1]; adding `auto,` at the beginning will emit color only when colors are enabled for log output (by `color.diff`, `color.ui`, or `--color`, and respecting the `auto` settings of the former if we are going to a @@ -832,6 +832,7 @@ LIB_OBJS += submodule-config.o LIB_OBJS += symlinks.o LIB_OBJS += tag.o LIB_OBJS += tempfile.o +LIB_OBJS += tmp-objdir.o LIB_OBJS += trace.o LIB_OBJS += trailer.o LIB_OBJS += transport.o @@ -122,9 +122,9 @@ int check_apply_state(struct apply_state *state, int force_apply) int is_not_gitdir = !startup_info->have_repository; if (state->apply_with_reject && state->threeway) - return error("--reject and --3way cannot be used together."); + return error(_("--reject and --3way cannot be used together.")); if (state->cached && state->threeway) - return error("--cached and --3way cannot be used together."); + return error(_("--cached and --3way cannot be used together.")); if (state->threeway) { if (is_not_gitdir) return error(_("--3way outside a repository")); @@ -1586,8 +1586,8 @@ static int find_header(struct apply_state *state, patch->new_name = xstrdup(patch->def_name); } if (!patch->is_delete && !patch->new_name) { - error("git diff header lacks filename information " - "(line %d)", state->linenr); + error(_("git diff header lacks filename information " + "(line %d)"), state->linenr); return -128; } patch->is_toplevel_relative = 1; @@ -3095,8 +3095,8 @@ static int apply_binary_fragment(struct apply_state *state, /* Binary patch is irreversible without the optional second hunk */ if (state->apply_in_reverse) { if (!fragment->next) - return error("cannot reverse-apply a binary patch " - "without the reverse hunk to '%s'", + return error(_("cannot reverse-apply a binary patch " + "without the reverse hunk to '%s'"), patch->new_name ? patch->new_name : patch->old_name); fragment = fragment->next; @@ -3141,8 +3141,8 @@ static int apply_binary(struct apply_state *state, strlen(patch->new_sha1_prefix) != 40 || get_oid_hex(patch->old_sha1_prefix, &oid) || get_oid_hex(patch->new_sha1_prefix, &oid)) - return error("cannot apply binary patch to '%s' " - "without full index line", name); + return error(_("cannot apply binary patch to '%s' " + "without full index line"), name); if (patch->old_name) { /* @@ -3151,16 +3151,16 @@ static int apply_binary(struct apply_state *state, */ hash_sha1_file(img->buf, img->len, blob_type, oid.hash); if (strcmp(oid_to_hex(&oid), patch->old_sha1_prefix)) - return error("the patch applies to '%s' (%s), " - "which does not match the " - "current contents.", + return error(_("the patch applies to '%s' (%s), " + "which does not match the " + "current contents."), name, oid_to_hex(&oid)); } else { /* Otherwise, the old one must be empty. */ if (img->len) - return error("the patch applies to an empty " - "'%s' but it is not empty", name); + return error(_("the patch applies to an empty " + "'%s' but it is not empty"), name); } get_oid_hex(patch->new_sha1_prefix, &oid); @@ -3177,8 +3177,8 @@ static int apply_binary(struct apply_state *state, result = read_sha1_file(oid.hash, &type, &size); if (!result) - return error("the necessary postimage %s for " - "'%s' cannot be read", + return error(_("the necessary postimage %s for " + "'%s' cannot be read"), patch->new_sha1_prefix, name); clear_image(img); img->buf = result; @@ -3551,10 +3551,10 @@ static int try_threeway(struct apply_state *state, write_sha1_file("", 0, blob_type, pre_oid.hash); else if (get_sha1(patch->old_sha1_prefix, pre_oid.hash) || read_blob_object(&buf, &pre_oid, patch->old_mode)) - return error("repository lacks the necessary blob to fall back on 3-way merge."); + return error(_("repository lacks the necessary blob to fall back on 3-way merge.")); if (state->apply_verbosity > verbosity_silent) - fprintf(stderr, "Falling back to three-way merge...\n"); + fprintf(stderr, _("Falling back to three-way merge...\n")); img = strbuf_detach(&buf, &len); prepare_image(&tmp_image, img, len, 1); @@ -3570,11 +3570,11 @@ static int try_threeway(struct apply_state *state, /* our_oid is ours */ if (patch->is_new) { if (load_current(state, &tmp_image, patch)) - return error("cannot read the current contents of '%s'", + return error(_("cannot read the current contents of '%s'"), patch->new_name); } else { if (load_preimage(state, &tmp_image, patch, st, ce)) - return error("cannot read the current contents of '%s'", + return error(_("cannot read the current contents of '%s'"), patch->old_name); } write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, our_oid.hash); @@ -3586,7 +3586,7 @@ static int try_threeway(struct apply_state *state, if (status < 0) { if (state->apply_verbosity > verbosity_silent) fprintf(stderr, - "Failed to fall back on three-way merge...\n"); + _("Failed to fall back on three-way merge...\n")); return status; } @@ -3600,12 +3600,12 @@ static int try_threeway(struct apply_state *state, oidcpy(&patch->threeway_stage[2], &post_oid); if (state->apply_verbosity > verbosity_silent) fprintf(stderr, - "Applied patch to '%s' with conflicts.\n", + _("Applied patch to '%s' with conflicts.\n"), patch->new_name); } else { if (state->apply_verbosity > verbosity_silent) fprintf(stderr, - "Applied patch to '%s' cleanly.\n", + _("Applied patch to '%s' cleanly.\n"), patch->new_name); } return 0; @@ -4072,18 +4072,18 @@ static int build_fake_ancestor(struct apply_state *state, struct patch *list) if (!preimage_oid_in_gitlink_patch(patch, &oid)) ; /* ok, the textual part looks sane */ else - return error("sha1 information is lacking or " - "useless for submodule %s", name); + return error(_("sha1 information is lacking or " + "useless for submodule %s"), name); } else if (!get_sha1_blob(patch->old_sha1_prefix, oid.hash)) { ; /* ok */ } else if (!patch->lines_added && !patch->lines_deleted) { /* mode-only change: update the current */ if (get_current_oid(state, patch->old_name, &oid)) - return error("mode change for %s, which is not " - "in current HEAD", name); + return error(_("mode change for %s, which is not " + "in current HEAD"), name); } else - return error("sha1 information is lacking or useless " - "(%s).", name); + return error(_("sha1 information is lacking or useless " + "(%s)."), name); ce = make_cache_entry(patch->old_mode, oid.hash, name, 0, 0); if (!ce) @@ -4091,7 +4091,7 @@ static int build_fake_ancestor(struct apply_state *state, struct patch *list) name); if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD)) { free(ce); - return error("Could not add %s to temporary index", + return error(_("could not add %s to temporary index"), name); } } @@ -4101,7 +4101,7 @@ static int build_fake_ancestor(struct apply_state *state, struct patch *list) discard_index(&result); if (res) - return error("Could not write temporary index to %s", + return error(_("could not write temporary index to %s"), state->fake_ancestor); return 0; @@ -4869,10 +4869,12 @@ int apply_all_patches(struct apply_state *state, goto end; } if (state->applied_after_fixing_ws && state->apply) - warning("%d line%s applied after" - " fixing whitespace errors.", - state->applied_after_fixing_ws, - state->applied_after_fixing_ws == 1 ? "" : "s"); + warning(Q_("%d line applied after" + " fixing whitespace errors.", + "%d lines applied after" + " fixing whitespace errors.", + state->applied_after_fixing_ws), + state->applied_after_fixing_ws); else if (state->whitespace_error) warning(Q_("%d line adds whitespace errors.", "%d lines add whitespace errors.", @@ -531,7 +531,11 @@ static void bootstrap_attr_stack(void) debug_push(elem); } - elem = read_attr_from_file(git_path_info_attributes(), 1); + if (startup_info->have_repository) + elem = read_attr_from_file(git_path_info_attributes(), 1); + else + elem = NULL; + if (!elem) elem = xcalloc(1, sizeof(*elem)); elem->origin = NULL; diff --git a/builtin/archive.c b/builtin/archive.c index a1e3b940c2..49f491413a 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -47,10 +47,10 @@ static int run_remote_archiver(int argc, const char **argv, if (name_hint) { const char *format = archive_format_from_filename(name_hint); if (format) - packet_write(fd[1], "argument --format=%s\n", format); + packet_write_fmt(fd[1], "argument --format=%s\n", format); } for (i = 1; i < argc; i++) - packet_write(fd[1], "argument %s\n", argv[i]); + packet_write_fmt(fd[1], "argument %s\n", argv[i]); packet_flush(fd[1]); buf = packet_read_line(fd[0], NULL); diff --git a/builtin/clone.c b/builtin/clone.c index 6c80690adf..6c76a6ed66 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -351,8 +351,11 @@ static void copy_alternates(struct strbuf *src, struct strbuf *dst, continue; } abs_path = mkpathdup("%s/objects/%s", src_repo, line.buf); - normalize_path_copy(abs_path, abs_path); - add_to_alternates_file(abs_path); + if (!normalize_path_copy(abs_path, abs_path)) + add_to_alternates_file(abs_path); + else + warning("skipping invalid relative alternate: %s/%s", + src_repo, line.buf); free(abs_path); } strbuf_release(&line); diff --git a/builtin/commit.c b/builtin/commit.c index 1cba3b75c8..a2baa6ebd5 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -183,7 +183,7 @@ static void determine_whence(struct wt_status *s) whence = FROM_MERGE; else if (file_exists(git_path_cherry_pick_head())) { whence = FROM_CHERRY_PICK; - if (file_exists(git_path(SEQ_DIR))) + if (file_exists(git_path_seq_dir())) sequencer_in_use = 1; } else @@ -894,9 +894,14 @@ static int prepare_to_commit(const char *index_file, const char *prefix, if (amend) parent = "HEAD^1"; - if (get_sha1(parent, sha1)) - commitable = !!active_nr; - else { + if (get_sha1(parent, sha1)) { + int i, ita_nr = 0; + + for (i = 0; i < active_nr; i++) + if (ce_intent_to_add(active_cache[i])) + ita_nr++; + commitable = active_nr - ita_nr > 0; + } else { /* * Unless the user did explicitly request a submodule * ignore mode by passing a command line option we do @@ -910,7 +915,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, if (ignore_submodule_arg && !strcmp(ignore_submodule_arg, "all")) diff_flags |= DIFF_OPT_IGNORE_SUBMODULES; - commitable = index_differs_from(parent, diff_flags); + commitable = index_differs_from(parent, diff_flags, 1); } } strbuf_release(&committer_ident); diff --git a/builtin/count-objects.c b/builtin/count-objects.c index ba9291944f..a04b4f2ef3 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -8,6 +8,7 @@ #include "dir.h" #include "builtin.h" #include "parse-options.h" +#include "quote.h" static unsigned long garbage; static off_t size_garbage; @@ -73,6 +74,14 @@ static int count_cruft(const char *basename, const char *path, void *data) return 0; } +static int print_alternate(struct alternate_object_database *alt, void *data) +{ + printf("alternate: "); + quote_c_style(alt->path, NULL, stdout, 0); + putchar('\n'); + return 0; +} + static char const * const count_objects_usage[] = { N_("git count-objects [-v] [-H | --human-readable]"), NULL @@ -88,6 +97,8 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix) OPT_END(), }; + git_config(git_default_config, NULL); + argc = parse_options(argc, argv, prefix, opts, count_objects_usage, 0); /* we do not take arguments other than flags for now */ if (argc) @@ -140,6 +151,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix) printf("prune-packable: %lu\n", packed_loose); printf("garbage: %lu\n", garbage); printf("size-garbage: %s\n", garbage_buf.buf); + foreach_alt_odb(print_alternate, NULL); strbuf_release(&loose_buf); strbuf_release(&pack_buf); strbuf_release(&garbage_buf); diff --git a/builtin/fetch.c b/builtin/fetch.c index d5329f915e..b6a5597cbf 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -241,9 +241,10 @@ static void find_non_local_tags(struct transport *transport, * as one to ignore by setting util to NULL. */ if (ends_with(ref->name, "^{}")) { - if (item && !has_object_file(&ref->old_oid) && + if (item && + !has_object_file_with_flags(&ref->old_oid, HAS_SHA1_QUICK) && !will_fetch(head, ref->old_oid.hash) && - !has_sha1_file(item->util) && + !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) && !will_fetch(head, item->util)) item->util = NULL; item = NULL; @@ -256,7 +257,8 @@ static void find_non_local_tags(struct transport *transport, * to check if it is a lightweight tag that we want to * fetch. */ - if (item && !has_sha1_file(item->util) && + if (item && + !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) && !will_fetch(head, item->util)) item->util = NULL; @@ -276,7 +278,8 @@ static void find_non_local_tags(struct transport *transport, * 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) && + if (item && + !has_sha1_file_with_flags(item->util, HAS_SHA1_QUICK) && !will_fetch(head, item->util)) item->util = NULL; @@ -574,9 +577,12 @@ static void print_compact(struct strbuf *display, static void format_display(struct strbuf *display, char code, const char *summary, const char *error, - const char *remote, const char *local) + const char *remote, const char *local, + int summary_width) { - strbuf_addf(display, "%c %-*s ", code, TRANSPORT_SUMMARY(summary)); + int width = (summary_width + strlen(summary) - gettext_width(summary)); + + strbuf_addf(display, "%c %-*s ", code, width, summary); if (!compact_format) print_remote_to_local(display, remote, local); else @@ -588,7 +594,8 @@ static void format_display(struct strbuf *display, char code, static int update_local_ref(struct ref *ref, const char *remote, const struct ref *remote_ref, - struct strbuf *display) + struct strbuf *display, + int summary_width) { struct commit *current = NULL, *updated; enum object_type type; @@ -602,7 +609,7 @@ static int update_local_ref(struct ref *ref, if (!oidcmp(&ref->old_oid, &ref->new_oid)) { if (verbosity > 0) format_display(display, '=', _("[up to date]"), NULL, - remote, pretty_ref); + remote, pretty_ref, summary_width); return 0; } @@ -616,7 +623,7 @@ static int update_local_ref(struct ref *ref, */ format_display(display, '!', _("[rejected]"), _("can't fetch in current branch"), - remote, pretty_ref); + remote, pretty_ref, summary_width); return 1; } @@ -626,7 +633,7 @@ static int update_local_ref(struct ref *ref, r = s_update_ref("updating tag", ref, 0); format_display(display, r ? '!' : 't', _("[tag update]"), r ? _("unable to update local ref") : NULL, - remote, pretty_ref); + remote, pretty_ref, summary_width); return r; } @@ -659,7 +666,7 @@ static int update_local_ref(struct ref *ref, r = s_update_ref(msg, ref, 0); format_display(display, r ? '!' : '*', what, r ? _("unable to update local ref") : NULL, - remote, pretty_ref); + remote, pretty_ref, summary_width); return r; } @@ -675,7 +682,7 @@ static int update_local_ref(struct ref *ref, r = s_update_ref("fast-forward", ref, 1); format_display(display, r ? '!' : ' ', quickref.buf, r ? _("unable to update local ref") : NULL, - remote, pretty_ref); + remote, pretty_ref, summary_width); strbuf_release(&quickref); return r; } else if (force || ref->force) { @@ -690,12 +697,12 @@ static int update_local_ref(struct ref *ref, r = s_update_ref("forced-update", ref, 1); format_display(display, r ? '!' : '+', quickref.buf, r ? _("unable to update local ref") : _("forced update"), - remote, pretty_ref); + remote, pretty_ref, summary_width); strbuf_release(&quickref); return r; } else { format_display(display, '!', _("[rejected]"), _("non-fast-forward"), - remote, pretty_ref); + remote, pretty_ref, summary_width); return 1; } } @@ -726,6 +733,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name, char *url; const char *filename = dry_run ? "/dev/null" : git_path_fetch_head(); int want_status; + int summary_width = transport_summary_width(ref_map); fp = fopen(filename, "a"); if (!fp) @@ -835,13 +843,14 @@ static int store_updated_refs(const char *raw_url, const char *remote_name, strbuf_reset(¬e); if (ref) { - rc |= update_local_ref(ref, what, rm, ¬e); + rc |= update_local_ref(ref, what, rm, ¬e, + summary_width); free(ref); } else format_display(¬e, '*', *kind ? kind : "branch", NULL, *what ? what : "HEAD", - "FETCH_HEAD"); + "FETCH_HEAD", summary_width); if (note.len) { if (verbosity >= 0 && !shown_url) { fprintf(stderr, _("From %.*s\n"), @@ -908,6 +917,7 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map, int url_len, i, result = 0; struct ref *ref, *stale_refs = get_stale_heads(refs, ref_count, ref_map); char *url; + int summary_width = transport_summary_width(stale_refs); const char *dangling_msg = dry_run ? _(" (%s will become dangling)") : _(" (%s has become dangling)"); @@ -943,7 +953,8 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map, shown_url = 1; } format_display(&sb, '-', _("[deleted]"), NULL, - _("(none)"), prettify_refname(ref->name)); + _("(none)"), prettify_refname(ref->name), + summary_width); fprintf(stderr, " %s\n",sb.buf); strbuf_release(&sb); warn_dangling_symref(stderr, dangling_msg, ref->name); diff --git a/builtin/fsck.c b/builtin/fsck.c index 055dfdcf9e..f01b81eebf 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -644,14 +644,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) fsck_object_dir(get_object_directory()); prepare_alt_odb(); - for (alt = alt_odb_list; alt; alt = alt->next) { - /* directory name, minus trailing slash */ - size_t namelen = alt->name - alt->base - 1; - struct strbuf name = STRBUF_INIT; - strbuf_add(&name, alt->base, namelen); - fsck_object_dir(name.buf); - strbuf_release(&name); - } + for (alt = alt_odb_list; alt; alt = alt->next) + fsck_object_dir(alt->path); } if (check_full) { diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 197f153f50..1592290815 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -14,6 +14,7 @@ #include "resolve-undo.h" #include "string-list.h" #include "pathspec.h" +#include "run-command.h" static int abbrev; static int show_deleted; @@ -28,8 +29,11 @@ static int show_valid_bit; static int line_terminator = '\n'; static int debug_mode; static int show_eol; +static int recurse_submodules; +static struct argv_array submodules_options = ARGV_ARRAY_INIT; static const char *prefix; +static const char *super_prefix; static int max_prefix_len; static int prefix_len; static struct pathspec pathspec; @@ -68,11 +72,24 @@ static void write_eolinfo(const struct cache_entry *ce, const char *path) static void write_name(const char *name) { /* + * Prepend the super_prefix to name to construct the full_name to be + * written. + */ + struct strbuf full_name = STRBUF_INIT; + if (super_prefix) { + strbuf_addstr(&full_name, super_prefix); + strbuf_addstr(&full_name, name); + name = full_name.buf; + } + + /* * With "--full-name", prefix_len=0; this caller needs to pass * an empty string in that case (a NULL is good for ""). */ write_name_quoted_relative(name, prefix_len ? prefix : NULL, stdout, line_terminator); + + strbuf_release(&full_name); } static void show_dir_entry(const char *tag, struct dir_entry *ent) @@ -152,55 +169,117 @@ static void show_killed_files(struct dir_struct *dir) } } +/* + * Compile an argv_array with all of the options supported by --recurse_submodules + */ +static void compile_submodule_options(const struct dir_struct *dir, int show_tag) +{ + if (line_terminator == '\0') + argv_array_push(&submodules_options, "-z"); + if (show_tag) + argv_array_push(&submodules_options, "-t"); + if (show_valid_bit) + argv_array_push(&submodules_options, "-v"); + if (show_cached) + argv_array_push(&submodules_options, "--cached"); + if (show_eol) + argv_array_push(&submodules_options, "--eol"); + if (debug_mode) + argv_array_push(&submodules_options, "--debug"); +} + +/** + * Recursively call ls-files on a submodule + */ +static void show_gitlink(const struct cache_entry *ce) +{ + struct child_process cp = CHILD_PROCESS_INIT; + int status; + int i; + + argv_array_pushf(&cp.args, "--super-prefix=%s%s/", + super_prefix ? super_prefix : "", + ce->name); + argv_array_push(&cp.args, "ls-files"); + argv_array_push(&cp.args, "--recurse-submodules"); + + /* add supported options */ + argv_array_pushv(&cp.args, submodules_options.argv); + + /* + * Pass in the original pathspec args. The submodule will be + * responsible for prepending the 'submodule_prefix' prior to comparing + * against the pathspec for matches. + */ + argv_array_push(&cp.args, "--"); + for (i = 0; i < pathspec.nr; i++) + argv_array_push(&cp.args, pathspec.items[i].original); + + cp.git_cmd = 1; + cp.dir = ce->name; + status = run_command(&cp); + if (status) + exit(status); +} + static void show_ce_entry(const char *tag, const struct cache_entry *ce) { + struct strbuf name = STRBUF_INIT; int len = max_prefix_len; + if (super_prefix) + strbuf_addstr(&name, super_prefix); + strbuf_addstr(&name, ce->name); if (len >= ce_namelen(ce)) die("git ls-files: internal error - cache entry not superset of prefix"); - if (!match_pathspec(&pathspec, ce->name, ce_namelen(ce), - len, ps_matched, - S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode))) - return; + if (recurse_submodules && S_ISGITLINK(ce->ce_mode) && + submodule_path_match(&pathspec, name.buf, ps_matched)) { + show_gitlink(ce); + } else if (match_pathspec(&pathspec, name.buf, name.len, + len, ps_matched, + S_ISDIR(ce->ce_mode) || + S_ISGITLINK(ce->ce_mode))) { + if (tag && *tag && show_valid_bit && + (ce->ce_flags & CE_VALID)) { + static char alttag[4]; + memcpy(alttag, tag, 3); + if (isalpha(tag[0])) + alttag[0] = tolower(tag[0]); + else if (tag[0] == '?') + alttag[0] = '!'; + else { + alttag[0] = 'v'; + alttag[1] = tag[0]; + alttag[2] = ' '; + alttag[3] = 0; + } + tag = alttag; + } - if (tag && *tag && show_valid_bit && - (ce->ce_flags & CE_VALID)) { - static char alttag[4]; - memcpy(alttag, tag, 3); - if (isalpha(tag[0])) - alttag[0] = tolower(tag[0]); - else if (tag[0] == '?') - alttag[0] = '!'; - else { - alttag[0] = 'v'; - alttag[1] = tag[0]; - alttag[2] = ' '; - alttag[3] = 0; + if (!show_stage) { + fputs(tag, stdout); + } else { + printf("%s%06o %s %d\t", + tag, + ce->ce_mode, + find_unique_abbrev(ce->oid.hash, abbrev), + ce_stage(ce)); + } + write_eolinfo(ce, ce->name); + write_name(ce->name); + if (debug_mode) { + const struct stat_data *sd = &ce->ce_stat_data; + + printf(" ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec); + printf(" mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec); + printf(" dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino); + printf(" uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid); + printf(" size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags); } - tag = alttag; } - if (!show_stage) { - fputs(tag, stdout); - } else { - printf("%s%06o %s %d\t", - tag, - ce->ce_mode, - find_unique_abbrev(ce->oid.hash,abbrev), - ce_stage(ce)); - } - write_eolinfo(ce, ce->name); - write_name(ce->name); - if (debug_mode) { - const struct stat_data *sd = &ce->ce_stat_data; - - printf(" ctime: %d:%d\n", sd->sd_ctime.sec, sd->sd_ctime.nsec); - printf(" mtime: %d:%d\n", sd->sd_mtime.sec, sd->sd_mtime.nsec); - printf(" dev: %d\tino: %d\n", sd->sd_dev, sd->sd_ino); - printf(" uid: %d\tgid: %d\n", sd->sd_uid, sd->sd_gid); - printf(" size: %d\tflags: %x\n", sd->sd_size, ce->ce_flags); - } + strbuf_release(&name); } static void show_ru_info(void) @@ -468,6 +547,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) { OPTION_SET_INT, 0, "full-name", &prefix_len, NULL, N_("make the output relative to the project top directory"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL }, + OPT_BOOL(0, "recurse-submodules", &recurse_submodules, + N_("recurse through submodules")), OPT_BOOL(0, "error-unmatch", &error_unmatch, N_("if any <file> is not in the index, treat this as an error")), OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"), @@ -484,6 +565,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) prefix = cmd_prefix; if (prefix) prefix_len = strlen(prefix); + super_prefix = get_super_prefix(); git_config(git_default_config, NULL); if (read_cache() < 0) @@ -519,13 +601,32 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) if (require_work_tree && !is_inside_work_tree()) setup_work_tree(); + if (recurse_submodules) + compile_submodule_options(&dir, show_tag); + + if (recurse_submodules && + (show_stage || show_deleted || show_others || show_unmerged || + show_killed || show_modified || show_resolve_undo || with_tree)) + die("ls-files --recurse-submodules unsupported mode"); + + if (recurse_submodules && error_unmatch) + die("ls-files --recurse-submodules does not support " + "--error-unmatch"); + parse_pathspec(&pathspec, 0, PATHSPEC_PREFER_CWD | PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP, prefix, argv); - /* Find common prefix for all pathspec's */ - max_prefix = common_prefix(&pathspec); + /* + * Find common prefix for all pathspec's + * This is used as a performance optimization which unfortunately cannot + * be done when recursing into submodules + */ + if (recurse_submodules) + max_prefix = NULL; + else + max_prefix = common_prefix(&pathspec); max_prefix_len = max_prefix ? strlen(max_prefix) : 0; /* Treat unmatching pathspec elements as errors */ diff --git a/builtin/merge-base.c b/builtin/merge-base.c index c0d1822eb3..b572a37c26 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -173,6 +173,9 @@ static int handle_fork_point(int argc, const char **argv) revs.initial = 1; for_each_reflog_ent(refname, collect_one_reflog_ent, &revs); + if (!revs.nr && !get_sha1(refname, sha1)) + add_one_commit(sha1, &revs); + for (i = 0; i < revs.nr; i++) revs.commit[i]->object.flags &= ~TMP_MARK; diff --git a/builtin/merge.c b/builtin/merge.c index a8b57c7d98..b65eeaa87d 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1374,12 +1374,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix) struct commit *commit; if (verbosity >= 0) { - char from[GIT_SHA1_HEXSZ + 1], to[GIT_SHA1_HEXSZ + 1]; - find_unique_abbrev_r(from, head_commit->object.oid.hash, - DEFAULT_ABBREV); - find_unique_abbrev_r(to, remoteheads->item->object.oid.hash, - DEFAULT_ABBREV); - printf(_("Updating %s..%s\n"), from, to); + printf(_("Updating %s..%s\n"), + find_unique_abbrev(head_commit->object.oid.hash, + DEFAULT_ABBREV), + find_unique_abbrev(remoteheads->item->object.oid.hash, + DEFAULT_ABBREV)); } strbuf_addstr(&msg, "Fast-forward"); if (have_message) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 1e7c2a98a5..0fd52bd6b4 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -720,7 +720,7 @@ static off_t write_reused_pack(struct sha1file *f) if (!is_pack_valid(reuse_packfile)) die("packfile is invalid: %s", reuse_packfile->pack_name); - fd = git_open_noatime(reuse_packfile->pack_name); + fd = git_open(reuse_packfile->pack_name); if (fd < 0) die_errno("unable to open packfile for reuse: %s", reuse_packfile->pack_name); diff --git a/builtin/pull.c b/builtin/pull.c index 398aae16c0..d6e46ee6d0 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -17,6 +17,7 @@ #include "revision.h" #include "tempfile.h" #include "lockfile.h" +#include "wt-status.h" enum rebase_type { REBASE_INVALID = -1, @@ -326,73 +327,6 @@ static int git_pull_config(const char *var, const char *value, void *cb) } /** - * Returns 1 if there are unstaged changes, 0 otherwise. - */ -static int has_unstaged_changes(const char *prefix) -{ - struct rev_info rev_info; - int result; - - init_revisions(&rev_info, prefix); - DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES); - DIFF_OPT_SET(&rev_info.diffopt, QUICK); - diff_setup_done(&rev_info.diffopt); - result = run_diff_files(&rev_info, 0); - return diff_result_code(&rev_info.diffopt, result); -} - -/** - * Returns 1 if there are uncommitted changes, 0 otherwise. - */ -static int has_uncommitted_changes(const char *prefix) -{ - struct rev_info rev_info; - int result; - - if (is_cache_unborn()) - return 0; - - init_revisions(&rev_info, prefix); - DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES); - DIFF_OPT_SET(&rev_info.diffopt, QUICK); - add_head_to_pending(&rev_info); - diff_setup_done(&rev_info.diffopt); - result = run_diff_index(&rev_info, 1); - return diff_result_code(&rev_info.diffopt, result); -} - -/** - * If the work tree has unstaged or uncommitted changes, dies with the - * appropriate message. - */ -static void die_on_unclean_work_tree(const char *prefix) -{ - struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file)); - int do_die = 0; - - hold_locked_index(lock_file, 0); - refresh_cache(REFRESH_QUIET); - update_index_if_able(&the_index, lock_file); - rollback_lock_file(lock_file); - - if (has_unstaged_changes(prefix)) { - error(_("Cannot pull with rebase: You have unstaged changes.")); - do_die = 1; - } - - if (has_uncommitted_changes(prefix)) { - if (do_die) - error(_("Additionally, your index contains uncommitted changes.")); - else - error(_("Cannot pull with rebase: Your index contains uncommitted changes.")); - do_die = 1; - } - - if (do_die) - exit(1); -} - -/** * Appends merge candidates from FETCH_HEAD that are not marked not-for-merge * into merge_heads. */ @@ -875,7 +809,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix) die(_("Updating an unborn branch with changes added to the index.")); if (!autostash) - die_on_unclean_work_tree(prefix); + require_clean_work_tree(N_("pull with rebase"), + _("please commit or stash them."), 1, 0); if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs)) hashclr(rebase_fork_point); diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index f7cd180252..e6b3879a5b 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -20,6 +20,7 @@ #include "gpg-interface.h" #include "sigchain.h" #include "fsck.h" +#include "tmp-objdir.h" static const char * const receive_pack_usage[] = { N_("git receive-pack <git-dir>"), @@ -86,6 +87,8 @@ static enum { } use_keepalive; static int keepalive_in_sec = 5; +static struct tmp_objdir *tmp_objdir; + static enum deny_action parse_deny_action(const char *var, const char *value) { if (value) { @@ -224,7 +227,7 @@ static int receive_pack_config(const char *var, const char *value, void *cb) static void show_ref(const char *path, const unsigned char *sha1) { if (sent_capabilities) { - packet_write(1, "%s %s\n", sha1_to_hex(sha1), path); + packet_write_fmt(1, "%s %s\n", sha1_to_hex(sha1), path); } else { struct strbuf cap = STRBUF_INIT; @@ -239,7 +242,7 @@ static void show_ref(const char *path, const unsigned char *sha1) if (advertise_push_options) strbuf_addstr(&cap, " push-options"); strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized()); - packet_write(1, "%s %s%c%s\n", + packet_write_fmt(1, "%s %s%c%s\n", sha1_to_hex(sha1), path, 0, cap.buf); strbuf_release(&cap); sent_capabilities = 1; @@ -664,6 +667,9 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed, } else argv_array_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT"); + if (tmp_objdir) + argv_array_pushv(&proc.env_array, tmp_objdir_env(tmp_objdir)); + if (use_sideband) { memset(&muxer, 0, sizeof(muxer)); muxer.proc = copy_to_sideband; @@ -763,6 +769,7 @@ static int run_update_hook(struct command *cmd) proc.stdout_to_stderr = 1; proc.err = use_sideband ? -1 : 0; proc.argv = argv; + proc.env = tmp_objdir_env(tmp_objdir); code = start_command(&proc); if (code) @@ -834,6 +841,7 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si) !delayed_reachability_test(si, i)) sha1_array_append(&extra, si->shallow->sha1[i]); + opt.env = tmp_objdir_env(tmp_objdir); setup_alternate_shallow(&shallow_lock, &opt.shallow_file, &extra); if (check_connected(command_singleton_iterator, cmd, &opt)) { rollback_lock_file(&shallow_lock); @@ -1155,10 +1163,6 @@ static void check_aliased_update(struct command *cmd, struct string_list *list) struct string_list_item *item; struct command *dst_cmd; unsigned char sha1[GIT_SHA1_RAWSZ]; - char cmd_oldh[GIT_SHA1_HEXSZ + 1], - cmd_newh[GIT_SHA1_HEXSZ + 1], - dst_oldh[GIT_SHA1_HEXSZ + 1], - dst_newh[GIT_SHA1_HEXSZ + 1]; int flag; strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name); @@ -1189,14 +1193,14 @@ static void check_aliased_update(struct command *cmd, struct string_list *list) dst_cmd->skip_update = 1; - find_unique_abbrev_r(cmd_oldh, cmd->old_sha1, DEFAULT_ABBREV); - find_unique_abbrev_r(cmd_newh, cmd->new_sha1, DEFAULT_ABBREV); - find_unique_abbrev_r(dst_oldh, dst_cmd->old_sha1, DEFAULT_ABBREV); - find_unique_abbrev_r(dst_newh, dst_cmd->new_sha1, DEFAULT_ABBREV); rp_error("refusing inconsistent update between symref '%s' (%s..%s) and" " its target '%s' (%s..%s)", - cmd->ref_name, cmd_oldh, cmd_newh, - dst_cmd->ref_name, dst_oldh, dst_newh); + cmd->ref_name, + find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV), + find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV), + dst_cmd->ref_name, + find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV), + find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV)); cmd->error_string = dst_cmd->error_string = "inconsistent aliased update"; @@ -1241,12 +1245,17 @@ static void set_connectivity_errors(struct command *commands, for (cmd = commands; cmd; cmd = cmd->next) { struct command *singleton = cmd; + struct check_connected_options opt = CHECK_CONNECTED_INIT; + if (shallow_update && si->shallow_ref[cmd->index]) /* to be checked in update_shallow_ref() */ continue; + + opt.env = tmp_objdir_env(tmp_objdir); if (!check_connected(command_singleton_iterator, &singleton, - NULL)) + &opt)) continue; + cmd->error_string = "missing necessary objects"; } } @@ -1429,6 +1438,7 @@ static void execute_commands(struct command *commands, data.si = si; opt.err_fd = err_fd; opt.progress = err_fd && !quiet; + opt.env = tmp_objdir_env(tmp_objdir); if (check_connected(iterate_receive_command_list, &data, &opt)) set_connectivity_errors(commands, si); @@ -1445,6 +1455,19 @@ static void execute_commands(struct command *commands, return; } + /* + * Now we'll start writing out refs, which means the objects need + * to be in their final positions so that other processes can see them. + */ + if (tmp_objdir_migrate(tmp_objdir) < 0) { + for (cmd = commands; cmd; cmd = cmd->next) { + if (!cmd->error_string) + cmd->error_string = "unable to migrate objects to permanent storage"; + } + return; + } + tmp_objdir = NULL; + check_aliased_updates(commands); free(head_name_to_free); @@ -1640,6 +1663,18 @@ static const char *unpack(int err_fd, struct shallow_info *si) argv_array_push(&child.args, alt_shallow_file); } + tmp_objdir = tmp_objdir_create(); + if (!tmp_objdir) + return "unable to create temporary object directory"; + child.env = tmp_objdir_env(tmp_objdir); + + /* + * Normally we just pass the tmp_objdir environment to the child + * processes that do the heavy lifting, but we may need to see these + * objects ourselves to set up shallow information. + */ + tmp_objdir_add_as_alternate(tmp_objdir); + if (ntohl(hdr.hdr_entries) < unpack_limit) { argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL); if (quiet) diff --git a/builtin/remote-ext.c b/builtin/remote-ext.c index 88eb8f9013..11b48bfb41 100644 --- a/builtin/remote-ext.c +++ b/builtin/remote-ext.c @@ -128,9 +128,9 @@ static void send_git_request(int stdin_fd, const char *serv, const char *repo, const char *vhost) { if (!vhost) - packet_write(stdin_fd, "%s %s%c", serv, repo, 0); + packet_write_fmt(stdin_fd, "%s %s%c", serv, repo, 0); else - packet_write(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0, + packet_write_fmt(stdin_fd, "%s %s%chost=%s%c", serv, repo, 0, vhost, 0); } diff --git a/builtin/reset.c b/builtin/reset.c index 5aa86079d3..c04ac076dc 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -24,7 +24,7 @@ static const char * const git_reset_usage[] = { N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"), - N_("git reset [-q] <tree-ish> [--] <paths>..."), + N_("git reset [-q] [<tree-ish>] [--] <paths>..."), N_("git reset --patch [<tree-ish>] [--] [<paths>...]"), NULL }; diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 8479f6ed28..c43decda70 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -145,7 +145,7 @@ static void show_commit(struct commit *commit, void *data) */ if (buf.len && buf.buf[buf.len - 1] == '\n') graph_show_padding(revs->graph); - putchar('\n'); + putchar(info->hdr_termination); } else { /* * If the message buffer is empty, just show diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 4da1f1da25..cfb0f1510c 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -671,8 +671,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) filter &= ~(DO_FLAGS|DO_NOREV); verify = 1; abbrev = DEFAULT_ABBREV; - if (arg[7] == '=') - abbrev = strtoul(arg + 8, NULL, 10); + if (!arg[7]) + continue; + abbrev = strtoul(arg + 8, NULL, 10); if (abbrev < MINIMUM_ABBREV) abbrev = MINIMUM_ABBREV; else if (40 <= abbrev) diff --git a/builtin/revert.c b/builtin/revert.c index 4e693808b1..4ca5b51544 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -71,7 +71,7 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...) die(_("%s: %s cannot be used with %s"), me, this_opt, base_opt); } -static void parse_args(int argc, const char **argv, struct replay_opts *opts) +static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) { const char * const * usage_str = revert_or_cherry_pick_usage(opts); const char *me = action_name(opts); @@ -115,25 +115,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) if (opts->keep_redundant_commits) opts->allow_empty = 1; - /* Set the subcommand */ - if (cmd == 'q') - opts->subcommand = REPLAY_REMOVE_STATE; - else if (cmd == 'c') - opts->subcommand = REPLAY_CONTINUE; - else if (cmd == 'a') - opts->subcommand = REPLAY_ROLLBACK; - else - opts->subcommand = REPLAY_NONE; - /* Check for incompatible command line arguments */ - if (opts->subcommand != REPLAY_NONE) { + if (cmd) { char *this_operation; - if (opts->subcommand == REPLAY_REMOVE_STATE) + if (cmd == 'q') this_operation = "--quit"; - else if (opts->subcommand == REPLAY_CONTINUE) + else if (cmd == 'c') this_operation = "--continue"; else { - assert(opts->subcommand == REPLAY_ROLLBACK); + assert(cmd == 'a'); this_operation = "--abort"; } @@ -156,7 +146,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) "--edit", opts->edit, NULL); - if (opts->subcommand != REPLAY_NONE) { + if (cmd) { opts->revs = NULL; } else { struct setup_revision_opt s_r_opt; @@ -174,20 +164,30 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) if (argc > 1) usage_with_options(usage_str, options); + + /* These option values will be free()d */ + opts->gpg_sign = xstrdup_or_null(opts->gpg_sign); + opts->strategy = xstrdup_or_null(opts->strategy); + + if (cmd == 'q') + return sequencer_remove_state(opts); + if (cmd == 'c') + return sequencer_continue(opts); + if (cmd == 'a') + return sequencer_rollback(opts); + return sequencer_pick_revisions(opts); } int cmd_revert(int argc, const char **argv, const char *prefix) { - struct replay_opts opts; + struct replay_opts opts = REPLAY_OPTS_INIT; int res; - memset(&opts, 0, sizeof(opts)); if (isatty(0)) opts.edit = 1; opts.action = REPLAY_REVERT; git_config(git_default_config, NULL); - parse_args(argc, argv, &opts); - res = sequencer_pick_revisions(&opts); + res = run_sequencer(argc, argv, &opts); if (res < 0) die(_("revert failed")); return res; @@ -195,14 +195,12 @@ int cmd_revert(int argc, const char **argv, const char *prefix) int cmd_cherry_pick(int argc, const char **argv, const char *prefix) { - struct replay_opts opts; + struct replay_opts opts = REPLAY_OPTS_INIT; int res; - memset(&opts, 0, sizeof(opts)); opts.action = REPLAY_PICK; git_config(git_default_config, NULL); - parse_args(argc, argv, &opts); - res = sequencer_pick_revisions(&opts); + res = run_sequencer(argc, argv, &opts); if (res < 0) die(_("cherry-pick failed")); return res; diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 444ec06c2a..4beeda5f9f 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -95,6 +95,8 @@ static int chop_last_dir(char **remoteurl, int is_relative) * NEEDSWORK: This works incorrectly on the domain and protocol part. * remote_url url outcome expectation * http://a.com/b ../c http://a.com/c as is + * http://a.com/b/ ../c http://a.com/c same as previous line, but + * ignore trailing slash in url * http://a.com/b ../../c http://c error out * http://a.com/b ../../../c http:/c error out * http://a.com/b ../../../../c http:c error out @@ -113,8 +115,8 @@ static char *relative_url(const char *remote_url, struct strbuf sb = STRBUF_INIT; size_t len = strlen(remoteurl); - if (is_dir_sep(remoteurl[len])) - remoteurl[len] = '\0'; + if (is_dir_sep(remoteurl[len-1])) + remoteurl[len-1] = '\0'; if (!url_is_local_not_ssh(remoteurl) || is_absolute_path(remoteurl)) is_relative = 0; @@ -147,6 +149,8 @@ static char *relative_url(const char *remote_url, } strbuf_reset(&sb); strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url); + if (ends_with(url, "/")) + strbuf_setlen(&sb, sb.len - 1); free(remoteurl); if (starts_with_dot_slash(sb.buf)) @@ -492,20 +496,16 @@ static int add_possible_reference_from_superproject( { struct submodule_alternate_setup *sas = sas_cb; - /* directory name, minus trailing slash */ - size_t namelen = alt->name - alt->base - 1; - struct strbuf name = STRBUF_INIT; - strbuf_add(&name, alt->base, namelen); - /* * If the alternate object store is another repository, try the * standard layout with .git/modules/<name>/objects */ - if (ends_with(name.buf, ".git/objects")) { + if (ends_with(alt->path, ".git/objects")) { char *sm_alternate; struct strbuf sb = STRBUF_INIT; struct strbuf err = STRBUF_INIT; - strbuf_add(&sb, name.buf, name.len - strlen("objects")); + strbuf_add(&sb, alt->path, strlen(alt->path) - strlen("objects")); + /* * We need to end the new path with '/' to mark it as a dir, * otherwise a submodule name containing '/' will be broken @@ -533,7 +533,6 @@ static int add_possible_reference_from_superproject( strbuf_release(&sb); } - strbuf_release(&name); return 0; } diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index 2caedf1849..dc872f6a94 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -88,11 +88,11 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix) writer.git_cmd = 1; if (start_command(&writer)) { int err = errno; - packet_write(1, "NACK unable to spawn subprocess\n"); + packet_write_fmt(1, "NACK unable to spawn subprocess\n"); die("upload-archive: %s", strerror(err)); } - packet_write(1, "ACK\n"); + packet_write_fmt(1, "ACK\n"); packet_flush(1); while (1) { @@ -409,6 +409,7 @@ static inline enum object_type object_type(unsigned int mode) #define GIT_NAMESPACE_ENVIRONMENT "GIT_NAMESPACE" #define GIT_WORK_TREE_ENVIRONMENT "GIT_WORK_TREE" #define GIT_PREFIX_ENVIRONMENT "GIT_PREFIX" +#define GIT_SUPER_PREFIX_ENVIRONMENT "GIT_INTERNAL_SUPER_PREFIX" #define DEFAULT_GIT_DIR_ENVIRONMENT ".git" #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY" #define INDEX_ENVIRONMENT "GIT_INDEX_FILE" @@ -433,6 +434,7 @@ static inline enum object_type object_type(unsigned int mode) #define GIT_GLOB_PATHSPECS_ENVIRONMENT "GIT_GLOB_PATHSPECS" #define GIT_NOGLOB_PATHSPECS_ENVIRONMENT "GIT_NOGLOB_PATHSPECS" #define GIT_ICASE_PATHSPECS_ENVIRONMENT "GIT_ICASE_PATHSPECS" +#define GIT_QUARANTINE_ENVIRONMENT "GIT_QUARANTINE_PATH" /* * This environment variable is expected to contain a boolean indicating @@ -475,6 +477,7 @@ extern int get_common_dir_noenv(struct strbuf *sb, const char *gitdir); extern int get_common_dir(struct strbuf *sb, const char *gitdir); extern const char *get_git_namespace(void); extern const char *strip_namespace(const char *namespaced_ref); +extern const char *get_super_prefix(void); extern const char *get_git_work_tree(void); /* @@ -900,8 +903,8 @@ extern char *sha1_pack_index_name(const unsigned char *sha1); * The result will be at least `len` characters long, and will be NUL * terminated. * - * The non-`_r` version returns a static buffer which will be overwritten by - * subsequent calls. + * The non-`_r` version returns a static buffer which remains valid until 4 + * more calls to find_unique_abbrev are made. * * The `_r` variant writes to a buffer supplied by the caller, which must be at * least `GIT_SHA1_HEXSZ + 1` bytes. The return value is the number of bytes @@ -1122,7 +1125,7 @@ extern int write_sha1_file(const void *buf, unsigned long len, const char *type, extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, unsigned char *sha1, unsigned flags); 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 int git_open(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); @@ -1154,6 +1157,7 @@ static inline int has_sha1_file(const unsigned char *sha1) /* Same as the above, except for struct object_id. */ extern int has_object_file(const struct object_id *oid); +extern int has_object_file_with_flags(const struct object_id *oid, int flags); /* * Return true iff an alternate object database has a loose object @@ -1186,6 +1190,9 @@ static inline int hex2chr(const char *s) #define MINIMUM_ABBREV minimum_abbrev #define DEFAULT_ABBREV default_abbrev +/* used when the code does not know or care what the default abbrev is */ +#define FALLBACK_DEFAULT_ABBREV 7 + struct object_context { unsigned char tree[20]; char path[PATH_MAX]; @@ -1390,16 +1397,46 @@ extern void remove_scheduled_dirs(void); extern struct alternate_object_database { struct alternate_object_database *next; - char *name; - char base[FLEX_ARRAY]; /* more */ + + /* see alt_scratch_buf() */ + struct strbuf scratch; + size_t base_len; + + char path[FLEX_ARRAY]; } *alt_odb_list; extern void prepare_alt_odb(void); extern void read_info_alternates(const char * relative_base, int depth); extern char *compute_alternate_path(const char *path, struct strbuf *err); -extern void add_to_alternates_file(const char *reference); typedef int alt_odb_fn(struct alternate_object_database *, void *); extern int foreach_alt_odb(alt_odb_fn, void*); +/* + * Allocate a "struct alternate_object_database" but do _not_ actually + * add it to the list of alternates. + */ +struct alternate_object_database *alloc_alt_odb(const char *dir); + +/* + * Add the directory to the on-disk alternates file; the new entry will also + * take effect in the current process. + */ +extern void add_to_alternates_file(const char *dir); + +/* + * Add the directory to the in-memory list of alternates (along with any + * recursive alternates it points to), but do not modify the on-disk alternates + * file. + */ +extern void add_to_alternates_memory(const char *dir); + +/* + * Returns a scratch strbuf pre-filled with the alternate object directory, + * including a trailing slash, which can be used to access paths in the + * alternate. Always use this over direct access to alt->scratch, as it + * cleans up any previous use of the scratch buffer. + */ +extern struct strbuf *alt_scratch_buf(struct alternate_object_database *alt); + struct pack_window { struct pack_window *next; unsigned char *base; @@ -1456,6 +1493,12 @@ extern void prepare_packed_git(void); extern void reprepare_packed_git(void); extern void install_packed_git(struct packed_git *pack); +/* + * Give a rough count of objects in the repository. This sacrifices accuracy + * for speed. + */ +unsigned long approximate_object_count(void); + extern struct packed_git *find_sha1_pack(const unsigned char *sha1, struct packed_git *packs); diff --git a/combine-diff.c b/combine-diff.c index 8e2a577bdb..59501db99a 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -1203,9 +1203,9 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re /* Show sha1's */ for (i = 0; i < num_parent; i++) - printf(" %s", diff_unique_abbrev(p->parent[i].oid.hash, - opt->abbrev)); - printf(" %s ", diff_unique_abbrev(p->oid.hash, opt->abbrev)); + printf(" %s", diff_aligned_abbrev(&p->parent[i].oid, + opt->abbrev)); + printf(" %s ", diff_aligned_abbrev(&p->oid, opt->abbrev)); } if (opt->output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME_STATUS)) { diff --git a/configure.ac b/configure.ac index 3a43b7a5b3..0b15f04b10 100644 --- a/configure.ac +++ b/configure.ac @@ -836,9 +836,10 @@ AC_CHECK_TYPE([struct addrinfo],[ ]) GIT_CONF_SUBST([NO_IPV6]) # -# Define NO_REGEX if you have no or inferior regex support in your C library. -AC_CACHE_CHECK([whether the platform regex can handle null bytes], - [ac_cv_c_excellent_regex], [ +# Define NO_REGEX if your C library lacks regex support with REG_STARTEND +# feature. +AC_CACHE_CHECK([whether the platform regex supports REG_STARTEND], + [ac_cv_c_regex_with_reg_startend], [ AC_EGREP_CPP(yippeeyeswehaveit, AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT #include <regex.h> @@ -847,10 +848,10 @@ AC_EGREP_CPP(yippeeyeswehaveit, yippeeyeswehaveit #endif ]), - [ac_cv_c_excellent_regex=yes], - [ac_cv_c_excellent_regex=no]) + [ac_cv_c_regex_with_reg_startend=yes], + [ac_cv_c_regex_with_reg_startend=no]) ]) -if test $ac_cv_c_excellent_regex = yes; then +if test $ac_cv_c_regex_with_reg_startend = yes; then NO_REGEX= else NO_REGEX=YesPlease @@ -750,7 +750,7 @@ struct child_process *git_connect(int fd[2], const char *url, * Note: Do not add any other headers here! Doing so * will cause older git-daemon servers to crash. */ - packet_write(fd[1], + packet_write_fmt(fd[1], "%s %s%chost=%s%c", prog, path, 0, target_host, 0); diff --git a/connected.c b/connected.c index 8e3e4b1dc1..136c2ac168 100644 --- a/connected.c +++ b/connected.c @@ -63,6 +63,7 @@ int check_connected(sha1_iterate_fn fn, void *cb_data, _("Checking connectivity")); rev_list.git_cmd = 1; + rev_list.env = opt->env; rev_list.in = -1; rev_list.no_stdout = 1; if (opt->err_fd) diff --git a/connected.h b/connected.h index afa48cc052..4ca325f79d 100644 --- a/connected.h +++ b/connected.h @@ -33,6 +33,11 @@ struct check_connected_options { /* If non-zero, show progress as we traverse the objects. */ int progress; + + /* + * Insert these variables into the environment of the child process. + */ + const char **env; }; #define CHECK_CONNECTED_INIT { 0 } diff --git a/contrib/coccinelle/free.cocci b/contrib/coccinelle/free.cocci new file mode 100644 index 0000000000..e28213161a --- /dev/null +++ b/contrib/coccinelle/free.cocci @@ -0,0 +1,5 @@ +@@ +expression E; +@@ +- if (E) + free(E); diff --git a/contrib/coccinelle/xstrdup_or_null.cocci b/contrib/coccinelle/xstrdup_or_null.cocci new file mode 100644 index 0000000000..3fceef132b --- /dev/null +++ b/contrib/coccinelle/xstrdup_or_null.cocci @@ -0,0 +1,7 @@ +@@ +expression E; +expression V; +@@ +- if (E) +- V = xstrdup(E); ++ V = xstrdup_or_null(E); diff --git a/contrib/credential/libsecret/Makefile b/contrib/credential/libsecret/Makefile new file mode 100644 index 0000000000..3e67552cc5 --- /dev/null +++ b/contrib/credential/libsecret/Makefile @@ -0,0 +1,25 @@ +MAIN:=git-credential-libsecret +all:: $(MAIN) + +CC = gcc +RM = rm -f +CFLAGS = -g -O2 -Wall +PKG_CONFIG = pkg-config + +-include ../../../config.mak.autogen +-include ../../../config.mak + +INCS:=$(shell $(PKG_CONFIG) --cflags libsecret-1 glib-2.0) +LIBS:=$(shell $(PKG_CONFIG) --libs libsecret-1 glib-2.0) + +SRCS:=$(MAIN).c +OBJS:=$(SRCS:.c=.o) + +%.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $< + +$(MAIN): $(OBJS) + $(CC) -o $@ $(LDFLAGS) $^ $(LIBS) + +clean: + @$(RM) $(MAIN) $(OBJS) diff --git a/contrib/credential/libsecret/git-credential-libsecret.c b/contrib/credential/libsecret/git-credential-libsecret.c new file mode 100644 index 0000000000..4c56979d8a --- /dev/null +++ b/contrib/credential/libsecret/git-credential-libsecret.c @@ -0,0 +1,370 @@ +/* + * Copyright (C) 2011 John Szakmeister <john@szakmeister.net> + * 2012 Philipp A. Hartmann <pah@qo.cx> + * 2016 Mantas MikulÄ—nas <grawity@gmail.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Credits: + * - GNOME Keyring API handling originally written by John Szakmeister + * - ported to credential helper API by Philipp A. Hartmann + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <glib.h> +#include <libsecret/secret.h> + +/* + * This credential struct and API is simplified from git's credential.{h,c} + */ +struct credential { + char *protocol; + char *host; + unsigned short port; + char *path; + char *username; + char *password; +}; + +#define CREDENTIAL_INIT { NULL, NULL, 0, NULL, NULL, NULL } + +typedef int (*credential_op_cb)(struct credential *); + +struct credential_operation { + char *name; + credential_op_cb op; +}; + +#define CREDENTIAL_OP_END { NULL, NULL } + +/* ----------------- Secret Service functions ----------------- */ + +static char *make_label(struct credential *c) +{ + if (c->port) + return g_strdup_printf("Git: %s://%s:%hu/%s", + c->protocol, c->host, c->port, c->path ? c->path : ""); + else + return g_strdup_printf("Git: %s://%s/%s", + c->protocol, c->host, c->path ? c->path : ""); +} + +static GHashTable *make_attr_list(struct credential *c) +{ + GHashTable *al = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); + + if (c->username) + g_hash_table_insert(al, "user", g_strdup(c->username)); + if (c->protocol) + g_hash_table_insert(al, "protocol", g_strdup(c->protocol)); + if (c->host) + g_hash_table_insert(al, "server", g_strdup(c->host)); + if (c->port) + g_hash_table_insert(al, "port", g_strdup_printf("%hu", c->port)); + if (c->path) + g_hash_table_insert(al, "object", g_strdup(c->path)); + + return al; +} + +static int keyring_get(struct credential *c) +{ + SecretService *service = NULL; + GHashTable *attributes = NULL; + GError *error = NULL; + GList *items = NULL; + + if (!c->protocol || !(c->host || c->path)) + return EXIT_FAILURE; + + service = secret_service_get_sync(0, NULL, &error); + if (error != NULL) { + g_critical("could not connect to Secret Service: %s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } + + attributes = make_attr_list(c); + items = secret_service_search_sync(service, + SECRET_SCHEMA_COMPAT_NETWORK, + attributes, + SECRET_SEARCH_LOAD_SECRETS, + NULL, + &error); + g_hash_table_unref(attributes); + if (error != NULL) { + g_critical("lookup failed: %s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } + + if (items != NULL) { + SecretItem *item; + SecretValue *secret; + const char *s; + + item = items->data; + secret = secret_item_get_secret(item); + attributes = secret_item_get_attributes(item); + + s = g_hash_table_lookup(attributes, "user"); + if (s) { + g_free(c->username); + c->username = g_strdup(s); + } + + s = secret_value_get_text(secret); + if (s) { + g_free(c->password); + c->password = g_strdup(s); + } + + g_hash_table_unref(attributes); + secret_value_unref(secret); + g_list_free_full(items, g_object_unref); + } + + return EXIT_SUCCESS; +} + + +static int keyring_store(struct credential *c) +{ + char *label = NULL; + GHashTable *attributes = NULL; + GError *error = NULL; + + /* + * Sanity check that what we are storing is actually sensible. + * In particular, we can't make a URL without a protocol field. + * Without either a host or pathname (depending on the scheme), + * we have no primary key. And without a username and password, + * we are not actually storing a credential. + */ + if (!c->protocol || !(c->host || c->path) || + !c->username || !c->password) + return EXIT_FAILURE; + + label = make_label(c); + attributes = make_attr_list(c); + secret_password_storev_sync(SECRET_SCHEMA_COMPAT_NETWORK, + attributes, + NULL, + label, + c->password, + NULL, + &error); + g_free(label); + g_hash_table_unref(attributes); + + if (error != NULL) { + g_critical("store failed: %s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static int keyring_erase(struct credential *c) +{ + GHashTable *attributes = NULL; + GError *error = NULL; + + /* + * Sanity check that we actually have something to match + * against. The input we get is a restrictive pattern, + * so technically a blank credential means "erase everything". + * But it is too easy to accidentally send this, since it is equivalent + * to empty input. So explicitly disallow it, and require that the + * pattern have some actual content to match. + */ + if (!c->protocol && !c->host && !c->path && !c->username) + return EXIT_FAILURE; + + attributes = make_attr_list(c); + secret_password_clearv_sync(SECRET_SCHEMA_COMPAT_NETWORK, + attributes, + NULL, + &error); + g_hash_table_unref(attributes); + + if (error != NULL) { + g_critical("erase failed: %s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +/* + * Table with helper operation callbacks, used by generic + * credential helper main function. + */ +static struct credential_operation const credential_helper_ops[] = { + { "get", keyring_get }, + { "store", keyring_store }, + { "erase", keyring_erase }, + CREDENTIAL_OP_END +}; + +/* ------------------ credential functions ------------------ */ + +static void credential_init(struct credential *c) +{ + memset(c, 0, sizeof(*c)); +} + +static void credential_clear(struct credential *c) +{ + g_free(c->protocol); + g_free(c->host); + g_free(c->path); + g_free(c->username); + g_free(c->password); + + credential_init(c); +} + +static int credential_read(struct credential *c) +{ + char *buf; + size_t line_len; + char *key; + char *value; + + key = buf = g_malloc(1024); + + while (fgets(buf, 1024, stdin)) { + line_len = strlen(buf); + + if (line_len && buf[line_len-1] == '\n') + buf[--line_len] = '\0'; + + if (!line_len) + break; + + value = strchr(buf, '='); + if (!value) { + g_warning("invalid credential line: %s", key); + g_free(buf); + return -1; + } + *value++ = '\0'; + + if (!strcmp(key, "protocol")) { + g_free(c->protocol); + c->protocol = g_strdup(value); + } else if (!strcmp(key, "host")) { + g_free(c->host); + c->host = g_strdup(value); + value = strrchr(c->host, ':'); + if (value) { + *value++ = '\0'; + c->port = atoi(value); + } + } else if (!strcmp(key, "path")) { + g_free(c->path); + c->path = g_strdup(value); + } else if (!strcmp(key, "username")) { + g_free(c->username); + c->username = g_strdup(value); + } else if (!strcmp(key, "password")) { + g_free(c->password); + c->password = g_strdup(value); + while (*value) + *value++ = '\0'; + } + /* + * Ignore other lines; we don't know what they mean, but + * this future-proofs us when later versions of git do + * learn new lines, and the helpers are updated to match. + */ + } + + g_free(buf); + + return 0; +} + +static void credential_write_item(FILE *fp, const char *key, const char *value) +{ + if (!value) + return; + fprintf(fp, "%s=%s\n", key, value); +} + +static void credential_write(const struct credential *c) +{ + /* only write username/password, if set */ + credential_write_item(stdout, "username", c->username); + credential_write_item(stdout, "password", c->password); +} + +static void usage(const char *name) +{ + struct credential_operation const *try_op = credential_helper_ops; + const char *basename = strrchr(name, '/'); + + basename = (basename) ? basename + 1 : name; + fprintf(stderr, "usage: %s <", basename); + while (try_op->name) { + fprintf(stderr, "%s", (try_op++)->name); + if (try_op->name) + fprintf(stderr, "%s", "|"); + } + fprintf(stderr, "%s", ">\n"); +} + +int main(int argc, char *argv[]) +{ + int ret = EXIT_SUCCESS; + + struct credential_operation const *try_op = credential_helper_ops; + struct credential cred = CREDENTIAL_INIT; + + if (!argv[1]) { + usage(argv[0]); + exit(EXIT_FAILURE); + } + + g_set_application_name("Git Credential Helper"); + + /* lookup operation callback */ + while (try_op->name && strcmp(argv[1], try_op->name)) + try_op++; + + /* unsupported operation given -- ignore silently */ + if (!try_op->name || !try_op->op) + goto out; + + ret = credential_read(&cred); + if (ret) + goto out; + + /* perform credential operation */ + ret = (*try_op->op)(&cred); + + credential_write(&cred); + +out: + credential_clear(&cred); + return ret; +} diff --git a/contrib/long-running-filter/example.pl b/contrib/long-running-filter/example.pl new file mode 100755 index 0000000000..39457055a5 --- /dev/null +++ b/contrib/long-running-filter/example.pl @@ -0,0 +1,128 @@ +#!/usr/bin/perl +# +# Example implementation for the Git filter protocol version 2 +# See Documentation/gitattributes.txt, section "Filter Protocol" +# +# Please note, this pass-thru filter is a minimal skeleton. No proper +# error handling was implemented. +# + +use strict; +use warnings; + +my $MAX_PACKET_CONTENT_SIZE = 65516; + +sub packet_bin_read { + my $buffer; + my $bytes_read = read STDIN, $buffer, 4; + if ( $bytes_read == 0 ) { + + # EOF - Git stopped talking to us! + exit(); + } + elsif ( $bytes_read != 4 ) { + die "invalid packet: '$buffer'"; + } + my $pkt_size = hex($buffer); + if ( $pkt_size == 0 ) { + return ( 1, "" ); + } + elsif ( $pkt_size > 4 ) { + my $content_size = $pkt_size - 4; + $bytes_read = read STDIN, $buffer, $content_size; + if ( $bytes_read != $content_size ) { + die "invalid packet ($content_size bytes expected; $bytes_read bytes read)"; + } + return ( 0, $buffer ); + } + else { + die "invalid packet size: $pkt_size"; + } +} + +sub packet_txt_read { + my ( $res, $buf ) = packet_bin_read(); + unless ( $buf =~ s/\n$// ) { + die "A non-binary line MUST be terminated by an LF."; + } + return ( $res, $buf ); +} + +sub packet_bin_write { + my $buf = shift; + print STDOUT sprintf( "%04x", length($buf) + 4 ); + print STDOUT $buf; + STDOUT->flush(); +} + +sub packet_txt_write { + packet_bin_write( $_[0] . "\n" ); +} + +sub packet_flush { + print STDOUT sprintf( "%04x", 0 ); + STDOUT->flush(); +} + +( packet_txt_read() eq ( 0, "git-filter-client" ) ) || die "bad initialize"; +( packet_txt_read() eq ( 0, "version=2" ) ) || die "bad version"; +( packet_bin_read() eq ( 1, "" ) ) || die "bad version end"; + +packet_txt_write("git-filter-server"); +packet_txt_write("version=2"); +packet_flush(); + +( packet_txt_read() eq ( 0, "capability=clean" ) ) || die "bad capability"; +( packet_txt_read() eq ( 0, "capability=smudge" ) ) || die "bad capability"; +( packet_bin_read() eq ( 1, "" ) ) || die "bad capability end"; + +packet_txt_write("capability=clean"); +packet_txt_write("capability=smudge"); +packet_flush(); + +while (1) { + my ($command) = packet_txt_read() =~ /^command=([^=]+)$/; + my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/; + + packet_bin_read(); + + my $input = ""; + { + binmode(STDIN); + my $buffer; + my $done = 0; + while ( !$done ) { + ( $done, $buffer ) = packet_bin_read(); + $input .= $buffer; + } + } + + my $output; + if ( $command eq "clean" ) { + ### Perform clean here ### + $output = $input; + } + elsif ( $command eq "smudge" ) { + ### Perform smudge here ### + $output = $input; + } + else { + die "bad command '$command'"; + } + + packet_txt_write("status=success"); + packet_flush(); + while ( length($output) > 0 ) { + my $packet = substr( $output, 0, $MAX_PACKET_CONTENT_SIZE ); + packet_bin_write($packet); + if ( length($output) > $MAX_PACKET_CONTENT_SIZE ) { + $output = substr( $output, $MAX_PACKET_CONTENT_SIZE ); + } + else { + $output = ""; + } + } + packet_flush(); # flush content! + packet_flush(); # empty list, keep "status=success" unchanged! + +} @@ -3,6 +3,7 @@ #include "run-command.h" #include "quote.h" #include "sigchain.h" +#include "pkt-line.h" /* * convert.c - convert a file when checking it out and checking it in. @@ -197,17 +198,21 @@ static void check_safe_crlf(const char *path, enum crlf_action crlf_action, * CRLFs would not be restored by checkout */ if (checksafe == SAFE_CRLF_WARN) - warning("CRLF will be replaced by LF in %s.\nThe file will have its original line endings in your working directory.", path); + warning(_("CRLF will be replaced by LF in %s.\n" + "The file will have its original line" + " endings in your working directory."), path); else /* i.e. SAFE_CRLF_FAIL */ - die("CRLF would be replaced by LF in %s.", path); + die(_("CRLF would be replaced by LF in %s."), path); } else if (old_stats->lonelf && !new_stats->lonelf ) { /* * CRLFs would be added by checkout */ if (checksafe == SAFE_CRLF_WARN) - warning("LF will be replaced by CRLF in %s.\nThe file will have its original line endings in your working directory.", path); + warning(_("LF will be replaced by CRLF in %s.\n" + "The file will have its original line" + " endings in your working directory."), path); else /* i.e. SAFE_CRLF_FAIL */ - die("LF would be replaced by CRLF in %s", path); + die(_("LF would be replaced by CRLF in %s"), path); } } @@ -412,7 +417,7 @@ static int filter_buffer_or_fd(int in, int out, void *data) child_process.out = out; if (start_command(&child_process)) - return error("cannot fork to run external filter %s", params->cmd); + return error("cannot fork to run external filter '%s'", params->cmd); sigchain_push(SIGPIPE, SIG_IGN); @@ -430,19 +435,19 @@ static int filter_buffer_or_fd(int in, int out, void *data) if (close(child_process.in)) write_err = 1; if (write_err) - error("cannot feed the input to external filter %s", params->cmd); + error("cannot feed the input to external filter '%s'", params->cmd); sigchain_pop(SIGPIPE); status = finish_command(&child_process); if (status) - error("external filter %s failed %d", params->cmd, status); + error("external filter '%s' failed %d", params->cmd, status); strbuf_release(&cmd); return (write_err || status); } -static int apply_filter(const char *path, const char *src, size_t len, int fd, +static int apply_single_file_filter(const char *path, const char *src, size_t len, int fd, struct strbuf *dst, const char *cmd) { /* @@ -451,17 +456,11 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd, * * (child --> cmd) --> us */ - int ret = 1; + int err = 0; struct strbuf nbuf = STRBUF_INIT; struct async async; struct filter_params params; - if (!cmd || !*cmd) - return 0; - - if (!dst) - return 1; - memset(&async, 0, sizeof(async)); async.proc = filter_buffer_or_fd; async.data = ¶ms; @@ -477,23 +476,304 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd, return 0; /* error was already reported */ if (strbuf_read(&nbuf, async.out, len) < 0) { - error("read from external filter %s failed", cmd); - ret = 0; + err = error("read from external filter '%s' failed", cmd); } if (close(async.out)) { - error("read from external filter %s failed", cmd); - ret = 0; + err = error("read from external filter '%s' failed", cmd); } if (finish_async(&async)) { - error("external filter %s failed", cmd); - ret = 0; + err = error("external filter '%s' failed", cmd); } - if (ret) { + if (!err) { strbuf_swap(dst, &nbuf); } strbuf_release(&nbuf); - return ret; + return !err; +} + +#define CAP_CLEAN (1u<<0) +#define CAP_SMUDGE (1u<<1) + +struct cmd2process { + struct hashmap_entry ent; /* must be the first member! */ + unsigned int supported_capabilities; + const char *cmd; + struct child_process process; +}; + +static int cmd_process_map_initialized; +static struct hashmap cmd_process_map; + +static int cmd2process_cmp(const struct cmd2process *e1, + const struct cmd2process *e2, + const void *unused) +{ + return strcmp(e1->cmd, e2->cmd); +} + +static struct cmd2process *find_multi_file_filter_entry(struct hashmap *hashmap, const char *cmd) +{ + struct cmd2process key; + hashmap_entry_init(&key, strhash(cmd)); + key.cmd = cmd; + return hashmap_get(hashmap, &key, NULL); +} + +static int packet_write_list(int fd, const char *line, ...) +{ + va_list args; + int err; + va_start(args, line); + for (;;) { + if (!line) + break; + if (strlen(line) > LARGE_PACKET_DATA_MAX) + return -1; + err = packet_write_fmt_gently(fd, "%s\n", line); + if (err) + return err; + line = va_arg(args, const char*); + } + va_end(args); + return packet_flush_gently(fd); +} + +static void read_multi_file_filter_status(int fd, struct strbuf *status) +{ + struct strbuf **pair; + char *line; + for (;;) { + line = packet_read_line(fd, NULL); + if (!line) + break; + pair = strbuf_split_str(line, '=', 2); + if (pair[0] && pair[0]->len && pair[1]) { + /* the last "status=<foo>" line wins */ + if (!strcmp(pair[0]->buf, "status=")) { + strbuf_reset(status); + strbuf_addbuf(status, pair[1]); + } + } + strbuf_list_free(pair); + } +} + +static void kill_multi_file_filter(struct hashmap *hashmap, struct cmd2process *entry) +{ + if (!entry) + return; + + entry->process.clean_on_exit = 0; + kill(entry->process.pid, SIGTERM); + finish_command(&entry->process); + + hashmap_remove(hashmap, entry, NULL); + free(entry); +} + +static void stop_multi_file_filter(struct child_process *process) +{ + sigchain_push(SIGPIPE, SIG_IGN); + /* Closing the pipe signals the filter to initiate a shutdown. */ + close(process->in); + close(process->out); + sigchain_pop(SIGPIPE); + /* Finish command will wait until the shutdown is complete. */ + finish_command(process); +} + +static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd) +{ + int err; + struct cmd2process *entry; + struct child_process *process; + const char *argv[] = { cmd, NULL }; + struct string_list cap_list = STRING_LIST_INIT_NODUP; + char *cap_buf; + const char *cap_name; + + entry = xmalloc(sizeof(*entry)); + entry->cmd = cmd; + entry->supported_capabilities = 0; + process = &entry->process; + + child_process_init(process); + process->argv = argv; + process->use_shell = 1; + process->in = -1; + process->out = -1; + process->clean_on_exit = 1; + process->clean_on_exit_handler = stop_multi_file_filter; + + if (start_command(process)) { + error("cannot fork to run external filter '%s'", cmd); + return NULL; + } + + hashmap_entry_init(entry, strhash(cmd)); + + sigchain_push(SIGPIPE, SIG_IGN); + + err = packet_write_list(process->in, "git-filter-client", "version=2", NULL); + if (err) + goto done; + + err = strcmp(packet_read_line(process->out, NULL), "git-filter-server"); + if (err) { + error("external filter '%s' does not support filter protocol version 2", cmd); + goto done; + } + err = strcmp(packet_read_line(process->out, NULL), "version=2"); + if (err) + goto done; + err = packet_read_line(process->out, NULL) != NULL; + if (err) + goto done; + + err = packet_write_list(process->in, "capability=clean", "capability=smudge", NULL); + + for (;;) { + cap_buf = packet_read_line(process->out, NULL); + if (!cap_buf) + break; + string_list_split_in_place(&cap_list, cap_buf, '=', 1); + + if (cap_list.nr != 2 || strcmp(cap_list.items[0].string, "capability")) + continue; + + cap_name = cap_list.items[1].string; + if (!strcmp(cap_name, "clean")) { + entry->supported_capabilities |= CAP_CLEAN; + } else if (!strcmp(cap_name, "smudge")) { + entry->supported_capabilities |= CAP_SMUDGE; + } else { + warning( + "external filter '%s' requested unsupported filter capability '%s'", + cmd, cap_name + ); + } + + string_list_clear(&cap_list, 0); + } + +done: + sigchain_pop(SIGPIPE); + + if (err || errno == EPIPE) { + error("initialization for external filter '%s' failed", cmd); + kill_multi_file_filter(hashmap, entry); + return NULL; + } + + hashmap_add(hashmap, entry); + return entry; +} + +static int apply_multi_file_filter(const char *path, const char *src, size_t len, + int fd, struct strbuf *dst, const char *cmd, + const unsigned int wanted_capability) +{ + int err; + struct cmd2process *entry; + struct child_process *process; + struct strbuf nbuf = STRBUF_INIT; + struct strbuf filter_status = STRBUF_INIT; + const char *filter_type; + + if (!cmd_process_map_initialized) { + cmd_process_map_initialized = 1; + hashmap_init(&cmd_process_map, (hashmap_cmp_fn) cmd2process_cmp, 0); + entry = NULL; + } else { + entry = find_multi_file_filter_entry(&cmd_process_map, cmd); + } + + fflush(NULL); + + if (!entry) { + entry = start_multi_file_filter(&cmd_process_map, cmd); + if (!entry) + return 0; + } + process = &entry->process; + + if (!(wanted_capability & entry->supported_capabilities)) + return 0; + + if (CAP_CLEAN & wanted_capability) + filter_type = "clean"; + else if (CAP_SMUDGE & wanted_capability) + filter_type = "smudge"; + else + die("unexpected filter type"); + + sigchain_push(SIGPIPE, SIG_IGN); + + assert(strlen(filter_type) < LARGE_PACKET_DATA_MAX - strlen("command=\n")); + err = packet_write_fmt_gently(process->in, "command=%s\n", filter_type); + if (err) + goto done; + + err = strlen(path) > LARGE_PACKET_DATA_MAX - strlen("pathname=\n"); + if (err) { + error("path name too long for external filter"); + goto done; + } + + err = packet_write_fmt_gently(process->in, "pathname=%s\n", path); + if (err) + goto done; + + err = packet_flush_gently(process->in); + if (err) + goto done; + + if (fd >= 0) + err = write_packetized_from_fd(fd, process->in); + else + err = write_packetized_from_buf(src, len, process->in); + if (err) + goto done; + + read_multi_file_filter_status(process->out, &filter_status); + err = strcmp(filter_status.buf, "success"); + if (err) + goto done; + + err = read_packetized_to_strbuf(process->out, &nbuf) < 0; + if (err) + goto done; + + read_multi_file_filter_status(process->out, &filter_status); + err = strcmp(filter_status.buf, "success"); + +done: + sigchain_pop(SIGPIPE); + + if (err || errno == EPIPE) { + if (!strcmp(filter_status.buf, "error")) { + /* The filter signaled a problem with the file. */ + } else if (!strcmp(filter_status.buf, "abort")) { + /* + * The filter signaled a permanent problem. Don't try to filter + * files with the same command for the lifetime of the current + * Git process. + */ + entry->supported_capabilities &= ~wanted_capability; + } else { + /* + * Something went wrong with the protocol filter. + * Force shutdown and restart if another blob requires filtering. + */ + error("external filter '%s' failed", cmd); + kill_multi_file_filter(&cmd_process_map, entry); + } + } else { + strbuf_swap(dst, &nbuf); + } + strbuf_release(&nbuf); + return !err; } static struct convert_driver { @@ -501,9 +781,35 @@ static struct convert_driver { struct convert_driver *next; const char *smudge; const char *clean; + const char *process; int required; } *user_convert, **user_convert_tail; +static int apply_filter(const char *path, const char *src, size_t len, + int fd, struct strbuf *dst, struct convert_driver *drv, + const unsigned int wanted_capability) +{ + const char *cmd = NULL; + + if (!drv) + return 0; + + if (!dst) + return 1; + + if ((CAP_CLEAN & wanted_capability) && !drv->process && drv->clean) + cmd = drv->clean; + else if ((CAP_SMUDGE & wanted_capability) && !drv->process && drv->smudge) + cmd = drv->smudge; + + if (cmd && *cmd) + return apply_single_file_filter(path, src, len, fd, dst, cmd); + else if (drv->process && *drv->process) + return apply_multi_file_filter(path, src, len, fd, dst, drv->process, wanted_capability); + + return 0; +} + static int read_convert_config(const char *var, const char *value, void *cb) { const char *key, *name; @@ -541,6 +847,9 @@ static int read_convert_config(const char *var, const char *value, void *cb) if (!strcmp("clean", key)) return git_config_string(&drv->clean, var, value); + if (!strcmp("process", key)) + return git_config_string(&drv->process, var, value); + if (!strcmp("required", key)) { drv->required = git_config_bool(var, value); return 0; @@ -842,7 +1151,7 @@ int would_convert_to_git_filter_fd(const char *path) if (!ca.drv->required) return 0; - return apply_filter(path, NULL, 0, -1, NULL, ca.drv->clean); + return apply_filter(path, NULL, 0, -1, NULL, ca.drv, CAP_CLEAN); } const char *get_convert_attr_ascii(const char *path) @@ -875,18 +1184,12 @@ int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst, enum safe_crlf checksafe) { int ret = 0; - const char *filter = NULL; - int required = 0; struct conv_attrs ca; convert_attrs(&ca, path); - if (ca.drv) { - filter = ca.drv->clean; - required = ca.drv->required; - } - ret |= apply_filter(path, src, len, -1, dst, filter); - if (!ret && required) + ret |= apply_filter(path, src, len, -1, dst, ca.drv, CAP_CLEAN); + if (!ret && ca.drv && ca.drv->required) die("%s: clean filter '%s' failed", path, ca.drv->name); if (ret && dst) { @@ -908,9 +1211,9 @@ void convert_to_git_filter_fd(const char *path, int fd, struct strbuf *dst, convert_attrs(&ca, path); assert(ca.drv); - assert(ca.drv->clean); + assert(ca.drv->clean || ca.drv->process); - if (!apply_filter(path, NULL, 0, fd, dst, ca.drv->clean)) + if (!apply_filter(path, NULL, 0, fd, dst, ca.drv, CAP_CLEAN)) die("%s: clean filter '%s' failed", path, ca.drv->name); crlf_to_git(path, dst->buf, dst->len, dst, ca.crlf_action, checksafe); @@ -922,15 +1225,9 @@ static int convert_to_working_tree_internal(const char *path, const char *src, int normalizing) { int ret = 0, ret_filter = 0; - const char *filter = NULL; - int required = 0; struct conv_attrs ca; convert_attrs(&ca, path); - if (ca.drv) { - filter = ca.drv->smudge; - required = ca.drv->required; - } ret |= ident_to_worktree(path, src, len, dst, ca.ident); if (ret) { @@ -939,9 +1236,10 @@ static int convert_to_working_tree_internal(const char *path, const char *src, } /* * CRLF conversion can be skipped if normalizing, unless there - * is a smudge filter. The filter might expect CRLFs. + * is a smudge or process filter (even if the process filter doesn't + * support smudge). The filters might expect CRLFs. */ - if (filter || !normalizing) { + if ((ca.drv && (ca.drv->smudge || ca.drv->process)) || !normalizing) { ret |= crlf_to_worktree(path, src, len, dst, ca.crlf_action); if (ret) { src = dst->buf; @@ -949,8 +1247,8 @@ static int convert_to_working_tree_internal(const char *path, const char *src, } } - ret_filter = apply_filter(path, src, len, -1, dst, filter); - if (!ret_filter && required) + ret_filter = apply_filter(path, src, len, -1, dst, ca.drv, CAP_SMUDGE); + if (!ret_filter && ca.drv && ca.drv->required) die("%s: smudge filter %s failed", path, ca.drv->name); return ret | ret_filter; @@ -1402,7 +1700,7 @@ struct stream_filter *get_stream_filter(const char *path, const unsigned char *s struct stream_filter *filter = NULL; convert_attrs(&ca, path); - if (ca.drv && (ca.drv->smudge || ca.drv->clean)) + if (ca.drv && (ca.drv->process || ca.drv->smudge || ca.drv->clean)) return NULL; if (ca.crlf_action == CRLF_AUTO || ca.crlf_action == CRLF_AUTO_CRLF) diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c index 1e5f16a3a1..46c5937526 100644 --- a/credential-cache--daemon.c +++ b/credential-cache--daemon.c @@ -219,11 +219,11 @@ static void serve_cache(const char *socket_path, int debug) close(fd); } -static const char permissions_advice[] = +static const char permissions_advice[] = N_( "The permissions on your socket directory are too loose; other\n" "users may be able to read your cached credentials. Consider running:\n" "\n" -" chmod 0700 %s"; +" chmod 0700 %s"); static void init_socket_directory(const char *path) { struct stat st; @@ -232,7 +232,7 @@ static void init_socket_directory(const char *path) if (!stat(dir, &st)) { if (st.st_mode & 077) - die(permissions_advice, dir); + die(_(permissions_advice), dir); } else { /* * We must be sure to create the directory with the correct mode, @@ -160,6 +160,7 @@ static const char *path_ok(const char *directory, struct hostinfo *hi) { static char rpath[PATH_MAX]; static char interp_path[PATH_MAX]; + size_t rlen; const char *path; const char *dir; @@ -187,8 +188,12 @@ static const char *path_ok(const char *directory, struct hostinfo *hi) namlen = slash - dir; restlen -= namlen; loginfo("userpath <%s>, request <%s>, namlen %d, restlen %d, slash <%s>", user_path, dir, namlen, restlen, slash); - snprintf(rpath, PATH_MAX, "%.*s/%s%.*s", - namlen, dir, user_path, restlen, slash); + rlen = snprintf(rpath, sizeof(rpath), "%.*s/%s%.*s", + namlen, dir, user_path, restlen, slash); + if (rlen >= sizeof(rpath)) { + logerror("user-path too large: %s", rpath); + return NULL; + } dir = rpath; } } @@ -207,7 +212,15 @@ static const char *path_ok(const char *directory, struct hostinfo *hi) strbuf_expand(&expanded_path, interpolated_path, expand_path, &context); - strlcpy(interp_path, expanded_path.buf, PATH_MAX); + + rlen = strlcpy(interp_path, expanded_path.buf, + sizeof(interp_path)); + if (rlen >= sizeof(interp_path)) { + logerror("interpolated path too large: %s", + interp_path); + return NULL; + } + strbuf_release(&expanded_path); loginfo("Interpolated dir '%s'", interp_path); @@ -219,7 +232,11 @@ static const char *path_ok(const char *directory, struct hostinfo *hi) logerror("'%s': Non-absolute path denied (base-path active)", dir); return NULL; } - snprintf(rpath, PATH_MAX, "%s%s", base_path, dir); + rlen = snprintf(rpath, sizeof(rpath), "%s%s", base_path, dir); + if (rlen >= sizeof(rpath)) { + logerror("base-path too large: %s", rpath); + return NULL; + } dir = rpath; } @@ -281,7 +298,7 @@ static int daemon_error(const char *dir, const char *msg) { if (!informative_errors) msg = "access denied or repository not exported"; - packet_write(1, "ERR %s: %s", msg, dir); + packet_write_fmt(1, "ERR %s: %s", msg, dir); return -1; } diff --git a/diff-lib.c b/diff-lib.c index 3007c8524c..52447466b5 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -214,6 +214,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option) !is_null_oid(&ce->oid), ce->name, 0); continue; + } else if (revs->diffopt.ita_invisible_in_index && + ce_intent_to_add(ce)) { + diff_addremove(&revs->diffopt, '+', ce->ce_mode, + EMPTY_BLOB_SHA1_BIN, 0, + ce->name, 0); + continue; } changed = match_stat_with_submodule(&revs->diffopt, ce, &st, @@ -379,6 +385,14 @@ static void do_oneway_diff(struct unpack_trees_options *o, struct rev_info *revs = o->unpack_data; int match_missing, cached; + /* i-t-a entries do not actually exist in the index */ + if (revs->diffopt.ita_invisible_in_index && + idx && ce_intent_to_add(idx)) { + idx = NULL; + if (!tree) + return; /* nothing to diff.. */ + } + /* if the entry is not checked out, don't examine work tree */ cached = o->index_only || (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx))); @@ -521,7 +535,8 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt) return 0; } -int index_differs_from(const char *def, int diff_flags) +int index_differs_from(const char *def, int diff_flags, + int ita_invisible_in_index) { struct rev_info rev; struct setup_revision_opt opt; @@ -533,6 +548,7 @@ int index_differs_from(const char *def, int diff_flags) DIFF_OPT_SET(&rev.diffopt, QUICK); DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS); rev.diffopt.flags |= diff_flags; + rev.diffopt.ita_invisible_in_index = ita_invisible_in_index; run_diff_index(&rev, 1); if (rev.pending.alloc) free(rev.pending.objects); @@ -43,6 +43,7 @@ static int diff_stat_graph_width; static int diff_dirstat_permille_default = 30; static struct diff_options default_diff_options; static long diff_algorithm; +static unsigned ws_error_highlight_default = WSEH_NEW; static char diff_colors[][COLOR_MAXLEN] = { GIT_COLOR_RESET, @@ -172,6 +173,43 @@ long parse_algorithm_value(const char *value) return -1; } +static int parse_one_token(const char **arg, const char *token) +{ + const char *rest; + if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) { + *arg = rest; + return 1; + } + return 0; +} + +static int parse_ws_error_highlight(const char *arg) +{ + const char *orig_arg = arg; + unsigned val = 0; + + while (*arg) { + if (parse_one_token(&arg, "none")) + val = 0; + else if (parse_one_token(&arg, "default")) + val = WSEH_NEW; + else if (parse_one_token(&arg, "all")) + val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT; + else if (parse_one_token(&arg, "new")) + val |= WSEH_NEW; + else if (parse_one_token(&arg, "old")) + val |= WSEH_OLD; + else if (parse_one_token(&arg, "context")) + val |= WSEH_CONTEXT; + else { + return -1 - (int)(arg - orig_arg); + } + if (*arg) + arg++; + } + return val; +} + /* * These are to give UI layer defaults. * The core-level commands such as git-diff-files should @@ -256,6 +294,15 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) if (git_diff_heuristic_config(var, value, cb) < 0) return -1; + + if (!strcmp(var, "diff.wserrorhighlight")) { + int val = parse_ws_error_highlight(value); + if (val < 0) + return -1; + ws_error_highlight_default = val; + return 0; + } + if (git_color_config(var, value, cb) < 0) return -1; @@ -3049,6 +3096,21 @@ static int similarity_index(struct diff_filepair *p) return p->score * 100 / MAX_SCORE; } +static const char *diff_abbrev_oid(const struct object_id *oid, int abbrev) +{ + if (startup_info->have_repository) + return find_unique_abbrev(oid->hash, abbrev); + else { + char *hex = oid_to_hex(oid); + if (abbrev < 0) + abbrev = FALLBACK_DEFAULT_ABBREV; + if (abbrev > GIT_SHA1_HEXSZ) + die("BUG: oid abbreviation out of range: %d", abbrev); + hex[abbrev] = '\0'; + return hex; + } +} + static void fill_metainfo(struct strbuf *msg, const char *name, const char *other, @@ -3107,9 +3169,9 @@ static void fill_metainfo(struct strbuf *msg, (!fill_mmfile(&mf, two) && diff_filespec_is_binary(two))) abbrev = 40; } - strbuf_addf(msg, "%s%sindex %s..", line_prefix, set, - find_unique_abbrev(one->oid.hash, abbrev)); - strbuf_add_unique_abbrev(msg, two->oid.hash, abbrev); + strbuf_addf(msg, "%s%sindex %s..%s", line_prefix, set, + diff_abbrev_oid(&one->oid, abbrev), + diff_abbrev_oid(&two->oid, abbrev)); if (one->mode == two->mode) strbuf_addf(msg, " %06o", one->mode); strbuf_addf(msg, "%s\n", reset); @@ -3307,7 +3369,7 @@ void diff_setup(struct diff_options *options) options->rename_limit = -1; options->dirstat_permille = diff_dirstat_permille_default; options->context = diff_context_default; - options->ws_error_highlight = WSEH_NEW; + options->ws_error_highlight = ws_error_highlight_default; DIFF_OPT_SET(options, RENAME_EMPTY); /* pathchange left =NULL by default */ @@ -3421,7 +3483,7 @@ void diff_setup_done(struct diff_options *options) */ read_cache(); } - if (options->abbrev <= 0 || 40 < options->abbrev) + if (40 < options->abbrev) options->abbrev = 40; /* full */ /* @@ -3698,40 +3760,14 @@ static void enable_patch_output(int *fmt) { *fmt |= DIFF_FORMAT_PATCH; } -static int parse_one_token(const char **arg, const char *token) +static int parse_ws_error_highlight_opt(struct diff_options *opt, const char *arg) { - const char *rest; - if (skip_prefix(*arg, token, &rest) && (!*rest || *rest == ',')) { - *arg = rest; - return 1; - } - return 0; -} + int val = parse_ws_error_highlight(arg); -static int parse_ws_error_highlight(struct diff_options *opt, const char *arg) -{ - const char *orig_arg = arg; - unsigned val = 0; - while (*arg) { - if (parse_one_token(&arg, "none")) - val = 0; - else if (parse_one_token(&arg, "default")) - val = WSEH_NEW; - else if (parse_one_token(&arg, "all")) - val = WSEH_NEW | WSEH_OLD | WSEH_CONTEXT; - else if (parse_one_token(&arg, "new")) - val |= WSEH_NEW; - else if (parse_one_token(&arg, "old")) - val |= WSEH_OLD; - else if (parse_one_token(&arg, "context")) - val |= WSEH_CONTEXT; - else { - error("unknown value after ws-error-highlight=%.*s", - (int)(arg - orig_arg), orig_arg); - return 0; - } - if (*arg) - arg++; + if (val < 0) { + error("unknown value after ws-error-highlight=%.*s", + -1 - val, arg); + return 0; } opt->ws_error_highlight = val; return 1; @@ -3950,7 +3986,11 @@ int diff_opt_parse(struct diff_options *options, else if (skip_prefix(arg, "--submodule=", &arg)) return parse_submodule_opt(options, arg); else if (skip_prefix(arg, "--ws-error-highlight=", &arg)) - return parse_ws_error_highlight(options, arg); + return parse_ws_error_highlight_opt(options, arg); + else if (!strcmp(arg, "--ita-invisible-in-index")) + options->ita_invisible_in_index = 1; + else if (!strcmp(arg, "--ita-visible-in-index")) + options->ita_invisible_in_index = 0; /* misc options */ else if (!strcmp(arg, "-z")) @@ -4136,27 +4176,46 @@ void diff_free_filepair(struct diff_filepair *p) free(p); } -/* This is different from find_unique_abbrev() in that - * it stuffs the result with dots for alignment. - */ -const char *diff_unique_abbrev(const unsigned char *sha1, int len) +const char *diff_aligned_abbrev(const struct object_id *oid, int len) { int abblen; const char *abbrev; - if (len == 40) - return sha1_to_hex(sha1); - abbrev = find_unique_abbrev(sha1, len); + if (len == GIT_SHA1_HEXSZ) + return oid_to_hex(oid); + + abbrev = diff_abbrev_oid(oid, len); abblen = strlen(abbrev); - if (abblen < 37) { - static char hex[41]; + + /* + * In well-behaved cases, where the abbbreviated result is the + * same as the requested length, append three dots after the + * abbreviation (hence the whole logic is limited to the case + * where abblen < 37); when the actual abbreviated result is a + * bit longer than the requested length, we reduce the number + * of dots so that they match the well-behaved ones. However, + * if the actual abbreviation is longer than the requested + * length by more than three, we give up on aligning, and add + * three dots anyway, to indicate that the output is not the + * full object name. Yes, this may be suboptimal, but this + * appears only in "diff --raw --abbrev" output and it is not + * worth the effort to change it now. Note that this would + * likely to work fine when the automatic sizing of default + * abbreviation length is used--we would be fed -1 in "len" in + * that case, and will end up always appending three-dots, but + * the automatic sizing is supposed to give abblen that ensures + * uniqueness across all objects (statistically speaking). + */ + if (abblen < GIT_SHA1_HEXSZ - 3) { + static char hex[GIT_SHA1_HEXSZ + 1]; if (len < abblen && abblen <= len + 2) xsnprintf(hex, sizeof(hex), "%s%.*s", abbrev, len+3-abblen, ".."); else xsnprintf(hex, sizeof(hex), "%s...", abbrev); return hex; } - return sha1_to_hex(sha1); + + return oid_to_hex(oid); } static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt) @@ -4167,9 +4226,9 @@ static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt) fprintf(opt->file, "%s", diff_line_prefix(opt)); if (!(opt->output_format & DIFF_FORMAT_NAME_STATUS)) { fprintf(opt->file, ":%06o %06o %s ", p->one->mode, p->two->mode, - diff_unique_abbrev(p->one->oid.hash, opt->abbrev)); + diff_aligned_abbrev(&p->one->oid, opt->abbrev)); fprintf(opt->file, "%s ", - diff_unique_abbrev(p->two->oid.hash, opt->abbrev)); + diff_aligned_abbrev(&p->two->oid, opt->abbrev)); } if (p->score) { fprintf(opt->file, "%c%03d%c", p->status, similarity_index(p), @@ -4638,25 +4697,25 @@ static int is_summary_empty(const struct diff_queue_struct *q) } static const char rename_limit_warning[] = -"inexact rename detection was skipped due to too many files."; +N_("inexact rename detection was skipped due to too many files."); static const char degrade_cc_to_c_warning[] = -"only found copies from modified paths due to too many files."; +N_("only found copies from modified paths due to too many files."); static const char rename_limit_advice[] = -"you may want to set your %s variable to at least " -"%d and retry the command."; +N_("you may want to set your %s variable to at least " + "%d and retry the command."); void diff_warn_rename_limit(const char *varname, int needed, int degraded_cc) { if (degraded_cc) - warning(degrade_cc_to_c_warning); + warning(_(degrade_cc_to_c_warning)); else if (needed) - warning(rename_limit_warning); + warning(_(rename_limit_warning)); else return; if (0 < needed && needed < 32767) - warning(rename_limit_advice, varname, needed); + warning(_(rename_limit_advice), varname, needed); } void diff_flush(struct diff_options *options) @@ -146,6 +146,7 @@ struct diff_options { int dirstat_permille; int setup; int abbrev; + int ita_invisible_in_index; /* white-space error highlighting */ #define WSEH_NEW 1 #define WSEH_CONTEXT 2 @@ -340,7 +341,11 @@ extern void diff_warn_rename_limit(const char *varname, int needed, int degraded #define DIFF_STATUS_FILTER_AON '*' #define DIFF_STATUS_FILTER_BROKEN 'B' -extern const char *diff_unique_abbrev(const unsigned char *, int); +/* + * This is different from find_unique_abbrev() in that + * it stuffs the result with dots for alignment. + */ +extern const char *diff_aligned_abbrev(const struct object_id *sha1, int); /* do not report anything on removed paths */ #define DIFF_SILENT_ON_REMOVED 01 @@ -356,7 +361,7 @@ extern int diff_result_code(struct diff_options *, int); extern void diff_no_index(struct rev_info *, int, const char **); -extern int index_differs_from(const char *def, int diff_flags); +extern int index_differs_from(const char *def, int diff_flags, int ita_invisible_in_index); /* * Fill the contents of the filespec "df", respecting any textconv defined by @@ -207,8 +207,9 @@ int within_depth(const char *name, int namelen, return 1; } -#define DO_MATCH_EXCLUDE 1 -#define DO_MATCH_DIRECTORY 2 +#define DO_MATCH_EXCLUDE (1<<0) +#define DO_MATCH_DIRECTORY (1<<1) +#define DO_MATCH_SUBMODULE (1<<2) /* * Does 'match' match the given name? @@ -283,6 +284,32 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix, item->nowildcard_len - prefix)) return MATCHED_FNMATCH; + /* Perform checks to see if "name" is a super set of the pathspec */ + if (flags & DO_MATCH_SUBMODULE) { + /* name is a literal prefix of the pathspec */ + if ((namelen < matchlen) && + (match[namelen] == '/') && + !ps_strncmp(item, match, name, namelen)) + return MATCHED_RECURSIVELY; + + /* name" doesn't match up to the first wild character */ + if (item->nowildcard_len < item->len && + ps_strncmp(item, match, name, + item->nowildcard_len - prefix)) + return 0; + + /* + * Here is where we would perform a wildmatch to check if + * "name" can be matched as a directory (or a prefix) against + * the pathspec. Since wildmatch doesn't have this capability + * at the present we have to punt and say that it is a match, + * potentially returning a false positive + * The submodules themselves will be able to perform more + * accurate matching to determine if the pathspec matches. + */ + return MATCHED_RECURSIVELY; + } + return 0; } @@ -386,6 +413,21 @@ int match_pathspec(const struct pathspec *ps, return negative ? 0 : positive; } +/** + * Check if a submodule is a superset of the pathspec + */ +int submodule_path_match(const struct pathspec *ps, + const char *submodule_name, + char *seen) +{ + int matched = do_match_pathspec(ps, submodule_name, + strlen(submodule_name), + 0, seen, + DO_MATCH_DIRECTORY | + DO_MATCH_SUBMODULE); + return matched; +} + int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix) @@ -2195,8 +2237,6 @@ static GIT_PATH_FUNC(git_path_info_exclude, "info/exclude") void setup_standard_excludes(struct dir_struct *dir) { - const char *path; - dir->exclude_per_dir = ".gitignore"; /* core.excludefile defaulting to $XDG_HOME/git/ignore */ @@ -2207,10 +2247,12 @@ void setup_standard_excludes(struct dir_struct *dir) dir->untracked ? &dir->ss_excludes_file : NULL); /* per repository user preference */ - path = git_path_info_exclude(); - if (!access_or_warn(path, R_OK, 0)) - add_excludes_from_file_1(dir, path, - dir->untracked ? &dir->ss_info_exclude : NULL); + if (startup_info->have_repository) { + const char *path = git_path_info_exclude(); + if (!access_or_warn(path, R_OK, 0)) + add_excludes_from_file_1(dir, path, + dir->untracked ? &dir->ss_info_exclude : NULL); + } } int remove_path(const char *name) @@ -304,6 +304,10 @@ extern int git_fnmatch(const struct pathspec_item *item, const char *pattern, const char *string, int prefix); +extern int submodule_path_match(const struct pathspec *ps, + const char *submodule_name, + char *seen); + static inline int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec, char *seen) diff --git a/environment.c b/environment.c index cd5aa57179..0935ec696e 100644 --- a/environment.c +++ b/environment.c @@ -16,7 +16,7 @@ int trust_executable_bit = 1; int trust_ctime = 1; int check_stat = 1; int has_symlinks = 1; -int minimum_abbrev = 4, default_abbrev = 7; +int minimum_abbrev = 4, default_abbrev = -1; int ignore_case; int assume_unchanged; int prefer_symlink_refs; @@ -99,6 +99,8 @@ static char *work_tree; static const char *namespace; static size_t namespace_len; +static const char *super_prefix; + static const char *git_dir, *git_common_dir; static char *git_object_dir, *git_index_file, *git_graft_file; int git_db_env, git_index_env, git_graft_env, git_common_dir_env; @@ -119,6 +121,7 @@ const char * const local_repo_env[] = { NO_REPLACE_OBJECTS_ENVIRONMENT, GIT_REPLACE_REF_BASE_ENVIRONMENT, GIT_PREFIX_ENVIRONMENT, + GIT_SUPER_PREFIX_ENVIRONMENT, GIT_SHALLOW_FILE_ENVIRONMENT, GIT_COMMON_DIR_ENVIRONMENT, NULL @@ -228,6 +231,16 @@ const char *strip_namespace(const char *namespaced_ref) return namespaced_ref + namespace_len; } +const char *get_super_prefix(void) +{ + static int initialized; + if (!initialized) { + super_prefix = getenv(GIT_SUPER_PREFIX_ENVIRONMENT); + initialized = 1; + } + return super_prefix; +} + static int git_work_tree_initialized; /* diff --git a/git-compat-util.h b/git-compat-util.h index 43718dabae..49ca28cb6b 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -851,11 +851,14 @@ static inline void copy_array(void *dst, const void *src, size_t n, size_t size) * times, and it must be assignable as an lvalue. */ #define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \ - (x) = NULL; /* silence -Wuninitialized for offset calculation */ \ - (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \ + size_t flex_array_len_ = (len); \ + (x) = xcalloc(1, st_add3(sizeof(*(x)), flex_array_len_, 1)); \ + memcpy((void *)(x)->flexname, (buf), flex_array_len_); \ } while (0) #define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \ - (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \ + size_t flex_array_len_ = (len); \ + (x) = xcalloc(1, st_add3(sizeof(*(x)), flex_array_len_, 1)); \ + memcpy((x) + 1, (buf), flex_array_len_); \ (x)->ptrname = (void *)((x)+1); \ } while(0) #define FLEX_ALLOC_STR(x, flexname, str) \ @@ -863,14 +866,6 @@ static inline void copy_array(void *dst, const void *src, size_t n, size_t size) #define FLEXPTR_ALLOC_STR(x, ptrname, str) \ FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str)) -static inline void *xalloc_flex(size_t base_len, size_t offset, - const void *src, size_t src_len) -{ - unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1)); - memcpy(ret + offset, src, src_len); - return ret; -} - static inline char *xstrdup_or_null(const char *str) { return str ? xstrdup(str) : NULL; diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index a88b6824b9..92373d251a 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.20.GITGUI +DEF_VER=0.21.GITGUI LF=' ' diff --git a/git-gui/Makefile b/git-gui/Makefile index 4f00bdd3d6..fe30be38dc 100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@ -259,7 +259,7 @@ lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS rm -f $@ ; \ echo '# Autogenerated by git-gui Makefile' >$@ && \ echo >>$@ && \ - $(foreach p,$(PRELOAD_FILES) $(ALL_LIBFILES),echo '$(subst lib/,,$p)' >>$@ &&) \ + $(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \ echo >>$@ ; \ fi diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index 11048c7a0e..5bc21b878d 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -275,6 +275,10 @@ proc is_Cygwin {} { set _iscygwin 0 } else { set _iscygwin 1 + # Handle MSys2 which is only cygwin when MSYSTEM is MSYS. + if {[info exists ::env(MSYSTEM)] && $::env(MSYSTEM) ne "MSYS"} { + set _iscygwin 0 + } } } else { set _iscygwin 0 @@ -530,28 +534,10 @@ proc _lappend_nice {cmd_var} { } proc git {args} { - set opt [list] - - while {1} { - switch -- [lindex $args 0] { - --nice { - _lappend_nice opt - } - - default { - break - } - - } - - set args [lrange $args 1 end] - } - - set cmdp [_git_cmd [lindex $args 0]] - set args [lrange $args 1 end] - - _trace_exec [concat $opt $cmdp $args] - set result [eval exec $opt $cmdp $args] + set fd [eval [list git_read] $args] + fconfigure $fd -translation binary -encoding utf-8 + set result [string trimright [read $fd] "\n"] + close $fd if {$::_trace} { puts stderr "< $result" } @@ -1107,7 +1093,7 @@ git-version proc _parse_config {arr_name args} { [list git_read config] \ $args \ [list --null --list]] - fconfigure $fd_rc -translation binary + fconfigure $fd_rc -translation binary -encoding utf-8 set buf [read $fd_rc] close $fd_rc } @@ -1616,11 +1602,13 @@ proc run_prepare_commit_msg_hook {} { if {[file isfile [gitdir MERGE_MSG]]} { set pcm_source "merge" set fd_mm [open [gitdir MERGE_MSG] r] + fconfigure $fd_mm -encoding utf-8 puts -nonewline $fd_pcm [read $fd_mm] close $fd_mm } elseif {[file isfile [gitdir SQUASH_MSG]]} { set pcm_source "squash" set fd_sm [open [gitdir SQUASH_MSG] r] + fconfigure $fd_sm -encoding utf-8 puts -nonewline $fd_pcm [read $fd_sm] close $fd_sm } else { @@ -1685,7 +1673,7 @@ proc read_diff_index {fd after} { set i [split [string range $buf_rdi $c [expr {$z1 - 2}]] { }] set p [string range $buf_rdi $z1 [expr {$z2 - 1}]] merge_state \ - [encoding convertfrom $p] \ + [encoding convertfrom utf-8 $p] \ [lindex $i 4]? \ [list [lindex $i 0] [lindex $i 2]] \ [list] @@ -1718,7 +1706,7 @@ proc read_diff_files {fd after} { set i [split [string range $buf_rdf $c [expr {$z1 - 2}]] { }] set p [string range $buf_rdf $z1 [expr {$z2 - 1}]] merge_state \ - [encoding convertfrom $p] \ + [encoding convertfrom utf-8 $p] \ ?[lindex $i 4] \ [list] \ [list [lindex $i 0] [lindex $i 2]] @@ -1741,7 +1729,7 @@ proc read_ls_others {fd after} { set pck [split $buf_rlo "\0"] set buf_rlo [lindex $pck end] foreach p [lrange $pck 0 end-1] { - set p [encoding convertfrom $p] + set p [encoding convertfrom utf-8 $p] if {[string index $p end] eq {/}} { set p [string range $p 0 end-1] } @@ -2505,13 +2493,28 @@ proc force_first_diff {after} { } } -proc toggle_or_diff {w x y} { +proc toggle_or_diff {mode w args} { global file_states file_lists current_diff_path ui_index ui_workdir global last_clicked selected_paths - set pos [split [$w index @$x,$y] .] - set lno [lindex $pos 0] - set col [lindex $pos 1] + if {$mode eq "click"} { + foreach {x y} $args break + set pos [split [$w index @$x,$y] .] + foreach {lno col} $pos break + } else { + if {$last_clicked ne {}} { + set lno [lindex $last_clicked 1] + } else { + set lno [expr {int([lindex [$w tag ranges in_diff] 0])}] + } + if {$mode eq "toggle"} { + set col 0; set y 2 + } else { + incr lno [expr {$mode eq "up" ? -1 : 1}] + set col 1 + } + } + set path [lindex $file_lists($w) [expr {$lno - 1}]] if {$path eq {}} { set last_clicked {} @@ -2519,6 +2522,7 @@ proc toggle_or_diff {w x y} { } set last_clicked [list $w $lno] + focus $w array unset selected_paths $ui_index tag remove in_sel 0.0 end $ui_workdir tag remove in_sel 0.0 end @@ -2598,7 +2602,7 @@ proc add_range_to_selection {w x y} { global file_lists last_clicked selected_paths if {[lindex $last_clicked 0] ne $w} { - toggle_or_diff $w $x $y + toggle_or_diff click $w $x $y return } @@ -3007,7 +3011,7 @@ bind all <$M1B-Key-W> {destroy [winfo toplevel %W]} set subcommand_args {} proc usage {} { - set s "usage: $::argv0 $::subcommand $::subcommand_args" + set s "[mc usage:] $::argv0 $::subcommand $::subcommand_args" if {[tk windowingsystem] eq "win32"} { wm withdraw . tk_messageBox -icon info -message $s \ @@ -3139,7 +3143,7 @@ gui { # fall through to setup UI for commits } default { - set err "usage: $argv0 \[{blame|browser|citool}\]" + set err "[mc usage:] $argv0 \[{blame|browser|citool}\]" if {[tk windowingsystem] eq "win32"} { wm withdraw . tk_messageBox -icon error -message $err \ @@ -3178,16 +3182,38 @@ if {$use_ttk} { } pack .vpane -anchor n -side top -fill both -expand 1 +# -- Working Directory File List + +textframe .vpane.files.workdir -height 100 -width 200 +tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \ + -background lightsalmon -foreground black +ttext $ui_workdir -background white -foreground black \ + -borderwidth 0 \ + -width 20 -height 10 \ + -wrap none \ + -takefocus 1 -highlightthickness 1\ + -cursor $cursor_ptr \ + -xscrollcommand {.vpane.files.workdir.sx set} \ + -yscrollcommand {.vpane.files.workdir.sy set} \ + -state disabled +${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview] +${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview] +pack .vpane.files.workdir.title -side top -fill x +pack .vpane.files.workdir.sx -side bottom -fill x +pack .vpane.files.workdir.sy -side right -fill y +pack $ui_workdir -side left -fill both -expand 1 + # -- Index File List # -${NS}::frame .vpane.files.index -height 100 -width 200 +textframe .vpane.files.index -height 100 -width 200 tlabel .vpane.files.index.title \ -text [mc "Staged Changes (Will Commit)"] \ -background lightgreen -foreground black -text $ui_index -background white -foreground black \ +ttext $ui_index -background white -foreground black \ -borderwidth 0 \ -width 20 -height 10 \ -wrap none \ + -takefocus 1 -highlightthickness 1\ -cursor $cursor_ptr \ -xscrollcommand {.vpane.files.index.sx set} \ -yscrollcommand {.vpane.files.index.sy set} \ @@ -3199,26 +3225,8 @@ pack .vpane.files.index.sx -side bottom -fill x pack .vpane.files.index.sy -side right -fill y pack $ui_index -side left -fill both -expand 1 -# -- Working Directory File List +# -- Insert the workdir and index into the panes # -${NS}::frame .vpane.files.workdir -height 100 -width 200 -tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \ - -background lightsalmon -foreground black -text $ui_workdir -background white -foreground black \ - -borderwidth 0 \ - -width 20 -height 10 \ - -wrap none \ - -cursor $cursor_ptr \ - -xscrollcommand {.vpane.files.workdir.sx set} \ - -yscrollcommand {.vpane.files.workdir.sy set} \ - -state disabled -${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview] -${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview] -pack .vpane.files.workdir.title -side top -fill x -pack .vpane.files.workdir.sx -side bottom -fill x -pack .vpane.files.workdir.sy -side right -fill y -pack $ui_workdir -side left -fill both -expand 1 - .vpane.files add .vpane.files.workdir .vpane.files add .vpane.files.index if {!$use_ttk} { @@ -3301,7 +3309,7 @@ if {![is_enabled nocommit]} { # ${NS}::frame .vpane.lower.commarea.buffer ${NS}::frame .vpane.lower.commarea.buffer.header -set ui_comm .vpane.lower.commarea.buffer.t +set ui_comm .vpane.lower.commarea.buffer.frame.t set ui_coml .vpane.lower.commarea.buffer.header.l if {![is_enabled nocommit]} { @@ -3344,20 +3352,25 @@ if {![is_enabled nocommit]} { pack .vpane.lower.commarea.buffer.header.new -side right } -text $ui_comm -background white -foreground black \ +textframe .vpane.lower.commarea.buffer.frame +ttext $ui_comm -background white -foreground black \ -borderwidth 1 \ -undo true \ -maxundo 20 \ -autoseparators true \ + -takefocus 1 \ + -highlightthickness 1 \ -relief sunken \ -width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \ -font font_diff \ - -yscrollcommand {.vpane.lower.commarea.buffer.sby set} -${NS}::scrollbar .vpane.lower.commarea.buffer.sby \ + -yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set} +${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sby \ -command [list $ui_comm yview] -pack .vpane.lower.commarea.buffer.header -side top -fill x -pack .vpane.lower.commarea.buffer.sby -side right -fill y + +pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y pack $ui_comm -side left -fill y +pack .vpane.lower.commarea.buffer.header -side top -fill x +pack .vpane.lower.commarea.buffer.frame -side left -fill y pack .vpane.lower.commarea.buffer -side left -fill y # -- Commit Message Buffer Context Menu @@ -3455,12 +3468,13 @@ bind_button3 .vpane.lower.diff.header.path "tk_popup $ctxm %X %Y" # -- Diff Body # -${NS}::frame .vpane.lower.diff.body +textframe .vpane.lower.diff.body set ui_diff .vpane.lower.diff.body.t -text $ui_diff -background white -foreground black \ +ttext $ui_diff -background white -foreground black \ -borderwidth 0 \ -width 80 -height 5 -wrap none \ -font font_diff \ + -takefocus 1 -highlightthickness 1 \ -xscrollcommand {.vpane.lower.diff.body.sbx set} \ -yscrollcommand {.vpane.lower.diff.body.sby set} \ -state disabled @@ -3815,10 +3829,10 @@ bind . <$M1B-Key-r> ui_do_rescan bind . <$M1B-Key-R> ui_do_rescan bind . <$M1B-Key-s> do_signoff bind . <$M1B-Key-S> do_signoff -bind . <$M1B-Key-t> do_add_selection -bind . <$M1B-Key-T> do_add_selection -bind . <$M1B-Key-u> do_unstage_selection -bind . <$M1B-Key-U> do_unstage_selection +bind . <$M1B-Key-t> { toggle_or_diff toggle %W } +bind . <$M1B-Key-T> { toggle_or_diff toggle %W } +bind . <$M1B-Key-u> { toggle_or_diff toggle %W } +bind . <$M1B-Key-U> { toggle_or_diff toggle %W } bind . <$M1B-Key-j> do_revert_selection bind . <$M1B-Key-J> do_revert_selection bind . <$M1B-Key-i> do_add_all @@ -3830,9 +3844,11 @@ bind . <$M1B-Key-plus> {show_more_context;break} bind . <$M1B-Key-KP_Add> {show_more_context;break} bind . <$M1B-Key-Return> do_commit foreach i [list $ui_index $ui_workdir] { - bind $i <Button-1> "toggle_or_diff $i %x %y; break" - bind $i <$M1B-Button-1> "add_one_to_selection $i %x %y; break" - bind $i <Shift-Button-1> "add_range_to_selection $i %x %y; break" + bind $i <Button-1> { toggle_or_diff click %W %x %y; break } + bind $i <$M1B-Button-1> { add_one_to_selection %W %x %y; break } + bind $i <Shift-Button-1> { add_range_to_selection %W %x %y; break } + bind $i <Key-Up> { toggle_or_diff up %W; break } + bind $i <Key-Down> { toggle_or_diff down %W; break } } unset i diff --git a/git-gui/lib/blame.tcl b/git-gui/lib/blame.tcl index b1d15f4621..a1aeb8b96e 100644 --- a/git-gui/lib/blame.tcl +++ b/git-gui/lib/blame.tcl @@ -70,7 +70,7 @@ constructor new {i_commit i_path i_jump} { set path $i_path make_toplevel top w - wm title $top [append "[appname] ([reponame]): " [mc "File Viewer"]] + wm title $top [mc "%s (%s): File Viewer" [appname] [reponame]] set font_w [font measure font_diff "0"] diff --git a/git-gui/lib/branch_checkout.tcl b/git-gui/lib/branch_checkout.tcl index 2e459a8297..d06037decc 100644 --- a/git-gui/lib/branch_checkout.tcl +++ b/git-gui/lib/branch_checkout.tcl @@ -13,7 +13,7 @@ constructor dialog {} { global use_ttk NS make_dialog top w wm withdraw $w - wm title $top [append "[appname] ([reponame]): " [mc "Checkout Branch"]] + wm title $top [mc "%s (%s): Checkout Branch" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/branch_create.tcl b/git-gui/lib/branch_create.tcl index 4bb907705c..ba367d551d 100644 --- a/git-gui/lib/branch_create.tcl +++ b/git-gui/lib/branch_create.tcl @@ -20,7 +20,7 @@ constructor dialog {} { make_dialog top w wm withdraw $w - wm title $top [append "[appname] ([reponame]): " [mc "Create Branch"]] + wm title $top [mc "%s (%s): Create Branch" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/branch_delete.tcl b/git-gui/lib/branch_delete.tcl index 867938ec6a..a5051637bb 100644 --- a/git-gui/lib/branch_delete.tcl +++ b/git-gui/lib/branch_delete.tcl @@ -13,7 +13,7 @@ constructor dialog {} { make_dialog top w wm withdraw $w - wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]] + wm title $top [mc "%s (%s): Delete Branch" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } @@ -128,7 +128,7 @@ method _delete {} { set b [lindex $i 0] set o [lindex $i 1] if {[catch {git branch -D $b} err]} { - append failed " - $b: $err\n" + append failed [mc " - %s:" $b] " $err\n" } } diff --git a/git-gui/lib/branch_rename.tcl b/git-gui/lib/branch_rename.tcl index 6e510ec2e3..3a2d79a9cc 100644 --- a/git-gui/lib/branch_rename.tcl +++ b/git-gui/lib/branch_rename.tcl @@ -12,7 +12,7 @@ constructor dialog {} { make_dialog top w wm withdraw $w - wm title $top [append "[appname] ([reponame]): " [mc "Rename Branch"]] + wm title $top [mc "%s (%s): Rename Branch" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/browser.tcl b/git-gui/lib/browser.tcl index 0328338fda..a982983667 100644 --- a/git-gui/lib/browser.tcl +++ b/git-gui/lib/browser.tcl @@ -24,7 +24,7 @@ constructor new {commit {path {}}} { global cursor_ptr M1B use_ttk NS make_dialog top w wm withdraw $top - wm title $top [append "[appname] ([reponame]): " [mc "File Browser"]] + wm title $top [mc "%s (%s): File Browser" [appname] [reponame]] if {$path ne {}} { if {[string index $path end] ne {/}} { @@ -197,7 +197,7 @@ method _ls {tree_id {name {}}} { $w conf -state disabled set fd [git_read ls-tree -z $tree_id] - fconfigure $fd -blocking 0 -translation binary -encoding binary + fconfigure $fd -blocking 0 -translation binary -encoding utf-8 fileevent $fd readable [cb _read $fd] } @@ -272,7 +272,7 @@ constructor dialog {} { global use_ttk NS make_dialog top w wm withdraw $top - wm title $top [append "[appname] ([reponame]): " [mc "Browse Branch Files"]] + wm title $top [mc "%s (%s): Browse Branch Files" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" wm transient $top . diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl index 01d2cc280b..83620b7cbc 100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@ -2,7 +2,7 @@ # Copyright (C) 2006, 2007 Shawn Pearce proc load_last_commit {} { - global HEAD PARENT MERGE_HEAD commit_type ui_comm + global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author global repo_config if {[llength $PARENT] == 0} { @@ -34,6 +34,8 @@ You are currently in the middle of a merge that has not been fully completed. Y lappend parents [string range $line 7 end] } elseif {[string match {encoding *} $line]} { set enc [string tolower [string range $line 9 end]] + } elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} { + set commit_author [list name $name email $email date $time] } } set msg [read $fd] @@ -106,9 +108,10 @@ proc do_signoff {} { } proc create_new_commit {} { - global commit_type ui_comm + global commit_type ui_comm commit_author set commit_type normal + unset -nocomplain commit_author $ui_comm delete 0.0 end $ui_comm edit reset $ui_comm edit modified false @@ -322,11 +325,12 @@ proc commit_writetree {curHEAD msg_p} { } proc commit_committree {fd_wt curHEAD msg_p} { - global HEAD PARENT MERGE_HEAD commit_type + global HEAD PARENT MERGE_HEAD commit_type commit_author global current_branch global ui_comm selected_commit_type global file_states selected_paths rescan_active global repo_config + global env gets $fd_wt tree_id if {[catch {close $fd_wt} err]} { @@ -366,6 +370,9 @@ A rescan will be automatically started now. } } + if {[info exists commit_author]} { + set old_author [commit_author_ident $commit_author] + } # -- Create the commit. # set cmd [list commit-tree $tree_id] @@ -381,8 +388,14 @@ A rescan will be automatically started now. error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"] ui_status [mc "Commit failed."] unlock_index + unset -nocomplain commit_author + commit_author_reset $old_author return } + if {[info exists commit_author]} { + unset -nocomplain commit_author + commit_author_reset $old_author + } # -- Update the HEAD ref. # @@ -509,3 +522,20 @@ proc commit_postcommit_wait {fd_ph cmt_id} { } fconfigure $fd_ph -blocking 0 } + +proc commit_author_ident {details} { + global env + array set author $details + set old [array get env GIT_AUTHOR_*] + set env(GIT_AUTHOR_NAME) $author(name) + set env(GIT_AUTHOR_EMAIL) $author(email) + set env(GIT_AUTHOR_DATE) $author(date) + return $old +} +proc commit_author_reset {details} { + global env + unset env(GIT_AUTHOR_NAME) env(GIT_AUTHOR_EMAIL) env(GIT_AUTHOR_DATE) + if {$details ne {}} { + array set env $details + } +} diff --git a/git-gui/lib/database.tcl b/git-gui/lib/database.tcl index 1f187ed286..85783081e0 100644 --- a/git-gui/lib/database.tcl +++ b/git-gui/lib/database.tcl @@ -54,7 +54,7 @@ proc do_stats {} { set value "$value[lindex $s 2]" } - ${NS}::label $w.stat.l_$name -text "$label:" -anchor w + ${NS}::label $w.stat.l_$name -text [mc "%s:" $label] -anchor w ${NS}::label $w.stat.v_$name -text $value -anchor w grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5} } @@ -63,7 +63,7 @@ proc do_stats {} { bind $w <Visibility> "grab $w; focus $w.buttons.close" bind $w <Key-Escape> [list destroy $w] bind $w <Key-Return> [list destroy $w] - wm title $w [append "[appname] ([reponame]): " [mc "Database Statistics"]] + wm title $w [mc "%s (%s): Database Statistics" [appname] [reponame]] wm deiconify $w tkwait window $w } diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl index 0d56986215..4cae10a4c7 100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@ -127,6 +127,9 @@ proc show_diff {path w {lno {}} {scroll_pos {}} {callback {}}} { } else { start_show_diff $cont_info } + + global current_diff_path selected_paths + set selected_paths($current_diff_path) 1 } proc show_unmerged_diff {cont_info} { @@ -220,10 +223,9 @@ proc show_other_diff {path w m cont_info} { } $ui_diff conf -state normal if {$type eq {submodule}} { - $ui_diff insert end [append \ - "* " \ - [mc "Git Repository (subproject)"] \ - "\n"] d_info + $ui_diff insert end \ + "* [mc "Git Repository (subproject)"]\n" \ + d_info } elseif {![catch {set type [exec file $path]}]} { set n [string length $path] if {[string equal -length $n $path $type]} { @@ -608,7 +610,7 @@ proc apply_hunk {x y} { puts -nonewline $p $current_diff_header puts -nonewline $p [$ui_diff get $s_lno $e_lno] close $p} err]} { - error_popup [append $failed_msg "\n\n$err"] + error_popup "$failed_msg\n\n$err" unlock_index return } @@ -826,7 +828,7 @@ proc apply_range_or_line {x y} { puts -nonewline $p $current_diff_header puts -nonewline $p $wholepatch close $p} err]} { - error_popup [append $failed_msg "\n\n$err"] + error_popup "$failed_msg\n\n$err" } unlock_index diff --git a/git-gui/lib/error.tcl b/git-gui/lib/error.tcl index c0fa69af56..8968a57f33 100644 --- a/git-gui/lib/error.tcl +++ b/git-gui/lib/error.tcl @@ -17,7 +17,7 @@ proc error_popup {msg} { set cmd [list tk_messageBox \ -icon error \ -type ok \ - -title [append "$title: " [mc "error"]] \ + -title [mc "%s: error" $title] \ -message $msg] if {[winfo ismapped [_error_parent]]} { lappend cmd -parent [_error_parent] @@ -33,7 +33,7 @@ proc warn_popup {msg} { set cmd [list tk_messageBox \ -icon warning \ -type ok \ - -title [append "$title: " [mc "warning"]] \ + -title [mc "%s: warning" $title] \ -message $msg] if {[winfo ismapped [_error_parent]]} { lappend cmd -parent [_error_parent] @@ -77,7 +77,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} { wm withdraw $w ${NS}::frame $w.m - ${NS}::label $w.m.l1 -text "$hook hook failed:" \ + ${NS}::label $w.m.l1 -text [mc "%s hook failed:" $hook] \ -anchor w \ -justify left \ -font font_uibold @@ -113,7 +113,7 @@ proc hook_failed_popup {hook msg {is_fatal 1}} { bind $w <Visibility> "grab $w; focus $w" bind $w <Key-Return> "destroy $w" - wm title $w [strcat "[appname] ([reponame]): " [mc "error"]] + wm title $w [mc "%s (%s): error" [appname] [reponame]] wm deiconify $w tkwait window $w } diff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl index 3a3e534aef..b588db11d9 100644 --- a/git-gui/lib/index.tcl +++ b/git-gui/lib/index.tcl @@ -115,7 +115,7 @@ proc write_update_indexinfo {fd pathList totalCnt batch after} { set info [lindex $s 2] if {$info eq {}} continue - puts -nonewline $fd "$info\t[encoding convertto $path]\0" + puts -nonewline $fd "$info\t[encoding convertto utf-8 $path]\0" display_file $path $new } @@ -186,7 +186,7 @@ proc write_update_index {fd pathList totalCnt batch after} { ?M {set new M_} ?? {continue} } - puts -nonewline $fd "[encoding convertto $path]\0" + puts -nonewline $fd "[encoding convertto utf-8 $path]\0" display_file $path $new } @@ -247,7 +247,7 @@ proc write_checkout_index {fd pathList totalCnt batch after} { ?M - ?T - ?D { - puts -nonewline $fd "[encoding convertto $path]\0" + puts -nonewline $fd "[encoding convertto utf-8 $path]\0" display_file $path ?_ } } diff --git a/git-gui/lib/merge.tcl b/git-gui/lib/merge.tcl index 5ab6f8f102..9f253db5b3 100644 --- a/git-gui/lib/merge.tcl +++ b/git-gui/lib/merge.tcl @@ -112,7 +112,16 @@ method _start {} { close $fh set _last_merged_branch $branch - set cmd [list git merge --strategy=recursive FETCH_HEAD] + if {[git-version >= "2.5.0"]} { + set cmd [list git merge --strategy=recursive FETCH_HEAD] + } else { + set cmd [list git] + lappend cmd merge + lappend cmd --strategy=recursive + lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]] + lappend cmd HEAD + lappend cmd $name + } ui_status [mc "Merging %s and %s..." $current_branch $stitle] set cons [console::new [mc "Merge"] "merge $stitle"] @@ -144,7 +153,7 @@ constructor dialog {} { } make_dialog top w - wm title $top [append "[appname] ([reponame]): " [mc "Merge"]] + wm title $top [mc "%s (%s): Merge" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/option.tcl b/git-gui/lib/option.tcl index b5b6b2fea6..e43971bfa3 100644 --- a/git-gui/lib/option.tcl +++ b/git-gui/lib/option.tcl @@ -179,7 +179,7 @@ proc do_options {} { i-* { regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max ${NS}::frame $w.$f.$optid - ${NS}::label $w.$f.$optid.l -text "$text:" + ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] pack $w.$f.$optid.l -side left -anchor w -fill x tspinbox $w.$f.$optid.v \ -textvariable ${f}_config_new($name) \ @@ -194,7 +194,7 @@ proc do_options {} { c - t { ${NS}::frame $w.$f.$optid - ${NS}::label $w.$f.$optid.l -text "$text:" + ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] ${NS}::entry $w.$f.$optid.v \ -width 20 \ -textvariable ${f}_config_new($name) @@ -217,7 +217,7 @@ proc do_options {} { s { set opts [eval [lindex $option 3]] ${NS}::frame $w.$f.$optid - ${NS}::label $w.$f.$optid.l -text "$text:" + ${NS}::label $w.$f.$optid.l -text [mc "%s:" $text] if {$use_ttk} { ttk::combobox $w.$f.$optid.v \ -textvariable ${f}_config_new($name) \ @@ -279,7 +279,7 @@ proc do_options {} { [font configure $font -size] ${NS}::frame $w.global.$name - ${NS}::label $w.global.$name.l -text "$text:" + ${NS}::label $w.global.$name.l -text [mc "%s:" $text] ${NS}::button $w.global.$name.b \ -text [mc "Change Font"] \ -command [list \ diff --git a/git-gui/lib/remote.tcl b/git-gui/lib/remote.tcl index 4e5c784418..ef77ed7399 100644 --- a/git-gui/lib/remote.tcl +++ b/git-gui/lib/remote.tcl @@ -246,22 +246,22 @@ proc update_all_remotes_menu_entry {} { if {$have_remote > 1} { make_sure_remote_submenues_exist $remote_m if {[$fetch_m type end] eq "command" \ - && [$fetch_m entrycget end -label] ne "All"} { + && [$fetch_m entrycget end -label] ne [mc "All"]} { $fetch_m insert end separator $fetch_m insert end command \ - -label "All" \ + -label [mc "All"] \ -command fetch_from_all $prune_m insert end separator $prune_m insert end command \ - -label "All" \ + -label [mc "All"] \ -command prune_from_all } } else { if {[winfo exists $fetch_m]} { if {[$fetch_m type end] eq "command" \ - && [$fetch_m entrycget end -label] eq "All"} { + && [$fetch_m entrycget end -label] eq [mc "All"]} { delete_from_menu $fetch_m end delete_from_menu $fetch_m end diff --git a/git-gui/lib/remote_add.tcl b/git-gui/lib/remote_add.tcl index 50029d0cee..480a6b30d0 100644 --- a/git-gui/lib/remote_add.tcl +++ b/git-gui/lib/remote_add.tcl @@ -17,7 +17,7 @@ constructor dialog {} { make_dialog top w wm withdraw $top - wm title $top [append "[appname] ([reponame]): " [mc "Add Remote"]] + wm title $top [mc "%s (%s): Add Remote" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/remote_branch_delete.tcl b/git-gui/lib/remote_branch_delete.tcl index fcc06d03a1..5ba9fcadd1 100644 --- a/git-gui/lib/remote_branch_delete.tcl +++ b/git-gui/lib/remote_branch_delete.tcl @@ -26,7 +26,7 @@ constructor dialog {} { global all_remotes M1B use_ttk NS make_dialog top w - wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch Remotely"]] + wm title $top [mc "%s (%s): Delete Branch Remotely" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } diff --git a/git-gui/lib/shortcut.tcl b/git-gui/lib/shortcut.tcl index 78878ef89d..97d1d7aa02 100644 --- a/git-gui/lib/shortcut.tcl +++ b/git-gui/lib/shortcut.tcl @@ -5,17 +5,20 @@ proc do_windows_shortcut {} { global _gitworktree set fn [tk_getSaveFile \ -parent . \ - -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ + -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \ -initialfile "Git [reponame].lnk"] if {$fn != {}} { if {[file extension $fn] ne {.lnk}} { set fn ${fn}.lnk } + # Use git-gui.exe if available (ie: git-for-windows) + set cmdLine [auto_execok git-gui.exe] + if {$cmdLine eq {}} { + set cmdLine [list [info nameofexecutable] \ + [file normalize $::argv0]] + } if {[catch { - win32_create_lnk $fn [list \ - [info nameofexecutable] \ - [file normalize $::argv0] \ - ] \ + win32_create_lnk $fn $cmdLine \ [file normalize $_gitworktree] } err]} { error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"] @@ -37,7 +40,7 @@ proc do_cygwin_shortcut {} { } set fn [tk_getSaveFile \ -parent . \ - -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ + -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \ -initialdir $desktop \ -initialfile "Git [reponame].lnk"] if {$fn != {}} { @@ -69,7 +72,7 @@ proc do_macosx_app {} { set fn [tk_getSaveFile \ -parent . \ - -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ + -title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \ -initialdir [file join $env(HOME) Desktop] \ -initialfile "Git [reponame].app"] if {$fn != {}} { diff --git a/git-gui/lib/themed.tcl b/git-gui/lib/themed.tcl index 8b88d3678b..351a712c8c 100644 --- a/git-gui/lib/themed.tcl +++ b/git-gui/lib/themed.tcl @@ -78,6 +78,57 @@ proc InitTheme {} { } } +# Define a style used for the surround of text widgets. +proc InitEntryFrame {} { + ttk::style theme settings default { + ttk::style layout EntryFrame { + EntryFrame.field -sticky nswe -border 0 -children { + EntryFrame.fill -sticky nswe -children { + EntryFrame.padding -sticky nswe + } + } + } + ttk::style configure EntryFrame -padding 1 -relief sunken + ttk::style map EntryFrame -background {} + } + ttk::style theme settings classic { + ttk::style configure EntryFrame -padding 2 -relief sunken + ttk::style map EntryFrame -background {} + } + ttk::style theme settings alt { + ttk::style configure EntryFrame -padding 2 + ttk::style map EntryFrame -background {} + } + ttk::style theme settings clam { + ttk::style configure EntryFrame -padding 2 + ttk::style map EntryFrame -background {} + } + + # Ignore errors for missing native themes + catch { + ttk::style theme settings winnative { + ttk::style configure EntryFrame -padding 2 + } + ttk::style theme settings xpnative { + ttk::style configure EntryFrame -padding 1 + ttk::style element create EntryFrame.field vsapi \ + EDIT 1 {disabled 4 focus 3 active 2 {} 1} -padding 1 + } + ttk::style theme settings vista { + ttk::style configure EntryFrame -padding 2 + ttk::style element create EntryFrame.field vsapi \ + EDIT 6 {disabled 4 focus 3 active 2 {} 1} -padding 2 + } + } + + bind EntryFrame <Enter> {%W instate !disabled {%W state active}} + bind EntryFrame <Leave> {%W state !active} + bind EntryFrame <<ThemeChanged>> { + set pad [ttk::style lookup EntryFrame -padding] + %W configure -padding [expr {$pad eq {} ? 1 : $pad}] + } +} + proc gold_frame {w args} { global use_ttk if {$use_ttk} { @@ -123,7 +174,7 @@ proc paddedlabel {w args} { # place a themed frame over the surface. proc Dialog {w args} { eval [linsert $args 0 toplevel $w -class Dialog] - catch {wm attributes $w -type dialog} + catch {wm attributes $w -type dialog} pave_toplevel $w return $w } @@ -193,6 +244,40 @@ proc tspinbox {w args} { } } +# Create a text widget with any theme specific properties. +proc ttext {w args} { + global use_ttk + if {$use_ttk} { + switch -- [ttk::style theme use] { + "vista" - "xpnative" { + lappend args -highlightthickness 0 -borderwidth 0 + } + } + } + set w [eval [linsert $args 0 text $w]] + if {$use_ttk} { + if {[winfo class [winfo parent $w]] eq "EntryFrame"} { + bind $w <FocusIn> {[winfo parent %W] state focus} + bind $w <FocusOut> {[winfo parent %W] state !focus} + } + } + return $w +} + +# themed frame suitable for surrounding a text field. +proc textframe {w args} { + global use_ttk + if {$use_ttk} { + if {[catch {ttk::style layout EntryFrame}]} { + InitEntryFrame + } + eval [linsert $args 0 ttk::frame $w -class EntryFrame -style EntryFrame] + } else { + eval [linsert $args 0 frame $w] + } + return $w +} + proc tentry {w args} { global use_ttk if {$use_ttk} { diff --git a/git-gui/lib/tools.tcl b/git-gui/lib/tools.tcl index 6ec94113db..413f1a1700 100644 --- a/git-gui/lib/tools.tcl +++ b/git-gui/lib/tools.tcl @@ -69,6 +69,7 @@ proc tools_populate_one {fullname} { proc tools_exec {fullname} { global repo_config env current_diff_path global current_branch is_detached + global selected_paths if {[is_config_true "guitool.$fullname.needsfile"]} { if {$current_diff_path eq {}} { @@ -100,6 +101,7 @@ proc tools_exec {fullname} { set env(GIT_GUITOOL) $fullname set env(FILENAME) $current_diff_path + set env(FILENAMES) [join [array names selected_paths] \n] if {$is_detached} { set env(CUR_BRANCH) "" } else { @@ -121,6 +123,7 @@ proc tools_exec {fullname} { unset env(GIT_GUITOOL) unset env(FILENAME) + unset env(FILENAMES) unset env(CUR_BRANCH) catch { unset env(ARGS) } catch { unset env(REVISION) } diff --git a/git-gui/lib/tools_dlg.tcl b/git-gui/lib/tools_dlg.tcl index 7eeda9daf2..c05413ce43 100644 --- a/git-gui/lib/tools_dlg.tcl +++ b/git-gui/lib/tools_dlg.tcl @@ -19,7 +19,7 @@ constructor dialog {} { global repo_config use_ttk NS make_dialog top w - wm title $top [append "[appname] ([reponame]): " [mc "Add Tool"]] + wm title $top [mc "%s (%s): Add Tool" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" wm transient $top . @@ -184,7 +184,7 @@ constructor dialog {} { load_config 1 make_dialog top w - wm title $top [append "[appname] ([reponame]): " [mc "Remove Tool"]] + wm title $top [mc "%s (%s): Remove Tool" [appname] [reponame]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" wm transient $top . @@ -280,7 +280,7 @@ constructor dialog {fullname} { } make_dialog top w -autodelete 0 - wm title $top [append "[appname] ([reponame]): " $title] + wm title $top "[mc "%s (%s):" [appname] [reponame]] $title" if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" wm transient $top . diff --git a/git-gui/lib/transport.tcl b/git-gui/lib/transport.tcl index e5d211edea..a1a424aab5 100644 --- a/git-gui/lib/transport.tcl +++ b/git-gui/lib/transport.tcl @@ -226,7 +226,7 @@ proc do_push_anywhere {} { bind $w <Visibility> "grab $w; focus $w.buttons.create" bind $w <Key-Escape> "destroy $w" bind $w <Key-Return> [list start_push_anywhere_action $w] - wm title $w [append "[appname] ([reponame]): " [mc "Push"]] + wm title $w [mc "%s (%s): Push" [appname] [reponame]] wm deiconify $w tkwait window $w } diff --git a/git-gui/po/bg.po b/git-gui/po/bg.po index 4d9b039dc2..5af78f15a8 100644 --- a/git-gui/po/bg.po +++ b/git-gui/po/bg.po @@ -1,15 +1,15 @@ # Bulgarian translation of git-gui po-file. -# Copyright (C) 2012, 2013, 2014, 2015 Alexander Shopov <ash@kambanaria.org>. +# Copyright (C) 2012, 2013, 2014, 2015, 2016 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, 2015. +# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014, 2015, 2016. # # msgid "" msgstr "" "Project-Id-Version: git-gui master\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-07 07:37+0300\n" -"PO-Revision-Date: 2015-04-07 07:46+0300\n" +"POT-Creation-Date: 2016-10-13 15:16+0300\n" +"PO-Revision-Date: 2016-10-13 15:16+0300\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language: bg\n" @@ -18,33 +18,33 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: git-gui.sh:861 +#: git-gui.sh:865 #, tcl-format msgid "Invalid font specified in %s:" msgstr "Указан е неправилен шрифт в „%s“:" -#: git-gui.sh:915 +#: git-gui.sh:919 msgid "Main Font" msgstr "ОÑновен шрифт" -#: git-gui.sh:916 +#: git-gui.sh:920 msgid "Diff/Console Font" msgstr "Шрифт за разликите/конзолата" -#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048 -#: git-gui.sh:1067 git-gui.sh:3125 +#: git-gui.sh:935 git-gui.sh:949 git-gui.sh:962 git-gui.sh:1052 git-gui.sh:1071 +#: git-gui.sh:3147 msgid "git-gui: fatal error" msgstr "git-gui: фатална грешка" -#: git-gui.sh:932 +#: git-gui.sh:936 msgid "Cannot find git in PATH." msgstr "Командата git липÑва в Ð¿ÑŠÑ‚Ñ (PATH)." -#: git-gui.sh:959 +#: git-gui.sh:963 msgid "Cannot parse Git version string:" msgstr "Ðизът Ñ Ð²ÐµÑ€ÑиÑта на Git не може да бъде интерпретиран:" -#: git-gui.sh:984 +#: git-gui.sh:988 #, tcl-format msgid "" "Git version cannot be determined.\n" @@ -63,503 +63,506 @@ msgstr "" "\n" "Да Ñе приеме ли, че „%s“ е верÑÐ¸Ñ â€ž1.5.0“?\n" -#: git-gui.sh:1281 +#: git-gui.sh:1285 msgid "Git directory not found:" msgstr "ДиректориÑта на Git не е открита:" -#: git-gui.sh:1315 +#: git-gui.sh:1319 msgid "Cannot move to top of working directory:" msgstr "Ðе може да Ñе премине към родителÑката директориÑ." -#: git-gui.sh:1323 +#: git-gui.sh:1327 msgid "Cannot use bare repository:" msgstr "Голо хранилище не може да Ñе използва:" -#: git-gui.sh:1331 +#: git-gui.sh:1335 msgid "No working directory" msgstr "Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð»Ð¸Ð¿Ñва" -#: git-gui.sh:1503 lib/checkout_op.tcl:306 +#: git-gui.sh:1507 lib/checkout_op.tcl:306 msgid "Refreshing file status..." msgstr "ОбновÑване на ÑÑŠÑтоÑнието на файла…" -#: git-gui.sh:1563 +#: git-gui.sh:1567 msgid "Scanning for modified files ..." msgstr "Проверка за променени файлове…" -#: git-gui.sh:1639 +#: git-gui.sh:1645 msgid "Calling prepare-commit-msg hook..." msgstr "Куката „prepare-commit-msg“ Ñе изпълнÑва в момента…" -#: git-gui.sh:1656 +#: git-gui.sh:1662 msgid "Commit declined by prepare-commit-msg hook." msgstr "Подаването е отхвърлено от куката „prepare-commit-msg“." -#: git-gui.sh:1814 lib/browser.tcl:252 +#: git-gui.sh:1820 lib/browser.tcl:252 msgid "Ready." msgstr "Готово." -#: git-gui.sh:1978 +#: git-gui.sh:1984 #, tcl-format msgid "" "Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." msgstr "" -"ДоÑтигнат е макÑималниÑÑ‚ брой файлове за показване (gui.maxfilesdisplayed = " -"%s). Файловете Ñа общо %s." +"ДоÑтигнат е макÑималниÑÑ‚ размер на ÑпиÑъка за извеждане(gui." +"maxfilesdisplayed = %s), Ñъответно не Ñа показани вÑички %s файла." -#: git-gui.sh:2101 +#: git-gui.sh:2107 msgid "Unmodified" msgstr "Ðепроменен" -#: git-gui.sh:2103 +#: git-gui.sh:2109 msgid "Modified, not staged" msgstr "Променен, но не е в индекÑа" -#: git-gui.sh:2104 git-gui.sh:2116 +#: git-gui.sh:2110 git-gui.sh:2122 msgid "Staged for commit" msgstr "Ð’ индекÑа за подаване" -#: git-gui.sh:2105 git-gui.sh:2117 +#: git-gui.sh:2111 git-gui.sh:2123 msgid "Portions staged for commit" msgstr "ЧаÑти Ñа в индекÑа за подаване" -#: git-gui.sh:2106 git-gui.sh:2118 +#: git-gui.sh:2112 git-gui.sh:2124 msgid "Staged for commit, missing" msgstr "Ð’ индекÑа за подаване, но липÑва" -#: git-gui.sh:2108 +#: git-gui.sh:2114 msgid "File type changed, not staged" msgstr "Видът на файла е Ñменен, но не е в индекÑа" -#: git-gui.sh:2109 git-gui.sh:2110 +#: git-gui.sh:2115 git-gui.sh:2116 msgid "File type changed, old type staged for commit" -msgstr "Видът на файла е Ñменен, но в индекÑа е вÑе още ÑтариÑÑ‚" +msgstr "Видът на файла е Ñменен, но новиÑÑ‚ вид не е в индекÑа" -#: git-gui.sh:2111 +#: git-gui.sh:2117 msgid "File type changed, staged" msgstr "Видът на файла е Ñменен и е в индекÑа" -#: git-gui.sh:2112 +#: git-gui.sh:2118 msgid "File type change staged, modification not staged" -msgstr "Видът на файла е Ñменен, но промÑната не е в индекÑа" +msgstr "Видът на файла е Ñменен в индекÑа, но не и Ñъдържанието" -#: git-gui.sh:2113 +#: git-gui.sh:2119 msgid "File type change staged, file missing" -msgstr "Видът на файла е Ñменен, файлът липÑва" +msgstr "Видът на файла е Ñменен в индекÑа, но файлът липÑва" -#: git-gui.sh:2115 +#: git-gui.sh:2121 msgid "Untracked, not staged" msgstr "ÐеÑледен" -#: git-gui.sh:2120 +#: git-gui.sh:2126 msgid "Missing" msgstr "ЛипÑващ" -#: git-gui.sh:2121 +#: git-gui.sh:2127 msgid "Staged for removal" msgstr "Ð’ индекÑа за изтриване" -#: git-gui.sh:2122 +#: git-gui.sh:2128 msgid "Staged for removal, still present" msgstr "Ð’ индекÑа за изтриване, но още го има" -#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127 -#: git-gui.sh:2128 git-gui.sh:2129 +#: git-gui.sh:2130 git-gui.sh:2131 git-gui.sh:2132 git-gui.sh:2133 +#: git-gui.sh:2134 git-gui.sh:2135 msgid "Requires merge resolution" msgstr "ИзиÑква коригиране при Ñливане" -#: git-gui.sh:2164 +#: git-gui.sh:2170 msgid "Starting gitk... please wait..." msgstr "Стартиране на „gitk“…, изчакайте…" -#: git-gui.sh:2176 +#: git-gui.sh:2182 msgid "Couldn't find gitk in PATH" msgstr "Командата „gitk“ липÑва в пътищата, определени от променливата PATH." -#: git-gui.sh:2235 +#: git-gui.sh:2241 msgid "Couldn't find git gui in PATH" msgstr "" "Командата „git gui“ липÑва в пътищата, определени от променливата PATH." -#: git-gui.sh:2654 lib/choose_repository.tcl:41 +#: git-gui.sh:2676 lib/choose_repository.tcl:41 msgid "Repository" msgstr "Хранилище" -#: git-gui.sh:2655 +#: git-gui.sh:2677 msgid "Edit" msgstr "Редактиране" -#: git-gui.sh:2657 lib/choose_rev.tcl:567 +#: git-gui.sh:2679 lib/choose_rev.tcl:567 msgid "Branch" msgstr "Клон" -#: git-gui.sh:2660 lib/choose_rev.tcl:554 +#: git-gui.sh:2682 lib/choose_rev.tcl:554 msgid "Commit@@noun" msgstr "Подаване" -#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 +#: git-gui.sh:2685 lib/merge.tcl:127 lib/merge.tcl:174 msgid "Merge" msgstr "Сливане" -#: git-gui.sh:2664 lib/choose_rev.tcl:563 +#: git-gui.sh:2686 lib/choose_rev.tcl:563 msgid "Remote" msgstr "Отдалечено хранилище" -#: git-gui.sh:2667 +#: git-gui.sh:2689 msgid "Tools" msgstr "Команди" -#: git-gui.sh:2676 +#: git-gui.sh:2698 msgid "Explore Working Copy" msgstr "Разглеждане на работното копие" -#: git-gui.sh:2682 +#: git-gui.sh:2704 msgid "Git Bash" msgstr "Bash за Git" -#: git-gui.sh:2692 +#: git-gui.sh:2714 msgid "Browse Current Branch's Files" msgstr "Разглеждане на файловете в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½" -#: git-gui.sh:2696 +#: git-gui.sh:2718 msgid "Browse Branch Files..." msgstr "Разглеждане на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½â€¦" -#: git-gui.sh:2701 +#: git-gui.sh:2723 msgid "Visualize Current Branch's History" msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½" -#: git-gui.sh:2705 +#: git-gui.sh:2727 msgid "Visualize All Branch History" msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на вÑички клонове" -#: git-gui.sh:2712 +#: git-gui.sh:2734 #, tcl-format msgid "Browse %s's Files" -msgstr "Разглеждане на файловете в %s" +msgstr "Разглеждане на файловете в „%s“" -#: git-gui.sh:2714 +#: git-gui.sh:2736 #, tcl-format msgid "Visualize %s's History" -msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на %s" +msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на „%s“" -#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66 +#: git-gui.sh:2741 lib/database.tcl:40 msgid "Database Statistics" msgstr "СтатиÑтика на базата от данни" -#: git-gui.sh:2722 lib/database.tcl:33 +#: git-gui.sh:2744 lib/database.tcl:33 msgid "Compress Database" msgstr "КомпреÑиране на базата от данни" -#: git-gui.sh:2725 +#: git-gui.sh:2747 msgid "Verify Database" msgstr "Проверка на базата от данни" -#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8 -#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 +#: git-gui.sh:2754 git-gui.sh:2758 git-gui.sh:2762 msgid "Create Desktop Icon" msgstr "ДобавÑне на икона на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚" -#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201 +#: git-gui.sh:2770 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201 msgid "Quit" msgstr "Спиране на програмата" -#: git-gui.sh:2756 +#: git-gui.sh:2778 msgid "Undo" msgstr "ОтмÑна" -#: git-gui.sh:2759 +#: git-gui.sh:2781 msgid "Redo" msgstr "Повторение" -#: git-gui.sh:2763 git-gui.sh:3368 +#: git-gui.sh:2785 git-gui.sh:3399 msgid "Cut" msgstr "ОтрÑзване" -#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530 +#: git-gui.sh:2788 git-gui.sh:3402 git-gui.sh:3476 git-gui.sh:3562 #: lib/console.tcl:69 msgid "Copy" msgstr "Копиране" -#: git-gui.sh:2769 git-gui.sh:3374 +#: git-gui.sh:2791 git-gui.sh:3405 msgid "Paste" msgstr "ПоÑтавÑне" -#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39 -#: lib/branch_delete.tcl:28 +#: git-gui.sh:2794 git-gui.sh:3408 lib/branch_delete.tcl:28 +#: lib/remote_branch_delete.tcl:39 msgid "Delete" msgstr "Изтриване" -#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71 +#: git-gui.sh:2798 git-gui.sh:3412 git-gui.sh:3566 lib/console.tcl:71 msgid "Select All" msgstr "Избиране на вÑичко" -#: git-gui.sh:2785 +#: git-gui.sh:2807 msgid "Create..." msgstr "Създаване…" -#: git-gui.sh:2791 +#: git-gui.sh:2813 msgid "Checkout..." msgstr "ИзтеглÑне…" -#: git-gui.sh:2797 +#: git-gui.sh:2819 msgid "Rename..." msgstr "Преименуване…" -#: git-gui.sh:2802 +#: git-gui.sh:2824 msgid "Delete..." msgstr "Изтриване…" -#: git-gui.sh:2807 +#: git-gui.sh:2829 msgid "Reset..." msgstr "ОтмÑна на промените…" -#: git-gui.sh:2817 +#: git-gui.sh:2839 msgid "Done" msgstr "Готово" -#: git-gui.sh:2819 +#: git-gui.sh:2841 msgid "Commit@@verb" msgstr "Подаване" -#: git-gui.sh:2828 git-gui.sh:3309 +#: git-gui.sh:2850 git-gui.sh:3335 msgid "New Commit" msgstr "Ðово подаване" -#: git-gui.sh:2836 git-gui.sh:3316 +#: git-gui.sh:2858 git-gui.sh:3342 msgid "Amend Last Commit" msgstr "ПоправÑне на поÑледното подаване" -#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101 +#: git-gui.sh:2868 git-gui.sh:3296 lib/remote_branch_delete.tcl:101 msgid "Rescan" msgstr "ОбновÑване" -#: git-gui.sh:2852 +#: git-gui.sh:2874 msgid "Stage To Commit" msgstr "Към индекÑа за подаване" -#: git-gui.sh:2858 +#: git-gui.sh:2880 msgid "Stage Changed Files To Commit" msgstr "Ð’Ñички променени файлове към индекÑа за подаване" -#: git-gui.sh:2864 +#: git-gui.sh:2886 msgid "Unstage From Commit" msgstr "Изваждане от индекÑа за подаване" -#: git-gui.sh:2870 lib/index.tcl:442 +#: git-gui.sh:2892 lib/index.tcl:442 msgid "Revert Changes" msgstr "Връщане на оригинала" -#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612 +#: git-gui.sh:2900 git-gui.sh:3613 git-gui.sh:3644 msgid "Show Less Context" msgstr "По-малко контекÑÑ‚" -#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616 +#: git-gui.sh:2904 git-gui.sh:3617 git-gui.sh:3648 msgid "Show More Context" msgstr "Повече контекÑÑ‚" -#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392 +#: git-gui.sh:2911 git-gui.sh:3309 git-gui.sh:3423 msgid "Sign Off" msgstr "ПодпиÑване" -#: git-gui.sh:2905 +#: git-gui.sh:2927 msgid "Local Merge..." msgstr "Локално Ñливане…" -#: git-gui.sh:2910 +#: git-gui.sh:2932 msgid "Abort Merge..." msgstr "ПреуÑтановÑване на Ñливане…" -#: git-gui.sh:2922 git-gui.sh:2950 +#: git-gui.sh:2944 git-gui.sh:2972 msgid "Add..." msgstr "ДобавÑне…" -#: git-gui.sh:2926 +#: git-gui.sh:2948 msgid "Push..." -msgstr "Избутване…" +msgstr "ИзтлаÑкване…" -#: git-gui.sh:2930 +#: git-gui.sh:2952 msgid "Delete Branch..." msgstr "Изтриване на клон…" -#: git-gui.sh:2940 git-gui.sh:3563 +#: git-gui.sh:2962 git-gui.sh:3595 msgid "Options..." msgstr "Опции…" -#: git-gui.sh:2951 +#: git-gui.sh:2973 msgid "Remove..." msgstr "Премахване…" -#: git-gui.sh:2960 lib/choose_repository.tcl:55 +#: git-gui.sh:2982 lib/choose_repository.tcl:55 msgid "Help" msgstr "Помощ" -#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49 -#: lib/choose_repository.tcl:58 lib/about.tcl:14 +#: git-gui.sh:2986 git-gui.sh:2990 lib/about.tcl:14 +#: lib/choose_repository.tcl:49 lib/choose_repository.tcl:58 #, tcl-format msgid "About %s" msgstr "ОтноÑно %s" -#: git-gui.sh:2992 +#: git-gui.sh:3014 msgid "Online Documentation" msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð² Интернет" -#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61 +#: git-gui.sh:3017 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61 msgid "Show SSH Key" msgstr "Показване на ключа за SSH" -#: git-gui.sh:3014 git-gui.sh:3146 +#: git-gui.sh:3032 git-gui.sh:3164 +msgid "usage:" +msgstr "употреба:" + +#: git-gui.sh:3036 git-gui.sh:3168 msgid "Usage" msgstr "Употреба" -#: git-gui.sh:3095 lib/blame.tcl:573 +#: git-gui.sh:3117 lib/blame.tcl:573 msgid "Error" msgstr "Грешка" -#: git-gui.sh:3126 +#: git-gui.sh:3148 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" "ФÐТÐЛÐРГРЕШКÐ: пътÑÑ‚ %s не може да бъде открит: такъв файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ " "нÑма" -#: git-gui.sh:3159 +#: git-gui.sh:3181 msgid "Current Branch:" msgstr "Текущ клон:" -#: git-gui.sh:3185 -msgid "Staged Changes (Will Commit)" -msgstr "Промени в индекÑа (за подаване)" - -#: git-gui.sh:3205 +#: git-gui.sh:3206 msgid "Unstaged Changes" msgstr "Промени извън индекÑа" -#: git-gui.sh:3276 +#: git-gui.sh:3228 +msgid "Staged Changes (Will Commit)" +msgstr "Промени в индекÑа (за подаване)" + +#: git-gui.sh:3302 msgid "Stage Changed" msgstr "ИндекÑÑŠÑ‚ е променен" -#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229 +#: git-gui.sh:3321 lib/transport.tcl:137 msgid "Push" msgstr "ИзтлаÑкване" -#: git-gui.sh:3330 +#: git-gui.sh:3356 msgid "Initial Commit Message:" msgstr "Първоначално Ñъобщение при подаване:" -#: git-gui.sh:3331 +#: git-gui.sh:3357 msgid "Amended Commit Message:" msgstr "Поправено Ñъобщение при подаване:" -#: git-gui.sh:3332 +#: git-gui.sh:3358 msgid "Amended Initial Commit Message:" msgstr "Поправено първоначално Ñъобщение при подаване:" -#: git-gui.sh:3333 +#: git-gui.sh:3359 msgid "Amended Merge Commit Message:" msgstr "Поправено Ñъобщение при подаване ÑÑŠÑ Ñливане:" -#: git-gui.sh:3334 +#: git-gui.sh:3360 msgid "Merge Commit Message:" msgstr "Съобщение при подаване ÑÑŠÑ Ñливане:" -#: git-gui.sh:3335 +#: git-gui.sh:3361 msgid "Commit Message:" msgstr "Съобщение при подаване:" -#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73 +#: git-gui.sh:3415 git-gui.sh:3570 lib/console.tcl:73 msgid "Copy All" msgstr "Копиране на вÑичко" -#: git-gui.sh:3408 lib/blame.tcl:105 +#: git-gui.sh:3439 lib/blame.tcl:105 msgid "File:" msgstr "Файл:" -#: git-gui.sh:3526 +#: git-gui.sh:3558 msgid "Refresh" msgstr "ОбновÑване" -#: git-gui.sh:3547 +#: git-gui.sh:3579 msgid "Decrease Font Size" msgstr "По-едър шрифт" -#: git-gui.sh:3551 +#: git-gui.sh:3583 msgid "Increase Font Size" msgstr "По-дребен шрифт" -#: git-gui.sh:3559 lib/blame.tcl:294 +#: git-gui.sh:3591 lib/blame.tcl:294 msgid "Encoding" msgstr "Кодиране" -#: git-gui.sh:3570 +#: git-gui.sh:3602 msgid "Apply/Reverse Hunk" msgstr "Прилагане/връщане на парче" -#: git-gui.sh:3575 +#: git-gui.sh:3607 msgid "Apply/Reverse Line" msgstr "Прилагане/връщане на ред" -#: git-gui.sh:3594 +#: git-gui.sh:3626 msgid "Run Merge Tool" msgstr "Изпълнение на програмата за Ñливане" -#: git-gui.sh:3599 +#: git-gui.sh:3631 msgid "Use Remote Version" msgstr "ВерÑÐ¸Ñ Ð¾Ñ‚ отдалеченото хранилище" -#: git-gui.sh:3603 +#: git-gui.sh:3635 msgid "Use Local Version" msgstr "Локална верÑиÑ" -#: git-gui.sh:3607 +#: git-gui.sh:3639 msgid "Revert To Base" msgstr "Връщане към родителÑката верÑиÑ" -#: git-gui.sh:3625 +#: git-gui.sh:3657 msgid "Visualize These Changes In The Submodule" msgstr "Визуализиране на промените в подмодула" -#: git-gui.sh:3629 +#: git-gui.sh:3661 msgid "Visualize Current Branch History In The Submodule" msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ в иÑториÑта за подмодула" -#: git-gui.sh:3633 +#: git-gui.sh:3665 msgid "Visualize All Branch History In The Submodule" msgstr "Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° иÑториÑта на вÑички клони в иÑториÑта за подмодула" -#: git-gui.sh:3638 +#: git-gui.sh:3670 msgid "Start git gui In The Submodule" msgstr "Стартиране на „git gui“ за подмодула" -#: git-gui.sh:3673 +#: git-gui.sh:3705 msgid "Unstage Hunk From Commit" msgstr "Изваждане на парчето от подаването" -#: git-gui.sh:3675 +#: git-gui.sh:3707 msgid "Unstage Lines From Commit" msgstr "Изваждане на редовете от подаването" -#: git-gui.sh:3677 +#: git-gui.sh:3709 msgid "Unstage Line From Commit" msgstr "Изваждане на реда от подаването" -#: git-gui.sh:3680 +#: git-gui.sh:3712 msgid "Stage Hunk For Commit" msgstr "ДобавÑне на парчето за подаване" -#: git-gui.sh:3682 +#: git-gui.sh:3714 msgid "Stage Lines For Commit" msgstr "ДобавÑне на редовете за подаване" -#: git-gui.sh:3684 +#: git-gui.sh:3716 msgid "Stage Line For Commit" msgstr "ДобавÑне на реда за подаване" -#: git-gui.sh:3709 +#: git-gui.sh:3741 msgid "Initializing..." msgstr "Инициализиране…" -#: git-gui.sh:3852 +#: git-gui.sh:3886 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -576,7 +579,7 @@ msgstr "" "от %s:\n" "\n" -#: git-gui.sh:3881 +#: git-gui.sh:3915 msgid "" "\n" "This is due to a known issue with the\n" @@ -586,7 +589,7 @@ msgstr "" "Това е познат проблем и Ñе дължи на\n" "верÑиÑта на Tcl включена в Cygwin." -#: git-gui.sh:3886 +#: git-gui.sh:3920 #, tcl-format msgid "" "\n" @@ -602,199 +605,126 @@ msgstr "" "е да поÑтавите наÑтройките „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/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "git-gui — графичен Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð° Git." -#: lib/spellcheck.tcl:70 +#: lib/blame.tcl:73 #, 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 "Данни за отдалеченото хранилище" +msgid "%s (%s): File Viewer" +msgstr "%s (%s): Преглед на файлове" -#: 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/blame.tcl:79 +msgid "Commit:" +msgstr "Подаване:" -#: lib/remote_add.tcl:60 -msgid "Further Action" -msgstr "Следващо дейÑтвие" +#: lib/blame.tcl:280 +msgid "Copy Commit" +msgstr "Копиране на подаване" -#: lib/remote_add.tcl:63 -msgid "Fetch Immediately" -msgstr "Ðезабавно доÑтавÑне" +#: lib/blame.tcl:284 +msgid "Find Text..." +msgstr "ТърÑене на текÑт…" -#: lib/remote_add.tcl:69 -msgid "Initialize Remote Repository and Push" -msgstr "Инициализиране на отдалеченото хранилище и изтлаÑкване на промените" +#: lib/blame.tcl:288 +msgid "Goto Line..." +msgstr "Към ред…" -#: lib/remote_add.tcl:75 -msgid "Do Nothing Else Now" -msgstr "Да не Ñе прави нищо" +#: lib/blame.tcl:297 +msgid "Do Full Copy Detection" +msgstr "Пълно Ñ‚ÑŠÑ€Ñене на копиране" -#: lib/remote_add.tcl:100 -msgid "Please supply a remote name." -msgstr "Задайте име за отдалеченото хранилище." +#: lib/blame.tcl:301 +msgid "Show History Context" +msgstr "Показване на контекÑта от иÑториÑта" -#: lib/remote_add.tcl:113 -#, tcl-format -msgid "'%s' is not an acceptable remote name." -msgstr "Отдалечено хранилище не може да Ñе казва „%s“." +#: lib/blame.tcl:304 +msgid "Blame Parent Commit" +msgstr "Ðнотиране на родителÑкото подаване" -#: lib/remote_add.tcl:124 +#: lib/blame.tcl:466 #, tcl-format -msgid "Failed to add remote '%s' of location '%s'." -msgstr "ÐеуÑпешно добавÑне на отдалеченото хранилище „%s“ от Ð°Ð´Ñ€ÐµÑ â€ž%s“." +msgid "Reading %s..." +msgstr "Чете Ñе „%s“…" -#: lib/remote_add.tcl:132 lib/transport.tcl:6 -#, tcl-format -msgid "fetch %s" -msgstr "доÑтавÑне на „%s“" +#: lib/blame.tcl:594 +msgid "Loading copy/move tracking annotations..." +msgstr "Зареждане на анотациите за проÑледÑване на копирането/премеÑтването…" -#: lib/remote_add.tcl:133 -#, tcl-format -msgid "Fetching the %s" -msgstr "ДоÑтавÑне на „%s“" +#: lib/blame.tcl:614 +msgid "lines annotated" +msgstr "реда анотирани" -#: lib/remote_add.tcl:156 -#, tcl-format -msgid "Do not know how to initialize repository at location '%s'." -msgstr "Хранилището Ñ Ð¼ÐµÑтоположение „%s“ не може да бъде инициализирано." +#: lib/blame.tcl:806 +msgid "Loading original location annotations..." +msgstr "Зареждане на анотациите за първоначалното меÑтоположение…" -#: 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/blame.tcl:809 +msgid "Annotation complete." +msgstr "Ðнотирането завърши." -#: lib/remote_add.tcl:163 -#, tcl-format -msgid "Setting up the %s (at %s)" -msgstr "ДобавÑне на хранилище „%s“ (Ñ Ð°Ð´Ñ€ÐµÑ â€ž%s“)" +#: lib/blame.tcl:839 +msgid "Busy" +msgstr "ОперациÑта не е завършила" -#: lib/browser.tcl:17 -msgid "Starting..." -msgstr "Стартиране…" +#: lib/blame.tcl:840 +msgid "Annotation process is already running." +msgstr "Ð’ момента тече Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° анотиране." -#: lib/browser.tcl:27 -msgid "File Browser" -msgstr "Файлов браузър" +#: lib/blame.tcl:879 +msgid "Running thorough copy detection..." +msgstr "ИзпълнÑва Ñе цÑлоÑтен Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° откриване на копиране…" -#: lib/browser.tcl:132 lib/browser.tcl:149 -#, tcl-format -msgid "Loading %s..." -msgstr "Зареждане на „%s“…" +#: lib/blame.tcl:947 +msgid "Loading annotation..." +msgstr "Зареждане на анотации…" -#: lib/browser.tcl:193 -msgid "[Up To Parent]" -msgstr "[Към родителÑ]" +#: lib/blame.tcl:1000 +msgid "Author:" +msgstr "Ðвтор:" -#: lib/browser.tcl:275 lib/browser.tcl:282 -msgid "Browse Branch Files" -msgstr "Разглеждане на файловете в клона" +#: lib/blame.tcl:1004 +msgid "Committer:" +msgstr "Подал:" -#: lib/browser.tcl:288 lib/choose_repository.tcl:422 -#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518 -#: lib/choose_repository.tcl:1074 -msgid "Browse" -msgstr "Разглеждане" +#: lib/blame.tcl:1009 +msgid "Original File:" +msgstr "Първоначален файл:" -#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321 -msgid "Revision" -msgstr "ВерÑиÑ" +#: lib/blame.tcl:1057 +msgid "Cannot find HEAD commit:" +msgstr "Подаването за връх „HEAD“ не може да Ñе открие:" -#: lib/tools.tcl:75 -#, tcl-format -msgid "Running %s requires a selected file." -msgstr "За изпълнението на „%s“ Ñ‚Ñ€Ñбва да изберете файл." +#: lib/blame.tcl:1112 +msgid "Cannot find parent commit:" +msgstr "РодителÑкото подаване не може да бъде открито" -#: 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/blame.tcl:1127 +msgid "Unable to display parent" +msgstr "РодителÑÑ‚ не може да бъде показан" -#: lib/tools.tcl:95 -#, tcl-format -msgid "Are you sure you want to run %s?" -msgstr "Сигурни ли Ñте, че иÑкате да изпълните „%s“?" +#: lib/blame.tcl:1128 lib/diff.tcl:358 +msgid "Error loading diff:" +msgstr "Грешка при зареждане на разлика:" -#: lib/tools.tcl:116 -#, tcl-format -msgid "Tool: %s" -msgstr "Команда: %s" +#: lib/blame.tcl:1269 +msgid "Originally By:" +msgstr "Първоначално от:" -#: lib/tools.tcl:117 -#, tcl-format -msgid "Running: %s" -msgstr "Изпълнение: %s" +#: lib/blame.tcl:1275 +msgid "In File:" +msgstr "Във файл:" -#: lib/tools.tcl:155 -#, tcl-format -msgid "Tool completed successfully: %s" -msgstr "Командата завърши уÑпешно: %s" +#: lib/blame.tcl:1280 +msgid "Copied Or Moved Here By:" +msgstr "Копирано или премеÑтено тук от:" -#: lib/tools.tcl:157 +#: lib/branch_checkout.tcl:16 #, tcl-format -msgid "Tool failed: %s" -msgstr "Командата върна грешка: %s" +msgid "%s (%s): Checkout Branch" +msgstr "%s (%s): Клон за изтеглÑне" -#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 +#: lib/branch_checkout.tcl:21 msgid "Checkout Branch" msgstr "Клон за изтеглÑне" @@ -802,7 +732,19 @@ msgstr "Клон за изтеглÑне" msgid "Checkout" msgstr "ИзтеглÑне" -#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69 +#: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37 lib/branch_delete.tcl:34 +#: lib/branch_rename.tcl:32 lib/browser.tcl:292 lib/checkout_op.tcl:579 +#: lib/choose_font.tcl:45 lib/merge.tcl:178 lib/option.tcl:127 +#: lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43 lib/tools_dlg.tcl:41 +#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/transport.tcl:141 +msgid "Cancel" +msgstr "Отказване" + +#: lib/branch_checkout.tcl:35 lib/browser.tcl:297 lib/tools_dlg.tcl:321 +msgid "Revision" +msgstr "ВерÑиÑ" + +#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:310 msgid "Options" msgstr "Опции" @@ -814,167 +756,129 @@ msgstr "ИзтеглÑне на промените от ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð 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 +#: lib/branch_create.tcl:23 #, tcl-format -msgid "Pruning tracking branches deleted from %s" -msgstr "ОкаÑÑ‚Ñ€Ñне на ÑледÑщите клони на изтритите клони от „%s“" - -#: lib/transport.tcl:25 -msgid "fetch all remotes" -msgstr "доÑтавÑне на вÑички отдалечени хранилища" +msgid "%s (%s): Create Branch" +msgstr "%s (%s): Създаване на клон" -#: lib/transport.tcl:26 -msgid "Fetching new changes from all remotes" -msgstr "ДоÑтавÑне на новите промени от вÑички отдалечени хранилища" - -#: lib/transport.tcl:40 -msgid "remote prune all remotes" -msgstr "окаÑÑ‚Ñ€Ñне на вÑички ÑледÑщи клони" +#: lib/branch_create.tcl:28 +msgid "Create New Branch" +msgstr "Създаване на нов клон" -#: lib/transport.tcl:41 -msgid "Pruning tracking branches deleted from all remotes" -msgstr "" -"ОкаÑÑ‚Ñ€Ñне на вÑички клони, които ÑледÑÑ‚ изтрити клони от отдалечени хранилища" +#: lib/branch_create.tcl:33 lib/choose_repository.tcl:407 +msgid "Create" +msgstr "Създаване" -#: lib/transport.tcl:55 -#, tcl-format -msgid "Pushing changes to %s" -msgstr "ИзтлаÑкване на промените към „%s“" +#: lib/branch_create.tcl:42 +msgid "Branch Name" +msgstr "Име на клона" -#: lib/transport.tcl:93 -#, tcl-format -msgid "Mirroring to %s" -msgstr "ИзтлаÑкване на вÑичко към „%s“" +#: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 +msgid "Name:" +msgstr "Име:" -#: lib/transport.tcl:111 -#, tcl-format -msgid "Pushing %s %s to %s" -msgstr "ИзтлаÑкване на %s „%s“ към „%s“" +#: lib/branch_create.tcl:57 +msgid "Match Tracking Branch Name" +msgstr "Съвпадане по името на ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" -#: lib/transport.tcl:132 -msgid "Push Branches" -msgstr "Клони за изтлаÑкване" +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "Ðачална верÑиÑ" -#: lib/transport.tcl:147 -msgid "Source Branches" -msgstr "Клони-източници" +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "ОбновÑване на ÑъщеÑтвуващ клон:" -#: lib/transport.tcl:162 -msgid "Destination Repository" -msgstr "Целево хранилище" +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "Ðе" -#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51 -msgid "Remote:" -msgstr "Отдалечено хранилище:" +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "Само тривиално превъртащо Ñливане" -#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72 -msgid "Arbitrary Location:" -msgstr "Произволно меÑтоположение:" +#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571 +msgid "Reset" +msgstr "Отначало" -#: lib/transport.tcl:205 -msgid "Transfer Options" -msgstr "ÐаÑтройки при пренаÑÑнето" +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "Преминаване към клона Ñлед Ñъздаването му" -#: lib/transport.tcl:207 -msgid "Force overwrite existing branch (may discard changes)" -msgstr "" -"Изрично презапиÑване на ÑъщеÑтвуващ клон (нÑкои промени може да бъдат " -"загубени)" +#: lib/branch_create.tcl:132 +msgid "Please select a tracking branch." +msgstr "Изберете клон за Ñледени." -#: lib/transport.tcl:211 -msgid "Use thin pack (for slow network connections)" -msgstr "МакÑимална компреÑÐ¸Ñ (за бавни мрежови връзки)" +#: lib/branch_create.tcl:141 +#, tcl-format +msgid "Tracking branch %s is not a branch in the remote repository." +msgstr "СледÑщиÑÑ‚ клон — „%s“, не ÑъщеÑтвува в отдалеченото хранилище." -#: lib/transport.tcl:215 -msgid "Include tags" -msgstr "Включване на етикетите" +#: lib/branch_create.tcl:154 lib/branch_rename.tcl:92 +msgid "Please supply a branch name." +msgstr "Дайте име на клона." -#: lib/status_bar.tcl:87 +#: lib/branch_create.tcl:165 lib/branch_rename.tcl:112 #, tcl-format -msgid "%s ... %*i of %*i %s (%3i%%)" -msgstr "%s… %*i от общо %*i %s (%3i%%)" +msgid "'%s' is not an acceptable branch name." +msgstr "„%s“ не може да Ñе използва за име на клон." -#: lib/remote.tcl:200 -msgid "Push to" -msgstr "ИзтлаÑкване към" +#: lib/branch_delete.tcl:16 +#, tcl-format +msgid "%s (%s): Delete Branch" +msgstr "%s (%s): Изтриване на клон" -#: lib/remote.tcl:218 -msgid "Remove Remote" -msgstr "Премахване на отдалечено хранилище" +#: lib/branch_delete.tcl:21 +msgid "Delete Local Branch" +msgstr "Изтриване на локален клон" -#: lib/remote.tcl:223 -msgid "Prune from" -msgstr "ОкаÑÑ‚Ñ€Ñне от" +#: lib/branch_delete.tcl:39 +msgid "Local Branches" +msgstr "Локални клони" -#: lib/remote.tcl:228 -msgid "Fetch from" -msgstr "ДоÑтавÑне от" +#: lib/branch_delete.tcl:51 +msgid "Delete Only If Merged Into" +msgstr "Изтриване, Ñамо ако промените Ñа Ñлети и другаде" -#: lib/sshkey.tcl:31 -msgid "No keys found." -msgstr "Ðе Ñа открити ключове." +#: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120 +msgid "Always (Do not perform merge checks)" +msgstr "Винаги (без проверка за Ñливане)" -#: lib/sshkey.tcl:34 +#: lib/branch_delete.tcl:103 #, 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 "Копиране към ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€" +msgid "The following branches are not completely merged into %s:" +msgstr "Ðе вÑички промени в клоните Ñа Ñлети в „%s“:" -#: lib/sshkey.tcl:72 -msgid "Your OpenSSH Public Key" -msgstr "ПубличниÑÑ‚ ви ключ за OpenSSH" +#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218 +msgid "" +"Recovering deleted branches is difficult.\n" +"\n" +"Delete the selected branches?" +msgstr "" +"ВъзÑтановÑването на изтрити клони може да е трудно.\n" +"\n" +"Сигурни ли Ñте, че иÑкате да триете?" -#: lib/sshkey.tcl:80 -msgid "Generating..." -msgstr "Генериране…" +#: lib/branch_delete.tcl:131 +#, tcl-format +msgid " - %s:" +msgstr " — „%s:“" -#: lib/sshkey.tcl:86 +#: lib/branch_delete.tcl:141 #, tcl-format msgid "" -"Could not start ssh-keygen:\n" -"\n" +"Failed to delete branches:\n" "%s" msgstr "" -"Програмата „ssh-keygen“ не може да бъде Ñтартирана:\n" -"\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 +#: lib/branch_rename.tcl:15 #, tcl-format -msgid "Your key is in: %s" -msgstr "Ключът ви е в „%s“" +msgid "%s (%s): Rename Branch" +msgstr "%s (%s): Преименуване на клон" -#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 +#: lib/branch_rename.tcl:23 msgid "Rename Branch" msgstr "Преименуване на клон" @@ -994,611 +898,218 @@ msgstr "Ðово име:" 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/browser.tcl:17 +msgid "Starting..." +msgstr "Стартиране…" -#: lib/option.tcl:11 +#: lib/browser.tcl:27 #, tcl-format -msgid "Invalid global encoding '%s'" -msgstr "Ðеправилно глобално кодиране „%s“" +msgid "%s (%s): File Browser" +msgstr "%s (%s): Файлов браузър" -#: lib/option.tcl:19 +#: lib/browser.tcl:132 lib/browser.tcl:149 #, tcl-format -msgid "Invalid repo encoding '%s'" -msgstr "Ðеправилно кодиране „%s“ на хранилището" - -#: lib/option.tcl:119 -msgid "Restore Defaults" -msgstr "Стандартни наÑтройки" +msgid "Loading %s..." +msgstr "Зареждане на „%s“…" -#: lib/option.tcl:123 -msgid "Save" -msgstr "Запазване" +#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[Към родителÑ]" -#: lib/option.tcl:133 +#: lib/browser.tcl:275 #, tcl-format -msgid "%s Repository" -msgstr "Хранилище „%s“" - -#: lib/option.tcl:134 -msgid "Global (All Repositories)" -msgstr "Глобално (за вÑички хранилища)" +msgid "%s (%s): Browse Branch Files" +msgstr "%s (%s): Разглеждане на файловете в клона" -#: 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/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Разглеждане на файловете в клона" -#: lib/option.tcl:144 -msgid "Merge Verbosity" -msgstr "ПодробноÑти при ÑливаниÑта" +#: lib/browser.tcl:288 lib/choose_repository.tcl:422 +#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518 +#: lib/choose_repository.tcl:1074 +msgid "Browse" +msgstr "Разглеждане" -#: lib/option.tcl:145 -msgid "Show Diffstat After Merge" -msgstr "Извеждане на ÑтатиÑтика Ñлед ÑливаниÑта" +#: lib/checkout_op.tcl:85 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "ДоÑтавÑне на „%s“ от „%s“" -#: lib/option.tcl:146 -msgid "Use Merge Tool" -msgstr "Използване на програма за Ñливане" +#: lib/checkout_op.tcl:133 +#, tcl-format +msgid "fatal: Cannot resolve %s" +msgstr "фатална грешка: „%s“ не може да Ñе открие" -#: lib/option.tcl:148 -msgid "Trust File Modification Timestamps" -msgstr "Доверие във времето на промÑна на файловете" +#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30 +#: lib/sshkey.tcl:55 +msgid "Close" +msgstr "ЗатварÑне" -#: lib/option.tcl:149 -msgid "Prune Tracking Branches During Fetch" -msgstr "ОкаÑÑ‚Ñ€Ñне на ÑледÑщите клонове при доÑтавÑне" +#: lib/checkout_op.tcl:175 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Клонът „%s“ не ÑъщеÑтвува." -#: lib/option.tcl:150 -msgid "Match Tracking Branches" -msgstr "ÐапаÑване на ÑледÑщите клонове" +#: lib/checkout_op.tcl:194 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "ÐеуÑпешно наÑтройване на опроÑтен git-pull за „%s“." -#: lib/option.tcl:151 -msgid "Use Textconv For Diffs and Blames" +#: 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 "" -"Преобразуване на текÑта Ñ â€ž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 "Допълнителни аргументи към „git diff“" - -#: 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:164 -msgid "Tab spacing" -msgstr "Размер на табулациÑта в интервали" - -#: lib/option.tcl:210 -msgid "Change" -msgstr "СмÑна" - -#: lib/option.tcl:254 -msgid "Spelling Dictionary:" -msgstr "ПравопиÑен речник:" - -#: lib/option.tcl:284 -msgid "Change Font" -msgstr "СмÑна на шрифта" +"Клонът „%s“ ÑъщеÑтвува.\n" +"\n" +"Той не може да бъде тривиално ÑлÑÑ‚ до „%s“.\n" +"Ðеобходимо е Ñливане." -#: lib/option.tcl:288 +#: lib/checkout_op.tcl:243 #, tcl-format -msgid "Choose %s" -msgstr "Избор на „%s“" - -#: lib/option.tcl:294 -msgid "pt." -msgstr "тчк." - -#: lib/option.tcl:308 -msgid "Preferences" -msgstr "ÐаÑтройки" - -#: lib/option.tcl:345 -msgid "Failed to completely save options:" -msgstr "ÐеуÑпешно запазване на наÑтройките:" - -#: lib/encoding.tcl:443 -msgid "Default" -msgstr "Стандартното" +msgid "Merge strategy '%s' not supported." +msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ð·Ð° Ñливане „%s“ не Ñе поддържа." -#: lib/encoding.tcl:448 +#: lib/checkout_op.tcl:262 #, tcl-format -msgid "System (%s)" -msgstr "СиÑтемното (%s)" - -#: lib/encoding.tcl:459 lib/encoding.tcl:465 -msgid "Other" -msgstr "Друго" - -#: lib/mergetool.tcl:8 -msgid "Force resolution to the base version?" -msgstr "Да Ñе използва базовата верÑиÑ" - -#: lib/mergetool.tcl:9 -msgid "Force resolution to this branch?" -msgstr "Да Ñе използва верÑиÑта от този клон" +msgid "Failed to update '%s'." +msgstr "ÐеуÑпешно обновÑване на „%s“." -#: lib/mergetool.tcl:10 -msgid "Force resolution to the other branch?" -msgstr "Да Ñе използва верÑиÑта от Ð´Ñ€ÑƒÐ³Ð¸Ñ ÐºÐ»Ð¾Ð½" +#: lib/checkout_op.tcl:274 +msgid "Staging area (index) is already locked." +msgstr "ИндекÑÑŠÑ‚ вече е заключен." -#: lib/mergetool.tcl:14 -#, tcl-format +#: lib/checkout_op.tcl:289 msgid "" -"Note that the diff shows only conflicting changes.\n" +"Last scanned state does not match repository state.\n" "\n" -"%s will be overwritten.\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" -"This operation can be undone only by restarting the merge." +"The rescan will be automatically started now.\n" msgstr "" -"Разликата показва Ñамо разликите Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚.\n" +"СъÑтоÑнието при поÑледната проверка не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° ÑÑŠÑтоÑнието на " +"хранилището.\n" "\n" -"Файлът „%s“ ще бъде презапиÑан.\n" +"ÐÑкой друг Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð° Git е променил хранилището междувременно. СъÑтоÑнието " +"Ñ‚Ñ€Ñбва да бъде проверено, преди да Ñе премине към нов клон.\n" "\n" -"Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да бъде отменена Ñамо чрез започване на Ñливането наново." - -#: lib/mergetool.tcl:45 -#, tcl-format -msgid "File %s seems to have unresolved conflicts, still stage?" -msgstr "" -"Изглежда, че вÑе още има некоригирани конфликти във файла „%s“. Да Ñе добави " -"ли файлът към индекÑа?" +"Ðвтоматично ще започне нова проверка.\n" -#: lib/mergetool.tcl:60 +#: lib/checkout_op.tcl:345 #, 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 "Файлът, в който е конфликтът, не ÑъщеÑтвува" +msgid "Updating working directory to '%s'..." +msgstr "Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñе привежда към „%s“…" -#: lib/mergetool.tcl:246 -#, tcl-format -msgid "Not a GUI merge tool: '%s'" -msgstr "Това не е графична програма за Ñливане: „%s“" +#: lib/checkout_op.tcl:346 +msgid "files checked out" +msgstr "файла Ñа изтеглени" -#: lib/mergetool.tcl:275 +#: lib/checkout_op.tcl:376 #, tcl-format -msgid "Unsupported merge tool '%s'" -msgstr "Ðеподдържана програма за Ñливане: „%s“" +msgid "Aborted checkout of '%s' (file level merging is required)." +msgstr "" +"ПреуÑтановÑване на изтеглÑнето на „%s“ (необходимо е пофайлово Ñливане)." -#: lib/mergetool.tcl:310 -msgid "Merge tool is already running, terminate it?" -msgstr "Програмата за Ñливане вече е Ñтартирана. Да бъде ли изключена?" +#: lib/checkout_op.tcl:377 +msgid "File level merge required." +msgstr "Ðеобходимо е пофайлово Ñливане." -#: lib/mergetool.tcl:330 +#: lib/checkout_op.tcl:381 #, tcl-format -msgid "" -"Error retrieving versions:\n" -"%s" -msgstr "" -"Грешка при изтеглÑнето на верÑии:\n" -"%s" +msgid "Staying on branch '%s'." +msgstr "ОÑтаване върху клона „%s“." -#: lib/mergetool.tcl:350 -#, tcl-format +#: lib/checkout_op.tcl:452 msgid "" -"Could not start the merge tool:\n" +"You are no longer on a local branch.\n" "\n" -"%s" +"If you wanted to be on a branch, create one now starting from 'This Detached " +"Checkout'." msgstr "" -"Програмата за Ñливане не може да бъде Ñтартирана:\n" +"Вече не Ñте на локален клон.\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 +#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 #, tcl-format -msgid "Tool '%s' already exists." -msgstr "Командата „%s“ вече ÑъщеÑтвува." +msgid "Checked out '%s'." +msgstr "„%s“ е изтеглен." -#: lib/tools_dlg.tcl:148 +#: lib/checkout_op.tcl:535 #, tcl-format -msgid "" -"Could not add tool:\n" -"%s" +msgid "Resetting '%s' to '%s' will lose the following commits:" 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 "Премахване" +"ЗанулÑването на „%s“ към „%s“ ще доведе до загубването на Ñледните подаваниÑ:" -#: lib/tools_dlg.tcl:231 -msgid "(Blue denotes repository-local tools)" -msgstr "(командите към локалното хранилище Ñа обозначени в Ñиньо)" +#: lib/checkout_op.tcl:557 +msgid "Recovering lost commits may not be easy." +msgstr "ВъзÑтановÑването на загубените Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ðµ да е трудно." -#: lib/tools_dlg.tcl:292 +#: lib/checkout_op.tcl:562 #, tcl-format -msgid "Run Command: %s" -msgstr "Изпълнение на командата „%s“" - -#: lib/tools_dlg.tcl:306 -msgid "Arguments" -msgstr "Ðргументи" +msgid "Reset '%s'?" +msgstr "ЗанулÑване на „%s“?" -#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166 +#: lib/checkout_op.tcl:567 lib/merge.tcl:170 lib/tools_dlg.tcl:336 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:77 +#: lib/checkout_op.tcl:635 #, 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" +"Failed to set current branch.\n" "\n" -"Времето на промÑна на файла е бил зададен от друга програма, но Ñъдържанието " -"му не е променено.\n" +"This working directory is only partially switched. We successfully updated " +"your files, but failed to update an internal Git file.\n" "\n" -"Ðвтоматично ще започне нова проверка дали нÑма други файлове в това " -"ÑÑŠÑтоÑние." - -#: lib/diff.tcl:117 -#, tcl-format -msgid "Loading diff of %s..." -msgstr "Зареждане на разликите в „%s“…" - -#: lib/diff.tcl:140 -msgid "" -"LOCAL: deleted\n" -"REMOTE:\n" -msgstr "" -"ЛОКÐЛÐО: изтрит\n" -"ОТДÐЛЕЧЕÐО:\n" - -#: lib/diff.tcl:145 -msgid "" -"REMOTE: deleted\n" -"LOCAL:\n" -msgstr "" -"ОТДÐЛЕЧЕÐО: изтрит\n" -"ЛОКÐЛÐО:\n" - -#: lib/diff.tcl:152 -msgid "LOCAL:\n" -msgstr "ЛОКÐЛÐО:\n" - -#: lib/diff.tcl:155 -msgid "REMOTE:\n" -msgstr "ОТДÐЛЕЧЕÐО:\n" - -#: lib/diff.tcl:217 lib/diff.tcl:355 -#, tcl-format -msgid "Unable to display %s" -msgstr "Файлът „%s“ не може да бъде показан" - -#: lib/diff.tcl:218 -msgid "Error loading file:" -msgstr "Грешка при зареждане на файл:" - -#: lib/diff.tcl:225 -msgid "Git Repository (subproject)" -msgstr "Хранилище на Git (подмодул)" - -#: lib/diff.tcl:237 -msgid "* Binary file (not showing content)." -msgstr "◠Двоичен файл (Ñъдържанието не Ñе показва)." - -#: lib/diff.tcl:242 -#, tcl-format -msgid "" -"* Untracked file is %d bytes.\n" -"* Showing only first %d bytes.\n" +"This should not have occurred. %s will now close and give up." msgstr "" -"â— ÐеÑледениÑÑ‚ файл е %d байта.\n" -"◠Показват Ñе Ñамо първите %d байта.\n" - -#: lib/diff.tcl:248 -#, tcl-format -msgid "" +"ÐеуÑпешно задаване на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½.\n" "\n" -"* Untracked file clipped here by %s.\n" -"* To see the entire file, use an external editor.\n" -msgstr "" +"Работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ðµ Ñамо чаÑтично обновена: файловете Ñа обновени " +"уÑпешно, но нÑкой от вътрешните, Ñлужебни файлове на Git не е бил.\n" "\n" -"â— ÐеÑледениÑÑ‚ файл е отрÑзан дотук от програмата „%s“.\n" -"◠Използвайте външен редактор, за да видите Ñ†ÐµÐ»Ð¸Ñ Ñ„Ð°Ð¹Ð».\n" - -#: lib/diff.tcl:356 lib/blame.tcl:1128 -msgid "Error loading diff:" -msgstr "Грешка при зареждане на разлика:" - -#: lib/diff.tcl:578 -msgid "Failed to unstage selected hunk." -msgstr "Избраното парче не може да бъде извадено от индекÑа." - -#: lib/diff.tcl:585 -msgid "Failed to stage selected hunk." -msgstr "Избраното парче не може да бъде добавено към индекÑа." - -#: lib/diff.tcl:664 -msgid "Failed to unstage selected line." -msgstr "ИзбраниÑÑ‚ ред не може да бъде изваден от индекÑа." - -#: lib/diff.tcl:672 -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 "Винаги (без проверка за Ñливане)" +"Това ÑÑŠÑтоÑние е аварийно и не Ñ‚Ñ€Ñбва да Ñе Ñлучва. Програмата „%s“ ще " +"преуÑтанови работа." -#: lib/remote_branch_delete.tcl:153 -msgid "A branch is required for 'Merged Into'." -msgstr "За данните „СлÑÑ‚ в“ е необходимо да зададете клон." +#: lib/choose_font.tcl:41 +msgid "Select" +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/choose_font.tcl:55 +msgid "Font Family" +msgstr "Шрифт" -#: 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/choose_font.tcl:76 +msgid "Font Size" +msgstr "Размер" -#: lib/remote_branch_delete.tcl:208 -msgid "Please select one or more branches to delete." -msgstr "Изберете поне един клон за изтриване." +#: lib/choose_font.tcl:93 +msgid "Font Example" +msgstr "МоÑтра" -#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 +#: lib/choose_font.tcl:105 msgid "" -"Recovering deleted branches is difficult.\n" -"\n" -"Delete the selected branches?" +"This is example text.\n" +"If you like this text, it can be your font." 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“…" +"Това е примерен текÑÑ‚.\n" +"Ðко ви хареÑва как изглежда, изберете шрифта." #: lib/choose_repository.tcl:33 msgid "Git Gui" @@ -1642,10 +1153,6 @@ msgstr "ОтварÑне на хранилище ползвано наÑкоро msgid "Failed to create repository %s:" msgstr "ÐеуÑпешно Ñъздаване на хранилището „%s“:" -#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33 -msgid "Create" -msgstr "Създаване" - #: lib/choose_repository.tcl:417 msgid "Directory:" msgstr "ДиректориÑ:" @@ -1830,7 +1337,7 @@ msgstr "Подмодулите не могат да Ñе клонират." #: lib/choose_repository.tcl:990 msgid "Cloning submodules" -msgstr "Клониране на подмодулите" +msgstr "Клониране на подмодули" #: lib/choose_repository.tcl:1015 msgid "Initial file checkout failed." @@ -1849,208 +1356,6 @@ msgstr "Хранилище:" 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 "Това неÑвързано изтеглÑне" @@ -2092,14 +1397,6 @@ msgstr "Обновен" 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" @@ -2228,12 +1525,12 @@ msgid "" " \n" " Do you really want to proceed with your Commit?" msgstr "" -"Ще подавате към неÑвързан връх. Това е опаÑно — при изтеглÑнето на друг клон " -"ще изгубите промените Ñи. След това може да е невъзможно да ги възÑтановите " -"от журнала на указателите „reflog“. Ðай-вероÑтно Ñ‚Ñ€Ñбва да отмените това " -"подаване и да Ñъздадете клон, в който да подадете.\n" +"Ще подадете към неÑвързан, отделÑн указател „HEAD“. Това е опаÑно, защото " +"при преминаването към клон ще загубите промените Ñи, като единÑтвениÑÑ‚ начин " +"да ги върнете ще е чрез журнала на указателите (reflog). Ðай-вероÑтно Ñ‚Ñ€Ñбва " +"да не правите това подаване, а да Ñъздадете нов клон, преди да продължите.\n" " \n" -"Сигурни ли Ñте, че иÑкате да подадете към неÑвързан връх?" +"Сигурни ли Ñте, че иÑкате да извършите текущото подаване?" #: lib/commit.tcl:290 msgid "Calling commit-msg hook..." @@ -2251,7 +1548,7 @@ msgstr "Подаване на промените…" msgid "write-tree failed:" msgstr "неуÑпешно запазване на дървото (write-tree):" -#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 +#: lib/commit.tcl:335 lib/commit.tcl:382 lib/commit.tcl:403 msgid "Commit failed." msgstr "ÐеуÑпешно подаване." @@ -2279,153 +1576,241 @@ msgstr "" msgid "No changes to commit." msgstr "ÐÑма промени за подаване." -#: lib/commit.tcl:378 +#: lib/commit.tcl:381 msgid "commit-tree failed:" msgstr "неуÑпешно подаване на дървото (commit-tree):" -#: lib/commit.tcl:399 +#: lib/commit.tcl:402 msgid "update-ref failed:" msgstr "неуÑпешно обновÑване на указателите (update-ref):" -#: lib/commit.tcl:492 +#: lib/commit.tcl:495 #, tcl-format msgid "Created commit %s: %s" msgstr "УÑпешно подаване %s: %s" -#: lib/branch_delete.tcl:16 -msgid "Delete Branch" -msgstr "Изтриване на клон" +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "Ð’ момента Ñе извършва дейÑтвие, изчакайте…" -#: lib/branch_delete.tcl:21 -msgid "Delete Local Branch" -msgstr "Изтриване на локален клон" +#: lib/console.tcl:186 +msgid "Success" +msgstr "УÑпех" -#: lib/branch_delete.tcl:39 -msgid "Local Branches" -msgstr "Локални клони" +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Грешка: неуÑпешно изпълнение на команда" -#: lib/branch_delete.tcl:51 -msgid "Delete Only If Merged Into" -msgstr "Изтриване, Ñамо ако промените Ñа Ñлети и другаде" +#: lib/database.tcl:42 +msgid "Number of loose objects" +msgstr "Брой непакетирани обекти" -#: lib/branch_delete.tcl:103 +#: 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:57 lib/option.tcl:182 lib/option.tcl:197 lib/option.tcl:220 +#: lib/option.tcl:282 #, tcl-format -msgid "The following branches are not completely merged into %s:" -msgstr "Ðе вÑички промени в клоните Ñа Ñлети в „%s“:" +msgid "%s:" +msgstr "%s:" -#: lib/branch_delete.tcl:141 +#: lib/database.tcl:66 +#, tcl-format +msgid "%s (%s): Database Statistics" +msgstr "%s (%s): СтатиÑтика на базата от данни" + +#: 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 "" -"Failed to delete branches:\n" -"%s" +"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 "" -"ÐеуÑпешно триене на клони:\n" -"%s" - -#: lib/blame.tcl:73 -msgid "File Viewer" -msgstr "Преглед на файлове" +"Ð’ това хранилище в момента има към %i непакетирани обекти.\n" +"\n" +"За добра производителноÑÑ‚ Ñе препоръчва да компреÑирате базата Ñ Ð´Ð°Ð½Ð½Ð¸ за " +"обектите.\n" +"\n" +"Да Ñе започне ли компреÑирането?" -#: lib/blame.tcl:79 -msgid "Commit:" -msgstr "Подаване:" +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Ðеправилни данни от Git: %s" -#: lib/blame.tcl:280 -msgid "Copy Commit" -msgstr "Копиране на подаване" +#: lib/diff.tcl:77 +#, 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/blame.tcl:284 -msgid "Find Text..." -msgstr "ТърÑене на текÑт…" +#: lib/diff.tcl:117 +#, tcl-format +msgid "Loading diff of %s..." +msgstr "Зареждане на разликите в „%s“…" -#: lib/blame.tcl:288 -msgid "Goto Line..." -msgstr "Към ред…" +#: lib/diff.tcl:143 +msgid "" +"LOCAL: deleted\n" +"REMOTE:\n" +msgstr "" +"ЛОКÐЛÐО: изтрит\n" +"ОТДÐЛЕЧЕÐО:\n" -#: lib/blame.tcl:297 -msgid "Do Full Copy Detection" -msgstr "Пълно Ñ‚ÑŠÑ€Ñене на копиране" +#: lib/diff.tcl:148 +msgid "" +"REMOTE: deleted\n" +"LOCAL:\n" +msgstr "" +"ОТДÐЛЕЧЕÐО: изтрит\n" +"ЛОКÐЛÐО:\n" -#: lib/blame.tcl:301 -msgid "Show History Context" -msgstr "Показване на контекÑта от иÑториÑта" +#: lib/diff.tcl:155 +msgid "LOCAL:\n" +msgstr "ЛОКÐЛÐО:\n" -#: lib/blame.tcl:304 -msgid "Blame Parent Commit" -msgstr "Ðнотиране на родителÑкото подаване" +#: lib/diff.tcl:158 +msgid "REMOTE:\n" +msgstr "ОТДÐЛЕЧЕÐО:\n" -#: lib/blame.tcl:466 +#: lib/diff.tcl:220 lib/diff.tcl:357 #, tcl-format -msgid "Reading %s..." -msgstr "Чете Ñе „%s“…" +msgid "Unable to display %s" +msgstr "Файлът „%s“ не може да бъде показан" -#: lib/blame.tcl:594 -msgid "Loading copy/move tracking annotations..." -msgstr "Зареждане на анотациите за проÑледÑване на копирането/премеÑтването…" +#: lib/diff.tcl:221 +msgid "Error loading file:" +msgstr "Грешка при зареждане на файл:" -#: lib/blame.tcl:614 -msgid "lines annotated" -msgstr "реда анотирани" +#: lib/diff.tcl:227 +msgid "Git Repository (subproject)" +msgstr "Хранилище на Git (подмодул)" -#: lib/blame.tcl:806 -msgid "Loading original location annotations..." -msgstr "Зареждане на анотациите за първоначалното меÑтоположение…" +#: lib/diff.tcl:239 +msgid "* Binary file (not showing content)." +msgstr "◠Двоичен файл (Ñъдържанието не Ñе показва)." -#: lib/blame.tcl:809 -msgid "Annotation complete." -msgstr "Ðнотирането завърши." +#: lib/diff.tcl:244 +#, tcl-format +msgid "" +"* Untracked file is %d bytes.\n" +"* Showing only first %d bytes.\n" +msgstr "" +"â— ÐеÑледениÑÑ‚ файл е %d байта.\n" +"◠Показват Ñе Ñамо първите %d байта.\n" -#: lib/blame.tcl:839 -msgid "Busy" -msgstr "ОперациÑта не е завършила" +#: lib/diff.tcl:250 +#, 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/blame.tcl:840 -msgid "Annotation process is already running." -msgstr "Ð’ момента тече Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° анотиране." +#: lib/diff.tcl:580 +msgid "Failed to unstage selected hunk." +msgstr "Избраното парче не може да бъде извадено от индекÑа." -#: lib/blame.tcl:879 -msgid "Running thorough copy detection..." -msgstr "ИзпълнÑва Ñе цÑлоÑтен Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° откриване на копиране…" +#: lib/diff.tcl:587 +msgid "Failed to stage selected hunk." +msgstr "Избраното парче не може да бъде добавено към индекÑа." -#: lib/blame.tcl:947 -msgid "Loading annotation..." -msgstr "Зареждане на анотации…" +#: lib/diff.tcl:666 +msgid "Failed to unstage selected line." +msgstr "ИзбраниÑÑ‚ ред не може да бъде изваден от индекÑа." -#: lib/blame.tcl:1000 -msgid "Author:" -msgstr "Ðвтор:" +#: lib/diff.tcl:674 +msgid "Failed to stage selected line." +msgstr "ИзбраниÑÑ‚ ред не може да бъде добавен към индекÑа." -#: lib/blame.tcl:1004 -msgid "Committer:" -msgstr "Подал:" +#: lib/encoding.tcl:443 +msgid "Default" +msgstr "Стандартното" -#: lib/blame.tcl:1009 -msgid "Original File:" -msgstr "Първоначален файл:" +#: lib/encoding.tcl:448 +#, tcl-format +msgid "System (%s)" +msgstr "СиÑтемното (%s)" -#: lib/blame.tcl:1057 -msgid "Cannot find HEAD commit:" -msgstr "Подаването за връх „HEAD“ не може да Ñе открие:" +#: lib/encoding.tcl:459 lib/encoding.tcl:465 +msgid "Other" +msgstr "Друго" -#: lib/blame.tcl:1112 -msgid "Cannot find parent commit:" -msgstr "РодителÑкото подаване не може да бъде открито" +#: lib/error.tcl:20 +#, tcl-format +msgid "%s: error" +msgstr "%s: грешка" -#: lib/blame.tcl:1127 -msgid "Unable to display parent" -msgstr "РодителÑÑ‚ не може да бъде показан" +#: lib/error.tcl:36 +#, tcl-format +msgid "%s: warning" +msgstr "%s: предупреждение" -#: lib/blame.tcl:1269 -msgid "Originally By:" -msgstr "Първоначално от:" +#: lib/error.tcl:80 +#, tcl-format +msgid "%s hook failed:" +msgstr "%s: грешка от куката" -#: lib/blame.tcl:1275 -msgid "In File:" -msgstr "Във файл:" +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." +msgstr "Преди да можете да подадете, коригирайте горните грешки." -#: lib/blame.tcl:1280 -msgid "Copied Or Moved Here By:" -msgstr "Копирано или премеÑтено тук от:" +#: lib/error.tcl:116 +#, tcl-format +msgid "%s (%s): error" +msgstr "%s (%s): грешка" #: lib/index.tcl:6 msgid "Unable to unlock the index." @@ -2451,6 +1836,10 @@ msgstr "Продължаване" msgid "Unlock Index" msgstr "Отключване на индекÑа" +#: lib/index.tcl:294 +msgid "Unstaging selected files from commit" +msgstr "Изваждане на избраните файлове от подаването" + #: lib/index.tcl:298 #, tcl-format msgid "Unstaging %s from commit" @@ -2460,6 +1849,10 @@ msgstr "Изваждане на „%s“ от подаването" msgid "Ready to commit." msgstr "ГотовноÑÑ‚ за подаване." +#: lib/index.tcl:346 +msgid "Adding selected files" +msgstr "ДобавÑне на избраните файлове" + #: lib/index.tcl:350 #, tcl-format msgid "Adding %s" @@ -2468,7 +1861,11 @@ msgstr "ДобавÑне на „%s“" #: lib/index.tcl:380 #, tcl-format msgid "Stage %d untracked files?" -msgstr "Да Ñе вкарат ли %d неÑледени файла в индекÑа?" +msgstr "Да Ñе добавÑÑ‚ ли %d неÑледени файла към индекÑа?" + +#: lib/index.tcl:388 +msgid "Adding all changed files" +msgstr "ДобавÑне на вÑички променени файлове" #: lib/index.tcl:428 #, tcl-format @@ -2499,75 +1896,13 @@ msgstr "Махане на промените в избраните файловРmsgid "Reverting %s" msgstr "Махане на промените в „%s“" -#: 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" -"За добра производителноÑÑ‚ Ñе препоръчва да компреÑирате базата Ñ Ð´Ð°Ð½Ð½Ð¸ за " -"обектите.\n" -"\n" -"Да Ñе започне ли компреÑирането?" - -#: lib/error.tcl:20 lib/error.tcl:116 -msgid "error" -msgstr "грешка" - -#: lib/error.tcl:36 -msgid "warning" -msgstr "предупреждение" +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "Към ред:" -#: lib/error.tcl:96 -msgid "You must correct the above errors before committing." -msgstr "Преди да можете да подадете, коригирайте горните грешки." +#: lib/line.tcl:23 +msgid "Go" +msgstr "Придвижване" #: lib/merge.tcl:13 msgid "" @@ -2637,29 +1972,34 @@ msgstr "" msgid "%s of %s" msgstr "%s от общо %s" -#: lib/merge.tcl:122 +#: lib/merge.tcl:126 #, tcl-format msgid "Merging %s and %s..." msgstr "Сливане на „%s“ и „%s“…" -#: lib/merge.tcl:133 +#: lib/merge.tcl:137 msgid "Merge completed successfully." msgstr "Сливането завърши уÑпешно." -#: lib/merge.tcl:135 +#: lib/merge.tcl:139 msgid "Merge failed. Conflict resolution is required." msgstr "ÐеуÑпешно Ñливане — има конфликти за коригиране." -#: lib/merge.tcl:160 +#: lib/merge.tcl:156 +#, tcl-format +msgid "%s (%s): Merge" +msgstr "%s (%s): Сливане" + +#: lib/merge.tcl:164 #, tcl-format msgid "Merge Into %s" msgstr "Сливане в „%s“" -#: lib/merge.tcl:179 +#: lib/merge.tcl:183 msgid "Revision To Merge" msgstr "ВерÑÐ¸Ñ Ð·Ð° Ñливане" -#: lib/merge.tcl:214 +#: lib/merge.tcl:218 msgid "" "Cannot abort while amending.\n" "\n" @@ -2669,7 +2009,7 @@ msgstr "" "\n" "ТрÑбва да завършите поправката на това подаване.\n" -#: lib/merge.tcl:224 +#: lib/merge.tcl:228 msgid "" "Abort merge?\n" "\n" @@ -2683,7 +2023,7 @@ msgstr "" "\n" "ÐаиÑтина ли да Ñе преуÑтанови Ñливането?" -#: lib/merge.tcl:230 +#: lib/merge.tcl:234 msgid "" "Reset changes?\n" "\n" @@ -2697,18 +2037,771 @@ msgstr "" "\n" "ÐаиÑтина ли да Ñе занулÑÑ‚ промените?" -#: lib/merge.tcl:241 +#: lib/merge.tcl:245 msgid "Aborting" msgstr "ПреуÑтановÑване" -#: lib/merge.tcl:241 +#: lib/merge.tcl:245 msgid "files reset" msgstr "файла ÑÑŠÑ Ð·Ð°Ð½ÑƒÐ»ÐµÐ½Ð¸ промени" -#: lib/merge.tcl:269 +#: lib/merge.tcl:273 msgid "Abort failed." msgstr "ÐеуÑпешно преуÑтановÑване." -#: lib/merge.tcl:271 +#: lib/merge.tcl:275 msgid "Abort completed. Ready." 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/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:164 +msgid "Tab spacing" +msgstr "Ширина на табулациÑта" + +#: lib/option.tcl:210 +msgid "Change" +msgstr "СмÑна" + +#: lib/option.tcl:254 +msgid "Spelling Dictionary:" +msgstr "ПравопиÑен речник:" + +#: lib/option.tcl:284 +msgid "Change Font" +msgstr "СмÑна на шрифта" + +#: lib/option.tcl:288 +#, tcl-format +msgid "Choose %s" +msgstr "Избор на „%s“" + +#: lib/option.tcl:294 +msgid "pt." +msgstr "тчк." + +#: lib/option.tcl:308 +msgid "Preferences" +msgstr "ÐаÑтройки" + +#: lib/option.tcl:345 +msgid "Failed to completely save options:" +msgstr "ÐеуÑпешно запазване на наÑтройките:" + +#: 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/remote.tcl:253 lib/remote.tcl:258 +msgid "All" +msgstr "Ð’Ñички" + +#: lib/remote_add.tcl:20 +#, tcl-format +msgid "%s (%s): Add Remote" +msgstr "%s (%s): ДобавÑне на отдалечено хранилище" + +#: 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:39 +msgid "Remote Details" +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/remote_branch_delete.tcl:29 +#, tcl-format +msgid "%s (%s): Delete Branch Remotely" +msgstr "%s (%s): Изтриване на Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½" + +#: 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:51 lib/transport.tcl:165 +msgid "Remote:" +msgstr "Отдалечено хранилище:" + +#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187 +msgid "Arbitrary Location:" +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: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: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/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:8 lib/shortcut.tcl:43 lib/shortcut.tcl:75 +#, tcl-format +msgid "%s (%s): Create Desktop Icon" +msgstr "%s (%s): ДобавÑне на икона на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚" + +#: lib/shortcut.tcl:24 lib/shortcut.tcl:65 +msgid "Cannot write shortcut:" +msgstr "Клавишната ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена:" + +#: lib/shortcut.tcl:140 +msgid "Cannot write icon:" +msgstr "Иконата не може да бъде запазена:" + +#: 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/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: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/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s… %*i от общо %*i %s (%3i%%)" + +#: lib/tools.tcl:76 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "За изпълнението на „%s“ Ñ‚Ñ€Ñбва да изберете файл." + +#: lib/tools.tcl:92 +#, tcl-format +msgid "Are you sure you want to run %1$s on file \"%2$s\"?" +msgstr "Сигурни ли Ñте, че иÑкате да изпълните „%1$s“ върху файла „%2$s“?" + +#: lib/tools.tcl:96 +#, tcl-format +msgid "Are you sure you want to run %s?" +msgstr "Сигурни ли Ñте, че иÑкате да изпълните „%s“?" + +#: lib/tools.tcl:118 +#, tcl-format +msgid "Tool: %s" +msgstr "Команда: %s" + +#: lib/tools.tcl:119 +#, tcl-format +msgid "Running: %s" +msgstr "Изпълнение: %s" + +#: lib/tools.tcl:158 +#, tcl-format +msgid "Tool completed successfully: %s" +msgstr "Командата завърши уÑпешно: %s" + +#: lib/tools.tcl:160 +#, tcl-format +msgid "Tool failed: %s" +msgstr "Командата върна грешка: %s" + +#: lib/tools_dlg.tcl:22 +#, tcl-format +msgid "%s (%s): Add Tool" +msgstr "%s (%s): ДобавÑне на команда" + +#: 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 +#, tcl-format +msgid "%s (%s): Remove Tool" +msgstr "%s (%s): Премахване на команда" + +#: 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:283 +#, tcl-format +msgid "%s (%s):" +msgstr "%s (%s):" + +#: 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:341 +msgid "OK" +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: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/transport.tcl:229 +#, tcl-format +msgid "%s (%s): Push" +msgstr "%s (%s): ИзтлаÑкване" diff --git a/git-gui/po/ru.po b/git-gui/po/ru.po index ca4343b40c..9f5305c43e 100644 --- a/git-gui/po/ru.po +++ b/git-gui/po/ru.po @@ -1,19 +1,22 @@ # Translation of git-gui to russian # Copyright (C) 2007 Shawn Pearce # This file is distributed under the same license as the git-gui package. -# Irina Riesen <irina.riesen@gmail.com>, 2007. -# +# Translators: +# Dimitriy Ryazantcev <DJm00n@mail.ru>, 2015-2016 +# Irina Riesen <irina.riesen@gmail.com>, 2007 msgid "" msgstr "" -"Project-Id-Version: git-gui\n" +"Project-Id-Version: Git Russian Localization Project\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-26 15:47-0800\n" -"PO-Revision-Date: 2007-10-22 22:30-0200\n" -"Last-Translator: Alex Riesen <raa.lkml@gmail.com>\n" -"Language-Team: Russian Translation <git@vger.kernel.org>\n" +"PO-Revision-Date: 2016-06-30 12:39+0000\n" +"Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n" +"Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903 #: git-gui.sh:922 @@ -51,14 +54,7 @@ msgid "" "%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" +msgstr "Ðевозможно определить верÑию Git\n\n%s указывает на верÑию «%s».\n\nÐ´Ð»Ñ %s требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Git, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1.5.0\n\nПредположить, что «%s» и еÑÑ‚ÑŒ верÑÐ¸Ñ 1.5.0?\n" #: git-gui.sh:1128 msgid "Git directory not found:" @@ -78,20 +74,19 @@ msgstr "ОтÑутÑтвует рабочий каталог" #: git-gui.sh:1334 lib/checkout_op.tcl:306 msgid "Refreshing file status..." -msgstr "Обновление информации о ÑоÑтоÑнии файлов..." +msgstr "Обновление информации о ÑоÑтоÑнии файлов…" #: git-gui.sh:1390 msgid "Scanning for modified files ..." -msgstr "ПоиÑк измененных файлов..." +msgstr "ПоиÑк измененных файлов…" #: git-gui.sh:1454 msgid "Calling prepare-commit-msg hook..." -msgstr "Вызов программы поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ prepare-commit-msg..." +msgstr "Вызов перехватчика prepare-commit-msg…" #: git-gui.sh:1471 msgid "Commit declined by prepare-commit-msg hook." -msgstr "" -"Сохранение прервано программой поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ prepare-commit-msg" +msgstr "Коммит прерван перехватчиком prepare-commit-msg." #: git-gui.sh:1629 lib/browser.tcl:246 msgid "Ready." @@ -108,31 +103,31 @@ msgstr "Ðе изменено" #: git-gui.sh:1915 msgid "Modified, not staged" -msgstr "Изменено, не подготовлено" +msgstr "Изменено, не в индекÑе" #: git-gui.sh:1916 git-gui.sh:1924 msgid "Staged for commit" -msgstr "Подготовлено Ð´Ð»Ñ ÑохранениÑ" +msgstr "Ð’ индекÑе Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°" #: git-gui.sh:1917 git-gui.sh:1925 msgid "Portions staged for commit" -msgstr "ЧаÑти, подготовленные Ð´Ð»Ñ ÑохранениÑ" +msgstr "ЧаÑти, в индекÑе Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°" #: git-gui.sh:1918 git-gui.sh:1926 msgid "Staged for commit, missing" -msgstr "Подготовлено Ð´Ð»Ñ ÑохранениÑ, отÑутÑтвует" +msgstr "Ð’ индекÑе Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°, отÑутÑтвует" #: git-gui.sh:1920 msgid "File type changed, not staged" -msgstr "Тип файла изменён, не подготовлено" +msgstr "Тип файла изменён, не в индекÑе" #: git-gui.sh:1921 msgid "File type changed, staged" -msgstr "Тип файла изменён, подготовлено" +msgstr "Тип файла изменён, в индекÑе" #: git-gui.sh:1923 msgid "Untracked, not staged" -msgstr "Ðе отÑлеживаетÑÑ, не подготовлено" +msgstr "Ðе отÑлеживаетÑÑ, не в индекÑе" #: git-gui.sh:1928 msgid "Missing" @@ -140,11 +135,11 @@ msgstr "ОтÑутÑтвует" #: git-gui.sh:1929 msgid "Staged for removal" -msgstr "Подготовлено Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ" +msgstr "Ð’ индекÑе Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ" #: git-gui.sh:1930 msgid "Staged for removal, still present" -msgstr "Подготовлено Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ, еще не удалено" +msgstr "Ð’ индекÑе Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ, еще не удалено" #: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935 #: git-gui.sh:1936 git-gui.sh:1937 @@ -153,7 +148,7 @@ msgstr "ТребуетÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ конфликта при Ñли #: git-gui.sh:1972 msgid "Starting gitk... please wait..." -msgstr "ЗапуÑкаетÑÑ gitk... Подождите, пожалуйÑта..." +msgstr "ЗапуÑкаетÑÑ gitk… Подождите, пожалуйÑта…" #: git-gui.sh:1984 msgid "Couldn't find gitk in PATH" @@ -173,11 +168,11 @@ msgstr "Редактировать" #: git-gui.sh:2458 lib/choose_rev.tcl:561 msgid "Branch" -msgstr "Ветвь" +msgstr "Ветка" #: git-gui.sh:2461 lib/choose_rev.tcl:548 msgid "Commit@@noun" -msgstr "СоÑтоÑние" +msgstr "Коммит" #: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 msgid "Merge" @@ -197,29 +192,29 @@ msgstr "ПроÑмотр рабочего каталога" #: git-gui.sh:2483 msgid "Browse Current Branch's Files" -msgstr "ПроÑмотреть файлы текущей ветви" +msgstr "ПроÑмотреть файлы текущей ветки" #: git-gui.sh:2487 msgid "Browse Branch Files..." -msgstr "Показать файлы ветви..." +msgstr "Показать файлы ветки…" #: git-gui.sh:2492 msgid "Visualize Current Branch's History" -msgstr "Показать иÑторию текущей ветви" +msgstr "Показать иÑторию текущей ветки" #: git-gui.sh:2496 msgid "Visualize All Branch History" -msgstr "Показать иÑторию вÑех ветвей" +msgstr "Показать иÑторию вÑех веток" #: git-gui.sh:2503 #, tcl-format msgid "Browse %s's Files" -msgstr "Показать файлы ветви %s" +msgstr "Показать файлы ветки %s" #: git-gui.sh:2505 #, tcl-format msgid "Visualize %s's History" -msgstr "Показать иÑторию ветви %s" +msgstr "Показать иÑторию ветки %s" #: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67 msgid "Database Statistics" @@ -274,23 +269,23 @@ msgstr "Выделить вÑе" #: git-gui.sh:2576 msgid "Create..." -msgstr "Создать..." +msgstr "Создать…" #: git-gui.sh:2582 msgid "Checkout..." -msgstr "Перейти..." +msgstr "Перейти…" #: git-gui.sh:2588 msgid "Rename..." -msgstr "Переименовать..." +msgstr "Переименовать…" #: git-gui.sh:2593 msgid "Delete..." -msgstr "Удалить..." +msgstr "Удалить…" #: git-gui.sh:2598 msgid "Reset..." -msgstr "СброÑить..." +msgstr "СброÑить…" #: git-gui.sh:2608 msgid "Done" @@ -298,15 +293,15 @@ msgstr "Завершено" #: git-gui.sh:2610 msgid "Commit@@verb" -msgstr "Сохранить" +msgstr "Закоммитить" #: git-gui.sh:2619 git-gui.sh:3050 msgid "New Commit" -msgstr "Ðовое ÑоÑтоÑние" +msgstr "Ðовый коммит" #: git-gui.sh:2627 git-gui.sh:3057 msgid "Amend Last Commit" -msgstr "ИÑправить поÑледнее ÑоÑтоÑние" +msgstr "ИÑправить поÑледний коммит" #: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99 msgid "Rescan" @@ -314,19 +309,19 @@ msgstr "Перечитать" #: git-gui.sh:2643 msgid "Stage To Commit" -msgstr "Подготовить Ð´Ð»Ñ ÑохранениÑ" +msgstr "Добавить в индекÑ" #: git-gui.sh:2649 msgid "Stage Changed Files To Commit" -msgstr "Подготовить измененные файлы Ð´Ð»Ñ ÑохранениÑ" +msgstr "Добавить изменённые файлы в индекÑ" #: git-gui.sh:2655 msgid "Unstage From Commit" -msgstr "Убрать из подготовленного" +msgstr "Убрать из издекÑа" #: git-gui.sh:2661 lib/index.tcl:412 msgid "Revert Changes" -msgstr "Отменить изменениÑ" +msgstr "Обратить изменениÑ" #: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341 msgid "Show Less Context" @@ -342,31 +337,31 @@ msgstr "Ð’Ñтавить Signed-off-by" #: git-gui.sh:2696 msgid "Local Merge..." -msgstr "Локальное ÑлиÑние..." +msgstr "Локальное ÑлиÑние…" #: git-gui.sh:2701 msgid "Abort Merge..." -msgstr "Прервать ÑлиÑние..." +msgstr "Прервать ÑлиÑние…" #: git-gui.sh:2713 git-gui.sh:2741 msgid "Add..." -msgstr "Добавить..." +msgstr "Добавить…" #: git-gui.sh:2717 msgid "Push..." -msgstr "Отправить..." +msgstr "Отправить…" #: git-gui.sh:2721 msgid "Delete Branch..." -msgstr "Удалить ветвь..." +msgstr "Удалить ветку…" #: git-gui.sh:2731 git-gui.sh:3292 msgid "Options..." -msgstr "ÐаÑтройки..." +msgstr "ÐаÑтройки…" #: git-gui.sh:2742 msgid "Remove..." -msgstr "Удалить..." +msgstr "Удалить…" #: git-gui.sh:2751 lib/choose_repository.tcl:50 msgid "Help" @@ -393,11 +388,11 @@ msgstr "критичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: %s: нет такого файла #: git-gui.sh:2926 msgid "Current Branch:" -msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ:" +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ‚ÐºÐ°:" #: git-gui.sh:2947 msgid "Staged Changes (Will Commit)" -msgstr "Подготовлено (будет Ñохранено)" +msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² индекÑе (будут закоммичены)" #: git-gui.sh:2967 msgid "Unstaged Changes" @@ -405,7 +400,7 @@ msgstr "Изменено (не будет Ñохранено)" #: git-gui.sh:3017 msgid "Stage Changed" -msgstr "Подготовить вÑе" +msgstr "ИндекÑировать вÑÑ‘" #: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193 msgid "Push" @@ -413,27 +408,27 @@ msgstr "Отправить" #: git-gui.sh:3071 msgid "Initial Commit Message:" -msgstr "Комментарий к первому ÑоÑтоÑнию:" +msgstr "Сообщение первого коммита:" #: git-gui.sh:3072 msgid "Amended Commit Message:" -msgstr "Комментарий к иÑправленному ÑоÑтоÑнию:" +msgstr "Сообщение иÑправленного коммита:" #: git-gui.sh:3073 msgid "Amended Initial Commit Message:" -msgstr "Комментарий к иÑправленному первоначальному ÑоÑтоÑнию:" +msgstr "Сообщение иÑправленного первого коммита:" #: git-gui.sh:3074 msgid "Amended Merge Commit Message:" -msgstr "Комментарий к иÑправленному ÑлиÑнию:" +msgstr "Сообщение иÑправленного ÑлиÑниÑ:" #: git-gui.sh:3075 msgid "Merge Commit Message:" -msgstr "Комментарий к ÑлиÑнию:" +msgstr "Сообщение ÑлиÑниÑ:" #: git-gui.sh:3076 msgid "Commit Message:" -msgstr "Комментарий к ÑоÑтоÑнию:" +msgstr "Сообщение коммита:" #: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73 msgid "Copy All" @@ -481,51 +476,51 @@ msgstr "ВзÑÑ‚ÑŒ локальную верÑию" #: git-gui.sh:3336 msgid "Revert To Base" -msgstr "Отменить изменениÑ" +msgstr "Обратить изменениÑ" #: git-gui.sh:3354 msgid "Visualize These Changes In The Submodule" -msgstr "" +msgstr "Показать Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¼Ð¾Ð´ÑƒÐ»Ñ" #: git-gui.sh:3358 msgid "Visualize Current Branch History In The Submodule" -msgstr "Показать иÑторию текущей ветви подмодулÑ" +msgstr "Показать иÑторию текущей ветки подмодулÑ" #: git-gui.sh:3362 msgid "Visualize All Branch History In The Submodule" -msgstr "Показать иÑторию вÑех ветвей подмодулÑ" +msgstr "Показать иÑторию вÑех веток подмодулÑ" #: git-gui.sh:3367 msgid "Start git gui In The Submodule" -msgstr "" +msgstr "ЗапуÑтить git gui в подмодуле" #: git-gui.sh:3389 msgid "Unstage Hunk From Commit" -msgstr "Ðе ÑохранÑÑ‚ÑŒ чаÑÑ‚ÑŒ" +msgstr "Убрать блок из индекÑа" #: git-gui.sh:3391 msgid "Unstage Lines From Commit" -msgstr "Убрать Ñтроки из подготовленного" +msgstr "Убрать Ñтроки из индекÑа" #: git-gui.sh:3393 msgid "Unstage Line From Commit" -msgstr "Убрать Ñтроку из подготовленного" +msgstr "Убрать Ñтроку из индекÑа" #: git-gui.sh:3396 msgid "Stage Hunk For Commit" -msgstr "Подготовить чаÑÑ‚ÑŒ Ð´Ð»Ñ ÑохранениÑ" +msgstr "Добавить блок в индекÑ" #: git-gui.sh:3398 msgid "Stage Lines For Commit" -msgstr "Подготовить Ñтроки Ð´Ð»Ñ ÑохранениÑ" +msgstr "Добавить Ñтроки в индекÑ" #: git-gui.sh:3400 msgid "Stage Line For Commit" -msgstr "Подготовить Ñтроку Ð´Ð»Ñ ÑохранениÑ" +msgstr "Добавить Ñтроку в индекÑ" #: git-gui.sh:3424 msgid "Initializing..." -msgstr "ИнициализациÑ..." +msgstr "ИнициализациÑ…" #: git-gui.sh:3541 #, tcl-format @@ -536,23 +531,14 @@ msgid "" "going to be ignored by any Git subprocess run\n" "by %s:\n" "\n" -msgstr "" -"Возможны ошибки в переменных окружениÑ.\n" -"\n" -"Переменные окружениÑ, которые возможно\n" -"будут проигнорированы командами Git,\n" -"запущенными из %s\n" -"\n" +msgstr "Возможны ошибки в переменных окружениÑ.\n\nПеременные окружениÑ, которые возможно\nбудут проигнорированы командами Git,\nзапущенными из %s\n\n" #: git-gui.sh:3570 msgid "" "\n" "This is due to a known issue with the\n" "Tcl binary distributed by Cygwin." -msgstr "" -"\n" -"Ðто извеÑÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° Ñ Tcl,\n" -"раÑпроÑтранÑемым Cygwin." +msgstr "\nÐто извеÑÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° Ñ Tcl,\nраÑпроÑтранÑемым Cygwin." #: git-gui.sh:3575 #, tcl-format @@ -563,13 +549,7 @@ msgid "" "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 в Вашем перÑональном\n" -"файле ~/.gitconfig.\n" +msgstr "\n\nВмеÑто иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ %s можно\nÑохранить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ user.name и\nuser.email в Вашем перÑональном\nфайле ~/.gitconfig.\n" #: lib/about.tcl:26 msgid "git-gui - a graphical user interface for Git." @@ -581,15 +561,15 @@ msgstr "ПроÑмотр файла" #: lib/blame.tcl:78 msgid "Commit:" -msgstr "Сохраненное ÑоÑтоÑние:" +msgstr "Коммит:" #: lib/blame.tcl:271 msgid "Copy Commit" -msgstr "Скопировать SHA-1" +msgstr "Копировать SHA-1" #: lib/blame.tcl:275 msgid "Find Text..." -msgstr "Ðайти текÑÑ‚..." +msgstr "Ðайти текÑт…" #: lib/blame.tcl:284 msgid "Do Full Copy Detection" @@ -601,16 +581,16 @@ msgstr "Показать иÑторичеÑкий контекÑÑ‚" #: lib/blame.tcl:291 msgid "Blame Parent Commit" -msgstr "РаÑÑмотреть ÑоÑтоÑние предка" +msgstr "Ðвторы родительÑкого коммита" #: lib/blame.tcl:450 #, tcl-format msgid "Reading %s..." -msgstr "Чтение %s..." +msgstr "Чтение %s…" #: lib/blame.tcl:557 msgid "Loading copy/move tracking annotations..." -msgstr "Загрузка аннотации копирований/переименований..." +msgstr "Загрузка аннотации копирований/переименований…" #: lib/blame.tcl:577 msgid "lines annotated" @@ -618,7 +598,7 @@ msgstr "Ñтрок прокомментировано" #: lib/blame.tcl:769 msgid "Loading original location annotations..." -msgstr "Загрузка аннотаций первоначального Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°..." +msgstr "Загрузка аннотаций первоначального Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°â€¦" #: lib/blame.tcl:772 msgid "Annotation complete." @@ -634,11 +614,11 @@ msgstr "ÐÐ½Ð½Ð¾Ñ‚Ð°Ñ†Ð¸Ñ ÑƒÐ¶Ðµ запущена" #: lib/blame.tcl:842 msgid "Running thorough copy detection..." -msgstr "Выполнение полного поиÑка копий..." +msgstr "Выполнение полного поиÑка копий…" #: lib/blame.tcl:910 msgid "Loading annotation..." -msgstr "Загрузка аннотации..." +msgstr "Загрузка аннотации…" #: lib/blame.tcl:963 msgid "Author:" @@ -646,7 +626,7 @@ msgstr "Ðвтор:" #: lib/blame.tcl:967 msgid "Committer:" -msgstr "Сохранил:" +msgstr "Коммитер:" #: lib/blame.tcl:972 msgid "Original File:" @@ -654,11 +634,11 @@ msgstr "ИÑходный файл:" #: lib/blame.tcl:1020 msgid "Cannot find HEAD commit:" -msgstr "Ðевозможно найти текущее ÑоÑтоÑние:" +msgstr "Ðе удалоÑÑŒ найти текущее ÑоÑтоÑние:" #: lib/blame.tcl:1075 msgid "Cannot find parent commit:" -msgstr "Ðевозможно найти ÑоÑтоÑние предка:" +msgstr "Ðе удалоÑÑŒ найти родительÑкое ÑоÑтоÑние:" #: lib/blame.tcl:1090 msgid "Unable to display parent" @@ -682,7 +662,7 @@ msgstr "Скопировано/перемещено в:" #: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 msgid "Checkout Branch" -msgstr "Перейти на ветвь" +msgstr "Перейти на ветку" #: lib/branch_checkout.tcl:23 msgid "Checkout" @@ -707,19 +687,19 @@ msgstr "ÐаÑтройки" #: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 msgid "Fetch Tracking Branch" -msgstr "Получить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· внешней ветви" +msgstr "Извлечь Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· внешней ветки" #: lib/branch_checkout.tcl:44 msgid "Detach From Local Branch" -msgstr "ОтÑоединить от локальной ветви" +msgstr "ОтÑоединить от локальной ветки" #: lib/branch_create.tcl:22 msgid "Create Branch" -msgstr "Создание ветви" +msgstr "Создать ветку" #: lib/branch_create.tcl:27 msgid "Create New Branch" -msgstr "Создать новую ветвь" +msgstr "Создать новую ветку" #: lib/branch_create.tcl:31 lib/choose_repository.tcl:381 msgid "Create" @@ -727,7 +707,7 @@ msgstr "Создать" #: lib/branch_create.tcl:40 msgid "Branch Name" -msgstr "Ðазвание ветви" +msgstr "Ð˜Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸" #: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50 msgid "Name:" @@ -735,7 +715,7 @@ msgstr "Ðазвание:" #: lib/branch_create.tcl:58 msgid "Match Tracking Branch Name" -msgstr "ВзÑÑ‚ÑŒ из имен ветвей ÑлежениÑ" +msgstr "СоответÑтвовать имени отÑлеживаемой ветки" #: lib/branch_create.tcl:66 msgid "Starting Revision" @@ -743,7 +723,7 @@ msgstr "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ" #: lib/branch_create.tcl:72 msgid "Update Existing Branch:" -msgstr "Обновить имеющуюÑÑ Ð²ÐµÑ‚Ð²ÑŒ:" +msgstr "Обновить имеющуюÑÑ Ð²ÐµÑ‚ÐºÑƒ:" #: lib/branch_create.tcl:75 msgid "No" @@ -763,33 +743,33 @@ msgstr "ПоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñделать текущей" #: lib/branch_create.tcl:131 msgid "Please select a tracking branch." -msgstr "Укажите ветвь ÑлежениÑ." +msgstr "Укажите отлеживаемую ветку." #: lib/branch_create.tcl:140 #, tcl-format msgid "Tracking branch %s is not a branch in the remote repository." -msgstr "Ветвь ÑÐ»ÐµÐ¶ÐµÐ½Ð¸Ñ %s не ÑвлÑетÑÑ Ð²ÐµÑ‚Ð²ÑŒÑŽ во внешнем репозитории." +msgstr "ОтÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ‚ÐºÐ° %s не ÑвлÑетÑÑ Ð²ÐµÑ‚ÐºÐ¾Ð¹ на внешнем репозитории." #: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 msgid "Please supply a branch name." -msgstr "Укажите название ветви." +msgstr "Укажите Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸." #: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 #, tcl-format msgid "'%s' is not an acceptable branch name." -msgstr "ÐедопуÑтимое название ветви '%s'." +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ «%s»." #: lib/branch_delete.tcl:15 msgid "Delete Branch" -msgstr "Удаление ветви" +msgstr "Удаление ветки" #: lib/branch_delete.tcl:20 msgid "Delete Local Branch" -msgstr "Удалить локальную ветвь" +msgstr "Удалить локальную ветку" #: lib/branch_delete.tcl:37 msgid "Local Branches" -msgstr "Локальные ветви" +msgstr "Локальные ветки" #: lib/branch_delete.tcl:52 msgid "Delete Only If Merged Into" @@ -802,30 +782,25 @@ msgstr "Ð’Ñегда (не выполнÑÑ‚ÑŒ проверку на ÑлиÑни #: lib/branch_delete.tcl:103 #, tcl-format msgid "The following branches are not completely merged into %s:" -msgstr "Ветви, которые не полноÑтью ÑливаютÑÑ Ñ %s:" +msgstr "Ветки, которые не полноÑтью ÑливаютÑÑ Ñ %s:" #: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217 msgid "" "Recovering deleted branches is difficult.\n" "\n" "Delete the selected branches?" -msgstr "" -"ВоÑÑтановить удаленные ветви Ñложно.\n" -"\n" -"Продолжить?" +msgstr "ВоÑÑтановить удаленные ветки Ñложно.\n\nПродолжить?" #: lib/branch_delete.tcl:141 #, tcl-format msgid "" "Failed to delete branches:\n" "%s" -msgstr "" -"Ðе удалоÑÑŒ удалить ветви:\n" -"%s" +msgstr "Ðе удалоÑÑŒ удалить ветки:\n%s" #: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 msgid "Rename Branch" -msgstr "Переименование ветви" +msgstr "Переименование ветки" #: lib/branch_rename.tcl:26 msgid "Rename" @@ -833,7 +808,7 @@ msgstr "Переименовать" #: lib/branch_rename.tcl:36 msgid "Branch:" -msgstr "Ветвь:" +msgstr "Ветка:" #: lib/branch_rename.tcl:39 msgid "New Name:" @@ -841,21 +816,21 @@ msgstr "Ðовое название:" #: lib/branch_rename.tcl:75 msgid "Please select a branch to rename." -msgstr "Укажите ветвь Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ." +msgstr "Укажите ветку Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ." #: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202 #, tcl-format msgid "Branch '%s' already exists." -msgstr "Ветвь '%s' уже ÑущеÑтвует." +msgstr "Ветка «%s» уже ÑущеÑтвует." #: lib/branch_rename.tcl:117 #, tcl-format msgid "Failed to rename '%s'." -msgstr "Ðе удалоÑÑŒ переименовать '%s'. " +msgstr "Ðе удалоÑÑŒ переименовать «%s». " #: lib/browser.tcl:17 msgid "Starting..." -msgstr "ЗапуÑк..." +msgstr "ЗапуÑк…" #: lib/browser.tcl:26 msgid "File Browser" @@ -864,7 +839,7 @@ msgstr "ПроÑмотр ÑпиÑка файлов" #: lib/browser.tcl:126 lib/browser.tcl:143 #, tcl-format msgid "Loading %s..." -msgstr "Загрузка %s..." +msgstr "Загрузка %s…" #: lib/browser.tcl:187 msgid "[Up To Parent]" @@ -872,7 +847,7 @@ msgstr "[Ðа уровень выше]" #: lib/browser.tcl:267 lib/browser.tcl:273 msgid "Browse Branch Files" -msgstr "Показать файлы ветви" +msgstr "Показать файлы ветки" #: lib/browser.tcl:278 lib/choose_repository.tcl:398 #: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497 @@ -883,7 +858,7 @@ msgstr "Показать" #: lib/checkout_op.tcl:85 #, tcl-format msgid "Fetching %s from %s" -msgstr "Получение %s из %s " +msgstr "Извлечение %s из %s " #: lib/checkout_op.tcl:133 #, tcl-format @@ -898,12 +873,12 @@ msgstr "Закрыть" #: lib/checkout_op.tcl:175 #, tcl-format msgid "Branch '%s' does not exist." -msgstr "Ветвь '%s' не ÑущеÑтвует " +msgstr "Ветка «%s» не ÑущеÑтвует." #: lib/checkout_op.tcl:194 #, tcl-format msgid "Failed to configure simplified git-pull for '%s'." -msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰Ñ‘Ð½Ð½Ð¾Ð¹ конфигурации git pull Ð´Ð»Ñ '%s'." +msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰Ñ‘Ð½Ð½Ð¾Ð¹ конфигурации git pull Ð´Ð»Ñ Â«%s»." #: lib/checkout_op.tcl:229 #, tcl-format @@ -912,21 +887,17 @@ msgid "" "\n" "It cannot fast-forward to %s.\n" "A merge is required." -msgstr "" -"Ветвь '%s' уже ÑущеÑтвует.\n" -"\n" -"Она не может быть прокручена(fast-forward) к %s.\n" -"ТребуетÑÑ ÑлиÑние." +msgstr "Ветка «%s» уже ÑущеÑтвует.\n\nОна не может быть перемотана вперед к %s.\nТребуетÑÑ ÑлиÑние." #: lib/checkout_op.tcl:243 #, tcl-format msgid "Merge strategy '%s' not supported." -msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑлиÑниÑ: '%s'." +msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑлиÑÐ½Ð¸Ñ Â«%s»." #: lib/checkout_op.tcl:262 #, tcl-format msgid "Failed to update '%s'." -msgstr "Ðе удалоÑÑŒ обновить '%s'." +msgstr "Ðе удалоÑÑŒ обновить «%s»." #: lib/checkout_op.tcl:274 msgid "Staging area (index) is already locked." @@ -936,22 +907,15 @@ msgstr "Ð Ð°Ð±Ð¾Ñ‡Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ заблокирована другим п 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" +"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" +msgstr "ПоÑледнее прочитанное ÑоÑтоÑние Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑоответÑтвует текущему.\n\nС момента поÑледней проверки репозиторий был изменен другой программой Git. Ðеобходимо перечитать репозиторий, прежде чем Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ‚ÐºÐ° может быть изменена.\n\nÐто будет Ñделано ÑÐµÐ¹Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n" #: lib/checkout_op.tcl:345 #, tcl-format msgid "Updating working directory to '%s'..." -msgstr "Обновление рабочего каталога из '%s'..." +msgstr "Обновление рабочего каталога из «%s»…" #: lib/checkout_op.tcl:346 msgid "files checked out" @@ -960,7 +924,7 @@ msgstr "файлы извлечены" #: lib/checkout_op.tcl:376 #, tcl-format msgid "Aborted checkout of '%s' (file level merging is required)." -msgstr "Прерван переход на '%s' (требуетÑÑ ÑлиÑние ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²)" +msgstr "Прерван переход на «%s» (требуетÑÑ ÑлиÑние Ñодержимого файлов)" #: lib/checkout_op.tcl:377 msgid "File level merge required." @@ -969,38 +933,33 @@ msgstr "ТребуетÑÑ ÑлиÑние ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²." #: lib/checkout_op.tcl:381 #, tcl-format msgid "Staying on branch '%s'." -msgstr "Ветвь '%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" -"ЕÑли вы хотите Ñнова вернутьÑÑ Ðº какой-нибудь ветви, Ñоздайте ее ÑейчаÑ, " -"Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 'Текущего отÑоединенного ÑоÑтоÑниÑ'." +"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' Ñделана текущей." +msgstr "Выполнен переход на «%s»." #: lib/checkout_op.tcl:535 #, tcl-format msgid "Resetting '%s' to '%s' will lose the following commits:" -msgstr "Ð¡Ð±Ñ€Ð¾Ñ '%s' в '%s' приведет к потере Ñледующих Ñохраненных ÑоÑтоÑний: " +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Â«%s» на «%s» приведет к потере Ñледующих коммитов:" #: lib/checkout_op.tcl:557 msgid "Recovering lost commits may not be easy." -msgstr "ВоÑÑтановить потерÑнные Ñохраненные ÑоÑтоÑÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ Ñложно." +msgstr "ВоÑÑтановить потерÑнные коммиты будет Ñложно." #: lib/checkout_op.tcl:562 #, tcl-format msgid "Reset '%s'?" -msgstr "СброÑить '%s'?" +msgstr "СброÑить «%s»?" #: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343 msgid "Visualize" @@ -1011,17 +970,10 @@ msgstr "ÐаглÑдно" 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" +"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 завершаетÑÑ." +msgstr "Ðе удалоÑÑŒ уÑтановить текущую ветку.\n\nВаш рабочий каталог обновлён только чаÑтично. Были обновлены вÑе файлы кроме Ñлужебных файлов Git. \n\nÐтого не должно было произойти. %s завершаетÑÑ." #: lib/choose_font.tcl:39 msgid "Select" @@ -1043,9 +995,7 @@ msgstr "Пример текÑта" msgid "" "This is example text.\n" "If you like this text, it can be your font." -msgstr "" -"Ðто пример текÑта.\n" -"ЕÑли Вам нравитÑÑ Ñтот текÑÑ‚, Ñто может быть Ваш шрифт." +msgstr "Ðто пример текÑта.\nЕÑли Вам нравитÑÑ Ñтот текÑÑ‚, Ñто может быть Ваш шрифт." #: lib/choose_repository.tcl:28 msgid "Git Gui" @@ -1057,7 +1007,7 @@ msgstr "Создать новый репозиторий" #: lib/choose_repository.tcl:93 msgid "New..." -msgstr "Ðовый..." +msgstr "Ðовый…" #: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471 msgid "Clone Existing Repository" @@ -1065,7 +1015,7 @@ msgstr "Склонировать ÑущеÑтвующий репозиторий #: lib/choose_repository.tcl:106 msgid "Clone..." -msgstr "Склонировать..." +msgstr "Клонировать…" #: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016 msgid "Open Existing Repository" @@ -1073,7 +1023,7 @@ msgstr "Выбрать ÑущеÑтвующий репозиторий" #: lib/choose_repository.tcl:119 msgid "Open..." -msgstr "Открыть..." +msgstr "Открыть…" #: lib/choose_repository.tcl:132 msgid "Recent Repositories" @@ -1126,7 +1076,7 @@ msgstr "Тип клона:" #: lib/choose_repository.tcl:508 msgid "Standard (Fast, Semi-Redundant, Hardlinks)" -msgstr "Стандартный (БыÑтрый, полуизбыточный, \"жеÑткие\" ÑÑылки)" +msgstr "Стандартный (БыÑтрый, полуизбыточный, «жеÑткие» ÑÑылки)" #: lib/choose_repository.tcl:514 msgid "Full Copy (Slower, Redundant Backup)" @@ -1166,7 +1116,7 @@ msgstr "Считаю объекты" #: lib/choose_repository.tcl:641 msgid "buckets" -msgstr "" +msgstr "блоки" #: lib/choose_repository.tcl:665 #, tcl-format @@ -1181,11 +1131,11 @@ msgstr "Ðечего клонировать Ñ %s." #: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917 #: lib/choose_repository.tcl:929 msgid "The 'master' branch has not been initialized." -msgstr "Ðе инициализирована ветвь 'master'." +msgstr "Ðе инициализирована ветвь «master»." #: lib/choose_repository.tcl:716 msgid "Hardlinks are unavailable. Falling back to copying." -msgstr "\"ЖеÑткие ÑÑылки\" недоÑтупны. Будет иÑпользовано копирование." +msgstr "«ЖеÑткие ÑÑылки» недоÑтупны. Будет иÑпользовано копирование." #: lib/choose_repository.tcl:728 #, tcl-format @@ -1216,16 +1166,15 @@ msgstr "объекты" #: lib/choose_repository.tcl:803 #, tcl-format msgid "Unable to hardlink object: %s" -msgstr "Ðе могу \"жеÑтко ÑвÑзать\" объект: %s" +msgstr "Ðе могу Ñоздать «жеÑткую ÑÑылку» на объект: %s" #: lib/choose_repository.tcl:858 msgid "Cannot fetch branches and objects. See console output for details." -msgstr "" -"Ðе могу получить ветви и объекты. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° конÑоли." +msgstr "Ðе удалоÑÑŒ извлечь ветки и объекты. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° конÑоли." #: lib/choose_repository.tcl:869 msgid "Cannot fetch tags. See console output for details." -msgstr "Ðе могу получить метки. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° конÑоли." +msgstr "Ðе удалоÑÑŒ извлечь метки. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° конÑоли." #: lib/choose_repository.tcl:893 msgid "Cannot determine HEAD. See console output for details." @@ -1242,12 +1191,12 @@ msgstr "Клонирование не удалоÑÑŒ." #: lib/choose_repository.tcl:915 msgid "No default branch obtained." -msgstr "Ðе было получено ветви по умолчанию." +msgstr "Ветка по умолчанию не была получена." #: lib/choose_repository.tcl:926 #, tcl-format msgid "Cannot resolve %s as a commit." -msgstr "Ðе могу раÑпознать %s как ÑоÑтоÑние." +msgstr "Ðе могу раÑпознать %s как коммит." #: lib/choose_repository.tcl:938 msgid "Creating working directory" @@ -1285,11 +1234,11 @@ msgstr "Выражение Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñии:" #: lib/choose_rev.tcl:74 msgid "Local Branch" -msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ:" +msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°:" #: lib/choose_rev.tcl:79 msgid "Tracking Branch" -msgstr "Ветвь ÑлежениÑ" +msgstr "ОтÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ‚ÐºÐ°" #: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538 msgid "Tag" @@ -1320,29 +1269,19 @@ msgstr "СÑылка" 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" +"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" +"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 "Ошибка при загрузке данных Ð´Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñохраненного ÑоÑтоÑниÑ:" +msgstr "Ошибка при загрузке данных Ð´Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°:" #: lib/commit.tcl:75 msgid "Unable to obtain your identity:" @@ -1350,41 +1289,29 @@ msgstr "Ðевозможно получить информацию об авто #: lib/commit.tcl:80 msgid "Invalid GIT_COMMITTER_IDENT:" -msgstr "Ðеверный GIT_COMMITTER_IDENT:" +msgstr "ÐедопуÑтимый GIT_COMMITTER_IDENT:" #: lib/commit.tcl:129 #, tcl-format msgid "warning: Tcl does not support encoding '%s'." -msgstr "предупреждение: Tcl не поддерживает кодировку '%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" +"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" +msgstr "ПоÑледнее прочитанное ÑоÑтоÑние Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑоответÑтвует текущему.\n\nС момента поÑледней проверки репозиторий был изменен другой программой Git. Ðеобходимо перечитать репозиторий, прежде чем изменÑÑ‚ÑŒ текущую ветвь. \n\nÐто будет Ñделано ÑÐµÐ¹Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n" #: lib/commit.tcl:172 #, 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" +"File %s has merge conflicts. You must resolve them and stage the file before committing.\n" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ коммит Ñ Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð¾Ð¹ операцией ÑлиÑниÑ.\n\nÐ”Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s возник конфликт ÑлиÑниÑ. Разрешите конфликт и добавьте их в Ð¸Ð½Ð´ÐµÐºÑ Ð¿ÐµÑ€ÐµÐ´ выполнением коммита.\n" #: lib/commit.tcl:180 #, tcl-format @@ -1392,20 +1319,14 @@ msgid "" "Unknown file state %s detected.\n" "\n" "File %s cannot be committed by this program.\n" -msgstr "" -"Обнаружено неизвеÑтное ÑоÑтоÑние файла %s.\n" -"\n" -"Файл %s не может быть Ñохранен данной программой.\n" +msgstr "Обнаружено неизвеÑтное ÑоÑтоÑние файла %s.\n\nФайл %s не может быть закоммичен Ñтой программой.\n" #: lib/commit.tcl:188 msgid "" "No changes to commit.\n" "\n" "You must stage at least 1 file before you can commit.\n" -msgstr "" -"ОтÑутÑтвуют Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑохранениÑ.\n" -"\n" -"Подготовьте Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один файл до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñохраненного ÑоÑтоÑниÑ.\n" +msgstr "ОтÑутÑтвуют Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑохранениÑ.\n\nДобавьте в Ð¸Ð½Ð´ÐµÐºÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один файл перед выполнением коммита.\n" #: lib/commit.tcl:203 msgid "" @@ -1416,34 +1337,27 @@ msgid "" "- 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" +msgstr "Укажите Ñообщение коммита.\n\nРекомендуетÑÑ Ñледующий формат ÑообщениÑ:\n\n- в первой Ñтроке краткое опиÑание Ñделанных изменений\n- Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ñтрока пуÑтаÑ\n- в оÑтавшихÑÑ Ñтроках опишите, что дают ваши изменениÑ\n" #: lib/commit.tcl:234 msgid "Calling pre-commit hook..." -msgstr "Вызов программы поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ pre-commit..." +msgstr "Вызов перехватчика pre-commit…" #: lib/commit.tcl:249 msgid "Commit declined by pre-commit hook." -msgstr "Сохранение прервано программой поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ pre-commit" +msgstr "Коммит прерван переватчиком pre-commit." #: lib/commit.tcl:272 msgid "Calling commit-msg hook..." -msgstr "Вызов программы поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ commit-msg..." +msgstr "Вызов перехватчика commit-msg…" #: lib/commit.tcl:287 msgid "Commit declined by commit-msg hook." -msgstr "Сохранение прервано программой поддержки Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ commit-msg" +msgstr "Коммит прерван переватчиком commit-msg" #: lib/commit.tcl:300 msgid "Committing changes..." -msgstr "Сохранение изменений..." +msgstr "Коммит изменений…" #: lib/commit.tcl:316 msgid "write-tree failed:" @@ -1451,12 +1365,12 @@ msgstr "Программа write-tree завершилаÑÑŒ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹:" #: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382 msgid "Commit failed." -msgstr "Сохранить ÑоÑтоÑние не удалоÑÑŒ." +msgstr "Ðе удалоÑÑŒ закоммитить изменениÑ." #: lib/commit.tcl:334 #, tcl-format msgid "Commit %s appears to be corrupt" -msgstr "СоÑтоÑние %s выглÑдит поврежденным" +msgstr "Коммит %s похоже поврежден" #: lib/commit.tcl:339 msgid "" @@ -1465,16 +1379,11 @@ msgid "" "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" +msgstr "Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°.\n\nÐи один файл не был изменен и не было ÑлиÑниÑ.\n\nÐ¡ÐµÐ¹Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки запуÑтитÑÑ Ð¿ÐµÑ€ÐµÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ðµ репозиториÑ.\n" #: lib/commit.tcl:346 msgid "No changes to commit." -msgstr "ОтÑутÑтвуют Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑохранениÑ." +msgstr "Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°." #: lib/commit.tcl:360 msgid "commit-tree failed:" @@ -1487,11 +1396,11 @@ msgstr "Программа update-ref завершилаÑÑŒ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹:" #: lib/commit.tcl:469 #, tcl-format msgid "Created commit %s: %s" -msgstr "Создано ÑоÑтоÑние %s: %s " +msgstr "Создан коммит %s: %s " #: lib/console.tcl:59 msgid "Working... please wait..." -msgstr "Ð’ процеÑÑе... пожалуйÑта, ждите..." +msgstr "Ð’ процеÑÑе… пожалуйÑта, ждите…" #: lib/console.tcl:186 msgid "Success" @@ -1542,16 +1451,10 @@ msgstr "Проверка базы объектов при помощи fsck" 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" +"To maintain optimal performance it is strongly recommended that you compress the database.\n" "\n" "Compress the database now?" -msgstr "" -"Ðтот репозиторий ÑÐµÐ¹Ñ‡Ð°Ñ Ñодержит примерно %i Ñвободных объектов\n" -"\n" -"Ð”Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ¹ производительноÑти рекомендуетÑÑ Ñжать базу данных.\n" -"\n" -"Сжать базу данных ÑейчаÑ?" +msgstr "Ðтот репозиторий ÑÐµÐ¹Ñ‡Ð°Ñ Ñодержит примерно %i Ñвободных объектов\n\nÐ”Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ¹ производительноÑти рекомендуетÑÑ Ñжать базу данных.\n\nСжать базу данных ÑейчаÑ?" #: lib/date.tcl:25 #, tcl-format @@ -1565,41 +1468,27 @@ msgid "" "\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" +"The modification date of this file was updated by another application, but the content within the file was not changed.\n" "\n" -"в %s отÑутÑтвуют изменениÑ.\n" -"\n" -"Дата Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° была обновлена другой программой, но Ñодержимое файла " -"оÑталоÑÑŒ прежним.\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..." +msgstr "Загрузка изменений %s…" #: lib/diff.tcl:125 msgid "" "LOCAL: deleted\n" "REMOTE:\n" -msgstr "" -"ЛОКÐЛЬÐО: удалён\n" -"Ð’ÐЕШÐИЙ:\n" +msgstr "ЛОКÐЛЬÐО: удалён\nÐ’ÐЕШÐИЙ:\n" #: lib/diff.tcl:130 msgid "" "REMOTE: deleted\n" "LOCAL:\n" -msgstr "" -"Ð’ÐЕШÐИЙ: удалён\n" -"ЛОКÐЛЬÐО:\n" +msgstr "Ð’ÐЕШÐИЙ: удалён\nЛОКÐЛЬÐО:\n" #: lib/diff.tcl:137 msgid "LOCAL:\n" @@ -1631,9 +1520,7 @@ msgstr "* Двоичный файл (Ñодержимое не показано) msgid "" "* Untracked file is %d bytes.\n" "* Showing only first %d bytes.\n" -msgstr "" -"* Размер неподготовленного файла %d байт.\n" -"* Показано первых %d байт.\n" +msgstr "* Размер неотÑлеживаемого файла %d байт.\n* Показано первых %d байт.\n" #: lib/diff.tcl:233 #, tcl-format @@ -1641,10 +1528,7 @@ msgid "" "\n" "* Untracked file clipped here by %s.\n" "* To see the entire file, use an external editor.\n" -msgstr "" -"\n" -"* Ðеподготовленный файл обрезан: %s.\n" -"* Чтобы увидеть веÑÑŒ файл, иÑпользуйте программу-редактор.\n" +msgstr "\n* ÐеотÑлеживаемый файл обрезан: %s.\n* Чтобы увидеть веÑÑŒ файл, иÑпользуйте внешний редактор.\n" #: lib/diff.tcl:482 msgid "Failed to unstage selected hunk." @@ -1652,7 +1536,7 @@ msgstr "Ðе удалоÑÑŒ иÑключить выбранную чаÑÑ‚ÑŒ." #: lib/diff.tcl:489 msgid "Failed to stage selected hunk." -msgstr "Ðе удалоÑÑŒ подготовить к Ñохранению выбранную чаÑÑ‚ÑŒ." +msgstr "Ðе удалоÑÑŒ проиндекÑировать выбранный блок изменений." #: lib/diff.tcl:568 msgid "Failed to unstage selected line." @@ -1660,7 +1544,7 @@ msgstr "Ðе удалоÑÑŒ иÑключить выбранную Ñтроку." #: lib/diff.tcl:576 msgid "Failed to stage selected line." -msgstr "Ðе удалоÑÑŒ подготовить к Ñохранению выбранную Ñтроку." +msgstr "Ðе удалоÑÑŒ проиндекÑировать выбранную Ñтроку." #: lib/encoding.tcl:443 msgid "Default" @@ -1685,7 +1569,7 @@ msgstr "предупреждение" #: lib/error.tcl:94 msgid "You must correct the above errors before committing." -msgstr "Прежде чем Ñохранить, иÑправьте вышеуказанные ошибки." +msgstr "Перед коммитом, иÑправьте вышеуказанные ошибки." #: lib/index.tcl:6 msgid "Unable to unlock the index." @@ -1699,9 +1583,7 @@ msgstr "Ошибка в индекÑе" msgid "" "Updating the Git index failed. A rescan will be automatically started to " "resynchronize git-gui." -msgstr "" -"Ðе удалоÑÑŒ обновить Ð¸Ð½Ð´ÐµÐºÑ Git. СоÑтоÑние Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ перечитано " -"автоматичеÑки." +msgstr "Ðе удалоÑÑŒ обновить Ð¸Ð½Ð´ÐµÐºÑ Git. СоÑтоÑние Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ перечитано автоматичеÑки." #: lib/index.tcl:28 msgid "Continue" @@ -1714,32 +1596,30 @@ msgstr "Разблокировать индекÑ" #: lib/index.tcl:289 #, tcl-format msgid "Unstaging %s from commit" -msgstr "Удаление %s из подготовленного" +msgstr "Удаление %s из индекÑа" #: lib/index.tcl:328 msgid "Ready to commit." -msgstr "Подготовлено Ð´Ð»Ñ ÑохранениÑ" +msgstr "Готов Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°." #: lib/index.tcl:341 #, tcl-format msgid "Adding %s" -msgstr "Добавление %s..." +msgstr "Добавление %s…" #: lib/index.tcl:398 #, tcl-format msgid "Revert changes in file %s?" -msgstr "Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файле %s?" +msgstr "Обратить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файле %s?" #: lib/index.tcl:400 #, tcl-format msgid "Revert changes in these %i files?" -msgstr "Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %i файле(-ах)?" +msgstr "Обратить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %i файле(-ах)?" #: lib/index.tcl:408 msgid "Any unstaged changes will be permanently lost by the revert." -msgstr "" -"Любые изменениÑ, не подготовленные к Ñохранению, будут потерÑны при данной " -"операции." +msgstr "Любые непроиндекÑированные изменениÑ, будут потерÑны при обращении изменений." #: lib/index.tcl:411 msgid "Do Nothing" @@ -1747,38 +1627,28 @@ msgstr "Ðичего не делать" #: lib/index.tcl:429 msgid "Reverting selected files" -msgstr "Удаление изменений в выбранных файлах" +msgstr "Обращение изменений в выбранных файлах" #: lib/index.tcl:433 #, tcl-format msgid "Reverting %s" -msgstr "Отмена изменений в %s" +msgstr "Обращение изменений в %s" #: 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" +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" +"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" +msgstr "ПоÑледнее прочитанное ÑоÑтоÑние Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑоответÑтвует текущему.\n\nС момента поÑледней проверки репозиторий был изменен другой программой Git. Ðеобходимо перечитать репозиторий, прежде чем ÑлиÑние может быть Ñделано.\n\nÐто будет Ñделано ÑÐµÐ¹Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n" #: lib/merge.tcl:45 #, tcl-format @@ -1787,15 +1657,8 @@ msgid "" "\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" +"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 @@ -1804,15 +1667,8 @@ msgid "" "\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" +"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:107 #, tcl-format @@ -1822,7 +1678,7 @@ msgstr "%s из %s" #: lib/merge.tcl:120 #, tcl-format msgid "Merging %s and %s..." -msgstr "СлиÑние %s и %s..." +msgstr "СлиÑние %s и %s…" #: lib/merge.tcl:131 msgid "Merge completed successfully." @@ -1846,10 +1702,7 @@ msgid "" "Cannot abort while amending.\n" "\n" "You must finish amending this commit.\n" -msgstr "" -"Ðевозможно прервать иÑправление.\n" -"\n" -"Завершите текущее иÑправление Ñохраненного ÑоÑтоÑниÑ.\n" +msgstr "Ðевозможно прервать иÑправление.\n\nЗавершите текущее иÑправление коммита.\n" #: lib/merge.tcl:222 msgid "" @@ -1858,12 +1711,7 @@ msgid "" "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" -"Продолжить?" +msgstr "Прервать операцию ÑлиÑниÑ?\n\nПрерывание текущего ÑлиÑÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к потере *ВСЕХ* неÑохраненных изменений.\n\nПродолжить?" #: lib/merge.tcl:228 msgid "" @@ -1872,12 +1720,7 @@ msgid "" "Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" "\n" "Continue with resetting the current changes?" -msgstr "" -"Прервать операцию ÑлиÑниÑ?\n" -"\n" -"Прерывание Ñтой операции приведет к потере *ВСЕХ* неÑохраненных изменений.\n" -"\n" -"Продолжить?" +msgstr "СброÑить изменениÑ?\n\nÐ¡Ð±Ñ€Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ приведет к потере *ВСЕХ* неÑохраненных изменений.\n\nПродолжить?" #: lib/merge.tcl:239 msgid "Aborting" @@ -1901,11 +1744,11 @@ msgstr "ИÑпользовать базовую верÑию Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆ #: lib/mergetool.tcl:9 msgid "Force resolution to this branch?" -msgstr "ИÑпользовать верÑию Ñтой ветви Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°?" +msgstr "ИÑпользовать верÑию из Ñтой ветки Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°?" #: lib/mergetool.tcl:10 msgid "Force resolution to the other branch?" -msgstr "ИÑпользовать верÑию другой ветви Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°?" +msgstr "ИÑпользовать верÑию из другой ветки Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°?" #: lib/mergetool.tcl:14 #, tcl-format @@ -1915,19 +1758,12 @@ msgid "" "%s will be overwritten.\n" "\n" "This operation can be undone only by restarting the merge." -msgstr "" -"Внимание! СпиÑок изменений показывает только конфликтующие отличиÑ.\n" -"\n" -"%s будет перепиÑан.\n" -"\n" -"Ðто дейÑтвие можно отменить только перезапуÑком операции ÑлиÑниÑ." +msgstr "Внимание! СпиÑок изменений показывает только конфликтующие отличиÑ.\n\n%s будет перепиÑан.\n\nÐто дейÑтвие можно отменить только перезапуÑком операции ÑлиÑниÑ." #: lib/mergetool.tcl:45 #, tcl-format msgid "File %s seems to have unresolved conflicts, still stage?" -msgstr "" -"Файл %s, похоже, Ñодержит необработанные конфликты. Продолжить подготовку к " -"Ñохранению?" +msgstr "Похоже, что файл %s Ñодержит неразрешенные конфликты. Продолжить индекÑацию?" #: lib/mergetool.tcl:60 #, tcl-format @@ -1936,8 +1772,7 @@ msgstr "ДобавлÑÑŽ результат Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s" #: lib/mergetool.tcl:141 msgid "Cannot resolve deletion or link conflicts using a tool" -msgstr "" -"Программа ÑлиÑÐ½Ð¸Ñ Ð½Ðµ обрабатывает конфликты Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸ÐµÐ¼ или учаÑтием ÑÑылок" +msgstr "Программа ÑлиÑÐ½Ð¸Ñ Ð½Ðµ обрабатывает конфликты Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸ÐµÐ¼ или учаÑтием ÑÑылок" #: lib/mergetool.tcl:146 msgid "Conflict file does not exist" @@ -1946,12 +1781,12 @@ msgstr "Конфликтующий файл не ÑущеÑтвует" #: lib/mergetool.tcl:264 #, tcl-format msgid "Not a GUI merge tool: '%s'" -msgstr "'%s' не ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¾Ð¹ ÑлиÑниÑ" +msgstr "«%s» не ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¾Ð¹ ÑлиÑниÑ" #: lib/mergetool.tcl:268 #, tcl-format msgid "Unsupported merge tool '%s'" -msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° ÑлиÑÐ½Ð¸Ñ '%s'" +msgstr "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° ÑлиÑÐ½Ð¸Ñ Â«%s»" #: lib/mergetool.tcl:303 msgid "Merge tool is already running, terminate it?" @@ -1962,9 +1797,7 @@ msgstr "Программа ÑлиÑÐ½Ð¸Ñ ÑƒÐ¶Ðµ работает. ÐŸÑ€ÐµÑ€Ð²Ð°Ñ msgid "" "Error retrieving versions:\n" "%s" -msgstr "" -"Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñий:\n" -"%s" +msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñий:\n%s" #: lib/mergetool.tcl:343 #, tcl-format @@ -1972,14 +1805,11 @@ msgid "" "Could not start the merge tool:\n" "\n" "%s" -msgstr "" -"Ошибка запуÑка программы ÑлиÑниÑ:\n" -"\n" -"%s" +msgstr "Ошибка запуÑка программы ÑлиÑниÑ:\n\n%s" #: lib/mergetool.tcl:347 msgid "Running merge tool..." -msgstr "ЗапуÑк программы ÑлиÑниÑ..." +msgstr "ЗапуÑк программы ÑлиÑниÑ…" #: lib/mergetool.tcl:375 lib/mergetool.tcl:383 msgid "Merge tool failed." @@ -1988,12 +1818,12 @@ msgstr "Ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ ÑлиÑниÑ." #: lib/option.tcl:11 #, tcl-format msgid "Invalid global encoding '%s'" -msgstr "Ошибка в глобальной уÑтановке кодировки '%s'" +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° «%s»" #: lib/option.tcl:19 #, tcl-format msgid "Invalid repo encoding '%s'" -msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° репозиториÑ: '%s'" +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Â«%s»" #: lib/option.tcl:117 msgid "Restore Defaults" @@ -2022,7 +1852,7 @@ msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты" #: lib/option.tcl:141 msgid "Summarize Merge Commits" -msgstr "Суммарный комментарий при ÑлиÑнии" +msgstr "Суммарное Ñообщение при ÑлиÑнии" #: lib/option.tcl:142 msgid "Merge Verbosity" @@ -2042,11 +1872,11 @@ msgstr "ДоверÑÑ‚ÑŒ времени модификации файла" #: lib/option.tcl:147 msgid "Prune Tracking Branches During Fetch" -msgstr "ЧиÑтка ветвей ÑÐ»ÐµÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении изменений" +msgstr "ЧиÑтка отÑлеживаемых веток при извлечении изменений" #: lib/option.tcl:148 msgid "Match Tracking Branches" -msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ ветви взÑÑ‚ÑŒ из имен ветвей ÑлежениÑ" +msgstr "Такое же имÑ, как и у отÑлеживаемой ветки" #: lib/option.tcl:149 msgid "Blame Copy Only On Changed Files" @@ -2066,11 +1896,11 @@ msgstr "ЧиÑло Ñтрок в контекÑте diff" #: lib/option.tcl:153 msgid "Commit Message Text Width" -msgstr "Ширина текÑта комментариÑ" +msgstr "Ширина текÑта ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°" #: lib/option.tcl:154 msgid "New Branch Name Template" -msgstr "Шаблон Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ новой ветви" +msgstr "Шаблон Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ новой ветки" #: lib/option.tcl:155 msgid "Default File Contents Encoding" @@ -2093,7 +1923,6 @@ msgstr "Изменить" msgid "Choose %s" msgstr "Выберите %s" -# carbon copy #: lib/option.tcl:264 msgid "pt." msgstr "pt." @@ -2116,7 +1945,7 @@ msgstr "ЧиÑтка" #: lib/remote.tcl:173 msgid "Fetch from" -msgstr "Получение из" +msgstr "Извлечение из" #: lib/remote.tcl:215 msgid "Push to" @@ -2132,7 +1961,7 @@ msgstr "Добавить внешний репозиторий" #: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36 msgid "Add" -msgstr "" +msgstr "Добавить" #: lib/remote_add.tcl:37 msgid "Remote Details" @@ -2148,7 +1977,7 @@ msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ" #: lib/remote_add.tcl:65 msgid "Fetch Immediately" -msgstr "Скачать Ñразу" +msgstr "Сразу извлечь изменениÑ" #: lib/remote_add.tcl:71 msgid "Initialize Remote Repository and Push" @@ -2165,27 +1994,27 @@ msgstr "Укажите название внешнего репозиториÑ. #: lib/remote_add.tcl:114 #, tcl-format msgid "'%s' is not an acceptable remote name." -msgstr "ÐедопуÑтимое название внешнего Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ '%s'." +msgstr "«%s» не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым именем внешнего репозиториÑ." #: lib/remote_add.tcl:125 #, tcl-format msgid "Failed to add remote '%s' of location '%s'." -msgstr "Ðе удалоÑÑŒ добавить '%s' из '%s'. " +msgstr "Ðе удалоÑÑŒ добавить «%s» из «%s». " #: lib/remote_add.tcl:133 lib/transport.tcl:6 #, tcl-format msgid "fetch %s" -msgstr "получение %s" +msgstr "извлечение %s" #: lib/remote_add.tcl:134 #, tcl-format msgid "Fetching the %s" -msgstr "Получение %s" +msgstr "Извлечение %s" #: lib/remote_add.tcl:157 #, tcl-format msgid "Do not know how to initialize repository at location '%s'." -msgstr "Ðевозможно инициализировать репозиторий в '%s'." +msgstr "Ðевозможно инициализировать репозиторий в «%s»." #: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 #: lib/transport.tcl:81 @@ -2200,7 +2029,7 @@ msgstr "ÐаÑтройка %s (в %s)" #: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 msgid "Delete Branch Remotely" -msgstr "Удаление ветви во внешнем репозитории" +msgstr "Удаление ветки во внешнем репозитории" #: lib/remote_branch_delete.tcl:47 msgid "From Repository" @@ -2216,7 +2045,7 @@ msgstr "Указанное положение:" #: lib/remote_branch_delete.tcl:84 msgid "Branches" -msgstr "Ветви" +msgstr "Ветки" #: lib/remote_branch_delete.tcl:109 msgid "Delete Only If" @@ -2228,7 +2057,7 @@ msgstr "СлиÑние Ñ:" #: lib/remote_branch_delete.tcl:152 msgid "A branch is required for 'Merged Into'." -msgstr "Ð”Ð»Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ 'СлиÑние Ñ' требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ ветвь." +msgstr "Ð”Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ «СлиÑние Ñ» требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ ветку." #: lib/remote_branch_delete.tcl:184 #, tcl-format @@ -2236,28 +2065,23 @@ msgid "" "The following branches are not completely merged into %s:\n" "\n" " - %s" -msgstr "" -"Следующие ветви могут быть объединены Ñ %s при помощи операции ÑлиÑниÑ:\n" -"\n" -" - %s" +msgstr "Следующие ветки могут быть объединены Ñ %s при помощи операции ÑлиÑниÑ:\n\n - %s" #: lib/remote_branch_delete.tcl:189 #, 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." +msgstr "Ðекоторые теÑÑ‚Ñ‹ на ÑлиÑние не прошли, потому что вы не извлекли необходимые коммиты. ПопытайтеÑÑŒ извлечь их из %s." #: lib/remote_branch_delete.tcl:207 msgid "Please select one or more branches to delete." -msgstr "Укажите одну или неÑколько ветвей Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ." +msgstr "Укажите одну или неÑколько веток Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ." #: lib/remote_branch_delete.tcl:226 #, tcl-format msgid "Deleting branches from %s" -msgstr "Удаление ветвей из %s" +msgstr "Удаление веток из %s" #: lib/remote_branch_delete.tcl:292 msgid "No repository selected." @@ -2266,7 +2090,7 @@ msgstr "Ðе указан репозиторий." #: lib/remote_branch_delete.tcl:297 #, tcl-format msgid "Scanning %s..." -msgstr "Перечитывание %s... " +msgstr "Перечитывание %s…" #: lib/search.tcl:21 msgid "Find:" @@ -2352,7 +2176,7 @@ msgstr "Ваш публичный ключ OpenSSH" #: lib/sshkey.tcl:78 msgid "Generating..." -msgstr "Создание..." +msgstr "Создание…" #: lib/sshkey.tcl:84 #, tcl-format @@ -2360,10 +2184,7 @@ msgid "" "Could not start ssh-keygen:\n" "\n" "%s" -msgstr "" -"Ошибка запуÑка ssh-keygen:\n" -"\n" -"%s" +msgstr "Ошибка запуÑка ssh-keygen:\n\n%s" #: lib/sshkey.tcl:111 msgid "Generation failed." @@ -2381,7 +2202,7 @@ msgstr "Ваш ключ находитÑÑ Ð²: %s" #: lib/status_bar.tcl:83 #, tcl-format msgid "%s ... %*i of %*i %s (%3i%%)" -msgstr "%s ... %*i из %*i %s (%3i%%)" +msgstr "%s … %*i из %*i %s (%3i%%)" #: lib/tools.tcl:75 #, tcl-format @@ -2431,7 +2252,7 @@ msgstr "ОпиÑание вÑпомогательной операции" #: lib/tools_dlg.tcl:48 msgid "Use '/' separators to create a submenu tree:" -msgstr "ИÑпользуйте '/' Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½ÑŽ" +msgstr "ИÑпользуйте «/» Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½ÑŽ" #: lib/tools_dlg.tcl:61 msgid "Command:" @@ -2464,16 +2285,14 @@ msgstr "Укажите название вÑпомогательной оперР#: lib/tools_dlg.tcl:129 #, tcl-format msgid "Tool '%s' already exists." -msgstr "Ð’ÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ '%s' уже ÑущеÑтвует." +msgstr "Ð’ÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Â«%s» уже ÑущеÑтвует." #: lib/tools_dlg.tcl:151 #, tcl-format msgid "" "Could not add tool:\n" "%s" -msgstr "" -"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹:\n" -"%s" +msgstr "Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹:\n%s" #: lib/tools_dlg.tcl:190 msgid "Remove Tool" @@ -2507,9 +2326,8 @@ msgstr "OK" #: lib/transport.tcl:7 #, tcl-format msgid "Fetching new changes from %s" -msgstr "Получение изменений из %s " +msgstr "Извлечение изменений из %s " -# carbon copy #: lib/transport.tcl:18 #, tcl-format msgid "remote prune %s" @@ -2518,7 +2336,7 @@ msgstr "чиÑтка внешнего %s" #: lib/transport.tcl:19 #, tcl-format msgid "Pruning tracking branches deleted from %s" -msgstr "ЧиÑтка ветвей ÑлежениÑ, удаленных из %s" +msgstr "ЧиÑтка отÑлеживаемых веток, удалённых из %s" #: lib/transport.tcl:26 #, tcl-format @@ -2537,11 +2355,11 @@ msgstr "Отправка %s %s в %s" #: lib/transport.tcl:100 msgid "Push Branches" -msgstr "Отправить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ветвÑÑ…" +msgstr "Отправить ветки" #: lib/transport.tcl:114 msgid "Source Branches" -msgstr "ИÑходные ветви" +msgstr "ИÑходные ветки" #: lib/transport.tcl:131 msgid "Destination Repository" @@ -2553,7 +2371,7 @@ msgstr "ÐаÑтройки отправки" #: lib/transport.tcl:171 msgid "Force overwrite existing branch (may discard changes)" -msgstr "Ðамеренно перепиÑать ÑущеÑтвующую ветвь (возможна Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹)" +msgstr "Принудительно перезапиÑать ÑущеÑтвующую ветку (возможна Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹)" #: lib/transport.tcl:175 msgid "Use thin pack (for slow network connections)" diff --git a/git-mergetool.sh b/git-mergetool.sh index bf862705d8..e52b4e4f24 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -3,12 +3,13 @@ # This program resolves merge conflicts in git # # Copyright (c) 2006 Theodore Y. Ts'o +# Copyright (c) 2009-2016 David Aguilar # # This file is licensed under the GPL v2, or a later version # at the discretion of Junio C Hamano. # -USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...' +USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [-O<orderfile>] [file to merge] ...' SUBDIRECTORY_OK=Yes NONGIT_OK=Yes OPTIONS_SPEC= @@ -365,51 +366,6 @@ merge_file () { return 0 } -prompt=$(git config --bool mergetool.prompt) -guessed_merge_tool=false - -while test $# != 0 -do - case "$1" in - --tool-help=*) - TOOL_MODE=${1#--tool-help=} - show_tool_help - ;; - --tool-help) - show_tool_help - ;; - -t|--tool*) - case "$#,$1" in - *,*=*) - merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)') - ;; - 1,*) - usage ;; - *) - merge_tool="$2" - shift ;; - esac - ;; - -y|--no-prompt) - prompt=false - ;; - --prompt) - prompt=true - ;; - --) - shift - break - ;; - -*) - usage - ;; - *) - break - ;; - esac - shift -done - prompt_after_failed_merge () { while true do @@ -426,57 +382,113 @@ prompt_after_failed_merge () { done } -git_dir_init -require_work_tree +print_noop_and_exit () { + echo "No files need merging" + exit 0 +} + +main () { + prompt=$(git config --bool mergetool.prompt) + guessed_merge_tool=false + orderfile= + + while test $# != 0 + do + case "$1" in + --tool-help=*) + TOOL_MODE=${1#--tool-help=} + show_tool_help + ;; + --tool-help) + show_tool_help + ;; + -t|--tool*) + case "$#,$1" in + *,*=*) + merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)') + ;; + 1,*) + usage ;; + *) + merge_tool="$2" + shift ;; + esac + ;; + -y|--no-prompt) + prompt=false + ;; + --prompt) + prompt=true + ;; + -O*) + orderfile="$1" + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + + git_dir_init + require_work_tree -if test -z "$merge_tool" -then - # Check if a merge tool has been configured - merge_tool=$(get_configured_merge_tool) - # Try to guess an appropriate merge tool if no tool has been set. if test -z "$merge_tool" then - merge_tool=$(guess_merge_tool) || exit - guessed_merge_tool=true + # Check if a merge tool has been configured + merge_tool=$(get_configured_merge_tool) + # Try to guess an appropriate merge tool if no tool has been set. + if test -z "$merge_tool" + then + merge_tool=$(guess_merge_tool) || exit + guessed_merge_tool=true + fi + fi + merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)" + merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" + + if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR" + then + set -- $(git rerere remaining) + if test $# -eq 0 + then + print_noop_and_exit + fi fi -fi -merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)" -merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" -files= + files=$(git -c core.quotePath=false \ + diff --name-only --diff-filter=U \ + ${orderfile:+"$orderfile"} -- "$@") -if test $# -eq 0 -then cd_to_toplevel - if test -e "$GIT_DIR/MERGE_RR" + if test -z "$files" then - files=$(git rerere remaining) - else - files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u) + print_noop_and_exit fi -else - files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u) -fi -if test -z "$files" -then - echo "No files need merging" - exit 0 -fi + printf "Merging:\n" + printf "%s\n" "$files" -printf "Merging:\n" -printf "%s\n" "$files" + rc=0 + for i in $files + do + printf "\n" + if ! merge_file "$i" + then + rc=1 + prompt_after_failed_merge || exit 1 + fi + done -rc=0 -for i in $files -do - printf "\n" - if ! merge_file "$i" - then - rc=1 - prompt_after_failed_merge || exit 1 - fi -done + exit $rc +} -exit $rc +main "$@" diff --git a/git-svn.perl b/git-svn.perl index 4d41d220a0..fa42364785 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -44,6 +44,7 @@ use Git qw( command_close_pipe command_bidi_pipe command_close_bidi_pipe + get_record ); BEGIN { @@ -1699,7 +1700,7 @@ sub cmd_gc { "files will not be compressed.\n"; } File::Find::find({ wanted => \&gc_directory, no_chdir => 1}, - "$ENV{GIT_DIR}/svn"); + Git::SVN::svn_dir()); } ########################### utility functions ######################### @@ -1733,7 +1734,7 @@ sub post_fetch_checkout { return unless verify_ref('HEAD^0'); return if $ENV{GIT_DIR} !~ m#^(?:.*/)?\.git$#; - my $index = $ENV{GIT_INDEX_FILE} || "$ENV{GIT_DIR}/index"; + my $index = command_oneline(qw(rev-parse --git-path index)); return if -f $index; return if command_oneline(qw/rev-parse --is-inside-work-tree/) eq 'false'; @@ -1835,8 +1836,9 @@ sub get_tree_from_treeish { sub get_commit_entry { my ($treeish) = shift; my %log_entry = ( log => '', tree => get_tree_from_treeish($treeish) ); - my $commit_editmsg = "$ENV{GIT_DIR}/COMMIT_EDITMSG"; - my $commit_msg = "$ENV{GIT_DIR}/COMMIT_MSG"; + my @git_path = qw(rev-parse --git-path); + my $commit_editmsg = command_oneline(@git_path, 'COMMIT_EDITMSG'); + my $commit_msg = command_oneline(@git_path, 'COMMIT_MSG'); open my $log_fh, '>', $commit_editmsg or croak $!; my $type = command_oneline(qw/cat-file -t/, $treeish); @@ -1880,10 +1882,9 @@ sub get_commit_entry { { require Encode; # SVN requires messages to be UTF-8 when entering the repo - local $/; open $log_fh, '<', $commit_msg or croak $!; binmode $log_fh; - chomp($log_entry{log} = <$log_fh>); + chomp($log_entry{log} = get_record($log_fh, undef)); my $enc = Git::config('i18n.commitencoding') || 'UTF-8'; my $msg = $log_entry{log}; @@ -35,8 +35,7 @@ static void save_env_before_alias(void) orig_cwd = xgetcwd(); for (i = 0; i < ARRAY_SIZE(env_names); i++) { orig_env[i] = getenv(env_names[i]); - if (orig_env[i]) - orig_env[i] = xstrdup(orig_env[i]); + orig_env[i] = xstrdup_or_null(orig_env[i]); } } @@ -164,6 +163,20 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) setenv(GIT_WORK_TREE_ENVIRONMENT, cmd, 1); if (envchanged) *envchanged = 1; + } else if (!strcmp(cmd, "--super-prefix")) { + if (*argc < 2) { + fprintf(stderr, "No prefix given for --super-prefix.\n" ); + usage(git_usage_string); + } + setenv(GIT_SUPER_PREFIX_ENVIRONMENT, (*argv)[1], 1); + if (envchanged) + *envchanged = 1; + (*argv)++; + (*argc)--; + } else if (skip_prefix(cmd, "--super-prefix=", &cmd)) { + setenv(GIT_SUPER_PREFIX_ENVIRONMENT, cmd, 1); + if (envchanged) + *envchanged = 1; } else if (!strcmp(cmd, "--bare")) { char *cwd = xgetcwd(); is_bare_repository_cfg = 1; @@ -310,6 +323,7 @@ static int handle_alias(int *argcp, const char ***argv) * RUN_SETUP for reading from the configuration file. */ #define NEED_WORK_TREE (1<<3) +#define SUPPORT_SUPER_PREFIX (1<<4) struct cmd_struct { const char *cmd; @@ -344,6 +358,13 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) } commit_pager_choice(); + if (!help && get_super_prefix()) { + if (!(p->option & SUPPORT_SUPER_PREFIX)) + die("%s doesn't support --super-prefix", p->cmd); + if (prefix) + die("can't use --super-prefix from a subdirectory"); + } + if (!help && p->option & NEED_WORK_TREE) setup_work_tree(); @@ -421,7 +442,7 @@ static struct cmd_struct commands[] = { { "init-db", cmd_init_db }, { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY }, { "log", cmd_log, RUN_SETUP }, - { "ls-files", cmd_ls_files, RUN_SETUP }, + { "ls-files", cmd_ls_files, RUN_SETUP | SUPPORT_SUPER_PREFIX }, { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, { "ls-tree", cmd_ls_tree, RUN_SETUP }, { "mailinfo", cmd_mailinfo }, @@ -558,6 +579,9 @@ static void execv_dashed_external(const char **argv) const char *tmp; int status; + if (get_super_prefix()) + die("%s doesn't support --super-prefix", argv[0]); + if (use_pager == -1) use_pager = check_pager_config(argv[0]); commit_pager_choice(); diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 44094f41d5..7cf68f07b7 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -1616,7 +1616,7 @@ sub esc_path { return $str; } -# Sanitize for use in XHTML + application/xml+xhtm (valid XML 1.0) +# Sanitize for use in XHTML + application/xml+xhtml (valid XML 1.0) sub sanitize { my $str = shift; @@ -2036,10 +2036,24 @@ sub format_log_line_html { my $line = shift; $line = esc_html($line, -nbsp=>1); - $line =~ s{\b([0-9a-fA-F]{8,40})\b}{ + $line =~ s{ + \b + ( + # The output of "git describe", e.g. v2.10.0-297-gf6727b0 + # or hadoop-20160921-113441-20-g094fb7d + (?<!-) # see strbuf_check_tag_ref(). Tags can't start with - + [A-Za-z0-9.-]+ + (?!\.) # refs can't end with ".", see check_refname_format() + -g[0-9a-fA-F]{7,40} + | + # Just a normal looking Git SHA1 + [0-9a-fA-F]{7,40} + ) + \b + }{ $cgi->a({-href => href(action=>"object", hash=>$1), -class => "text"}, $1); - }eg; + }egx; return $line; } diff --git a/gpg-interface.c b/gpg-interface.c index 8672edaf48..e44cc27da1 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -33,6 +33,10 @@ static struct { { 'B', "\n[GNUPG:] BADSIG " }, { 'U', "\n[GNUPG:] TRUST_NEVER" }, { 'U', "\n[GNUPG:] TRUST_UNDEFINED" }, + { 'E', "\n[GNUPG:] ERRSIG "}, + { 'X', "\n[GNUPG:] EXPSIG "}, + { 'Y', "\n[GNUPG:] EXPKEYSIG "}, + { 'R', "\n[GNUPG:] REVKEYSIG "}, }; void parse_gpg_output(struct signature_check *sigc) @@ -54,9 +58,12 @@ void parse_gpg_output(struct signature_check *sigc) /* The trust messages are not followed by key/signer information */ if (sigc->result != 'U') { sigc->key = xmemdupz(found, 16); - found += 17; - next = strchrnul(found, '\n'); - sigc->signer = xmemdupz(found, next - found); + /* The ERRSIG message is not followed by signer information */ + if (sigc-> result != 'E') { + found += 17; + next = strchrnul(found, '\n'); + sigc->signer = xmemdupz(found, next - found); + } } } } @@ -78,7 +78,8 @@ char *sha1_to_hex(const unsigned char *sha1) { static int bufno; static char hexbuffer[4][GIT_SHA1_HEXSZ + 1]; - return sha1_to_hex_r(hexbuffer[3 & ++bufno], sha1); + bufno = (bufno + 1) % ARRAY_SIZE(hexbuffer); + return sha1_to_hex_r(hexbuffer[bufno], sha1); } char *oid_to_hex(const struct object_id *oid) diff --git a/http-backend.c b/http-backend.c index adc8c8c3da..eef0a361f4 100644 --- a/http-backend.c +++ b/http-backend.c @@ -464,7 +464,7 @@ static void get_info_refs(struct strbuf *hdr, char *arg) hdr_str(hdr, content_type, buf.buf); end_headers(hdr); - packet_write(1, "# service=git-%s\n", svc->name); + packet_write_fmt(1, "# service=git-%s\n", svc->name); packet_flush(1); argv[0] = svc->name; @@ -372,7 +372,7 @@ static int http_options(const char *var, const char *value, void *cb) static void init_curl_http_auth(CURL *result) { - if (!http_auth.username) { + if (!http_auth.username || !*http_auth.username) { if (curl_empty_auth) curl_easy_setopt(result, CURLOPT_USERPWD, ":"); return; diff --git a/imap-send.c b/imap-send.c index adb9738c30..5c7e27a894 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1082,10 +1082,8 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *f cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap"); cred.host = xstrdup(srvc->host); - if (srvc->user) - cred.username = xstrdup(srvc->user); - if (srvc->pass) - cred.password = xstrdup(srvc->pass); + cred.username = xstrdup_or_null(srvc->user); + cred.password = xstrdup_or_null(srvc->pass); credential_fill(&cred); @@ -103,10 +103,8 @@ static void add_mapping(struct string_list *map, } else { struct mailmap_info *mi = xcalloc(1, sizeof(struct mailmap_info)); debug_mm("mailmap: adding (complex) entry for '%s'\n", old_email); - if (new_name) - mi->name = xstrdup(new_name); - if (new_email) - mi->email = xstrdup(new_email); + mi->name = xstrdup_or_null(new_name); + mi->email = xstrdup_or_null(new_email); string_list_insert(&me->namemap, old_name)->util = mi; } diff --git a/merge-recursive.c b/merge-recursive.c index 5200d5ccf8..9041c2f149 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -202,9 +202,9 @@ static void output_commit_title(struct merge_options *o, struct commit *commit) strbuf_addf(&o->obuf, "virtual %s\n", merge_remote_util(commit)->name); else { - strbuf_addf(&o->obuf, "%s ", - find_unique_abbrev(commit->object.oid.hash, - DEFAULT_ABBREV)); + strbuf_add_unique_abbrev(&o->obuf, commit->object.oid.hash, + DEFAULT_ABBREV); + strbuf_addch(&o->obuf, ' '); if (parse_commit(commit) != 0) strbuf_addstr(&o->obuf, _("(bad commit)\n")); else { diff --git a/pack-bitmap.c b/pack-bitmap.c index b949e51716..39bcc16846 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -266,7 +266,7 @@ static int open_pack_bitmap_1(struct packed_git *packfile) return -1; idx_name = pack_bitmap_filename(packfile); - fd = git_open_noatime(idx_name); + fd = git_open(idx_name); free(idx_name); if (fd < 0) diff --git a/parse-options-cb.c b/parse-options-cb.c index b5d920914e..b7d8f7dcb2 100644 --- a/parse-options-cb.c +++ b/parse-options-cb.c @@ -211,8 +211,7 @@ int parse_opt_passthru(const struct option *opt, const char *arg, int unset) if (recreate_opt(&sb, opt, arg, unset) < 0) return -1; - if (*opt_value) - free(*opt_value); + free(*opt_value); *opt_value = strbuf_detach(&sb, NULL); @@ -25,7 +25,8 @@ static struct strbuf *get_pathname(void) STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT }; static int index; - struct strbuf *sb = &pathname_array[3 & ++index]; + struct strbuf *sb = &pathname_array[index]; + index = (index + 1) % ARRAY_SIZE(pathname_array); strbuf_reset(sb); return sb; } diff --git a/pathspec.c b/pathspec.c index 86f2b449b1..22ca74a126 100644 --- a/pathspec.c +++ b/pathspec.c @@ -364,7 +364,7 @@ void parse_pathspec(struct pathspec *pathspec, { struct pathspec_item *item; const char *entry = argv ? *argv : NULL; - int i, n, prefixlen, nr_exclude = 0; + int i, n, prefixlen, warn_empty_string, nr_exclude = 0; memset(pathspec, 0, sizeof(*pathspec)); @@ -402,8 +402,15 @@ void parse_pathspec(struct pathspec *pathspec, } n = 0; - while (argv[n]) + warn_empty_string = 1; + while (argv[n]) { + if (*argv[n] == '\0' && warn_empty_string) { + warning(_("empty strings as pathspecs will be made invalid in upcoming releases. " + "please use . instead if you meant to match all paths")); + warn_empty_string = 0; + } n++; + } pathspec->nr = n; ALLOC_ARRAY(pathspec->items, n); diff --git a/perl/Git.pm b/perl/Git.pm index ce7e4e8da3..b2732822af 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -59,7 +59,7 @@ require Exporter; command_bidi_pipe command_close_bidi_pipe version exec_path html_path hash_object git_cmd_try remote_refs prompt - get_tz_offset + get_tz_offset get_record credential credential_read credential_write temp_acquire temp_is_locked temp_release temp_reset temp_path); @@ -538,6 +538,20 @@ sub get_tz_offset { return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]); } +=item get_record ( FILEHANDLE, INPUT_RECORD_SEPARATOR ) + +Read one record from FILEHANDLE delimited by INPUT_RECORD_SEPARATOR, +removing any trailing INPUT_RECORD_SEPARATOR. + +=cut + +sub get_record { + my ($fh, $rs) = @_; + local $/ = $rs; + my $rec = <$fh>; + chomp $rec if defined $rs; + $rec; +} =item prompt ( PROMPT , ISPASSWORD ) @@ -871,6 +885,8 @@ Return an array of mailboxes extracted from a string. =cut +# Very close to Mail::Address's parser, but we still have minor +# differences in some cases (see t9000 for examples). sub parse_mailboxes { my $re_comment = qr/\((?:[^)]*)\)/; my $re_quote = qr/"(?:[^\"\\]|\\.)*"/; @@ -879,6 +895,7 @@ sub parse_mailboxes { # divide the string in tokens of the above form my $re_token = qr/(?:$re_quote|$re_word|$re_comment|\S)/; my @tokens = map { $_ =~ /\s*($re_token)\s*/g } @_; + my $end_of_addr_seen = 0; # add a delimiter to simplify treatment for the last mailbox push @tokens, ","; @@ -888,10 +905,10 @@ sub parse_mailboxes { if ($token =~ /^[,;]$/) { # if buffer still contains undeterminated strings # append it at the end of @address or @phrase - if (@address) { - push @address, @buffer; - } else { + if ($end_of_addr_seen) { push @phrase, @buffer; + } else { + push @address, @buffer; } my $str_phrase = join ' ', @phrase; @@ -915,16 +932,16 @@ sub parse_mailboxes { push @addr_list, $str_mailbox if ($str_mailbox); @phrase = @address = @comment = @buffer = (); + $end_of_addr_seen = 0; } elsif ($token =~ /^\(/) { push @comment, $token; } elsif ($token eq "<") { push @phrase, (splice @address), (splice @buffer); } elsif ($token eq ">") { + $end_of_addr_seen = 1; push @address, (splice @buffer); - } elsif ($token eq "@") { + } elsif ($token eq "@" && !$end_of_addr_seen) { push @address, (splice @buffer), "@"; - } elsif ($token eq ".") { - push @address, (splice @buffer), "."; } else { push @buffer, $token; } diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 018beb85a0..711d2687a3 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -807,10 +807,15 @@ sub get_fetch_range { (++$min, $max); } +sub svn_dir { + command_oneline(qw(rev-parse --git-path svn)); +} + sub tmp_config { my (@args) = @_; - my $old_def_config = "$ENV{GIT_DIR}/svn/config"; - my $config = "$ENV{GIT_DIR}/svn/.metadata"; + my $svn_dir = svn_dir(); + my $old_def_config = "$svn_dir/config"; + my $config = "$svn_dir/.metadata"; if (! -f $config && -f $old_def_config) { rename $old_def_config, $config or die "Failed rename $old_def_config => $config: $!\n"; @@ -1658,7 +1663,17 @@ sub tie_for_persistent_memoization { if ($memo_backend > 0) { tie %$hash => 'Git::SVN::Memoize::YAML', "$path.yaml"; } else { - tie %$hash => 'Memoize::Storable', "$path.db", 'nstore'; + # first verify that any existing file can actually be loaded + # (it may have been saved by an incompatible version) + my $db = "$path.db"; + if (-e $db) { + use Storable qw(retrieve); + + if (!eval { retrieve($db); 1 }) { + unlink $db or die "unlink $db failed: $!"; + } + } + tie %$hash => 'Memoize::Storable', $db, 'nstore'; } } @@ -1671,7 +1686,7 @@ sub tie_for_persistent_memoization { return if $memoized; $memoized = 1; - my $cache_path = "$ENV{GIT_DIR}/svn/.caches/"; + my $cache_path = svn_dir() . '/.caches/'; mkpath([$cache_path]) unless -d $cache_path; my %lookup_svn_merge_cache; @@ -1712,7 +1727,7 @@ sub tie_for_persistent_memoization { sub clear_memoized_mergeinfo_caches { die "Only call this method in non-memoized context" if ($memoized); - my $cache_path = "$ENV{GIT_DIR}/svn/.caches/"; + my $cache_path = svn_dir() . '/.caches/'; return unless -d $cache_path; for my $cache_file (("$cache_path/lookup_svn_merge", @@ -2446,12 +2461,13 @@ sub _new { "refs/remotes/$prefix$default_ref_id"; } $_[1] = $repo_id; - my $dir = "$ENV{GIT_DIR}/svn/$ref_id"; + my $svn_dir = svn_dir(); + my $dir = "$svn_dir/$ref_id"; - # Older repos imported by us used $GIT_DIR/svn/foo instead of - # $GIT_DIR/svn/refs/remotes/foo when tracking refs/remotes/foo + # Older repos imported by us used $svn_dir/foo instead of + # $svn_dir/refs/remotes/foo when tracking refs/remotes/foo if ($ref_id =~ m{^refs/remotes/(.+)}) { - my $old_dir = "$ENV{GIT_DIR}/svn/$1"; + my $old_dir = "$svn_dir/$1"; if (-d $old_dir && ! -d $dir) { $dir = $old_dir; } @@ -2461,7 +2477,7 @@ sub _new { mkpath([$dir]); my $obj = bless { ref_id => $ref_id, dir => $dir, index => "$dir/index", - config => "$ENV{GIT_DIR}/svn/config", + config => "$svn_dir/config", map_root => "$dir/.rev_map", repo_id => $repo_id }, $class; # Ensure it gets canonicalized diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm index 4c4199afec..0df16ed726 100644 --- a/perl/Git/SVN/Editor.pm +++ b/perl/Git/SVN/Editor.pm @@ -7,7 +7,9 @@ use SVN::Delta; use Carp qw/croak/; use Git qw/command command_oneline command_noisy command_output_pipe command_input_pipe command_close_pipe - command_bidi_pipe command_close_bidi_pipe/; + command_bidi_pipe command_close_bidi_pipe + get_record/; + BEGIN { @ISA = qw(SVN::Delta::Editor); } @@ -57,11 +59,9 @@ sub generate_diff { push @diff_tree, "-l$_rename_limit" if defined $_rename_limit; push @diff_tree, $tree_a, $tree_b; my ($diff_fh, $ctx) = command_output_pipe(@diff_tree); - local $/ = "\0"; my $state = 'meta'; my @mods; - while (<$diff_fh>) { - chomp $_; # this gets rid of the trailing "\0" + while (defined($_ = get_record($diff_fh, "\0"))) { if ($state eq 'meta' && /^:(\d{6})\s(\d{6})\s ($::sha1)\s($::sha1)\s ([MTCRAD])\d*$/xo) { @@ -173,9 +173,7 @@ sub rmdirs { my ($fh, $ctx) = command_output_pipe(qw/ls-tree --name-only -r -z/, $self->{tree_b}); - local $/ = "\0"; - while (<$fh>) { - chomp; + while (defined($_ = get_record($fh, "\0"))) { my @dn = split m#/#, $_; while (pop @dn) { delete $rm->{join '/', @dn}; diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm index d8c21ad915..64e900a0e9 100644 --- a/perl/Git/SVN/Fetcher.pm +++ b/perl/Git/SVN/Fetcher.pm @@ -9,7 +9,8 @@ use Carp qw/croak/; use File::Basename qw/dirname/; use Git qw/command command_oneline command_noisy command_output_pipe command_input_pipe command_close_pipe - command_bidi_pipe command_close_bidi_pipe/; + command_bidi_pipe command_close_bidi_pipe + get_record/; BEGIN { @ISA = qw(SVN::Delta::Editor); } @@ -86,11 +87,9 @@ sub _mark_empty_symlinks { my $printed_warning; chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`); my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt); - local $/ = "\0"; my $pfx = defined($switch_path) ? $switch_path : $git_svn->path; $pfx .= '/' if length($pfx); - while (<$ls>) { - chomp; + while (defined($_ = get_record($ls, "\0"))) { s/\A100644 blob $empty_blob\t//o or next; unless ($printed_warning) { print STDERR "Scanning for empty symlinks, ", @@ -179,9 +178,7 @@ sub delete_entry { my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r --name-only -z/, $tree); - local $/ = "\0"; - while (<$ls>) { - chomp; + while (defined($_ = get_record($ls, "\0"))) { my $rmpath = "$gpath/$_"; $self->{gii}->remove($rmpath); print "\tD\t$rmpath\n" unless $::_q; @@ -247,9 +244,7 @@ sub add_directory { my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r --name-only -z/, $self->{c}); - local $/ = "\0"; - while (<$ls>) { - chomp; + while (defined($_ = get_record($ls, "\0"))) { $self->{gii}->remove($_); print "\tD\t$_\n" unless $::_q; push @deleted_gpath, $gpath; diff --git a/perl/Git/SVN/Migration.pm b/perl/Git/SVN/Migration.pm index cf6ffa7581..dc90f6a621 100644 --- a/perl/Git/SVN/Migration.pm +++ b/perl/Git/SVN/Migration.pm @@ -44,7 +44,9 @@ use Git qw( command_noisy command_output_pipe command_close_pipe + command_oneline ); +use Git::SVN; sub migrate_from_v0 { my $git_dir = $ENV{GIT_DIR}; @@ -55,7 +57,9 @@ sub migrate_from_v0 { chomp; my ($id, $orig_ref) = ($_, $_); next unless $id =~ s#^refs/heads/(.+)-HEAD$#$1#; - next unless -f "$git_dir/$id/info/url"; + my $info_url = command_oneline(qw(rev-parse --git-path), + "$id/info/url"); + next unless -f $info_url; my $new_ref = "refs/remotes/$id"; if (::verify_ref("$new_ref^0")) { print STDERR "W: $orig_ref is probably an old ", @@ -82,7 +86,7 @@ sub migrate_from_v1 { my $git_dir = $ENV{GIT_DIR}; my $migrated = 0; return $migrated unless -d $git_dir; - my $svn_dir = "$git_dir/svn"; + my $svn_dir = Git::SVN::svn_dir(); # just in case somebody used 'svn' as their $id at some point... return $migrated if -d $svn_dir && ! -f "$svn_dir/info/url"; @@ -97,27 +101,28 @@ sub migrate_from_v1 { my $x = $_; next unless $x =~ s#^refs/remotes/##; chomp $x; - next unless -f "$git_dir/$x/info/url"; - my $u = eval { ::file_to_s("$git_dir/$x/info/url") }; + my $info_url = command_oneline(qw(rev-parse --git-path), + "$x/info/url"); + next unless -f $info_url; + my $u = eval { ::file_to_s($info_url) }; next unless $u; - my $dn = dirname("$git_dir/svn/$x"); + my $dn = dirname("$svn_dir/$x"); mkpath([$dn]) unless -d $dn; if ($x eq 'svn') { # they used 'svn' as GIT_SVN_ID: - mkpath(["$git_dir/svn/svn"]); + mkpath(["$svn_dir/svn"]); print STDERR " - $git_dir/$x/info => ", - "$git_dir/svn/$x/info\n"; - rename "$git_dir/$x/info", "$git_dir/svn/$x/info" or + "$svn_dir/$x/info\n"; + rename "$git_dir/$x/info", "$svn_dir/$x/info" or croak "$!: $x"; # don't worry too much about these, they probably # don't exist with repos this old (save for index, # and we can easily regenerate that) foreach my $f (qw/unhandled.log index .rev_db/) { - rename "$git_dir/$x/$f", "$git_dir/svn/$x/$f"; + rename "$git_dir/$x/$f", "$svn_dir/$x/$f"; } } else { - print STDERR " - $git_dir/$x => $git_dir/svn/$x\n"; - rename "$git_dir/$x", "$git_dir/svn/$x" or - croak "$!: $x"; + print STDERR " - $git_dir/$x => $svn_dir/$x\n"; + rename "$git_dir/$x", "$svn_dir/$x" or croak "$!: $x"; } $migrated++; } @@ -139,9 +144,10 @@ sub read_old_urls { push @dir, $_; } } + my $svn_dir = Git::SVN::svn_dir(); foreach (@dir) { my $x = $_; - $x =~ s!^\Q$ENV{GIT_DIR}\E/svn/!!o; + $x =~ s!^\Q$svn_dir\E/!!o; read_old_urls($l_map, $x, $_); } } @@ -150,7 +156,7 @@ sub migrate_from_v2 { my @cfg = command(qw/config -l/); return if grep /^svn-remote\..+\.url=/, @cfg; my %l_map; - read_old_urls(\%l_map, '', "$ENV{GIT_DIR}/svn"); + read_old_urls(\%l_map, '', Git::SVN::svn_dir()); my $migrated = 0; require Git::SVN; @@ -239,7 +245,8 @@ sub minimize_connections { } } if (@emptied) { - my $file = $ENV{GIT_CONFIG} || "$ENV{GIT_DIR}/config"; + my $file = $ENV{GIT_CONFIG} || + command_oneline(qw(rev-parse --git-path config)); print STDERR <<EOF; The following [svn-remote] sections in your config file ($file) are empty and can be safely removed: diff --git a/pkt-line.c b/pkt-line.c index 30489c60b1..d4b6bfe076 100644 --- a/pkt-line.c +++ b/pkt-line.c @@ -91,16 +91,34 @@ void packet_flush(int fd) write_or_die(fd, "0000", 4); } +int packet_flush_gently(int fd) +{ + packet_trace("0000", 4, 1); + if (write_in_full(fd, "0000", 4) == 4) + return 0; + return error("flush packet write failed"); +} + void packet_buf_flush(struct strbuf *buf) { packet_trace("0000", 4, 1); strbuf_add(buf, "0000", 4); } -#define hex(a) (hexchar[(a) & 15]) -static void format_packet(struct strbuf *out, const char *fmt, va_list args) +static void set_packet_header(char *buf, const int size) { static char hexchar[] = "0123456789abcdef"; + + #define hex(a) (hexchar[(a) & 15]) + buf[0] = hex(size >> 12); + buf[1] = hex(size >> 8); + buf[2] = hex(size >> 4); + buf[3] = hex(size); + #undef hex +} + +static void format_packet(struct strbuf *out, const char *fmt, va_list args) +{ size_t orig_len, n; orig_len = out->len; @@ -111,23 +129,63 @@ static void format_packet(struct strbuf *out, const char *fmt, va_list args) if (n > LARGE_PACKET_MAX) die("protocol error: impossibly long line"); - out->buf[orig_len + 0] = hex(n >> 12); - out->buf[orig_len + 1] = hex(n >> 8); - out->buf[orig_len + 2] = hex(n >> 4); - out->buf[orig_len + 3] = hex(n); + set_packet_header(&out->buf[orig_len], n); packet_trace(out->buf + orig_len + 4, n - 4, 1); } -void packet_write(int fd, const char *fmt, ...) +static int packet_write_fmt_1(int fd, int gently, + const char *fmt, va_list args) +{ + struct strbuf buf = STRBUF_INIT; + ssize_t count; + + format_packet(&buf, fmt, args); + count = write_in_full(fd, buf.buf, buf.len); + if (count == buf.len) + return 0; + + if (!gently) { + check_pipe(errno); + die_errno("packet write with format failed"); + } + return error("packet write with format failed"); +} + +void packet_write_fmt(int fd, const char *fmt, ...) { - static struct strbuf buf = STRBUF_INIT; va_list args; - strbuf_reset(&buf); va_start(args, fmt); - format_packet(&buf, fmt, args); + packet_write_fmt_1(fd, 0, fmt, args); + va_end(args); +} + +int packet_write_fmt_gently(int fd, const char *fmt, ...) +{ + int status; + va_list args; + + va_start(args, fmt); + status = packet_write_fmt_1(fd, 1, fmt, args); va_end(args); - write_or_die(fd, buf.buf, buf.len); + return status; +} + +static int packet_write_gently(const int fd_out, const char *buf, size_t size) +{ + static char packet_write_buffer[LARGE_PACKET_MAX]; + size_t packet_size; + + if (size > sizeof(packet_write_buffer) - 4) + return error("packet write failed - data exceeds max packet size"); + + packet_trace(buf, size, 1); + packet_size = size + 4; + set_packet_header(packet_write_buffer, packet_size); + memcpy(packet_write_buffer + 4, buf, size); + if (write_in_full(fd_out, packet_write_buffer, packet_size) == packet_size) + return 0; + return error("packet write failed"); } void packet_buf_write(struct strbuf *buf, const char *fmt, ...) @@ -139,6 +197,46 @@ void packet_buf_write(struct strbuf *buf, const char *fmt, ...) va_end(args); } +int write_packetized_from_fd(int fd_in, int fd_out) +{ + static char buf[LARGE_PACKET_DATA_MAX]; + int err = 0; + ssize_t bytes_to_write; + + while (!err) { + bytes_to_write = xread(fd_in, buf, sizeof(buf)); + if (bytes_to_write < 0) + return COPY_READ_ERROR; + if (bytes_to_write == 0) + break; + err = packet_write_gently(fd_out, buf, bytes_to_write); + } + if (!err) + err = packet_flush_gently(fd_out); + return err; +} + +int write_packetized_from_buf(const char *src_in, size_t len, int fd_out) +{ + int err = 0; + size_t bytes_written = 0; + size_t bytes_to_write; + + while (!err) { + if ((len - bytes_written) > LARGE_PACKET_DATA_MAX) + bytes_to_write = LARGE_PACKET_DATA_MAX; + else + bytes_to_write = len - bytes_written; + if (bytes_to_write == 0) + break; + err = packet_write_gently(fd_out, src_in + bytes_written, bytes_to_write); + bytes_written += bytes_to_write; + } + if (!err) + err = packet_flush_gently(fd_out); + return err; +} + static int get_packet_data(int fd, char **src_buf, size_t *src_size, void *dst, unsigned size, int options) { @@ -229,3 +327,35 @@ char *packet_read_line_buf(char **src, size_t *src_len, int *dst_len) { return packet_read_line_generic(-1, src, src_len, dst_len); } + +ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out) +{ + int packet_len; + + size_t orig_len = sb_out->len; + size_t orig_alloc = sb_out->alloc; + + for (;;) { + strbuf_grow(sb_out, LARGE_PACKET_DATA_MAX); + packet_len = packet_read(fd_in, NULL, NULL, + /* strbuf_grow() above always allocates one extra byte to + * store a '\0' at the end of the string. packet_read() + * writes a '\0' extra byte at the end, too. Let it know + * that there is already room for the extra byte. + */ + sb_out->buf + sb_out->len, LARGE_PACKET_DATA_MAX+1, + PACKET_READ_GENTLE_ON_EOF); + if (packet_len <= 0) + break; + sb_out->len += packet_len; + } + + if (packet_len < 0) { + if (orig_alloc == 0) + strbuf_release(sb_out); + else + strbuf_setlen(sb_out, orig_len); + return packet_len; + } + return sb_out->len - orig_len; +} diff --git a/pkt-line.h b/pkt-line.h index 3cb9d91baa..18eac64830 100644 --- a/pkt-line.h +++ b/pkt-line.h @@ -20,9 +20,13 @@ * side can't, we stay with pure read/write interfaces. */ void packet_flush(int fd); -void packet_write(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3))); void packet_buf_flush(struct strbuf *buf); void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +int packet_flush_gently(int fd); +int packet_write_fmt_gently(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +int write_packetized_from_fd(int fd_in, int fd_out); +int write_packetized_from_buf(const char *src_in, size_t len, int fd_out); /* * Read a packetized line into the buffer, which must be at least size bytes @@ -75,8 +79,14 @@ char *packet_read_line(int fd, int *size); */ char *packet_read_line_buf(char **src_buf, size_t *src_len, int *size); +/* + * Reads a stream of variable sized packets until a flush packet is detected. + */ +ssize_t read_packetized_to_strbuf(int fd_in, struct strbuf *sb_out); + #define DEFAULT_PACKET_MAX 1000 #define LARGE_PACKET_MAX 65520 +#define LARGE_PACKET_DATA_MAX (LARGE_PACKET_MAX - 4) extern char packet_buffer[LARGE_PACKET_MAX]; #endif @@ -1,13 +1,13 @@ # German translations for Git. -# Copyright (C) 2010-2015 Ralf Thielow <ralf.thielow@gmail.com> +# Copyright (C) 2010-2016 Ralf Thielow <ralf.thielow@gmail.com> # This file is distributed under the same license as the Git package. -# Ralf Thielow <ralf.thielow@gmail.com>, 2010-2015. +# Ralf Thielow <ralf.thielow@gmail.com>, 2010-2016. # msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2016-05-24 23:42+0800\n" +"POT-Creation-Date: 2016-08-27 23:21+0800\n" "PO-Revision-Date: 2015-01-21 15:01+0800\n" "Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n" "Language-Team: German <>\n" @@ -22,7 +22,32 @@ msgstr "" msgid "hint: %.*s\n" msgstr "Hinweis: %.*s\n" -#: advice.c:88 +#: advice.c:83 +msgid "Cherry-picking is not possible because you have unmerged files." +msgstr "Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:85 +msgid "Committing is not possible because you have unmerged files." +msgstr "Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:87 +msgid "Merging is not possible because you have unmerged files." +msgstr "Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:89 +msgid "Pulling is not possible because you have unmerged files." +msgstr "Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:91 +msgid "Reverting is not possible because you have unmerged files." +msgstr "Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:93 +#, c-format +msgid "It is not possible to %s because you have unmerged files." +msgstr "%s ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." + +#: advice.c:101 msgid "" "Fix them up in the work tree, and then use 'git add/rm <file>'\n" "as appropriate to mark resolution and make a commit." @@ -31,18 +56,52 @@ msgstr "" "dann 'git add/rm <Datei>', um die Auflösung entsprechend zu markieren\n" "und zu committen." -#: advice.c:101 builtin/merge.c:1238 +#: advice.c:109 +msgid "Exiting because of an unresolved conflict." +msgstr "Beende wegen unaufgelöstem Konflikt." + +#: advice.c:114 builtin/merge.c:1181 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)." -#: advice.c:103 +#: advice.c:116 msgid "Please, commit your changes before merging." msgstr "Bitte committen Sie Ihre Änderungen, bevor Sie mergen." -#: advice.c:104 +#: advice.c:117 msgid "Exiting because of unfinished merge." msgstr "Beende wegen nicht abgeschlossenem Merge." +#: advice.c:123 +#, c-format +msgid "" +"Note: checking out '%s'.\n" +"\n" +"You are in 'detached HEAD' state. You can look around, make experimental\n" +"changes and commit them, and you can discard any commits you make in this\n" +"state without impacting any branches by performing another checkout.\n" +"\n" +"If you want to create a new branch to retain commits you create, you may\n" +"do so (now or later) by using -b with the checkout command again. Example:\n" +"\n" +" git checkout -b <new-branch-name>\n" +"\n" +msgstr "" +"Hinweis: Checke '%s' aus.\n" +"\n" +"Sie befinden sich im Zustand eines 'lösgelösten HEAD'. Sie können sich\n" +"umschauen, experimentelle Änderungen vornehmen und diese committen, und\n" +"Sie können alle möglichen Commits, die Sie in diesem Zustand machen,\n" +"ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie einen\n" +"weiteren Checkout durchführen.\n" +"\n" +"Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits\n" +"zu behalten, können Sie das (jetzt oder später) durch einen weiteren Checkout\n" +"mit der Option -b tun. Beispiel:\n" +"\n" +" git checkout -b <neuer-Branchname>\n" +"\n" + #: archive.c:12 msgid "git archive [<options>] <tree-ish> [<path>...]" msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]" @@ -62,7 +121,7 @@ msgstr "" msgid "git archive --remote <repo> [--exec <cmd>] --list" msgstr "git archive --remote <Repository> [--exec <Programm>] --list" -#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327 +#: archive.c:344 builtin/add.c:139 builtin/add.c:435 builtin/rm.c:327 #, c-format msgid "pathspec '%s' did not match any files" msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein" @@ -75,7 +134,7 @@ msgstr "Format" msgid "archive format" msgstr "Archivformat" -#: archive.c:430 builtin/log.c:1395 +#: archive.c:430 builtin/log.c:1422 msgid "prefix" msgstr "Präfix" @@ -83,10 +142,10 @@ msgstr "Präfix" msgid "prepend prefix to each pathname in the archive" msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen" -#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2548 builtin/blame.c:2549 -#: builtin/config.c:60 builtin/fast-export.c:987 builtin/fast-export.c:989 -#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:459 -#: builtin/ls-files.c:462 builtin/notes.c:398 builtin/notes.c:561 +#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2553 builtin/blame.c:2554 +#: builtin/config.c:59 builtin/fast-export.c:987 builtin/fast-export.c:989 +#: builtin/grep.c:722 builtin/hash-object.c:100 builtin/ls-files.c:460 +#: builtin/ls-files.c:463 builtin/notes.c:399 builtin/notes.c:562 #: builtin/read-tree.c:109 parse-options.h:153 msgid "file" msgstr "Datei" @@ -120,7 +179,7 @@ msgid "list supported archive formats" msgstr "unterstützte Archivformate auflisten" #: archive.c:451 builtin/archive.c:90 builtin/clone.c:82 -#: builtin/submodule--helper.c:776 +#: builtin/submodule--helper.c:832 msgid "repo" msgstr "Repository" @@ -128,7 +187,7 @@ msgstr "Repository" msgid "retrieve the archive from remote repository <repo>" msgstr "Archiv vom Remote-Repository <Repository> abrufen" -#: archive.c:453 builtin/archive.c:92 builtin/notes.c:482 +#: archive.c:453 builtin/archive.c:92 builtin/notes.c:483 msgid "command" msgstr "Programm" @@ -136,6 +195,28 @@ msgstr "Programm" msgid "path to the remote git-upload-archive command" msgstr "Pfad zum externen \"git-upload-archive\"-Programm" +#: archive.c:461 +msgid "Unexpected option --remote" +msgstr "Unerwartete Option --remote" + +#: archive.c:463 +msgid "Option --exec can only be used together with --remote" +msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden." + +#: archive.c:465 +msgid "Unexpected option --output" +msgstr "Unerwartete Option --output" + +#: archive.c:487 +#, c-format +msgid "Unknown archive format '%s'" +msgstr "Unbekanntes Archivformat '%s'" + +#: archive.c:494 +#, c-format +msgid "Argument not supported for format '%s': -%d" +msgstr "Argument für Format '%s' nicht unterstützt: -%d" + #: attr.c:263 msgid "" "Negative patterns are ignored in git attributes\n" @@ -144,6 +225,130 @@ msgstr "" "Verneinende Muster werden in Git-Attributen ignoriert.\n" "Benutzen Sie '\\!' für führende Ausrufezeichen." +#: bisect.c:441 +#, c-format +msgid "Could not open file '%s'" +msgstr "Konnte Datei '%s' nicht öffnen" + +#: bisect.c:446 +#, c-format +msgid "Badly quoted content in file '%s': %s" +msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s" + +#: bisect.c:655 +#, c-format +msgid "We cannot bisect more!\n" +msgstr "Keine binäre Suche mehr möglich!\n" + +#: bisect.c:708 +#, c-format +msgid "Not a valid commit name %s" +msgstr "%s ist kein gültiger Commit-Name" + +#: bisect.c:732 +#, c-format +msgid "" +"The merge base %s is bad.\n" +"This means the bug has been fixed between %s and [%s].\n" +msgstr "" +"Die Merge-Basis %s ist fehlerhaft.\n" +"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n" + +#: bisect.c:737 +#, c-format +msgid "" +"The merge base %s is new.\n" +"The property has changed between %s and [%s].\n" +msgstr "" +"Die Merge-Basis %s ist neu.\n" +"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n" + +#: bisect.c:742 +#, c-format +msgid "" +"The merge base %s is %s.\n" +"This means the first '%s' commit is between %s and [%s].\n" +msgstr "" +"Die Merge-Basis %s ist %s.\n" +"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s]\n" + +#: bisect.c:750 +#, c-format +msgid "" +"Some %s revs are not ancestor of the %s rev.\n" +"git bisect cannot work properly in this case.\n" +"Maybe you mistook %s and %s revs?\n" +msgstr "" +"Manche %s Commits sind keine Vorgänger des %s Commits.\n" +"git bisect kann in diesem Fall nicht richtig arbeiten.\n" +"Vielleicht verwechselten Sie %s und %s Commits?\n" + +#: bisect.c:763 +#, c-format +msgid "" +"the merge base between %s and [%s] must be skipped.\n" +"So we cannot be sure the first %s commit is between %s and %s.\n" +"We continue anyway." +msgstr "" +"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n" +"Es kann daher nicht sichergestellt werden, dass sich der\n" +"erste %s Commit zwischen %s und %s befindet.\n" +"Es wird dennoch fortgesetzt." + +#: bisect.c:798 +#, c-format +msgid "Bisecting: a merge base must be tested\n" +msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n" + +#: bisect.c:849 +#, c-format +msgid "a %s revision is needed" +msgstr "ein %s Commit wird benötigt" + +#: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248 +#, c-format +msgid "could not create file '%s'" +msgstr "konnte Datei '%s' nicht erstellen" + +#: bisect.c:917 +#, c-format +msgid "could not read file '%s'" +msgstr "Konnte Datei '%s' nicht lesen" + +#: bisect.c:947 +msgid "reading bisect refs failed" +msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen" + +#: bisect.c:967 +#, c-format +msgid "%s was both %s and %s\n" +msgstr "%s war sowohl %s als auch %s\n" + +#: bisect.c:975 +#, c-format +msgid "" +"No testable commit found.\n" +"Maybe you started with bad path parameters?\n" +msgstr "" +"Kein testbarer Commit gefunden.\n" +"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n" + +#: bisect.c:994 +#, c-format +msgid "(roughly %d step)" +msgid_plural "(roughly %d steps)" +msgstr[0] "(ungefähr %d Schritt)" +msgstr[1] "(ungefähr %d Schritte)" + +#. TRANSLATORS: the last %s will be replaced with +#. "(roughly %d steps)" translation +#: bisect.c:998 +#, c-format +msgid "Bisecting: %d revision left to test after this %s\n" +msgid_plural "Bisecting: %d revisions left to test after this %s\n" +msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n" +msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n" + #: branch.c:53 #, c-format msgid "" @@ -298,7 +503,7 @@ msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus" msgid "unrecognized header: %s%s (%d)" msgstr "nicht erkannter Kopfbereich: %s%s (%d)" -#: bundle.c:87 builtin/commit.c:777 +#: bundle.c:87 builtin/commit.c:778 #, c-format msgid "could not open '%s'" msgstr "Konnte '%s' nicht öffnen" @@ -307,10 +512,10 @@ msgstr "Konnte '%s' nicht öffnen" msgid "Repository lacks these prerequisite commits:" msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:" -#: bundle.c:163 ref-filter.c:1462 sequencer.c:627 sequencer.c:1073 -#: builtin/blame.c:2755 builtin/commit.c:1056 builtin/log.c:340 -#: builtin/log.c:863 builtin/log.c:1308 builtin/log.c:1633 builtin/log.c:1875 -#: builtin/merge.c:361 builtin/shortlog.c:170 +#: bundle.c:163 ref-filter.c:1462 sequencer.c:630 sequencer.c:1085 +#: builtin/blame.c:2763 builtin/commit.c:1057 builtin/log.c:348 +#: builtin/log.c:890 builtin/log.c:1336 builtin/log.c:1659 builtin/log.c:1901 +#: builtin/merge.c:356 builtin/shortlog.c:170 msgid "revision walk setup failed" msgstr "Einrichtung des Revisionsgangs fehlgeschlagen" @@ -349,7 +554,7 @@ msgstr "\"rev-list\" abgebrochen" msgid "ref '%s' is excluded by the rev-list options" msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen" -#: bundle.c:443 builtin/log.c:163 builtin/log.c:1538 builtin/shortlog.c:273 +#: bundle.c:443 builtin/log.c:165 builtin/log.c:1565 builtin/shortlog.c:273 #, c-format msgid "unrecognized argument: %s" msgstr "nicht erkanntes Argument: %s" @@ -367,13 +572,13 @@ msgstr "kann '%s' nicht erstellen" msgid "index-pack died" msgstr "Erstellung der Paketindexdatei abgebrochen" -#: color.c:275 +#: color.c:290 #, c-format msgid "invalid color value: %.*s" msgstr "Ungültiger Farbwert: %.*s" -#: commit.c:40 builtin/am.c:437 builtin/am.c:473 builtin/am.c:1504 -#: builtin/am.c:2134 +#: commit.c:40 builtin/am.c:433 builtin/am.c:469 builtin/am.c:1505 +#: builtin/am.c:2119 #, c-format msgid "could not parse %s" msgstr "konnte %s nicht parsen" @@ -387,132 +592,194 @@ msgstr "%s %s ist kein Commit!" msgid "memory exhausted" msgstr "Speicher verbraucht" -#: config.c:475 config.c:477 +#: config.c:516 +#, c-format +msgid "bad config line %d in blob %s" +msgstr "Ungültige Konfigurationszeile %d in Blob %s" + +#: config.c:520 +#, c-format +msgid "bad config line %d in file %s" +msgstr "Ungültige Konfigurationszeile %d in Datei %s" + +#: config.c:524 #, c-format -msgid "bad config line %d in %s %s" -msgstr "Zeile %d in Konfiguration %s %s ist ungültig." +msgid "bad config line %d in standard input" +msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe" -#: config.c:593 +#: config.c:528 #, c-format -msgid "bad numeric config value '%s' for '%s' in %s %s: %s" -msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s" +msgid "bad config line %d in submodule-blob %s" +msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s" -#: config.c:595 +#: config.c:532 +#, c-format +msgid "bad config line %d in command line %s" +msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s" + +#: config.c:536 +#, c-format +msgid "bad config line %d in %s" +msgstr "Ungültige Konfigurationszeile %d in %s" + +#: config.c:655 +msgid "out of range" +msgstr "Außerhalb des Bereichs" + +#: config.c:655 +msgid "invalid unit" +msgstr "Ungültige Einheit" + +#: config.c:661 #, c-format msgid "bad numeric config value '%s' for '%s': %s" msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s" -#: config.c:680 +#: config.c:666 +#, c-format +msgid "bad numeric config value '%s' for '%s' in blob %s: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s" + +#: config.c:669 +#, c-format +msgid "bad numeric config value '%s' for '%s' in file %s: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s" + +#: config.c:672 +#, c-format +msgid "bad numeric config value '%s' for '%s' in standard input: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: %s" + +#: config.c:675 +#, c-format +msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: %s" + +#: config.c:678 +#, c-format +msgid "bad numeric config value '%s' for '%s' in command line %s: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: %s" + +#: config.c:681 +#, c-format +msgid "bad numeric config value '%s' for '%s' in %s: %s" +msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s: %s" + +#: config.c:768 #, c-format msgid "failed to expand user dir in: '%s'" msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'" -#: config.c:761 config.c:772 +#: config.c:849 config.c:860 #, c-format msgid "bad zlib compression level %d" msgstr "ungültiger zlib Komprimierungsgrad %d" -#: config.c:890 +#: config.c:978 #, c-format msgid "invalid mode for object creation: %s" msgstr "Ungültiger Modus für Objekterstellung: %s" -#: config.c:1228 +#: config.c:1312 msgid "unable to parse command-line config" msgstr "" "Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen." -#: config.c:1284 -msgid "unknown error occured while reading the configuration files" +#: config.c:1362 +msgid "unknown error occurred while reading the configuration files" msgstr "" "Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf." -#: config.c:1629 +#: config.c:1716 #, c-format msgid "unable to parse '%s' from command-line config" msgstr "" "Konnte Wert '%s' aus der über die Befehlszeile angegebenen Konfiguration\n" "nicht parsen." -#: config.c:1631 +#: config.c:1718 #, c-format msgid "bad config variable '%s' in file '%s' at line %d" msgstr "ungültige Konfigurationsvariable '%s' in Datei '%s' bei Zeile %d" -#: config.c:1690 +#: config.c:1777 #, c-format msgid "%s has multiple values" msgstr "%s hat mehrere Werte" -#: config.c:2224 +#: config.c:2311 #, c-format msgid "could not set '%s' to '%s'" msgstr "Konnte '%s' nicht zu '%s' setzen." -#: config.c:2226 +#: config.c:2313 #, c-format msgid "could not unset '%s'" msgstr "Konnte '%s' nicht aufheben." -#: connected.c:69 +#: connected.c:63 builtin/fsck.c:173 builtin/prune.c:140 +msgid "Checking connectivity" +msgstr "Prüfe Konnektivität" + +#: connected.c:74 msgid "Could not run 'git rev-list'" msgstr "Konnte 'git rev-list' nicht ausführen" -#: connected.c:89 +#: connected.c:94 msgid "failed write to rev-list" msgstr "Fehler beim Schreiben nach rev-list" -#: connected.c:96 +#: connected.c:101 msgid "failed to close rev-list's stdin" msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe" -#: date.c:95 +#: date.c:97 msgid "in the future" msgstr "in der Zukunft" -#: date.c:101 +#: date.c:103 #, c-format msgid "%lu second ago" msgid_plural "%lu seconds ago" msgstr[0] "vor %lu Sekunde" msgstr[1] "vor %lu Sekunden" -#: date.c:108 +#: date.c:110 #, c-format msgid "%lu minute ago" msgid_plural "%lu minutes ago" msgstr[0] "vor %lu Minute" msgstr[1] "vor %lu Minuten" -#: date.c:115 +#: date.c:117 #, c-format msgid "%lu hour ago" msgid_plural "%lu hours ago" msgstr[0] "vor %lu Stunde" msgstr[1] "vor %lu Stunden" -#: date.c:122 +#: date.c:124 #, c-format msgid "%lu day ago" msgid_plural "%lu days ago" msgstr[0] "vor %lu Tag" msgstr[1] "vor %lu Tagen" -#: date.c:128 +#: date.c:130 #, c-format msgid "%lu week ago" msgid_plural "%lu weeks ago" msgstr[0] "vor %lu Woche" msgstr[1] "vor %lu Wochen" -#: date.c:135 +#: date.c:137 #, c-format msgid "%lu month ago" msgid_plural "%lu months ago" msgstr[0] "vor %lu Monat" msgstr[1] "vor %lu Monaten" -#: date.c:146 +#: date.c:148 #, c-format msgid "%lu year" msgid_plural "%lu years" @@ -520,14 +787,14 @@ msgstr[0] "vor %lu Jahr" msgstr[1] "vor %lu Jahren" #. TRANSLATORS: "%s" is "<n> years" -#: date.c:149 +#: date.c:151 #, c-format msgid "%s, %lu month ago" msgid_plural "%s, %lu months ago" msgstr[0] "%s, und %lu Monat" msgstr[1] "%s, und %lu Monaten" -#: date.c:154 date.c:159 +#: date.c:156 date.c:161 #, c-format msgid "%lu year ago" msgid_plural "%lu years ago" @@ -539,7 +806,7 @@ msgstr[1] "vor %lu Jahren" msgid "failed to read orderfile '%s'" msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'." -#: diffcore-rename.c:538 +#: diffcore-rename.c:540 msgid "Performing inexact rename detection" msgstr "Führe Erkennung für ungenaue Umbenennung aus" @@ -568,16 +835,16 @@ msgstr "" "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n" "%s" -#: diff.c:3007 +#: diff.c:3017 #, c-format msgid "external diff died, stopping at %s" msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s" -#: diff.c:3405 +#: diff.c:3415 msgid "--follow requires exactly one pathspec" msgstr "--follow erfordert genau eine Pfadspezifikation" -#: diff.c:3568 +#: diff.c:3578 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -586,7 +853,7 @@ msgstr "" "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n" "%s" -#: diff.c:3582 +#: diff.c:3592 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'" @@ -601,39 +868,30 @@ msgstr "" "Cache für unversionierte Dateien ist auf diesem System oder\n" "für dieses Verzeichnis deaktiviert." -#: gpg-interface.c:166 gpg-interface.c:235 -msgid "could not run gpg." -msgstr "konnte gpg nicht ausführen" - #: gpg-interface.c:178 -msgid "gpg did not accept the data" -msgstr "gpg hat die Daten nicht akzeptiert" - -#: gpg-interface.c:189 msgid "gpg failed to sign the data" msgstr "gpg beim Signieren der Daten fehlgeschlagen" -#: gpg-interface.c:222 -#, c-format -msgid "could not create temporary file '%s'" -msgstr "konnte temporäre Datei '%s' nicht erstellen" +#: gpg-interface.c:208 +msgid "could not create temporary file" +msgstr "konnte temporäre Datei nicht erstellen" -#: gpg-interface.c:224 +#: gpg-interface.c:210 #, c-format msgid "failed writing detached signature to '%s'" msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'" -#: grep.c:1718 +#: grep.c:1792 #, c-format msgid "'%s': unable to read %s" msgstr "'%s': konnte %s nicht lesen" -#: grep.c:1735 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155 +#: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155 #, c-format msgid "failed to stat '%s'" msgstr "Konnte '%s' nicht lesen" -#: grep.c:1746 +#: grep.c:1820 #, c-format msgid "'%s': short read" msgstr "'%s': read() zu kurz" @@ -683,7 +941,7 @@ msgstr "Automatische Ausführung in %0.1f Sekunden ..." msgid "git: '%s' is not a git command. See 'git --help'." msgstr "git: '%s' ist kein Git-Befehl. Siehe 'git --help'." -#: help.c:404 help.c:464 +#: help.c:404 help.c:470 msgid "" "\n" "Did you mean this?" @@ -697,7 +955,7 @@ msgstr[1] "" "\n" "Haben Sie eines von diesen gemeint?" -#: help.c:460 +#: help.c:466 #, c-format msgid "%s: %s - %s" msgstr "%s: %s - %s" @@ -731,83 +989,78 @@ msgstr "Konnte '%s.lock' nicht erstellen: %s" msgid "failed to read the cache" msgstr "Lesen des Zwischenspeichers fehlgeschlagen" -#: merge.c:94 builtin/am.c:2007 builtin/am.c:2042 builtin/checkout.c:375 -#: builtin/checkout.c:586 builtin/clone.c:732 +#: merge.c:94 builtin/am.c:1992 builtin/am.c:2027 builtin/checkout.c:375 +#: builtin/checkout.c:589 builtin/clone.c:732 msgid "unable to write new index file" msgstr "Konnte neue Index-Datei nicht schreiben." -#: merge-recursive.c:189 -#, c-format +#: merge-recursive.c:209 msgid "(bad commit)\n" msgstr "(ungültiger Commit)\n" -#: merge-recursive.c:209 +#: merge-recursive.c:231 #, c-format msgid "addinfo_cache failed for path '%s'" msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen" -#: merge-recursive.c:270 +#: merge-recursive.c:301 msgid "error building trees" msgstr "Fehler beim Erstellen der \"Tree\"-Objekte" -#: merge-recursive.c:689 +#: merge-recursive.c:720 #, c-format msgid "failed to create path '%s'%s" msgstr "Fehler beim Erstellen des Pfades '%s'%s" -#: merge-recursive.c:700 +#: merge-recursive.c:731 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "Entferne %s, um Platz für Unterverzeichnis zu schaffen\n" -#: merge-recursive.c:714 merge-recursive.c:735 +#: merge-recursive.c:745 merge-recursive.c:764 msgid ": perhaps a D/F conflict?" msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?" -#: merge-recursive.c:725 +#: merge-recursive.c:754 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden" -#: merge-recursive.c:765 +#: merge-recursive.c:796 #, c-format msgid "cannot read object %s '%s'" msgstr "kann Objekt %s '%s' nicht lesen" -#: merge-recursive.c:767 +#: merge-recursive.c:798 #, c-format msgid "blob expected for %s '%s'" msgstr "Blob erwartet für %s '%s'" -#: merge-recursive.c:790 builtin/clone.c:376 +#: merge-recursive.c:822 #, c-format -msgid "failed to open '%s'" -msgstr "Fehler beim Öffnen von '%s'" +msgid "failed to open '%s': %s" +msgstr "Fehler beim Öffnen von '%s': %s" -#: merge-recursive.c:798 +#: merge-recursive.c:833 #, c-format -msgid "failed to symlink '%s'" -msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'" +msgid "failed to symlink '%s': %s" +msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s" -#: merge-recursive.c:801 +#: merge-recursive.c:838 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "weiß nicht was mit %06o %s '%s' zu machen ist" -#: merge-recursive.c:939 +#: merge-recursive.c:978 msgid "Failed to execute internal merge" msgstr "Fehler bei Ausführung des internen Merges" -#: merge-recursive.c:943 +#: merge-recursive.c:982 #, c-format msgid "Unable to add %s to database" msgstr "Konnte %s nicht zur Datenbank hinzufügen" -#: merge-recursive.c:959 -msgid "unsupported object type in the tree" -msgstr "nicht unterstützter Objekttyp im Verzeichnis" - -#: merge-recursive.c:1034 merge-recursive.c:1048 +#: merge-recursive.c:1081 merge-recursive.c:1095 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -816,7 +1069,7 @@ msgstr "" "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde " "im Arbeitsbereich gelassen." -#: merge-recursive.c:1040 merge-recursive.c:1053 +#: merge-recursive.c:1087 merge-recursive.c:1100 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -825,20 +1078,20 @@ msgstr "" "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde " "im Arbeitsbereich bei %s gelassen." -#: merge-recursive.c:1094 +#: merge-recursive.c:1143 msgid "rename" msgstr "umbenennen" -#: merge-recursive.c:1094 +#: merge-recursive.c:1143 msgid "renamed" msgstr "umbenannt" -#: merge-recursive.c:1150 +#: merge-recursive.c:1200 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu" -#: merge-recursive.c:1172 +#: merge-recursive.c:1225 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -847,148 +1100,139 @@ msgstr "" "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" " "und \"%s\"->\"%s\" in Branch \"%s\"%s" -#: merge-recursive.c:1177 +#: merge-recursive.c:1230 msgid " (left unresolved)" msgstr " (bleibt unaufgelöst)" -#: merge-recursive.c:1231 +#: merge-recursive.c:1292 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" "KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s " "in %s" -#: merge-recursive.c:1261 +#: merge-recursive.c:1325 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "Benenne stattdessen %s nach %s und %s nach %s um" -#: merge-recursive.c:1460 +#: merge-recursive.c:1531 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "" "KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in " "%s" -#: merge-recursive.c:1470 +#: merge-recursive.c:1546 #, c-format msgid "Adding merged %s" msgstr "Füge zusammengeführte Datei %s hinzu" -#: merge-recursive.c:1475 merge-recursive.c:1677 +#: merge-recursive.c:1553 merge-recursive.c:1766 #, c-format msgid "Adding as %s instead" msgstr "Füge stattdessen als %s hinzu" -#: merge-recursive.c:1526 +#: merge-recursive.c:1610 #, c-format msgid "cannot read object %s" msgstr "kann Objekt %s nicht lesen" -#: merge-recursive.c:1529 +#: merge-recursive.c:1613 #, c-format msgid "object %s is not a blob" msgstr "Objekt %s ist kein Blob" -#: merge-recursive.c:1581 +#: merge-recursive.c:1666 msgid "modify" msgstr "ändern" -#: merge-recursive.c:1581 +#: merge-recursive.c:1666 msgid "modified" msgstr "geändert" -#: merge-recursive.c:1591 +#: merge-recursive.c:1676 msgid "content" msgstr "Inhalt" -#: merge-recursive.c:1598 +#: merge-recursive.c:1683 msgid "add/add" msgstr "hinzufügen/hinzufügen" -#: merge-recursive.c:1632 +#: merge-recursive.c:1718 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)" -#: merge-recursive.c:1646 +#: merge-recursive.c:1732 #, c-format msgid "Auto-merging %s" msgstr "automatischer Merge von %s" -#: merge-recursive.c:1650 git-submodule.sh:941 +#: merge-recursive.c:1736 git-submodule.sh:919 msgid "submodule" msgstr "Submodul" -#: merge-recursive.c:1651 +#: merge-recursive.c:1737 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "KONFLIKT (%s): Merge-Konflikt in %s" -#: merge-recursive.c:1737 +#: merge-recursive.c:1831 #, c-format msgid "Removing %s" msgstr "Entferne %s" -#: merge-recursive.c:1762 +#: merge-recursive.c:1857 msgid "file/directory" msgstr "Datei/Verzeichnis" -#: merge-recursive.c:1768 +#: merge-recursive.c:1863 msgid "directory/file" msgstr "Verzeichnis/Datei" -#: merge-recursive.c:1773 +#: merge-recursive.c:1868 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "" "KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s " "hinzu." -#: merge-recursive.c:1781 +#: merge-recursive.c:1877 #, c-format msgid "Adding %s" msgstr "Füge %s hinzu" -#: merge-recursive.c:1798 -msgid "Fatal merge failure, shouldn't happen." -msgstr "Fataler Merge-Fehler. Sollte nicht passieren." - -#: merge-recursive.c:1817 +#: merge-recursive.c:1914 msgid "Already up-to-date!" msgstr "Bereits aktuell!" -#: merge-recursive.c:1826 +#: merge-recursive.c:1923 #, c-format msgid "merging of trees %s and %s failed" msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen" -#: merge-recursive.c:1856 -#, c-format -msgid "Unprocessed path??? %s" -msgstr "unverarbeiteter Pfad??? %s" - -#: merge-recursive.c:1904 +#: merge-recursive.c:2006 msgid "Merging:" msgstr "Merge:" -#: merge-recursive.c:1917 +#: merge-recursive.c:2019 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "%u gemeinsamen Vorgänger-Commit gefunden" msgstr[1] "%u gemeinsame Vorgänger-Commits gefunden" -#: merge-recursive.c:1954 +#: merge-recursive.c:2058 msgid "merge returned no commit" msgstr "Merge hat keinen Commit zurückgegeben" -#: merge-recursive.c:2011 +#: merge-recursive.c:2121 #, c-format msgid "Could not parse object '%s'" msgstr "Konnte Objekt '%s' nicht parsen." -#: merge-recursive.c:2022 builtin/merge.c:649 builtin/merge.c:831 +#: merge-recursive.c:2135 builtin/merge.c:641 builtin/merge.c:788 msgid "Unable to write index." msgstr "Konnte Index nicht schreiben." @@ -1050,7 +1294,7 @@ msgstr "-NUM" msgid "malformed object name '%s'" msgstr "fehlerhafter Objekt-Name '%s'" -#: path.c:796 +#: path.c:798 #, c-format msgid "Could not make %s writable by group" msgstr "Konnte Gruppenschreibrecht für %s nicht setzen." @@ -1122,7 +1366,7 @@ msgstr "" ":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n" "Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?" -#: pretty.c:971 +#: pretty.c:973 msgid "unable to parse --pretty format" msgstr "Konnte --pretty Format nicht parsen." @@ -1148,23 +1392,22 @@ msgstr "" "GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n" "Verwende Version %i" -#: refs.c:543 builtin/merge.c:764 builtin/merge.c:883 builtin/merge.c:985 -#: builtin/merge.c:995 +#: refs.c:551 builtin/merge.c:840 #, c-format msgid "Could not open '%s' for writing" msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: refs/files-backend.c:2243 +#: refs/files-backend.c:2534 #, c-format msgid "could not delete reference %s: %s" msgstr "Konnte Referenz %s nicht entfernen: %s" -#: refs/files-backend.c:2246 +#: refs/files-backend.c:2537 #, c-format msgid "could not delete references: %s" msgstr "Konnte Referenzen nicht entfernen: %s" -#: refs/files-backend.c:2255 +#: refs/files-backend.c:2546 #, c-format msgid "could not remove reference %s" msgstr "Konnte Referenz %s nicht löschen" @@ -1322,77 +1565,77 @@ msgstr "%s folgt sowohl %s als auch %s" msgid "Internal error" msgstr "Interner Fehler" -#: remote.c:1678 remote.c:1721 +#: remote.c:1677 remote.c:1720 msgid "HEAD does not point to a branch" msgstr "HEAD zeigt auf keinen Branch" -#: remote.c:1687 +#: remote.c:1686 #, c-format msgid "no such branch: '%s'" msgstr "Kein solcher Branch: '%s'" -#: remote.c:1690 +#: remote.c:1689 #, c-format msgid "no upstream configured for branch '%s'" msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert." -#: remote.c:1696 +#: remote.c:1695 #, c-format msgid "upstream branch '%s' not stored as a remote-tracking branch" msgstr "Upstream-Branch '%s' nicht als Remote-Tracking-Branch gespeichert" -#: remote.c:1711 +#: remote.c:1710 #, c-format msgid "push destination '%s' on remote '%s' has no local tracking branch" msgstr "" "Ziel für \"push\" '%s' auf Remote-Repository '%s' hat keinen lokal gefolgten " "Branch" -#: remote.c:1726 +#: remote.c:1725 #, c-format msgid "branch '%s' has no remote for pushing" msgstr "Branch '%s' hat keinen Upstream-Branch gesetzt" -#: remote.c:1737 +#: remote.c:1736 #, c-format msgid "push refspecs for '%s' do not include '%s'" msgstr "Push-Refspecs für '%s' beinhalten nicht '%s'" -#: remote.c:1750 +#: remote.c:1749 msgid "push has no destination (push.default is 'nothing')" msgstr "kein Ziel für \"push\" (push.default ist 'nothing')" -#: remote.c:1772 +#: remote.c:1771 msgid "cannot resolve 'simple' push to a single destination" msgstr "kann einzelnes Ziel für \"push\" im Modus 'simple' nicht auflösen" -#: remote.c:2074 +#: remote.c:2073 #, c-format msgid "Your branch is based on '%s', but the upstream is gone.\n" msgstr "" "Ihr Branch basiert auf '%s', aber der Upstream-Branch wurde entfernt.\n" -#: remote.c:2078 +#: remote.c:2077 msgid " (use \"git branch --unset-upstream\" to fixup)\n" msgstr " (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n" -#: remote.c:2081 +#: remote.c:2080 #, 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:2085 +#: remote.c:2084 #, 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:2091 +#: remote.c:2090 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (benutzen Sie \"git push\", um lokale Commits zu publizieren)\n" -#: remote.c:2094 +#: remote.c:2093 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -1402,12 +1645,12 @@ msgstr[0] "" msgstr[1] "" "Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n" -#: remote.c:2102 +#: remote.c:2101 msgid " (use \"git pull\" to update your local branch)\n" msgstr "" " (benutzen Sie \"git pull\", um Ihren lokalen Branch zu aktualisieren)\n" -#: remote.c:2105 +#: remote.c:2104 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -1422,22 +1665,22 @@ msgstr[1] "" "Ihr Branch und '%s' sind divergiert,\n" "und haben jeweils %d und %d unterschiedliche Commits.\n" -#: remote.c:2115 +#: remote.c:2114 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr "" " (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch " "zusammenzuführen)\n" -#: revision.c:2142 +#: revision.c:2132 msgid "your current branch appears to be broken" msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein." -#: revision.c:2145 +#: revision.c:2135 #, c-format msgid "your current branch '%s' does not have any commits yet" msgstr "Ihr aktueller Branch '%s' hat noch keine Commits." -#: revision.c:2339 +#: revision.c:2329 msgid "--first-parent is incompatible with --bisect" msgstr "Die Optionen --first-parent und --bisect sind inkompatibel." @@ -1450,16 +1693,16 @@ msgstr "Öffnen von /dev/null fehlgeschlagen" msgid "dup2(%d,%d) failed" msgstr "dup2(%d,%d) fehlgeschlagen" -#: send-pack.c:295 +#: send-pack.c:298 msgid "failed to sign the push certificate" msgstr "Fehler beim Signieren des \"push\"-Zertifikates" -#: send-pack.c:404 +#: send-pack.c:411 msgid "the receiving end does not support --signed push" msgstr "" "die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")" -#: send-pack.c:406 +#: send-pack.c:413 msgid "" "not sending a push certificate since the receiving end does not support --" "signed push" @@ -1467,10 +1710,14 @@ msgstr "" "kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n" "Versand (\"--signed push\") unterstützt" -#: send-pack.c:418 +#: send-pack.c:425 msgid "the receiving end does not support --atomic push" msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")" +#: send-pack.c:430 +msgid "the receiving end does not support push options" +msgstr "die Gegenseite unterstützt keine Push-Optionen" + #: sequencer.c:174 msgid "" "after resolving the conflicts, mark the corrected paths\n" @@ -1489,19 +1736,20 @@ msgstr "" "mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n" "'git commit' ein" -#: sequencer.c:190 sequencer.c:833 sequencer.c:912 +#: sequencer.c:190 sequencer.c:841 sequencer.c:924 #, c-format msgid "Could not write to %s" msgstr "Konnte nicht nach %s schreiben" -#: sequencer.c:193 +#: sequencer.c:193 sequencer.c:843 sequencer.c:928 #, c-format -msgid "Error wrapping up %s" -msgstr "Fehler bei Nachbereitung von %s" +msgid "Error wrapping up %s." +msgstr "Fehler beim Einpacken von %s." #: sequencer.c:208 msgid "Your local changes would be overwritten by cherry-pick." -msgstr "Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden." +msgstr "" +"Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden." #: sequencer.c:210 msgid "Your local changes would be overwritten by revert." @@ -1512,202 +1760,242 @@ msgid "Commit your changes or stash them to proceed." msgstr "" "Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren." +#: sequencer.c:228 +#, c-format +msgid "%s: fast-forward" +msgstr "%s: Vorspulen" + #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:300 +#: sequencer.c:303 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Konnte neue Index-Datei nicht schreiben" -#: sequencer.c:318 +#: sequencer.c:321 msgid "Could not resolve HEAD commit\n" msgstr "Konnte Commit von HEAD nicht auflösen\n" -#: sequencer.c:338 +#: sequencer.c:341 msgid "Unable to update cache tree\n" msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n" -#: sequencer.c:390 +#: sequencer.c:393 #, c-format msgid "Could not parse commit %s\n" msgstr "Konnte Commit %s nicht parsen\n" -#: sequencer.c:395 +#: sequencer.c:398 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Konnte Eltern-Commit %s nicht parsen\n" -#: sequencer.c:460 +#: sequencer.c:463 msgid "Your index file is unmerged." msgstr "Ihre Index-Datei ist nicht zusammengeführt." -#: sequencer.c:479 +#: sequencer.c:482 #, 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:487 +#: sequencer.c:490 #, c-format msgid "Commit %s does not have parent %d" msgstr "Commit %s hat keinen Elternteil %d" -#: sequencer.c:491 +#: sequencer.c:494 #, 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:504 +#: sequencer.c:507 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kann Eltern-Commit %s nicht parsen" -#: sequencer.c:508 +#: sequencer.c:511 #, c-format msgid "Cannot get commit message for %s" msgstr "Kann keine Commit-Beschreibung für %s bekommen" -#: sequencer.c:594 +#: sequencer.c:597 #, c-format msgid "could not revert %s... %s" msgstr "Konnte \"revert\" nicht auf %s... (%s) ausführen" -#: sequencer.c:595 +#: sequencer.c:598 #, c-format msgid "could not apply %s... %s" msgstr "Konnte %s... (%s) nicht anwenden" -#: sequencer.c:630 +#: sequencer.c:633 msgid "empty commit set passed" msgstr "leere Menge von Commits übergeben" -#: sequencer.c:638 +#: sequencer.c:641 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: Fehler beim Lesen des Index" -#: sequencer.c:642 +#: sequencer.c:645 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: Fehler beim Aktualisieren des Index" -#: sequencer.c:702 -#, c-format -msgid "Cannot %s during a %s" -msgstr "Kann %s nicht während eines %s durchführen" +#: sequencer.c:705 +msgid "Cannot revert during another revert." +msgstr "Kann Revert nicht während eines anderen Reverts ausführen." + +#: sequencer.c:706 +msgid "Cannot revert during a cherry-pick." +msgstr "Kann Revert nicht während eines Cherry-Picks ausführen." + +#: sequencer.c:709 +msgid "Cannot cherry-pick during a revert." +msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen." + +#: sequencer.c:710 +msgid "Cannot cherry-pick during another cherry-pick." +msgstr "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen." -#: sequencer.c:724 +#: sequencer.c:732 #, c-format msgid "Could not parse line %d." msgstr "Konnte Zeile %d nicht parsen." -#: sequencer.c:729 +#: sequencer.c:737 msgid "No commits parsed." msgstr "Keine Commits geparst." -#: sequencer.c:741 +#: sequencer.c:749 #, c-format msgid "Could not open %s" msgstr "Konnte %s nicht öffnen" -#: sequencer.c:745 +#: sequencer.c:753 #, c-format msgid "Could not read %s." msgstr "Konnte %s nicht lesen." -#: sequencer.c:752 +#: sequencer.c:760 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Unbenutzbares Instruktionsblatt: %s" -#: sequencer.c:782 +#: sequencer.c:790 #, c-format msgid "Invalid key: %s" msgstr "Ungültiger Schlüssel: %s" -#: sequencer.c:785 builtin/pull.c:50 builtin/pull.c:52 +#: sequencer.c:793 builtin/pull.c:50 builtin/pull.c:52 #, c-format msgid "Invalid value for %s: %s" msgstr "Ungültiger Wert für %s: %s" -#: sequencer.c:795 +#: sequencer.c:803 #, c-format msgid "Malformed options sheet: %s" msgstr "Fehlerhaftes Optionsblatt: %s" -#: sequencer.c:814 +#: sequencer.c:822 msgid "a cherry-pick or revert is already in progress" msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang" -#: sequencer.c:815 +#: sequencer.c:823 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:819 +#: sequencer.c:827 #, c-format msgid "Could not create sequencer directory %s" msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen" -#: sequencer.c:835 sequencer.c:916 -#, c-format -msgid "Error wrapping up %s." -msgstr "Fehler beim Einpacken von %s." - -#: sequencer.c:854 sequencer.c:986 +#: sequencer.c:862 sequencer.c:998 msgid "no cherry-pick or revert in progress" msgstr "kein \"cherry-pick\" oder \"revert\" im Gang" -#: sequencer.c:856 +#: sequencer.c:864 msgid "cannot resolve HEAD" msgstr "kann HEAD nicht auflösen" -#: sequencer.c:858 +#: sequencer.c:866 sequencer.c:900 msgid "cannot abort from a branch yet to be born" msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird" -#: sequencer.c:878 builtin/fetch.c:610 builtin/fetch.c:851 +#: sequencer.c:886 builtin/fetch.c:724 builtin/fetch.c:970 #, c-format msgid "cannot open %s" msgstr "kann '%s' nicht öffnen" -#: sequencer.c:880 +#: sequencer.c:888 #, c-format msgid "cannot read %s: %s" msgstr "Kann %s nicht lesen: %s" -#: sequencer.c:881 +#: sequencer.c:889 msgid "unexpected end of file" msgstr "Unerwartetes Dateiende" -#: sequencer.c:887 +#: sequencer.c:895 #, 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:909 +#: sequencer.c:921 #, c-format msgid "Could not format %s." msgstr "Konnte %s nicht formatieren." -#: sequencer.c:1054 +#: sequencer.c:1066 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden" -#: sequencer.c:1057 +#: sequencer.c:1069 #, c-format msgid "%s: bad revision" msgstr "%s: ungültiger Commit" -#: sequencer.c:1091 +#: sequencer.c:1102 msgid "Can't revert as initial commit" msgstr "Kann nicht als allerersten Commit einen Revert ausführen." -#: sequencer.c:1092 -msgid "Can't cherry-pick into empty head" -msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen." +#: setup.c:160 +#, c-format +msgid "" +"%s: no such path in the working tree.\n" +"Use 'git <command> -- <path>...' to specify paths that do not exist locally." +msgstr "" +"%s: kein solcher Pfad im Arbeitsverzeichnis.\n" +"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n" +"nicht existieren." + +#: setup.c:173 +#, c-format +msgid "" +"ambiguous argument '%s': unknown revision or path not in the working tree.\n" +"Use '--' to separate paths from revisions, like this:\n" +"'git <command> [<revision>...] -- [<file>...]'" +msgstr "" +"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n" +"im Arbeitsverzeichnis\n" +"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n" +"'git <Befehl> [<Commit>...] -- [<Datei>...]'" + +#: setup.c:223 +#, c-format +msgid "" +"ambiguous argument '%s': both revision and filename\n" +"Use '--' to separate paths from revisions, like this:\n" +"'git <command> [<revision>...] -- [<file>...]'" +msgstr "" +"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n" +"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n" +"'git <Befehl> [<Commit>...] -- [<Datei>...]'" -#: setup.c:248 +#: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419 #, c-format msgid "failed to read %s" msgstr "Fehler beim Lesen von %s" @@ -1721,16 +2009,52 @@ msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden" msgid "unknown repository extensions found:" msgstr "Unbekannte Repository-Erweiterungen gefunden:" -#: sha1_file.c:1080 +#: setup.c:762 +#, c-format +msgid "Not a git repository (or any of the parent directories): %s" +msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s" + +#: setup.c:764 setup.c:915 builtin/index-pack.c:1641 +msgid "Cannot come back to cwd" +msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln" + +#: setup.c:845 +msgid "Unable to read current working directory" +msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen." + +#: setup.c:920 +#, c-format +msgid "" +"Not a git repository (or any parent up to mount point %s)\n" +"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." +msgstr "" +"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt %s)\n" +"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)." + +#: setup.c:927 +#, c-format +msgid "Cannot change to '%s/..'" +msgstr "Kann nicht in Verzeichnis '%s/..' wechseln" + +#: setup.c:989 +#, c-format +msgid "" +"Problem with core.sharedRepository filemode value (0%.3o).\n" +"The owner of files must always have read and write permissions." +msgstr "" +"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n" +"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben." + +#: sha1_file.c:1046 msgid "offset before end of packfile (broken .idx?)" msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)" -#: sha1_file.c:2458 +#: sha1_file.c:2434 #, c-format msgid "offset before start of pack index for %s (corrupt index?)" msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)" -#: sha1_file.c:2462 +#: sha1_file.c:2438 #, c-format msgid "offset beyond end of pack index for %s (truncated index?)" msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)" @@ -1789,7 +2113,7 @@ msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken" msgid "negative values not allowed for submodule.fetchJobs" msgstr "Negative Werte für submodule.fetchJobs nicht erlaubt" -#: submodule-config.c:355 +#: submodule-config.c:358 #, c-format msgid "invalid value for %s" msgstr "Ungültiger Wert für %s" @@ -1848,6 +2172,56 @@ msgstr "konnte temporäre Datei '%s' nicht öffnen" msgid "could not rename temporary file to %s" msgstr "konnte temporäre Datei nicht zu %s umbenennen" +#: transport.c:62 +#, c-format +msgid "Would set upstream of '%s' to '%s' of '%s'\n" +msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n" + +#: transport.c:151 +#, c-format +msgid "transport: invalid depth option '%s'" +msgstr "transport: ungültige --depth Option '%s'" + +#: transport.c:771 +#, c-format +msgid "" +"The following submodule paths contain changes that can\n" +"not be found on any remote:\n" +msgstr "" +"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n" +"Remote-Repository gefunden wurden:\n" + +#: transport.c:775 +#, c-format +msgid "" +"\n" +"Please try\n" +"\n" +"\tgit push --recurse-submodules=on-demand\n" +"\n" +"or cd to the path and use\n" +"\n" +"\tgit push\n" +"\n" +"to push them to a remote.\n" +"\n" +msgstr "" +"\n" +"Bitte versuchen Sie\n" +"\n" +"\tgit push --recurse-submodules=on-demand\n" +"\n" +"oder wechseln Sie in das Verzeichnis und benutzen Sie\n" +"\n" +"\tgit push\n" +"\n" +"zum Versenden zu einem Remote-Repository.\n" +"\n" + +#: transport.c:783 +msgid "Aborting." +msgstr "Abbruch." + #: transport-helper.c:1041 #, c-format msgid "Could not read ref %s" @@ -1857,11 +2231,12 @@ msgstr "Konnte Referenz %s nicht lesen." #, c-format msgid "" "Your local changes to the following files would be overwritten by checkout:\n" -"%%sPlease commit your changes or stash them before you can switch branches." +"%%sPlease commit your changes or stash them before you switch branches." msgstr "" "Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n" "überschrieben werden:\n" -"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches wechseln." +"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n" +"wechseln." #: unpack-trees.c:66 #, c-format @@ -1877,7 +2252,7 @@ msgstr "" #, c-format msgid "" "Your local changes to the following files would be overwritten by merge:\n" -"%%sPlease commit your changes or stash them before you can merge." +"%%sPlease commit your changes or stash them before you merge." msgstr "" "Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n" "überschrieben werden:\n" @@ -1897,7 +2272,7 @@ msgstr "" #, c-format msgid "" "Your local changes to the following files would be overwritten by %s:\n" -"%%sPlease commit your changes or stash them before you can %s." +"%%sPlease commit your changes or stash them before you %s." msgstr "" "Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n" "überschrieben werden:\n" @@ -1926,7 +2301,7 @@ msgstr "" #, c-format msgid "" "The following untracked working tree files would be removed by checkout:\n" -"%%sPlease move or remove them before you can switch branches." +"%%sPlease move or remove them before you switch branches." msgstr "" "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" "den Checkout entfernt werden:\n" @@ -1938,7 +2313,8 @@ msgid "" "The following untracked working tree files would be removed by checkout:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch " +"den\n" "Checkout entfernt werden:\n" "%%s" @@ -1946,10 +2322,10 @@ msgstr "" #, c-format msgid "" "The following untracked working tree files would be removed by merge:\n" -"%%sPlease move or remove them before you can merge." +"%%sPlease move or remove them before you merge." msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"Merge entfernt werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den Merge entfernt werden:\n" "%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen." #: unpack-trees.c:92 @@ -1958,7 +2334,8 @@ msgid "" "The following untracked working tree files would be removed by merge:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch " +"den\n" "Merge entfernt werden:\n" "%%s" @@ -1966,10 +2343,10 @@ msgstr "" #, c-format msgid "" "The following untracked working tree files would be removed by %s:\n" -"%%sPlease move or remove them before you can %s." +"%%sPlease move or remove them before you %s." msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"%s entfernt werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den %s entfernt werden:\n" "%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen." #: unpack-trees.c:97 @@ -1978,8 +2355,8 @@ msgid "" "The following untracked working tree files would be removed by %s:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"%s entfernt werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den %s entfernt werden:\n" "%%s" #: unpack-trees.c:102 @@ -1987,10 +2364,10 @@ msgstr "" msgid "" "The following untracked working tree files would be overwritten by " "checkout:\n" -"%%sPlease move or remove them before you can switch branches." +"%%sPlease move or remove them before you switch branches." msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"Checkout überschrieben werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den Checkout überschrieben werden:\n" "%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln." #: unpack-trees.c:104 @@ -2000,7 +2377,8 @@ msgid "" "checkout:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch " +"den\n" "Checkout überschrieben werden:\n" "%%s" @@ -2008,10 +2386,10 @@ msgstr "" #, c-format msgid "" "The following untracked working tree files would be overwritten by merge:\n" -"%%sPlease move or remove them before you can merge." +"%%sPlease move or remove them before you merge." msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"Merge überschrieben werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den Merge überschrieben werden:\n" "%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen." #: unpack-trees.c:109 @@ -2020,18 +2398,18 @@ msgid "" "The following untracked working tree files would be overwritten by merge:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"Merge überschrieben werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den Merge überschrieben werden:\n" "%%s" #: unpack-trees.c:112 #, c-format msgid "" "The following untracked working tree files would be overwritten by %s:\n" -"%%sPlease move or remove them before you can %s." +"%%sPlease move or remove them before you %s." msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" -"%s überschrieben werden:\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n" +"den %s überschrieben werden:\n" "%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen." #: unpack-trees.c:114 @@ -2040,7 +2418,8 @@ msgid "" "The following untracked working tree files would be overwritten by %s:\n" "%%s" msgstr "" -"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch den\n" +"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch " +"den\n" "%s überschrieben werden:\n" "%%s" @@ -2055,7 +2434,8 @@ msgid "" "Cannot update sparse checkout: the following entries are not up-to-date:\n" "%s" msgstr "" -"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind nicht\n" +"Kann partiellen Checkout nicht aktualisieren: die folgenden Einträge sind " +"nicht\n" "aktuell:\n" "%s" @@ -2119,43 +2499,43 @@ msgstr "ungültige Portnummer" msgid "invalid '..' path segment" msgstr "ungültiges '..' Pfadsegment" -#: wrapper.c:222 wrapper.c:381 +#: worktree.c:282 +#, c-format +msgid "failed to read '%s'" +msgstr "Fehler beim Lesen von '%s'" + +#: wrapper.c:222 wrapper.c:392 #, c-format msgid "could not open '%s' for reading and writing" msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen." -#: wrapper.c:224 wrapper.c:383 builtin/am.c:779 +#: wrapper.c:224 wrapper.c:394 builtin/am.c:778 #, c-format msgid "could not open '%s' for writing" msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: wrapper.c:226 wrapper.c:385 builtin/am.c:323 builtin/am.c:772 -#: builtin/am.c:860 builtin/commit.c:1711 builtin/merge.c:1086 +#: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771 +#: builtin/am.c:859 builtin/commit.c:1712 builtin/merge.c:1029 #: builtin/pull.c:407 #, c-format msgid "could not open '%s' for reading" msgstr "Konnte '%s' nicht zum Lesen öffnen." -#: wrapper.c:594 wrapper.c:615 +#: wrapper.c:605 wrapper.c:626 #, c-format msgid "unable to access '%s'" msgstr "konnte nicht auf '%s' zugreifen" -#: wrapper.c:623 +#: wrapper.c:634 msgid "unable to get current working directory" msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen." -#: wrapper.c:650 -#, c-format -msgid "could not open %s for writing" -msgstr "Konnte '%s' nicht zum Schreiben öffnen." - -#: wrapper.c:661 builtin/am.c:410 +#: wrapper.c:658 #, c-format msgid "could not write to %s" msgstr "Konnte nicht nach '%s' schreiben." -#: wrapper.c:667 +#: wrapper.c:660 #, c-format msgid "could not close %s" msgstr "Konnte '%s' nicht schließen." @@ -2193,11 +2573,11 @@ msgid " (use \"git rm <file>...\" to mark resolution)" msgstr "" " (benutzen Sie \"git add/rm <Datei>...\", um die Auflösung zu markieren)" -#: wt-status.c:198 wt-status.c:881 +#: wt-status.c:198 wt-status.c:882 msgid "Changes to be committed:" msgstr "zum Commit vorgemerkte Änderungen:" -#: wt-status.c:216 wt-status.c:890 +#: wt-status.c:216 wt-status.c:891 msgid "Changes not staged for commit:" msgstr "Änderungen, die nicht zum Commit vorgemerkt sind:" @@ -2261,11 +2641,6 @@ msgstr "von beiden hinzugefügt:" msgid "both modified:" msgstr "von beiden geändert:" -#: wt-status.c:266 -#, c-format -msgid "bug: unhandled unmerged status %x" -msgstr "Bug: unbehandelter Unmerged-Status %x" - #: wt-status.c:274 msgid "new file:" msgstr "neue Datei:" @@ -2310,20 +2685,15 @@ msgstr "geänderter Inhalt, " msgid "untracked content, " msgstr "unversionierter Inhalt, " -#: wt-status.c:391 -#, c-format -msgid "bug: unhandled diff status %c" -msgstr "Fehler: unbehandelter Differenz-Status %c" - -#: wt-status.c:755 +#: wt-status.c:756 msgid "Submodules changed but not updated:" msgstr "Submodule geändert, aber nicht aktualisiert:" -#: wt-status.c:757 +#: wt-status.c:758 msgid "Submodule changes to be committed:" msgstr "Änderungen in Submodul zum Committen:" -#: wt-status.c:838 +#: wt-status.c:839 msgid "" "Do not touch the line above.\n" "Everything below will be removed." @@ -2331,106 +2701,110 @@ msgstr "" "Ändern Sie nicht die obige Zeile.\n" "Alles unterhalb von ihr wird entfernt." -#: wt-status.c:949 +#: wt-status.c:950 msgid "You have unmerged paths." msgstr "Sie haben nicht zusammengeführte Pfade." -#: wt-status.c:952 +#: wt-status.c:953 msgid " (fix conflicts and run \"git commit\")" msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)" -#: wt-status.c:956 +#: wt-status.c:955 +msgid " (use \"git merge --abort\" to abort the merge)" +msgstr " (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)" + +#: wt-status.c:960 msgid "All conflicts fixed but you are still merging." msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge." -#: wt-status.c:959 +#: wt-status.c:963 msgid " (use \"git commit\" to conclude merge)" msgstr " (benutzen Sie \"git commit\", um den Merge abzuschließen)" -#: wt-status.c:969 +#: wt-status.c:973 msgid "You are in the middle of an am session." msgstr "Eine \"am\"-Sitzung ist im Gange." -#: wt-status.c:972 +#: wt-status.c:976 msgid "The current patch is empty." msgstr "Der aktuelle Patch ist leer." -#: wt-status.c:976 +#: wt-status.c:980 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:978 +#: wt-status.c:982 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (benutzen Sie \"git am --skip\", um diesen Patch auszulassen)" -#: wt-status.c:980 +#: wt-status.c:984 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:1105 +#: wt-status.c:1109 msgid "No commands done." msgstr "Keine Befehle ausgeführt." -#: wt-status.c:1108 +#: wt-status.c:1112 #, c-format msgid "Last command done (%d command done):" msgid_plural "Last commands done (%d commands done):" msgstr[0] "Zuletzt ausgeführter Befehl (%d Befehl ausgeführt):" msgstr[1] "Zuletzt ausgeführte Befehle (%d Befehle ausgeführt):" -#: wt-status.c:1119 +#: wt-status.c:1123 #, c-format msgid " (see more in file %s)" msgstr " (mehr Informationen in Datei %s)" -#: wt-status.c:1124 +#: wt-status.c:1128 msgid "No commands remaining." msgstr "Keine Befehle verbleibend." -#: wt-status.c:1127 +#: wt-status.c:1131 #, c-format msgid "Next command to do (%d remaining command):" msgid_plural "Next commands to do (%d remaining commands):" msgstr[0] "Nächster auszuführender Befehl (%d Befehle verbleibend):" msgstr[1] "Nächste auszuführende Befehle (%d Befehle verbleibend):" -#: wt-status.c:1135 +#: wt-status.c:1139 msgid " (use \"git rebase --edit-todo\" to view and edit)" msgstr " (benutzen Sie \"git rebase --edit-todo\" zum Ansehen und Bearbeiten)" -#: wt-status.c:1148 +#: wt-status.c:1152 #, 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:1153 +#: wt-status.c:1157 msgid "You are currently rebasing." msgstr "Sie sind gerade beim Rebase." -#: wt-status.c:1167 +#: wt-status.c:1171 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:1169 +#: wt-status.c:1173 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (benutzen Sie \"git rebase --skip\", um diesen Patch auszulassen)" -#: wt-status.c:1171 +#: wt-status.c:1175 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:1177 +#: wt-status.c:1181 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)" -#: wt-status.c:1181 +#: wt-status.c:1185 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." @@ -2438,134 +2812,134 @@ msgstr "" "Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf " "'%s' im Gange ist." -#: wt-status.c:1186 +#: wt-status.c:1190 msgid "You are currently splitting a commit during a rebase." msgstr "Sie teilen gerade einen Commit während eines Rebase auf." -#: wt-status.c:1189 +#: wt-status.c:1193 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:1193 +#: wt-status.c:1197 #, 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:1198 +#: wt-status.c:1202 msgid "You are currently editing a commit during a rebase." msgstr "Sie editieren gerade einen Commit während eines Rebase." -#: wt-status.c:1201 +#: wt-status.c:1205 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr "" " (benutzen Sie \"git commit --amend\", um den aktuellen Commit " "nachzubessern)" -#: wt-status.c:1203 +#: wt-status.c:1207 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:1213 +#: wt-status.c:1217 #, c-format msgid "You are currently cherry-picking commit %s." msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus." -#: wt-status.c:1218 +#: wt-status.c:1222 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:1221 +#: wt-status.c:1225 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" " (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)" -#: wt-status.c:1223 +#: wt-status.c:1227 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:1232 +#: wt-status.c:1236 #, c-format msgid "You are currently reverting commit %s." msgstr "Sie sind gerade an einem Revert von Commit '%s'." -#: wt-status.c:1237 +#: wt-status.c:1241 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:1240 +#: wt-status.c:1244 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)" -#: wt-status.c:1242 +#: wt-status.c:1246 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr "" " (benutzen Sie \"git revert --abort\", um die Revert-Operation abzubrechen)" -#: wt-status.c:1253 +#: wt-status.c:1257 #, 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:1257 +#: wt-status.c:1261 msgid "You are currently bisecting." msgstr "Sie sind gerade bei einer binären Suche." -#: wt-status.c:1260 +#: wt-status.c:1264 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:1460 +#: wt-status.c:1464 msgid "On branch " msgstr "Auf Branch " -#: wt-status.c:1466 +#: wt-status.c:1470 msgid "interactive rebase in progress; onto " msgstr "interaktives Rebase im Gange; auf " -#: wt-status.c:1468 +#: wt-status.c:1472 msgid "rebase in progress; onto " msgstr "Rebase im Gange; auf " -#: wt-status.c:1473 +#: wt-status.c:1477 msgid "HEAD detached at " msgstr "HEAD losgelöst bei " -#: wt-status.c:1475 +#: wt-status.c:1479 msgid "HEAD detached from " msgstr "HEAD losgelöst von " -#: wt-status.c:1478 +#: wt-status.c:1482 msgid "Not currently on any branch." msgstr "Im Moment auf keinem Branch." -#: wt-status.c:1496 +#: wt-status.c:1500 msgid "Initial commit" msgstr "Initialer Commit" -#: wt-status.c:1510 +#: wt-status.c:1514 msgid "Untracked files" msgstr "Unversionierte Dateien" -#: wt-status.c:1512 +#: wt-status.c:1516 msgid "Ignored files" msgstr "Ignorierte Dateien" -#: wt-status.c:1516 +#: wt-status.c:1520 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -2576,32 +2950,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:1522 +#: wt-status.c:1526 #, c-format msgid "Untracked files not listed%s" msgstr "Unversionierte Dateien nicht aufgelistet%s" -#: wt-status.c:1524 +#: wt-status.c:1528 msgid " (use -u option to show untracked files)" msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)" -#: wt-status.c:1530 +#: wt-status.c:1534 msgid "No changes" msgstr "Keine Änderungen" -#: wt-status.c:1535 +#: wt-status.c:1539 #, 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:1538 +#: wt-status.c:1542 #, c-format msgid "no changes added to commit\n" msgstr "keine Änderungen zum Commit vorgemerkt\n" -#: wt-status.c:1541 +#: wt-status.c:1545 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " @@ -2610,52 +2984,52 @@ msgstr "" "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien (benutzen " "Sie \"git add\" zum Versionieren)\n" -#: wt-status.c:1544 +#: wt-status.c:1548 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n" -#: wt-status.c:1547 +#: wt-status.c:1551 #, 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 Versionieren)\n" -#: wt-status.c:1550 wt-status.c:1555 +#: wt-status.c:1554 wt-status.c:1559 #, c-format msgid "nothing to commit\n" msgstr "nichts zu committen\n" -#: wt-status.c:1553 +#: wt-status.c:1557 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "" "nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien " "anzuzeigen)\n" -#: wt-status.c:1557 +#: wt-status.c:1561 #, c-format -msgid "nothing to commit, working directory clean\n" +msgid "nothing to commit, working tree clean\n" msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n" -#: wt-status.c:1664 +#: wt-status.c:1668 msgid "Initial commit on " msgstr "Initialer Commit auf " -#: wt-status.c:1668 +#: wt-status.c:1672 msgid "HEAD (no branch)" msgstr "HEAD (kein Branch)" -#: wt-status.c:1697 +#: wt-status.c:1701 msgid "gone" msgstr "entfernt" -#: wt-status.c:1699 wt-status.c:1707 +#: wt-status.c:1703 wt-status.c:1711 msgid "behind " msgstr "hinterher " -#: wt-status.c:1702 wt-status.c:1705 +#: wt-status.c:1706 wt-status.c:1709 msgid "ahead " msgstr "voraus " @@ -2673,267 +3047,281 @@ msgstr "git add [<Optionen>] [--] <Pfadspezifikation>..." msgid "unexpected diff status %c" msgstr "unerwarteter Differenz-Status %c" -#: builtin/add.c:70 builtin/commit.c:280 +#: builtin/add.c:71 builtin/commit.c:281 msgid "updating files failed" msgstr "Aktualisierung der Dateien fehlgeschlagen" -#: builtin/add.c:80 +#: builtin/add.c:81 #, c-format msgid "remove '%s'\n" msgstr "lösche '%s'\n" -#: builtin/add.c:134 +#: builtin/add.c:136 msgid "Unstaged changes after refreshing the index:" msgstr "" "Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:" -#: builtin/add.c:194 builtin/rev-parse.c:811 +#: builtin/add.c:196 builtin/rev-parse.c:811 msgid "Could not read the index" msgstr "Konnte den Index nicht lesen" -#: builtin/add.c:205 +#: builtin/add.c:207 #, c-format msgid "Could not open '%s' for writing." msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: builtin/add.c:209 +#: builtin/add.c:211 msgid "Could not write patch" msgstr "Konnte Patch nicht schreiben" -#: builtin/add.c:212 +#: builtin/add.c:214 msgid "editing patch failed" msgstr "Bearbeitung des Patches fehlgeschlagen" -#: builtin/add.c:215 +#: builtin/add.c:217 #, c-format msgid "Could not stat '%s'" msgstr "Konnte Verzeichnis '%s' nicht lesen" -#: builtin/add.c:217 +#: builtin/add.c:219 msgid "Empty patch. Aborted." msgstr "Leerer Patch. Abgebrochen." -#: builtin/add.c:222 +#: builtin/add.c:224 #, c-format msgid "Could not apply '%s'" msgstr "Konnte '%s' nicht anwenden." -#: builtin/add.c:232 +#: builtin/add.c:234 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:249 builtin/clean.c:870 builtin/fetch.c:112 builtin/mv.c:111 -#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:511 -#: builtin/remote.c:1332 builtin/rm.c:268 builtin/send-pack.c:162 +#: builtin/add.c:253 builtin/clean.c:870 builtin/fetch.c:113 builtin/mv.c:111 +#: builtin/prune-packed.c:55 builtin/pull.c:197 builtin/push.c:521 +#: builtin/remote.c:1327 builtin/rm.c:268 builtin/send-pack.c:162 msgid "dry run" msgstr "Probelauf" -#: builtin/add.c:250 builtin/apply.c:4563 builtin/check-ignore.c:19 -#: builtin/commit.c:1333 builtin/count-objects.c:85 builtin/fsck.c:557 -#: builtin/log.c:1826 builtin/mv.c:110 builtin/read-tree.c:114 +#: builtin/add.c:254 builtin/apply.c:4854 builtin/check-ignore.c:19 +#: builtin/commit.c:1334 builtin/count-objects.c:85 builtin/fsck.c:593 +#: builtin/log.c:1852 builtin/mv.c:110 builtin/read-tree.c:114 msgid "be verbose" msgstr "erweiterte Ausgaben" -#: builtin/add.c:252 +#: builtin/add.c:256 msgid "interactive picking" msgstr "interaktives Auswählen" -#: builtin/add.c:253 builtin/checkout.c:1154 builtin/reset.c:286 +#: builtin/add.c:257 builtin/checkout.c:1157 builtin/reset.c:286 msgid "select hunks interactively" msgstr "Blöcke interaktiv auswählen" -#: builtin/add.c:254 +#: builtin/add.c:258 msgid "edit current diff and apply" msgstr "aktuelle Unterschiede editieren und anwenden" -#: builtin/add.c:255 +#: builtin/add.c:259 msgid "allow adding otherwise ignored files" msgstr "das Hinzufügen andernfalls ignorierter Dateien erlauben" -#: builtin/add.c:256 +#: builtin/add.c:260 msgid "update tracked files" msgstr "versionierte Dateien aktualisieren" -#: builtin/add.c:257 +#: builtin/add.c:261 msgid "record only the fact that the path will be added later" msgstr "nur speichern, dass der Pfad später hinzugefügt werden soll" -#: builtin/add.c:258 +#: builtin/add.c:262 msgid "add changes from all tracked and untracked files" msgstr "" "Änderungen von allen versionierten und unversionierten Dateien hinzufügen" -#: builtin/add.c:261 +#: builtin/add.c:265 msgid "ignore paths removed in the working tree (same as --no-all)" msgstr "gelöschte Pfade im Arbeitsverzeichnis ignorieren (genau wie --no-all)" -#: builtin/add.c:263 +#: builtin/add.c:267 msgid "don't add, only refresh the index" msgstr "nichts hinzufügen, nur den Index aktualisieren" -#: builtin/add.c:264 +#: builtin/add.c:268 msgid "just skip files which cannot be added because of errors" msgstr "" "Dateien überspringen, die aufgrund von Fehlern nicht hinzugefügt werden " "konnten" -#: builtin/add.c:265 +#: builtin/add.c:269 msgid "check if - even missing - files are ignored in dry run" msgstr "prüfen ob - auch fehlende - Dateien im Probelauf ignoriert werden" -#: builtin/add.c:287 +#: builtin/add.c:270 builtin/update-index.c:958 +msgid "(+/-)x" +msgstr "(+/-)x" + +#: builtin/add.c:270 builtin/update-index.c:959 +msgid "override the executable bit of the listed files" +msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben" + +#: builtin/add.c:292 #, 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:294 +#: builtin/add.c:300 msgid "adding files failed" msgstr "Hinzufügen von Dateien fehlgeschlagen" -#: builtin/add.c:330 +#: builtin/add.c:336 msgid "-A and -u are mutually incompatible" msgstr "Die Optionen -A und -u sind zueinander inkompatibel." -#: builtin/add.c:337 +#: builtin/add.c:343 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:352 #, c-format +msgid "--chmod param '%s' must be either -x or +x" +msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein" + +#: builtin/add.c:367 +#, c-format msgid "Nothing specified, nothing added.\n" msgstr "Nichts spezifiziert, nichts hinzugefügt.\n" -#: builtin/add.c:353 +#: builtin/add.c:368 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Meinten Sie vielleicht 'git add .'?\n" -#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:914 -#: builtin/commit.c:339 builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298 +#: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279 +#: builtin/checkout.c:473 builtin/clean.c:914 builtin/commit.c:340 +#: builtin/mv.c:131 builtin/reset.c:235 builtin/rm.c:298 #: builtin/submodule--helper.c:240 msgid "index file corrupt" msgstr "Index-Datei beschädigt" -#: builtin/add.c:439 builtin/apply.c:4661 builtin/mv.c:283 builtin/rm.c:430 +#: builtin/add.c:454 builtin/apply.c:4784 builtin/mv.c:286 builtin/rm.c:431 msgid "Unable to write new index file" msgstr "Konnte neue Index-Datei nicht schreiben." -#: builtin/am.c:256 builtin/commit.c:749 builtin/merge.c:1089 +#: builtin/am.c:257 builtin/commit.c:750 builtin/merge.c:1032 #, c-format msgid "could not read '%s'" msgstr "Konnte '%s' nicht lesen" -#: builtin/am.c:430 +#: builtin/am.c:426 msgid "could not parse author script" msgstr "konnte Autor-Skript nicht parsen" -#: builtin/am.c:507 +#: builtin/am.c:503 #, c-format msgid "'%s' was deleted by the applypatch-msg hook" msgstr "'%s' wurde durch den applypatch-msg Hook entfernt" -#: builtin/am.c:548 builtin/notes.c:300 +#: builtin/am.c:544 builtin/notes.c:301 #, c-format msgid "Malformed input line: '%s'." msgstr "Fehlerhafte Eingabezeile: '%s'." -#: builtin/am.c:585 builtin/notes.c:315 +#: builtin/am.c:581 builtin/notes.c:316 #, c-format msgid "Failed to copy notes from '%s' to '%s'" msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'" -#: builtin/am.c:611 +#: builtin/am.c:607 msgid "fseek failed" msgstr "\"fseek\" fehlgeschlagen" -#: builtin/am.c:788 +#: builtin/am.c:787 #, c-format msgid "could not parse patch '%s'" msgstr "konnte Patch '%s' nicht parsen" -#: builtin/am.c:853 +#: builtin/am.c:852 msgid "Only one StGIT patch series can be applied at once" msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden." -#: builtin/am.c:900 +#: builtin/am.c:899 msgid "invalid timestamp" msgstr "ungültiger Zeitstempel" -#: builtin/am.c:903 builtin/am.c:911 +#: builtin/am.c:902 builtin/am.c:910 msgid "invalid Date line" msgstr "Ungültige \"Date\"-Zeile" -#: builtin/am.c:908 +#: builtin/am.c:907 msgid "invalid timezone offset" msgstr "Ungültiger Offset in der Zeitzone" -#: builtin/am.c:995 +#: builtin/am.c:996 msgid "Patch format detection failed." msgstr "Patch-Formaterkennung fehlgeschlagen." -#: builtin/am.c:1000 builtin/clone.c:380 +#: builtin/am.c:1001 builtin/clone.c:380 #, c-format msgid "failed to create directory '%s'" msgstr "Fehler beim Erstellen von Verzeichnis '%s'" -#: builtin/am.c:1004 +#: builtin/am.c:1005 msgid "Failed to split patches." msgstr "Fehler beim Aufteilen der Patches." -#: builtin/am.c:1136 builtin/commit.c:365 +#: builtin/am.c:1137 builtin/commit.c:366 msgid "unable to write index file" msgstr "Konnte Index-Datei nicht schreiben." -#: builtin/am.c:1187 +#: builtin/am.c:1188 #, c-format msgid "When you have resolved this problem, run \"%s --continue\"." msgstr "" "Wenn Sie das Problem aufgelöst haben, führen Sie \"%s --continue\" aus." -#: builtin/am.c:1188 +#: builtin/am.c:1189 #, c-format msgid "If you prefer to skip this patch, run \"%s --skip\" instead." msgstr "" "Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"%s --skip" "\" aus." -#: builtin/am.c:1189 +#: builtin/am.c:1190 #, c-format msgid "To restore the original branch and stop patching, run \"%s --abort\"." msgstr "" "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der " "Patches abzubrechen, führen Sie \"%s --abort\" aus." -#: builtin/am.c:1327 +#: builtin/am.c:1328 msgid "Patch is empty. Was it split wrong?" msgstr "Patch ist leer. War dessen Aufteilung falsch?" -#: builtin/am.c:1401 builtin/log.c:1516 +#: builtin/am.c:1402 builtin/log.c:1543 #, c-format msgid "invalid ident line: %s" msgstr "Ungültige Identifikationszeile: %s" -#: builtin/am.c:1428 +#: builtin/am.c:1429 #, c-format msgid "unable to parse commit %s" msgstr "Konnte Commit '%s' nicht parsen." -#: builtin/am.c:1630 +#: builtin/am.c:1602 msgid "Repository lacks necessary blobs to fall back on 3-way merge." msgstr "" "Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge " "zurückzufallen." -#: builtin/am.c:1632 +#: builtin/am.c:1604 msgid "Using index info to reconstruct a base tree..." msgstr "" "Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis " "nachzustellen ..." -#: builtin/am.c:1651 +#: builtin/am.c:1623 msgid "" "Did you hand edit your patch?\n" "It does not apply to blobs recorded in its index." @@ -2941,39 +3329,39 @@ msgstr "" "Haben Sie den Patch per Hand editiert?\n" "Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden." -#: builtin/am.c:1657 +#: builtin/am.c:1629 msgid "Falling back to patching base and 3-way merge..." msgstr "Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ..." -#: builtin/am.c:1672 +#: builtin/am.c:1654 msgid "Failed to merge in the changes." msgstr "Merge der Änderungen fehlgeschlagen." -#: builtin/am.c:1696 builtin/merge.c:636 +#: builtin/am.c:1679 builtin/merge.c:628 msgid "git write-tree failed to write a tree" msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl" -#: builtin/am.c:1703 +#: builtin/am.c:1686 msgid "applying to an empty history" msgstr "auf leere Historie anwenden" -#: builtin/am.c:1716 builtin/commit.c:1775 builtin/merge.c:841 -#: builtin/merge.c:866 +#: builtin/am.c:1699 builtin/commit.c:1776 builtin/merge.c:798 +#: builtin/merge.c:823 msgid "failed to write commit object" msgstr "Fehler beim Schreiben des Commit-Objektes." -#: builtin/am.c:1748 builtin/am.c:1752 +#: builtin/am.c:1731 builtin/am.c:1735 #, c-format msgid "cannot resume: %s does not exist." msgstr "Kann nicht fortsetzen: %s existiert nicht" -#: builtin/am.c:1768 +#: builtin/am.c:1751 msgid "cannot be interactive without stdin connected to a terminal." msgstr "" "Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem " "Terminal verbunden ist." -#: builtin/am.c:1773 +#: builtin/am.c:1756 msgid "Commit Body is:" msgstr "Commit-Beschreibung ist:" @@ -2981,35 +3369,35 @@ msgstr "Commit-Beschreibung ist:" #. in your translation. The program will only accept English #. input at this point. #. -#: builtin/am.c:1783 +#: builtin/am.c:1766 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: " msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: " -#: builtin/am.c:1833 +#: builtin/am.c:1816 #, c-format msgid "Dirty index: cannot apply patches (dirty: %s)" msgstr "Geänderter Index: kann Patches nicht anwenden (geändert: %s)" -#: builtin/am.c:1868 builtin/am.c:1940 +#: builtin/am.c:1853 builtin/am.c:1925 #, c-format msgid "Applying: %.*s" msgstr "Wende an: %.*s" -#: builtin/am.c:1884 +#: builtin/am.c:1869 msgid "No changes -- Patch already applied." msgstr "Keine Änderungen -- Patches bereits angewendet." -#: builtin/am.c:1892 +#: builtin/am.c:1877 #, c-format msgid "Patch failed at %s %.*s" msgstr "Anwendung des Patches fehlgeschlagen bei %s %.*s" -#: builtin/am.c:1898 +#: builtin/am.c:1883 #, c-format msgid "The copy of the patch that failed is found in: %s" msgstr "Die Kopie des fehlgeschlagenen Patches befindet sich in: %s" -#: builtin/am.c:1943 +#: builtin/am.c:1928 msgid "" "No changes - did you forget to use 'git add'?\n" "If there is nothing left to stage, chances are that something else\n" @@ -3020,7 +3408,7 @@ msgstr "" "diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n" "auslassen." -#: builtin/am.c:1950 +#: builtin/am.c:1935 msgid "" "You still have unmerged paths in your index.\n" "Did you forget to use 'git add'?" @@ -3028,17 +3416,17 @@ msgstr "" "Sie haben immer noch nicht zusammengeführte Pfade im Index.\n" "Haben Sie vergessen 'git add' zu benutzen?" -#: builtin/am.c:2058 builtin/am.c:2062 builtin/am.c:2074 builtin/reset.c:308 +#: builtin/am.c:2043 builtin/am.c:2047 builtin/am.c:2059 builtin/reset.c:308 #: builtin/reset.c:316 #, c-format msgid "Could not parse object '%s'." msgstr "Konnte Objekt '%s' nicht parsen." -#: builtin/am.c:2110 +#: builtin/am.c:2095 msgid "failed to clean index" msgstr "Fehler beim Bereinigen des Index" -#: builtin/am.c:2144 +#: builtin/am.c:2129 msgid "" "You seem to have moved HEAD since the last 'am' failure.\n" "Not rewinding to ORIG_HEAD" @@ -3046,155 +3434,155 @@ msgstr "" "Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n" "Keine Zurücksetzung zu ORIG_HEAD." -#: builtin/am.c:2205 +#: builtin/am.c:2192 #, c-format msgid "Invalid value for --patch-format: %s" msgstr "Ungültiger Wert für --patch-format: %s" -#: builtin/am.c:2238 +#: builtin/am.c:2225 msgid "git am [<options>] [(<mbox>|<Maildir>)...]" msgstr "git am [<Optionen>] [(<mbox>|<E-Mail-Verzeichnis>)...]" -#: builtin/am.c:2239 +#: builtin/am.c:2226 msgid "git am [<options>] (--continue | --skip | --abort)" msgstr "git am [<Optionen>] (--continue | --skip | --abort)" -#: builtin/am.c:2245 +#: builtin/am.c:2232 msgid "run interactively" msgstr "interaktiv ausführen" -#: builtin/am.c:2247 +#: builtin/am.c:2234 msgid "historical option -- no-op" msgstr "historische Option -- kein Effekt" -#: builtin/am.c:2249 +#: builtin/am.c:2236 msgid "allow fall back on 3way merging if needed" msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge" -#: builtin/am.c:2250 builtin/init-db.c:478 builtin/prune-packed.c:57 -#: builtin/repack.c:171 +#: builtin/am.c:2237 builtin/init-db.c:481 builtin/prune-packed.c:57 +#: builtin/repack.c:172 msgid "be quiet" msgstr "weniger Ausgaben" -#: builtin/am.c:2252 +#: builtin/am.c:2239 msgid "add a Signed-off-by line to the commit message" msgstr "der Commit-Beschreibung eine Signed-off-by Zeile hinzufügen" -#: builtin/am.c:2255 +#: builtin/am.c:2242 msgid "recode into utf8 (default)" msgstr "nach UTF-8 umkodieren (Standard)" -#: builtin/am.c:2257 +#: builtin/am.c:2244 msgid "pass -k flag to git-mailinfo" msgstr "-k an git-mailinfo übergeben" -#: builtin/am.c:2259 +#: builtin/am.c:2246 msgid "pass -b flag to git-mailinfo" msgstr "-b an git-mailinfo übergeben" -#: builtin/am.c:2261 +#: builtin/am.c:2248 msgid "pass -m flag to git-mailinfo" msgstr "-m an git-mailinfo übergeben" -#: builtin/am.c:2263 +#: builtin/am.c:2250 msgid "pass --keep-cr flag to git-mailsplit for mbox format" msgstr "--keep-cr an git-mailsplit für mbox-Format übergeben" -#: builtin/am.c:2266 +#: builtin/am.c:2253 msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr" msgstr "kein --keep-cr an git-mailsplit übergeben, unabhängig von am.keepcr" -#: builtin/am.c:2269 +#: builtin/am.c:2256 msgid "strip everything before a scissors line" msgstr "alles vor einer Scheren-Zeile entfernen" -#: builtin/am.c:2270 builtin/apply.c:4546 +#: builtin/am.c:2257 builtin/apply.c:4837 msgid "action" msgstr "Aktion" -#: builtin/am.c:2271 builtin/am.c:2274 builtin/am.c:2277 builtin/am.c:2280 -#: builtin/am.c:2283 builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 -#: builtin/am.c:2298 +#: builtin/am.c:2258 builtin/am.c:2261 builtin/am.c:2264 builtin/am.c:2267 +#: builtin/am.c:2270 builtin/am.c:2273 builtin/am.c:2276 builtin/am.c:2279 +#: builtin/am.c:2285 msgid "pass it through git-apply" msgstr "an git-apply übergeben" -#: builtin/am.c:2279 builtin/apply.c:4570 +#: builtin/am.c:2266 builtin/apply.c:4861 msgid "root" msgstr "Wurzelverzeichnis" -#: builtin/am.c:2282 builtin/am.c:2285 builtin/apply.c:4508 -#: builtin/apply.c:4511 builtin/clone.c:90 builtin/fetch.c:95 +#: builtin/am.c:2269 builtin/am.c:2272 builtin/apply.c:4799 +#: builtin/apply.c:4802 builtin/clone.c:90 builtin/fetch.c:96 #: builtin/pull.c:179 builtin/submodule--helper.c:277 -#: builtin/submodule--helper.c:404 builtin/submodule--helper.c:485 -#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:767 -#: builtin/submodule--helper.c:770 +#: builtin/submodule--helper.c:402 builtin/submodule--helper.c:482 +#: builtin/submodule--helper.c:485 builtin/submodule--helper.c:823 +#: builtin/submodule--helper.c:826 msgid "path" msgstr "Pfad" -#: builtin/am.c:2288 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669 -#: builtin/grep.c:706 builtin/merge.c:199 builtin/pull.c:134 builtin/pull.c:193 -#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645 +#: builtin/am.c:2275 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669 +#: builtin/grep.c:706 builtin/merge.c:200 builtin/pull.c:134 builtin/pull.c:193 +#: builtin/repack.c:181 builtin/repack.c:185 builtin/show-branch.c:645 #: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132 #: parse-options.h:134 parse-options.h:244 msgid "n" msgstr "Anzahl" -#: builtin/am.c:2291 builtin/apply.c:4514 +#: builtin/am.c:2278 builtin/apply.c:4805 msgid "num" msgstr "Anzahl" -#: builtin/am.c:2294 builtin/for-each-ref.c:37 builtin/replace.c:438 +#: builtin/am.c:2281 builtin/for-each-ref.c:37 builtin/replace.c:438 #: builtin/tag.c:372 msgid "format" msgstr "Format" -#: builtin/am.c:2295 +#: builtin/am.c:2282 msgid "format the patch(es) are in" msgstr "Patch-Format" -#: builtin/am.c:2301 +#: builtin/am.c:2288 msgid "override error message when patch failure occurs" msgstr "Meldung bei fehlerhafter Patch-Anwendung überschreiben" -#: builtin/am.c:2303 +#: builtin/am.c:2290 msgid "continue applying patches after resolving a conflict" msgstr "Anwendung der Patches nach Auflösung eines Konfliktes fortsetzen" -#: builtin/am.c:2306 +#: builtin/am.c:2293 msgid "synonyms for --continue" msgstr "Synonyme für --continue" -#: builtin/am.c:2309 +#: builtin/am.c:2296 msgid "skip the current patch" msgstr "den aktuellen Patch auslassen" -#: builtin/am.c:2312 +#: builtin/am.c:2299 msgid "restore the original branch and abort the patching operation." msgstr "" "ursprünglichen Branch wiederherstellen und Anwendung der Patches abbrechen" -#: builtin/am.c:2316 +#: builtin/am.c:2303 msgid "lie about committer date" msgstr "Autor-Datum als Commit-Datum verwenden" -#: builtin/am.c:2318 +#: builtin/am.c:2305 msgid "use current timestamp for author date" msgstr "aktuellen Zeitstempel als Autor-Datum verwenden" -#: builtin/am.c:2320 builtin/commit.c:1609 builtin/merge.c:228 +#: builtin/am.c:2307 builtin/commit.c:1610 builtin/merge.c:229 #: builtin/pull.c:164 builtin/revert.c:92 builtin/tag.c:355 msgid "key-id" msgstr "GPG-Schlüsselkennung" -#: builtin/am.c:2321 +#: builtin/am.c:2308 msgid "GPG-sign commits" msgstr "Commits mit GPG signieren" -#: builtin/am.c:2324 +#: builtin/am.c:2311 msgid "(internal use for git-rebase)" msgstr "(intern für git-rebase verwendet)" -#: builtin/am.c:2339 +#: builtin/am.c:2326 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." @@ -3202,16 +3590,16 @@ msgstr "" "Die -b/--binary Option hat seit Langem keinen Effekt und wird\n" "entfernt. Bitte verwenden Sie diese nicht mehr." -#: builtin/am.c:2346 +#: builtin/am.c:2333 msgid "failed to read the index" msgstr "Fehler beim Lesen des Index" -#: builtin/am.c:2361 +#: builtin/am.c:2348 #, c-format msgid "previous rebase directory %s still exists but mbox given." msgstr "Vorheriges Rebase-Verzeichnis %s existiert noch, aber mbox gegeben." -#: builtin/am.c:2385 +#: builtin/am.c:2372 #, c-format msgid "" "Stray %s directory found.\n" @@ -3220,74 +3608,74 @@ msgstr "" "Stray %s Verzeichnis gefunden.\n" "Benutzen Sie \"git am --abort\", um es zu entfernen." -#: builtin/am.c:2391 +#: builtin/am.c:2378 msgid "Resolve operation not in progress, we are not resuming." msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt." -#: builtin/apply.c:59 +#: builtin/apply.c:122 msgid "git apply [<options>] [<patch>...]" msgstr "git apply [<Optionen>] [<Patch>...]" -#: builtin/apply.c:111 +#: builtin/apply.c:153 #, c-format msgid "unrecognized whitespace option '%s'" msgstr "nicht erkannte Whitespace-Option: '%s'" -#: builtin/apply.c:126 +#: builtin/apply.c:169 #, c-format msgid "unrecognized whitespace ignore option '%s'" msgstr "nicht erkannte Option zum Ignorieren von Whitespace: '%s'" -#: builtin/apply.c:818 +#: builtin/apply.c:854 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten" -#: builtin/apply.c:827 +#: builtin/apply.c:863 #, c-format msgid "regexec returned %d for input: %s" msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s" -#: builtin/apply.c:908 +#: builtin/apply.c:947 #, c-format msgid "unable to find filename in patch at line %d" msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden." -#: builtin/apply.c:937 +#: builtin/apply.c:984 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "" "git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile " "%d" -#: builtin/apply.c:942 +#: builtin/apply.c:989 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "" "git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d" -#: builtin/apply.c:943 +#: builtin/apply.c:990 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "" "git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d" -#: builtin/apply.c:949 +#: builtin/apply.c:995 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d" -#: builtin/apply.c:1406 +#: builtin/apply.c:1489 #, c-format msgid "recount: unexpected line: %.*s" msgstr "recount: unerwartete Zeile: %.*s" -#: builtin/apply.c:1463 +#: builtin/apply.c:1550 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s" -#: builtin/apply.c:1480 +#: builtin/apply.c:1567 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -3302,65 +3690,65 @@ msgstr[1] "" "Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn " "%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)" -#: builtin/apply.c:1646 +#: builtin/apply.c:1743 msgid "new file depends on old contents" msgstr "neue Datei hängt von alten Inhalten ab" -#: builtin/apply.c:1648 +#: builtin/apply.c:1745 msgid "deleted file still has contents" msgstr "entfernte Datei hat noch Inhalte" -#: builtin/apply.c:1674 +#: builtin/apply.c:1774 #, c-format msgid "corrupt patch at line %d" msgstr "fehlerhafter Patch bei Zeile %d" -#: builtin/apply.c:1710 +#: builtin/apply.c:1810 #, c-format msgid "new file %s depends on old contents" msgstr "neue Datei %s hängt von alten Inhalten ab" -#: builtin/apply.c:1712 +#: builtin/apply.c:1812 #, c-format msgid "deleted file %s still has contents" msgstr "entfernte Datei %s hat noch Inhalte" -#: builtin/apply.c:1715 +#: builtin/apply.c:1815 #, c-format msgid "** warning: file %s becomes empty but is not deleted" msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt." -#: builtin/apply.c:1861 +#: builtin/apply.c:1962 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s" -#: builtin/apply.c:1895 +#: builtin/apply.c:1999 #, c-format msgid "unrecognized binary patch at line %d" msgstr "nicht erkannter Binär-Patch bei Zeile %d" -#: builtin/apply.c:2048 +#: builtin/apply.c:2154 #, c-format msgid "patch with only garbage at line %d" msgstr "Patch mit nutzlosen Informationen bei Zeile %d" -#: builtin/apply.c:2138 +#: builtin/apply.c:2244 #, c-format msgid "unable to read symlink %s" msgstr "konnte symbolische Verknüpfung %s nicht lesen" -#: builtin/apply.c:2142 +#: builtin/apply.c:2248 #, c-format msgid "unable to open or read %s" msgstr "konnte %s nicht öffnen oder lesen" -#: builtin/apply.c:2775 +#: builtin/apply.c:2901 #, c-format msgid "invalid start of line: '%c'" msgstr "Ungültiger Zeilenanfang: '%c'" -#: builtin/apply.c:2894 +#: builtin/apply.c:3020 #, c-format msgid "Hunk #%d succeeded at %d (offset %d line)." msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." @@ -3368,12 +3756,12 @@ msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)" msgstr[1] "" "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)" -#: builtin/apply.c:2906 +#: builtin/apply.c:3032 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "Kontext reduziert zu (%ld/%ld), um Patch-Bereich bei %d anzuwenden" -#: builtin/apply.c:2912 +#: builtin/apply.c:3038 #, c-format msgid "" "while searching for:\n" @@ -3382,353 +3770,348 @@ msgstr "" "bei der Suche nach:\n" "%.*s" -#: builtin/apply.c:2932 +#: builtin/apply.c:3060 #, c-format msgid "missing binary patch data for '%s'" msgstr "keine Daten in Binär-Patch für '%s'" -#: builtin/apply.c:3033 +#: builtin/apply.c:3163 #, c-format msgid "binary patch does not apply to '%s'" msgstr "Konnte Binär-Patch nicht auf '%s' anwenden" -#: builtin/apply.c:3039 +#: builtin/apply.c:3169 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" msgstr "" "Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)" -#: builtin/apply.c:3060 +#: builtin/apply.c:3190 #, c-format msgid "patch failed: %s:%ld" msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld" -#: builtin/apply.c:3184 +#: builtin/apply.c:3314 #, c-format msgid "cannot checkout %s" msgstr "kann %s nicht auschecken" -#: builtin/apply.c:3229 builtin/apply.c:3240 builtin/apply.c:3285 -#, c-format -msgid "read of %s failed" -msgstr "Konnte %s nicht lesen" - -#: builtin/apply.c:3237 +#: builtin/apply.c:3370 #, c-format msgid "reading from '%s' beyond a symbolic link" msgstr "'%s' ist hinter einer symbolischen Verknüpfung" -#: builtin/apply.c:3265 builtin/apply.c:3487 +#: builtin/apply.c:3399 builtin/apply.c:3630 #, c-format msgid "path %s has been renamed/deleted" msgstr "Pfad %s wurde umbenannt/gelöscht" -#: builtin/apply.c:3346 builtin/apply.c:3501 +#: builtin/apply.c:3482 builtin/apply.c:3644 #, c-format msgid "%s: does not exist in index" msgstr "%s ist nicht im Index" -#: builtin/apply.c:3350 builtin/apply.c:3493 builtin/apply.c:3515 +#: builtin/apply.c:3486 builtin/apply.c:3636 builtin/apply.c:3658 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: builtin/apply.c:3355 builtin/apply.c:3509 +#: builtin/apply.c:3491 builtin/apply.c:3652 #, c-format msgid "%s: does not match index" msgstr "%s entspricht nicht der Version im Index" -#: builtin/apply.c:3457 +#: builtin/apply.c:3597 msgid "removal patch leaves file contents" msgstr "Lösch-Patch hinterlässt Dateiinhalte" -#: builtin/apply.c:3526 +#: builtin/apply.c:3669 #, c-format msgid "%s: wrong type" msgstr "%s: falscher Typ" -#: builtin/apply.c:3528 +#: builtin/apply.c:3671 #, c-format msgid "%s has type %o, expected %o" msgstr "%s ist vom Typ %o, erwartete %o" -#: builtin/apply.c:3687 builtin/apply.c:3689 +#: builtin/apply.c:3822 builtin/apply.c:3824 #, c-format msgid "invalid path '%s'" msgstr "Ungültiger Pfad '%s'" -#: builtin/apply.c:3744 +#: builtin/apply.c:3879 #, c-format msgid "%s: already exists in index" msgstr "%s ist bereits bereitgestellt" -#: builtin/apply.c:3747 +#: builtin/apply.c:3882 #, c-format msgid "%s: already exists in working directory" msgstr "%s existiert bereits im Arbeitsverzeichnis" -#: builtin/apply.c:3767 +#: builtin/apply.c:3902 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)" -#: builtin/apply.c:3772 +#: builtin/apply.c:3907 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s" -#: builtin/apply.c:3792 +#: builtin/apply.c:3927 #, c-format msgid "affected file '%s' is beyond a symbolic link" msgstr "betroffene Datei '%s' ist hinter einer symbolischen Verknüpfung" -#: builtin/apply.c:3796 +#: builtin/apply.c:3931 #, c-format msgid "%s: patch does not apply" msgstr "%s: Patch konnte nicht angewendet werden" -#: builtin/apply.c:3810 +#: builtin/apply.c:3945 #, c-format msgid "Checking patch %s..." msgstr "Prüfe Patch %s ..." -#: builtin/apply.c:3903 builtin/checkout.c:233 builtin/reset.c:135 +#: builtin/apply.c:4038 builtin/checkout.c:233 builtin/reset.c:135 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen" -#: builtin/apply.c:4046 +#: builtin/apply.c:4182 #, c-format msgid "unable to remove %s from index" msgstr "konnte %s nicht aus dem Index entfernen" -#: builtin/apply.c:4075 +#: builtin/apply.c:4215 #, c-format msgid "corrupt patch for submodule %s" msgstr "fehlerhafter Patch für Submodul %s" -#: builtin/apply.c:4079 +#: builtin/apply.c:4219 #, c-format msgid "unable to stat newly created file '%s'" msgstr "konnte neu erstellte Datei '%s' nicht lesen" -#: builtin/apply.c:4084 +#: builtin/apply.c:4224 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen" -#: builtin/apply.c:4087 builtin/apply.c:4195 +#: builtin/apply.c:4227 builtin/apply.c:4340 #, c-format msgid "unable to add cache entry for %s" msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen" -#: builtin/apply.c:4120 +#: builtin/apply.c:4260 #, c-format msgid "closing file '%s'" msgstr "schließe Datei '%s'" -#: builtin/apply.c:4169 +#: builtin/apply.c:4313 #, c-format msgid "unable to write file '%s' mode %o" msgstr "konnte Datei '%s' mit Modus %o nicht schreiben" -#: builtin/apply.c:4256 +#: builtin/apply.c:4403 #, c-format msgid "Applied patch %s cleanly." msgstr "Patch %s sauber angewendet" -#: builtin/apply.c:4264 +#: builtin/apply.c:4411 msgid "internal error" msgstr "interner Fehler" -#: builtin/apply.c:4267 +#: builtin/apply.c:4414 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..." msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..." -#: builtin/apply.c:4277 +#: builtin/apply.c:4424 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "Verkürze Name von .rej Datei zu %.*s.rej" -#: builtin/apply.c:4285 +#: builtin/apply.c:4432 #, c-format msgid "cannot open %s: %s" msgstr "Kann %s nicht öffnen: %s" -#: builtin/apply.c:4298 +#: builtin/apply.c:4445 #, c-format msgid "Hunk #%d applied cleanly." msgstr "Patch-Bereich #%d sauber angewendet." -#: builtin/apply.c:4301 +#: builtin/apply.c:4448 #, c-format msgid "Rejected hunk #%d." msgstr "Patch-Block #%d zurückgewiesen." -#: builtin/apply.c:4387 +#: builtin/apply.c:4537 #, c-format msgid "Skipped patch '%s'." msgstr "Patch '%s' ausgelassen." -#: builtin/apply.c:4395 +#: builtin/apply.c:4545 msgid "unrecognized input" msgstr "nicht erkannte Eingabe" -#: builtin/apply.c:4406 +#: builtin/apply.c:4556 msgid "unable to read index file" msgstr "Konnte Index-Datei nicht lesen" -#: builtin/apply.c:4509 +#: builtin/apply.c:4701 +msgid "--3way outside a repository" +msgstr "" +"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden." + +#: builtin/apply.c:4709 +msgid "--index outside a repository" +msgstr "" +"Die Option --index kann nicht außerhalb eines Repositories verwendet werden." + +#: builtin/apply.c:4712 +msgid "--cached outside a repository" +msgstr "" +"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden." + +#: builtin/apply.c:4745 +#, c-format +msgid "can't open patch '%s'" +msgstr "kann Patch '%s' nicht öffnen" + +#: builtin/apply.c:4760 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "unterdrückte %d Whitespace-Fehler" +msgstr[1] "unterdrückte %d Whitespace-Fehler" + +#: builtin/apply.c:4766 builtin/apply.c:4776 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu." +msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu." + +#: builtin/apply.c:4800 msgid "don't apply changes matching the given path" msgstr "keine Änderungen im angegebenen Pfad anwenden" -#: builtin/apply.c:4512 +#: builtin/apply.c:4803 msgid "apply changes matching the given path" msgstr "Änderungen nur im angegebenen Pfad anwenden" -#: builtin/apply.c:4515 +#: builtin/apply.c:4806 msgid "remove <num> leading slashes from traditional diff paths" msgstr "" "<Anzahl> vorangestellte Schrägstriche von herkömmlichen Differenzpfaden " "entfernen" -#: builtin/apply.c:4518 +#: builtin/apply.c:4809 msgid "ignore additions made by the patch" msgstr "hinzugefügte Zeilen des Patches ignorieren" -#: builtin/apply.c:4520 +#: builtin/apply.c:4811 msgid "instead of applying the patch, output diffstat for the input" msgstr "" "anstatt der Anwendung des Patches, den \"diffstat\" für die Eingabe " "ausgegeben" -#: builtin/apply.c:4524 +#: builtin/apply.c:4815 msgid "show number of added and deleted lines in decimal notation" msgstr "" "die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation anzeigen" -#: builtin/apply.c:4526 +#: builtin/apply.c:4817 msgid "instead of applying the patch, output a summary for the input" msgstr "" "anstatt der Anwendung des Patches, eine Zusammenfassung für die Eingabe " "ausgeben" -#: builtin/apply.c:4528 +#: builtin/apply.c:4819 msgid "instead of applying the patch, see if the patch is applicable" msgstr "" "anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann" -#: builtin/apply.c:4530 +#: builtin/apply.c:4821 msgid "make sure the patch is applicable to the current index" msgstr "" "sicherstellen, dass der Patch mit dem aktuellen Index angewendet werden kann" -#: builtin/apply.c:4532 +#: builtin/apply.c:4823 msgid "apply a patch without touching the working tree" msgstr "Patch anwenden, ohne Änderungen im Arbeitsverzeichnis vorzunehmen" -#: builtin/apply.c:4534 +#: builtin/apply.c:4825 msgid "accept a patch that touches outside the working area" msgstr "" "Patch anwenden, der Änderungen außerhalb des Arbeitsverzeichnisses vornimmt" -#: builtin/apply.c:4536 +#: builtin/apply.c:4827 msgid "also apply the patch (use with --stat/--summary/--check)" msgstr "Patch anwenden (Benutzung mit --stat/--summary/--check)" -#: builtin/apply.c:4538 +#: builtin/apply.c:4829 msgid "attempt three-way merge if a patch does not apply" msgstr "versuche 3-Wege-Merge, wenn der Patch nicht angewendet werden konnte" -#: builtin/apply.c:4540 +#: builtin/apply.c:4831 msgid "build a temporary index based on embedded index information" msgstr "" "einen temporären Index, basierend auf den integrierten Index-Informationen, " "erstellen" -#: builtin/apply.c:4543 builtin/checkout-index.c:169 builtin/ls-files.c:425 +#: builtin/apply.c:4834 builtin/checkout-index.c:169 builtin/ls-files.c:426 msgid "paths are separated with NUL character" msgstr "Pfade sind getrennt durch NUL Zeichen" -#: builtin/apply.c:4545 +#: builtin/apply.c:4836 msgid "ensure at least <n> lines of context match" msgstr "" "sicher stellen, dass mindestens <n> Zeilen des Kontextes übereinstimmen" -#: builtin/apply.c:4547 +#: builtin/apply.c:4838 msgid "detect new or modified lines that have whitespace errors" msgstr "neue oder geänderte Zeilen, die Whitespace-Fehler haben, ermitteln" -#: builtin/apply.c:4550 builtin/apply.c:4553 +#: builtin/apply.c:4841 builtin/apply.c:4844 msgid "ignore changes in whitespace when finding context" msgstr "Änderungen im Whitespace bei der Suche des Kontextes ignorieren" -#: builtin/apply.c:4556 +#: builtin/apply.c:4847 msgid "apply the patch in reverse" msgstr "den Patch in umgekehrter Reihenfolge anwenden" -#: builtin/apply.c:4558 +#: builtin/apply.c:4849 msgid "don't expect at least one line of context" msgstr "keinen Kontext erwarten" -#: builtin/apply.c:4560 +#: builtin/apply.c:4851 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "" "zurückgewiesene Patch-Blöcke in entsprechenden *.rej Dateien hinterlassen" -#: builtin/apply.c:4562 +#: builtin/apply.c:4853 msgid "allow overlapping hunks" msgstr "sich überlappende Patch-Blöcke erlauben" -#: builtin/apply.c:4565 +#: builtin/apply.c:4856 msgid "tolerate incorrectly detected missing new-line at the end of file" msgstr "fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende tolerieren" -#: builtin/apply.c:4568 +#: builtin/apply.c:4859 msgid "do not trust the line counts in the hunk headers" msgstr "den Zeilennummern im Kopf des Patch-Blocks nicht vertrauen" -#: builtin/apply.c:4571 +#: builtin/apply.c:4862 msgid "prepend <root> to all filenames" msgstr "<Wurzelverzeichnis> vor alle Dateinamen stellen" -#: builtin/apply.c:4593 -msgid "--3way outside a repository" -msgstr "" -"Die Option --3way kann nicht außerhalb eines Repositories verwendet werden." - -#: builtin/apply.c:4601 -msgid "--index outside a repository" -msgstr "" -"Die Option --index kann nicht außerhalb eines Repositories verwendet werden." - -#: builtin/apply.c:4604 -msgid "--cached outside a repository" -msgstr "" -"Die Option --cached kann nicht außerhalb eines Repositories verwendet werden." - -#: builtin/apply.c:4623 -#, c-format -msgid "can't open patch '%s'" -msgstr "kann Patch '%s' nicht öffnen" - -#: builtin/apply.c:4637 -#, c-format -msgid "squelched %d whitespace error" -msgid_plural "squelched %d whitespace errors" -msgstr[0] "unterdrückte %d Whitespace-Fehler" -msgstr[1] "unterdrückte %d Whitespace-Fehler" - -#: builtin/apply.c:4643 builtin/apply.c:4653 -#, c-format -msgid "%d line adds whitespace errors." -msgid_plural "%d lines add whitespace errors." -msgstr[0] "%d Zeile fügt Whitespace-Fehler hinzu." -msgstr[1] "%d Zeilen fügen Whitespace-Fehler hinzu." - #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" @@ -3784,106 +4167,106 @@ msgstr "git blame [<Optionen>] [<rev-opts>] [<Commit>] [--] <Datei>" msgid "<rev-opts> are documented in git-rev-list(1)" msgstr "<rev-opts> sind dokumentiert in git-rev-list(1)" -#: builtin/blame.c:1782 +#: builtin/blame.c:1781 msgid "Blaming lines" msgstr "Verarbeite Zeilen" -#: builtin/blame.c:2531 +#: builtin/blame.c:2536 msgid "Show blame entries as we find them, incrementally" msgstr "\"blame\"-Einträge schrittweise anzeigen, während wir sie generieren" -#: builtin/blame.c:2532 +#: builtin/blame.c:2537 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "leere SHA-1 für Grenz-Commits anzeigen (Standard: aus)" -#: builtin/blame.c:2533 +#: builtin/blame.c:2538 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Ursprungs-Commit nicht als Grenzen behandeln (Standard: aus)" -#: builtin/blame.c:2534 +#: builtin/blame.c:2539 msgid "Show work cost statistics" msgstr "Statistiken zum Arbeitsaufwand anzeigen" -#: builtin/blame.c:2535 +#: builtin/blame.c:2540 msgid "Force progress reporting" msgstr "Fortschrittsanzeige erzwingen" -#: builtin/blame.c:2536 +#: builtin/blame.c:2541 msgid "Show output score for blame entries" msgstr "Ausgabebewertung für \"blame\"-Einträge anzeigen" -#: builtin/blame.c:2537 +#: builtin/blame.c:2542 msgid "Show original filename (Default: auto)" msgstr "ursprünglichen Dateinamen anzeigen (Standard: auto)" -#: builtin/blame.c:2538 +#: builtin/blame.c:2543 msgid "Show original linenumber (Default: off)" msgstr "ursprüngliche Zeilennummer anzeigen (Standard: aus)" -#: builtin/blame.c:2539 +#: builtin/blame.c:2544 msgid "Show in a format designed for machine consumption" msgstr "Anzeige in einem Format für maschinelle Auswertung" -#: builtin/blame.c:2540 +#: builtin/blame.c:2545 msgid "Show porcelain format with per-line commit information" msgstr "" "Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile" -#: builtin/blame.c:2541 +#: builtin/blame.c:2546 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "" "Den gleichen Ausgabemodus benutzen wie \"git-annotate\" (Standard: aus)" -#: builtin/blame.c:2542 +#: builtin/blame.c:2547 msgid "Show raw timestamp (Default: off)" msgstr "Unbearbeiteten Zeitstempel anzeigen (Standard: aus)" -#: builtin/blame.c:2543 +#: builtin/blame.c:2548 msgid "Show long commit SHA1 (Default: off)" msgstr "Langen Commit-SHA1 anzeigen (Standard: aus)" -#: builtin/blame.c:2544 +#: builtin/blame.c:2549 msgid "Suppress author name and timestamp (Default: off)" msgstr "Den Namen des Autors und den Zeitstempel unterdrücken (Standard: aus)" -#: builtin/blame.c:2545 +#: builtin/blame.c:2550 msgid "Show author email instead of name (Default: off)" msgstr "" "Anstatt des Namens die E-Mail-Adresse des Autors anzeigen (Standard: aus)" -#: builtin/blame.c:2546 +#: builtin/blame.c:2551 msgid "Ignore whitespace differences" msgstr "Unterschiede im Whitespace ignorieren" -#: builtin/blame.c:2547 +#: builtin/blame.c:2552 msgid "Spend extra cycles to find better match" msgstr "Länger arbeiten, um bessere Ãœbereinstimmungen zu finden" -#: builtin/blame.c:2548 +#: builtin/blame.c:2553 msgid "Use revisions from <file> instead of calling git-rev-list" msgstr "Commits von <Datei> benutzen, anstatt \"git-rev-list\" aufzurufen" -#: builtin/blame.c:2549 +#: builtin/blame.c:2554 msgid "Use <file>'s contents as the final image" msgstr "Inhalte der <Datei>en als endgültiges Abbild benutzen" -#: builtin/blame.c:2550 builtin/blame.c:2551 +#: builtin/blame.c:2555 builtin/blame.c:2556 msgid "score" msgstr "Bewertung" -#: builtin/blame.c:2550 +#: builtin/blame.c:2555 msgid "Find line copies within and across files" msgstr "kopierte Zeilen innerhalb oder zwischen Dateien finden" -#: builtin/blame.c:2551 +#: builtin/blame.c:2556 msgid "Find line movements within and across files" msgstr "verschobene Zeilen innerhalb oder zwischen Dateien finden" -#: builtin/blame.c:2552 +#: builtin/blame.c:2557 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2552 +#: builtin/blame.c:2557 msgid "Process only line range n,m, counting from 1" msgstr "nur Zeilen im Bereich n,m verarbeiten, gezählt von 1" @@ -3893,7 +4276,7 @@ msgstr "nur Zeilen im Bereich n,m verarbeiten, gezählt von 1" #. takes 22 places, is the longest among various forms of #. relative timestamps, but your language may need more or #. fewer display columns. -#: builtin/blame.c:2641 +#: builtin/blame.c:2649 msgid "4 years, 11 months ago" msgstr "vor 4 Jahren, und 11 Monaten" @@ -3997,121 +4380,128 @@ msgstr "Remote-Tracking-Branch %s entfernt (war %s).\n" msgid "Deleted branch %s (was %s).\n" msgstr "Branch %s entfernt (war %s).\n" -#: builtin/branch.c:309 +#: builtin/branch.c:312 #, c-format msgid "[%s: gone]" msgstr "[%s: entfernt]" -#: builtin/branch.c:314 +#: builtin/branch.c:317 #, c-format msgid "[%s]" msgstr "[%s]" -#: builtin/branch.c:319 +#: builtin/branch.c:322 #, c-format msgid "[%s: behind %d]" msgstr "[%s: %d hinterher]" -#: builtin/branch.c:321 +#: builtin/branch.c:324 #, c-format msgid "[behind %d]" msgstr "[%d hinterher]" -#: builtin/branch.c:325 +#: builtin/branch.c:328 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: %d voraus]" -#: builtin/branch.c:327 +#: builtin/branch.c:330 #, c-format msgid "[ahead %d]" msgstr "[%d voraus]" -#: builtin/branch.c:330 +#: builtin/branch.c:333 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: %d voraus, %d hinterher]" -#: builtin/branch.c:333 +#: builtin/branch.c:336 #, c-format msgid "[ahead %d, behind %d]" msgstr "[%d voraus, %d hinterher]" -#: builtin/branch.c:346 +#: builtin/branch.c:349 msgid " **** invalid ref ****" msgstr " **** ungültige Referenz ****" -#: builtin/branch.c:372 +#: builtin/branch.c:375 #, c-format msgid "(no branch, rebasing %s)" msgstr "(kein Branch, Rebase von Branch %s im Gange)" -#: builtin/branch.c:375 +#: builtin/branch.c:378 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(kein Branch, binäre Suche begonnen bei %s)" #. TRANSLATORS: make sure this matches #. "HEAD detached at " in wt-status.c -#: builtin/branch.c:381 +#: builtin/branch.c:384 #, c-format msgid "(HEAD detached at %s)" msgstr "(HEAD losgelöst bei %s)" #. TRANSLATORS: make sure this matches #. "HEAD detached from " in wt-status.c -#: builtin/branch.c:386 +#: builtin/branch.c:389 #, c-format msgid "(HEAD detached from %s)" msgstr "(HEAD losgelöst von %s)" -#: builtin/branch.c:390 +#: builtin/branch.c:393 msgid "(no branch)" msgstr "(kein Branch)" -#: builtin/branch.c:541 +#: builtin/branch.c:544 #, c-format msgid "Branch %s is being rebased at %s" msgstr "Branch %s wird auf %s umgesetzt" -#: builtin/branch.c:545 +#: builtin/branch.c:548 #, c-format msgid "Branch %s is being bisected at %s" msgstr "Binäre Suche von Branch %s zu %s im Gange" -#: builtin/branch.c:560 +#: builtin/branch.c:563 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:570 +#: builtin/branch.c:573 #, c-format msgid "Invalid branch name: '%s'" msgstr "Ungültiger Branchname: '%s'" -#: builtin/branch.c:587 +#: builtin/branch.c:590 msgid "Branch rename failed" msgstr "Umbenennung des Branches fehlgeschlagen" -#: builtin/branch.c:591 +#: builtin/branch.c:594 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "falsch benannten Branch '%s' umbenannt" -#: builtin/branch.c:594 +#: builtin/branch.c:597 #, 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:601 +#: builtin/branch.c:604 msgid "Branch is renamed, but update of config-file failed" msgstr "" "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist " "fehlgeschlagen." -#: builtin/branch.c:623 -msgid "could not write branch description template" -msgstr "Konnte Beschreibungsvorlage für Branch nicht schreiben." +#: builtin/branch.c:620 +#, c-format +msgid "" +"Please edit the description for the branch\n" +" %s\n" +"Lines starting with '%c' will be stripped.\n" +msgstr "" +"Bitte ändern Sie die Beschreibung für den Branch\n" +" %s\n" +"Zeilen, die mit '%c' beginnen, werden entfernt.\n" #: builtin/branch.c:651 msgid "Generic options" @@ -4214,8 +4604,8 @@ msgstr "Schüssel" msgid "field name to sort on" msgstr "sortiere nach diesem Feld" -#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:401 -#: builtin/notes.c:404 builtin/notes.c:564 builtin/notes.c:567 +#: builtin/branch.c:686 builtin/for-each-ref.c:41 builtin/notes.c:402 +#: builtin/notes.c:405 builtin/notes.c:565 builtin/notes.c:568 #: builtin/tag.c:369 msgid "object" msgstr "Objekt" @@ -4343,7 +4733,7 @@ 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:428 +#: builtin/cat-file.c:443 msgid "" "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|" "<type>|--textconv) <object>" @@ -4351,60 +4741,60 @@ msgstr "" "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|" "<Art>|--textconv) <Objekt>" -#: builtin/cat-file.c:429 +#: builtin/cat-file.c:444 msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]" msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]" -#: builtin/cat-file.c:466 +#: builtin/cat-file.c:481 msgid "<type> can be one of: blob, tree, commit, tag" msgstr "<Art> kann sein: blob, tree, commit, tag" -#: builtin/cat-file.c:467 +#: builtin/cat-file.c:482 msgid "show object type" msgstr "Objektart anzeigen" -#: builtin/cat-file.c:468 +#: builtin/cat-file.c:483 msgid "show object size" msgstr "Objektgröße anzeigen" -#: builtin/cat-file.c:470 +#: builtin/cat-file.c:485 msgid "exit with zero when there's no error" msgstr "mit Rückgabewert 0 beenden, wenn kein Fehler aufgetreten ist" -#: builtin/cat-file.c:471 +#: builtin/cat-file.c:486 msgid "pretty-print object's content" msgstr "ansprechende Anzeige des Objektinhaltes" -#: builtin/cat-file.c:473 +#: builtin/cat-file.c:488 msgid "for blob objects, run textconv on object's content" msgstr "eine Textkonvertierung auf den Inhalt von Blob-Objekten ausführen" -#: builtin/cat-file.c:475 +#: builtin/cat-file.c:490 msgid "allow -s and -t to work with broken/corrupt objects" msgstr "-s und -t mit beschädigten Objekten erlauben" -#: builtin/cat-file.c:476 +#: builtin/cat-file.c:491 msgid "buffer --batch output" msgstr "Ausgabe von --batch puffern" -#: builtin/cat-file.c:478 +#: builtin/cat-file.c:493 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:481 +#: builtin/cat-file.c:496 msgid "show info about objects fed from the standard input" msgstr "" "Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe" -#: builtin/cat-file.c:484 +#: builtin/cat-file.c:499 msgid "follow in-tree symlinks (used with --batch or --batch-check)" msgstr "" "symbolischen Verknüpfungen innerhalb des Repositories folgen (verwendet mit " "--batch oder --batch-check)" -#: builtin/cat-file.c:486 +#: builtin/cat-file.c:501 msgid "show all objects with --batch or --batch-check" msgstr "alle Objekte mit --batch oder --batch-check anzeigen" @@ -4432,7 +4822,7 @@ msgstr "Dateinamen von der Standard-Eingabe lesen" msgid "terminate input and output records by a NUL character" msgstr "Einträge von Ein- und Ausgabe mit NUL-Zeichen abschließen" -#: builtin/check-ignore.c:18 builtin/checkout.c:1135 builtin/gc.c:325 +#: builtin/check-ignore.c:18 builtin/checkout.c:1138 builtin/gc.c:325 msgid "suppress progress reporting" msgstr "Fortschrittsanzeige unterdrücken" @@ -4525,9 +4915,9 @@ msgid "write the content to temporary files" msgstr "den Inhalt in temporäre Dateien schreiben" #: builtin/checkout-index.c:174 builtin/column.c:30 -#: builtin/submodule--helper.c:491 builtin/submodule--helper.c:494 -#: builtin/submodule--helper.c:497 builtin/submodule--helper.c:500 -#: builtin/submodule--helper.c:774 +#: builtin/submodule--helper.c:488 builtin/submodule--helper.c:491 +#: builtin/submodule--helper.c:494 builtin/submodule--helper.c:497 +#: builtin/submodule--helper.c:830 builtin/worktree.c:469 msgid "string" msgstr "Zeichenkette" @@ -4595,10 +4985,6 @@ 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:279 builtin/checkout.c:473 -msgid "corrupt index file" -msgstr "beschädigte Index-Datei" - #: builtin/checkout.c:339 builtin/checkout.c:346 #, c-format msgid "path '%s' is unmerged" @@ -4608,50 +4994,50 @@ msgstr "Pfad '%s' ist nicht zusammengeführt." msgid "you need to resolve your current index first" msgstr "Sie müssen zuerst die Konflikte in Ihrem aktuellen Index auflösen." -#: builtin/checkout.c:622 +#: builtin/checkout.c:625 #, c-format msgid "Can not do reflog for '%s': %s\n" msgstr "Kann \"reflog\" für '%s' nicht durchführen: %s\n" -#: builtin/checkout.c:660 +#: builtin/checkout.c:664 msgid "HEAD is now at" msgstr "HEAD ist jetzt bei" -#: builtin/checkout.c:664 builtin/clone.c:661 +#: builtin/checkout.c:668 builtin/clone.c:661 msgid "unable to update HEAD" msgstr "Konnte HEAD nicht aktualisieren." -#: builtin/checkout.c:668 +#: builtin/checkout.c:672 #, c-format msgid "Reset branch '%s'\n" msgstr "Setze Branch '%s' neu\n" -#: builtin/checkout.c:671 +#: builtin/checkout.c:675 #, c-format msgid "Already on '%s'\n" msgstr "Bereits auf '%s'\n" -#: builtin/checkout.c:675 +#: builtin/checkout.c:679 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Zu umgesetztem Branch '%s' gewechselt\n" -#: builtin/checkout.c:677 builtin/checkout.c:1067 +#: builtin/checkout.c:681 builtin/checkout.c:1070 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Zu neuem Branch '%s' gewechselt\n" -#: builtin/checkout.c:679 +#: builtin/checkout.c:683 #, c-format msgid "Switched to branch '%s'\n" msgstr "Zu Branch '%s' gewechselt\n" -#: builtin/checkout.c:731 +#: builtin/checkout.c:734 #, c-format msgid " ... and %d more.\n" msgstr " ... und %d weitere.\n" -#: builtin/checkout.c:737 +#: builtin/checkout.c:740 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -4674,7 +5060,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:756 +#: builtin/checkout.c:759 #, c-format msgid "" "If you want to keep it by creating a new branch, this may be a good time\n" @@ -4701,152 +5087,152 @@ msgstr[1] "" " git branch <neuer-Branchname> %s\n" "\n" -#: builtin/checkout.c:792 +#: builtin/checkout.c:795 msgid "internal error in revision walk" msgstr "interner Fehler im Revisionsgang" -#: builtin/checkout.c:796 +#: builtin/checkout.c:799 msgid "Previous HEAD position was" msgstr "Vorherige Position von HEAD war" -#: builtin/checkout.c:823 builtin/checkout.c:1062 +#: builtin/checkout.c:826 builtin/checkout.c:1065 msgid "You are on a branch yet to be born" msgstr "Sie sind auf einem Branch, der noch geboren wird" -#: builtin/checkout.c:968 +#: builtin/checkout.c:971 #, c-format msgid "only one reference expected, %d given." msgstr "nur eine Referenz erwartet, %d gegeben." -#: builtin/checkout.c:1008 builtin/worktree.c:212 +#: builtin/checkout.c:1011 builtin/worktree.c:214 #, c-format msgid "invalid reference: %s" msgstr "Ungültige Referenz: %s" -#: builtin/checkout.c:1037 +#: builtin/checkout.c:1040 #, c-format msgid "reference is not a tree: %s" msgstr "Referenz ist kein \"Tree\"-Objekt: %s" -#: builtin/checkout.c:1076 +#: builtin/checkout.c:1079 msgid "paths cannot be used with switching branches" msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden" -#: builtin/checkout.c:1079 builtin/checkout.c:1083 +#: builtin/checkout.c:1082 builtin/checkout.c:1086 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden" -#: builtin/checkout.c:1087 builtin/checkout.c:1090 builtin/checkout.c:1095 -#: builtin/checkout.c:1098 +#: builtin/checkout.c:1090 builtin/checkout.c:1093 builtin/checkout.c:1098 +#: builtin/checkout.c:1101 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "'%s' kann nicht mit '%s' verwendet werden" -#: builtin/checkout.c:1103 +#: builtin/checkout.c:1106 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln" -#: builtin/checkout.c:1136 builtin/checkout.c:1138 builtin/clone.c:88 -#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:323 -#: builtin/worktree.c:325 +#: builtin/checkout.c:1139 builtin/checkout.c:1141 builtin/clone.c:88 +#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:324 +#: builtin/worktree.c:326 msgid "branch" msgstr "Branch" -#: builtin/checkout.c:1137 +#: builtin/checkout.c:1140 msgid "create and checkout a new branch" msgstr "einen neuen Branch erzeugen und auschecken" -#: builtin/checkout.c:1139 +#: builtin/checkout.c:1142 msgid "create/reset and checkout a branch" msgstr "einen Branch erstellen/umsetzen und auschecken" -#: builtin/checkout.c:1140 +#: builtin/checkout.c:1143 msgid "create reflog for new branch" msgstr "das Reflog für den neuen Branch erzeugen" -#: builtin/checkout.c:1141 -msgid "detach the HEAD at named commit" -msgstr "HEAD zu benanntem Commit setzen" +#: builtin/checkout.c:1144 builtin/worktree.c:328 +msgid "detach HEAD at named commit" +msgstr "HEAD bei benanntem Commit loslösen" -#: builtin/checkout.c:1142 +#: builtin/checkout.c:1145 msgid "set upstream info for new branch" msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen" -#: builtin/checkout.c:1144 +#: builtin/checkout.c:1147 msgid "new-branch" msgstr "neuer Branch" -#: builtin/checkout.c:1144 +#: builtin/checkout.c:1147 msgid "new unparented branch" msgstr "neuer Branch ohne Eltern-Commit" -#: builtin/checkout.c:1145 +#: builtin/checkout.c:1148 msgid "checkout our version for unmerged files" msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken" -#: builtin/checkout.c:1147 +#: builtin/checkout.c:1150 msgid "checkout their version for unmerged files" msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken" -#: builtin/checkout.c:1149 +#: builtin/checkout.c:1152 msgid "force checkout (throw away local modifications)" msgstr "Auschecken erzwingen (verwirft lokale Änderungen)" -#: builtin/checkout.c:1150 +#: builtin/checkout.c:1153 msgid "perform a 3-way merge with the new branch" msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen" -#: builtin/checkout.c:1151 builtin/merge.c:230 +#: builtin/checkout.c:1154 builtin/merge.c:231 msgid "update ignored files (default)" msgstr "ignorierte Dateien aktualisieren (Standard)" -#: builtin/checkout.c:1152 builtin/log.c:1432 parse-options.h:250 +#: builtin/checkout.c:1155 builtin/log.c:1459 parse-options.h:250 msgid "style" msgstr "Stil" -#: builtin/checkout.c:1153 +#: builtin/checkout.c:1156 msgid "conflict style (merge or diff3)" msgstr "Konfliktstil (merge oder diff3)" -#: builtin/checkout.c:1156 +#: builtin/checkout.c:1159 msgid "do not limit pathspecs to sparse entries only" msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken" -#: builtin/checkout.c:1158 +#: builtin/checkout.c:1161 msgid "second guess 'git checkout <no-such-branch>'" msgstr "second guess 'git checkout <no-such-branch>'" -#: builtin/checkout.c:1160 +#: builtin/checkout.c:1163 msgid "do not check if another worktree is holding the given ref" msgstr "" "Prüfung, ob die Referenz bereits in einem anderen Arbeitsverzeichnis " "ausgecheckt wurde, deaktivieren" -#: builtin/checkout.c:1161 builtin/clone.c:60 builtin/fetch.c:116 -#: builtin/merge.c:227 builtin/pull.c:116 builtin/push.c:526 +#: builtin/checkout.c:1164 builtin/clone.c:60 builtin/fetch.c:117 +#: builtin/merge.c:228 builtin/pull.c:116 builtin/push.c:536 #: builtin/send-pack.c:168 msgid "force progress reporting" msgstr "Fortschrittsanzeige erzwingen" -#: builtin/checkout.c:1192 +#: builtin/checkout.c:1195 msgid "-b, -B and --orphan are mutually exclusive" msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus." -#: builtin/checkout.c:1209 +#: builtin/checkout.c:1212 msgid "--track needs a branch name" msgstr "Bei der Option --track muss ein Branchname angegeben werden." -#: builtin/checkout.c:1214 +#: builtin/checkout.c:1217 msgid "Missing branch name; try -b" msgstr "Vermisse Branchnamen; versuchen Sie -b" -#: builtin/checkout.c:1250 +#: builtin/checkout.c:1253 msgid "invalid path specification" msgstr "ungültige Pfadspezifikation" -#: builtin/checkout.c:1257 +#: builtin/checkout.c:1260 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -4856,12 +5242,12 @@ msgstr "" "Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst " "werden kann?" -#: builtin/checkout.c:1262 +#: builtin/checkout.c:1265 #, 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:1266 +#: builtin/checkout.c:1269 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -5014,7 +5400,7 @@ msgid "remove whole directories" msgstr "ganze Verzeichnisse löschen" #: builtin/clean.c:875 builtin/describe.c:407 builtin/grep.c:724 -#: builtin/ls-files.c:456 builtin/name-rev.c:314 builtin/show-ref.c:182 +#: builtin/ls-files.c:457 builtin/name-rev.c:314 builtin/show-ref.c:182 msgid "pattern" msgstr "Muster" @@ -5058,7 +5444,7 @@ msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]" msgid "don't create a checkout" msgstr "kein Auschecken" -#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:473 +#: builtin/clone.c:63 builtin/clone.c:65 builtin/init-db.c:476 msgid "create a bare repository" msgstr "ein Bare-Repository erstellen" @@ -5086,16 +5472,16 @@ msgstr "Submodule im Klon initialisieren" msgid "number of submodules cloned in parallel" msgstr "Anzahl der parallel zu klonenden Submodule" -#: builtin/clone.c:80 builtin/init-db.c:470 +#: builtin/clone.c:80 builtin/init-db.c:473 msgid "template-directory" msgstr "Vorlagenverzeichnis" -#: builtin/clone.c:81 builtin/init-db.c:471 +#: builtin/clone.c:81 builtin/init-db.c:474 msgid "directory from which templates will be used" msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden" -#: builtin/clone.c:83 builtin/submodule--helper.c:498 -#: builtin/submodule--helper.c:777 +#: builtin/clone.c:83 builtin/submodule--helper.c:495 +#: builtin/submodule--helper.c:833 msgid "reference repository" msgstr "Repository referenzieren" @@ -5119,7 +5505,7 @@ msgstr "<Branch> auschecken, anstatt HEAD des Remote-Repositories" msgid "path to git-upload-pack on the remote" msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite" -#: builtin/clone.c:92 builtin/fetch.c:117 builtin/grep.c:667 builtin/pull.c:201 +#: builtin/clone.c:92 builtin/fetch.c:118 builtin/grep.c:667 builtin/pull.c:201 msgid "depth" msgstr "Tiefe" @@ -5136,11 +5522,11 @@ msgstr "nur einen Branch klonen, HEAD oder --branch" msgid "any cloned submodules will be shallow" msgstr "jedes geklonte Submodul mit unvollständiger Historie (shallow)" -#: builtin/clone.c:98 builtin/init-db.c:479 +#: builtin/clone.c:98 builtin/init-db.c:482 msgid "gitdir" msgstr ".git-Verzeichnis" -#: builtin/clone.c:99 builtin/init-db.c:480 +#: builtin/clone.c:99 builtin/init-db.c:483 msgid "separate git dir from working tree" msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren" @@ -5152,11 +5538,11 @@ msgstr "Schlüssel=Wert" msgid "set config inside the new repository" msgstr "Konfiguration innerhalb des neuen Repositories setzen" -#: builtin/clone.c:102 builtin/fetch.c:131 builtin/push.c:536 +#: builtin/clone.c:102 builtin/fetch.c:132 builtin/push.c:547 msgid "use IPv4 addresses only" msgstr "nur IPv4-Adressen benutzen" -#: builtin/clone.c:104 builtin/fetch.c:133 builtin/push.c:538 +#: builtin/clone.c:104 builtin/fetch.c:134 builtin/push.c:549 msgid "use IPv6 addresses only" msgstr "nur IPv6-Adressen benutzen" @@ -5193,6 +5579,11 @@ msgstr "" "Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") " "eingehängt." +#: builtin/clone.c:376 +#, c-format +msgid "failed to open '%s'" +msgstr "Fehler beim Öffnen von '%s'" + #: builtin/clone.c:384 #, c-format msgid "%s exists and is not a directory" @@ -5213,7 +5604,7 @@ msgstr "Konnte Verweis '%s' nicht erstellen" msgid "failed to copy file to '%s'" msgstr "Konnte Datei nicht nach '%s' kopieren" -#: builtin/clone.c:449 builtin/clone.c:633 +#: builtin/clone.c:449 #, c-format msgid "done.\n" msgstr "Fertig.\n" @@ -5233,12 +5624,7 @@ msgstr "" msgid "Could not find remote branch %s to clone." msgstr "Konnte zu klonenden Remote-Branch %s nicht finden." -#: builtin/clone.c:628 -#, c-format -msgid "Checking connectivity... " -msgstr "Prüfe Konnektivität ... " - -#: builtin/clone.c:631 +#: builtin/clone.c:633 msgid "remote did not send all necessary objects" msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet." @@ -5257,103 +5643,103 @@ msgstr "" msgid "unable to checkout working tree" msgstr "Arbeitsverzeichnis konnte nicht ausgecheckt werden" -#: builtin/clone.c:767 +#: builtin/clone.c:766 msgid "unable to write parameters to config file" msgstr "konnte Parameter nicht in Konfigurationsdatei schreiben" -#: builtin/clone.c:830 +#: builtin/clone.c:829 msgid "cannot repack to clean up" msgstr "Kann \"repack\" zum Aufräumen nicht aufrufen" -#: builtin/clone.c:832 +#: builtin/clone.c:831 msgid "cannot unlink temporary alternates file" msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen" -#: builtin/clone.c:864 builtin/receive-pack.c:1731 +#: builtin/clone.c:863 builtin/receive-pack.c:1855 msgid "Too many arguments." msgstr "Zu viele Argumente." -#: builtin/clone.c:868 +#: builtin/clone.c:867 msgid "You must specify a repository to clone." msgstr "Sie müssen ein Repository zum Klonen angeben." -#: builtin/clone.c:879 +#: builtin/clone.c:878 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "Die Optionen --bare und --origin %s sind inkompatibel." -#: builtin/clone.c:882 +#: builtin/clone.c:881 msgid "--bare and --separate-git-dir are incompatible." msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel." -#: builtin/clone.c:895 +#: builtin/clone.c:894 #, c-format msgid "repository '%s' does not exist" msgstr "Repository '%s' existiert nicht." -#: builtin/clone.c:901 builtin/fetch.c:1174 +#: builtin/clone.c:900 builtin/fetch.c:1293 #, c-format msgid "depth %s is not a positive number" msgstr "Tiefe %s ist keine positive Zahl" -#: builtin/clone.c:911 +#: builtin/clone.c:910 #, 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:921 +#: builtin/clone.c:920 #, c-format msgid "working tree '%s' already exists." msgstr "Arbeitsverzeichnis '%s' existiert bereits." -#: builtin/clone.c:936 builtin/clone.c:947 builtin/submodule--helper.c:547 -#: builtin/worktree.c:220 builtin/worktree.c:247 +#: builtin/clone.c:935 builtin/clone.c:946 builtin/submodule--helper.c:544 +#: builtin/worktree.c:222 builtin/worktree.c:249 #, c-format msgid "could not create leading directories of '%s'" msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen." -#: builtin/clone.c:939 +#: builtin/clone.c:938 #, c-format msgid "could not create work tree dir '%s'" msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen" -#: builtin/clone.c:957 +#: builtin/clone.c:956 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Klone in Bare-Repository '%s' ...\n" -#: builtin/clone.c:959 +#: builtin/clone.c:958 #, c-format msgid "Cloning into '%s'...\n" msgstr "Klone nach '%s' ...\n" -#: builtin/clone.c:998 +#: builtin/clone.c:997 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:1001 +#: builtin/clone.c:1000 msgid "source repository is shallow, ignoring --local" msgstr "" "Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --" "local" -#: builtin/clone.c:1006 +#: builtin/clone.c:1005 msgid "--local is ignored" msgstr "--local wird ignoriert" -#: builtin/clone.c:1010 +#: builtin/clone.c:1009 #, c-format msgid "Don't know how to clone %s" msgstr "Weiß nicht wie %s zu klonen ist." -#: builtin/clone.c:1059 builtin/clone.c:1067 +#: builtin/clone.c:1058 builtin/clone.c:1066 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden" -#: builtin/clone.c:1070 +#: builtin/clone.c:1069 msgid "You appear to have cloned an empty repository." msgstr "Sie scheinen ein leeres Repository geklont zu haben." @@ -5496,67 +5882,67 @@ msgstr "" "Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n" "Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n" -#: builtin/commit.c:307 +#: builtin/commit.c:308 msgid "failed to unpack HEAD tree object" msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD." -#: builtin/commit.c:348 +#: builtin/commit.c:349 msgid "unable to create temporary index" msgstr "Konnte temporären Index nicht erstellen." -#: builtin/commit.c:354 +#: builtin/commit.c:355 msgid "interactive add failed" msgstr "interaktives Hinzufügen fehlgeschlagen" -#: builtin/commit.c:367 +#: builtin/commit.c:368 msgid "unable to update temporary index" msgstr "Konnte temporären Index nicht aktualisieren." -#: builtin/commit.c:369 +#: builtin/commit.c:370 msgid "Failed to update main cache tree" msgstr "Konnte Haupt-Cache-Verzeichnis nicht aktualisieren" -#: builtin/commit.c:393 builtin/commit.c:416 builtin/commit.c:465 +#: builtin/commit.c:394 builtin/commit.c:417 builtin/commit.c:466 msgid "unable to write new_index file" msgstr "Konnte new_index Datei nicht schreiben" -#: builtin/commit.c:447 +#: builtin/commit.c:448 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:449 +#: builtin/commit.c:450 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:458 +#: builtin/commit.c:459 msgid "cannot read the index" msgstr "Kann Index nicht lesen" -#: builtin/commit.c:477 +#: builtin/commit.c:478 msgid "unable to write temporary index file" msgstr "Konnte temporäre Index-Datei nicht schreiben." -#: builtin/commit.c:582 +#: builtin/commit.c:583 #, c-format msgid "commit '%s' lacks author header" msgstr "Commit '%s' fehlt Autor-Kopfbereich" -#: builtin/commit.c:584 +#: builtin/commit.c:585 #, c-format msgid "commit '%s' has malformed author line" msgstr "Commit '%s' hat fehlerhafte Autor-Zeile" -#: builtin/commit.c:603 +#: builtin/commit.c:604 msgid "malformed --author parameter" msgstr "Fehlerhafter --author Parameter" -#: builtin/commit.c:611 +#: builtin/commit.c:612 #, c-format msgid "invalid date format: %s" msgstr "Ungültiges Datumsformat: %s" -#: builtin/commit.c:655 +#: builtin/commit.c:656 msgid "" "unable to select a comment character that is not used\n" "in the current commit message" @@ -5564,38 +5950,38 @@ msgstr "" "Konnte kein Kommentar-Zeichen auswählen, das nicht in\n" "der aktuellen Commit-Beschreibung verwendet wird." -#: builtin/commit.c:692 builtin/commit.c:725 builtin/commit.c:1091 +#: builtin/commit.c:693 builtin/commit.c:726 builtin/commit.c:1092 #, c-format msgid "could not lookup commit %s" msgstr "Konnte Commit %s nicht nachschlagen" -#: builtin/commit.c:704 builtin/shortlog.c:285 +#: builtin/commit.c:705 builtin/shortlog.c:286 #, c-format msgid "(reading log message from standard input)\n" msgstr "(lese Log-Nachricht von Standard-Eingabe)\n" -#: builtin/commit.c:706 +#: builtin/commit.c:707 msgid "could not read log from standard input" msgstr "Konnte Log nicht von Standard-Eingabe lesen." -#: builtin/commit.c:710 +#: builtin/commit.c:711 #, c-format msgid "could not read log file '%s'" msgstr "Konnte Log-Datei '%s' nicht lesen" -#: builtin/commit.c:737 builtin/commit.c:745 +#: builtin/commit.c:738 builtin/commit.c:746 msgid "could not read SQUASH_MSG" msgstr "Konnte SQUASH_MSG nicht lesen" -#: builtin/commit.c:742 +#: builtin/commit.c:743 msgid "could not read MERGE_MSG" msgstr "Konnte MERGE_MSG nicht lesen" -#: builtin/commit.c:796 +#: builtin/commit.c:797 msgid "could not write commit template" msgstr "Konnte Commit-Vorlage nicht schreiben" -#: builtin/commit.c:814 +#: builtin/commit.c:815 #, c-format msgid "" "\n" @@ -5610,7 +5996,7 @@ msgstr "" "\t%s\n" "und versuchen Sie es erneut.\n" -#: builtin/commit.c:819 +#: builtin/commit.c:820 #, c-format msgid "" "\n" @@ -5625,7 +6011,7 @@ msgstr "" "\t%s\n" "und versuchen Sie es erneut.\n" -#: builtin/commit.c:832 +#: builtin/commit.c:833 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -5635,7 +6021,7 @@ msgstr "" "die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n" "bricht den Commit ab.\n" -#: builtin/commit.c:839 +#: builtin/commit.c:840 #, c-format msgid "" "Please enter the commit message for your changes. Lines starting\n" @@ -5648,157 +6034,157 @@ msgstr "" "entfernen.\n" "Eine leere Beschreibung bricht den Commit ab.\n" -#: builtin/commit.c:859 +#: builtin/commit.c:860 #, c-format msgid "%sAuthor: %.*s <%.*s>" msgstr "%sAutor: %.*s <%.*s>" -#: builtin/commit.c:867 +#: builtin/commit.c:868 #, c-format msgid "%sDate: %s" msgstr "%sDatum: %s" -#: builtin/commit.c:874 +#: builtin/commit.c:875 #, c-format msgid "%sCommitter: %.*s <%.*s>" msgstr "%sCommit-Ersteller: %.*s <%.*s>" -#: builtin/commit.c:892 +#: builtin/commit.c:893 msgid "Cannot read index" msgstr "Kann Index nicht lesen" -#: builtin/commit.c:949 +#: builtin/commit.c:950 msgid "Error building trees" msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte" -#: builtin/commit.c:964 builtin/tag.c:266 +#: builtin/commit.c:965 builtin/tag.c:266 #, 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:1066 +#: builtin/commit.c:1067 #, c-format msgid "--author '%s' is not 'Name <email>' and matches no existing author" msgstr "" "--author '%s' ist nicht im Format 'Name <E-Mail>' und stimmt mit keinem " "vorhandenen Autor überein" -#: builtin/commit.c:1081 builtin/commit.c:1321 +#: builtin/commit.c:1082 builtin/commit.c:1322 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ungültiger Modus '%s' für unversionierte Dateien" -#: builtin/commit.c:1118 +#: builtin/commit.c:1119 msgid "--long and -z are incompatible" msgstr "Die Optionen --long und -z sind inkompatibel." -#: builtin/commit.c:1148 +#: builtin/commit.c:1149 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:1157 +#: builtin/commit.c:1158 msgid "You have nothing to amend." msgstr "Sie haben nichts für \"--amend\"." -#: builtin/commit.c:1160 +#: builtin/commit.c:1161 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:1162 +#: builtin/commit.c:1163 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:1165 +#: builtin/commit.c:1166 msgid "Options --squash and --fixup cannot be used together" msgstr "" "Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden." -#: builtin/commit.c:1175 +#: builtin/commit.c:1176 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:1177 +#: builtin/commit.c:1178 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:1185 +#: builtin/commit.c:1186 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:1202 +#: builtin/commit.c:1203 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:1204 +#: builtin/commit.c:1205 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:1206 +#: builtin/commit.c:1207 msgid "Clever... amending the last one with dirty index." msgstr "Klug ... den letzten Commit mit einem geänderten Index nachbessern." -#: builtin/commit.c:1208 +#: builtin/commit.c:1209 msgid "Explicit paths specified without -i or -o; assuming --only paths..." msgstr "Explizite Pfade ohne -i oder -o angegeben; nehme --only an" -#: builtin/commit.c:1220 builtin/tag.c:474 +#: builtin/commit.c:1221 builtin/tag.c:474 #, c-format msgid "Invalid cleanup mode %s" msgstr "Ungültiger \"cleanup\" Modus %s" -#: builtin/commit.c:1225 +#: builtin/commit.c:1226 msgid "Paths with -a does not make sense." msgstr "Die Option -a kann nicht mit der Angabe von Pfaden verwendet werden." -#: builtin/commit.c:1335 builtin/commit.c:1621 +#: builtin/commit.c:1336 builtin/commit.c:1622 msgid "show status concisely" msgstr "Status im Kurzformat anzeigen" -#: builtin/commit.c:1337 builtin/commit.c:1623 +#: builtin/commit.c:1338 builtin/commit.c:1624 msgid "show branch information" msgstr "Branchinformationen anzeigen" -#: builtin/commit.c:1339 builtin/commit.c:1625 builtin/push.c:512 -#: builtin/worktree.c:437 +#: builtin/commit.c:1340 builtin/commit.c:1626 builtin/push.c:522 +#: builtin/worktree.c:440 msgid "machine-readable output" msgstr "maschinenlesbare Ausgabe" -#: builtin/commit.c:1342 builtin/commit.c:1627 +#: builtin/commit.c:1343 builtin/commit.c:1628 msgid "show status in long format (default)" msgstr "Status im Langformat anzeigen (Standard)" -#: builtin/commit.c:1345 builtin/commit.c:1630 +#: builtin/commit.c:1346 builtin/commit.c:1631 msgid "terminate entries with NUL" msgstr "Einträge mit NUL-Zeichen abschließen" -#: builtin/commit.c:1347 builtin/commit.c:1633 builtin/fast-export.c:981 +#: builtin/commit.c:1348 builtin/commit.c:1634 builtin/fast-export.c:981 #: builtin/fast-export.c:984 builtin/tag.c:353 msgid "mode" msgstr "Modus" -#: builtin/commit.c:1348 builtin/commit.c:1633 +#: builtin/commit.c:1349 builtin/commit.c:1634 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" "unversionierte Dateien anzeigen, optionale Modi: all, normal, no. (Standard: " "all)" -#: builtin/commit.c:1351 +#: builtin/commit.c:1352 msgid "show ignored files" msgstr "ignorierte Dateien anzeigen" -#: builtin/commit.c:1352 parse-options.h:155 +#: builtin/commit.c:1353 parse-options.h:155 msgid "when" msgstr "wann" -#: builtin/commit.c:1353 +#: builtin/commit.c:1354 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -5806,203 +6192,203 @@ msgstr "" "Änderungen in Submodulen ignorieren, optional wenn: all, dirty, untracked. " "(Standard: all)" -#: builtin/commit.c:1355 +#: builtin/commit.c:1356 msgid "list untracked files in columns" msgstr "unversionierte Dateien in Spalten auflisten" -#: builtin/commit.c:1441 +#: builtin/commit.c:1442 msgid "couldn't look up newly created commit" msgstr "Konnte neu erstellten Commit nicht nachschlagen." -#: builtin/commit.c:1443 +#: builtin/commit.c:1444 msgid "could not parse newly created commit" msgstr "Konnte neulich erstellten Commit nicht analysieren." -#: builtin/commit.c:1488 +#: builtin/commit.c:1489 msgid "detached HEAD" msgstr "losgelöster HEAD" -#: builtin/commit.c:1491 +#: builtin/commit.c:1492 msgid " (root-commit)" msgstr " (Basis-Commit)" -#: builtin/commit.c:1591 +#: builtin/commit.c:1592 msgid "suppress summary after successful commit" msgstr "Zusammenfassung nach erfolgreichem Commit unterdrücken" -#: builtin/commit.c:1592 +#: builtin/commit.c:1593 msgid "show diff in commit message template" msgstr "Unterschiede in Commit-Beschreibungsvorlage anzeigen" -#: builtin/commit.c:1594 +#: builtin/commit.c:1595 msgid "Commit message options" msgstr "Optionen für Commit-Beschreibung" -#: builtin/commit.c:1595 builtin/tag.c:351 +#: builtin/commit.c:1596 builtin/tag.c:351 msgid "read message from file" msgstr "Beschreibung von Datei lesen" -#: builtin/commit.c:1596 +#: builtin/commit.c:1597 msgid "author" msgstr "Autor" -#: builtin/commit.c:1596 +#: builtin/commit.c:1597 msgid "override author for commit" msgstr "Autor eines Commits überschreiben" -#: builtin/commit.c:1597 builtin/gc.c:326 +#: builtin/commit.c:1598 builtin/gc.c:326 msgid "date" msgstr "Datum" -#: builtin/commit.c:1597 +#: builtin/commit.c:1598 msgid "override date for commit" msgstr "Datum eines Commits überschreiben" -#: builtin/commit.c:1598 builtin/merge.c:219 builtin/notes.c:395 -#: builtin/notes.c:558 builtin/tag.c:349 +#: builtin/commit.c:1599 builtin/merge.c:220 builtin/notes.c:396 +#: builtin/notes.c:559 builtin/tag.c:349 msgid "message" msgstr "Beschreibung" -#: builtin/commit.c:1598 +#: builtin/commit.c:1599 msgid "commit message" msgstr "Commit-Beschreibung" -#: builtin/commit.c:1599 builtin/commit.c:1600 builtin/commit.c:1601 -#: builtin/commit.c:1602 parse-options.h:256 ref-filter.h:79 +#: builtin/commit.c:1600 builtin/commit.c:1601 builtin/commit.c:1602 +#: builtin/commit.c:1603 parse-options.h:256 ref-filter.h:79 msgid "commit" msgstr "Commit" -#: builtin/commit.c:1599 +#: builtin/commit.c:1600 msgid "reuse and edit message from specified commit" msgstr "Beschreibung des angegebenen Commits wiederverwenden und editieren" -#: builtin/commit.c:1600 +#: builtin/commit.c:1601 msgid "reuse message from specified commit" msgstr "Beschreibung des angegebenen Commits wiederverwenden" -#: builtin/commit.c:1601 +#: builtin/commit.c:1602 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "eine automatisch zusammengesetzte Beschreibung zum Nachbessern des " "angegebenen Commits verwenden" -#: builtin/commit.c:1602 +#: builtin/commit.c:1603 msgid "use autosquash formatted message to squash specified commit" msgstr "" "eine automatisch zusammengesetzte Beschreibung beim \"squash\" des " "angegebenen Commits verwenden" -#: builtin/commit.c:1603 +#: builtin/commit.c:1604 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "Sie als Autor des Commits setzen (verwendet mit -C/-c/--amend)" -#: builtin/commit.c:1604 builtin/log.c:1382 builtin/revert.c:86 +#: builtin/commit.c:1605 builtin/log.c:1409 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "'Signed-off-by:'-Zeile hinzufügen" -#: builtin/commit.c:1605 +#: builtin/commit.c:1606 msgid "use specified template file" msgstr "angegebene Vorlagendatei verwenden" -#: builtin/commit.c:1606 +#: builtin/commit.c:1607 msgid "force edit of commit" msgstr "Bearbeitung des Commits erzwingen" -#: builtin/commit.c:1607 +#: builtin/commit.c:1608 msgid "default" msgstr "Standard" -#: builtin/commit.c:1607 builtin/tag.c:354 +#: builtin/commit.c:1608 builtin/tag.c:354 msgid "how to strip spaces and #comments from message" msgstr "" "wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen" -#: builtin/commit.c:1608 +#: builtin/commit.c:1609 msgid "include status in commit message template" msgstr "Status in die Commit-Beschreibungsvorlage einfügen" -#: builtin/commit.c:1610 builtin/merge.c:229 builtin/pull.c:165 +#: builtin/commit.c:1611 builtin/merge.c:230 builtin/pull.c:165 #: builtin/revert.c:93 msgid "GPG sign commit" msgstr "Commit mit GPG signieren" -#: builtin/commit.c:1613 +#: builtin/commit.c:1614 msgid "Commit contents options" msgstr "Optionen für Commit-Inhalt" -#: builtin/commit.c:1614 +#: builtin/commit.c:1615 msgid "commit all changed files" msgstr "alle geänderten Dateien committen" -#: builtin/commit.c:1615 +#: builtin/commit.c:1616 msgid "add specified files to index for commit" msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken" -#: builtin/commit.c:1616 +#: builtin/commit.c:1617 msgid "interactively add files" msgstr "interaktives Hinzufügen von Dateien" -#: builtin/commit.c:1617 +#: builtin/commit.c:1618 msgid "interactively add changes" msgstr "interaktives Hinzufügen von Änderungen" -#: builtin/commit.c:1618 +#: builtin/commit.c:1619 msgid "commit only specified files" msgstr "nur die angegebenen Dateien committen" -#: builtin/commit.c:1619 -msgid "bypass pre-commit hook" -msgstr "\"pre-commit hook\" umgehen" - #: builtin/commit.c:1620 +msgid "bypass pre-commit and commit-msg hooks" +msgstr "Hooks pre-commit und commit-msg umgehen" + +#: builtin/commit.c:1621 msgid "show what would be committed" msgstr "anzeigen, was committet werden würde" -#: builtin/commit.c:1631 +#: builtin/commit.c:1632 msgid "amend previous commit" msgstr "vorherigen Commit ändern" -#: builtin/commit.c:1632 +#: builtin/commit.c:1633 msgid "bypass post-rewrite hook" msgstr "\"post-rewrite hook\" umgehen" -#: builtin/commit.c:1637 +#: builtin/commit.c:1638 msgid "ok to record an empty change" msgstr "Aufzeichnung einer leeren Änderung erlauben" -#: builtin/commit.c:1639 +#: builtin/commit.c:1640 msgid "ok to record a change with an empty message" msgstr "Aufzeichnung einer Änderung mit einer leeren Beschreibung erlauben" -#: builtin/commit.c:1668 +#: builtin/commit.c:1669 msgid "could not parse HEAD commit" msgstr "Konnte Commit von HEAD nicht analysieren." -#: builtin/commit.c:1718 +#: builtin/commit.c:1719 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Beschädigte MERGE_HEAD-Datei (%s)" -#: builtin/commit.c:1725 +#: builtin/commit.c:1726 msgid "could not read MERGE_MODE" msgstr "Konnte MERGE_MODE nicht lesen" -#: builtin/commit.c:1744 +#: builtin/commit.c:1745 #, c-format msgid "could not read commit message: %s" msgstr "Konnte Commit-Beschreibung nicht lesen: %s" -#: builtin/commit.c:1755 +#: builtin/commit.c:1756 #, 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:1760 +#: builtin/commit.c:1761 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n" -#: builtin/commit.c:1808 +#: builtin/commit.c:1809 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full and quota is\n" @@ -6017,141 +6403,141 @@ msgstr "" msgid "git config [<options>]" msgstr "git config [<Optionen>]" -#: builtin/config.c:56 +#: builtin/config.c:55 msgid "Config file location" msgstr "Ort der Konfigurationsdatei" -#: builtin/config.c:57 +#: builtin/config.c:56 msgid "use global config file" msgstr "globale Konfigurationsdatei verwenden" -#: builtin/config.c:58 +#: builtin/config.c:57 msgid "use system config file" msgstr "systemweite Konfigurationsdatei verwenden" -#: builtin/config.c:59 +#: builtin/config.c:58 msgid "use repository config file" msgstr "Konfigurationsdatei des Repositories verwenden" -#: builtin/config.c:60 +#: builtin/config.c:59 msgid "use given config file" msgstr "die angegebene Konfigurationsdatei verwenden" -#: builtin/config.c:61 +#: builtin/config.c:60 msgid "blob-id" msgstr "Blob-Id" -#: builtin/config.c:61 +#: builtin/config.c:60 msgid "read config from given blob object" msgstr "Konfiguration von angegebenem Blob-Objekt lesen" -#: builtin/config.c:62 +#: builtin/config.c:61 msgid "Action" msgstr "Aktion" -#: builtin/config.c:63 +#: builtin/config.c:62 msgid "get value: name [value-regex]" msgstr "Wert zurückgeben: Name [Wert-regex]" -#: builtin/config.c:64 +#: builtin/config.c:63 msgid "get all values: key [value-regex]" msgstr "alle Werte zurückgeben: Schlüssel [Wert-regex]" -#: builtin/config.c:65 +#: builtin/config.c:64 msgid "get values for regexp: name-regex [value-regex]" msgstr "Werte für den regulären Ausdruck zurückgeben: Name-regex [Wert-regex]" -#: builtin/config.c:66 +#: builtin/config.c:65 msgid "get value specific for the URL: section[.var] URL" msgstr "Wert spezifisch für eine URL zurückgeben: section[.var] URL" -#: builtin/config.c:67 +#: builtin/config.c:66 msgid "replace all matching variables: name value [value_regex]" msgstr "alle passenden Variablen ersetzen: Name Wert [Wert-regex] " -#: builtin/config.c:68 +#: builtin/config.c:67 msgid "add a new variable: name value" msgstr "neue Variable hinzufügen: Name Wert" -#: builtin/config.c:69 +#: builtin/config.c:68 msgid "remove a variable: name [value-regex]" msgstr "eine Variable entfernen: Name [Wert-regex]" -#: builtin/config.c:70 +#: builtin/config.c:69 msgid "remove all matches: name [value-regex]" msgstr "alle Ãœbereinstimmungen entfernen: Name [Wert-regex]" -#: builtin/config.c:71 +#: builtin/config.c:70 msgid "rename section: old-name new-name" msgstr "eine Sektion umbenennen: alter-Name neuer-Name" -#: builtin/config.c:72 +#: builtin/config.c:71 msgid "remove a section: name" msgstr "eine Sektion entfernen: Name" -#: builtin/config.c:73 +#: builtin/config.c:72 msgid "list all" msgstr "alles auflisten" -#: builtin/config.c:74 +#: builtin/config.c:73 msgid "open an editor" msgstr "einen Editor öffnen" -#: builtin/config.c:75 +#: builtin/config.c:74 msgid "find the color configured: slot [default]" msgstr "die konfigurierte Farbe finden: Slot [Standard]" -#: builtin/config.c:76 +#: builtin/config.c:75 msgid "find the color setting: slot [stdout-is-tty]" msgstr "die Farbeinstellung finden: Slot [Standard-Ausgabe-ist-Terminal]" -#: builtin/config.c:77 +#: builtin/config.c:76 msgid "Type" msgstr "Typ" -#: builtin/config.c:78 +#: builtin/config.c:77 msgid "value is \"true\" or \"false\"" msgstr "Wert ist \"true\" oder \"false\"" -#: builtin/config.c:79 +#: builtin/config.c:78 msgid "value is decimal number" msgstr "Wert ist eine Dezimalzahl" -#: builtin/config.c:80 +#: builtin/config.c:79 msgid "value is --bool or --int" msgstr "Wert ist --bool oder --int" -#: builtin/config.c:81 +#: builtin/config.c:80 msgid "value is a path (file or directory name)" msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)" -#: builtin/config.c:82 +#: builtin/config.c:81 msgid "Other" msgstr "Sonstiges" -#: builtin/config.c:83 +#: builtin/config.c:82 msgid "terminate values with NUL byte" msgstr "schließt Werte mit NUL-Byte ab" -#: builtin/config.c:84 +#: builtin/config.c:83 msgid "show variable names only" msgstr "nur Variablennamen anzeigen" -#: builtin/config.c:85 +#: builtin/config.c:84 msgid "respect include directives on lookup" msgstr "beachtet \"include\"-Direktiven beim Nachschlagen" -#: builtin/config.c:86 +#: builtin/config.c:85 msgid "show origin of config (file, standard input, blob, command line)" msgstr "" "Ursprung der Konfiguration anzeigen (Datei, Standard-Eingabe, Blob, " "Befehlszeile)" -#: builtin/config.c:328 +#: builtin/config.c:327 msgid "unable to parse default color value" msgstr "konnte Standard-Farbwert nicht parsen" -#: builtin/config.c:472 +#: builtin/config.c:471 #, c-format msgid "" "# This is Git's per-user configuration file.\n" @@ -6166,7 +6552,7 @@ msgstr "" "#\tname = %s\n" "#\temail = %s\n" -#: builtin/config.c:614 +#: builtin/config.c:613 #, c-format msgid "cannot create configuration file %s" msgstr "Konnte Konfigurationsdatei '%s' nicht erstellen." @@ -6202,7 +6588,7 @@ msgstr "annotiertes Tag %s hat keinen eingebetteten Namen" msgid "tag '%s' is really '%s' here" msgstr "Tag '%s' ist eigentlich '%s' hier" -#: builtin/describe.c:250 builtin/log.c:465 +#: builtin/describe.c:250 builtin/log.c:480 #, c-format msgid "Not a valid object name %s" msgstr "%s ist kein gültiger Objekt-Name" @@ -6402,182 +6788,182 @@ msgstr "Refspec auf exportierte Referenzen anwenden" msgid "anonymize output" msgstr "Ausgabe anonymisieren" -#: builtin/fetch.c:20 +#: builtin/fetch.c:21 msgid "git fetch [<options>] [<repository> [<refspec>...]]" msgstr "git fetch [<Optionen>] [<Repository> [<Refspec>...]]" -#: builtin/fetch.c:21 +#: builtin/fetch.c:22 msgid "git fetch [<options>] <group>" msgstr "git fetch [<Optionen>] <Gruppe>" -#: builtin/fetch.c:22 +#: builtin/fetch.c:23 msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" msgstr "git fetch --multiple [<Optionen>] [(<Repository> | <Gruppe>)...]" -#: builtin/fetch.c:23 +#: builtin/fetch.c:24 msgid "git fetch --all [<options>]" msgstr "git fetch --all [<Optionen>]" -#: builtin/fetch.c:92 builtin/pull.c:174 +#: builtin/fetch.c:93 builtin/pull.c:174 msgid "fetch from all remotes" msgstr "fordert von allen Remote-Repositories an" -#: builtin/fetch.c:94 builtin/pull.c:177 +#: builtin/fetch.c:95 builtin/pull.c:177 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "an .git/FETCH_HEAD anhängen, anstatt zu überschreiben" -#: builtin/fetch.c:96 builtin/pull.c:180 +#: builtin/fetch.c:97 builtin/pull.c:180 msgid "path to upload pack on remote end" msgstr "Pfad des Programms zum Hochladen von Paketen auf der Gegenseite" -#: builtin/fetch.c:97 builtin/pull.c:182 +#: builtin/fetch.c:98 builtin/pull.c:182 msgid "force overwrite of local branch" msgstr "das Ãœberschreiben von lokalen Branches erzwingen" -#: builtin/fetch.c:99 +#: builtin/fetch.c:100 msgid "fetch from multiple remotes" msgstr "von mehreren Remote-Repositories anfordern" -#: builtin/fetch.c:101 builtin/pull.c:184 +#: builtin/fetch.c:102 builtin/pull.c:184 msgid "fetch all tags and associated objects" msgstr "alle Tags und verbundene Objekte anfordern" -#: builtin/fetch.c:103 +#: builtin/fetch.c:104 msgid "do not fetch all tags (--no-tags)" msgstr "nicht alle Tags anfordern (--no-tags)" -#: builtin/fetch.c:105 +#: builtin/fetch.c:106 msgid "number of submodules fetched in parallel" msgstr "Anzahl der parallel anzufordernden Submodule" -#: builtin/fetch.c:107 builtin/pull.c:187 +#: builtin/fetch.c:108 builtin/pull.c:187 msgid "prune remote-tracking branches no longer on remote" msgstr "" "Remote-Tracking-Branches entfernen, die sich nicht mehr im Remote-Repository " "befinden" -#: builtin/fetch.c:108 builtin/pull.c:190 +#: builtin/fetch.c:109 builtin/pull.c:190 msgid "on-demand" msgstr "bei-Bedarf" -#: builtin/fetch.c:109 builtin/pull.c:191 +#: builtin/fetch.c:110 builtin/pull.c:191 msgid "control recursive fetching of submodules" msgstr "rekursive Anforderungen von Submodulen kontrollieren" -#: builtin/fetch.c:113 builtin/pull.c:199 +#: builtin/fetch.c:114 builtin/pull.c:199 msgid "keep downloaded pack" msgstr "heruntergeladenes Paket behalten" -#: builtin/fetch.c:115 +#: builtin/fetch.c:116 msgid "allow updating of HEAD ref" msgstr "Aktualisierung der \"HEAD\"-Referenz erlauben" -#: builtin/fetch.c:118 builtin/pull.c:202 +#: builtin/fetch.c:119 builtin/pull.c:202 msgid "deepen history of shallow clone" msgstr "" "die Historie eines Klons mit unvollständiger Historie (shallow) vertiefen" -#: builtin/fetch.c:120 builtin/pull.c:205 +#: builtin/fetch.c:121 builtin/pull.c:205 msgid "convert to a complete repository" msgstr "zu einem vollständigen Repository konvertieren" -#: builtin/fetch.c:122 builtin/log.c:1399 +#: builtin/fetch.c:123 builtin/log.c:1426 msgid "dir" msgstr "Verzeichnis" -#: builtin/fetch.c:123 +#: builtin/fetch.c:124 msgid "prepend this to submodule path output" msgstr "dies an die Ausgabe der Submodul-Pfade voranstellen" -#: builtin/fetch.c:126 +#: builtin/fetch.c:127 msgid "default mode for recursion" msgstr "Standard-Modus für Rekursion" -#: builtin/fetch.c:128 builtin/pull.c:208 +#: builtin/fetch.c:129 builtin/pull.c:208 msgid "accept refs that update .git/shallow" msgstr "Referenzen, die .git/shallow aktualisieren, akzeptieren" -#: builtin/fetch.c:129 builtin/pull.c:210 +#: builtin/fetch.c:130 builtin/pull.c:210 msgid "refmap" msgstr "Refmap" -#: builtin/fetch.c:130 builtin/pull.c:211 +#: builtin/fetch.c:131 builtin/pull.c:211 msgid "specify fetch refmap" msgstr "Refmap für 'fetch' angeben" -#: builtin/fetch.c:386 +#: builtin/fetch.c:387 msgid "Couldn't find remote ref HEAD" msgstr "Konnte Remote-Referenz von HEAD nicht finden." -#: builtin/fetch.c:466 +#: builtin/fetch.c:503 +#, c-format +msgid "configuration fetch.output contains invalid value %s" +msgstr "Konfiguration fetch.output enthält ungültigen Wert %s" + +#: builtin/fetch.c:592 #, c-format msgid "object %s not found" msgstr "Objekt %s nicht gefunden" -#: builtin/fetch.c:471 +#: builtin/fetch.c:596 msgid "[up to date]" msgstr "[aktuell]" -#: builtin/fetch.c:485 -#, 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:486 builtin/fetch.c:574 +#: builtin/fetch.c:609 builtin/fetch.c:689 msgid "[rejected]" msgstr "[zurückgewiesen]" -#: builtin/fetch.c:497 +#: builtin/fetch.c:610 +msgid "can't fetch in current branch" +msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen" + +#: builtin/fetch.c:619 msgid "[tag update]" msgstr "[Tag Aktualisierung]" -#: builtin/fetch.c:499 builtin/fetch.c:534 builtin/fetch.c:552 -msgid " (unable to update local ref)" -msgstr " (kann lokale Referenz nicht aktualisieren)" +#: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669 +#: builtin/fetch.c:684 +msgid "unable to update local ref" +msgstr "kann lokale Referenz nicht aktualisieren" -#: builtin/fetch.c:517 +#: builtin/fetch.c:639 msgid "[new tag]" msgstr "[neues Tag]" -#: builtin/fetch.c:520 +#: builtin/fetch.c:642 msgid "[new branch]" msgstr "[neuer Branch]" -#: builtin/fetch.c:523 +#: builtin/fetch.c:645 msgid "[new ref]" msgstr "[neue Referenz]" -#: builtin/fetch.c:569 -msgid "unable to update local ref" -msgstr "kann lokale Referenz nicht aktualisieren" - -#: builtin/fetch.c:569 +#: builtin/fetch.c:684 msgid "forced update" msgstr "Aktualisierung erzwungen" -#: builtin/fetch.c:576 -msgid "(non-fast-forward)" -msgstr "(kein Vorspulen)" +#: builtin/fetch.c:689 +msgid "non-fast-forward" +msgstr "kein Vorspulen" -#: builtin/fetch.c:619 +#: builtin/fetch.c:733 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n" -#: builtin/fetch.c:637 +#: builtin/fetch.c:753 #, c-format msgid "reject %s because shallow roots are not allowed to be updated" msgstr "" "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit " "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen." -#: builtin/fetch.c:724 builtin/fetch.c:816 +#: builtin/fetch.c:839 builtin/fetch.c:934 #, c-format msgid "From %.*s\n" msgstr "Von %.*s\n" -#: builtin/fetch.c:735 +#: builtin/fetch.c:850 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -6586,57 +6972,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:787 +#: builtin/fetch.c:904 #, c-format msgid " (%s will become dangling)" msgstr " (%s wird unreferenziert)" -#: builtin/fetch.c:788 +#: builtin/fetch.c:905 #, c-format msgid " (%s has become dangling)" msgstr " (%s wurde unreferenziert)" -#: builtin/fetch.c:820 +#: builtin/fetch.c:937 msgid "[deleted]" msgstr "[gelöscht]" -#: builtin/fetch.c:821 builtin/remote.c:1025 +#: builtin/fetch.c:938 builtin/remote.c:1020 msgid "(none)" msgstr "(nichts)" -#: builtin/fetch.c:841 +#: builtin/fetch.c:960 #, 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:860 +#: builtin/fetch.c:979 #, 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:863 +#: builtin/fetch.c:982 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Option \"%s\" wird ignoriert für %s\n" -#: builtin/fetch.c:920 +#: builtin/fetch.c:1039 #, c-format msgid "Don't know how to fetch from %s" msgstr "Weiß nicht wie von %s angefordert wird." -#: builtin/fetch.c:1080 +#: builtin/fetch.c:1199 #, c-format msgid "Fetching %s\n" msgstr "Fordere an von %s\n" -#: builtin/fetch.c:1082 builtin/remote.c:96 +#: builtin/fetch.c:1201 builtin/remote.c:96 #, c-format msgid "Could not fetch %s" msgstr "Konnte nicht von %s anfordern" -#: builtin/fetch.c:1100 +#: builtin/fetch.c:1219 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -6645,35 +7031,35 @@ msgstr "" "oder den Namen des Remote-Repositories an, von welchem neue\n" "Commits angefordert werden sollen." -#: builtin/fetch.c:1123 +#: builtin/fetch.c:1242 msgid "You need to specify a tag name." msgstr "Sie müssen den Namen des Tags angeben." -#: builtin/fetch.c:1165 +#: builtin/fetch.c:1284 msgid "--depth and --unshallow cannot be used together" msgstr "" "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden." -#: builtin/fetch.c:1167 +#: builtin/fetch.c:1286 msgid "--unshallow on a complete repository does not make sense" msgstr "" "Die Option --unshallow kann nicht in einem Repository mit unvollständiger " "Historie verwendet werden." -#: builtin/fetch.c:1187 +#: builtin/fetch.c:1306 msgid "fetch --all does not take a repository argument" msgstr "fetch --all akzeptiert kein Repository als Argument" -#: builtin/fetch.c:1189 +#: builtin/fetch.c:1308 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kann nicht mit Refspecs verwendet werden." -#: builtin/fetch.c:1200 +#: builtin/fetch.c:1319 #, c-format msgid "No such remote or remote group: %s" msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s" -#: builtin/fetch.c:1208 +#: builtin/fetch.c:1327 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" @@ -6762,63 +7148,63 @@ msgstr "nur nicht zusammengeführte Referenzen ausgeben" msgid "print only refs which contain the commit" msgstr "nur Referenzen ausgeben, die diesen Commit enthalten" -#: builtin/fsck.c:156 builtin/prune.c:140 -msgid "Checking connectivity" -msgstr "Prüfe Konnektivität" - -#: builtin/fsck.c:486 +#: builtin/fsck.c:519 msgid "Checking object directories" msgstr "Prüfe Objekt-Verzeichnisse" -#: builtin/fsck.c:552 +#: builtin/fsck.c:588 msgid "git fsck [<options>] [<object>...]" msgstr "git fsck [<Optionen>] [<Objekt>...]" -#: builtin/fsck.c:558 +#: builtin/fsck.c:594 msgid "show unreachable objects" msgstr "unerreichbare Objekte anzeigen" -#: builtin/fsck.c:559 +#: builtin/fsck.c:595 msgid "show dangling objects" msgstr "unreferenzierte Objekte anzeigen" -#: builtin/fsck.c:560 +#: builtin/fsck.c:596 msgid "report tags" msgstr "Tags melden" -#: builtin/fsck.c:561 +#: builtin/fsck.c:597 msgid "report root nodes" msgstr "Hauptwurzeln melden" -#: builtin/fsck.c:562 +#: builtin/fsck.c:598 msgid "make index objects head nodes" msgstr "Index-Objekte in Erreichbarkeitsprüfung einbeziehen" -#: builtin/fsck.c:563 +#: builtin/fsck.c:599 msgid "make reflogs head nodes (default)" msgstr "Reflogs in Erreichbarkeitsprüfung einbeziehen (Standard)" -#: builtin/fsck.c:564 +#: builtin/fsck.c:600 msgid "also consider packs and alternate objects" msgstr "ebenso Pakete und alternative Objekte betrachten" -#: builtin/fsck.c:565 +#: builtin/fsck.c:601 msgid "check only connectivity" msgstr "nur Konnektivität prüfen" -#: builtin/fsck.c:566 +#: builtin/fsck.c:602 msgid "enable more strict checking" msgstr "genauere Prüfung aktivieren" -#: builtin/fsck.c:568 +#: builtin/fsck.c:604 msgid "write dangling objects in .git/lost-found" msgstr "unreferenzierte Objekte nach .git/lost-found schreiben" -#: builtin/fsck.c:569 builtin/prune.c:107 +#: builtin/fsck.c:605 builtin/prune.c:107 msgid "show progress" msgstr "Fortschrittsanzeige anzeigen" -#: builtin/fsck.c:630 +#: builtin/fsck.c:606 +msgid "show verbose names for reachable objects" +msgstr "ausführliche Namen für erreichbare Objekte anzeigen" + +#: builtin/fsck.c:671 msgid "Checking objects" msgstr "Prüfe Objekte" @@ -7118,7 +7504,7 @@ msgstr "den Aufruf von grep(1) erlauben (von dieser Programmversion ignoriert)" msgid "no pattern given." msgstr "keine Muster angegeben" -#: builtin/grep.c:845 builtin/index-pack.c:1477 +#: builtin/grep.c:845 builtin/index-pack.c:1479 #, c-format msgid "invalid number of threads specified (%d)" msgstr "ungültige Anzahl von Threads angegeben (%d)" @@ -7272,335 +7658,331 @@ msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen" msgid "no info viewer handled the request" msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen" -#: builtin/help.c:408 +#: builtin/help.c:401 msgid "Defining attributes per path" msgstr "Definition von Attributen pro Pfad" -#: builtin/help.c:409 +#: builtin/help.c:402 msgid "Everyday Git With 20 Commands Or So" msgstr "Tägliche Benutzung von Git mit ungefähr 20 Befehlen" -#: builtin/help.c:410 +#: builtin/help.c:403 msgid "A Git glossary" msgstr "Ein Git-Glossar" -#: builtin/help.c:411 +#: builtin/help.c:404 msgid "Specifies intentionally untracked files to ignore" msgstr "Spezifikation von bewusst ignorierten, unversionierten Dateien" -#: builtin/help.c:412 +#: builtin/help.c:405 msgid "Defining submodule properties" msgstr "Definition von Submodul-Eigenschaften" -#: builtin/help.c:413 +#: builtin/help.c:406 msgid "Specifying revisions and ranges for Git" msgstr "Spezifikation von Commits und Bereichen für Git" -#: builtin/help.c:414 +#: builtin/help.c:407 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:415 +#: builtin/help.c:408 msgid "An overview of recommended workflows with Git" msgstr "Eine Ãœbersicht über empfohlene Arbeitsabläufe mit Git" -#: builtin/help.c:427 +#: builtin/help.c:420 msgid "The common Git guides are:\n" msgstr "Die allgemein verwendeten Git-Anleitungen sind:\n" -#: builtin/help.c:448 builtin/help.c:465 +#: builtin/help.c:441 builtin/help.c:458 #, c-format msgid "usage: %s%s" msgstr "Verwendung: %s%s" -#: builtin/help.c:481 +#: builtin/help.c:474 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "für `git %s' wurde der Alias `%s' angelegt" -#: builtin/index-pack.c:152 +#: builtin/index-pack.c:153 #, c-format msgid "unable to open %s" msgstr "kann %s nicht öffnen" -#: builtin/index-pack.c:202 +#: builtin/index-pack.c:203 #, c-format msgid "object type mismatch at %s" msgstr "Objekt-Typen passen bei %s nicht zusammen" -#: builtin/index-pack.c:222 +#: builtin/index-pack.c:223 #, c-format msgid "did not receive expected object %s" msgstr "konnte erwartetes Objekt %s nicht empfangen" -#: builtin/index-pack.c:225 +#: builtin/index-pack.c:226 #, c-format msgid "object %s: expected type %s, found %s" msgstr "Objekt %s: erwarteter Typ %s, %s gefunden" -#: builtin/index-pack.c:267 +#: builtin/index-pack.c:268 #, c-format msgid "cannot fill %d byte" msgid_plural "cannot fill %d bytes" msgstr[0] "kann %d Byte nicht lesen" msgstr[1] "kann %d Bytes nicht lesen" -#: builtin/index-pack.c:277 +#: builtin/index-pack.c:278 msgid "early EOF" msgstr "zu frühes Dateiende" -#: builtin/index-pack.c:278 +#: builtin/index-pack.c:279 msgid "read error on input" msgstr "Fehler beim Lesen der Eingabe" -#: builtin/index-pack.c:290 +#: builtin/index-pack.c:291 msgid "used more bytes than were available" msgstr "verwendete mehr Bytes als verfügbar waren" -#: builtin/index-pack.c:297 +#: builtin/index-pack.c:298 msgid "pack too large for current definition of off_t" msgstr "Paket ist zu groß für die aktuelle Definition von off_t" -#: builtin/index-pack.c:313 +#: builtin/index-pack.c:314 #, c-format msgid "unable to create '%s'" msgstr "konnte '%s' nicht erstellen" -#: builtin/index-pack.c:318 +#: builtin/index-pack.c:319 #, c-format msgid "cannot open packfile '%s'" msgstr "Kann Paketdatei '%s' nicht öffnen" -#: builtin/index-pack.c:332 +#: builtin/index-pack.c:333 msgid "pack signature mismatch" msgstr "Paketsignatur stimmt nicht überein" -#: builtin/index-pack.c:334 +#: builtin/index-pack.c:335 #, c-format msgid "pack version %<PRIu32> unsupported" msgstr "Paketversion %<PRIu32> nicht unterstützt" -#: builtin/index-pack.c:352 +#: builtin/index-pack.c:353 #, c-format -msgid "pack has bad object at offset %lu: %s" -msgstr "Paket hat ein ungültiges Objekt bei Versatz %lu: %s" +msgid "pack has bad object at offset %<PRIuMAX>: %s" +msgstr "Paket hat ein ungültiges Objekt bei Versatz %<PRIuMAX>: %s" -#: builtin/index-pack.c:473 +#: builtin/index-pack.c:475 #, c-format msgid "inflate returned %d" msgstr "Dekomprimierung gab %d zurück" -#: builtin/index-pack.c:522 +#: builtin/index-pack.c:524 msgid "offset value overflow for delta base object" msgstr "Wert für Versatz bei Differenzobjekt übergelaufen" -#: builtin/index-pack.c:530 +#: builtin/index-pack.c:532 msgid "delta base offset is out of bound" msgstr "" "Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs" -#: builtin/index-pack.c:538 +#: builtin/index-pack.c:540 #, c-format msgid "unknown object type %d" msgstr "Unbekannter Objekt-Typ %d" -#: builtin/index-pack.c:569 +#: builtin/index-pack.c:571 msgid "cannot pread pack file" msgstr "Kann Paketdatei %s nicht lesen" -#: builtin/index-pack.c:571 +#: builtin/index-pack.c:573 #, c-format -msgid "premature end of pack file, %lu byte missing" -msgid_plural "premature end of pack file, %lu bytes missing" -msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %lu Byte" -msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %lu Bytes" +msgid "premature end of pack file, %<PRIuMAX> byte missing" +msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing" +msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Byte" +msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Bytes" -#: builtin/index-pack.c:597 +#: builtin/index-pack.c:599 msgid "serious inflate inconsistency" msgstr "ernsthafte Inkonsistenz nach Dekomprimierung" -#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772 -#: builtin/index-pack.c:806 builtin/index-pack.c:815 +#: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774 +#: builtin/index-pack.c:808 builtin/index-pack.c:817 #, c-format msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !" -#: builtin/index-pack.c:746 builtin/pack-objects.c:162 -#: builtin/pack-objects.c:254 +#: builtin/index-pack.c:748 builtin/pack-objects.c:164 +#: builtin/pack-objects.c:256 #, c-format msgid "unable to read %s" msgstr "kann %s nicht lesen" -#: builtin/index-pack.c:812 +#: builtin/index-pack.c:814 #, c-format msgid "cannot read existing object %s" msgstr "Kann existierendes Objekt %s nicht lesen." -#: builtin/index-pack.c:826 +#: builtin/index-pack.c:828 #, c-format msgid "invalid blob object %s" msgstr "ungültiges Blob-Objekt %s" -#: builtin/index-pack.c:840 +#: builtin/index-pack.c:842 #, c-format msgid "invalid %s" msgstr "Ungültiger Objekt-Typ %s" -#: builtin/index-pack.c:843 +#: builtin/index-pack.c:845 msgid "Error in object" msgstr "Fehler in Objekt" -#: builtin/index-pack.c:845 +#: builtin/index-pack.c:847 #, c-format msgid "Not all child objects of %s are reachable" msgstr "Nicht alle Kind-Objekte von %s sind erreichbar" -#: builtin/index-pack.c:917 builtin/index-pack.c:948 +#: builtin/index-pack.c:919 builtin/index-pack.c:950 msgid "failed to apply delta" msgstr "Konnte Dateiunterschied nicht anwenden" -#: builtin/index-pack.c:1118 +#: builtin/index-pack.c:1120 msgid "Receiving objects" msgstr "Empfange Objekte" -#: builtin/index-pack.c:1118 +#: builtin/index-pack.c:1120 msgid "Indexing objects" msgstr "Indiziere Objekte" -#: builtin/index-pack.c:1150 +#: builtin/index-pack.c:1152 msgid "pack is corrupted (SHA1 mismatch)" msgstr "Paket ist beschädigt (SHA1 unterschiedlich)" -#: builtin/index-pack.c:1155 +#: builtin/index-pack.c:1157 msgid "cannot fstat packfile" msgstr "kann Paketdatei nicht lesen" -#: builtin/index-pack.c:1158 +#: builtin/index-pack.c:1160 msgid "pack has junk at the end" msgstr "Paketende enthält nicht verwendbaren Inhalt" -#: builtin/index-pack.c:1169 +#: builtin/index-pack.c:1171 msgid "confusion beyond insanity in parse_pack_objects()" msgstr "Fehler beim Ausführen von \"parse_pack_objects()\"" -#: builtin/index-pack.c:1194 +#: builtin/index-pack.c:1196 msgid "Resolving deltas" msgstr "Löse Unterschiede auf" -#: builtin/index-pack.c:1205 +#: builtin/index-pack.c:1207 #, c-format msgid "unable to create thread: %s" msgstr "kann Thread nicht erzeugen: %s" -#: builtin/index-pack.c:1247 +#: builtin/index-pack.c:1249 msgid "confusion beyond insanity" msgstr "Fehler beim Auflösen der Unterschiede" -#: builtin/index-pack.c:1253 +#: builtin/index-pack.c:1255 #, c-format msgid "completed with %d local object" msgid_plural "completed with %d local objects" msgstr[0] "abgeschlossen mit %d lokalem Objekt" msgstr[1] "abgeschlossen mit %d lokalen Objekten" -#: builtin/index-pack.c:1265 +#: builtin/index-pack.c:1267 #, c-format msgid "Unexpected tail checksum for %s (disk corruption?)" msgstr "Unerwartete Prüfsumme für %s (Festplattenfehler?)" -#: builtin/index-pack.c:1269 +#: builtin/index-pack.c:1271 #, 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:1293 +#: builtin/index-pack.c:1295 #, c-format msgid "unable to deflate appended object (%d)" msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren" -#: builtin/index-pack.c:1369 +#: builtin/index-pack.c:1371 #, c-format msgid "local object %s is corrupt" msgstr "lokales Objekt %s ist beschädigt" -#: builtin/index-pack.c:1393 +#: builtin/index-pack.c:1395 msgid "error while closing pack file" msgstr "Fehler beim Schließen der Paketdatei" -#: builtin/index-pack.c:1406 +#: builtin/index-pack.c:1408 #, c-format msgid "cannot write keep file '%s'" msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben" -#: builtin/index-pack.c:1414 +#: builtin/index-pack.c:1416 #, c-format msgid "cannot close written keep file '%s'" msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen" -#: builtin/index-pack.c:1427 +#: builtin/index-pack.c:1429 msgid "cannot store pack file" msgstr "Kann Paketdatei nicht speichern" -#: builtin/index-pack.c:1438 +#: builtin/index-pack.c:1440 msgid "cannot store index file" msgstr "Kann Indexdatei nicht speichern" -#: builtin/index-pack.c:1471 +#: builtin/index-pack.c:1473 #, c-format msgid "bad pack.indexversion=%<PRIu32>" msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig" -#: builtin/index-pack.c:1481 builtin/index-pack.c:1678 +#: builtin/index-pack.c:1483 builtin/index-pack.c:1681 #, c-format msgid "no threads support, ignoring %s" msgstr "keine Unterstützung von Threads, '%s' wird ignoriert" -#: builtin/index-pack.c:1540 +#: builtin/index-pack.c:1542 #, c-format msgid "Cannot open existing pack file '%s'" msgstr "Kann existierende Paketdatei '%s' nicht öffnen" -#: builtin/index-pack.c:1542 +#: builtin/index-pack.c:1544 #, 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:1589 +#: builtin/index-pack.c:1591 #, 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:1596 +#: builtin/index-pack.c:1598 #, 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:1609 +#: builtin/index-pack.c:1611 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'" -#: builtin/index-pack.c:1638 -msgid "Cannot come back to cwd" -msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln" - -#: builtin/index-pack.c:1690 builtin/index-pack.c:1693 -#: builtin/index-pack.c:1705 builtin/index-pack.c:1709 +#: builtin/index-pack.c:1693 builtin/index-pack.c:1696 +#: builtin/index-pack.c:1712 builtin/index-pack.c:1716 #, c-format msgid "bad %s" msgstr "%s ist ungültig" -#: builtin/index-pack.c:1723 +#: builtin/index-pack.c:1730 msgid "--fix-thin cannot be used without --stdin" msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden." -#: builtin/index-pack.c:1731 +#: builtin/index-pack.c:1738 msgid "--verify with no packfile name given" msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben." @@ -7664,27 +8046,27 @@ msgstr "kann nicht mit Dateityp %d umgehen" msgid "unable to move %s to %s" msgstr "Konnte %s nicht nach %s verschieben" -#. 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:403 +#: builtin/init-db.c:402 #, c-format -msgid "%s%s Git repository in %s%s\n" -msgstr "%s%s Git-Repository in %s%s\n" +msgid "Reinitialized existing shared Git repository in %s%s\n" +msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n" -#: builtin/init-db.c:404 -msgid "Reinitialized existing" -msgstr "Reinitialisierte existierendes" +#: builtin/init-db.c:403 +#, c-format +msgid "Reinitialized existing Git repository in %s%s\n" +msgstr "Bestehendes Git-Repository in %s%s neuinitialisiert\n" -#: builtin/init-db.c:404 -msgid "Initialized empty" -msgstr "Initialisierte leeres" +#: builtin/init-db.c:407 +#, c-format +msgid "Initialized empty shared Git repository in %s%s\n" +msgstr "Leeres verteiltes Git-Repository in %s%s initialisiert\n" -#: builtin/init-db.c:405 -msgid " shared" -msgstr " gemeinsames" +#: builtin/init-db.c:408 +#, c-format +msgid "Initialized empty Git repository in %s%s\n" +msgstr "Leeres Git-Repository in %s%s initialisiert\n" -#: builtin/init-db.c:452 +#: builtin/init-db.c:455 msgid "" "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" "shared[=<permissions>]] [<directory>]" @@ -7692,25 +8074,25 @@ msgstr "" "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--" "shared[=<Berechtigungen>]] [<Verzeichnis>]" -#: builtin/init-db.c:475 +#: builtin/init-db.c:478 msgid "permissions" msgstr "Berechtigungen" -#: builtin/init-db.c:476 +#: builtin/init-db.c:479 msgid "specify that the git repository is to be shared amongst several users" msgstr "angeben, dass das Git-Repository mit mehreren Benutzern geteilt wird" -#: builtin/init-db.c:510 builtin/init-db.c:515 +#: builtin/init-db.c:513 builtin/init-db.c:518 #, c-format msgid "cannot mkdir %s" msgstr "kann Verzeichnis %s nicht erstellen" -#: builtin/init-db.c:519 +#: builtin/init-db.c:522 #, c-format msgid "cannot chdir to %s" msgstr "kann nicht in Verzeichnis %s wechseln" -#: builtin/init-db.c:540 +#: builtin/init-db.c:543 #, c-format msgid "" "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" @@ -7719,7 +8101,7 @@ msgstr "" "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s " "(oder --git-dir=<Verzeichnis>)" -#: builtin/init-db.c:568 +#: builtin/init-db.c:571 #, c-format msgid "Cannot access work tree '%s'" msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen." @@ -7752,115 +8134,115 @@ msgstr "Anhang/Anhänge hinzufügen" msgid "no input file given for in-place editing" msgstr "keine Datei zur direkten Bearbeitung angegeben" -#: builtin/log.c:43 +#: builtin/log.c:44 msgid "git log [<options>] [<revision-range>] [[--] <path>...]" msgstr "git log [<Optionen>] [<Commitbereich>] [[--] <Pfad>...]" -#: builtin/log.c:44 +#: builtin/log.c:45 msgid "git show [<options>] <object>..." msgstr "git show [<Optionen>] <Objekt>..." -#: builtin/log.c:83 +#: builtin/log.c:84 #, c-format msgid "invalid --decorate option: %s" msgstr "Ungültige Option für --decorate: %s" -#: builtin/log.c:137 +#: builtin/log.c:139 msgid "suppress diff output" msgstr "Ausgabe der Unterschiede unterdrücken" -#: builtin/log.c:138 +#: builtin/log.c:140 msgid "show source" msgstr "Quelle anzeigen" -#: builtin/log.c:139 +#: builtin/log.c:141 msgid "Use mail map file" msgstr "\"mailmap\"-Datei verwenden" -#: builtin/log.c:140 +#: builtin/log.c:142 msgid "decorate options" msgstr "decorate-Optionen" -#: builtin/log.c:143 +#: builtin/log.c:145 msgid "Process line range n,m in file, counting from 1" msgstr "Verarbeitet nur Zeilen im Bereich n,m in der Datei, gezählt von 1" -#: builtin/log.c:239 +#: builtin/log.c:241 #, c-format msgid "Final output: %d %s\n" msgstr "letzte Ausgabe: %d %s\n" -#: builtin/log.c:471 +#: builtin/log.c:486 #, c-format msgid "git show %s: bad file" msgstr "git show %s: ungültige Datei" -#: builtin/log.c:485 builtin/log.c:578 +#: builtin/log.c:500 builtin/log.c:594 #, c-format msgid "Could not read object %s" msgstr "Kann Objekt %s nicht lesen." -#: builtin/log.c:602 +#: builtin/log.c:618 #, c-format msgid "Unknown type: %d" msgstr "Unbekannter Typ: %d" -#: builtin/log.c:722 +#: builtin/log.c:739 msgid "format.headers without value" msgstr "format.headers ohne Wert" -#: builtin/log.c:812 +#: builtin/log.c:839 msgid "name of output directory is too long" msgstr "Name des Ausgabeverzeichnisses ist zu lang." -#: builtin/log.c:827 +#: builtin/log.c:854 #, c-format msgid "Cannot open patch file %s" msgstr "Kann Patch-Datei %s nicht öffnen" -#: builtin/log.c:841 +#: builtin/log.c:868 msgid "Need exactly one range." msgstr "Brauche genau einen Commit-Bereich." -#: builtin/log.c:851 +#: builtin/log.c:878 msgid "Not a range." msgstr "Kein Commit-Bereich." -#: builtin/log.c:957 +#: builtin/log.c:984 msgid "Cover letter needs email format" msgstr "Anschreiben benötigt E-Mail-Format" -#: builtin/log.c:1036 +#: builtin/log.c:1064 #, c-format msgid "insane in-reply-to: %s" msgstr "ungültiges in-reply-to: %s" -#: builtin/log.c:1064 +#: builtin/log.c:1092 msgid "git format-patch [<options>] [<since> | <revision-range>]" msgstr "git format-patch [<Optionen>] [<seit> | <Commitbereich>]" -#: builtin/log.c:1109 +#: builtin/log.c:1137 msgid "Two output directories?" msgstr "Zwei Ausgabeverzeichnisse?" -#: builtin/log.c:1216 builtin/log.c:1857 builtin/log.c:1859 builtin/log.c:1871 +#: builtin/log.c:1244 builtin/log.c:1883 builtin/log.c:1885 builtin/log.c:1897 #, c-format msgid "Unknown commit %s" msgstr "Unbekannter Commit %s" -#: builtin/log.c:1226 builtin/notes.c:253 builtin/notes.c:304 -#: builtin/notes.c:306 builtin/notes.c:369 builtin/notes.c:424 -#: builtin/notes.c:510 builtin/notes.c:515 builtin/notes.c:593 -#: builtin/notes.c:656 builtin/notes.c:881 builtin/tag.c:455 +#: builtin/log.c:1254 builtin/notes.c:254 builtin/notes.c:305 +#: builtin/notes.c:307 builtin/notes.c:370 builtin/notes.c:425 +#: builtin/notes.c:511 builtin/notes.c:516 builtin/notes.c:594 +#: builtin/notes.c:657 builtin/notes.c:882 builtin/tag.c:455 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Konnte '%s' nicht als gültige Referenz auflösen." -#: builtin/log.c:1231 +#: builtin/log.c:1259 msgid "Could not find exact merge base." msgstr "Konnte keine exakte Merge-Basis finden." -#: builtin/log.c:1235 +#: builtin/log.c:1263 msgid "" "Failed to get upstream, if you want to record base commit automatically,\n" "please use git branch --set-upstream-to to track a remote branch.\n" @@ -7871,212 +8253,212 @@ msgstr "" "'git branch --set-upstream-to', um einem Remote-Branch zu folgen.\n" "Oder geben Sie den Basis-Commit mit '--base=<Basis-Commit-Id>' manuell an." -#: builtin/log.c:1255 +#: builtin/log.c:1283 msgid "Failed to find exact merge base" msgstr "Fehler beim Finden einer exakten Merge-Basis." -#: builtin/log.c:1266 +#: builtin/log.c:1294 msgid "base commit should be the ancestor of revision list" msgstr "Basis-Commit sollte der Vorgänger der Revisionsliste sein." -#: builtin/log.c:1270 +#: builtin/log.c:1298 msgid "base commit shouldn't be in revision list" msgstr "Basis-Commit sollte nicht in der Revisionsliste enthalten sein." -#: builtin/log.c:1319 +#: builtin/log.c:1347 msgid "cannot get patch id" msgstr "kann Patch-Id nicht lesen" -#: builtin/log.c:1377 +#: builtin/log.c:1404 msgid "use [PATCH n/m] even with a single patch" msgstr "[PATCH n/m] auch mit einzelnem Patch verwenden" -#: builtin/log.c:1380 +#: builtin/log.c:1407 msgid "use [PATCH] even with multiple patches" msgstr "[PATCH] auch mit mehreren Patches verwenden" -#: builtin/log.c:1384 +#: builtin/log.c:1411 msgid "print patches to standard out" msgstr "Ausgabe der Patches in Standard-Ausgabe" -#: builtin/log.c:1386 +#: builtin/log.c:1413 msgid "generate a cover letter" msgstr "ein Deckblatt erzeugen" -#: builtin/log.c:1388 +#: builtin/log.c:1415 msgid "use simple number sequence for output file names" msgstr "einfache Nummernfolge für die Namen der Ausgabedateien verwenden" -#: builtin/log.c:1389 +#: builtin/log.c:1416 msgid "sfx" msgstr "Dateiendung" -#: builtin/log.c:1390 +#: builtin/log.c:1417 msgid "use <sfx> instead of '.patch'" msgstr "<Dateiendung> anstatt '.patch' verwenden" -#: builtin/log.c:1392 +#: builtin/log.c:1419 msgid "start numbering patches at <n> instead of 1" msgstr "die Nummerierung der Patches bei <n> anstatt bei 1 beginnen" -#: builtin/log.c:1394 +#: builtin/log.c:1421 msgid "mark the series as Nth re-roll" msgstr "die Serie als n-te Fassung kennzeichnen" -#: builtin/log.c:1396 +#: builtin/log.c:1423 msgid "Use [<prefix>] instead of [PATCH]" msgstr "[<Präfix>] anstatt [PATCH] verwenden" -#: builtin/log.c:1399 +#: builtin/log.c:1426 msgid "store resulting files in <dir>" msgstr "erzeugte Dateien in <Verzeichnis> speichern" -#: builtin/log.c:1402 +#: builtin/log.c:1429 msgid "don't strip/add [PATCH]" msgstr "[PATCH] nicht entfernen/hinzufügen" -#: builtin/log.c:1405 +#: builtin/log.c:1432 msgid "don't output binary diffs" msgstr "keine binären Unterschiede ausgeben" -#: builtin/log.c:1407 +#: builtin/log.c:1434 msgid "output all-zero hash in From header" msgstr "Hash mit Nullen in \"From\"-Header ausgeben" -#: builtin/log.c:1409 +#: builtin/log.c:1436 msgid "don't include a patch matching a commit upstream" msgstr "" "keine Patches einschließen, die einem Commit im Upstream-Branch entsprechen" -#: builtin/log.c:1411 +#: builtin/log.c:1438 msgid "show patch format instead of default (patch + stat)" msgstr "Patchformat anstatt des Standards anzeigen (Patch + Zusammenfassung)" -#: builtin/log.c:1413 +#: builtin/log.c:1440 msgid "Messaging" msgstr "E-Mail-Einstellungen" -#: builtin/log.c:1414 +#: builtin/log.c:1441 msgid "header" msgstr "Header" -#: builtin/log.c:1415 +#: builtin/log.c:1442 msgid "add email header" msgstr "E-Mail-Header hinzufügen" -#: builtin/log.c:1416 builtin/log.c:1418 +#: builtin/log.c:1443 builtin/log.c:1445 msgid "email" msgstr "E-Mail" -#: builtin/log.c:1416 +#: builtin/log.c:1443 msgid "add To: header" msgstr "\"To:\"-Header hinzufügen" -#: builtin/log.c:1418 +#: builtin/log.c:1445 msgid "add Cc: header" msgstr "\"Cc:\"-Header hinzufügen" -#: builtin/log.c:1420 +#: builtin/log.c:1447 msgid "ident" msgstr "Ident" -#: builtin/log.c:1421 +#: builtin/log.c:1448 msgid "set From address to <ident> (or committer ident if absent)" msgstr "" "\"From\"-Adresse auf <Ident> setzen (oder Ident des Commit-Erstellers, wenn " "fehlend)" -#: builtin/log.c:1423 +#: builtin/log.c:1450 msgid "message-id" msgstr "message-id" -#: builtin/log.c:1424 +#: builtin/log.c:1451 msgid "make first mail a reply to <message-id>" msgstr "aus erster E-Mail eine Antwort zu <message-id> machen" -#: builtin/log.c:1425 builtin/log.c:1428 +#: builtin/log.c:1452 builtin/log.c:1455 msgid "boundary" msgstr "Grenze" -#: builtin/log.c:1426 +#: builtin/log.c:1453 msgid "attach the patch" msgstr "den Patch anhängen" -#: builtin/log.c:1429 +#: builtin/log.c:1456 msgid "inline the patch" msgstr "den Patch direkt in die Nachricht einfügen" -#: builtin/log.c:1433 +#: builtin/log.c:1460 msgid "enable message threading, styles: shallow, deep" msgstr "Nachrichtenverkettung aktivieren, Stile: shallow, deep" -#: builtin/log.c:1435 +#: builtin/log.c:1462 msgid "signature" msgstr "Signatur" -#: builtin/log.c:1436 +#: builtin/log.c:1463 msgid "add a signature" msgstr "eine Signatur hinzufügen" -#: builtin/log.c:1437 +#: builtin/log.c:1464 msgid "base-commit" msgstr "Basis-Commit" -#: builtin/log.c:1438 +#: builtin/log.c:1465 msgid "add prerequisite tree info to the patch series" msgstr "erforderliche Revisions-Informationen der Patch-Serie hinzufügen" -#: builtin/log.c:1440 +#: builtin/log.c:1467 msgid "add a signature from a file" msgstr "eine Signatur aus einer Datei hinzufügen" -#: builtin/log.c:1441 +#: builtin/log.c:1468 msgid "don't print the patch filenames" msgstr "keine Dateinamen der Patches anzeigen" -#: builtin/log.c:1531 +#: builtin/log.c:1558 msgid "-n and -k are mutually exclusive." msgstr "Die Optionen -n und -k schließen sich gegenseitig aus." -#: builtin/log.c:1533 +#: builtin/log.c:1560 msgid "--subject-prefix and -k are mutually exclusive." msgstr "Die Optionen --subject-prefix und -k schließen sich gegenseitig aus." -#: builtin/log.c:1541 +#: builtin/log.c:1568 msgid "--name-only does not make sense" msgstr "Die Option --name-only kann nicht verwendet werden." -#: builtin/log.c:1543 +#: builtin/log.c:1570 msgid "--name-status does not make sense" msgstr "Die Option --name-status kann nicht verwendet werden." -#: builtin/log.c:1545 +#: builtin/log.c:1572 msgid "--check does not make sense" msgstr "Die Option --check kann nicht verwendet werden." -#: builtin/log.c:1573 +#: builtin/log.c:1602 msgid "standard output, or directory, which one?" msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?" -#: builtin/log.c:1575 +#: builtin/log.c:1604 #, c-format msgid "Could not create directory '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/log.c:1672 +#: builtin/log.c:1698 #, c-format msgid "unable to read signature file '%s'" msgstr "Konnte Signatur-Datei '%s' nicht lesen" -#: builtin/log.c:1743 +#: builtin/log.c:1769 msgid "Failed to create output files" msgstr "Fehler beim Erstellen der Ausgabedateien." -#: builtin/log.c:1792 +#: builtin/log.c:1818 msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" msgstr "git cherry [-v] [<Upstream> [<Branch> [<Limit>]]]" -#: builtin/log.c:1846 +#: builtin/log.c:1872 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" @@ -8084,104 +8466,104 @@ msgstr "" "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie <Upstream> " "manuell an.\n" -#: builtin/ls-files.c:378 +#: builtin/ls-files.c:379 msgid "git ls-files [<options>] [<file>...]" msgstr "git ls-files [<Optionen>] [<Datei>...]" -#: builtin/ls-files.c:427 +#: builtin/ls-files.c:428 msgid "identify the file status with tags" msgstr "den Dateistatus mit Tags anzeigen" -#: builtin/ls-files.c:429 +#: builtin/ls-files.c:430 msgid "use lowercase letters for 'assume unchanged' files" msgstr "" "Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung verwenden" -#: builtin/ls-files.c:431 +#: builtin/ls-files.c:432 msgid "show cached files in the output (default)" msgstr "zwischengespeicherte Dateien in der Ausgabe anzeigen (Standard)" -#: builtin/ls-files.c:433 +#: builtin/ls-files.c:434 msgid "show deleted files in the output" msgstr "entfernte Dateien in der Ausgabe anzeigen" -#: builtin/ls-files.c:435 +#: builtin/ls-files.c:436 msgid "show modified files in the output" msgstr "geänderte Dateien in der Ausgabe anzeigen" -#: builtin/ls-files.c:437 +#: builtin/ls-files.c:438 msgid "show other files in the output" msgstr "sonstige Dateien in der Ausgabe anzeigen" -#: builtin/ls-files.c:439 +#: builtin/ls-files.c:440 msgid "show ignored files in the output" msgstr "ignorierte Dateien in der Ausgabe anzeigen" -#: builtin/ls-files.c:442 +#: builtin/ls-files.c:443 msgid "show staged contents' object name in the output" msgstr "" "Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der Ausgabe " "anzeigen" -#: builtin/ls-files.c:444 +#: builtin/ls-files.c:445 msgid "show files on the filesystem that need to be removed" msgstr "Dateien im Dateisystem, die gelöscht werden müssen, anzeigen" -#: builtin/ls-files.c:446 +#: builtin/ls-files.c:447 msgid "show 'other' directories' names only" msgstr "nur Namen von 'sonstigen' Verzeichnissen anzeigen" -#: builtin/ls-files.c:448 +#: builtin/ls-files.c:449 msgid "show line endings of files" msgstr "Zeilenenden von Dateien anzeigen" -#: builtin/ls-files.c:450 +#: builtin/ls-files.c:451 msgid "don't show empty directories" msgstr "keine leeren Verzeichnisse anzeigen" -#: builtin/ls-files.c:453 +#: builtin/ls-files.c:454 msgid "show unmerged files in the output" msgstr "nicht zusammengeführte Dateien in der Ausgabe anzeigen" -#: builtin/ls-files.c:455 +#: builtin/ls-files.c:456 msgid "show resolve-undo information" msgstr "'resolve-undo' Informationen anzeigen" -#: builtin/ls-files.c:457 +#: builtin/ls-files.c:458 msgid "skip files matching pattern" msgstr "Dateien auslassen, die einem Muster entsprechen" -#: builtin/ls-files.c:460 +#: builtin/ls-files.c:461 msgid "exclude patterns are read from <file>" msgstr "Muster, gelesen von <Datei>, ausschließen" -#: builtin/ls-files.c:463 +#: builtin/ls-files.c:464 msgid "read additional per-directory exclude patterns in <file>" msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei> auslesen" -#: builtin/ls-files.c:465 +#: builtin/ls-files.c:466 msgid "add the standard git exclusions" msgstr "die standardmäßigen Git-Ausschlüsse hinzufügen" -#: builtin/ls-files.c:468 +#: builtin/ls-files.c:469 msgid "make the output relative to the project top directory" msgstr "Ausgabe relativ zum Projektverzeichnis" -#: builtin/ls-files.c:471 +#: builtin/ls-files.c:472 msgid "if any <file> is not in the index, treat this as an error" msgstr "als Fehler behandeln, wenn sich eine <Datei> nicht im Index befindet" -#: builtin/ls-files.c:472 +#: builtin/ls-files.c:473 msgid "tree-ish" msgstr "Commit-Referenz" -#: builtin/ls-files.c:473 +#: builtin/ls-files.c:474 msgid "pretend that paths removed since <tree-ish> are still present" msgstr "" "vorgeben, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch " "vorhanden sind" -#: builtin/ls-files.c:475 +#: builtin/ls-files.c:476 msgid "show debugging data" msgstr "Ausgaben zur Fehlersuche anzeigen" @@ -8271,191 +8653,177 @@ msgstr "" "das gesamte Verzeichnis auflisten; nicht nur das aktuelle Verzeichnis " "(impliziert --full-name)" -#: builtin/merge.c:45 +#: builtin/merge.c:46 msgid "git merge [<options>] [<commit>...]" msgstr "git merge [<Optionen>] [<Commit>...]" -#: builtin/merge.c:46 +#: builtin/merge.c:47 msgid "git merge [<options>] <msg> HEAD <commit>" msgstr "git merge [<Optionen>] <Beschreibung> HEAD <Commit>" -#: builtin/merge.c:47 +#: builtin/merge.c:48 msgid "git merge --abort" msgstr "git merge --abort" -#: builtin/merge.c:101 +#: builtin/merge.c:102 msgid "switch `m' requires a value" msgstr "Schalter 'm' erfordert einen Wert." -#: builtin/merge.c:138 +#: builtin/merge.c:139 #, c-format msgid "Could not find merge strategy '%s'.\n" msgstr "Konnte Merge-Strategie '%s' nicht finden.\n" -#: builtin/merge.c:139 +#: builtin/merge.c:140 #, c-format msgid "Available strategies are:" msgstr "Verfügbare Strategien sind:" -#: builtin/merge.c:144 +#: builtin/merge.c:145 #, c-format msgid "Available custom strategies are:" msgstr "Verfügbare benutzerdefinierte Strategien sind:" -#: builtin/merge.c:194 builtin/pull.c:126 +#: builtin/merge.c:195 builtin/pull.c:126 msgid "do not show a diffstat at the end of the merge" msgstr "keine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen" -#: builtin/merge.c:197 builtin/pull.c:129 +#: builtin/merge.c:198 builtin/pull.c:129 msgid "show a diffstat at the end of the merge" msgstr "eine Zusammenfassung der Unterschiede am Schluss des Merges anzeigen" -#: builtin/merge.c:198 builtin/pull.c:132 +#: builtin/merge.c:199 builtin/pull.c:132 msgid "(synonym to --stat)" msgstr "(Synonym für --stat)" -#: builtin/merge.c:200 builtin/pull.c:135 +#: builtin/merge.c:201 builtin/pull.c:135 msgid "add (at most <n>) entries from shortlog to merge commit message" msgstr "" "(höchstens <n>) Einträge von \"shortlog\" zur Beschreibung des Merge-Commits " "hinzufügen" -#: builtin/merge.c:203 builtin/pull.c:138 +#: builtin/merge.c:204 builtin/pull.c:138 msgid "create a single commit instead of doing a merge" msgstr "einen einzelnen Commit anstatt eines Merges erzeugen" -#: builtin/merge.c:205 builtin/pull.c:141 +#: builtin/merge.c:206 builtin/pull.c:141 msgid "perform a commit if the merge succeeds (default)" msgstr "einen Commit durchführen, wenn der Merge erfolgreich war (Standard)" -#: builtin/merge.c:207 builtin/pull.c:144 +#: builtin/merge.c:208 builtin/pull.c:144 msgid "edit message before committing" msgstr "Bearbeitung der Beschreibung vor dem Commit" -#: builtin/merge.c:208 +#: builtin/merge.c:209 msgid "allow fast-forward (default)" msgstr "Vorspulen erlauben (Standard)" -#: builtin/merge.c:210 builtin/pull.c:150 +#: builtin/merge.c:211 builtin/pull.c:150 msgid "abort if fast-forward is not possible" msgstr "abbrechen, wenn kein Vorspulen möglich ist" -#: builtin/merge.c:214 -msgid "Verify that the named commit has a valid GPG signature" +#: builtin/merge.c:215 builtin/pull.c:153 +msgid "verify that the named commit has a valid GPG signature" msgstr "den genannten Commit auf eine gültige GPG-Signatur überprüfen" -#: builtin/merge.c:215 builtin/notes.c:771 builtin/pull.c:157 +#: builtin/merge.c:216 builtin/notes.c:772 builtin/pull.c:157 #: builtin/revert.c:89 msgid "strategy" msgstr "Strategie" -#: builtin/merge.c:216 builtin/pull.c:158 +#: builtin/merge.c:217 builtin/pull.c:158 msgid "merge strategy to use" msgstr "zu verwendende Merge-Strategie" -#: builtin/merge.c:217 builtin/pull.c:161 +#: builtin/merge.c:218 builtin/pull.c:161 msgid "option=value" msgstr "Option=Wert" -#: builtin/merge.c:218 builtin/pull.c:162 +#: builtin/merge.c:219 builtin/pull.c:162 msgid "option for selected merge strategy" msgstr "Option für ausgewählte Merge-Strategie" -#: builtin/merge.c:220 +#: builtin/merge.c:221 msgid "merge commit message (for a non-fast-forward merge)" msgstr "" "Commit-Beschreibung zusammenführen (für einen Merge, der kein Vorspulen war)" -#: builtin/merge.c:224 +#: builtin/merge.c:225 msgid "abort the current in-progress merge" msgstr "den sich im Gange befindlichen Merge abbrechen" -#: builtin/merge.c:226 builtin/pull.c:169 +#: builtin/merge.c:227 builtin/pull.c:169 msgid "allow merging unrelated histories" msgstr "erlaube das Zusammenführen von nicht zusammenhängenden Historien" -#: builtin/merge.c:254 +#: builtin/merge.c:255 msgid "could not run stash." msgstr "Konnte \"stash\" nicht ausführen." -#: builtin/merge.c:259 +#: builtin/merge.c:260 msgid "stash failed" msgstr "\"stash\" fehlgeschlagen" -#: builtin/merge.c:264 +#: builtin/merge.c:265 #, c-format msgid "not a valid object: %s" msgstr "kein gültiges Objekt: %s" -#: builtin/merge.c:283 builtin/merge.c:300 +#: builtin/merge.c:284 builtin/merge.c:301 msgid "read-tree failed" msgstr "read-tree fehlgeschlagen" -#: builtin/merge.c:330 +#: builtin/merge.c:331 msgid " (nothing to squash)" msgstr " (nichts zu quetschen)" -#: builtin/merge.c:343 +#: builtin/merge.c:342 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Quetsche Commit -- HEAD wird nicht aktualisiert\n" -#: builtin/merge.c:347 builtin/merge.c:767 builtin/merge.c:987 -#: builtin/merge.c:1000 -#, c-format -msgid "Could not write to '%s'" -msgstr "Konnte nicht nach '%s' schreiben." - -#: builtin/merge.c:375 -msgid "Writing SQUASH_MSG" -msgstr "Schreibe SQUASH_MSG" - -#: builtin/merge.c:377 -msgid "Finishing SQUASH_MSG" -msgstr "Schließe SQUASH_MSG ab" - -#: builtin/merge.c:400 +#: builtin/merge.c:392 #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "Keine Merge-Commit-Beschreibung -- HEAD wird nicht aktualisiert\n" -#: builtin/merge.c:451 +#: builtin/merge.c:443 #, c-format msgid "'%s' does not point to a commit" msgstr "'%s' zeigt auf keinen Commit" -#: builtin/merge.c:541 +#: builtin/merge.c:533 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Ungültiger branch.%s.mergeoptions String: %s" -#: builtin/merge.c:660 +#: builtin/merge.c:652 msgid "Not handling anything other than two heads merge." msgstr "Es wird nur der Merge von zwei Branches behandelt." -#: builtin/merge.c:674 +#: builtin/merge.c:666 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Unbekannte Option für merge-recursive: -X%s" -#: builtin/merge.c:687 +#: builtin/merge.c:681 #, c-format msgid "unable to write %s" msgstr "konnte %s nicht schreiben" -#: builtin/merge.c:776 +#: builtin/merge.c:733 #, c-format msgid "Could not read from '%s'" msgstr "konnte nicht von '%s' lesen" -#: builtin/merge.c:785 +#: builtin/merge.c:742 #, 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:791 +#: builtin/merge.c:748 #, c-format msgid "" "Please enter a commit message to explain why this merge is necessary,\n" @@ -8471,55 +8839,69 @@ msgstr "" "Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n" "bricht den Commit ab.\n" -#: builtin/merge.c:815 +#: builtin/merge.c:772 msgid "Empty commit message." msgstr "Leere Commit-Beschreibung" -#: builtin/merge.c:835 +#: builtin/merge.c:792 #, c-format msgid "Wonderful.\n" msgstr "Wunderbar.\n" -#: builtin/merge.c:890 +#: builtin/merge.c:847 #, 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:906 +#: builtin/merge.c:863 #, c-format msgid "'%s' is not a commit" msgstr "'%s' ist kein Commit" -#: builtin/merge.c:947 +#: builtin/merge.c:904 msgid "No current branch." msgstr "Sie befinden sich auf keinem Branch." -#: builtin/merge.c:949 +#: builtin/merge.c:906 msgid "No remote for the current branch." msgstr "Kein Remote-Repository für den aktuellen Branch." -#: builtin/merge.c:951 +#: builtin/merge.c:908 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:956 +#: builtin/merge.c:913 #, c-format msgid "No remote-tracking branch for %s from %s" msgstr "Kein Remote-Tracking-Branch für %s von %s" -#: builtin/merge.c:1091 +#: builtin/merge.c:960 +#, c-format +msgid "Bad value '%s' in environment '%s'" +msgstr "Fehlerhafter Wert '%s' in Umgebungsvariable '%s'" + +#: builtin/merge.c:1034 #, c-format msgid "could not close '%s'" msgstr "Konnte '%s' nicht schließen" -#: builtin/merge.c:1219 +#: builtin/merge.c:1061 +#, c-format +msgid "not something we can merge in %s: %s" +msgstr "nichts was wir in %s zusammenführen können: %s" + +#: builtin/merge.c:1095 +msgid "not something we can merge" +msgstr "nichts was wir zusammenführen können" + +#: builtin/merge.c:1162 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Es gibt keinen Merge zum Abbrechen (MERGE_HEAD fehlt)" -#: builtin/merge.c:1235 +#: builtin/merge.c:1178 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you merge." @@ -8527,7 +8909,7 @@ msgstr "" "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n" "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen." -#: builtin/merge.c:1242 +#: builtin/merge.c:1185 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you merge." @@ -8535,109 +8917,117 @@ msgstr "" "Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n" "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen." -#: builtin/merge.c:1245 +#: builtin/merge.c:1188 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:1254 +#: builtin/merge.c:1197 msgid "You cannot combine --squash with --no-ff." msgstr "Sie können --squash nicht mit --no-ff kombinieren." -#: builtin/merge.c:1262 +#: builtin/merge.c:1205 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt." -#: builtin/merge.c:1279 +#: builtin/merge.c:1222 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:1281 +#: builtin/merge.c:1224 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:1286 +#: builtin/merge.c:1229 #, c-format msgid "%s - not something we can merge" msgstr "%s - nichts was wir zusammenführen können" -#: builtin/merge.c:1288 +#: builtin/merge.c:1231 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:1344 +#: builtin/merge.c:1287 #, 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:1347 +#: builtin/merge.c:1290 #, 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." -#: builtin/merge.c:1350 +#: builtin/merge.c:1293 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "Commit %s hat keine GPG-Signatur." -#: builtin/merge.c:1353 +#: builtin/merge.c:1296 #, 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:1415 +#: builtin/merge.c:1358 msgid "refusing to merge unrelated histories" msgstr "Verweigere den Merge von nicht zusammenhängenden Historien." -#: builtin/merge.c:1439 +#: builtin/merge.c:1367 +msgid "Already up-to-date." +msgstr "Bereits aktuell." + +#: builtin/merge.c:1382 #, c-format msgid "Updating %s..%s\n" msgstr "Aktualisiere %s..%s\n" -#: builtin/merge.c:1476 +#: builtin/merge.c:1419 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n" -#: builtin/merge.c:1483 +#: builtin/merge.c:1426 #, c-format msgid "Nope.\n" msgstr "Nein.\n" -#: builtin/merge.c:1515 +#: builtin/merge.c:1451 +msgid "Already up-to-date. Yeeah!" +msgstr "Bereits aktuell." + +#: builtin/merge.c:1457 msgid "Not possible to fast-forward, aborting." msgstr "Vorspulen nicht möglich, breche ab." -#: builtin/merge.c:1538 builtin/merge.c:1617 +#: builtin/merge.c:1480 builtin/merge.c:1559 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n" -#: builtin/merge.c:1542 +#: builtin/merge.c:1484 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Probiere Merge-Strategie %s ...\n" -#: builtin/merge.c:1608 +#: builtin/merge.c:1550 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Keine Merge-Strategie behandelt diesen Merge.\n" -#: builtin/merge.c:1610 +#: builtin/merge.c:1552 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Merge mit Strategie %s fehlgeschlagen.\n" -#: builtin/merge.c:1619 +#: builtin/merge.c:1561 #, 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:1631 +#: builtin/merge.c:1573 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" @@ -8768,68 +9158,68 @@ msgstr "Verschieben/Umbenennen erzwingen, auch wenn das Ziel existiert" msgid "skip move/rename errors" msgstr "Fehler beim Verschieben oder Umbenennen überspringen" -#: builtin/mv.c:152 +#: builtin/mv.c:155 #, c-format msgid "destination '%s' is not a directory" msgstr "Ziel '%s' ist kein Verzeichnis" -#: builtin/mv.c:163 +#: builtin/mv.c:166 #, c-format msgid "Checking rename of '%s' to '%s'\n" msgstr "Prüfe Umbenennung von '%s' nach '%s'\n" -#: builtin/mv.c:167 +#: builtin/mv.c:170 msgid "bad source" msgstr "ungültige Quelle" -#: builtin/mv.c:170 +#: builtin/mv.c:173 msgid "can not move directory into itself" msgstr "kann Verzeichnis nicht in sich selbst verschieben" -#: builtin/mv.c:173 +#: builtin/mv.c:176 msgid "cannot move directory over file" msgstr "kann Verzeichnis nicht über Datei verschieben" -#: builtin/mv.c:182 +#: builtin/mv.c:185 msgid "source directory is empty" msgstr "Quellverzeichnis ist leer" -#: builtin/mv.c:207 +#: builtin/mv.c:210 msgid "not under version control" msgstr "nicht unter Versionskontrolle" -#: builtin/mv.c:210 +#: builtin/mv.c:213 msgid "destination exists" msgstr "Ziel existiert bereits" -#: builtin/mv.c:218 +#: builtin/mv.c:221 #, c-format msgid "overwriting '%s'" msgstr "überschreibe '%s'" -#: builtin/mv.c:221 +#: builtin/mv.c:224 msgid "Cannot overwrite" msgstr "Kann nicht überschreiben" -#: builtin/mv.c:224 +#: builtin/mv.c:227 msgid "multiple sources for the same target" msgstr "mehrere Quellen für das selbe Ziel" -#: builtin/mv.c:226 +#: builtin/mv.c:229 msgid "destination directory does not exist" msgstr "Zielverzeichnis existiert nicht" -#: builtin/mv.c:233 +#: builtin/mv.c:236 #, c-format msgid "%s, source=%s, destination=%s" msgstr "%s, Quelle=%s, Ziel=%s" -#: builtin/mv.c:254 +#: builtin/mv.c:257 #, c-format msgid "Renaming %s to %s\n" msgstr "Benenne %s nach %s um\n" -#: builtin/mv.c:260 builtin/remote.c:714 builtin/repack.c:365 +#: builtin/mv.c:263 builtin/remote.c:710 builtin/repack.c:375 #, c-format msgid "renaming '%s' failed" msgstr "Umbenennung von '%s' fehlgeschlagen" @@ -8986,6 +9376,10 @@ msgstr "git notes prune [<Optionen>]" msgid "git notes get-ref" msgstr "git notes get-ref" +#: builtin/notes.c:94 +msgid "Write/edit the notes for the following object:" +msgstr "Schreiben/Bearbeiten der Notizen für das folgende Objekt:" + #: builtin/notes.c:147 #, c-format msgid "unable to start 'show' for object '%s'" @@ -9000,81 +9394,76 @@ msgstr "Konnte Ausgabe von 'show' nicht lesen." msgid "failed to finish 'show' for object '%s'" msgstr "konnte 'show' für Objekt '%s' nicht abschließen" -#: builtin/notes.c:174 builtin/tag.c:248 -#, c-format -msgid "could not create file '%s'" -msgstr "konnte Datei '%s' nicht erstellen" - -#: builtin/notes.c:193 +#: builtin/notes.c:194 msgid "Please supply the note contents using either -m or -F option" msgstr "" "Bitte liefern Sie den Notiz-Inhalt unter Verwendung der Option -m oder -F." -#: builtin/notes.c:202 +#: builtin/notes.c:203 msgid "unable to write note object" msgstr "Konnte Notiz-Objekt nicht schreiben" -#: builtin/notes.c:204 +#: builtin/notes.c:205 #, c-format msgid "The note contents have been left in %s" msgstr "Die Notiz-Inhalte wurden in %s belassen" -#: builtin/notes.c:232 builtin/tag.c:439 +#: builtin/notes.c:233 builtin/tag.c:439 #, c-format msgid "cannot read '%s'" msgstr "kann '%s' nicht lesen" -#: builtin/notes.c:234 builtin/tag.c:442 +#: builtin/notes.c:235 builtin/tag.c:442 #, c-format msgid "could not open or read '%s'" msgstr "konnte '%s' nicht öffnen oder lesen" -#: builtin/notes.c:256 +#: builtin/notes.c:257 #, c-format msgid "Failed to read object '%s'." msgstr "Fehler beim Lesen des Objektes '%s'." -#: builtin/notes.c:260 +#: builtin/notes.c:261 #, c-format msgid "Cannot read note data from non-blob object '%s'." msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen." -#: builtin/notes.c:362 builtin/notes.c:417 builtin/notes.c:493 -#: builtin/notes.c:505 builtin/notes.c:581 builtin/notes.c:649 -#: builtin/notes.c:946 +#: builtin/notes.c:363 builtin/notes.c:418 builtin/notes.c:494 +#: builtin/notes.c:506 builtin/notes.c:582 builtin/notes.c:650 +#: builtin/notes.c:800 builtin/notes.c:947 builtin/notes.c:968 msgid "too many parameters" msgstr "zu viele Parameter" -#: builtin/notes.c:375 builtin/notes.c:662 +#: builtin/notes.c:376 builtin/notes.c:663 #, c-format msgid "No note found for object %s." msgstr "Keine Notiz für Objekt %s gefunden." -#: builtin/notes.c:396 builtin/notes.c:559 +#: builtin/notes.c:397 builtin/notes.c:560 msgid "note contents as a string" msgstr "Notizinhalte als Zeichenkette" -#: builtin/notes.c:399 builtin/notes.c:562 +#: builtin/notes.c:400 builtin/notes.c:563 msgid "note contents in a file" msgstr "Notizinhalte in einer Datei" -#: builtin/notes.c:402 builtin/notes.c:565 +#: builtin/notes.c:403 builtin/notes.c:566 msgid "reuse and edit specified note object" msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes" -#: builtin/notes.c:405 builtin/notes.c:568 +#: builtin/notes.c:406 builtin/notes.c:569 msgid "reuse specified note object" msgstr "Wiederverwendung des angegebenen Notiz-Objektes" -#: builtin/notes.c:408 builtin/notes.c:571 +#: builtin/notes.c:409 builtin/notes.c:572 msgid "allow storing empty note" msgstr "Speichern leerer Notiz erlauben" -#: builtin/notes.c:409 builtin/notes.c:480 +#: builtin/notes.c:410 builtin/notes.c:481 msgid "replace existing notes" msgstr "existierende Notizen ersetzen" -#: builtin/notes.c:434 +#: builtin/notes.c:435 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -9083,31 +9472,31 @@ msgstr "" "Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s " "gefunden. Verwenden Sie '-f', um die existierenden Notizen zu überschreiben." -#: builtin/notes.c:449 builtin/notes.c:528 +#: builtin/notes.c:450 builtin/notes.c:529 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Ãœberschreibe existierende Notizen für Objekt %s\n" -#: builtin/notes.c:460 builtin/notes.c:621 builtin/notes.c:886 +#: builtin/notes.c:461 builtin/notes.c:622 builtin/notes.c:887 #, c-format msgid "Removing note for object %s\n" msgstr "Entferne Notiz für Objekt %s\n" -#: builtin/notes.c:481 +#: builtin/notes.c:482 msgid "read objects from stdin" msgstr "Objekte von der Standard-Eingabe lesen" -#: builtin/notes.c:483 +#: builtin/notes.c:484 msgid "load rewriting config for <command> (implies --stdin)" msgstr "" "Konfiguration für <Befehl> zum Umschreiben von Commits laden (impliziert --" "stdin)" -#: builtin/notes.c:501 +#: builtin/notes.c:502 msgid "too few parameters" msgstr "zu wenig Parameter" -#: builtin/notes.c:522 +#: builtin/notes.c:523 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -9116,12 +9505,12 @@ msgstr "" "Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. " "Verwenden Sie '-f', um die existierenden Notizen zu überschreiben." -#: builtin/notes.c:534 +#: builtin/notes.c:535 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich." -#: builtin/notes.c:586 +#: builtin/notes.c:587 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" @@ -9130,15 +9519,20 @@ msgstr "" "Die Optionen -m/-F/-c/-C sind für den Unterbefehl 'edit' veraltet.\n" "Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n" -#: builtin/notes.c:768 +#: builtin/notes.c:753 +#, c-format +msgid "unknown notes merge strategy %s" +msgstr "unbekannte Merge-Strategie '%s' für Notizen" + +#: builtin/notes.c:769 msgid "General options" msgstr "Allgemeine Optionen" -#: builtin/notes.c:770 +#: builtin/notes.c:771 msgid "Merge options" msgstr "Merge-Optionen" -#: builtin/notes.c:772 +#: builtin/notes.c:773 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" @@ -9146,51 +9540,88 @@ msgstr "" "löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/" "theirs/union/cat_sort_uniq)" -#: builtin/notes.c:774 +#: builtin/notes.c:775 msgid "Committing unmerged notes" msgstr "nicht zusammengeführte Notizen eintragen" -#: builtin/notes.c:776 +#: builtin/notes.c:777 msgid "finalize notes merge by committing unmerged notes" msgstr "" "Merge von Notizen abschließen, in dem nicht zusammengeführte Notizen " "committet werden" -#: builtin/notes.c:778 +#: builtin/notes.c:779 msgid "Aborting notes merge resolution" msgstr "Konfliktauflösung beim Merge von Notizen abbrechen" -#: builtin/notes.c:780 +#: builtin/notes.c:781 msgid "abort notes merge" msgstr "Merge von Notizen abbrechen" -#: builtin/notes.c:857 +#: builtin/notes.c:792 +msgid "cannot mix --commit, --abort or -s/--strategy" +msgstr "Kann --commit, --abort oder -s/--strategy nicht kombinieren." + +#: builtin/notes.c:797 +msgid "Must specify a notes ref to merge" +msgstr "Sie müssen eine Notiz-Referenz zum Mergen angeben." + +#: builtin/notes.c:821 +#, c-format +msgid "Unknown -s/--strategy: %s" +msgstr "Unbekannter Wert für -s/--strategy: %s" + +#: builtin/notes.c:858 #, c-format msgid "A notes merge into %s is already in-progress at %s" msgstr "Ein Merge von Notizen nach %s ist bereits im Gange bei %s" -#: builtin/notes.c:884 +#: builtin/notes.c:861 +#, c-format +msgid "Failed to store link to current notes ref (%s)" +msgstr "Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)" + +#: builtin/notes.c:863 +#, c-format +msgid "" +"Automatic notes merge failed. Fix conflicts in %s and commit the result with " +"'git notes merge --commit', or abort the merge with 'git notes merge --" +"abort'.\n" +msgstr "" +"Automatisches Zusammenführen der Notizen fehlgeschlagen. Beheben Sie die\n" +"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --commit',\n" +"oder brechen Sie den Merge mit 'git notes merge --abort' ab.\n" + +#: builtin/notes.c:885 #, c-format msgid "Object %s has no note\n" msgstr "Objekt %s hat keine Notiz\n" -#: builtin/notes.c:896 +#: builtin/notes.c:897 msgid "attempt to remove non-existent note is not an error" msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler" -#: builtin/notes.c:899 +#: builtin/notes.c:900 msgid "read object names from the standard input" msgstr "Objektnamen von der Standard-Eingabe lesen" -#: builtin/notes.c:980 +#: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127 +msgid "do not remove, show only" +msgstr "nicht löschen, nur anzeigen" + +#: builtin/notes.c:939 +msgid "report pruned notes" +msgstr "gelöschte Notizen melden" + +#: builtin/notes.c:981 msgid "notes-ref" msgstr "Notiz-Referenz" -#: builtin/notes.c:981 +#: builtin/notes.c:982 msgid "use notes from <notes-ref>" msgstr "Notizen von <Notiz-Referenz> verwenden" -#: builtin/notes.c:1016 builtin/remote.c:1628 +#: builtin/notes.c:1017 builtin/remote.c:1623 #, c-format msgid "Unknown subcommand: %s" msgstr "Unbekannter Unterbefehl: %s" @@ -9209,187 +9640,192 @@ msgstr "" "git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < " "<Objektliste>]" -#: builtin/pack-objects.c:175 builtin/pack-objects.c:178 +#: builtin/pack-objects.c:177 builtin/pack-objects.c:180 #, c-format msgid "deflate error (%d)" msgstr "Fehler beim Komprimieren (%d)" -#: builtin/pack-objects.c:763 +#: builtin/pack-objects.c:766 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit" msgstr "" "Deaktiviere Schreiben der Bitmap, Pakete wurden durch pack.packSizeLimit\n" "aufgetrennt." -#: builtin/pack-objects.c:776 +#: builtin/pack-objects.c:779 msgid "Writing objects" msgstr "Schreibe Objekte" -#: builtin/pack-objects.c:1017 +#: builtin/pack-objects.c:1037 msgid "disabling bitmap writing, as some objects are not being packed" msgstr "" -"Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-Datei\n" +"Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-" +"Datei\n" "geschrieben wurden." -#: builtin/pack-objects.c:2177 +#: builtin/pack-objects.c:2197 msgid "Compressing objects" msgstr "Komprimiere Objekte" -#: builtin/pack-objects.c:2563 +#: builtin/pack-objects.c:2611 #, c-format msgid "unsupported index version %s" msgstr "Nicht unterstützte Index-Version %s" -#: builtin/pack-objects.c:2567 +#: builtin/pack-objects.c:2615 #, c-format msgid "bad index version '%s'" msgstr "Ungültige Index-Version '%s'" -#: builtin/pack-objects.c:2597 +#: builtin/pack-objects.c:2645 msgid "do not show progress meter" msgstr "keine Fortschrittsanzeige anzeigen" -#: builtin/pack-objects.c:2599 +#: builtin/pack-objects.c:2647 msgid "show progress meter" msgstr "Fortschrittsanzeige anzeigen" -#: builtin/pack-objects.c:2601 +#: builtin/pack-objects.c:2649 msgid "show progress meter during object writing phase" msgstr "" "Forschrittsanzeige während der Phase des Schreibens der Objekte anzeigen" -#: builtin/pack-objects.c:2604 +#: builtin/pack-objects.c:2652 msgid "similar to --all-progress when progress meter is shown" msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird" -#: builtin/pack-objects.c:2605 +#: builtin/pack-objects.c:2653 msgid "version[,offset]" msgstr "version[,offset]" -#: builtin/pack-objects.c:2606 +#: builtin/pack-objects.c:2654 msgid "write the pack index file in the specified idx format version" msgstr "" "die Index-Datei des Paketes in der angegebenen Indexformat-Version schreiben" -#: builtin/pack-objects.c:2609 +#: builtin/pack-objects.c:2657 msgid "maximum size of each output pack file" msgstr "maximale Größe für jede ausgegebene Paketdatei" -#: builtin/pack-objects.c:2611 +#: builtin/pack-objects.c:2659 msgid "ignore borrowed objects from alternate object store" msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren" -#: builtin/pack-objects.c:2613 +#: builtin/pack-objects.c:2661 msgid "ignore packed objects" msgstr "gepackte Objekte ignorieren" -#: builtin/pack-objects.c:2615 +#: builtin/pack-objects.c:2663 msgid "limit pack window by objects" msgstr "Paketfenster durch Objekte begrenzen" -#: builtin/pack-objects.c:2617 +#: builtin/pack-objects.c:2665 msgid "limit pack window by memory in addition to object limit" msgstr "" "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen" -#: builtin/pack-objects.c:2619 +#: builtin/pack-objects.c:2667 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:2621 +#: builtin/pack-objects.c:2669 msgid "reuse existing deltas" msgstr "existierende Unterschiede wiederverwenden" -#: builtin/pack-objects.c:2623 +#: builtin/pack-objects.c:2671 msgid "reuse existing objects" msgstr "existierende Objekte wiederverwenden" -#: builtin/pack-objects.c:2625 +#: builtin/pack-objects.c:2673 msgid "use OFS_DELTA objects" msgstr "OFS_DELTA Objekte verwenden" -#: builtin/pack-objects.c:2627 +#: builtin/pack-objects.c:2675 msgid "use threads when searching for best delta matches" msgstr "" "Threads bei der Suche nach den besten Ãœbereinstimmungen bei Unterschieden " "verwenden" -#: builtin/pack-objects.c:2629 +#: builtin/pack-objects.c:2677 msgid "do not create an empty pack output" msgstr "keine leeren Pakete erzeugen" -#: builtin/pack-objects.c:2631 +#: builtin/pack-objects.c:2679 msgid "read revision arguments from standard input" msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen" -#: builtin/pack-objects.c:2633 +#: builtin/pack-objects.c:2681 msgid "limit the objects to those that are not yet packed" msgstr "die Objekte zu solchen, die noch nicht gepackt wurden, begrenzen" -#: builtin/pack-objects.c:2636 +#: builtin/pack-objects.c:2684 msgid "include objects reachable from any reference" msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind" -#: builtin/pack-objects.c:2639 +#: builtin/pack-objects.c:2687 msgid "include objects referred by reflog entries" msgstr "" "Objekte einschließen, die von Einträgen des Reflogs referenziert werden" -#: builtin/pack-objects.c:2642 +#: builtin/pack-objects.c:2690 msgid "include objects referred to by the index" msgstr "Objekte einschließen, die vom Index referenziert werden" -#: builtin/pack-objects.c:2645 +#: builtin/pack-objects.c:2693 msgid "output pack to stdout" msgstr "Paket in die Standard-Ausgabe schreiben" -#: builtin/pack-objects.c:2647 +#: builtin/pack-objects.c:2695 msgid "include tag objects that refer to objects to be packed" msgstr "Tag-Objekte einschließen, die auf gepackte Objekte referenzieren" -#: builtin/pack-objects.c:2649 +#: builtin/pack-objects.c:2697 msgid "keep unreachable objects" msgstr "nicht erreichbare Objekte behalten" -#: builtin/pack-objects.c:2650 parse-options.h:142 +#: builtin/pack-objects.c:2699 +msgid "pack loose unreachable objects" +msgstr "nicht erreichbare lose Objekte packen" + +#: builtin/pack-objects.c:2700 parse-options.h:142 msgid "time" msgstr "Zeit" -#: builtin/pack-objects.c:2651 +#: builtin/pack-objects.c:2701 msgid "unpack unreachable objects newer than <time>" msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind" -#: builtin/pack-objects.c:2654 +#: builtin/pack-objects.c:2704 msgid "create thin packs" msgstr "dünnere Pakete erzeugen" -#: builtin/pack-objects.c:2656 +#: builtin/pack-objects.c:2706 msgid "create packs suitable for shallow fetches" msgstr "" "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen" -#: builtin/pack-objects.c:2658 +#: builtin/pack-objects.c:2708 msgid "ignore packs that have companion .keep file" msgstr "Pakete ignorieren, die .keep Dateien haben" -#: builtin/pack-objects.c:2660 +#: builtin/pack-objects.c:2710 msgid "pack compression level" msgstr "Komprimierungsgrad für Paketierung" -#: builtin/pack-objects.c:2662 +#: builtin/pack-objects.c:2712 msgid "do not hide commits by grafts" msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen" -#: builtin/pack-objects.c:2664 +#: builtin/pack-objects.c:2714 msgid "use a bitmap index if available to speed up counting objects" msgstr "" "Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung benutzen" -#: builtin/pack-objects.c:2666 +#: builtin/pack-objects.c:2716 msgid "write a bitmap index together with the pack index" msgstr "Bitmap-Index zusammen mit Pack-Index schreiben" -#: builtin/pack-objects.c:2757 +#: builtin/pack-objects.c:2829 msgid "Counting objects" msgstr "Zähle Objekte" @@ -9417,15 +9853,11 @@ msgstr "Lösche doppelte Objekte" msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]" -#: builtin/prune.c:105 builtin/worktree.c:125 -msgid "do not remove, show only" -msgstr "nicht löschen, nur anzeigen" - -#: builtin/prune.c:106 builtin/worktree.c:126 +#: builtin/prune.c:106 builtin/worktree.c:128 msgid "report pruned objects" msgstr "gelöschte Objekte melden" -#: builtin/prune.c:109 builtin/worktree.c:128 +#: builtin/prune.c:109 builtin/worktree.c:130 msgid "expire objects older than <time>" msgstr "Objekte älter als <Zeit> verfallen lassen" @@ -9445,14 +9877,10 @@ msgstr "Optionen bezogen auf Merge" msgid "incorporate changes by rebasing rather than merging" msgstr "Integration von Änderungen durch Rebase statt Merge" -#: builtin/pull.c:147 builtin/revert.c:105 +#: builtin/pull.c:147 builtin/revert.c:101 msgid "allow fast-forward" msgstr "Vorspulen erlauben" -#: builtin/pull.c:153 -msgid "verify that the named commit has a valid GPG signature" -msgstr "den genannten Commit auf eine gültige GPG-Signatur überprüfen" - #: builtin/pull.c:156 msgid "automatically stash/stash pop before and after rebase" msgstr "automatischer Stash/Stash-Pop vor und nach eines Rebase" @@ -9470,17 +9898,17 @@ msgstr "Anzahl der parallel mit 'pull' zu verarbeitenden Submodule" msgid "Invalid value for pull.ff: %s" msgstr "Ungültiger Wert für pull.ff: %s" -#: builtin/pull.c:379 +#: builtin/pull.c:379 git-sh-setup.sh:226 msgid "Cannot pull with rebase: You have unstaged changes." msgstr "" "Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die " "nicht zum Commit vorgemerkt sind." -#: builtin/pull.c:385 +#: builtin/pull.c:385 git-sh-setup.sh:252 msgid "Additionally, your index contains uncommitted changes." msgstr "Zusätzlich beinhaltet die Staging-Area nicht committete Änderungen." -#: builtin/pull.c:387 +#: builtin/pull.c:387 git-sh-setup.sh:245 msgid "Cannot pull with rebase: Your index contains uncommitted changes." msgstr "" "Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet " @@ -9544,7 +9972,7 @@ msgstr "Siehe git-pull(1) für weitere Details." msgid "<remote>" msgstr "<Remote-Repository>" -#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 +#: builtin/pull.c:481 builtin/pull.c:496 builtin/pull.c:501 git-rebase.sh:451 #: git-parse-remote.sh:65 msgid "<branch>" msgstr "<Branch>" @@ -9557,7 +9985,8 @@ msgstr "Es gibt keine Tracking-Informationen für den aktuellen Branch." msgid "" "If you wish to set tracking information for this branch you can do so with:" msgstr "" -"Wenn Sie Tracking-Informationen für diesen Branch setzen möchten, können Sie\n" +"Wenn Sie Tracking-Informationen für diesen Branch setzen möchten, können " +"Sie\n" "dies tun mit:" #: builtin/pull.c:503 @@ -9570,17 +9999,21 @@ msgstr "" "des Remote-Repositories durchzuführen, aber diese Referenz\n" "wurde nicht angefordert." -#: builtin/pull.c:864 +#: builtin/pull.c:820 +msgid "ignoring --verify-signatures for rebase" +msgstr "Ignoriere --verify-signatures für Rebase" + +#: builtin/pull.c:867 msgid "--[no-]autostash option is only valid with --rebase." msgstr "--[no-]autostash ist nur mit --rebase zulässig." -#: builtin/pull.c:872 +#: builtin/pull.c:875 msgid "Updating an unborn branch with changes added to the index." msgstr "" "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit " "vorgemerkt sind." -#: builtin/pull.c:900 +#: builtin/pull.c:903 #, c-format msgid "" "fetch updated the current branch head.\n" @@ -9590,7 +10023,7 @@ msgstr "" "\"fetch\" aktualisierte die Spitze des aktuellen Branches.\n" "Spule Ihr Arbeitsverzeichnis von Commit %s vor." -#: builtin/pull.c:905 +#: builtin/pull.c:908 #, c-format msgid "" "Cannot fast-forward your working tree.\n" @@ -9607,11 +10040,11 @@ msgstr "" "$ git reset --hard\n" "zur Wiederherstellung aus." -#: builtin/pull.c:920 +#: builtin/pull.c:923 msgid "Cannot merge multiple branches into empty head." msgstr "Kann nicht mehrere Branches in einen leeren Branch zusammenführen." -#: builtin/pull.c:924 +#: builtin/pull.c:927 msgid "Cannot rebase onto multiple branches." msgstr "Kann Rebase nicht auf mehrere Branches ausführen." @@ -9788,12 +10221,12 @@ msgstr "Versende nach %s\n" msgid "failed to push some refs to '%s'" msgstr "Fehler beim Versenden einiger Referenzen nach '%s'" -#: builtin/push.c:365 +#: builtin/push.c:366 #, c-format msgid "bad repository '%s'" msgstr "ungültiges Repository '%s'" -#: builtin/push.c:366 +#: builtin/push.c:367 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -9815,103 +10248,115 @@ msgstr "" "\n" " git push <Name>\n" -#: builtin/push.c:381 +#: builtin/push.c:385 msgid "--all and --tags are incompatible" msgstr "Die Optionen --all und --tags sind inkompatibel." -#: builtin/push.c:382 +#: builtin/push.c:386 msgid "--all can't be combined with refspecs" msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden." -#: builtin/push.c:387 +#: builtin/push.c:391 msgid "--mirror and --tags are incompatible" msgstr "Die Optionen --mirror und --tags sind inkompatibel." -#: builtin/push.c:388 +#: builtin/push.c:392 msgid "--mirror can't be combined with refspecs" msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden." -#: builtin/push.c:393 +#: builtin/push.c:397 msgid "--all and --mirror are incompatible" msgstr "Die Optionen --all und --mirror sind inkompatibel." -#: builtin/push.c:505 +#: builtin/push.c:515 msgid "repository" msgstr "Repository" -#: builtin/push.c:506 builtin/send-pack.c:161 +#: builtin/push.c:516 builtin/send-pack.c:161 msgid "push all refs" msgstr "alle Referenzen versenden" -#: builtin/push.c:507 builtin/send-pack.c:163 +#: builtin/push.c:517 builtin/send-pack.c:163 msgid "mirror all refs" msgstr "alle Referenzen spiegeln" -#: builtin/push.c:509 +#: builtin/push.c:519 msgid "delete refs" msgstr "Referenzen löschen" -#: builtin/push.c:510 +#: builtin/push.c:520 msgid "push tags (can't be used with --all or --mirror)" msgstr "Tags versenden (kann nicht mit --all oder --mirror verwendet werden)" -#: builtin/push.c:513 builtin/send-pack.c:164 +#: builtin/push.c:523 builtin/send-pack.c:164 msgid "force updates" msgstr "Aktualisierung erzwingen" -#: builtin/push.c:515 builtin/send-pack.c:175 +#: builtin/push.c:525 builtin/send-pack.c:175 msgid "refname>:<expect" msgstr "Referenzname>:<Erwartungswert" -#: builtin/push.c:516 builtin/send-pack.c:176 +#: builtin/push.c:526 builtin/send-pack.c:176 msgid "require old value of ref to be at this value" msgstr "Referenz muss sich auf dem angegebenen Wert befinden" -#: builtin/push.c:519 +#: builtin/push.c:529 msgid "control recursive pushing of submodules" msgstr "rekursiven \"push\" von Submodulen steuern" -#: builtin/push.c:521 builtin/send-pack.c:169 +#: builtin/push.c:531 builtin/send-pack.c:169 msgid "use thin pack" msgstr "kleinere Pakete verwenden" -#: builtin/push.c:522 builtin/push.c:523 builtin/send-pack.c:158 +#: builtin/push.c:532 builtin/push.c:533 builtin/send-pack.c:158 #: builtin/send-pack.c:159 msgid "receive pack program" msgstr "'receive pack' Programm" -#: builtin/push.c:524 +#: builtin/push.c:534 msgid "set upstream for git pull/status" msgstr "Upstream für \"git pull/status\" setzen" -#: builtin/push.c:527 +#: builtin/push.c:537 msgid "prune locally removed refs" msgstr "lokal gelöschte Referenzen entfernen" -#: builtin/push.c:529 +#: builtin/push.c:539 msgid "bypass pre-push hook" msgstr "\"pre-push hook\" umgehen" -#: builtin/push.c:530 +#: builtin/push.c:540 msgid "push missing but relevant tags" msgstr "fehlende, aber relevante Tags versenden" -#: builtin/push.c:533 builtin/send-pack.c:166 +#: builtin/push.c:543 builtin/send-pack.c:166 msgid "GPG sign the push" msgstr "signiert \"push\" mit GPG" -#: builtin/push.c:535 builtin/send-pack.c:170 +#: builtin/push.c:545 builtin/send-pack.c:170 msgid "request atomic transaction on remote side" msgstr "Referenzen atomar versenden" -#: builtin/push.c:549 +#: builtin/push.c:546 +msgid "server-specific" +msgstr "serverspezifisch" + +#: builtin/push.c:546 +msgid "option to transmit" +msgstr "Option übertragen" + +#: builtin/push.c:560 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags." -#: builtin/push.c:551 +#: builtin/push.c:562 msgid "--delete doesn't make sense without any refs" msgstr "Die Option --delete kann nur mit Referenzen verwendet werden." +#: builtin/push.c:579 +msgid "push options must not have new line characters" +msgstr "Push-Optionen dürfen keine Zeilenvorschubzeichen haben" + #: builtin/read-tree.c:37 msgid "" "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " @@ -9991,11 +10436,11 @@ msgstr "Entpacken der Bäume protokollieren" msgid "git receive-pack <git-dir>" msgstr "git receive-pack <Git-Verzeichnis>" -#: builtin/receive-pack.c:1719 +#: builtin/receive-pack.c:1843 msgid "quiet" msgstr "weniger Ausgaben" -#: builtin/receive-pack.c:1733 +#: builtin/receive-pack.c:1857 msgid "You must specify a directory." msgstr "Sie müssen ein Repository angeben." @@ -10151,12 +10596,12 @@ msgstr "" "Die Angabe von zu folgenden Branches kann nur mit dem Anfordern von " "Spiegelarchiven verwendet werden." -#: builtin/remote.c:190 builtin/remote.c:633 +#: builtin/remote.c:190 builtin/remote.c:629 #, c-format msgid "remote %s already exists." msgstr "externes Repository %s existiert bereits" -#: builtin/remote.c:194 builtin/remote.c:637 +#: builtin/remote.c:194 builtin/remote.c:633 #, c-format msgid "'%s' is not a valid remote name" msgstr "'%s' ist kein gültiger Name für ein Remote-Repository" @@ -10179,17 +10624,17 @@ msgstr "(übereinstimmend)" msgid "(delete)" msgstr "(lösche)" -#: builtin/remote.c:626 builtin/remote.c:761 builtin/remote.c:858 +#: builtin/remote.c:622 builtin/remote.c:757 builtin/remote.c:854 #, c-format msgid "No such remote: %s" msgstr "Kein solches Remote-Repository: %s" -#: builtin/remote.c:643 +#: builtin/remote.c:639 #, c-format msgid "Could not rename config section '%s' to '%s'" msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen" -#: builtin/remote.c:663 +#: builtin/remote.c:659 #, c-format msgid "" "Not updating non-default fetch refspec\n" @@ -10200,17 +10645,17 @@ msgstr "" "\t%s\n" "\tBitte aktualisieren Sie, falls notwendig, die Konfiguration manuell." -#: builtin/remote.c:699 +#: builtin/remote.c:695 #, c-format msgid "deleting '%s' failed" msgstr "Konnte '%s' nicht löschen" -#: builtin/remote.c:733 +#: builtin/remote.c:729 #, c-format msgid "creating '%s' failed" msgstr "Konnte '%s' nicht erstellen" -#: builtin/remote.c:796 +#: builtin/remote.c:792 msgid "" "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" "to delete it, use:" @@ -10226,127 +10671,137 @@ msgstr[1] "" "entfernt;\n" "um diese zu entfernen, benutzen Sie:" -#: builtin/remote.c:810 +#: builtin/remote.c:806 #, c-format msgid "Could not remove config section '%s'" msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen" -#: builtin/remote.c:911 +#: builtin/remote.c:907 #, 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:914 +#: builtin/remote.c:910 msgid " tracked" msgstr " gefolgt" -#: builtin/remote.c:916 +#: builtin/remote.c:912 msgid " stale (use 'git remote prune' to remove)" msgstr " veraltet (benutzen Sie 'git remote prune' zum Löschen)" -#: builtin/remote.c:918 +#: builtin/remote.c:914 msgid " ???" msgstr " ???" -#: builtin/remote.c:959 +#: builtin/remote.c:955 #, 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:967 +#: builtin/remote.c:963 #, c-format msgid "rebases interactively onto remote %s" msgstr "interaktiver Rebase auf Remote-Branch %s" -#: builtin/remote.c:971 +#: builtin/remote.c:964 +#, c-format +msgid "rebases onto remote %s" +msgstr "Rebase auf Remote-Branch %s" + +#: builtin/remote.c:967 #, c-format msgid " merges with remote %s" msgstr " führt mit Remote-Branch %s zusammen" -#: builtin/remote.c:972 -msgid " and with remote" -msgstr " und mit Remote-Branch" - -#: builtin/remote.c:974 +#: builtin/remote.c:970 #, c-format msgid "merges with remote %s" msgstr "führt mit Remote-Branch %s zusammen" -#: builtin/remote.c:975 -msgid " and with remote" -msgstr " und mit Remote-Branch" +#: builtin/remote.c:973 +#, c-format +msgid "%-*s and with remote %s\n" +msgstr "%-*s und mit Remote-Branch %s\n" -#: builtin/remote.c:1021 +#: builtin/remote.c:1016 msgid "create" msgstr "erstellt" -#: builtin/remote.c:1024 +#: builtin/remote.c:1019 msgid "delete" msgstr "gelöscht" -#: builtin/remote.c:1028 +#: builtin/remote.c:1023 msgid "up to date" msgstr "aktuell" -#: builtin/remote.c:1031 +#: builtin/remote.c:1026 msgid "fast-forwardable" msgstr "vorspulbar" -#: builtin/remote.c:1034 +#: builtin/remote.c:1029 msgid "local out of date" msgstr "lokal nicht aktuell" -#: builtin/remote.c:1041 +#: builtin/remote.c:1036 #, c-format msgid " %-*s forces to %-*s (%s)" msgstr " %-*s erzwingt Versandt nach %-*s (%s)" -#: builtin/remote.c:1044 +#: builtin/remote.c:1039 #, c-format msgid " %-*s pushes to %-*s (%s)" msgstr " %-*s versendet nach %-*s (%s)" -#: builtin/remote.c:1048 +#: builtin/remote.c:1043 #, c-format msgid " %-*s forces to %s" msgstr " %-*s erzwingt Versand nach %s" -#: builtin/remote.c:1051 +#: builtin/remote.c:1046 #, c-format msgid " %-*s pushes to %s" msgstr " %-*s versendet nach %s" -#: builtin/remote.c:1119 +#: builtin/remote.c:1114 msgid "do not query remotes" msgstr "keine Abfrage von Remote-Repositories" -#: builtin/remote.c:1146 +#: builtin/remote.c:1141 #, c-format msgid "* remote %s" msgstr "* Remote-Repository %s" -#: builtin/remote.c:1147 +#: builtin/remote.c:1142 #, c-format msgid " Fetch URL: %s" msgstr " URL zum Abholen: %s" -#: builtin/remote.c:1148 builtin/remote.c:1301 +#: builtin/remote.c:1143 builtin/remote.c:1156 builtin/remote.c:1296 msgid "(no URL)" msgstr "(keine URL)" #. TRANSLATORS: the colon ':' should align with #. the one in " Fetch URL: %s" translation -#: builtin/remote.c:1159 builtin/remote.c:1161 +#: builtin/remote.c:1154 builtin/remote.c:1156 #, c-format msgid " Push URL: %s" msgstr " URL zum Versenden: %s" -#: builtin/remote.c:1163 builtin/remote.c:1165 builtin/remote.c:1167 +#: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162 #, c-format msgid " HEAD branch: %s" msgstr " Hauptbranch: %s" -#: builtin/remote.c:1169 +#: builtin/remote.c:1158 +msgid "(not queried)" +msgstr "(nicht abgefragt)" + +#: builtin/remote.c:1160 +msgid "(unknown)" +msgstr "(unbekannt)" + +#: builtin/remote.c:1164 #, c-format msgid "" " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" @@ -10354,159 +10809,159 @@ msgstr "" " Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden " "sein):\n" -#: builtin/remote.c:1181 +#: builtin/remote.c:1176 #, c-format msgid " Remote branch:%s" msgid_plural " Remote branches:%s" msgstr[0] " Remote-Branch:%s" msgstr[1] " Remote-Branches:%s" -#: builtin/remote.c:1184 builtin/remote.c:1211 +#: builtin/remote.c:1179 builtin/remote.c:1206 msgid " (status not queried)" msgstr " (Zustand nicht abgefragt)" -#: builtin/remote.c:1193 +#: builtin/remote.c:1188 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:1201 +#: builtin/remote.c:1196 msgid " Local refs will be mirrored by 'git push'" msgstr " Lokale Referenzen werden von 'git push' gespiegelt" -#: builtin/remote.c:1208 +#: builtin/remote.c:1203 #, 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:1229 +#: builtin/remote.c:1224 msgid "set refs/remotes/<name>/HEAD according to remote" msgstr "setzt refs/remotes/<Name>/HEAD gemäß dem Remote-Repository" -#: builtin/remote.c:1231 +#: builtin/remote.c:1226 msgid "delete refs/remotes/<name>/HEAD" msgstr "entfernt refs/remotes/<Name>/HEAD" -#: builtin/remote.c:1246 +#: builtin/remote.c:1241 msgid "Cannot determine remote HEAD" msgstr "Kann HEAD des Remote-Repositories nicht bestimmen" -#: builtin/remote.c:1248 +#: builtin/remote.c:1243 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:1258 +#: builtin/remote.c:1253 #, c-format msgid "Could not delete %s" msgstr "Konnte %s nicht entfernen" -#: builtin/remote.c:1266 +#: builtin/remote.c:1261 #, c-format msgid "Not a valid ref: %s" msgstr "keine gültige Referenz: %s" -#: builtin/remote.c:1268 +#: builtin/remote.c:1263 #, c-format msgid "Could not setup %s" msgstr "Konnte %s nicht einrichten" -#: builtin/remote.c:1286 +#: builtin/remote.c:1281 #, c-format msgid " %s will become dangling!" msgstr " %s wird unreferenziert!" -#: builtin/remote.c:1287 +#: builtin/remote.c:1282 #, c-format msgid " %s has become dangling!" msgstr " %s wurde unreferenziert!" -#: builtin/remote.c:1297 +#: builtin/remote.c:1292 #, c-format msgid "Pruning %s" msgstr "entferne veraltete Branches von %s" -#: builtin/remote.c:1298 +#: builtin/remote.c:1293 #, c-format msgid "URL: %s" msgstr "URL: %s" -#: builtin/remote.c:1314 +#: builtin/remote.c:1309 #, c-format msgid " * [would prune] %s" msgstr " * [würde veralteten Branch entfernen] %s" -#: builtin/remote.c:1317 +#: builtin/remote.c:1312 #, c-format msgid " * [pruned] %s" msgstr "* [veralteten Branch entfernt] %s" -#: builtin/remote.c:1362 +#: builtin/remote.c:1357 msgid "prune remotes after fetching" msgstr "entferne veraltete Branches im Remote-Repository nach \"fetch\"" -#: builtin/remote.c:1425 builtin/remote.c:1479 builtin/remote.c:1547 +#: builtin/remote.c:1420 builtin/remote.c:1474 builtin/remote.c:1542 #, c-format msgid "No such remote '%s'" msgstr "Kein solches Remote-Repository '%s'" -#: builtin/remote.c:1441 +#: builtin/remote.c:1436 msgid "add branch" msgstr "Branch hinzufügen" -#: builtin/remote.c:1448 +#: builtin/remote.c:1443 msgid "no remote specified" msgstr "kein Remote-Repository angegeben" -#: builtin/remote.c:1465 +#: builtin/remote.c:1460 msgid "query push URLs rather than fetch URLs" msgstr "nur URLs für Push ausgeben" -#: builtin/remote.c:1467 +#: builtin/remote.c:1462 msgid "return all URLs" msgstr "alle URLs ausgeben" -#: builtin/remote.c:1495 +#: builtin/remote.c:1490 #, c-format msgid "no URLs configured for remote '%s'" msgstr "Keine URLs für Remote-Repository '%s' konfiguriert." -#: builtin/remote.c:1521 +#: builtin/remote.c:1516 msgid "manipulate push URLs" msgstr "URLs für \"push\" manipulieren" -#: builtin/remote.c:1523 +#: builtin/remote.c:1518 msgid "add URL" msgstr "URL hinzufügen" -#: builtin/remote.c:1525 +#: builtin/remote.c:1520 msgid "delete URLs" msgstr "URLs löschen" -#: builtin/remote.c:1532 +#: builtin/remote.c:1527 msgid "--add --delete doesn't make sense" msgstr "" "Die Optionen --add und --delete können nicht gemeinsam verwendet werden." -#: builtin/remote.c:1573 +#: builtin/remote.c:1568 #, c-format msgid "Invalid old URL pattern: %s" msgstr "ungültiges altes URL Format: %s" -#: builtin/remote.c:1581 +#: builtin/remote.c:1576 #, c-format msgid "No such URL found: %s" msgstr "Keine solche URL gefunden: %s" -#: builtin/remote.c:1583 +#: builtin/remote.c:1578 msgid "Will not delete all non-push URLs" msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind" -#: builtin/remote.c:1597 +#: builtin/remote.c:1592 msgid "be verbose; must be placed before a subcommand" msgstr "erweiterte Ausgaben; muss vor einem Unterbefehl angegeben werden" @@ -10514,81 +10969,89 @@ msgstr "erweiterte Ausgaben; muss vor einem Unterbefehl angegeben werden" msgid "git repack [<options>]" msgstr "git repack [<Optionen>]" -#: builtin/repack.c:159 +#: builtin/repack.c:160 msgid "pack everything in a single pack" msgstr "alles in eine einzige Pack-Datei packen" -#: builtin/repack.c:161 +#: builtin/repack.c:162 msgid "same as -a, and turn unreachable objects loose" msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht" -#: builtin/repack.c:164 +#: builtin/repack.c:165 msgid "remove redundant packs, and run git-prune-packed" msgstr "redundante Pakete entfernen und \"git-prune-packed\" ausführen" -#: builtin/repack.c:166 +#: builtin/repack.c:167 msgid "pass --no-reuse-delta to git-pack-objects" msgstr "--no-reuse-delta an git-pack-objects übergeben" -#: builtin/repack.c:168 +#: builtin/repack.c:169 msgid "pass --no-reuse-object to git-pack-objects" msgstr "--no-reuse-object an git-pack-objects übergeben" -#: builtin/repack.c:170 +#: builtin/repack.c:171 msgid "do not run git-update-server-info" msgstr "git-update-server-info nicht ausführen" -#: builtin/repack.c:173 +#: builtin/repack.c:174 msgid "pass --local to git-pack-objects" msgstr "--local an git-pack-objects übergeben" -#: builtin/repack.c:175 +#: builtin/repack.c:176 msgid "write bitmap index" msgstr "Bitmap-Index schreiben" -#: builtin/repack.c:176 +#: builtin/repack.c:177 msgid "approxidate" msgstr "Datumsangabe" -#: builtin/repack.c:177 +#: builtin/repack.c:178 msgid "with -A, do not loosen objects older than this" msgstr "mit -A, keine Objekte älter als dieses Datum löschen" -#: builtin/repack.c:179 +#: builtin/repack.c:180 +msgid "with -a, repack unreachable objects" +msgstr "mit -a, nicht erreichbare Objekte neu packen" + +#: builtin/repack.c:182 msgid "size of the window used for delta compression" msgstr "Größe des Fensters für die Delta-Kompression" -#: builtin/repack.c:180 builtin/repack.c:184 +#: builtin/repack.c:183 builtin/repack.c:187 msgid "bytes" msgstr "Bytes" -#: builtin/repack.c:181 +#: builtin/repack.c:184 msgid "same as the above, but limit memory size instead of entries count" msgstr "" "gleiches wie oben, aber die Speichergröße anstatt der\n" "Anzahl der Einträge limitieren" -#: builtin/repack.c:183 +#: builtin/repack.c:186 msgid "limits the maximum delta depth" msgstr "die maximale Delta-Tiefe limitieren" -#: builtin/repack.c:185 +#: builtin/repack.c:188 msgid "maximum size of each packfile" msgstr "maximale Größe für jede Paketdatei" -#: builtin/repack.c:187 +#: builtin/repack.c:190 msgid "repack objects in packs marked with .keep" msgstr "" "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden" -#: builtin/repack.c:197 +#: builtin/repack.c:200 msgid "cannot delete packs in a precious-objects repo" msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen" -#: builtin/repack.c:381 +#: builtin/repack.c:204 +msgid "--keep-unreachable and -A are incompatible" +msgstr "--keep-unreachable und -A sind inkompatibel" + +#: builtin/repack.c:391 builtin/worktree.c:115 #, c-format -msgid "removing '%s' failed" -msgstr "Löschen von '%s' fehlgeschlagen" +msgid "failed to remove '%s'" +msgstr "Fehler beim Löschen von '%s'" #: builtin/replace.c:19 msgid "git replace [-f] <object> <replacement>" @@ -10812,7 +11275,7 @@ msgstr "Konnte Index-Datei nicht zu Commit '%s' setzen." msgid "Could not write new index file." msgstr "Konnte neue Index-Datei nicht schreiben." -#: builtin/rev-list.c:350 +#: builtin/rev-list.c:362 msgid "rev-list does not support display of notes" msgstr "rev-list unterstützt keine Anzeige von Notizen" @@ -10905,31 +11368,27 @@ msgstr "Option" msgid "option for merge strategy" msgstr "Option für Merge-Strategie" -#: builtin/revert.c:104 +#: builtin/revert.c:100 msgid "append commit name" msgstr "Commit-Namen anhängen" -#: builtin/revert.c:106 +#: builtin/revert.c:102 msgid "preserve initially empty commits" msgstr "ursprüngliche, leere Commits erhalten" -#: builtin/revert.c:107 +#: builtin/revert.c:103 msgid "allow commits with empty messages" msgstr "Commits mit leerer Beschreibung erlauben" -#: builtin/revert.c:108 +#: builtin/revert.c:104 msgid "keep redundant, empty commits" msgstr "redundante, leere Commits behalten" -#: builtin/revert.c:112 -msgid "program error" -msgstr "Programmfehler" - -#: builtin/revert.c:197 +#: builtin/revert.c:192 msgid "revert failed" msgstr "\"revert\" fehlgeschlagen" -#: builtin/revert.c:212 +#: builtin/revert.c:207 msgid "cherry-pick failed" msgstr "\"cherry-pick\" fehlgeschlagen" @@ -11234,12 +11693,12 @@ msgstr "" msgid "prepend comment character and space to each line" msgstr "Kommentarzeichen mit Leerzeichen an jede Zeile voranstellen" -#: builtin/submodule--helper.c:24 +#: builtin/submodule--helper.c:24 builtin/submodule--helper.c:923 #, c-format msgid "No such ref: %s" msgstr "Referenz nicht gefunden: %s" -#: builtin/submodule--helper.c:31 +#: builtin/submodule--helper.c:31 builtin/submodule--helper.c:932 #, c-format msgid "Expecting a full ref name, got %s" msgstr "Vollständiger Referenzname erwartet, %s erhalten" @@ -11249,8 +11708,8 @@ msgstr "Vollständiger Referenzname erwartet, %s erhalten" msgid "cannot strip one component off url '%s'" msgstr "Kann eine Komponente von URL '%s' nicht extrahieren" -#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:405 -#: builtin/submodule--helper.c:486 +#: builtin/submodule--helper.c:278 builtin/submodule--helper.c:403 +#: builtin/submodule--helper.c:483 msgid "alternative anchor for relative paths" msgstr "Alternativer Anker für relative Pfade" @@ -11258,155 +11717,186 @@ msgstr "Alternativer Anker für relative Pfade" msgid "git submodule--helper list [--prefix=<path>] [<path>...]" msgstr "git submodule--helper list [--prefix=<Pfad>] [<Pfad>...]" -#: builtin/submodule--helper.c:326 builtin/submodule--helper.c:340 +#: builtin/submodule--helper.c:324 builtin/submodule--helper.c:338 #, c-format msgid "No url found for submodule path '%s' in .gitmodules" msgstr "Keine URL für Submodul-Pfad '%s' in .gitmodules gefunden" -#: builtin/submodule--helper.c:366 +#: builtin/submodule--helper.c:364 #, c-format msgid "Failed to register url for submodule path '%s'" -msgstr "Fehler beim Eintragen der URL für Submodul-Pfad '%s' in die Konfiguration." +msgstr "" +"Fehler beim Eintragen der URL für Submodul-Pfad '%s' in die Konfiguration." -#: builtin/submodule--helper.c:370 +#: builtin/submodule--helper.c:368 #, c-format msgid "Submodule '%s' (%s) registered for path '%s'\n" msgstr "Submodul '%s' (%s) für Pfad '%s' in die Konfiguration eingetragen.\n" -#: builtin/submodule--helper.c:380 +#: builtin/submodule--helper.c:378 #, c-format msgid "warning: command update mode suggested for submodule '%s'\n" msgstr "Warnung: 'update'-Modus für Submodul '%s' vorgeschlagen\n" -#: builtin/submodule--helper.c:387 +#: builtin/submodule--helper.c:385 #, c-format msgid "Failed to register update mode for submodule path '%s'" msgstr "" "Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad '%s' in der\n" "Konfiguration." -#: builtin/submodule--helper.c:406 +#: builtin/submodule--helper.c:404 msgid "Suppress output for initializing a submodule" msgstr "Ausgaben bei Initialisierung eines Submoduls unterdrücken" -#: builtin/submodule--helper.c:411 +#: builtin/submodule--helper.c:409 msgid "git submodule--helper init [<path>]" msgstr "git submodule--helper init [<Pfad>]" -#: builtin/submodule--helper.c:432 +#: builtin/submodule--helper.c:430 msgid "git submodule--helper name <path>" msgstr "git submodule--helper name <Pfad>" -#: builtin/submodule--helper.c:438 +#: builtin/submodule--helper.c:436 #, c-format msgid "no submodule mapping found in .gitmodules for path '%s'" msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '%s' gefunden" -#: builtin/submodule--helper.c:489 +#: builtin/submodule--helper.c:486 msgid "where the new submodule will be cloned to" msgstr "Pfad für neues Submodul" -#: builtin/submodule--helper.c:492 +#: builtin/submodule--helper.c:489 msgid "name of the new submodule" msgstr "Name des neuen Submoduls" -#: builtin/submodule--helper.c:495 +#: builtin/submodule--helper.c:492 msgid "url where to clone the submodule from" msgstr "URL von der das Submodul geklont wird" -#: builtin/submodule--helper.c:501 +#: builtin/submodule--helper.c:498 msgid "depth for shallow clones" msgstr "Tiefe des Klons mit unvollständiger Historie (shallow)" -#: builtin/submodule--helper.c:507 +#: builtin/submodule--helper.c:504 msgid "" "git submodule--helper clone [--prefix=<path>] [--quiet] [--reference " "<repository>] [--name <name>] [--depth <depth>] --url <url> --path <path>" -msgstr "git submodule--helper clone [--prefix=<Pfad>] [--quiet] [--reference <Repository>] [--name <Name>] [--url <URL>] [--name <Name>] [--depth <Tiefe>] --url <URL> --path <Pfad>" +msgstr "" +"git submodule--helper clone [--prefix=<Pfad>] [--quiet] [--reference " +"<Repository>] [--name <Name>] [--url <URL>] [--name <Name>] [--depth " +"<Tiefe>] --url <URL> --path <Pfad>" -#: builtin/submodule--helper.c:532 builtin/submodule--helper.c:538 +#: builtin/submodule--helper.c:529 builtin/submodule--helper.c:535 #, c-format msgid "could not create directory '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/submodule--helper.c:534 +#: builtin/submodule--helper.c:531 #, c-format msgid "clone of '%s' into submodule path '%s' failed" msgstr "Klonen von '%s' in Submodul-Pfad '%s' fehlgeschlagen" -#: builtin/submodule--helper.c:550 +#: builtin/submodule--helper.c:547 #, c-format msgid "cannot open file '%s'" msgstr "Kann Datei '%s' nicht öffnen" -#: builtin/submodule--helper.c:555 +#: builtin/submodule--helper.c:552 #, c-format msgid "could not close file %s" msgstr "Konnte Datei '%s' nicht schließen." -#: builtin/submodule--helper.c:562 +#: builtin/submodule--helper.c:559 #, c-format msgid "could not get submodule directory for '%s'" msgstr "Konnte Submodul-Verzeichnis '%s' nicht finden." -#: builtin/submodule--helper.c:609 +#: builtin/submodule--helper.c:611 #, c-format msgid "Submodule path '%s' not initialized" msgstr "Submodul-Pfad '%s' nicht initialisiert" -#: builtin/submodule--helper.c:613 +#: builtin/submodule--helper.c:615 msgid "Maybe you want to use 'update --init'?" msgstr "Meinten Sie vielleicht 'update --init'?" -#: builtin/submodule--helper.c:639 +#: builtin/submodule--helper.c:641 #, c-format msgid "Skipping unmerged submodule %s" msgstr "Ãœberspringe nicht zusammengeführtes Submodul %s" -#: builtin/submodule--helper.c:660 +#: builtin/submodule--helper.c:662 #, c-format msgid "Skipping submodule '%s'" msgstr "Ãœberspringe Submodul '%s'" -#: builtin/submodule--helper.c:768 +#: builtin/submodule--helper.c:792 +#, c-format +msgid "Failed to clone '%s'. Retry scheduled" +msgstr "Fehler beim Klonen von '%s'. Weiterer Versuch geplant" + +#: builtin/submodule--helper.c:803 +#, c-format +msgid "Failed to clone '%s' a second time, aborting" +msgstr "Zweiter Versuch '%s' zu klonen fehlgeschlagen, breche ab." + +#: builtin/submodule--helper.c:824 msgid "path into the working tree" msgstr "Pfad zum Arbeitsverzeichnis" -#: builtin/submodule--helper.c:771 +#: builtin/submodule--helper.c:827 msgid "path into the working tree, across nested submodule boundaries" -msgstr "Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg" +msgstr "" +"Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg" -#: builtin/submodule--helper.c:775 +#: builtin/submodule--helper.c:831 msgid "rebase, merge, checkout or none" msgstr "rebase, merge, checkout oder none" -#: builtin/submodule--helper.c:779 +#: builtin/submodule--helper.c:835 msgid "Create a shallow clone truncated to the specified number of revisions" msgstr "" -"Erstellung eines Klons mit unvollständiger Historie (shallow), abgeschnitten bei\n" +"Erstellung eines Klons mit unvollständiger Historie (shallow), abgeschnitten " +"bei\n" "der angegebenen Anzahl von Commits." -#: builtin/submodule--helper.c:782 +#: builtin/submodule--helper.c:838 msgid "parallel jobs" msgstr "Parallele Ausführungen" -#: builtin/submodule--helper.c:783 +#: builtin/submodule--helper.c:840 +msgid "whether the initial clone should follow the shallow recommendation" +msgstr "" +"ob das initiale Klonen den Empfehlungen für eine unvollständige\n" +"Historie (shallow) folgen soll" + +#: builtin/submodule--helper.c:841 msgid "don't print cloning progress" msgstr "keine Fortschrittsanzeige beim Klonen" -#: builtin/submodule--helper.c:788 +#: builtin/submodule--helper.c:846 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]" msgstr "git submodule--helper update_clone [--prefix=<Pfad>] [<Pfad>...]" -#: builtin/submodule--helper.c:798 +#: builtin/submodule--helper.c:856 msgid "bad value for update parameter" msgstr "Fehlerhafter Wert für --update Parameter" -#: builtin/submodule--helper.c:855 +#: builtin/submodule--helper.c:927 +#, c-format +msgid "" +"Submodule (%s) branch configured to inherit branch from superproject, but " +"the superproject is not on any branch" +msgstr "" +"Branch von Submodul (%s) ist konfiguriert, den Branch des Hauptprojektes\n" +"zu erben, aber das Hauptprojekt befindet sich auf keinem Branch." + +#: builtin/submodule--helper.c:977 msgid "submodule--helper subcommand must be called with a subcommand" msgstr "submodule--helper muss mit einem Unterbefehl aufgerufen werden" -#: builtin/submodule--helper.c:862 +#: builtin/submodule--helper.c:984 #, c-format msgid "'%s' is not a valid submodule--helper subcommand" msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper" @@ -11762,14 +12252,6 @@ msgstr "<Modus>,<Objekt>,<Pfad>" msgid "add the specified entry to the index" msgstr "den angegebenen Eintrag zum Commit vormerken" -#: builtin/update-index.c:958 -msgid "(+/-)x" -msgstr "(+/-)x" - -#: builtin/update-index.c:959 -msgid "override the executable bit of the listed files" -msgstr "das \"ausführbar\"-Bit der aufgelisteten Dateien überschreiben" - #: builtin/update-index.c:963 msgid "mark files as \"not changing\"" msgstr "diese Datei immer als unverändert betrachten" @@ -11935,84 +12417,111 @@ msgid "git worktree add [<options>] <path> [<branch>]" msgstr "git worktree add [<Optionen>] <Pfad> [<Branch>]" #: builtin/worktree.c:16 +msgid "git worktree list [<options>]" +msgstr "git worktree list [<Optionen>]" + +#: builtin/worktree.c:17 +msgid "git worktree lock [<options>] <path>" +msgstr "git worktree lock [<Optionen>] <Pfad>" + +#: builtin/worktree.c:18 msgid "git worktree prune [<options>]" msgstr "git worktree prune [<Optionen>]" -#: builtin/worktree.c:17 -msgid "git worktree list [<options>]" -msgstr "git worktree list [<Optionen>]" +#: builtin/worktree.c:19 +msgid "git worktree unlock <path>" +msgstr "git worktree unlock <Pfad>" -#: builtin/worktree.c:40 +#: builtin/worktree.c:42 #, c-format msgid "Removing worktrees/%s: not a valid directory" msgstr "Lösche worktrees/%s: kein gültiges Verzeichnis" -#: builtin/worktree.c:46 +#: builtin/worktree.c:48 #, c-format msgid "Removing worktrees/%s: gitdir file does not exist" msgstr "Lösche worktrees/%s: gitdir-Datei existiert nicht" -#: builtin/worktree.c:51 +#: builtin/worktree.c:53 #, c-format msgid "Removing worktrees/%s: unable to read gitdir file (%s)" msgstr "Lösche worktrees/%s: konnte gitdir-Datei (%s) nicht lesen" -#: builtin/worktree.c:62 +#: builtin/worktree.c:64 #, c-format msgid "Removing worktrees/%s: invalid gitdir file" msgstr "Lösche worktrees/%s: ungültige gitdir-Datei" -#: builtin/worktree.c:78 +#: builtin/worktree.c:80 #, c-format msgid "Removing worktrees/%s: gitdir file points to non-existent location" msgstr "Lösche worktrees/%s: gitdir-Datei verweist auf nicht existierenden Ort" -#: builtin/worktree.c:113 -#, c-format -msgid "failed to remove '%s'" -msgstr "Fehler beim Löschen von '%s'" - -#: builtin/worktree.c:202 +#: builtin/worktree.c:204 #, c-format msgid "'%s' already exists" msgstr "'%s' existiert bereits" -#: builtin/worktree.c:234 +#: builtin/worktree.c:236 #, c-format msgid "could not create directory of '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/worktree.c:270 +#: builtin/worktree.c:272 #, c-format msgid "Preparing %s (identifier %s)" msgstr "Bereite %s vor (Identifikation %s)" -#: builtin/worktree.c:322 +#: builtin/worktree.c:323 msgid "checkout <branch> even if already checked out in other worktree" msgstr "" "<Branch> auschecken, auch wenn dieser bereits in einem anderen " "Arbeitsverzeichnis ausgecheckt ist" -#: builtin/worktree.c:324 +#: builtin/worktree.c:325 msgid "create a new branch" msgstr "neuen Branch erstellen" -#: builtin/worktree.c:326 +#: builtin/worktree.c:327 msgid "create or reset a branch" msgstr "Branch erstellen oder umsetzen" -#: builtin/worktree.c:327 -msgid "detach HEAD at named commit" -msgstr "HEAD bei benanntem Commit loslösen" - -#: builtin/worktree.c:328 +#: builtin/worktree.c:329 msgid "populate the new working tree" msgstr "das neue Arbeitsverzeichnis auschecken" -#: builtin/worktree.c:336 +#: builtin/worktree.c:337 msgid "-b, -B, and --detach are mutually exclusive" msgstr "-b, -B und --detach schließen sich gegenseitig aus" +#: builtin/worktree.c:470 +msgid "reason for locking" +msgstr "Sperrgrund" + +#: builtin/worktree.c:482 builtin/worktree.c:515 +#, c-format +msgid "'%s' is not a working tree" +msgstr "'%s' ist kein Arbeitsverzeichnis" + +#: builtin/worktree.c:484 builtin/worktree.c:517 +msgid "The main working tree cannot be locked or unlocked" +msgstr "Das Hauptarbeitsverzeichnis kann nicht gesperrt oder entsperrt werden." + +#: builtin/worktree.c:489 +#, c-format +msgid "'%s' is already locked, reason: %s" +msgstr "'%s' ist bereits gesperrt, Grund: %s" + +#: builtin/worktree.c:491 +#, c-format +msgid "'%s' is already locked" +msgstr "'%s' ist bereits gesperrt" + +#: builtin/worktree.c:519 +#, c-format +msgid "'%s' is not locked" +msgstr "'%s' ist nicht gesperrt" + #: builtin/write-tree.c:13 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" msgstr "git write-tree [--missing-ok] [--prefix=<Präfix>/]" @@ -12029,6 +12538,26 @@ msgstr "das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix> schreiben" msgid "only useful for debugging" msgstr "nur nützlich für Fehlersuche" +#: upload-pack.c:20 +msgid "git upload-pack [<options>] <dir>" +msgstr "git upload-pack [<Optionen>] <Verzeichnis>" + +#: upload-pack.c:837 +msgid "quit after a single request/response exchange" +msgstr "nach einem einzigen Request/Response-Austausch beenden" + +#: upload-pack.c:839 +msgid "exit immediately after initial ref advertisement" +msgstr "direkt nach der initialen Angabe der Commits beenden" + +#: upload-pack.c:841 +msgid "do not try <directory>/.git/ if <directory> is no Git directory" +msgstr "kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis ist" + +#: upload-pack.c:843 +msgid "interrupt transfer after <n> seconds of inactivity" +msgstr "Ãœbertragung nach <n> Sekunden Inaktivität unterbrechen" + #: credential-cache--daemon.c:271 msgid "print debugging messages to stderr" msgstr "Meldungen zur Fehlersuche in Standard-Fehlerausgabe ausgeben" @@ -12044,7 +12573,7 @@ msgstr "" "oder 'git help <Konzept>', um mehr über einen spezifischen Befehl oder\n" "Konzept zu erfahren." -#: http.c:322 +#: http.c:323 msgid "Public key pinning not supported with cURL < 7.44.0" msgstr "" "Das Anheften des öffentlichen Schlüssels wird mit cURL < 7.44.0\n" @@ -12189,32 +12718,32 @@ msgid "update the index with reused conflict resolution if possible" msgstr "" "Index, wenn möglich, mit wiederverwendeter Konfliktauflösung aktualisieren" -#: git-bisect.sh:55 +#: git-bisect.sh:54 msgid "You need to start by \"git bisect start\"" msgstr "Sie müssen mit \"git bisect start\" beginnen." #. TRANSLATORS: Make sure to include [Y] and [n] in your #. translation. The program will only accept English input #. at this point. -#: git-bisect.sh:61 +#: git-bisect.sh:60 msgid "Do you want me to do it for you [Y/n]? " msgstr "Wollen Sie, dass ich es für Sie mache [Y/n]? " -#: git-bisect.sh:122 +#: git-bisect.sh:121 #, sh-format msgid "unrecognised option: '$arg'" msgstr "nicht erkannte Option: '$arg'" -#: git-bisect.sh:126 +#: git-bisect.sh:125 #, sh-format msgid "'$arg' does not appear to be a valid revision" msgstr "'$arg' scheint kein gültiger Commit zu sein" -#: git-bisect.sh:155 +#: git-bisect.sh:154 msgid "Bad HEAD - I need a HEAD" msgstr "Ungültiger HEAD - HEAD wird benötigt" -#: git-bisect.sh:168 +#: git-bisect.sh:167 #, sh-format msgid "" "Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'." @@ -12222,28 +12751,29 @@ msgstr "" "Auschecken von '$start_head' fehlgeschlagen. Versuchen Sie 'git bisect reset " "<gültiger-Branch>'." -#: git-bisect.sh:178 +#: git-bisect.sh:177 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:182 +#: git-bisect.sh:181 msgid "Bad HEAD - strange symbolic ref" msgstr "Ungültiger HEAD - merkwürdige symbolische Referenz" -#: git-bisect.sh:234 +#: git-bisect.sh:233 #, sh-format msgid "Bad bisect_write argument: $state" msgstr "Ungültiges \"bisect_write\" Argument: $state" -#: git-bisect.sh:263 +#: git-bisect.sh:262 #, sh-format msgid "Bad rev input: $arg" msgstr "Ungültige Referenz-Eingabe: $arg" -#: git-bisect.sh:278 -msgid "Please call 'bisect_state' with at least one argument." -msgstr "Bitte rufen Sie 'bisect_state' mit mindestens einem Argument auf." +#: git-bisect.sh:281 +#, sh-format +msgid "Bad rev input: $bisected_head" +msgstr "Ungültige Referenz-Eingabe: $bisected_head" #: git-bisect.sh:290 #, sh-format @@ -12392,7 +12922,47 @@ msgstr "" "Ungültiges Argument $arg für 'git bisect terms'.\n" "Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new." -#: git-rebase.sh:57 +#: git-merge-octopus.sh:46 +msgid "" +"Error: Your local changes to the following files would be overwritten by " +"merge" +msgstr "" +"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n" +"überschrieben werden" + +#: git-merge-octopus.sh:61 +msgid "Automated merge did not work." +msgstr "Automatischer Merge hat nicht funktioniert." + +#: git-merge-octopus.sh:62 +msgid "Should not be doing an Octopus." +msgstr "Sollte keinen Octopus-Merge ausführen." + +#: git-merge-octopus.sh:73 +#, sh-format +msgid "Unable to find common commit with $pretty_name" +msgstr "Konnte keinen gemeinsamen Commit mit $pretty_name finden." + +#: git-merge-octopus.sh:77 +#, sh-format +msgid "Already up-to-date with $pretty_name" +msgstr "Bereits aktuell mit $pretty_name" + +#: git-merge-octopus.sh:89 +#, sh-format +msgid "Fast-forwarding to: $pretty_name" +msgstr "Spule vor zu: $pretty_name" + +#: git-merge-octopus.sh:97 +#, sh-format +msgid "Trying simple merge with $pretty_name" +msgstr "Versuche einfachen Merge mit $pretty_name" + +#: git-merge-octopus.sh:102 +msgid "Simple merge did not work, trying automatic merge." +msgstr "Einfacher Merge hat nicht funktioniert, versuche automatischen Merge." + +#: git-rebase.sh:56 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" @@ -12406,48 +12976,53 @@ msgstr "" "Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n" "führen Sie \"git rebase --abort\" aus." -#: git-rebase.sh:168 +#: git-rebase.sh:156 git-rebase.sh:395 +#, sh-format +msgid "Could not move back to $head_name" +msgstr "Konnte nicht zu $head_name zurückgehen" + +#: git-rebase.sh:167 msgid "Applied autostash." -msgstr "\"autostash\" angewendet." +msgstr "Automatischen Stash angewendet." -#: git-rebase.sh:171 +#: git-rebase.sh:170 #, sh-format msgid "Cannot store $stash_sha1" msgstr "Kann $stash_sha1 nicht speichern." -#: git-rebase.sh:172 +#: git-rebase.sh:171 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 "" -"Anwendung von \"autostash\" resultierte in Konflikten.\n" +"Anwendung des automatischen Stash resultierte in Konflikten.\n" "Ihre Änderungen sind im Stash sicher.\n" "Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n" -#: git-rebase.sh:211 +#: git-rebase.sh:210 msgid "The pre-rebase hook refused to rebase." msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen." -#: git-rebase.sh:216 +#: git-rebase.sh:215 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:357 +#: git-rebase.sh:356 msgid "No rebase in progress?" msgstr "Kein Rebase im Gange?" -#: git-rebase.sh:368 +#: git-rebase.sh:367 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:375 +#: git-rebase.sh:374 msgid "Cannot read HEAD" msgstr "Kann HEAD nicht lesen" -#: git-rebase.sh:378 +#: git-rebase.sh:377 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -12455,12 +13030,7 @@ msgstr "" "Sie müssen alle Merge-Konflikte editieren und diese dann\n" "mittels \"git add\" als aufgelöst markieren" -#: git-rebase.sh:396 -#, sh-format -msgid "Could not move back to $head_name" -msgstr "Konnte nicht zu $head_name zurückgehen" - -#: git-rebase.sh:415 +#: git-rebase.sh:414 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -12481,100 +13051,100 @@ msgstr "" "und führen Sie diesen Befehl nochmal aus. Es wird angehalten, falls noch\n" "etwas Schützenswertes vorhanden ist." -#: git-rebase.sh:466 +#: git-rebase.sh:465 #, sh-format msgid "invalid upstream $upstream_name" msgstr "ungültiger Upstream-Branch $upstream_name" -#: git-rebase.sh:490 +#: git-rebase.sh:489 #, 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:493 git-rebase.sh:497 +#: git-rebase.sh:492 git-rebase.sh:496 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: es gibt keine Merge-Basis" -#: git-rebase.sh:502 +#: git-rebase.sh:501 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "$onto_name zeigt auf keinen gültigen Commit" -#: git-rebase.sh:525 +#: git-rebase.sh:524 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "fatal: Branch $branch_name nicht gefunden" -#: git-rebase.sh:558 +#: git-rebase.sh:557 msgid "Cannot autostash" -msgstr "Kann \"autostash\" nicht ausführen." +msgstr "Kann automatischen Stash nicht erzeugen." -#: git-rebase.sh:563 +#: git-rebase.sh:562 #, sh-format msgid "Created autostash: $stash_abbrev" -msgstr "\"autostash\" erzeugt: $stash_abbrev" +msgstr "Automatischen Stash erzeugt: $stash_abbrev" -#: git-rebase.sh:567 +#: git-rebase.sh:566 msgid "Please commit or stash them." msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"." -#: git-rebase.sh:587 +#: git-rebase.sh:586 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Aktueller Branch $branch_name ist auf dem neuesten Stand." -#: git-rebase.sh:591 +#: git-rebase.sh:590 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "" "Aktueller Branch $branch_name ist auf dem neuesten Stand, Rebase erzwungen." -#: git-rebase.sh:602 +#: git-rebase.sh:601 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Änderungen von $mb zu $onto:" -#: git-rebase.sh:611 +#: git-rebase.sh:610 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:621 +#: git-rebase.sh:620 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "$branch_name zu $onto_name vorgespult." -#: git-stash.sh:51 +#: git-stash.sh:50 msgid "git stash clear with parameters is unimplemented" msgstr "git stash clear mit Parametern ist nicht implementiert" -#: git-stash.sh:74 +#: git-stash.sh:73 msgid "You do not have the initial commit yet" msgstr "Sie haben bisher noch keinen initialen Commit" -#: git-stash.sh:89 +#: git-stash.sh:88 msgid "Cannot save the current index state" msgstr "Kann den aktuellen Zustand des Index nicht speichern" -#: git-stash.sh:124 git-stash.sh:137 +#: git-stash.sh:123 git-stash.sh:136 msgid "Cannot save the current worktree state" msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern" -#: git-stash.sh:141 +#: git-stash.sh:140 msgid "No changes selected" msgstr "Keine Änderungen ausgewählt" -#: git-stash.sh:144 +#: git-stash.sh:143 msgid "Cannot remove temporary index (can't happen)" msgstr "Kann temporären Index nicht löschen (kann nicht passieren)" -#: git-stash.sh:157 +#: git-stash.sh:156 msgid "Cannot record working tree state" msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen" -#: git-stash.sh:189 +#: git-stash.sh:188 #, sh-format msgid "Cannot update $ref_stash with $w_commit" msgstr "Kann $ref_stash nicht mit $w_commit aktualisieren." @@ -12589,7 +13159,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:239 +#: git-stash.sh:238 #, sh-format msgid "" "error: unknown option for 'stash save': $option\n" @@ -12599,110 +13169,119 @@ msgstr "" " Um eine Beschreibung anzugeben, benutzen Sie \"git stash save -- " "'$option'\"" -#: git-stash.sh:260 +#: git-stash.sh:259 msgid "No local changes to save" msgstr "Keine lokalen Änderungen zum Speichern" -#: git-stash.sh:264 +#: git-stash.sh:263 msgid "Cannot initialize stash" msgstr "Kann \"stash\" nicht initialisieren" -#: git-stash.sh:268 +#: git-stash.sh:267 msgid "Cannot save the current status" msgstr "Kann den aktuellen Status nicht speichern" -#: git-stash.sh:286 +#: git-stash.sh:268 +#, sh-format +msgid "Saved working directory and index state $stash_msg" +msgstr "Speicherte Arbeitsverzeichnis und Index-Status $stash_msg" + +#: git-stash.sh:285 msgid "Cannot remove worktree changes" msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen" -#: git-stash.sh:405 +#: git-stash.sh:404 #, sh-format msgid "unknown option: $opt" msgstr "unbekannte Option: $opt" -#: git-stash.sh:415 +#: git-stash.sh:414 msgid "No stash found." msgstr "Kein Stash-Eintrag gefunden." -#: git-stash.sh:422 +#: git-stash.sh:421 #, sh-format msgid "Too many revisions specified: $REV" msgstr "Zu viele Commits angegeben: $REV" -#: git-stash.sh:428 +#: git-stash.sh:427 #, sh-format msgid "$reference is not a valid reference" msgstr "$reference ist keine gültige Referenz" -#: git-stash.sh:456 +#: git-stash.sh:455 #, sh-format msgid "'$args' is not a stash-like commit" msgstr "'$args' ist kein \"stash\"-artiger Commit" -#: git-stash.sh:467 +#: git-stash.sh:466 #, sh-format msgid "'$args' is not a stash reference" msgstr "'$args' ist keine \"stash\"-Referenz" -#: git-stash.sh:475 +#: git-stash.sh:474 msgid "unable to refresh index" msgstr "Konnte den Index nicht aktualisieren." -#: git-stash.sh:479 +#: git-stash.sh:478 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:487 +#: git-stash.sh:486 msgid "Conflicts in index. Try without --index." msgstr "Konflikte im Index. Versuchen Sie es ohne --index." -#: git-stash.sh:489 +#: git-stash.sh:488 msgid "Could not save index tree" msgstr "Konnte Index-Verzeichnis nicht speichern" -#: git-stash.sh:523 +#: git-stash.sh:522 msgid "Cannot unstage modified files" msgstr "Kann geänderte Dateien nicht aus dem Index entfernen" -#: git-stash.sh:538 +#: git-stash.sh:537 msgid "Index was not unstashed." msgstr "Index wurde nicht aus dem Stash zurückgeladen." -#: git-stash.sh:561 +#: git-stash.sh:551 +msgid "The stash is kept in case you need it again." +msgstr "Der Stash wird behalten, im Falle Sie benötigen diesen nochmal." + +#: git-stash.sh:560 #, sh-format msgid "Dropped ${REV} ($s)" msgstr "Gelöscht ${REV} ($s)" -#: git-stash.sh:562 +#: git-stash.sh:561 #, sh-format msgid "${REV}: Could not drop stash entry" msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen" -#: git-stash.sh:570 +#: git-stash.sh:569 msgid "No branch name specified" msgstr "Kein Branchname spezifiziert" -#: git-stash.sh:642 +#: git-stash.sh:641 msgid "(To restore them type \"git stash apply\")" msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)" -#: git-submodule.sh:219 +#: git-submodule.sh:183 msgid "Relative path can only be used from the toplevel of the working tree" msgstr "" "Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses " "benutzt werden." -#: git-submodule.sh:229 +#: git-submodule.sh:193 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen" -#: git-submodule.sh:246 +#: git-submodule.sh:210 #, sh-format msgid "'$sm_path' already exists in the index" msgstr "'$sm_path' ist bereits zum Commit vorgemerkt" -#: git-submodule.sh:250 +#: git-submodule.sh:214 #, sh-format msgid "" "The following path is ignored by one of your .gitignore files:\n" @@ -12713,106 +13292,92 @@ msgstr "" "$sm_path\n" "Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten." -#: git-submodule.sh:268 +#: git-submodule.sh:232 #, sh-format msgid "Adding existing repo at '$sm_path' to the index" msgstr "Füge existierendes Repository in '$sm_path' dem Index hinzu." -#: git-submodule.sh:270 +#: git-submodule.sh:234 #, sh-format msgid "'$sm_path' already exists and is not a valid git repo" msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Repository" -#: git-submodule.sh:278 +#: git-submodule.sh:242 #, sh-format msgid "A git directory for '$sm_name' is found locally with remote(s):" msgstr "" "Ein Git-Verzeichnis für '$sm_name' wurde lokal gefunden mit den Remote-" "Repositories:" -#: git-submodule.sh:280 -#, sh-format -msgid "" -"If you want to reuse this local git directory instead of cloning again from" -msgstr "" -"Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt " -"erneut zu klonen" - -#: git-submodule.sh:282 -#, sh-format -msgid "" -"use the '--force' option. If the local git directory is not the correct repo" -msgstr "" -"benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das " -"korrekte Repository ist" - -#: git-submodule.sh:283 +#: git-submodule.sh:244 #, sh-format msgid "" +"If you want to reuse this local git directory instead of cloning again from\n" +" $realrepo\n" +"use the '--force' option. If the local git directory is not the correct " +"repo\n" "or you are unsure what this means choose another name with the '--name' " "option." msgstr "" -"oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen " -"Namen mit der Option '--name'." +"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut von\n" +" $realrepo\n" +"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis\n" +"nicht das korrekte Repository ist oder Sie unsicher sind, was das bedeutet,\n" +"wählen Sie einen anderen Namen mit der Option '--name'." -#: git-submodule.sh:285 +#: git-submodule.sh:250 #, sh-format msgid "Reactivating local git directory for submodule '$sm_name'." msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'." -#: git-submodule.sh:297 +#: git-submodule.sh:262 #, sh-format msgid "Unable to checkout submodule '$sm_path'" msgstr "Kann Submodul '$sm_path' nicht auschecken" -#: git-submodule.sh:302 +#: git-submodule.sh:267 #, sh-format msgid "Failed to add submodule '$sm_path'" msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen" -#: git-submodule.sh:311 +#: git-submodule.sh:276 #, sh-format msgid "Failed to register submodule '$sm_path'" msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration." -#: git-submodule.sh:355 +#: git-submodule.sh:323 #, sh-format msgid "Entering '$displaypath'" msgstr "Betrete '$displaypath'" -#: git-submodule.sh:375 +#: git-submodule.sh:343 #, sh-format msgid "Stopping at '$displaypath'; script returned non-zero status." msgstr "Stoppe bei '$displaypath'; Skript gab nicht-Null Status zurück." -#: git-submodule.sh:448 +#: git-submodule.sh:414 #, sh-format msgid "pathspec and --all are incompatible" msgstr "Pfadspezifikationen und --all sind inkompatibel." -#: git-submodule.sh:453 +#: git-submodule.sh:419 #, sh-format msgid "Use '--all' if you really want to deinitialize all submodules" msgstr "" "Verwenden Sie '--all', wenn Sie wirklich alle Submodule deinitialisieren\n" "möchten." -#: git-submodule.sh:470 -#, 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:471 +#: git-submodule.sh:439 #, sh-format msgid "" +"Submodule work tree '$displaypath' contains a .git directory\n" "(use 'rm -rf' if you really want to remove it including all of its history)" msgstr "" -"(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n" -"seiner Historie löschen möchten)" +"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-Verzeichnis\n" +"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie löschen\n" +"möchten)" -#: git-submodule.sh:477 +#: git-submodule.sh:447 #, sh-format msgid "" "Submodule work tree '$displaypath' contains local modifications; use '-f' to " @@ -12821,126 +13386,146 @@ msgstr "" "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; " "verwenden Sie '-f', um diese zu verwerfen" -#: git-submodule.sh:480 +#: git-submodule.sh:450 #, sh-format msgid "Cleared directory '$displaypath'" msgstr "Verzeichnis '$displaypath' bereinigt." -#: git-submodule.sh:481 +#: git-submodule.sh:451 #, sh-format msgid "Could not remove submodule work tree '$displaypath'" msgstr "" "Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen." -#: git-submodule.sh:484 +#: git-submodule.sh:454 #, sh-format msgid "Could not create empty submodule directory '$displaypath'" msgstr "" "Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen." -#: git-submodule.sh:493 +#: git-submodule.sh:463 #, 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:635 +#: git-submodule.sh:612 #, 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:644 +#: git-submodule.sh:622 #, 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:667 +#: git-submodule.sh:627 +#, sh-format +msgid "" +"Unable to find current ${remote_name}/${branch} revision in submodule path " +"'$sm_path'" +msgstr "" +"Konnte aktuellen Commit von ${remote_name}/${branch} in Submodul-Pfad\n" +"'$sm_path' nicht finden." + +#: git-submodule.sh:645 #, sh-format msgid "Unable to fetch in submodule path '$displaypath'" msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen" -#: git-submodule.sh:680 +#: git-submodule.sh:651 +#, sh-format +msgid "" +"Fetched in submodule path '$displaypath', but it did not contain $sha1. " +"Direct fetching of that commit failed." +msgstr "" +"\"fetch\" in Submodul-Pfad '$displaypath' ausgeführt, aber $sha1 nicht\n" +"enthalten. Direktes Anfordern dieses Commits ist fehlgeschlagen." + +#: git-submodule.sh:658 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken." -#: git-submodule.sh:681 +#: git-submodule.sh:659 #, sh-format msgid "Submodule path '$displaypath': checked out '$sha1'" msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt" -#: git-submodule.sh:685 +#: git-submodule.sh:663 #, 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:686 +#: git-submodule.sh:664 #, sh-format msgid "Submodule path '$displaypath': rebased into '$sha1'" msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'" -#: git-submodule.sh:691 +#: git-submodule.sh:669 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$displaypath'" msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen" -#: git-submodule.sh:692 +#: git-submodule.sh:670 #, sh-format msgid "Submodule path '$displaypath': merged in '$sha1'" msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'" -#: git-submodule.sh:697 +#: git-submodule.sh:675 #, sh-format msgid "Execution of '$command $sha1' failed in submodule path '$displaypath'" -msgstr "Ausführung von '$command $sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen" +msgstr "" +"Ausführung von '$command $sha1' in Submodul-Pfad '$displaypath' " +"fehlgeschlagen" -#: git-submodule.sh:698 +#: git-submodule.sh:676 #, sh-format msgid "Submodule path '$displaypath': '$command $sha1'" msgstr "Submodul-Pfad '$displaypath': '$command $sha1'" -#: git-submodule.sh:729 +#: git-submodule.sh:707 #, sh-format msgid "Failed to recurse into submodule path '$displaypath'" msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'" -#: git-submodule.sh:837 +#: git-submodule.sh:815 msgid "The --cached option cannot be used with the --files option" msgstr "" "Die Optionen --cached und --files können nicht gemeinsam verwendet werden." -#: git-submodule.sh:889 +#: git-submodule.sh:867 #, sh-format msgid "unexpected mode $mod_dst" msgstr "unerwarteter Modus $mod_dst" -#: git-submodule.sh:909 +#: git-submodule.sh:887 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_src" msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_src" -#: git-submodule.sh:912 +#: git-submodule.sh:890 #, sh-format msgid " Warn: $display_name doesn't contain commit $sha1_dst" msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_dst" -#: git-submodule.sh:915 +#: git-submodule.sh:893 #, 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:940 +#: git-submodule.sh:918 msgid "blob" msgstr "Blob" -#: git-submodule.sh:1059 +#: git-submodule.sh:1040 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'" -#: git-submodule.sh:1123 +#: git-submodule.sh:1107 #, sh-format msgid "Synchronizing submodule url for '$displaypath'" msgstr "Synchronisiere Submodul-URL für '$displaypath'" @@ -12950,654 +13535,465 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'" msgid "See git-${cmd}(1) for details." msgstr "Siehe git-${cmd}(1) für weitere Details." -#~ msgid "'%s': %s" -#~ msgstr "'%s': %s" - -#~ msgid "unable to access '%s': %s" -#~ msgstr "konnte nicht auf '%s' zugreifen: %s" - -#~ msgid "could not open '%s' for reading: %s" -#~ msgstr "Konnte '%s' nicht zum Lesen öffnen: %s" - -#~ msgid "could not open '%s' for writing: %s" -#~ msgstr "Konnte '%s' nicht zum Schreiben öffnen: %s" - -#~ msgid " git branch -d %s\n" -#~ msgstr " git branch -d %s\n" - -#~ msgid " git branch --set-upstream-to %s\n" -#~ msgstr " git branch --set-upstream-to %s\n" - -#~ msgid "cannot open %s: %s\n" -#~ msgstr "kann %s nicht öffnen: %s\n" - -#~ 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." - -#~ msgid "could not verify the tag '%s'" -#~ msgstr "Konnte Tag '%s' nicht verifizieren" - -#~ msgid "failed to remove: %s" -#~ msgstr "Fehler beim Löschen: %s" - -#~ msgid "The --exec option must be used with the --interactive option" -#~ msgstr "Die Option --exec muss mit --interactive verwendet werden." - -#~ msgid "" -#~ "Submodule path '$displaypath' not initialized\n" -#~ "Maybe you want to use 'update --init'?" -#~ msgstr "" -#~ "Submodul-Pfad '$displaypath' ist nicht initialisiert.\n" -#~ "Vielleicht möchten Sie 'update --init' benutzen?" - -#~ msgid "Forward-port local commits to the updated upstream head" -#~ msgstr "lokale Commits auf einem aktuellerem Upstream-Branch neu aufbauen" - -#~ msgid "unable to parse format" -#~ msgstr "Konnte Format nicht parsen." - -#~ msgid "improper format entered align:%s" -#~ msgstr "Sie haben ein ungültiges Format eingegeben align:%s" - -#~ msgid "Could not set core.worktree in %s" -#~ msgstr "Konnte core.worktree in '%s' nicht setzen." - -#~ msgid "" -#~ "push.default is unset; its implicit value has changed in\n" -#~ "Git 2.0 from 'matching' to 'simple'. To squelch this message\n" -#~ "and maintain the traditional behavior, use:\n" -#~ "\n" -#~ " git config --global push.default matching\n" -#~ "\n" -#~ "To squelch this message and adopt the new behavior now, use:\n" -#~ "\n" -#~ " git config --global push.default simple\n" -#~ "\n" -#~ "When push.default is set to 'matching', git will push local branches\n" -#~ "to the remote branches that already exist with the same name.\n" -#~ "\n" -#~ "Since Git 2.0, Git defaults to the more conservative 'simple'\n" -#~ "behavior, which only pushes the current branch to the corresponding\n" -#~ "remote branch that 'git pull' uses to update the current branch.\n" -#~ "\n" -#~ "See 'git help config' and search for 'push.default' for further " -#~ "information.\n" -#~ "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" -#~ "'current' instead of 'simple' if you sometimes use older versions of Git)" -#~ msgstr "" -#~ "'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n" -#~ "wurde in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung " -#~ "zu\n" -#~ "unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n" -#~ "beizubehalten, benutzen Sie:\n" -#~ "\n" -#~ " git config --global push.default matching\n" -#~ "\n" -#~ "Um diese Meldung zu unterdrücken und das neue Verhalten jetzt zu " -#~ "übernehmen, benutzen Sie:\n" -#~ "\n" -#~ " git config --global push.default simple\n" -#~ "\n" -#~ "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 wurde 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. Benutzen Sie den " -#~ "ähnlichen\n" -#~ "Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen " -#~ "von\n" -#~ "Git benutzen.)" - -#~ msgid "check|on-demand|no" -#~ msgstr "check|on-demand|no" - -#~ msgid "Could not append '%s'" -#~ msgstr "Konnte '%s' nicht anhängen." - -#~ msgid "Missing author: %s" -#~ msgstr "fehlender Autor: %s" - -#~ msgid "Testing " -#~ msgstr "Prüfe " - -#~ msgid "unable to look up current user in the passwd file: %s" -#~ msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s" - -#~ msgid "no such user" -#~ msgstr "kein solcher Benutzer" - -#~ msgid "branch '%s' does not point at a commit" -#~ msgstr "Branch '%s' zeigt auf keinen Commit" - -#~ msgid "object '%s' does not point to a commit" -#~ msgstr "Objekt '%s' zeigt auf keinen Commit" - -#~ msgid "some refs could not be read" -#~ msgstr "Konnte einige Referenzen nicht lesen" - -#~ msgid "print only merged branches" -#~ msgstr "nur Branches ausgeben, die zusammengeführt sind" - -#~ msgid "--dissociate given, but there is no --reference" -#~ msgstr "--dissociate ohne --reference angegeben" - -#~ msgid "show usage" -#~ msgstr "Verwendung anzeigen" - -#~ msgid "insanely long template name %s" -#~ msgstr "zu langer Vorlagen-Name %s" - -#~ msgid "insanely long symlink %s" -#~ msgstr "zu lange symbolische Verknüpfung %s" - -#~ msgid "insanely long template path %s" -#~ msgstr "zu langer Vorlagen-Pfad %s" - -#~ msgid "insane git directory %s" -#~ msgstr "ungültiges Git-Verzeichnis %s" - -#~ msgid "unsupported sort specification '%s'" -#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s'" - -#~ msgid "unsupported sort specification '%s' in variable '%s'" -#~ msgstr "Nicht unterstützte Angabe für \"--sort\" '%s' in Variable '%s'" - -#~ msgid "switch 'points-at' requires an object" -#~ msgstr "Option 'points-at' erfordert ein Objekt" - -#~ msgid "sort tags" -#~ msgstr "Tags sortieren" - -#~ msgid "--sort and -n are incompatible" -#~ msgstr "--sort und -n sind inkompatibel" - -#~ msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" -#~ msgstr "" -#~ "Git-Verzeichnis '$a' ist Teil des Submodul-Pfades '$b', oder umgekehrt" - -#~ msgid "false|true|preserve" -#~ msgstr "false|true|preserve" - -#~ msgid "BUG: reopen a lockfile that is still open" -#~ msgstr "FEHLER: Wiederöffnen einer bereits geöffneten Lock-Datei" - -#~ msgid "BUG: reopen a lockfile that has been committed" -#~ msgstr "FEHLER: Wiederöffnen einer bereits committeten Lock-Datei" - -#~ msgid "option %s does not accept negative form" -#~ msgstr "Option %s akzeptiert keine negative Form" +#: git-rebase--interactive.sh:131 +#, sh-format +msgid "Rebasing ($new_count/$total)" +msgstr "Führe Rebase aus ($new_count/$total)" -#~ msgid "unable to parse value '%s' for option %s" -#~ msgstr "konnte Wert '%s' für Option %s nicht parsen" +#: git-rebase--interactive.sh:147 +msgid "" +"\n" +"Commands:\n" +" p, pick = use commit\n" +" r, reword = use commit, but edit the commit message\n" +" e, edit = use commit, but stop for amending\n" +" s, squash = use commit, but meld into previous commit\n" +" f, fixup = like \"squash\", but discard this commit's log message\n" +" x, exec = run command (the rest of the line) using shell\n" +" d, drop = remove commit\n" +"\n" +"These lines can be re-ordered; they are executed from top to bottom.\n" +msgstr "" +"\n" +"Befehle:\n" +" p, pick = Commit verwenden\n" +" r, reword = Commit verwenden, aber Commit-Beschreibung bearbeiten\n" +" e, edit = Commit verwenden, aber zum Nachbessern anhalten\n" +" s, squash = Commit verwenden, aber mit vorherigem Commit vereinen\n" +" f, fixup = wie \"squash\", aber diese Commit-Beschreibung verwerfen\n" +" x, exec = Befehl (Rest der Zeile) mittels Shell ausführen\n" +" d, drop = Commit entfernen\n" +"\n" +"Diese Zeilen können umsortiert werden; Sie werden von oben nach unten\n" +"ausgeführt.\n" -#~ msgid "-b and -B are mutually exclusive" -#~ msgstr "-b und -B schließen sich gegenseitig aus" +#: git-rebase--interactive.sh:162 +msgid "" +"\n" +"Do not remove any line. Use 'drop' explicitly to remove a commit.\n" +msgstr "" +"\n" +"Keine Zeile entfernen. Benutzen Sie 'drop', um explizit einen Commit zu\n" +"entfernen.\n" -#~ msgid "You need to set your committer info first" -#~ msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen." +#: git-rebase--interactive.sh:166 +msgid "" +"\n" +"If you remove a line here THAT COMMIT WILL BE LOST.\n" +msgstr "\nWenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n" -#~ 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 "" -#~ "Wenn Sie das Problem gelöst haben, führen Sie \"$cmdline --continue\" " -#~ "aus.\n" -#~ "Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen\n" -#~ "\"$cmdline --skip\" aus.\n" -#~ "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der\n" -#~ "Patches abzubrechen, führen Sie \"$cmdline --abort\" aus." +#: git-rebase--interactive.sh:202 +#, sh-format +msgid "" +"You can amend the commit now, with\n" +"\n" +"\tgit commit --amend $gpg_sign_opt_quoted\n" +"\n" +"Once you are satisfied with your changes, run\n" +"\n" +"\tgit rebase --continue" +msgstr "" +"Sie können den Commit nun nachbessern mit:\n" +"\n" +"\tgit commit --amend $gpg_sign_opt_quoted\n" +"\n" +"Sobald Sie mit Ihren Änderungen zufrieden sind, führen Sie aus:\n" +"\n" +"\tgit rebase --continue" -#~ msgid "Patch format $patch_format is not supported." -#~ msgstr "Patch-Format $patch_format wird nicht unterstützt." +#: git-rebase--interactive.sh:227 +#, sh-format +msgid "$sha1: not a commit that can be picked" +msgstr "$sha1: kein Commit der gepickt werden kann" -#~ msgid "Please make up your mind. --skip or --abort?" -#~ msgstr "Bitte werden Sie sich klar. --skip oder --abort?" +#: git-rebase--interactive.sh:266 +#, sh-format +msgid "Invalid commit name: $sha1" +msgstr "Ungültiger Commit-Name: $sha1" -#~ 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 "" -#~ "Patch ist leer. Wurde er falsch aufgeteilt?\n" -#~ "Wenn Sie diesen Patch auslassen möchten, führen Sie stattdessen\n" -#~ "\"$cmdline --skip\" aus.\n" -#~ "Um den ursprünglichen Branch wiederherzustellen und die Anwendung der " -#~ "Patches\n" -#~ "abzubrechen, führen Sie \"$cmdline --abort\" aus." +#: git-rebase--interactive.sh:308 +msgid "Cannot write current commit's replacement sha1" +msgstr "Kann ersetzenden SHA-1 des aktuellen Commits nicht schreiben" -#~ msgid "Patch does not have a valid e-mail address." -#~ msgstr "Patch enthält keine gültige E-Mail-Adresse." +#: git-rebase--interactive.sh:360 +#, sh-format +msgid "Fast-forward to $sha1" +msgstr "Spule vor zu $sha1" -#~ msgid "Applying: $FIRSTLINE" -#~ msgstr "Wende an: $FIRSTLINE" +#: git-rebase--interactive.sh:362 +#, sh-format +msgid "Cannot fast-forward to $sha1" +msgstr "Kann nicht zu $sha1 vorspulen" -#~ msgid "Patch failed at $msgnum $FIRSTLINE" -#~ msgstr "Anwendung des Patches fehlgeschlagen bei $msgnum $FIRSTLINE" +#: git-rebase--interactive.sh:371 +#, sh-format +msgid "Cannot move HEAD to $first_parent" +msgstr "Kann HEAD nicht auf $first_parent setzen" + +#: git-rebase--interactive.sh:376 +#, sh-format +msgid "Refusing to squash a merge: $sha1" +msgstr "\"squash\" eines Merges ($sha1) zurückgewiesen." -#~ msgid "" -#~ "Pull is not possible because you have unmerged files.\n" -#~ "Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" -#~ "as appropriate to mark resolution and make a commit." -#~ msgstr "" -#~ "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien " -#~ "haben.\n" -#~ "Bitte korrigieren Sie dies im Arbeitsverzeichnis und benutzen Sie dann\n" -#~ "'git add/rm <Datei>', um die Auflösung entsprechend zu markieren und zu\n" -#~ "committen." +#: git-rebase--interactive.sh:390 +#, sh-format +msgid "Error redoing merge $sha1" +msgstr "Fehler beim Wiederholen des Merges von $sha1" -#~ msgid "Pull is not possible because you have unmerged files." -#~ msgstr "" -#~ "\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben." +#: git-rebase--interactive.sh:398 +#, sh-format +msgid "Could not pick $sha1" +msgstr "Konnte $sha1 nicht picken" -#~ msgid "no branch specified" -#~ msgstr "Kein Branch spezifiziert" +#: git-rebase--interactive.sh:407 +#, sh-format +msgid "This is the commit message #${n}:" +msgstr "Das ist Commit-Beschreibung #${n}:" -#~ msgid "check a branch out in a separate working directory" -#~ msgstr "Branch in separatem Arbeitsverzeichnis auschecken" +#: git-rebase--interactive.sh:412 +#, sh-format +msgid "The commit message #${n} will be skipped:" +msgstr "Commit-Beschreibung #${n} wird ausgelassen:" -#~ msgid "prune .git/worktrees" -#~ msgstr "" -#~ "Informationen zu nicht mehr existierenden Arbeitsverzeichnissen in .git/" -#~ "worktrees entfernen" +#: git-rebase--interactive.sh:423 +#, sh-format +msgid "This is a combination of $count commit." +msgid_plural "This is a combination of $count commits." +msgstr[0] "Das ist eine Kombination aus $count Commit." +msgstr[1] "Das ist eine Kombination aus $count Commits." -#~ msgid "The most commonly used git commands are:" -#~ msgstr "Die allgemein verwendeten Git-Kommandos sind:" +#: git-rebase--interactive.sh:431 +#, sh-format +msgid "Cannot write $fixup_msg" +msgstr "Kann $fixup_msg nicht schreiben" -#~ msgid "No such branch: '%s'" -#~ msgstr "Kein solcher Branch '%s'" +#: git-rebase--interactive.sh:434 +msgid "This is a combination of 2 commits." +msgstr "Das ist eine Kombination aus 2 Commits." -#~ msgid "Could not create git link %s" -#~ msgstr "Konnte git-Verweis %s nicht erstellen" +#: git-rebase--interactive.sh:435 +msgid "This is the 1st commit message:" +msgstr "Das ist die erste Commit-Beschreibung:" -#~ msgid "Invalid gc.pruneexpire: '%s'" -#~ msgstr "Ungültiges Wert für \"gc.pruneexpire\": '%s'" +#: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518 +#: git-rebase--interactive.sh:521 +#, sh-format +msgid "Could not apply $sha1... $rest" +msgstr "Konnte $sha1... ($rest) nicht anwenden" + +#: git-rebase--interactive.sh:549 +#, sh-format +msgid "" +"Could not amend commit after successfully picking $sha1... $rest\n" +"This is most likely due to an empty commit message, or the pre-commit hook\n" +"failed. If the pre-commit hook failed, you may need to resolve the issue " +"before\n" +"you are able to reword the commit." +msgstr "" +"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... $rest\n" +"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, oder\n" +"weil der pre-commit Hook fehlschlug. Falls der pre-commit Hook fehlschlug,\n" +"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern können." + +#: git-rebase--interactive.sh:564 +#, sh-format +msgid "Stopped at $sha1_abbrev... $rest" +msgstr "Angehalten bei $sha1_abbrev... $rest" + +#: git-rebase--interactive.sh:579 +#, sh-format +msgid "Cannot '$squash_style' without a previous commit" +msgstr "Kann nicht '$squash_style' ohne vorherigen Commit" + +#: git-rebase--interactive.sh:621 +#, sh-format +msgid "Executing: $rest" +msgstr "Führe aus: $rest" + +#: git-rebase--interactive.sh:629 +#, sh-format +msgid "Execution failed: $rest" +msgstr "Ausführung fehlgeschlagen: $rest" + +#: git-rebase--interactive.sh:631 +msgid "and made changes to the index and/or the working tree" +msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert." + +#: git-rebase--interactive.sh:633 +msgid "" +"You can fix the problem, and then run\n" +"\n" +"\tgit rebase --continue" +msgstr "" +"Sie können das Problem beheben, und dann\n" +"\n" +"\tgit rebase --continue\n" +"\n" +"ausführen." + +#. TRANSLATORS: after these lines is a command to be issued by the user +#: git-rebase--interactive.sh:646 +#, sh-format +msgid "" +"Execution succeeded: $rest\n" +"but left changes to the index and/or the working tree\n" +"Commit or stash your changes, and then run\n" +"\n" +"\tgit rebase --continue" +msgstr "" +"Ausführung erfolgreich: $rest\n" +"Aber Änderungen in Index oder Arbeitsverzeichnis verblieben.\n" +"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\".\n" +"Führen Sie dann aus:\n" +"\n" +"\tgit rebase --continue" + +#: git-rebase--interactive.sh:657 +#, sh-format +msgid "Unknown command: $command $sha1 $rest" +msgstr "Unbekannter Befehl: $command $sha1 $rest" -#~ msgid "(detached from %s)" -#~ msgstr "(losgelöst von %s)" +#: git-rebase--interactive.sh:658 +msgid "Please fix this using 'git rebase --edit-todo'." +msgstr "Bitte beheben Sie das, indem Sie 'git rebase --edit-todo' ausführen." -#~ msgid "search also in ignored files" -#~ msgstr "auch in ignorierten Dateien suchen" +#: git-rebase--interactive.sh:693 +#, sh-format +msgid "Successfully rebased and updated $head_name." +msgstr "Erfolgreich Rebase ausgeführt und $head_name aktualisiert." -#~ msgid "No existing author found with '%s'" -#~ msgstr "Kein existierender Autor mit '%s' gefunden." - -#~ msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)" -#~ msgstr "git remote set-head <Name> (-a | --auto | -d | --delete | <Branch>)" - -#~ msgid "no files added" -#~ msgstr "keine Dateien hinzugefügt" - -#~ msgid "force creation (when already exists)" -#~ msgstr "Branch auch erzeugen, wenn dieser bereits existiert" - -#~ msgid "slot" -#~ msgstr "Slot" - -#~ msgid "check" -#~ msgstr "check|on-demand" - -#~ msgid "Failed to lock ref for update" -#~ msgstr "Fehler beim Sperren der Referenz zur Aktualisierung." - -#~ msgid "Failed to write ref" -#~ msgstr "Fehler beim Schreiben der Referenz." - -#~ msgid "Failed to lock HEAD during fast_forward_to" -#~ msgstr "Fehler beim Sperren von HEAD während fast_forward_to" - -#~ msgid "invalid commit: %s" -#~ msgstr "Ungültiger Commit: %s" - -#~ msgid "cannot lock HEAD ref" -#~ msgstr "Kann Referenz von HEAD nicht sperren." - -#~ msgid "cannot update HEAD ref" -#~ msgstr "Kann Referenz von HEAD nicht aktualisieren." - -#~ msgid "cannot tell cwd" -#~ msgstr "kann aktuelles Arbeitsverzeichnis nicht ermitteln" - -#~ msgid "%s: cannot lock the ref" -#~ msgstr "%s: kann Referenz nicht sperren" - -#~ msgid "%s: cannot update the ref" -#~ msgstr "%s: kann Referenz nicht aktualisieren" - -#~ msgid "commit has empty message" -#~ msgstr "Commit hat eine leere Beschreibung" - -#~ msgid "Failed to chdir: %s" -#~ msgstr "Fehler beim Verzeichniswechsel: %s" - -#~ msgid "key id" -#~ msgstr "Schlüssel-ID" - -#~ msgid "Tracking not set up: name too long: %s" -#~ msgstr "" -#~ "Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s" - -#~ msgid "bug" -#~ msgstr "Fehler" - -#~ msgid ", behind " -#~ msgstr ", hinterher " - -#~ msgid "could not find .gitmodules in index" -#~ msgstr "Konnte .gitmodules nicht in der Staging-Area finden" - -#~ msgid "reading updated .gitmodules failed" -#~ msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen" - -#~ msgid "unable to stat updated .gitmodules" -#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen" - -#~ msgid "unable to remove .gitmodules from index" -#~ msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen" - -#~ msgid "adding updated .gitmodules failed" -#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen" - -#~ 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 "" -#~ "Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n" -#~ "einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n" -#~ "mehr verwendet werden.\n" -#~ "Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie " -#~ "aus:\n" -#~ "\n" -#~ " git add %s :/\n" -#~ " (oder git add %s :/)\n" -#~ "\n" -#~ "Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n" -#~ "\n" -#~ " git add %s .\n" -#~ " (oder git add %s .)\n" -#~ "\n" -#~ "Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n" -#~ "Verzeichnis beschränkt.\n" - -#~ msgid "" -#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n" -#~ "whose behaviour will change in Git 2.0 with respect to paths you " -#~ "removed.\n" -#~ "Paths like '%s' that are\n" -#~ "removed from your working tree are ignored with this version of Git.\n" -#~ "\n" -#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n" -#~ " ignores paths you removed from your working tree.\n" -#~ "\n" -#~ "* 'git add --all <pathspec>' will let you also record the removals.\n" -#~ "\n" -#~ "Run 'git status' to check the paths you removed from your working tree.\n" -#~ msgstr "" -#~ "Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n" -#~ "ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n" -#~ "Berücksichtigung der gelöschten Pfade.\n" -#~ "Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n" -#~ "dieser Version von Git ignoriert.\n" -#~ "\n" -#~ "* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n" -#~ " Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n" -#~ "* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n" -#~ " Pfade.\n" -#~ "Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n" - -#~ 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 "" -#~ "Die Datenbank des Repositories wird für eine optimale Performance\n" -#~ "komprimiert. Sie können auch \"git gc\" manuell ausführen.\n" -#~ "Siehe \"git help gc\" für weitere Informationen.\n" - -#~ msgid "" -#~ "Updates were rejected because a pushed branch tip is behind its remote\n" -#~ "counterpart. If you did not intend to push that branch, you may want to\n" -#~ "specify branches to push or set the 'push.default' configuration " -#~ "variable\n" -#~ "to 'simple', 'current' or 'upstream' to push only the current branch." -#~ msgstr "" -#~ "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines " -#~ "versendeten\n" -#~ "Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie " -#~ "nicht\n" -#~ "beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu " -#~ "versendenden\n" -#~ "Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu " -#~ "'simple', 'current'\n" -#~ "oder 'upstream' setzen, um nur den aktuellen Branch zu versenden." - -#~ 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 "" -#~ "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\" " -#~ "aus)" - -#~ msgid " (all conflicts fixed: run \"git commit\")" -#~ msgstr " (alle Konflikte behoben: führen Sie \"git commit\" aus)" - -#~ msgid "more than %d trees given: '%s'" -#~ msgstr "Mehr als %d \"Tree\"-Objekte angegeben: '%s'" - -#~ msgid "You cannot combine --no-ff with --ff-only." -#~ msgstr "Sie können --no-ff nicht mit --ff--only kombinieren." - -#~ msgid "" -#~ "submodule '%s' (or one of its nested submodules) uses a .git directory\n" -#~ "(use 'rm -rf' if you really want to remove it including all of its " -#~ "history)" -#~ msgstr "" -#~ "Submodul '%s' (oder ein geschachteltes Submodul hiervon) verwendet\n" -#~ "ein .git-Verzeichnis (benutzen Sie 'rm -rf' wenn Sie dieses wirklich " -#~ "mitsamt\n" -#~ "seiner Historie löschen möchten)" - -#~ msgid "" -#~ "'%s' has changes staged in the index\n" -#~ "(use --cached to keep the file, or -f to force removal)" -#~ msgstr "" -#~ "'%s' hat zum Commit vorgemerkte Änderungen\n" -#~ "(benutzen Sie --cached um die Datei zu behalten, oder -f um die " -#~ "Entfernung zu erzwingen)" - -#~ msgid "show commits where no parent comes before its children" -#~ msgstr "" -#~ "zeigt Commits, bei denen kein Eltern-Commit vor seinem Kind-Commit kommt" - -#~ msgid "show the HEAD reference" -#~ msgstr "zeigt Referenz von HEAD" - -#~ msgid "Unable to fetch in submodule path '$prefix$sm_path'" -#~ msgstr "Konnte \"fetch\" in Submodul-Pfad '$prefix$sm_path' nicht ausführen" - -#~ msgid "Failed to recurse into submodule path '$prefix$sm_path'" -#~ msgstr "Fehler bei Rekursion in Submodul-Pfad '$prefix$sm_path'" - -#~ msgid "It took %.2f seconds to enumerate untracked files. 'status -uno'" -#~ msgstr "" -#~ "Es dauerte %.2f Sekunden die unbeobachteten Dateien zu bestimmen.'status -" -#~ "uno'" - -#~ msgid "may speed it up, but you have to be careful not to forget to add" -#~ msgstr "könnte das beschleunigen, aber Sie müssen darauf achten, neue" - -#~ msgid "new files yourself (see 'git help status')." -#~ msgstr "Dateien selbstständig hinzuzufügen (siehe 'git help status')." +#: git-rebase--interactive.sh:740 +msgid "Could not skip unnecessary pick commands" +msgstr "Fehler beim Auslassen von nicht erforderlichen \"pick\"-Befehlen." -#~ msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]" -#~ msgstr "" -#~ "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] " -#~ "[<Versionsidentifikation>... ]" +#: git-rebase--interactive.sh:898 +#, sh-format +msgid "" +"Warning: the SHA-1 is missing or isn't a commit in the following line:\n" +" - $line" +msgstr "" +"Warnung: Der SHA-1 in der folgenden Zeile fehlt oder ist kein Commit:\n" +" - $line" -#~ msgid "See 'git help <command>' for more information on a specific command." -#~ msgstr "" -#~ "Siehe 'git help <Kommando>' für weitere Informationen zu einem " -#~ "spezifischen Kommando" +#: git-rebase--interactive.sh:931 +#, sh-format +msgid "" +"Warning: the command isn't recognized in the following line:\n" +" - $line" +msgstr "" +"Warnung: Das Kommando in der folgenden Zeile wurde nicht erkannt:\n" +" - $line" -#~ msgid "use any ref in .git/refs" -#~ msgstr "verwendet alle Referenzen in .git/refs" +#: git-rebase--interactive.sh:970 +msgid "could not detach HEAD" +msgstr "Konnte HEAD nicht loslösen" -#~ msgid "use any tag in .git/refs/tags" -#~ msgstr "verwendet alle Markierungen in .git/refs/tags" +#: git-rebase--interactive.sh:1008 +msgid "" +"Warning: some commits may have been dropped accidentally.\n" +"Dropped commits (newer to older):" +msgstr "" +"Warnung: Einige Commits könnten aus Versehen entfernt worden sein.\n" +"Entfernte Commits (neu zu alt):" -#~ msgid "bad object %s" -#~ msgstr "ungültiges Objekt %s" +#: git-rebase--interactive.sh:1016 +msgid "" +"To avoid this message, use \"drop\" to explicitly remove a commit.\n" +"\n" +"Use 'git config rebase.missingCommitsCheck' to change the level of " +"warnings.\n" +"The possible behaviours are: ignore, warn, error." +msgstr "" +"Um diese Meldung zu vermeiden, benutzen Sie \"drop\", um exlizit Commits zu\n" +"entfernen.\n" +"\n" +"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der Warnungen\n" +"zu ändern.\n" +"Die möglichen Verhaltensweisen sind: ignore, warn, error." -#~ msgid "bogus committer info %s" -#~ msgstr "unechte Einreicher-Informationen %s" +#: git-rebase--interactive.sh:1027 +#, sh-format +msgid "" +"Unrecognized setting $check_level for option rebase.missingCommitsCheck. " +"Ignoring." +msgstr "" +"Nicht erkannte Einstellung $check_level für Option rebase.missingCommitsCheck.\n" +"Ignoriere." -#~ msgid "can't fdopen 'show' output fd" -#~ msgstr "konnte Datei-Deskriptor für Ausgabe von 'show' nicht öffnen" +#: git-rebase--interactive.sh:1044 +msgid "You can fix this with 'git rebase --edit-todo'." +msgstr "Sie können das mit 'git rebase --edit-todo' beheben." -#~ msgid "failed to close pipe to 'show' for object '%s'" -#~ msgstr "" -#~ "Schließen der Verbindung zu 'show' ist für Objekt '%s' fehlgeschlagen." +#: git-rebase--interactive.sh:1045 +msgid "Or you can abort the rebase with 'git rebase --abort'." +msgstr "Oder Sie können den Rebase mit 'git rebase --abort' abbrechen." -#~ msgid "You do not have a valid HEAD" -#~ msgstr "Sie haben keine gültige Zweigspitze (HEAD)" +#: git-rebase--interactive.sh:1069 +msgid "Could not remove CHERRY_PICK_HEAD" +msgstr "Konnte CHERRY_PICK_HEAD nicht löschen" -#~ msgid "oops" -#~ msgstr "Ups" +#: git-rebase--interactive.sh:1074 +#, sh-format +msgid "" +"You have staged changes in your working tree.\n" +"If these changes are meant to be\n" +"squashed into the previous commit, run:\n" +"\n" +" git commit --amend $gpg_sign_opt_quoted\n" +"\n" +"If they are meant to go into a new commit, run:\n" +"\n" +" git commit $gpg_sign_opt_quoted\n" +"\n" +"In both case, once you're done, continue with:\n" +"\n" +" git rebase --continue\n" +msgstr "" +"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem Arbeitsverzeichnis.\n" +"Wenn diese Änderungen in den vorherigen Commit aufgenommen werden sollen,\n" +"führen Sie aus:\n" +"\n" +" git commit --amend $gpg_sign_opt_quoted\n" +"\n" +"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n" +"\n" +" git commit $gpg_sign_opt_quoted\n" +"\n" +"Im Anschluss führen Sie zum Fortfahren aus:\n" +"\n" +" git rebase --continue\n" -#~ msgid "Would not remove %s\n" -#~ msgstr "Würde '%s' nicht löschen\n" +#: git-rebase--interactive.sh:1091 +msgid "Error trying to find the author identity to amend commit" +msgstr "" +"Fehler beim Versuch die Identität des Authors zum Verbessern des Commits zu\n" +"finden" -#~ msgid "Not removing %s\n" -#~ msgstr "Entferne nicht %s\n" +#: git-rebase--interactive.sh:1096 +msgid "" +"You have uncommitted changes in your working tree. Please commit them\n" +"first and then run 'git rebase --continue' again." +msgstr "" +"Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n" +"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' erneut\n" +"aus." -#~ msgid "Could not read index" -#~ msgstr "Konnte Bereitstellung nicht lesen" +#: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105 +msgid "Could not commit staged changes." +msgstr "Konnte Änderungen aus der Staging-Area nicht committen." -#~ msgid " 0 files changed" -#~ msgstr " 0 Dateien geändert" +#: git-rebase--interactive.sh:1129 +msgid "" +"\n" +"You are editing the todo file of an ongoing interactive rebase.\n" +"To continue rebase after editing, run:\n" +" git rebase --continue\n" +"\n" +msgstr "" +"\n" +"Sie bearbeiten gerade die TODO-Datei eines laufenden interaktiven Rebase.\n" +"Um den Rebase nach dem Editieren fortzusetzen, führen Sie aus:\n" +" git rebase --continue\n" +"\n" -#~ msgid " %d file changed" -#~ msgid_plural " %d files changed" -#~ msgstr[0] " %d Datei geändert" -#~ msgstr[1] " %d Dateien geändert" +#: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298 +msgid "Could not execute editor" +msgstr "Konnte Editor nicht ausführen." -#~ msgid ", %d insertion(+)" -#~ msgid_plural ", %d insertions(+)" -#~ msgstr[0] ", %d Zeile hinzugefügt(+)" -#~ msgstr[1] ", %d Zeilen hinzugefügt(+)" +#: git-rebase--interactive.sh:1145 +msgid "You need to set your committer info first" +msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen." -#~ msgid ", %d deletion(-)" -#~ msgid_plural ", %d deletions(-)" -#~ msgstr[0] ", %d Zeile entfernt(-)" -#~ msgstr[1] ", %d Zeilen entfernt(-)" +#: git-rebase--interactive.sh:1153 +#, sh-format +msgid "Could not checkout $switch_to" +msgstr "Konnte $switch_to nicht auschecken." -#~ msgid "git remote set-head <name> (-a | -d | <branch>])" -#~ msgstr "git remote set-head <Name> (-a | -d | <Zweig>])" +#: git-rebase--interactive.sh:1158 +msgid "No HEAD?" +msgstr "Kein HEAD?" -#~ msgid " (use \"git add\" to track)" -#~ msgstr " (benutze \"git add\" zum Beobachten)" +#: git-rebase--interactive.sh:1159 +#, sh-format +msgid "Could not create temporary $state_dir" +msgstr "Konnte temporäres Verzeichnis $state_dir nicht erstellen." -#~ msgid "--detach cannot be used with -b/-B/--orphan" -#~ msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden" +#: git-rebase--interactive.sh:1161 +msgid "Could not mark as interactive" +msgstr "Konnte nicht als interaktiven Rebase markieren." -#~ msgid "--detach cannot be used with -t" -#~ msgstr "--detach kann nicht mit -t benutzt werden" +#: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176 +msgid "Could not init rewritten commits" +msgstr "Konnte neu geschriebene Commits nicht initialisieren." -#~ msgid "--orphan and -b|-B are mutually exclusive" -#~ msgstr "--orphan und -b|-B sind gegenseitig exklusiv" +#: git-rebase--interactive.sh:1276 +#, sh-format +msgid "Rebase $shortrevisions onto $shortonto ($todocount command)" +msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)" +msgstr[0] "Rebase von $shortrevisions auf $shortonto ($todocount Kommando)" +msgstr[1] "Rebase von $shortrevisions auf $shortonto ($todocount Kommandos)" -#~ msgid "--orphan cannot be used with -t" -#~ msgstr "--orphan kann nicht mit -t benutzt werden" +#: git-rebase--interactive.sh:1281 +msgid "" +"\n" +"However, if you remove everything, the rebase will be aborted.\n" +"\n" +msgstr "\nWenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n\n" -#~ msgid "git checkout: -f and -m are incompatible" -#~ msgstr "git checkout: -f und -m sind inkompatibel" +#: git-rebase--interactive.sh:1288 +msgid "Note that empty commits are commented out" +msgstr "Leere Commits sind auskommentiert." -#~ msgid "" -#~ "git checkout: updating paths is incompatible with switching branches." -#~ msgstr "" -#~ "git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem " -#~ "Wechsel von Zweigen." +#: git-sh-setup.sh:89 git-sh-setup.sh:94 +#, sh-format +msgid "usage: $dashless $USAGE" +msgstr "Verwendung: $dashless $USAGE" -#~ msgid "diff setup failed" -#~ msgstr "diff_setup_done fehlgeschlagen" +#: git-sh-setup.sh:190 +#, sh-format +msgid "Cannot chdir to $cdup, the toplevel of the working tree" +msgstr "" +"Konnte nicht in Verzeichnis $cdup wechseln, der obersten Ebene des\n" +"Arbeitsverzeichnisses." -#~ msgid "merge-recursive: disk full?" -#~ msgstr "merge-recursive: Festplatte voll?" +#: git-sh-setup.sh:199 git-sh-setup.sh:206 +#, sh-format +msgid "fatal: $program_name cannot be used without a working tree." +msgstr "fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden." -#~ msgid "diff_setup_done failed" -#~ msgstr "diff_setup_done fehlgeschlagen" +#: git-sh-setup.sh:220 +msgid "Cannot rebase: You have unstaged changes." +msgstr "Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind." -#~ msgid "-d option is no longer supported. Do not use." -#~ msgstr "-d Option wird nicht länger unterstützt. Nicht benutzen." +#: git-sh-setup.sh:223 +msgid "Cannot rewrite branches: You have unstaged changes." +msgstr "" +"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum Commit\n" +"vorgemerkt sind." -#~ msgid "%s: has been deleted/renamed" -#~ msgstr "%s wurde gelöscht/umbenannt" +#: git-sh-setup.sh:229 +#, sh-format +msgid "Cannot $action: You have unstaged changes." +msgstr "" +"Kann $action nicht ausführen: Sie haben Änderungen, die nicht zum Commit\n" +"vorgemerkt sind." -#~ msgid "'%s': not a documentation directory." -#~ msgstr "'%s' ist kein Dokumentationsverzeichnis" +#: git-sh-setup.sh:242 +msgid "Cannot rebase: Your index contains uncommitted changes." +msgstr "Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete Änderungen." -#~ msgid "--" -#~ msgstr "--" +#: git-sh-setup.sh:248 +#, sh-format +msgid "Cannot $action: Your index contains uncommitted changes." +msgstr "" +"Kann $action nicht ausführen: Die Staging-Area beinhaltet nicht committete\n" +"Änderungen." -#~ msgid "Could not extract email from committer identity." -#~ msgstr "Konnte E-Mail-Adresse des Einreichers nicht extrahieren." +#: git-sh-setup.sh:372 +msgid "You need to run this command from the toplevel of the working tree." +msgstr "Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses ausführen." -#~ msgid "cherry-pick" -#~ msgstr "cherry-pick" +#: git-sh-setup.sh:377 +msgid "Unable to determine absolute path of git directory" +msgstr "Konnte absoluten Pfad des Git-Verzeichnisses nicht bestimmen." -#~ 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 "" -#~ "Um dich vor Verlust von Historie zu bewahren, wurden nicht vorzuspulende " -#~ "Aktualisierungen zurückgewiesen.\n" -#~ "Führe die externen Änderungen zusammen (z.B. 'git pull') bevor du erneut " -#~ "versendest. Siehe auch die 'Note about fast-forwards' Sektion von \n" -#~ "'git push --help' für weitere Details.\n" @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Git Russian Localization Project\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" "POT-Creation-Date: 2016-05-24 23:42+0800\n" -"PO-Revision-Date: 2016-06-11 09:37+0000\n" +"PO-Revision-Date: 2016-06-30 13:28+0000\n" "Last-Translator: Dimitriy Ryazantcev <DJm00n@mail.ru>\n" "Language-Team: Russian (http://www.transifex.com/djm00n/git-po-ru/language/ru/)\n" "MIME-Version: 1.0\n" @@ -1440,11 +1440,11 @@ msgstr "Ошибка Ð¾Ð±Ð¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ %s" #: sequencer.c:208 msgid "Your local changes would be overwritten by cherry-pick." -msgstr "Ваши локальные изменение будут перезапиÑаны отбором лучшего." +msgstr "Ваши локальные изменение будут перезапиÑаны копией коммита." #: sequencer.c:210 msgid "Your local changes would be overwritten by revert." -msgstr "Ваши локальные изменение будут перезапиÑаны возвратом коммита." +msgstr "Ваши локальные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ перезапиÑаны обратными изменениÑми коммита." #: sequencer.c:213 msgid "Commit your changes or stash them to proceed." @@ -1508,7 +1508,7 @@ msgstr "Ðе удалоÑÑŒ получить Ñообщение коммита Ð #: sequencer.c:594 #, c-format msgid "could not revert %s... %s" -msgstr "не удалоÑÑŒ возвратить коммит %s… %s" +msgstr "не удалоÑÑŒ обратить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð° %s… %s" #: sequencer.c:595 #, c-format @@ -1575,7 +1575,7 @@ msgstr "ÐŸÐ¾Ð²Ñ€ÐµÐ¶Ð´Ñ‘Ð½Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° Ñ Ð¾Ð¿Ñ†Ð¸Ñми: %s" #: sequencer.c:814 msgid "a cherry-pick or revert is already in progress" -msgstr "отбор лучшего или возврат коммита уже выполнÑетÑÑ" +msgstr "копирование или обращение изменений коммита уже выполнÑÑŽÑ‚ÑÑ" #: sequencer.c:815 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" @@ -1593,7 +1593,7 @@ msgstr "Ошибка Ð¾Ð±Ð¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ %s." #: sequencer.c:854 sequencer.c:986 msgid "no cherry-pick or revert in progress" -msgstr "отбор лучшего или возврат коммита не выполнÑетÑÑ" +msgstr "копирование или обращение изменений коммита уже выполнÑÑŽÑ‚ÑÑ" #: sequencer.c:856 msgid "cannot resolve HEAD" @@ -1620,7 +1620,7 @@ msgstr "неожиданный конец файла" #: sequencer.c:887 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" -msgstr "Ñохраненный файл Ñ HEAD перед отбором лучшего «%s» поврежден" +msgstr "Ñохраненный файл Ñ HEAD перед копированием коммита «%s» поврежден" #: sequencer.c:909 #, c-format @@ -1630,7 +1630,7 @@ msgstr "Ðе удалоÑÑŒ отформатировать %s." #: sequencer.c:1054 #, c-format msgid "%s: can't cherry-pick a %s" -msgstr "%s: не удалоÑÑŒ отобрать %s" +msgstr "%s: не удалоÑÑŒ Ñкопировать коммит %s" #: sequencer.c:1057 #, c-format @@ -1639,11 +1639,11 @@ msgstr "%s: Ð¿Ð»Ð¾Ñ…Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ" #: sequencer.c:1091 msgid "Can't revert as initial commit" -msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð¸Ñ‚ÑŒ изначальный коммит" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸Ñ‚ÑŒ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ коммита" #: sequencer.c:1092 msgid "Can't cherry-pick into empty head" -msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ñ‚ÑŒ лучшее в пуÑтую ветку" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ñкопировать коммит в пуÑтую ветку" #: setup.c:248 #, c-format @@ -2297,7 +2297,7 @@ msgstr " (иÑпользуйте «git rebase --continue», когда буде #: wt-status.c:1213 #, c-format msgid "You are currently cherry-picking commit %s." -msgstr "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚Ð±Ð¸Ñ€Ð°ÐµÑ‚Ðµ лучший коммит %s." +msgstr "Ð’Ñ‹ копируете коммит %s." #: wt-status.c:1218 msgid " (fix conflicts and run \"git cherry-pick --continue\")" @@ -2309,12 +2309,12 @@ msgstr " (вÑе конфликты разрешены: запуÑтите «gi #: wt-status.c:1223 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" -msgstr " (иÑпользуйте «git cherry-pick --abort», чтобы отменить операцию отбора лучшего)" +msgstr " (иÑпользуйте «git cherry-pick --abort», чтобы отменить ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°)" #: wt-status.c:1232 #, c-format msgid "You are currently reverting commit %s." -msgstr "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚Ðµ коммит %s." +msgstr "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‰Ð°ÐµÑ‚Ðµ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð° %s." #: wt-status.c:1237 msgid " (fix conflicts and run \"git revert --continue\")" @@ -2326,7 +2326,7 @@ msgstr " (вÑе конфликты разрешены: запуÑтите «gi #: wt-status.c:1242 msgid " (use \"git revert --abort\" to cancel the revert operation)" -msgstr " (иÑпользуйте «git revert --abort», чтобы отменить операцию возврата)" +msgstr " (иÑпользуйте «git revert --abort», чтобы отменить операцию Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммита)" #: wt-status.c:1253 #, c-format @@ -5091,7 +5091,7 @@ msgid "" "\n" " git commit --allow-empty\n" "\n" -msgstr "Предыдущий отбор лучшего теперь пуÑÑ‚, возможно поÑле Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð².\nЕÑли вы вÑе равно хотите Ñделать пуÑтой коммит, иÑпользуйте:\n\n git commit --allow-empty\n\n" +msgstr "Копируемый коммит теперь пуÑÑ‚, возможно поÑле Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð².\nЕÑли вы вÑе равно хотите Ñделать пуÑтой коммит, иÑпользуйте:\n\n git commit --allow-empty\n\n" #: builtin/commit.c:85 msgid "Otherwise, please use 'git reset'\n" @@ -5105,7 +5105,7 @@ msgid "" "\n" "Then \"git cherry-pick --continue\" will resume cherry-picking\n" "the remaining commits.\n" -msgstr "ЕÑли вы хотите пропуÑтит Ñтот коммит, иÑпользуйте команду:\n\n git reset\n\nПоÑле Ñтого «git cherry-pick --continue» продолжит отбор лучшего\nв оÑтавшихÑÑ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°Ñ….\n" +msgstr "ЕÑли вы хотите пропуÑтит Ñтот коммит, иÑпользуйте команду:\n\n git reset\n\nПоÑле Ñтого «git cherry-pick --continue» продолжит копирование оÑтавшихÑÑ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð².\n" #: builtin/commit.c:307 msgid "failed to unpack HEAD tree object" @@ -5137,7 +5137,7 @@ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать чаÑтичный коммит во вреР#: builtin/commit.c:449 msgid "cannot do a partial commit during a cherry-pick." -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать чаÑтичный коммит во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð±Ð¾Ñ€Ð° лучшего коммита." +msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать чаÑтичный коммит во Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð°." #: builtin/commit.c:458 msgid "cannot read the index" @@ -5221,7 +5221,7 @@ msgid "" "If this is not correct, please remove the file\n" "\t%s\n" "and try again.\n" -msgstr "\nПохоже, что вы пытаетеÑÑŒ закоммитить отбор лучшего.\nЕÑли Ñто ошибка, пожалуйÑта удалите файл\n\t%s\nи попробуйте Ñнова.\n" +msgstr "\nПохоже, что вы пытаетеÑÑŒ закоммитить при копировании коммита.\nЕÑли Ñто не так, то удалите файл\n\t%s\nи попробуйте Ñнова.\n" #: builtin/commit.c:832 #, c-format @@ -5294,7 +5294,7 @@ msgstr "Ð’Ñ‹ в процеÑÑе ÑлиÑÐ½Ð¸Ñ â€” ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð #: builtin/commit.c:1162 msgid "You are in the middle of a cherry-pick -- cannot amend." -msgstr "Ð’Ñ‹ в процеÑÑе отбора лучшего — ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸ÑправлÑÑ‚ÑŒ." +msgstr "Ð’Ñ‹ в процеÑÑе ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð° — ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸ÑправлÑÑ‚ÑŒ." #: builtin/commit.c:1165 msgid "Options --squash and --fixup cannot be used together" @@ -7996,11 +7996,11 @@ msgstr "Ð’Ñ‹ не завершили ÑлиÑние (приÑутÑтвует Ñ„ msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you merge." -msgstr "Ð’Ñ‹ не завершили отбор лучшего (приÑутÑтвует файл CHERRY_PICK_HEAD).\nПожалуйÑта, выполните коммит ваших изменений, перед ÑлиÑнием." +msgstr "Ð’Ñ‹ не завершили копирование коммита (приÑутÑтвует файл CHERRY_PICK_HEAD).\nПожалуйÑта, закоммитьте ваши изменениÑ, перед ÑлиÑнием." #: builtin/merge.c:1245 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." -msgstr "Ð’Ñ‹ не завершили отбор лучшего (приÑутÑтвует файл CHERRY_PICK_HEAD)." +msgstr "Ð’Ñ‹ не завершили копирование коммита (приÑутÑтвует файл CHERRY_PICK_HEAD)." #: builtin/merge.c:1254 msgid "You cannot combine --squash with --no-ff." @@ -10151,15 +10151,15 @@ msgstr "%s: %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать одновременно Ñ #: builtin/revert.c:80 msgid "end revert or cherry-pick sequence" -msgstr "конец поÑледовательноÑти отбора лучшего или возврата коммита" +msgstr "конец поÑледовательноÑти ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммитов" #: builtin/revert.c:81 msgid "resume revert or cherry-pick sequence" -msgstr "продолжить поÑледовательноÑÑ‚ÑŒ отбора лучшего или возврата коммита" +msgstr "продолжить поÑледовательноÑÑ‚ÑŒ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммитов" #: builtin/revert.c:82 msgid "cancel revert or cherry-pick sequence" -msgstr "отмена поÑледовательноÑти отбора лучшего или возврата коммита" +msgstr "отмена поÑледовательноÑти ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммитов" #: builtin/revert.c:83 msgid "don't automatically commit" @@ -10207,11 +10207,11 @@ msgstr "ошибка в программе" #: builtin/revert.c:197 msgid "revert failed" -msgstr "Ñбой возврата коммита" +msgstr "Ñбой Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ коммита" #: builtin/revert.c:212 msgid "cherry-pick failed" -msgstr "Ñбой при отборе лучшего" +msgstr "Ñбой при копировании коммита" #: builtin/rm.c:17 msgid "git rm [<options>] [--] <file>..." @@ -544,15 +544,13 @@ static void add_merge_info(const struct pretty_print_context *pp, strbuf_addstr(sb, "Merge:"); while (parent) { - struct commit *p = parent->item; - const char *hex = NULL; + struct object_id *oidp = &parent->item->object.oid; + strbuf_addch(sb, ' '); if (pp->abbrev) - hex = find_unique_abbrev(p->object.oid.hash, pp->abbrev); - if (!hex) - hex = oid_to_hex(&p->object.oid); + strbuf_add_unique_abbrev(sb, oidp->hash, pp->abbrev); + else + strbuf_addstr(sb, oid_to_hex(oidp)); parent = parent->next; - - strbuf_addf(sb, " %s", hex); } strbuf_addch(sb, '\n'); } @@ -1232,8 +1230,12 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ switch (c->signature_check.result) { case 'G': case 'B': + case 'E': case 'U': case 'N': + case 'X': + case 'Y': + case 'R': strbuf_addch(sb, c->signature_check.result); } break; diff --git a/read-cache.c b/read-cache.c index 38d67faf70..db5d910642 100644 --- a/read-cache.c +++ b/read-cache.c @@ -156,7 +156,14 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) static int ce_compare_data(const struct cache_entry *ce, struct stat *st) { int match = -1; - int fd = open(ce->name, O_RDONLY); + static int cloexec = O_CLOEXEC; + int fd = open(ce->name, O_RDONLY | cloexec); + + if ((cloexec & O_CLOEXEC) && fd < 0 && errno == EINVAL) { + /* Try again w/o O_CLOEXEC: the kernel might not support it */ + cloexec &= ~O_CLOEXEC; + fd = open(ce->name, O_RDONLY | cloexec); + } if (fd >= 0) { unsigned char sha1[20]; @@ -816,8 +816,7 @@ struct ref_update *ref_transaction_add_update( hashcpy(update->new_sha1, new_sha1); if (flags & REF_HAVE_OLD) hashcpy(update->old_sha1, old_sha1); - if (msg) - update->msg = xstrdup(msg); + update->msg = xstrdup_or_null(msg); return update; } diff --git a/refs/files-backend.c b/refs/files-backend.c index d16feb19c5..f9023939d5 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1353,6 +1353,7 @@ static int files_read_raw_ref(struct ref_store *ref_store, int fd; int ret = -1; int save_errno; + int remaining_retries = 3; *type = 0; strbuf_reset(&sb_path); @@ -1373,8 +1374,14 @@ stat_ref: * <-> symlink) between the lstat() and reading, then * we don't want to report that as an error but rather * try again starting with the lstat(). + * + * We'll keep a count of the retries, though, just to avoid + * any confusing situation sending us into an infinite loop. */ + if (remaining_retries-- <= 0) + goto out; + if (lstat(path, &st) < 0) { if (errno != ENOENT) goto out; @@ -1403,6 +1410,11 @@ stat_ref: ret = 0; goto out; } + /* + * It doesn't look like a refname; fall through to just + * treating it like a non-symlink, and reading whatever it + * points to. + */ } /* Is it a directory? */ @@ -1426,7 +1438,7 @@ stat_ref: */ fd = open(path, O_RDONLY); if (fd < 0) { - if (errno == ENOENT) + if (errno == ENOENT && !S_ISLNK(st.st_mode)) /* inconsistent with lstat; retry */ goto stat_ref; else diff --git a/run-command.c b/run-command.c index 5a4dbb66d7..ca905a9e80 100644 --- a/run-command.c +++ b/run-command.c @@ -21,6 +21,7 @@ void child_process_clear(struct child_process *child) struct child_to_clean { pid_t pid; + struct child_process *process; struct child_to_clean *next; }; static struct child_to_clean *children_to_clean; @@ -31,6 +32,18 @@ static void cleanup_children(int sig, int in_signal) while (children_to_clean) { struct child_to_clean *p = children_to_clean; children_to_clean = p->next; + + if (p->process && !in_signal) { + struct child_process *process = p->process; + if (process->clean_on_exit_handler) { + trace_printf( + "trace: run_command: running exit handler for pid %" + PRIuMAX, (uintmax_t)p->pid + ); + process->clean_on_exit_handler(process); + } + } + kill(p->pid, sig); if (!in_signal) free(p); @@ -49,10 +62,11 @@ static void cleanup_children_on_exit(void) cleanup_children(SIGTERM, 0); } -static void mark_child_for_cleanup(pid_t pid) +static void mark_child_for_cleanup(pid_t pid, struct child_process *process) { struct child_to_clean *p = xmalloc(sizeof(*p)); p->pid = pid; + p->process = process; p->next = children_to_clean; children_to_clean = p; @@ -422,7 +436,7 @@ fail_pipe: if (cmd->pid < 0) error_errno("cannot fork() for %s", cmd->argv[0]); else if (cmd->clean_on_exit) - mark_child_for_cleanup(cmd->pid); + mark_child_for_cleanup(cmd->pid, cmd); /* * Wait for child's execvp. If the execvp succeeds (or if fork() @@ -483,7 +497,7 @@ fail_pipe: if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT)) error_errno("cannot spawn %s", cmd->argv[0]); if (cmd->clean_on_exit && cmd->pid >= 0) - mark_child_for_cleanup(cmd->pid); + mark_child_for_cleanup(cmd->pid, cmd); argv_array_clear(&nargv); cmd->argv = sargv; @@ -634,7 +648,7 @@ int in_async(void) return !pthread_equal(main_thread, pthread_self()); } -void NORETURN async_exit(int code) +static void NORETURN async_exit(int code) { pthread_exit((void *)(intptr_t)code); } @@ -684,13 +698,26 @@ int in_async(void) return process_is_async; } -void NORETURN async_exit(int code) +static void NORETURN async_exit(int code) { exit(code); } #endif +void check_pipe(int err) +{ + if (err == EPIPE) { + if (in_async()) + async_exit(141); + + signal(SIGPIPE, SIG_DFL); + raise(SIGPIPE); + /* Should never happen, but just in case... */ + exit(141); + } +} + int start_async(struct async *async) { int need_in, need_out; @@ -752,7 +779,7 @@ int start_async(struct async *async) exit(!!async->proc(proc_in, proc_out, async->data)); } - mark_child_for_cleanup(async->pid); + mark_child_for_cleanup(async->pid, NULL); if (need_in) close(fdin[0]); diff --git a/run-command.h b/run-command.h index 50666497ae..dd1c78c28d 100644 --- a/run-command.h +++ b/run-command.h @@ -43,6 +43,8 @@ struct child_process { unsigned stdout_to_stderr:1; unsigned use_shell:1; unsigned clean_on_exit:1; + void (*clean_on_exit_handler)(struct child_process *process); + void *clean_on_exit_handler_cbdata; }; #define CHILD_PROCESS_INIT { NULL, ARGV_ARRAY_INIT, ARGV_ARRAY_INIT } @@ -139,7 +141,7 @@ struct async { int start_async(struct async *async); int finish_async(struct async *async); int in_async(void); -void NORETURN async_exit(int code); +void check_pipe(int err); /** * This callback should initialize the child process and preload the diff --git a/send-pack.c b/send-pack.c index 90f2ac51a7..6195b43e9a 100644 --- a/send-pack.c +++ b/send-pack.c @@ -181,8 +181,7 @@ static int receive_status(int in, struct ref *refs) hint->status = REF_STATUS_REMOTE_REJECT; ret = -1; } - if (msg) - hint->remote_status = xstrdup(msg); + hint->remote_status = xstrdup_or_null(msg); /* start our next search from the next ref */ hint = hint->next; } diff --git a/sequencer.c b/sequencer.c index eec8a60d6b..5fd75f30dd 100644 --- a/sequencer.c +++ b/sequencer.c @@ -15,16 +15,46 @@ #include "merge-recursive.h" #include "refs.h" #include "argv-array.h" +#include "quote.h" #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION" const char sign_off_header[] = "Signed-off-by: "; static const char cherry_picked_prefix[] = "(cherry picked from commit "; -static GIT_PATH_FUNC(git_path_todo_file, SEQ_TODO_FILE) -static GIT_PATH_FUNC(git_path_opts_file, SEQ_OPTS_FILE) -static GIT_PATH_FUNC(git_path_seq_dir, SEQ_DIR) -static GIT_PATH_FUNC(git_path_head_file, SEQ_HEAD_FILE) +GIT_PATH_FUNC(git_path_seq_dir, "sequencer") + +static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo") +static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts") +static GIT_PATH_FUNC(git_path_head_file, "sequencer/head") + +/* + * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and + * GIT_AUTHOR_DATE that will be used for the commit that is currently + * being rebased. + */ +static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script") +/* + * The following files are written by git-rebase just after parsing the + * command-line (and are only consumed, not modified, by the sequencer). + */ +static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt") + +/* We will introduce the 'interactive rebase' mode later */ +static inline int is_rebase_i(const struct replay_opts *opts) +{ + return 0; +} + +static const char *get_dir(const struct replay_opts *opts) +{ + return git_path_seq_dir(); +} + +static const char *get_todo_path(const struct replay_opts *opts) +{ + return git_path_todo_file(); +} static int is_rfc2822_line(const char *buf, int len) { @@ -108,18 +138,37 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob, return 1; } -static void remove_sequencer_state(void) +static const char *gpg_sign_opt_quoted(struct replay_opts *opts) +{ + static struct strbuf buf = STRBUF_INIT; + + strbuf_reset(&buf); + if (opts->gpg_sign) + sq_quotef(&buf, "-S%s", opts->gpg_sign); + return buf.buf; +} + +int sequencer_remove_state(struct replay_opts *opts) { - struct strbuf seq_dir = STRBUF_INIT; + struct strbuf dir = STRBUF_INIT; + int i; + + free(opts->gpg_sign); + free(opts->strategy); + for (i = 0; i < opts->xopts_nr; i++) + free(opts->xopts[i]); + free(opts->xopts); + + strbuf_addf(&dir, "%s", get_dir(opts)); + remove_dir_recursively(&dir, 0); + strbuf_release(&dir); - strbuf_addstr(&seq_dir, git_path(SEQ_DIR)); - remove_dir_recursively(&seq_dir, 0); - strbuf_release(&seq_dir); + return 0; } static const char *action_name(const struct replay_opts *opts) { - return opts->action == REPLAY_REVERT ? "revert" : "cherry-pick"; + return opts->action == REPLAY_REVERT ? N_("revert") : N_("cherry-pick"); } struct commit_message { @@ -129,13 +178,18 @@ struct commit_message { const char *message; }; +static const char *short_commit_name(struct commit *commit) +{ + return find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV); +} + static int get_message(struct commit *commit, struct commit_message *out) { const char *abbrev, *subject; int subject_len; out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding()); - abbrev = find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV); + abbrev = short_commit_name(commit); subject_len = find_commit_subject(out->message, &subject); @@ -180,22 +234,64 @@ static void print_advice(int show_hint, struct replay_opts *opts) } } -static int write_message(struct strbuf *msgbuf, const char *filename) +static int write_message(const void *buf, size_t len, const char *filename, + int append_eol) { static struct lock_file msg_file; int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0); if (msg_fd < 0) - return error_errno(_("Could not lock '%s'"), filename); - if (write_in_full(msg_fd, msgbuf->buf, msgbuf->len) < 0) - return error_errno(_("Could not write to %s"), filename); - strbuf_release(msgbuf); - if (commit_lock_file(&msg_file) < 0) - return error(_("Error wrapping up %s."), filename); + return error_errno(_("could not lock '%s'"), filename); + if (write_in_full(msg_fd, buf, len) < 0) { + rollback_lock_file(&msg_file); + return error_errno(_("could not write to '%s'"), filename); + } + if (append_eol && write(msg_fd, "\n", 1) < 0) { + rollback_lock_file(&msg_file); + return error_errno(_("could not write eol to '%s"), filename); + } + if (commit_lock_file(&msg_file) < 0) { + rollback_lock_file(&msg_file); + return error(_("failed to finalize '%s'."), filename); + } return 0; } +/* + * Reads a file that was presumably written by a shell script, i.e. with an + * end-of-line marker that needs to be stripped. + * + * Note that only the last end-of-line marker is stripped, consistent with the + * behavior of "$(cat path)" in a shell script. + * + * Returns 1 if the file was read, 0 if it could not be read or does not exist. + */ +static int read_oneliner(struct strbuf *buf, + const char *path, int skip_if_empty) +{ + int orig_len = buf->len; + + if (!file_exists(path)) + return 0; + + if (strbuf_read_file(buf, path, 0) < 0) { + warning_errno(_("could not read '%s'"), path); + return 0; + } + + if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') { + if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r') + --buf->len; + buf->buf[buf->len] = '\0'; + } + + if (skip_if_empty && buf->len == orig_len) + return 0; + + return 1; +} + static struct tree *empty_tree(void) { return lookup_tree(EMPTY_TREE_SHA1_BIN); @@ -204,16 +300,13 @@ static struct tree *empty_tree(void) static int error_dirty_index(struct replay_opts *opts) { if (read_cache_unmerged()) - return error_resolve_conflict(action_name(opts)); + return error_resolve_conflict(_(action_name(opts))); - /* Different translation strings for cherry-pick and revert */ - if (opts->action == REPLAY_PICK) - error(_("Your local changes would be overwritten by cherry-pick.")); - else - error(_("Your local changes would be overwritten by revert.")); + error(_("your local changes would be overwritten by %s."), + _(action_name(opts))); if (advice_commit_before_merge) - advise(_("Commit your changes or stash them to proceed.")); + advise(_("commit your changes or stash them to proceed.")); return -1; } @@ -228,7 +321,7 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from, if (checkout_fast_forward(from, to, 1)) return -1; /* the callee should have complained already */ - strbuf_addf(&sb, _("%s: fast-forward"), action_name(opts)); + strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts))); transaction = ref_transaction_begin(&err); if (!transaction || @@ -274,7 +367,7 @@ static int do_recursive_merge(struct commit *base, struct commit *next, struct merge_options o; struct tree *result, *next_tree, *base_tree, *head_tree; int clean; - const char **xopt; + char **xopt; static struct lock_file index_lock; hold_locked_index(&index_lock, 1); @@ -304,7 +397,7 @@ static int do_recursive_merge(struct commit *base, struct commit *next, write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) /* TRANSLATORS: %s will be "revert" or "cherry-pick" */ return error(_("%s: Unable to write new index file"), - action_name(opts)); + _(action_name(opts))); rollback_lock_file(&index_lock); if (opts->signoff) @@ -322,7 +415,7 @@ static int is_index_unchanged(void) struct commit *head_commit; if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL)) - return error(_("Could not resolve HEAD commit\n")); + return error(_("could not resolve HEAD commit\n")); head_commit = lookup_commit(head_sha1); @@ -342,41 +435,115 @@ static int is_index_unchanged(void) if (!cache_tree_fully_valid(active_cache_tree)) if (cache_tree_update(&the_index, 0)) - return error(_("Unable to update cache tree\n")); + return error(_("unable to update cache tree\n")); return !hashcmp(active_cache_tree->sha1, head_commit->tree->object.oid.hash); } /* + * Read the author-script file into an environment block, ready for use in + * run_command(), that can be free()d afterwards. + */ +static char **read_author_script(void) +{ + struct strbuf script = STRBUF_INIT; + int i, count = 0; + char *p, *p2, **env; + size_t env_size; + + if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0) + return NULL; + + for (p = script.buf; *p; p++) + if (skip_prefix(p, "'\\\\''", (const char **)&p2)) + strbuf_splice(&script, p - script.buf, p2 - p, "'", 1); + else if (*p == '\'') + strbuf_splice(&script, p-- - script.buf, 1, "", 0); + else if (*p == '\n') { + *p = '\0'; + count++; + } + + env_size = (count + 1) * sizeof(*env); + strbuf_grow(&script, env_size); + memmove(script.buf + env_size, script.buf, script.len); + p = script.buf + env_size; + env = (char **)strbuf_detach(&script, NULL); + + for (i = 0; i < count; i++) { + env[i] = p; + p += strlen(p) + 1; + } + env[count] = NULL; + + return env; +} + +static const char staged_changes_advice[] = +N_("you have staged changes in your working tree\n" +"If these changes are meant to be squashed into the previous commit, run:\n" +"\n" +" git commit --amend %s\n" +"\n" +"If they are meant to go into a new commit, run:\n" +"\n" +" git commit %s\n" +"\n" +"In both cases, once you're done, continue with:\n" +"\n" +" git rebase --continue\n"); + +/* * If we are cherry-pick, and if the merge did not result in * hand-editing, we will hit this commit and inherit the original * author date and name. + * * If we are revert, or if our cherry-pick results in a hand merge, * we had better say that the current user is responsible for that. + * + * An exception is when run_git_commit() is called during an + * interactive rebase: in that case, we will want to retain the + * author metadata. */ static int run_git_commit(const char *defmsg, struct replay_opts *opts, - int allow_empty) + int allow_empty, int edit, int amend, + int cleanup_commit_message) { + char **env = NULL; struct argv_array array; int rc; const char *value; + if (is_rebase_i(opts)) { + env = read_author_script(); + if (!env) { + const char *gpg_opt = gpg_sign_opt_quoted(opts); + + return error(_(staged_changes_advice), + gpg_opt, gpg_opt); + } + } + argv_array_init(&array); argv_array_push(&array, "commit"); argv_array_push(&array, "-n"); + if (amend) + argv_array_push(&array, "--amend"); if (opts->gpg_sign) argv_array_pushf(&array, "-S%s", opts->gpg_sign); if (opts->signoff) argv_array_push(&array, "-s"); - if (!opts->edit) { - argv_array_push(&array, "-F"); - argv_array_push(&array, defmsg); - if (!opts->signoff && - !opts->record_origin && - git_config_get_value("commit.cleanup", &value)) - argv_array_push(&array, "--cleanup=verbatim"); - } + if (defmsg) + argv_array_pushl(&array, "-F", defmsg, NULL); + if (cleanup_commit_message) + argv_array_push(&array, "--cleanup=strip"); + if (edit) + argv_array_push(&array, "-e"); + else if (!cleanup_commit_message && + !opts->signoff && !opts->record_origin && + git_config_get_value("commit.cleanup", &value)) + argv_array_push(&array, "--cleanup=verbatim"); if (allow_empty) argv_array_push(&array, "--allow-empty"); @@ -384,8 +551,11 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, if (opts->allow_empty_message) argv_array_push(&array, "--allow-empty-message"); - rc = run_command_v_opt(array.argv, RUN_GIT_CMD); + rc = run_command_v_opt_cd_env(array.argv, RUN_GIT_CMD, NULL, + (const char *const *)env); argv_array_clear(&array); + free(env); + return rc; } @@ -394,12 +564,12 @@ static int is_original_commit_empty(struct commit *commit) const unsigned char *ptree_sha1; if (parse_commit(commit)) - return error(_("Could not parse commit %s\n"), + return error(_("could not parse commit %s\n"), oid_to_hex(&commit->object.oid)); if (commit->parents) { struct commit *parent = commit->parents->item; if (parse_commit(parent)) - return error(_("Could not parse parent commit %s\n"), + return error(_("could not parse parent commit %s\n"), oid_to_hex(&parent->object.oid)); ptree_sha1 = parent->tree->object.oid.hash; } else { @@ -447,7 +617,26 @@ static int allow_empty(struct replay_opts *opts, struct commit *commit) return 1; } -static int do_pick_commit(struct commit *commit, struct replay_opts *opts) +enum todo_command { + TODO_PICK = 0, + TODO_REVERT +}; + +static const char *todo_command_strings[] = { + "pick", + "revert" +}; + +static const char *command_to_string(const enum todo_command command) +{ + if (command < ARRAY_SIZE(todo_command_strings)) + return todo_command_strings[command]; + die("Unknown command: %d", command); +} + + +static int do_pick_commit(enum todo_command command, struct commit *commit, + struct replay_opts *opts) { unsigned char head[20]; struct commit *base, *next, *parent; @@ -464,12 +653,12 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) * to work on. */ if (write_cache_as_tree(head, 0, NULL)) - return error(_("Your index file is unmerged.")); + return error(_("your index file is unmerged.")); } else { unborn = get_sha1("HEAD", head); if (unborn) hashcpy(head, EMPTY_TREE_SHA1_BIN); - if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD", 0)) + if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD", 0, 0)) return error_dirty_index(opts); } discard_cache(); @@ -483,7 +672,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) struct commit_list *p; if (!opts->mainline) - return error(_("Commit %s is a merge but no -m option was given."), + return error(_("commit %s is a merge but no -m option was given."), oid_to_hex(&commit->object.oid)); for (cnt = 1, p = commit->parents; @@ -491,11 +680,11 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) cnt++) p = p->next; if (cnt != opts->mainline || !p) - return error(_("Commit %s does not have parent %d"), + return error(_("commit %s does not have parent %d"), oid_to_hex(&commit->object.oid), opts->mainline); parent = p->item; } else if (0 < opts->mainline) - return error(_("Mainline was specified but commit %s is not a merge."), + return error(_("mainline was specified but commit %s is not a merge."), oid_to_hex(&commit->object.oid)); else parent = commit->parents->item; @@ -506,13 +695,14 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) return fast_forward_to(commit->object.oid.hash, head, unborn, opts); if (parent && parse_commit(parent) < 0) - /* TRANSLATORS: The first %s will be "revert" or - "cherry-pick", the second %s a SHA1 */ + /* TRANSLATORS: The first %s will be a "todo" command like + "revert" or "pick", the second %s a SHA1. */ return error(_("%s: cannot parse parent commit %s"), - action_name(opts), oid_to_hex(&parent->object.oid)); + command_to_string(command), + oid_to_hex(&parent->object.oid)); if (get_message(commit, &msg) != 0) - return error(_("Cannot get commit message for %s"), + return error(_("cannot get commit message for %s"), oid_to_hex(&commit->object.oid)); /* @@ -522,7 +712,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) * reverse of it if we are revert. */ - if (opts->action == REPLAY_REVERT) { + if (command == TODO_REVERT) { base = commit; base_label = msg.label; next = parent; @@ -563,25 +753,29 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) } } - if (!opts->strategy || !strcmp(opts->strategy, "recursive") || opts->action == REPLAY_REVERT) { + if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) { res = do_recursive_merge(base, next, base_label, next_label, head, &msgbuf, opts); if (res < 0) return res; - res |= write_message(&msgbuf, git_path_merge_msg()); + res |= write_message(msgbuf.buf, msgbuf.len, + git_path_merge_msg(), 0); } else { struct commit_list *common = NULL; struct commit_list *remotes = NULL; - res = write_message(&msgbuf, git_path_merge_msg()); + res = write_message(msgbuf.buf, msgbuf.len, + git_path_merge_msg(), 0); commit_list_insert(base, &common); commit_list_insert(next, &remotes); - res |= try_merge_command(opts->strategy, opts->xopts_nr, opts->xopts, + res |= try_merge_command(opts->strategy, + opts->xopts_nr, (const char **)opts->xopts, common, sha1_to_hex(head), remotes); free_commit_list(common); free_commit_list(remotes); } + strbuf_release(&msgbuf); /* * If the merge was clean or if it failed due to conflict, we write @@ -589,21 +783,20 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) * However, if the merge did not even start, then we don't want to * write it at all. */ - if (opts->action == REPLAY_PICK && !opts->no_commit && (res == 0 || res == 1) && + if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) && update_ref(NULL, "CHERRY_PICK_HEAD", commit->object.oid.hash, NULL, REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) res = -1; - if (opts->action == REPLAY_REVERT && ((opts->no_commit && res == 0) || res == 1) && + if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) && update_ref(NULL, "REVERT_HEAD", commit->object.oid.hash, NULL, REF_NODEREF, UPDATE_REFS_MSG_ON_ERR)) res = -1; if (res) { - error(opts->action == REPLAY_REVERT + error(command == TODO_REVERT ? _("could not revert %s... %s") : _("could not apply %s... %s"), - find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV), - msg.subject); + short_commit_name(commit), msg.subject); print_advice(res == 1, opts); rerere(opts->allow_rerere_auto); goto leave; @@ -615,7 +808,8 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) goto leave; } if (!opts->no_commit) - res = run_git_commit(git_path_merge_msg(), opts, allow); + res = run_git_commit(opts->edit ? NULL : git_path_merge_msg(), + opts, allow, opts->edit, 0, 0); leave: free_message(commit, &msg); @@ -647,133 +841,160 @@ static int read_and_refresh_cache(struct replay_opts *opts) if (read_index_preload(&the_index, NULL) < 0) { rollback_lock_file(&index_lock); return error(_("git %s: failed to read the index"), - action_name(opts)); + _(action_name(opts))); } refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL); if (the_index.cache_changed && index_fd >= 0) { if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) { rollback_lock_file(&index_lock); return error(_("git %s: failed to refresh the index"), - action_name(opts)); + _(action_name(opts))); } } rollback_lock_file(&index_lock); return 0; } -static int format_todo(struct strbuf *buf, struct commit_list *todo_list, - struct replay_opts *opts) +struct todo_item { + enum todo_command command; + struct commit *commit; + const char *arg; + int arg_len; + size_t offset_in_buf; +}; + +struct todo_list { + struct strbuf buf; + struct todo_item *items; + int nr, alloc, current; +}; + +#define TODO_LIST_INIT { STRBUF_INIT } + +static void todo_list_release(struct todo_list *todo_list) { - struct commit_list *cur = NULL; - const char *sha1_abbrev = NULL; - const char *action_str = opts->action == REPLAY_REVERT ? "revert" : "pick"; - const char *subject; - int subject_len; + strbuf_release(&todo_list->buf); + free(todo_list->items); + todo_list->items = NULL; + todo_list->nr = todo_list->alloc = 0; +} - for (cur = todo_list; cur; cur = cur->next) { - const char *commit_buffer = get_commit_buffer(cur->item, NULL); - sha1_abbrev = find_unique_abbrev(cur->item->object.oid.hash, DEFAULT_ABBREV); - subject_len = find_commit_subject(commit_buffer, &subject); - strbuf_addf(buf, "%s %s %.*s\n", action_str, sha1_abbrev, - subject_len, subject); - unuse_commit_buffer(cur->item, commit_buffer); - } - return 0; +static struct todo_item *append_new_todo(struct todo_list *todo_list) +{ + ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc); + return todo_list->items + todo_list->nr++; } -static struct commit *parse_insn_line(char *bol, char *eol, struct replay_opts *opts) +static int parse_insn_line(struct todo_item *item, const char *bol, char *eol) { unsigned char commit_sha1[20]; - enum replay_action action; char *end_of_object_name; - int saved, status, padding; - - if (starts_with(bol, "pick")) { - action = REPLAY_PICK; - bol += strlen("pick"); - } else if (starts_with(bol, "revert")) { - action = REPLAY_REVERT; - bol += strlen("revert"); - } else - return NULL; + int i, saved, status, padding; + + /* left-trim */ + bol += strspn(bol, " \t"); + + for (i = 0; i < ARRAY_SIZE(todo_command_strings); i++) + if (skip_prefix(bol, todo_command_strings[i], &bol)) { + item->command = i; + break; + } + if (i >= ARRAY_SIZE(todo_command_strings)) + return -1; /* Eat up extra spaces/ tabs before object name */ padding = strspn(bol, " \t"); if (!padding) - return NULL; + return -1; bol += padding; - end_of_object_name = bol + strcspn(bol, " \t\n"); + end_of_object_name = (char *) bol + strcspn(bol, " \t\n"); saved = *end_of_object_name; *end_of_object_name = '\0'; status = get_sha1(bol, commit_sha1); *end_of_object_name = saved; - /* - * Verify that the action matches up with the one in - * opts; we don't support arbitrary instructions - */ - if (action != opts->action) { - if (action == REPLAY_REVERT) - error((opts->action == REPLAY_REVERT) - ? _("Cannot revert during another revert.") - : _("Cannot revert during a cherry-pick.")); - else - error((opts->action == REPLAY_REVERT) - ? _("Cannot cherry-pick during a revert.") - : _("Cannot cherry-pick during another cherry-pick.")); - return NULL; - } + item->arg = end_of_object_name + strspn(end_of_object_name, " \t"); + item->arg_len = (int)(eol - item->arg); if (status < 0) - return NULL; + return -1; - return lookup_commit_reference(commit_sha1); + item->commit = lookup_commit_reference(commit_sha1); + return !item->commit; } -static int parse_insn_buffer(char *buf, struct commit_list **todo_list, - struct replay_opts *opts) +static int parse_insn_buffer(char *buf, struct todo_list *todo_list) { - struct commit_list **next = todo_list; - struct commit *commit; - char *p = buf; - int i; + struct todo_item *item; + char *p = buf, *next_p; + int i, res = 0; - for (i = 1; *p; i++) { + for (i = 1; *p; i++, p = next_p) { char *eol = strchrnul(p, '\n'); - commit = parse_insn_line(p, eol, opts); - if (!commit) - return error(_("Could not parse line %d."), i); - next = commit_list_append(commit, next); - p = *eol ? eol + 1 : eol; + + next_p = *eol ? eol + 1 /* skip LF */ : eol; + + if (p != eol && eol[-1] == '\r') + eol--; /* strip Carriage Return */ + + item = append_new_todo(todo_list); + item->offset_in_buf = p - todo_list->buf.buf; + if (parse_insn_line(item, p, eol)) { + res = error(_("invalid line %d: %.*s"), + i, (int)(eol - p), p); + item->command = -1; + } } - if (!*todo_list) - return error(_("No commits parsed.")); - return 0; + if (!todo_list->nr) + return error(_("no commits parsed.")); + return res; } -static int read_populate_todo(struct commit_list **todo_list, +static int read_populate_todo(struct todo_list *todo_list, struct replay_opts *opts) { - struct strbuf buf = STRBUF_INIT; + const char *todo_file = get_todo_path(opts); int fd, res; - fd = open(git_path_todo_file(), O_RDONLY); + strbuf_reset(&todo_list->buf); + fd = open(todo_file, O_RDONLY); if (fd < 0) - return error_errno(_("Could not open %s"), - git_path_todo_file()); - if (strbuf_read(&buf, fd, 0) < 0) { + return error_errno(_("could not open '%s'"), todo_file); + if (strbuf_read(&todo_list->buf, fd, 0) < 0) { close(fd); - strbuf_release(&buf); - return error(_("Could not read %s."), git_path_todo_file()); + return error(_("could not read '%s'."), todo_file); } close(fd); - res = parse_insn_buffer(buf.buf, todo_list, opts); - strbuf_release(&buf); + res = parse_insn_buffer(todo_list->buf.buf, todo_list); if (res) - return error(_("Unusable instruction sheet: %s"), - git_path_todo_file()); + return error(_("unusable instruction sheet: '%s'"), todo_file); + + if (!is_rebase_i(opts)) { + enum todo_command valid = + opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT; + int i; + + for (i = 0; i < todo_list->nr; i++) + if (valid == todo_list->items[i].command) + continue; + else if (valid == TODO_PICK) + return error(_("cannot cherry-pick during a revert.")); + else + return error(_("cannot revert during a cherry-pick.")); + } + + return 0; +} + +static int git_config_string_dup(char **dest, + const char *var, const char *value) +{ + if (!value) + return config_error_nonbool(var); + free(*dest); + *dest = xstrdup(value); return 0; } @@ -797,23 +1018,39 @@ static int populate_opts_cb(const char *key, const char *value, void *data) else if (!strcmp(key, "options.mainline")) opts->mainline = git_config_int(key, value); else if (!strcmp(key, "options.strategy")) - git_config_string(&opts->strategy, key, value); + git_config_string_dup(&opts->strategy, key, value); else if (!strcmp(key, "options.gpg-sign")) - git_config_string(&opts->gpg_sign, key, value); + git_config_string_dup(&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); } else - return error(_("Invalid key: %s"), key); + return error(_("invalid key: %s"), key); if (!error_flag) - return error(_("Invalid value for %s: %s"), key, value); + return error(_("invalid value for %s: %s"), key, value); return 0; } -static int read_populate_opts(struct replay_opts **opts) +static int read_populate_opts(struct replay_opts *opts) { + if (is_rebase_i(opts)) { + struct strbuf buf = STRBUF_INIT; + + if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) { + if (!starts_with(buf.buf, "-S")) + strbuf_reset(&buf); + else { + free(opts->gpg_sign); + opts->gpg_sign = xstrdup(buf.buf + 2); + } + } + strbuf_release(&buf); + + return 0; + } + if (!file_exists(git_path_opts_file())) return 0; /* @@ -822,24 +1059,39 @@ static int read_populate_opts(struct replay_opts **opts) * about this case, though, because we wrote that file ourselves, so we * are pretty certain that it is syntactically correct. */ - if (git_config_from_file(populate_opts_cb, git_path_opts_file(), *opts) < 0) - return error(_("Malformed options sheet: %s"), + if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0) + return error(_("malformed options sheet: '%s'"), git_path_opts_file()); return 0; } -static int walk_revs_populate_todo(struct commit_list **todo_list, +static int walk_revs_populate_todo(struct todo_list *todo_list, struct replay_opts *opts) { + enum todo_command command = opts->action == REPLAY_PICK ? + TODO_PICK : TODO_REVERT; + const char *command_string = todo_command_strings[command]; struct commit *commit; - struct commit_list **next; if (prepare_revs(opts)) return -1; - next = todo_list; - while ((commit = get_revision(opts->revs))) - next = commit_list_append(commit, next); + while ((commit = get_revision(opts->revs))) { + struct todo_item *item = append_new_todo(todo_list); + const char *commit_buffer = get_commit_buffer(commit, NULL); + const char *subject; + int subject_len; + + item->command = command; + item->commit = commit; + item->arg = NULL; + item->arg_len = 0; + item->offset_in_buf = todo_list->buf.len; + subject_len = find_commit_subject(commit_buffer, &subject); + strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string, + short_commit_name(commit), subject_len, subject); + unuse_commit_buffer(commit, commit_buffer); + } return 0; } @@ -851,7 +1103,7 @@ static int create_seq_dir(void) return -1; } else if (mkdir(git_path_seq_dir(), 0777) < 0) - return error_errno(_("Could not create sequencer directory %s"), + return error_errno(_("could not create sequencer directory '%s'"), git_path_seq_dir()); return 0; } @@ -865,17 +1117,17 @@ static int save_head(const char *head) fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0); if (fd < 0) { rollback_lock_file(&head_lock); - return error_errno(_("Could not lock HEAD")); + return error_errno(_("could not lock HEAD")); } strbuf_addf(&buf, "%s\n", head); if (write_in_full(fd, buf.buf, buf.len) < 0) { rollback_lock_file(&head_lock); - return error_errno(_("Could not write to %s"), + return error_errno(_("could not write to '%s'"), git_path_head_file()); } if (commit_lock_file(&head_lock) < 0) { rollback_lock_file(&head_lock); - return error(_("Error wrapping up %s."), git_path_head_file()); + return error(_("failed to finalize '%s'."), git_path_head_file()); } return 0; } @@ -904,7 +1156,7 @@ static int rollback_single_pick(void) return reset_for_rollback(head_sha1); } -static int sequencer_rollback(struct replay_opts *opts) +int sequencer_rollback(struct replay_opts *opts) { FILE *f; unsigned char sha1[20]; @@ -920,9 +1172,9 @@ static int sequencer_rollback(struct replay_opts *opts) return rollback_single_pick(); } if (!f) - return error_errno(_("cannot open %s"), git_path_head_file()); + return error_errno(_("cannot open '%s'"), git_path_head_file()); if (strbuf_getline_lf(&buf, f)) { - error(_("cannot read %s: %s"), git_path_head_file(), + error(_("cannot read '%s': %s"), git_path_head_file(), ferror(f) ? strerror(errno) : _("unexpected end of file")); fclose(f); goto fail; @@ -939,38 +1191,29 @@ static int sequencer_rollback(struct replay_opts *opts) } if (reset_for_rollback(sha1)) goto fail; - remove_sequencer_state(); strbuf_release(&buf); - return 0; + return sequencer_remove_state(opts); fail: strbuf_release(&buf); return -1; } -static int save_todo(struct commit_list *todo_list, struct replay_opts *opts) +static int save_todo(struct todo_list *todo_list, struct replay_opts *opts) { static struct lock_file todo_lock; - struct strbuf buf = STRBUF_INIT; - int fd; + const char *todo_path = get_todo_path(opts); + int next = todo_list->current, offset, fd; - fd = hold_lock_file_for_update(&todo_lock, git_path_todo_file(), 0); + fd = hold_lock_file_for_update(&todo_lock, todo_path, 0); if (fd < 0) - return error_errno(_("Could not lock '%s'"), - git_path_todo_file()); - if (format_todo(&buf, todo_list, opts) < 0) { - strbuf_release(&buf); - return error(_("Could not format %s."), git_path_todo_file()); - } - if (write_in_full(fd, buf.buf, buf.len) < 0) { - strbuf_release(&buf); - return error_errno(_("Could not write to %s"), - git_path_todo_file()); - } - if (commit_lock_file(&todo_lock) < 0) { - strbuf_release(&buf); - return error(_("Error wrapping up %s."), git_path_todo_file()); - } - strbuf_release(&buf); + return error_errno(_("could not lock '%s'"), todo_path); + offset = next < todo_list->nr ? + todo_list->items[next].offset_in_buf : todo_list->buf.len; + if (write_in_full(fd, todo_list->buf.buf + offset, + todo_list->buf.len - offset) < 0) + return error_errno(_("could not write to '%s'"), todo_path); + if (commit_lock_file(&todo_lock) < 0) + return error(_("failed to finalize '%s'."), todo_path); return 0; } @@ -1009,9 +1252,8 @@ static int save_opts(struct replay_opts *opts) return res; } -static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts) +static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts) { - struct commit_list *cur; int res; setenv(GIT_REFLOG_ACTION, action_name(opts), 0); @@ -1021,10 +1263,12 @@ static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts) if (read_and_refresh_cache(opts)) return -1; - for (cur = todo_list; cur; cur = cur->next) { - if (save_todo(cur, opts)) + while (todo_list->current < todo_list->nr) { + struct todo_item *item = todo_list->items + todo_list->current; + if (save_todo(todo_list, opts)) return -1; - res = do_pick_commit(cur->item, opts); + res = do_pick_commit(item->command, item->commit, opts); + todo_list->current++; if (res) return res; } @@ -1033,8 +1277,7 @@ static int pick_commits(struct commit_list *todo_list, struct replay_opts *opts) * Sequence of picks finished successfully; cleanup by * removing the .git/sequencer directory */ - remove_sequencer_state(); - return 0; + return sequencer_remove_state(opts); } static int continue_single_pick(void) @@ -1047,61 +1290,56 @@ static int continue_single_pick(void) return run_command_v_opt(argv, RUN_GIT_CMD); } -static int sequencer_continue(struct replay_opts *opts) +int sequencer_continue(struct replay_opts *opts) { - struct commit_list *todo_list = NULL; + struct todo_list todo_list = TODO_LIST_INIT; + int res; - if (!file_exists(git_path_todo_file())) + if (read_and_refresh_cache(opts)) + return -1; + + if (!file_exists(get_todo_path(opts))) return continue_single_pick(); - if (read_populate_opts(&opts) || - read_populate_todo(&todo_list, opts)) + if (read_populate_opts(opts)) return -1; + if ((res = read_populate_todo(&todo_list, opts))) + goto release_todo_list; /* Verify that the conflict has been resolved */ if (file_exists(git_path_cherry_pick_head()) || file_exists(git_path_revert_head())) { - int ret = continue_single_pick(); - if (ret) - return ret; + res = continue_single_pick(); + if (res) + goto release_todo_list; } - if (index_differs_from("HEAD", 0)) - return error_dirty_index(opts); - todo_list = todo_list->next; - return pick_commits(todo_list, opts); + if (index_differs_from("HEAD", 0, 0)) { + res = error_dirty_index(opts); + goto release_todo_list; + } + todo_list.current++; + res = pick_commits(&todo_list, opts); +release_todo_list: + todo_list_release(&todo_list); + return res; } static int single_pick(struct commit *cmit, struct replay_opts *opts) { setenv(GIT_REFLOG_ACTION, action_name(opts), 0); - return do_pick_commit(cmit, opts); + return do_pick_commit(opts->action == REPLAY_PICK ? + TODO_PICK : TODO_REVERT, cmit, opts); } int sequencer_pick_revisions(struct replay_opts *opts) { - struct commit_list *todo_list = NULL; + struct todo_list todo_list = TODO_LIST_INIT; unsigned char sha1[20]; - int i; - - if (opts->subcommand == REPLAY_NONE) - assert(opts->revs); + int i, res; + assert(opts->revs); if (read_and_refresh_cache(opts)) return -1; - /* - * Decide what to do depending on the arguments; a fresh - * cherry-pick should be handled differently from an existing - * one that is being continued - */ - if (opts->subcommand == REPLAY_REMOVE_STATE) { - remove_sequencer_state(); - return 0; - } - if (opts->subcommand == REPLAY_ROLLBACK) - return sequencer_rollback(opts); - if (opts->subcommand == REPLAY_CONTINUE) - return sequencer_continue(opts); - for (i = 0; i < opts->revs->pending.nr; i++) { unsigned char sha1[20]; const char *name = opts->revs->pending.objects[i].name; @@ -1150,12 +1388,14 @@ int sequencer_pick_revisions(struct replay_opts *opts) create_seq_dir() < 0) return -1; if (get_sha1("HEAD", sha1) && (opts->action == REPLAY_REVERT)) - return error(_("Can't revert as initial commit")); + return error(_("can't revert as initial commit")); if (save_head(sha1_to_hex(sha1))) return -1; if (save_opts(opts)) return -1; - return pick_commits(todo_list, opts); + res = pick_commits(&todo_list, opts); + todo_list_release(&todo_list); + return res; } void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag) diff --git a/sequencer.h b/sequencer.h index 5ed5cb1d97..7a513c576b 100644 --- a/sequencer.h +++ b/sequencer.h @@ -1,10 +1,7 @@ #ifndef SEQUENCER_H #define SEQUENCER_H -#define SEQ_DIR "sequencer" -#define SEQ_HEAD_FILE "sequencer/head" -#define SEQ_TODO_FILE "sequencer/todo" -#define SEQ_OPTS_FILE "sequencer/opts" +const char *git_path_seq_dir(void); #define APPEND_SIGNOFF_DEDUP (1u << 0) @@ -13,16 +10,8 @@ enum replay_action { REPLAY_PICK }; -enum replay_subcommand { - REPLAY_NONE, - REPLAY_REMOVE_STATE, - REPLAY_CONTINUE, - REPLAY_ROLLBACK -}; - struct replay_opts { enum replay_action action; - enum replay_subcommand subcommand; /* Boolean options */ int edit; @@ -37,18 +26,22 @@ struct replay_opts { int mainline; - const char *gpg_sign; + char *gpg_sign; /* Merge strategy */ - const char *strategy; - const char **xopts; + char *strategy; + char **xopts; size_t xopts_nr, xopts_alloc; /* Only used by REPLAY_NONE */ struct rev_info *revs; }; +#define REPLAY_OPTS_INIT { -1 } int sequencer_pick_revisions(struct replay_opts *opts); +int sequencer_continue(struct replay_opts *opts); +int sequencer_rollback(struct replay_opts *opts); +int sequencer_remove_state(struct replay_opts *opts); extern const char sign_off_header[]; diff --git a/sha1_file.c b/sha1_file.c index 309e87d987..5457314e6a 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -172,36 +172,42 @@ enum scld_error safe_create_leading_directories_const(const char *path) return result; } -static void fill_sha1_path(char *pathbuf, const unsigned char *sha1) +static void fill_sha1_path(struct strbuf *buf, const unsigned char *sha1) { int i; for (i = 0; i < 20; i++) { static char hex[] = "0123456789abcdef"; unsigned int val = sha1[i]; - char *pos = pathbuf + i*2 + (i > 0); - *pos++ = hex[val >> 4]; - *pos = hex[val & 0xf]; + strbuf_addch(buf, hex[val >> 4]); + strbuf_addch(buf, hex[val & 0xf]); + if (!i) + strbuf_addch(buf, '/'); } } const char *sha1_file_name(const unsigned char *sha1) { - static char buf[PATH_MAX]; - const char *objdir; - int len; + static struct strbuf buf = STRBUF_INIT; + + strbuf_reset(&buf); + strbuf_addf(&buf, "%s/", get_object_directory()); - objdir = get_object_directory(); - len = strlen(objdir); + fill_sha1_path(&buf, sha1); + return buf.buf; +} - /* '/' + sha1(2) + '/' + sha1(38) + '\0' */ - if (len + 43 > PATH_MAX) - die("insanely long object directory %s", objdir); - memcpy(buf, objdir, len); - buf[len] = '/'; - buf[len+3] = '/'; - buf[len+42] = '\0'; - fill_sha1_path(buf + len + 1, sha1); - return buf; +struct strbuf *alt_scratch_buf(struct alternate_object_database *alt) +{ + strbuf_setlen(&alt->scratch, alt->base_len); + return &alt->scratch; +} + +static const char *alt_sha1_path(struct alternate_object_database *alt, + const unsigned char *sha1) +{ + struct strbuf *buf = alt_scratch_buf(alt); + fill_sha1_path(buf, sha1); + return buf->buf; } /* @@ -235,6 +241,35 @@ struct alternate_object_database *alt_odb_list; static struct alternate_object_database **alt_odb_tail; /* + * Return non-zero iff the path is usable as an alternate object database. + */ +static int alt_odb_usable(struct strbuf *path, const char *normalized_objdir) +{ + struct alternate_object_database *alt; + + /* Detect cases where alternate disappeared */ + if (!is_directory(path->buf)) { + error("object directory %s does not exist; " + "check .git/objects/info/alternates.", + path->buf); + return 0; + } + + /* + * Prevent the common mistake of listing the same + * thing twice, or object directory itself. + */ + for (alt = alt_odb_list; alt; alt = alt->next) { + if (!fspathcmp(path->buf, alt->path)) + return 0; + } + if (!fspathcmp(path->buf, normalized_objdir)) + return 0; + + return 1; +} + +/* * Prepare alternate object database registry. * * The variable alt_odb_list points at the list of struct @@ -253,8 +288,6 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, int depth, const char *normalized_objdir) { struct alternate_object_database *ent; - struct alternate_object_database *alt; - size_t pfxlen, entlen; struct strbuf pathbuf = STRBUF_INIT; if (!is_absolute_path(entry) && relative_base) { @@ -263,49 +296,26 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, } strbuf_addstr(&pathbuf, entry); - normalize_path_copy(pathbuf.buf, pathbuf.buf); - - pfxlen = strlen(pathbuf.buf); + if (strbuf_normalize_path(&pathbuf) < 0) { + error("unable to normalize alternate object path: %s", + pathbuf.buf); + strbuf_release(&pathbuf); + return -1; + } /* * The trailing slash after the directory name is given by * this function at the end. Remove duplicates. */ - while (pfxlen && pathbuf.buf[pfxlen-1] == '/') - pfxlen -= 1; - - entlen = st_add(pfxlen, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */ - ent = xmalloc(st_add(sizeof(*ent), entlen)); - memcpy(ent->base, pathbuf.buf, pfxlen); - strbuf_release(&pathbuf); + while (pathbuf.len && pathbuf.buf[pathbuf.len - 1] == '/') + strbuf_setlen(&pathbuf, pathbuf.len - 1); - ent->name = ent->base + pfxlen + 1; - ent->base[pfxlen + 3] = '/'; - ent->base[pfxlen] = ent->base[entlen-1] = 0; - - /* Detect cases where alternate disappeared */ - if (!is_directory(ent->base)) { - error("object directory %s does not exist; " - "check .git/objects/info/alternates.", - ent->base); - free(ent); + if (!alt_odb_usable(&pathbuf, normalized_objdir)) { + strbuf_release(&pathbuf); return -1; } - /* Prevent the common mistake of listing the same - * thing twice, or object directory itself. - */ - for (alt = alt_odb_list; alt; alt = alt->next) { - if (pfxlen == alt->name - alt->base - 1 && - !memcmp(ent->base, alt->base, pfxlen)) { - free(ent); - return -1; - } - } - if (!fspathcmp(ent->base, normalized_objdir)) { - free(ent); - return -1; - } + ent = alloc_alt_odb(pathbuf.buf); /* add the alternate entry */ *alt_odb_tail = ent; @@ -313,10 +323,9 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, ent->next = NULL; /* recursively add alternates */ - read_info_alternates(ent->base, depth + 1); - - ent->base[pfxlen] = '/'; + read_info_alternates(pathbuf.buf, depth + 1); + strbuf_release(&pathbuf); return 0; } @@ -335,7 +344,9 @@ static void link_alt_odb_entries(const char *alt, int len, int sep, } strbuf_add_absolute_path(&objdirbuf, get_object_directory()); - normalize_path_copy(objdirbuf.buf, objdirbuf.buf); + if (strbuf_normalize_path(&objdirbuf) < 0) + die("unable to normalize object directory: %s", + objdirbuf.buf); alt_copy = xmemdupz(alt, len); string_list_split_in_place(&entries, alt_copy, sep, -1); @@ -343,12 +354,7 @@ static void link_alt_odb_entries(const char *alt, int len, int sep, const char *entry = entries.items[i].string; if (entry[0] == '\0' || entry[0] == '#') continue; - if (!is_absolute_path(entry) && depth) { - error("%s: ignoring relative alternate object store %s", - relative_base, entry); - } else { - link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf); - } + link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf); } string_list_clear(&entries, 0); free(alt_copy); @@ -364,7 +370,7 @@ void read_info_alternates(const char * relative_base, int depth) int fd; path = xstrfmt("%s/info/alternates", relative_base); - fd = git_open_noatime(path); + fd = git_open(path); free(path); if (fd < 0) return; @@ -381,6 +387,18 @@ void read_info_alternates(const char * relative_base, int depth) munmap(map, mapsz); } +struct alternate_object_database *alloc_alt_odb(const char *dir) +{ + struct alternate_object_database *ent; + + FLEX_ALLOC_STR(ent, path, dir); + strbuf_init(&ent->scratch, 0); + strbuf_addf(&ent->scratch, "%s/", dir); + ent->base_len = ent->scratch.len; + + return ent; +} + void add_to_alternates_file(const char *reference) { struct lock_file *lock = xcalloc(1, sizeof(struct lock_file)); @@ -426,6 +444,17 @@ void add_to_alternates_file(const char *reference) free(alts); } +void add_to_alternates_memory(const char *reference) +{ + /* + * Make sure alternates are initialized, or else our entry may be + * overwritten when they are. + */ + prepare_alt_odb(); + + link_alt_odb_entries(reference, strlen(reference), '\n', NULL, 0); +} + /* * Compute the exact path an alternate is at and returns it. In case of * error NULL is returned and the human readable error is added to `err` @@ -566,8 +595,8 @@ static int check_and_freshen_nonlocal(const unsigned char *sha1, int freshen) struct alternate_object_database *alt; prepare_alt_odb(); for (alt = alt_odb_list; alt; alt = alt->next) { - fill_sha1_path(alt->name, sha1); - if (check_and_freshen_file(alt->base, freshen)) + const char *path = alt_sha1_path(alt, sha1); + if (check_and_freshen_file(path, freshen)) return 1; } return 0; @@ -634,7 +663,7 @@ static int check_packed_git_idx(const char *path, struct packed_git *p) struct pack_idx_header *hdr; size_t idx_size; uint32_t version, nr, i, *index; - int fd = git_open_noatime(path); + int fd = git_open(path); struct stat st; if (fd < 0) @@ -1040,7 +1069,7 @@ static int open_packed_git_1(struct packed_git *p) while (pack_max_fds <= pack_open_fds && close_one_pack()) ; /* nothing */ - p->pack_fd = git_open_noatime(p->pack_name); + p->pack_fd = git_open(p->pack_name); if (p->pack_fd < 0 || fstat(p->pack_fd, &st)) return -1; pack_open_fds++; @@ -1381,6 +1410,32 @@ static void prepare_packed_git_one(char *objdir, int local) strbuf_release(&path); } +static int approximate_object_count_valid; + +/* + * Give a fast, rough count of the number of objects in the repository. This + * ignores loose objects completely. If you have a lot of them, then either + * you should repack because your performance will be awful, or they are + * all unreachable objects about to be pruned, in which case they're not really + * interesting as a measure of repo size in the first place. + */ +unsigned long approximate_object_count(void) +{ + static unsigned long count; + if (!approximate_object_count_valid) { + struct packed_git *p; + + prepare_packed_git(); + count = 0; + for (p = packed_git; p; p = p->next) { + if (open_pack_index(p)) + continue; + count += p->num_objects; + } + } + return count; +} + static void *get_next_packed_git(const void *p) { return ((const struct packed_git *)p)->next; @@ -1443,11 +1498,8 @@ void prepare_packed_git(void) return; prepare_packed_git_one(get_object_directory(), 1); prepare_alt_odb(); - for (alt = alt_odb_list; alt; alt = alt->next) { - alt->name[-1] = 0; - prepare_packed_git_one(alt->base, 0); - alt->name[-1] = '/'; - } + for (alt = alt_odb_list; alt; alt = alt->next) + prepare_packed_git_one(alt->path, 0); rearrange_packed_git(); prepare_packed_git_mru(); prepare_packed_git_run_once = 1; @@ -1455,6 +1507,7 @@ void prepare_packed_git(void) void reprepare_packed_git(void) { + approximate_object_count_valid = 0; prepare_packed_git_run_once = 0; prepare_packed_git(); } @@ -1533,9 +1586,9 @@ int check_sha1_signature(const unsigned char *sha1, void *map, return hashcmp(sha1, real_sha1) ? -1 : 0; } -int git_open_noatime(const char *name) +int git_open(const char *name) { - static int sha1_file_open_flag = O_NOATIME; + static int sha1_file_open_flag = O_NOATIME | O_CLOEXEC; for (;;) { int fd; @@ -1545,12 +1598,17 @@ int git_open_noatime(const char *name) if (fd >= 0) return fd; - /* Might the failure be due to O_NOATIME? */ - if (errno != ENOENT && sha1_file_open_flag) { - sha1_file_open_flag = 0; + /* Try again w/o O_CLOEXEC: the kernel might not support it */ + if ((sha1_file_open_flag & O_CLOEXEC) && errno == EINVAL) { + sha1_file_open_flag &= ~O_CLOEXEC; continue; } + /* Might the failure be due to O_NOATIME? */ + if (errno != ENOENT && (sha1_file_open_flag & O_NOATIME)) { + sha1_file_open_flag &= ~O_NOATIME; + continue; + } return -1; } } @@ -1565,8 +1623,8 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st) prepare_alt_odb(); errno = ENOENT; for (alt = alt_odb_list; alt; alt = alt->next) { - fill_sha1_path(alt->name, sha1); - if (!lstat(alt->base, st)) + const char *path = alt_sha1_path(alt, sha1); + if (!lstat(path, st)) return 0; } @@ -1579,15 +1637,15 @@ static int open_sha1_file(const unsigned char *sha1) struct alternate_object_database *alt; int most_interesting_errno; - fd = git_open_noatime(sha1_file_name(sha1)); + fd = git_open(sha1_file_name(sha1)); if (fd >= 0) return fd; most_interesting_errno = errno; prepare_alt_odb(); for (alt = alt_odb_list; alt; alt = alt->next) { - fill_sha1_path(alt->name, sha1); - fd = git_open_noatime(alt->base); + const char *path = alt_sha1_path(alt, sha1); + fd = git_open(path); if (fd >= 0) return fd; if (most_interesting_errno == ENOENT) @@ -3309,6 +3367,11 @@ int has_object_file(const struct object_id *oid) return has_sha1_file(oid->hash); } +int has_object_file_with_flags(const struct object_id *oid, int flags) +{ + return has_sha1_file_with_flags(oid->hash, flags); +} + static void check_tree(const void *buf, size_t size) { struct tree_desc desc; @@ -3648,8 +3711,7 @@ static int loose_from_alt_odb(struct alternate_object_database *alt, struct strbuf buf = STRBUF_INIT; int r; - /* copy base not including trailing '/' */ - strbuf_add(&buf, alt->base, alt->name - alt->base - 1); + strbuf_addstr(&buf, alt->path); r = for_each_loose_file_in_objdir_buf(&buf, data->cb, NULL, NULL, data->data); diff --git a/sha1_name.c b/sha1_name.c index 3b647fd7cf..06409a3845 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -91,25 +91,18 @@ static void find_short_object_filename(struct disambiguate_state *ds) * alt->name/alt->base while iterating over the * object databases including our own. */ - const char *objdir = get_object_directory(); - size_t objdir_len = strlen(objdir); - fakeent = xmalloc(st_add3(sizeof(*fakeent), objdir_len, 43)); - memcpy(fakeent->base, objdir, objdir_len); - fakeent->name = fakeent->base + objdir_len + 1; - fakeent->name[-1] = '/'; + fakeent = alloc_alt_odb(get_object_directory()); } fakeent->next = alt_odb_list; xsnprintf(hex, sizeof(hex), "%.2s", ds->hex_pfx); for (alt = fakeent; alt && !ds->ambiguous; alt = alt->next) { + struct strbuf *buf = alt_scratch_buf(alt); struct dirent *de; DIR *dir; - /* - * every alt_odb struct has 42 extra bytes after the base - * for exactly this purpose - */ - xsnprintf(alt->name, 42, "%.2s/", ds->hex_pfx); - dir = opendir(alt->base); + + strbuf_addf(buf, "%.2s/", ds->hex_pfx); + dir = opendir(buf->buf); if (!dir) continue; @@ -455,10 +448,46 @@ int for_each_abbrev(const char *prefix, each_abbrev_fn fn, void *cb_data) return ret; } +/* + * Return the slot of the most-significant bit set in "val". There are various + * ways to do this quickly with fls() or __builtin_clzl(), but speed is + * probably not a big deal here. + */ +static unsigned msb(unsigned long val) +{ + unsigned r = 0; + while (val >>= 1) + r++; + return r; +} + int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len) { int status, exists; + if (len < 0) { + unsigned long count = approximate_object_count(); + /* + * Add one because the MSB only tells us the highest bit set, + * not including the value of all the _other_ bits (so "15" + * is only one off of 2^4, but the MSB is the 3rd bit. + */ + len = msb(count) + 1; + /* + * We now know we have on the order of 2^len objects, which + * expects a collision at 2^(len/2). But we also care about hex + * chars, not bits, and there are 4 bits per hex. So all + * together we need to divide by 2; but we also want to round + * odd numbers up, hence adding one before dividing. + */ + len = (len + 1) / 2; + /* + * For very small repos, we stick with our regular fallback. + */ + if (len < FALLBACK_DEFAULT_ABBREV) + len = FALLBACK_DEFAULT_ABBREV; + } + sha1_to_hex_r(hex, sha1); if (len == 40 || !len) return 40; @@ -479,7 +508,9 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len) const char *find_unique_abbrev(const unsigned char *sha1, int len) { - static char hex[GIT_SHA1_HEXSZ + 1]; + static int bufno; + static char hexbuffer[4][GIT_SHA1_HEXSZ + 1]; + char *hex = hexbuffer[3 & ++bufno]; find_unique_abbrev_r(hex, sha1, len); return hex; } @@ -338,7 +338,7 @@ static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *c { int fd = *(int *)cb; if (graft->nr_parent == -1) - packet_write(fd, "shallow %s\n", oid_to_hex(&graft->oid)); + packet_write_fmt(fd, "shallow %s\n", oid_to_hex(&graft->oid)); return 0; } @@ -870,3 +870,23 @@ void strbuf_stripspace(struct strbuf *sb, int skip_comments) strbuf_setlen(sb, j); } + +int strbuf_normalize_path(struct strbuf *src) +{ + struct strbuf dst = STRBUF_INIT; + + strbuf_grow(&dst, src->len); + if (normalize_path_copy(dst.buf, src->buf) < 0) { + strbuf_release(&dst); + return -1; + } + + /* + * normalize_path does not tell us the new length, so we have to + * compute it by looking for the new NUL it placed + */ + strbuf_setlen(&dst, strlen(dst.buf)); + strbuf_swap(src, &dst); + strbuf_release(&dst); + return 0; +} @@ -443,6 +443,14 @@ extern int strbuf_getcwd(struct strbuf *sb); */ extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path); + +/** + * Normalize in-place the path contained in the strbuf. See + * normalize_path_copy() for details. If an error occurs, the contents of "sb" + * are left untouched, and -1 is returned. + */ +extern int strbuf_normalize_path(struct strbuf *sb); + /** * Strip whitespace from a buffer. The second parameter controls if * comments are considered contents to be removed or not. diff --git a/submodule.c b/submodule.c index 2de06a3351..6f7d883de9 100644 --- a/submodule.c +++ b/submodule.c @@ -123,9 +123,7 @@ void stage_updated_gitmodules(void) static int add_submodule_odb(const char *path) { struct strbuf objects_directory = STRBUF_INIT; - struct alternate_object_database *alt_odb; int ret = 0; - size_t alloc; ret = strbuf_git_path_submodule(&objects_directory, path, "objects/"); if (ret) @@ -134,26 +132,7 @@ static int add_submodule_odb(const char *path) ret = -1; goto done; } - /* avoid adding it twice */ - prepare_alt_odb(); - for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next) - if (alt_odb->name - alt_odb->base == objects_directory.len && - !strncmp(alt_odb->base, objects_directory.buf, - objects_directory.len)) - goto done; - - alloc = st_add(objects_directory.len, 42); /* for "12/345..." sha1 */ - alt_odb = xmalloc(st_add(sizeof(*alt_odb), alloc)); - alt_odb->next = alt_odb_list; - xsnprintf(alt_odb->base, alloc, "%s", objects_directory.buf); - alt_odb->name = alt_odb->base + objects_directory.len; - alt_odb->name[2] = '/'; - alt_odb->name[40] = '\0'; - alt_odb->name[41] = '\0'; - alt_odb_list = alt_odb; - - /* add possible alternates from the submodule */ - read_info_alternates(objects_directory.buf, 0); + add_to_alternates_memory(objects_directory.buf); done: strbuf_release(&objects_directory); return ret; @@ -392,10 +371,9 @@ static void show_submodule_header(FILE *f, const char *path, } output_header: - strbuf_addf(&sb, "%s%sSubmodule %s %s..", line_prefix, meta, path, - find_unique_abbrev(one->hash, DEFAULT_ABBREV)); - if (!fast_backward && !fast_forward) - strbuf_addch(&sb, '.'); + strbuf_addf(&sb, "%s%sSubmodule %s ", line_prefix, meta, path); + strbuf_add_unique_abbrev(&sb, one->hash, DEFAULT_ABBREV); + strbuf_addstr(&sb, (fast_backward || fast_forward) ? ".." : "..."); strbuf_add_unique_abbrev(&sb, two->hash, DEFAULT_ABBREV); if (message) strbuf_addf(&sb, " %s%s\n", message, reset); @@ -153,6 +153,12 @@ appropriately before running "make". As the names depend on the tests' file names, it is safe to run the tests with this option in parallel. +--verbose-log:: + Write verbose output to the same logfile as `--tee`, but do + _not_ write it to stdout. Unlike `--tee --verbose`, this option + is safe to use when stdout is being consumed by a TAP parser + like `prove`. Implies `--tee` and `--verbose`. + --with-dashes:: By default tests are run without dashed forms of commands (like git-commit) in the PATH (it only uses diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c index 44f3290258..7af116d49e 100644 --- a/t/helper/test-dump-cache-tree.c +++ b/t/helper/test-dump-cache-tree.c @@ -58,6 +58,7 @@ int cmd_main(int ac, const char **av) { struct index_state istate; struct cache_tree *another = cache_tree(); + setup_git_directory(); if (read_cache() < 0) die("unable to read index file"); istate = the_index; diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c index 5b2fd09908..27fe0405b8 100644 --- a/t/helper/test-scrap-cache-tree.c +++ b/t/helper/test-scrap-cache-tree.c @@ -7,6 +7,7 @@ static struct lock_file index_lock; int cmd_main(int ac, const char **av) { + setup_git_directory(); hold_locked_index(&index_lock, 1); if (read_cache() < 0) die("unable to read index file"); diff --git a/t/perf/p5550-fetch-tags.sh b/t/perf/p5550-fetch-tags.sh new file mode 100755 index 0000000000..a5dc39f86a --- /dev/null +++ b/t/perf/p5550-fetch-tags.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +test_description='performance of tag-following with many tags + +This tests a fairly pathological case, so rather than rely on a real-world +case, we will construct our own repository. The situation is roughly as +follows. + +The parent repository has a large number of tags which are disconnected from +the rest of history. That makes them candidates for tag-following, but we never +actually grab them (and thus they will impact each subsequent fetch). + +The child repository is a clone of parent, without the tags, and is at least +one commit behind the parent (meaning that we will fetch one object and then +examine the tags to see if they need followed). Furthermore, it has a large +number of packs. + +The exact values of "large" here are somewhat arbitrary; I picked values that +start to show a noticeable performance problem on my machine, but without +taking too long to set up and run the tests. +' +. ./perf-lib.sh + +# make a long nonsense history on branch $1, consisting of $2 commits, each +# with a unique file pointing to the blob at $2. +create_history () { + perl -le ' + my ($branch, $n, $blob) = @ARGV; + for (1..$n) { + print "commit refs/heads/$branch"; + print "committer nobody <nobody@example.com> now"; + print "data 4"; + print "foo"; + print "M 100644 $blob $_"; + } + ' "$@" | + git fast-import --date-format=now +} + +# make a series of tags, one per commit in the revision range given by $@ +create_tags () { + git rev-list "$@" | + perl -lne 'print "create refs/tags/$. $_"' | + git update-ref --stdin +} + +# create $1 nonsense packs, each with a single blob +create_packs () { + perl -le ' + my ($n) = @ARGV; + for (1..$n) { + print "blob"; + print "data <<EOF"; + print "$_"; + print "EOF"; + } + ' "$@" | + git fast-import && + + git cat-file --batch-all-objects --batch-check='%(objectname)' | + while read sha1 + do + echo $sha1 | git pack-objects .git/objects/pack/pack + done +} + +test_expect_success 'create parent and child' ' + git init parent && + git -C parent commit --allow-empty -m base && + git clone parent child && + git -C parent commit --allow-empty -m trigger-fetch +' + +test_expect_success 'populate parent tags' ' + ( + cd parent && + blob=$(echo content | git hash-object -w --stdin) && + create_history cruft 3000 $blob && + create_tags cruft && + git branch -D cruft + ) +' + +test_expect_success 'create child packs' ' + ( + cd child && + git config gc.auto 0 && + git config gc.autopacklimit 0 && + create_packs 500 + ) +' + +test_perf 'fetch' ' + # make sure there is something to fetch on each iteration + git -C child update-ref -d refs/remotes/origin/master && + git -C child fetch +' + +test_done diff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh index f94120a894..71350e0657 100755 --- a/t/t0020-crlf.sh +++ b/t/t0020-crlf.sh @@ -83,7 +83,11 @@ test_expect_success 'safecrlf: print warning only once' ' git add doublewarn && git commit -m "nowarn" && for w in Oh here is CRLFQ in text; do echo $w; done | q_to_cr >doublewarn && - test $(git add doublewarn 2>&1 | grep "CRLF will be replaced by LF" | wc -l) = 1 + git add doublewarn 2>err && + if test_have_prereq C_LOCALE_OUTPUT + then + test $(grep "CRLF will be replaced by LF" err | wc -l) = 1 + fi ' diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index e799e59544..a20b9f58e3 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -4,13 +4,72 @@ test_description='blob conversion via gitattributes' . ./test-lib.sh -cat <<EOF >rot13.sh +TEST_ROOT="$(pwd)" + +cat <<EOF >"$TEST_ROOT/rot13.sh" #!$SHELL_PATH tr \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' \ 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' EOF -chmod +x rot13.sh +chmod +x "$TEST_ROOT/rot13.sh" + +generate_random_characters () { + LEN=$1 + NAME=$2 + test-genrandom some-seed $LEN | + perl -pe "s/./chr((ord($&) % 26) + ord('a'))/sge" >"$TEST_ROOT/$NAME" +} + +file_size () { + cat "$1" | wc -c | sed "s/^[ ]*//" +} + +filter_git () { + rm -f rot13-filter.log && + git "$@" 2>git-stderr.log && + rm -f git-stderr.log +} + +# Compare two files and ensure that `clean` and `smudge` respectively are +# called at least once if specified in the `expect` file. The actual +# invocation count is not relevant because their number can vary. +# c.f. http://public-inbox.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ +test_cmp_count () { + expect=$1 + actual=$2 + for FILE in "$expect" "$actual" + do + sort "$FILE" | uniq -c | sed "s/^[ ]*//" | + sed "s/^\([0-9]\) IN: clean/x IN: clean/" | + sed "s/^\([0-9]\) IN: smudge/x IN: smudge/" >"$FILE.tmp" && + mv "$FILE.tmp" "$FILE" + done && + test_cmp "$expect" "$actual" +} + +# Compare two files but exclude all `clean` invocations because Git can +# call `clean` zero or more times. +# c.f. http://public-inbox.org/git/xmqqshv18i8i.fsf@gitster.mtv.corp.google.com/ +test_cmp_exclude_clean () { + expect=$1 + actual=$2 + for FILE in "$expect" "$actual" + do + grep -v "IN: clean" "$FILE" >"$FILE.tmp" && + mv "$FILE.tmp" "$FILE" + done && + test_cmp "$expect" "$actual" +} + +# Check that the contents of two files are equal and that their rot13 version +# is equal to the committed content. +test_cmp_committed_rot13 () { + test_cmp "$1" "$2" && + "$TEST_ROOT/rot13.sh" <"$1" >expected && + git cat-file blob :"$2" >actual && + test_cmp expected actual +} test_expect_success setup ' git config filter.rot13.smudge ./rot13.sh && @@ -31,15 +90,18 @@ test_expect_success setup ' cat test >test.i && git add test test.t test.i && rm -f test test.t test.i && - git checkout -- test test.t test.i + git checkout -- test test.t test.i && + + echo "content-test2" >test2.o && + echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x.o" ' script='s/^\$Id: \([0-9a-f]*\) \$/\1/p' test_expect_success check ' - cmp test.o test && - cmp test.o test.t && + test_cmp test.o test && + test_cmp test.o test.t && # ident should be stripped in the repository git diff --raw --exit-code :test :test.i && @@ -47,10 +109,10 @@ test_expect_success check ' embedded=$(sed -ne "$script" test.i) && test "z$id" = "z$embedded" && - git cat-file blob :test.t > test.r && + git cat-file blob :test.t >test.r && - ./rot13.sh < test.o > test.t && - cmp test.r test.t + ./rot13.sh <test.o >test.t && + test_cmp test.r test.t ' # If an expanded ident ever gets into the repository, we want to make sure that @@ -130,7 +192,7 @@ test_expect_success 'filter shell-escaped filenames' ' # delete the files and check them out again, using a smudge filter # that will count the args and echo the command-line back to us - git config filter.argc.smudge "sh ./argc.sh %f" && + test_config filter.argc.smudge "sh ./argc.sh %f" && rm "$normal" "$special" && git checkout -- "$normal" "$special" && @@ -141,7 +203,7 @@ test_expect_success 'filter shell-escaped filenames' ' test_cmp expect "$special" && # do the same thing, but with more args in the filter expression - git config filter.argc.smudge "sh ./argc.sh %f --my-extra-arg" && + test_config filter.argc.smudge "sh ./argc.sh %f --my-extra-arg" && rm "$normal" "$special" && git checkout -- "$normal" "$special" && @@ -154,9 +216,9 @@ test_expect_success 'filter shell-escaped filenames' ' ' test_expect_success 'required filter should filter data' ' - git config filter.required.smudge ./rot13.sh && - git config filter.required.clean ./rot13.sh && - git config filter.required.required true && + test_config filter.required.smudge ./rot13.sh && + test_config filter.required.clean ./rot13.sh && + test_config filter.required.required true && echo "*.r filter=required" >.gitattributes && @@ -165,17 +227,17 @@ test_expect_success 'required filter should filter data' ' rm -f test.r && git checkout -- test.r && - cmp test.o test.r && + test_cmp test.o test.r && ./rot13.sh <test.o >expected && git cat-file blob :test.r >actual && - cmp expected actual + test_cmp expected actual ' test_expect_success 'required filter smudge failure' ' - git config filter.failsmudge.smudge false && - git config filter.failsmudge.clean cat && - git config filter.failsmudge.required true && + test_config filter.failsmudge.smudge false && + test_config filter.failsmudge.clean cat && + test_config filter.failsmudge.required true && echo "*.fs filter=failsmudge" >.gitattributes && @@ -186,9 +248,9 @@ test_expect_success 'required filter smudge failure' ' ' test_expect_success 'required filter clean failure' ' - git config filter.failclean.smudge cat && - git config filter.failclean.clean false && - git config filter.failclean.required true && + test_config filter.failclean.smudge cat && + test_config filter.failclean.clean false && + test_config filter.failclean.required true && echo "*.fc filter=failclean" >.gitattributes && @@ -197,8 +259,8 @@ test_expect_success 'required filter clean failure' ' ' test_expect_success 'filtering large input to small output should use little memory' ' - git config filter.devnull.clean "cat >/dev/null" && - git config filter.devnull.required true && + test_config filter.devnull.clean "cat >/dev/null" && + test_config filter.devnull.required true && for i in $(test_seq 1 30); do printf "%1048576d" 1; done >30MB && echo "30MB filter=devnull" >.gitattributes && GIT_MMAP_LIMIT=1m GIT_ALLOC_LIMIT=1m git add 30MB @@ -207,7 +269,7 @@ test_expect_success 'filtering large input to small output should use little mem test_expect_success 'filter that does not read is fine' ' test-genrandom foo $((128 * 1024 + 1)) >big && echo "big filter=epipe" >.gitattributes && - git config filter.epipe.clean "echo xyzzy" && + test_config filter.epipe.clean "echo xyzzy" && git add big && git cat-file blob :big >actual && echo xyzzy >expect && @@ -215,20 +277,20 @@ test_expect_success 'filter that does not read is fine' ' ' test_expect_success EXPENSIVE 'filter large file' ' - git config filter.largefile.smudge cat && - git config filter.largefile.clean cat && + test_config filter.largefile.smudge cat && + test_config filter.largefile.clean cat && for i in $(test_seq 1 2048); do printf "%1048576d" 1; done >2GB && echo "2GB filter=largefile" >.gitattributes && git add 2GB 2>err && - ! test -s err && + test_must_be_empty err && rm -f 2GB && git checkout -- 2GB 2>err && - ! test -s err + test_must_be_empty err ' test_expect_success "filter: clean empty file" ' - git config filter.in-repo-header.clean "echo cleaned && cat" && - git config filter.in-repo-header.smudge "sed 1d" && + test_config filter.in-repo-header.clean "echo cleaned && cat" && + test_config filter.in-repo-header.smudge "sed 1d" && echo "empty-in-worktree filter=in-repo-header" >>.gitattributes && >empty-in-worktree && @@ -240,8 +302,8 @@ test_expect_success "filter: clean empty file" ' ' test_expect_success "filter: smudge empty file" ' - git config filter.empty-in-repo.clean "cat >/dev/null" && - git config filter.empty-in-repo.smudge "echo smudged && cat" && + test_config filter.empty-in-repo.clean "cat >/dev/null" && + test_config filter.empty-in-repo.smudge "echo smudged && cat" && echo "empty-in-repo filter=empty-in-repo" >>.gitattributes && echo dead data walking >empty-in-repo && @@ -279,4 +341,380 @@ test_expect_success 'diff does not reuse worktree files that need cleaning' ' test_line_count = 0 count ' +test_expect_success PERL 'required process filter should filter data' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + test_config_global filter.protocol.required true && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "git-stderr.log" >.gitignore && + echo "*.r filter=protocol" >.gitattributes && + git add . && + git commit . -m "test commit 1" && + git branch empty-branch && + + cp "$TEST_ROOT/test.o" test.r && + cp "$TEST_ROOT/test2.o" test2.r && + mkdir testsubdir && + cp "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r" && + >test4-empty.r && + + S=$(file_size test.r) && + S2=$(file_size test2.r) && + S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x.r") && + + filter_git add . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean test.r $S [OK] -- OUT: $S . [OK] + IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK] + IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK] + IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK] + STOP + EOF + test_cmp_count expected.log rot13-filter.log && + + filter_git commit . -m "test commit 2" && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean test.r $S [OK] -- OUT: $S . [OK] + IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK] + IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK] + IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK] + IN: clean test.r $S [OK] -- OUT: $S . [OK] + IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK] + IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK] + IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK] + STOP + EOF + test_cmp_count expected.log rot13-filter.log && + + rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x.r" && + + filter_git checkout --quiet --no-progress . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK] + IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + filter_git checkout --quiet --no-progress empty-branch && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean test.r $S [OK] -- OUT: $S . [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + filter_git checkout --quiet --no-progress master && + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge test.r $S [OK] -- OUT: $S . [OK] + IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK] + IN: smudge test4-empty.r 0 [OK] -- OUT: 0 [OK] + IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r && + test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r && + test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r" + ) +' + +test_expect_success PERL 'required process filter takes precedence' ' + test_config_global filter.protocol.clean false && + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean" && + test_config_global filter.protocol.required true && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + cp "$TEST_ROOT/test.o" test.r && + S=$(file_size test.r) && + + # Check that the process filter is invoked here + filter_git add . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean test.r $S [OK] -- OUT: $S . [OK] + STOP + EOF + test_cmp_count expected.log rot13-filter.log + ) +' + +test_expect_success PERL 'required process filter should be used only for "clean" operation only' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean" && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + cp "$TEST_ROOT/test.o" test.r && + S=$(file_size test.r) && + + filter_git add . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean test.r $S [OK] -- OUT: $S . [OK] + STOP + EOF + test_cmp_count expected.log rot13-filter.log && + + rm test.r && + + filter_git checkout --quiet --no-progress . && + # If the filter would be used for "smudge", too, we would see + # "IN: smudge test.r 57 [OK] -- OUT: 57 . [OK]" here + cat >expected.log <<-EOF && + START + init handshake complete + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log + ) +' + +test_expect_success PERL 'required process filter should process multiple packets' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + test_config_global filter.protocol.required true && + + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + # Generate data requiring 1, 2, 3 packets + S=65516 && # PKTLINE_DATA_MAXLEN -> Maximal size of a packet + generate_random_characters $(($S )) 1pkt_1__.file && + generate_random_characters $(($S +1)) 2pkt_1+1.file && + generate_random_characters $(($S*2-1)) 2pkt_2-1.file && + generate_random_characters $(($S*2 )) 2pkt_2__.file && + generate_random_characters $(($S*2+1)) 3pkt_2+1.file && + + for FILE in "$TEST_ROOT"/*.file + do + cp "$FILE" . && + "$TEST_ROOT/rot13.sh" <"$FILE" >"$FILE.rot13" + done && + + echo "*.file filter=protocol" >.gitattributes && + filter_git add *.file .gitattributes && + cat >expected.log <<-EOF && + START + init handshake complete + IN: clean 1pkt_1__.file $(($S )) [OK] -- OUT: $(($S )) . [OK] + IN: clean 2pkt_1+1.file $(($S +1)) [OK] -- OUT: $(($S +1)) .. [OK] + IN: clean 2pkt_2-1.file $(($S*2-1)) [OK] -- OUT: $(($S*2-1)) .. [OK] + IN: clean 2pkt_2__.file $(($S*2 )) [OK] -- OUT: $(($S*2 )) .. [OK] + IN: clean 3pkt_2+1.file $(($S*2+1)) [OK] -- OUT: $(($S*2+1)) ... [OK] + STOP + EOF + test_cmp_count expected.log rot13-filter.log && + + rm -f *.file && + + filter_git checkout --quiet --no-progress -- *.file && + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge 1pkt_1__.file $(($S )) [OK] -- OUT: $(($S )) . [OK] + IN: smudge 2pkt_1+1.file $(($S +1)) [OK] -- OUT: $(($S +1)) .. [OK] + IN: smudge 2pkt_2-1.file $(($S*2-1)) [OK] -- OUT: $(($S*2-1)) .. [OK] + IN: smudge 2pkt_2__.file $(($S*2 )) [OK] -- OUT: $(($S*2 )) .. [OK] + IN: smudge 3pkt_2+1.file $(($S*2+1)) [OK] -- OUT: $(($S*2+1)) ... [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + for FILE in *.file + do + test_cmp_committed_rot13 "$TEST_ROOT/$FILE" $FILE + done + ) +' + +test_expect_success PERL 'required process filter with clean error should fail' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + test_config_global filter.protocol.required true && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + + cp "$TEST_ROOT/test.o" test.r && + echo "this is going to fail" >clean-write-fail.r && + echo "content-test3-subdir" >test3.r && + + test_must_fail git add . + ) +' + +test_expect_success PERL 'process filter should restart after unexpected write failure' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + + cp "$TEST_ROOT/test.o" test.r && + cp "$TEST_ROOT/test2.o" test2.r && + echo "this is going to fail" >smudge-write-fail.o && + cp smudge-write-fail.o smudge-write-fail.r && + + S=$(file_size test.r) && + S2=$(file_size test2.r) && + SF=$(file_size smudge-write-fail.r) && + + git add . && + rm -f *.r && + + rm -f rot13-filter.log && + git checkout --quiet --no-progress . 2>git-stderr.log && + + grep "smudge write error at" git-stderr.log && + grep "error: external filter" git-stderr.log && + + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge smudge-write-fail.r $SF [OK] -- OUT: $SF [WRITE FAIL] + START + init handshake complete + IN: smudge test.r $S [OK] -- OUT: $S . [OK] + IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r && + test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r && + + # Smudge failed + ! test_cmp smudge-write-fail.o smudge-write-fail.r && + "$TEST_ROOT/rot13.sh" <smudge-write-fail.o >expected && + git cat-file blob :smudge-write-fail.r >actual && + test_cmp expected actual + ) +' + +test_expect_success PERL 'process filter should not be restarted if it signals an error' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + + cp "$TEST_ROOT/test.o" test.r && + cp "$TEST_ROOT/test2.o" test2.r && + echo "this will cause an error" >error.o && + cp error.o error.r && + + S=$(file_size test.r) && + S2=$(file_size test2.r) && + SE=$(file_size error.r) && + + git add . && + rm -f *.r && + + filter_git checkout --quiet --no-progress . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge error.r $SE [OK] -- OUT: 0 [ERROR] + IN: smudge test.r $S [OK] -- OUT: $S . [OK] + IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r && + test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r && + test_cmp error.o error.r + ) +' + +test_expect_success PERL 'process filter abort stops processing of all further files' ' + test_config_global filter.protocol.process "$TEST_DIRECTORY/t0021/rot13-filter.pl clean smudge" && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + + cp "$TEST_ROOT/test.o" test.r && + cp "$TEST_ROOT/test2.o" test2.r && + echo "error this blob and all future blobs" >abort.o && + cp abort.o abort.r && + + SA=$(file_size abort.r) && + + git add . && + rm -f *.r && + + # Note: This test assumes that Git filters files in alphabetical + # order ("abort.r" before "test.r"). + filter_git checkout --quiet --no-progress . && + cat >expected.log <<-EOF && + START + init handshake complete + IN: smudge abort.r $SA [OK] -- OUT: 0 [ABORT] + STOP + EOF + test_cmp_exclude_clean expected.log rot13-filter.log && + + test_cmp "$TEST_ROOT/test.o" test.r && + test_cmp "$TEST_ROOT/test2.o" test2.r && + test_cmp abort.o abort.r + ) +' + +test_expect_success PERL 'invalid process filter must fail (and not hang!)' ' + test_config_global filter.protocol.process cat && + test_config_global filter.protocol.required true && + rm -rf repo && + mkdir repo && + ( + cd repo && + git init && + + echo "*.r filter=protocol" >.gitattributes && + + cp "$TEST_ROOT/test.o" test.r && + test_must_fail git add . 2>git-stderr.log && + grep "does not support filter protocol version" git-stderr.log + ) +' + test_done diff --git a/t/t0021/rot13-filter.pl b/t/t0021/rot13-filter.pl new file mode 100755 index 0000000000..ae4c50f5c5 --- /dev/null +++ b/t/t0021/rot13-filter.pl @@ -0,0 +1,192 @@ +#!/usr/bin/perl +# +# Example implementation for the Git filter protocol version 2 +# See Documentation/gitattributes.txt, section "Filter Protocol" +# +# The script takes the list of supported protocol capabilities as +# arguments ("clean", "smudge", etc). +# +# This implementation supports special test cases: +# (1) If data with the pathname "clean-write-fail.r" is processed with +# a "clean" operation then the write operation will die. +# (2) If data with the pathname "smudge-write-fail.r" is processed with +# a "smudge" operation then the write operation will die. +# (3) If data with the pathname "error.r" is processed with any +# operation then the filter signals that it cannot or does not want +# to process the file. +# (4) If data with the pathname "abort.r" is processed with any +# operation then the filter signals that it cannot or does not want +# to process the file and any file after that is processed with the +# same command. +# + +use strict; +use warnings; + +my $MAX_PACKET_CONTENT_SIZE = 65516; +my @capabilities = @ARGV; + +open my $debug, ">>", "rot13-filter.log" or die "cannot open log file: $!"; + +sub rot13 { + my $str = shift; + $str =~ y/A-Za-z/N-ZA-Mn-za-m/; + return $str; +} + +sub packet_bin_read { + my $buffer; + my $bytes_read = read STDIN, $buffer, 4; + if ( $bytes_read == 0 ) { + # EOF - Git stopped talking to us! + print $debug "STOP\n"; + exit(); + } + elsif ( $bytes_read != 4 ) { + die "invalid packet: '$buffer'"; + } + my $pkt_size = hex($buffer); + if ( $pkt_size == 0 ) { + return ( 1, "" ); + } + elsif ( $pkt_size > 4 ) { + my $content_size = $pkt_size - 4; + $bytes_read = read STDIN, $buffer, $content_size; + if ( $bytes_read != $content_size ) { + die "invalid packet ($content_size bytes expected; $bytes_read bytes read)"; + } + return ( 0, $buffer ); + } + else { + die "invalid packet size: $pkt_size"; + } +} + +sub packet_txt_read { + my ( $res, $buf ) = packet_bin_read(); + unless ( $buf =~ s/\n$// ) { + die "A non-binary line MUST be terminated by an LF."; + } + return ( $res, $buf ); +} + +sub packet_bin_write { + my $buf = shift; + print STDOUT sprintf( "%04x", length($buf) + 4 ); + print STDOUT $buf; + STDOUT->flush(); +} + +sub packet_txt_write { + packet_bin_write( $_[0] . "\n" ); +} + +sub packet_flush { + print STDOUT sprintf( "%04x", 0 ); + STDOUT->flush(); +} + +print $debug "START\n"; +$debug->flush(); + +( packet_txt_read() eq ( 0, "git-filter-client" ) ) || die "bad initialize"; +( packet_txt_read() eq ( 0, "version=2" ) ) || die "bad version"; +( packet_bin_read() eq ( 1, "" ) ) || die "bad version end"; + +packet_txt_write("git-filter-server"); +packet_txt_write("version=2"); +packet_flush(); + +( packet_txt_read() eq ( 0, "capability=clean" ) ) || die "bad capability"; +( packet_txt_read() eq ( 0, "capability=smudge" ) ) || die "bad capability"; +( packet_bin_read() eq ( 1, "" ) ) || die "bad capability end"; + +foreach (@capabilities) { + packet_txt_write( "capability=" . $_ ); +} +packet_flush(); +print $debug "init handshake complete\n"; +$debug->flush(); + +while (1) { + my ($command) = packet_txt_read() =~ /^command=([^=]+)$/; + print $debug "IN: $command"; + $debug->flush(); + + my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/; + print $debug " $pathname"; + $debug->flush(); + + # Flush + packet_bin_read(); + + my $input = ""; + { + binmode(STDIN); + my $buffer; + my $done = 0; + while ( !$done ) { + ( $done, $buffer ) = packet_bin_read(); + $input .= $buffer; + } + print $debug " " . length($input) . " [OK] -- "; + $debug->flush(); + } + + my $output; + if ( $pathname eq "error.r" or $pathname eq "abort.r" ) { + $output = ""; + } + elsif ( $command eq "clean" and grep( /^clean$/, @capabilities ) ) { + $output = rot13($input); + } + elsif ( $command eq "smudge" and grep( /^smudge$/, @capabilities ) ) { + $output = rot13($input); + } + else { + die "bad command '$command'"; + } + + print $debug "OUT: " . length($output) . " "; + $debug->flush(); + + if ( $pathname eq "error.r" ) { + print $debug "[ERROR]\n"; + $debug->flush(); + packet_txt_write("status=error"); + packet_flush(); + } + elsif ( $pathname eq "abort.r" ) { + print $debug "[ABORT]\n"; + $debug->flush(); + packet_txt_write("status=abort"); + packet_flush(); + } + else { + packet_txt_write("status=success"); + packet_flush(); + + if ( $pathname eq "${command}-write-fail.r" ) { + print $debug "[WRITE FAIL]\n"; + $debug->flush(); + die "${command} write error"; + } + + while ( length($output) > 0 ) { + my $packet = substr( $output, 0, $MAX_PACKET_CONTENT_SIZE ); + packet_bin_write($packet); + # dots represent the number of packets + print $debug "."; + if ( length($output) > $MAX_PACKET_CONTENT_SIZE ) { + $output = substr( $output, $MAX_PACKET_CONTENT_SIZE ); + } + else { + $output = ""; + } + } + packet_flush(); + print $debug " [OK]\n"; + $debug->flush(); + packet_flush(); + } +} diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index db5f60d0c5..74d2cd76fe 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -208,32 +208,15 @@ test_expect_success 'unambiguously abbreviated option' ' ' test_expect_success 'unambiguously abbreviated option with "="' ' - test-parse-options --int=2 >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="integer: 2" --int=2 ' test_expect_success 'ambiguously abbreviated option' ' test_expect_code 129 test-parse-options --strin 123 ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: 123 -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success 'non ambiguous option (after two options it abbreviates)' ' - test-parse-options --st 123 >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="string: 123" --st 123 ' cat >typo.err <<\EOF @@ -256,24 +239,8 @@ test_expect_success 'detect possible typos' ' test_cmp typo.err output.err ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -arg 00: --quux -EOF - test_expect_success 'keep some options as arguments' ' - test-parse-options --quux >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="arg 00: --quux" --quux ' cat >expect <<\EOF @@ -350,54 +317,20 @@ test_expect_success 'OPT_NEGBIT() and OPT_SET_INT() work' ' test_cmp expect output ' -cat >expect <<\EOF -boolean: 6 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success 'OPT_BIT() works' ' - test-parse-options -bb --or4 >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="boolean: 6" -bb --or4 ' test_expect_success 'OPT_NEGBIT() works' ' - test-parse-options -bb --no-neg-or4 >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="boolean: 6" -bb --no-neg-or4 ' test_expect_success 'OPT_COUNTUP() with PARSE_OPT_NODASH works' ' - test-parse-options + + + + + + >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="boolean: 6" + + + + + + ' -cat >expect <<\EOF -boolean: 0 -integer: 12345 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success 'OPT_NUMBER_CALLBACK() works' ' - test-parse-options -12345 >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="integer: 12345" -12345 ' cat >expect <<\EOF @@ -435,118 +368,28 @@ test_expect_success '--no-list resets list' ' test_cmp expect output ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 3 -dry run: no -file: (not set) -EOF - test_expect_success 'multiple quiet levels' ' - test-parse-options -q -q -q >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="quiet: 3" -q -q -q ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: 3 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success 'multiple verbose levels' ' - test-parse-options -v -v -v >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="verbose: 3" -v -v -v ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success '--no-quiet sets --quiet to 0' ' - test-parse-options --no-quiet >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="quiet: 0" --no-quiet ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: -1 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success '--no-quiet resets multiple -q to 0' ' - test-parse-options -q -q -q --no-quiet >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="quiet: 0" -q -q -q --no-quiet ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: 0 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success '--no-verbose sets verbose to 0' ' - test-parse-options --no-verbose >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="verbose: 0" --no-verbose ' -cat >expect <<\EOF -boolean: 0 -integer: 0 -magnitude: 0 -timestamp: 0 -string: (not set) -abbrev: 7 -verbose: 0 -quiet: 0 -dry run: no -file: (not set) -EOF - test_expect_success '--no-verbose resets multiple verbose to 0' ' - test-parse-options -v -v -v --no-verbose >output 2>output.err && - test_must_be_empty output.err && - test_cmp expect output + test-parse-options --expect="verbose: 0" -v -v -v --no-verbose ' test_done diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index bf2deee109..444b5a4df8 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -305,8 +305,9 @@ test_git_path GIT_COMMON_DIR=bar config bar/config test_git_path GIT_COMMON_DIR=bar packed-refs bar/packed-refs test_git_path GIT_COMMON_DIR=bar shallow bar/shallow -# In the tests below, the distinction between $PWD and $(pwd) is important: -# on Windows, $PWD is POSIX style (/c/foo), $(pwd) has drive letter (c:/foo). +# In the tests below, $(pwd) must be used because it is a native path on +# Windows and avoids MSYS's path mangling (which simplifies "foo/../bar" and +# strips the dot from trailing "/."). test_submodule_relative_url "../" "../foo" "../submodule" "../../submodule" test_submodule_relative_url "../" "../foo/bar" "../submodule" "../../foo/submodule" @@ -314,27 +315,29 @@ test_submodule_relative_url "../" "../foo/submodule" "../submodule" "../../foo/s test_submodule_relative_url "../" "./foo" "../submodule" "../submodule" test_submodule_relative_url "../" "./foo/bar" "../submodule" "../foo/submodule" test_submodule_relative_url "../../../" "../foo/bar" "../sub/a/b/c" "../../../../foo/sub/a/b/c" -test_submodule_relative_url "../" "$PWD/addtest" "../repo" "$(pwd)/repo" +test_submodule_relative_url "../" "$(pwd)/addtest" "../repo" "$(pwd)/repo" test_submodule_relative_url "../" "foo/bar" "../submodule" "../foo/submodule" test_submodule_relative_url "../" "foo" "../submodule" "../submodule" test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c" "../foo/sub/a/b/c" +test_submodule_relative_url "(null)" "../foo/bar" "../sub/a/b/c/" "../foo/sub/a/b/c" +test_submodule_relative_url "(null)" "../foo/bar/" "../sub/a/b/c" "../foo/sub/a/b/c" test_submodule_relative_url "(null)" "../foo/bar" "../submodule" "../foo/submodule" test_submodule_relative_url "(null)" "../foo/submodule" "../submodule" "../foo/submodule" test_submodule_relative_url "(null)" "../foo" "../submodule" "../submodule" test_submodule_relative_url "(null)" "./foo/bar" "../submodule" "foo/submodule" test_submodule_relative_url "(null)" "./foo" "../submodule" "submodule" test_submodule_relative_url "(null)" "//somewhere else/repo" "../subrepo" "//somewhere else/subrepo" -test_submodule_relative_url "(null)" "$PWD/subsuper_update_r" "../subsubsuper_update_r" "$(pwd)/subsubsuper_update_r" -test_submodule_relative_url "(null)" "$PWD/super_update_r2" "../subsuper_update_r" "$(pwd)/subsuper_update_r" -test_submodule_relative_url "(null)" "$PWD/." "../." "$(pwd)/." -test_submodule_relative_url "(null)" "$PWD" "./." "$(pwd)/." -test_submodule_relative_url "(null)" "$PWD/addtest" "../repo" "$(pwd)/repo" -test_submodule_relative_url "(null)" "$PWD" "./Ã¥ äö" "$(pwd)/Ã¥ äö" -test_submodule_relative_url "(null)" "$PWD/." "../submodule" "$(pwd)/submodule" -test_submodule_relative_url "(null)" "$PWD/submodule" "../submodule" "$(pwd)/submodule" -test_submodule_relative_url "(null)" "$PWD/home2/../remote" "../bundle1" "$(pwd)/home2/../bundle1" -test_submodule_relative_url "(null)" "$PWD/submodule_update_repo" "./." "$(pwd)/submodule_update_repo/." +test_submodule_relative_url "(null)" "$(pwd)/subsuper_update_r" "../subsubsuper_update_r" "$(pwd)/subsubsuper_update_r" +test_submodule_relative_url "(null)" "$(pwd)/super_update_r2" "../subsuper_update_r" "$(pwd)/subsuper_update_r" +test_submodule_relative_url "(null)" "$(pwd)/." "../." "$(pwd)/." +test_submodule_relative_url "(null)" "$(pwd)" "./." "$(pwd)/." +test_submodule_relative_url "(null)" "$(pwd)/addtest" "../repo" "$(pwd)/repo" +test_submodule_relative_url "(null)" "$(pwd)" "./Ã¥ äö" "$(pwd)/Ã¥ äö" +test_submodule_relative_url "(null)" "$(pwd)/." "../submodule" "$(pwd)/submodule" +test_submodule_relative_url "(null)" "$(pwd)/submodule" "../submodule" "$(pwd)/submodule" +test_submodule_relative_url "(null)" "$(pwd)/home2/../remote" "../bundle1" "$(pwd)/home2/../bundle1" +test_submodule_relative_url "(null)" "$(pwd)/submodule_update_repo" "./." "$(pwd)/submodule_update_repo/." test_submodule_relative_url "(null)" "file:///tmp/repo" "../subrepo" "file:///tmp/subrepo" test_submodule_relative_url "(null)" "foo/bar" "../submodule" "foo/submodule" test_submodule_relative_url "(null)" "foo" "../submodule" "submodule" diff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh index ab27d0db5c..492edffa9c 100755 --- a/t/t1503-rev-parse-verify.sh +++ b/t/t1503-rev-parse-verify.sh @@ -139,4 +139,9 @@ test_expect_success 'master@{n} for various n' ' test_must_fail git rev-parse --verify master@{$Np1} ' +test_expect_success SYMLINKS 'ref resolution not confused by broken symlinks' ' + ln -s does-not-exist .git/refs/heads/broken && + test_must_fail git rev-parse --verify broken +' + test_done diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 7c659eb585..711704ba5a 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -42,7 +42,7 @@ test_expect_success 'blob and tree' ' test_expect_success 'warn ambiguity when no candidate matches type hint' ' test_must_fail git rev-parse --verify 000000000^{commit} 2>actual && - grep "short SHA1 000000000 is ambiguous" actual + test_i18ngrep "short SHA1 000000000 is ambiguous" actual ' test_expect_success 'disambiguate tree-ish' ' diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh index 4bcc335a19..b618d6be21 100755 --- a/t/t2025-worktree-add.sh +++ b/t/t2025-worktree-add.sh @@ -138,6 +138,14 @@ test_expect_success 'checkout from a bare repo without "add"' ' ) ' +test_expect_success '"add" default branch of a bare repo' ' + ( + git clone --bare . bare2 && + cd bare2 && + git worktree add ../there3 master + ) +' + test_expect_success 'checkout with grafts' ' test_when_finished rm .git/info/grafts && test_commit abc && diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh index 8f22c43e24..84a9028c43 100755 --- a/t/t2203-add-intent.sh +++ b/t/t2203-add-intent.sh @@ -5,10 +5,24 @@ test_description='Intent to add' . ./test-lib.sh test_expect_success 'intent to add' ' + test_commit 1 && + git rm 1.t && + echo hello >1.t && echo hello >file && echo hello >elif && git add -N file && - git add elif + git add elif && + git add -N 1.t +' + +test_expect_success 'git status' ' + git status --porcelain | grep -v actual >actual && + cat >expect <<-\EOF && + DA 1.t + A elif + A file + EOF + test_cmp expect actual ' test_expect_success 'check result of "add -N"' ' @@ -43,7 +57,9 @@ test_expect_success 'i-t-a entry is simply ignored' ' git add -N nitfol && git commit -m second && test $(git ls-tree HEAD -- nitfol | wc -l) = 0 && - test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 + test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 && + test $(git diff --name-only --ita-invisible-in-index HEAD -- nitfol | wc -l) = 0 && + test $(git diff --name-only --ita-invisible-in-index -- nitfol | wc -l) = 1 ' test_expect_success 'can commit with an unrelated i-t-a entry in index' ' @@ -113,5 +129,26 @@ test_expect_success 'cache-tree does skip dir that becomes empty' ' ) ' +test_expect_success 'commit: ita entries ignored in empty intial commit check' ' + git init empty-intial-commit && + ( + cd empty-intial-commit && + : >one && + git add -N one && + test_must_fail git commit -m nothing-new-here + ) +' + +test_expect_success 'commit: ita entries ignored in empty commit check' ' + git init empty-subsequent-commit && + ( + cd empty-subsequent-commit && + test_commit one && + : >two && + git add -N two && + test_must_fail git commit -m nothing-new-here + ) +' + test_done diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh new file mode 100755 index 0000000000..a5426171d3 --- /dev/null +++ b/t/t3007-ls-files-recurse-submodules.sh @@ -0,0 +1,210 @@ +#!/bin/sh + +test_description='Test ls-files recurse-submodules feature + +This test verifies the recurse-submodules feature correctly lists files from +submodules. +' + +. ./test-lib.sh + +test_expect_success 'setup directory structure and submodules' ' + echo a >a && + mkdir b && + echo b >b/b && + git add a b && + git commit -m "add a and b" && + git init submodule && + echo c >submodule/c && + git -C submodule add c && + git -C submodule commit -m "add c" && + git submodule add ./submodule && + git commit -m "added submodule" +' + +test_expect_success 'ls-files correctly outputs files in submodule' ' + cat >expect <<-\EOF && + .gitmodules + a + b/b + submodule/c + EOF + + git ls-files --recurse-submodules >actual && + test_cmp expect actual +' + +test_expect_success 'ls-files correctly outputs files in submodule with -z' ' + lf_to_nul >expect <<-\EOF && + .gitmodules + a + b/b + submodule/c + EOF + + git ls-files --recurse-submodules -z >actual && + test_cmp expect actual +' + +test_expect_success 'ls-files does not output files not added to a repo' ' + cat >expect <<-\EOF && + .gitmodules + a + b/b + submodule/c + EOF + + echo a >not_added && + echo b >b/not_added && + echo c >submodule/not_added && + git ls-files --recurse-submodules >actual && + test_cmp expect actual +' + +test_expect_success 'ls-files recurses more than 1 level' ' + cat >expect <<-\EOF && + .gitmodules + a + b/b + submodule/.gitmodules + submodule/c + submodule/subsub/d + EOF + + git init submodule/subsub && + echo d >submodule/subsub/d && + git -C submodule/subsub add d && + git -C submodule/subsub commit -m "add d" && + git -C submodule submodule add ./subsub && + git -C submodule commit -m "added subsub" && + git ls-files --recurse-submodules >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs setup' ' + echo e >submodule/subsub/e.txt && + git -C submodule/subsub add e.txt && + git -C submodule/subsub commit -m "adding e.txt" && + echo f >submodule/f.TXT && + echo g >submodule/g.txt && + git -C submodule add f.TXT g.txt && + git -C submodule commit -m "add f and g" && + echo h >h.txt && + mkdir sib && + echo sib >sib/file && + git add h.txt sib/file && + git commit -m "add h and sib/file" && + git init sub && + echo sub >sub/file && + git -C sub add file && + git -C sub commit -m "add file" && + git submodule add ./sub && + git commit -m "added sub" && + + cat >expect <<-\EOF && + .gitmodules + a + b/b + h.txt + sib/file + sub/file + submodule/.gitmodules + submodule/c + submodule/f.TXT + submodule/g.txt + submodule/subsub/d + submodule/subsub/e.txt + EOF + + git ls-files --recurse-submodules >actual && + test_cmp expect actual && + cat actual && + git ls-files --recurse-submodules "*" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs' ' + cat >expect <<-\EOF && + h.txt + submodule/g.txt + submodule/subsub/e.txt + EOF + + git ls-files --recurse-submodules "*.txt" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs' ' + cat >expect <<-\EOF && + h.txt + submodule/f.TXT + submodule/g.txt + submodule/subsub/e.txt + EOF + + git ls-files --recurse-submodules ":(icase)*.txt" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs' ' + cat >expect <<-\EOF && + h.txt + submodule/f.TXT + submodule/g.txt + EOF + + git ls-files --recurse-submodules ":(icase)*.txt" ":(exclude)submodule/subsub/*" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs' ' + cat >expect <<-\EOF && + sub/file + EOF + + git ls-files --recurse-submodules "sub" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "sub/" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "sub/file" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "su*/file" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "su?/file" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules and pathspecs' ' + cat >expect <<-\EOF && + sib/file + sub/file + EOF + + git ls-files --recurse-submodules "s??/file" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "s???file" >actual && + test_cmp expect actual && + git ls-files --recurse-submodules "s*file" >actual && + test_cmp expect actual +' + +test_expect_success '--recurse-submodules does not support --error-unmatch' ' + test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual && + test_i18ngrep "does not support --error-unmatch" actual +' + +test_incompatible_with_recurse_submodules () { + test_expect_success "--recurse-submodules and $1 are incompatible" " + test_must_fail git ls-files --recurse-submodules $1 2>actual && + test_i18ngrep 'unsupported mode' actual + " +} + +test_incompatible_with_recurse_submodules --deleted +test_incompatible_with_recurse_submodules --modified +test_incompatible_with_recurse_submodules --others +test_incompatible_with_recurse_submodules --stage +test_incompatible_with_recurse_submodules --killed +test_incompatible_with_recurse_submodules --unmerged + +test_done diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh index 51f3bbb8af..394f0005a1 100755 --- a/t/t3501-revert-cherry-pick.sh +++ b/t/t3501-revert-cherry-pick.sh @@ -96,7 +96,7 @@ test_expect_success 'revert forbidden on dirty working tree' ' echo content >extra_file && git add extra_file && test_must_fail git revert HEAD 2>errors && - test_i18ngrep "Your local changes would be overwritten by " errors + test_i18ngrep "your local changes would be overwritten by " errors ' diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index d046d98aec..14f0edca2b 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -881,4 +881,9 @@ test_expect_success 'rm files with two different errors' ' test_i18ncmp expect actual ' +test_expect_success 'rm empty string should invoke warning' ' + git rm -rf "" 2>output && + test_i18ngrep "warning: empty strings" output +' + test_done diff --git a/t/t3700-add.sh b/t/t3700-add.sh index 924a266126..f3a4b4a913 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -331,6 +331,11 @@ test_expect_success 'git add --dry-run --ignore-missing of non-existing file out test_i18ncmp expect.err actual.err ' +test_expect_success 'git add empty string should invoke warning' ' + git add "" 2>output && + test_i18ngrep "warning: empty strings" output +' + test_expect_success 'git add --chmod=[+-]x stages correctly' ' rm -f foo1 && echo foo >foo1 && @@ -350,6 +355,7 @@ test_expect_success POSIXPERM,SYMLINKS 'git add --chmod=+x with symlinks' ' ' test_expect_success 'git add --chmod=[+-]x changes index with already added file' ' + rm -f foo3 xfoo3 && echo foo >foo3 && git add foo3 && git add --chmod=+x foo3 && diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index 2434157aa7..289806d0c7 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -869,7 +869,8 @@ test_expect_success 'diff that introduces and removes ws breakages' ' test_cmp expected current ' -test_expect_success 'the same with --ws-error-highlight' ' +test_expect_success 'ws-error-highlight test setup' ' + git reset --hard && { echo "0. blank-at-eol " && @@ -882,10 +883,7 @@ test_expect_success 'the same with --ws-error-highlight' ' echo "2. and a new line " } >x && - git -c color.diff=always diff --ws-error-highlight=default,old | - test_decode_color >current && - - cat >expected <<-\EOF && + cat >expect.default-old <<-\EOF && <BOLD>diff --git a/x b/x<RESET> <BOLD>index d0233a2..700886e 100644<RESET> <BOLD>--- a/x<RESET> @@ -897,12 +895,7 @@ test_expect_success 'the same with --ws-error-highlight' ' <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET> EOF - test_cmp expected current && - - git -c color.diff=always diff --ws-error-highlight=all | - test_decode_color >current && - - cat >expected <<-\EOF && + cat >expect.all <<-\EOF && <BOLD>diff --git a/x b/x<RESET> <BOLD>index d0233a2..700886e 100644<RESET> <BOLD>--- a/x<RESET> @@ -914,12 +907,7 @@ test_expect_success 'the same with --ws-error-highlight' ' <GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET> EOF - test_cmp expected current && - - git -c color.diff=always diff --ws-error-highlight=none | - test_decode_color >current && - - cat >expected <<-\EOF && + cat >expect.none <<-\EOF <BOLD>diff --git a/x b/x<RESET> <BOLD>index d0233a2..700886e 100644<RESET> <BOLD>--- a/x<RESET> @@ -931,7 +919,57 @@ test_expect_success 'the same with --ws-error-highlight' ' <GREEN>+2. and a new line <RESET> EOF - test_cmp expected current +' + +test_expect_success 'test --ws-error-highlight option' ' + + git -c color.diff=always diff --ws-error-highlight=default,old | + test_decode_color >current && + test_cmp expect.default-old current && + + git -c color.diff=always diff --ws-error-highlight=all | + test_decode_color >current && + test_cmp expect.all current && + + git -c color.diff=always diff --ws-error-highlight=none | + test_decode_color >current && + test_cmp expect.none current + +' + +test_expect_success 'test diff.wsErrorHighlight config' ' + + git -c color.diff=always -c diff.wsErrorHighlight=default,old diff | + test_decode_color >current && + test_cmp expect.default-old current && + + git -c color.diff=always -c diff.wsErrorHighlight=all diff | + test_decode_color >current && + test_cmp expect.all current && + + git -c color.diff=always -c diff.wsErrorHighlight=none diff | + test_decode_color >current && + test_cmp expect.none current + +' + +test_expect_success 'option overrides diff.wsErrorHighlight' ' + + git -c color.diff=always -c diff.wsErrorHighlight=none \ + diff --ws-error-highlight=default,old | + test_decode_color >current && + test_cmp expect.default-old current && + + git -c color.diff=always -c diff.wsErrorHighlight=default \ + diff --ws-error-highlight=all | + test_decode_color >current && + test_cmp expect.all current && + + git -c color.diff=always -c diff.wsErrorHighlight=all \ + diff --ws-error-highlight=none | + test_decode_color >current && + test_cmp expect.none current + ' test_done diff --git a/t/t4254-am-corrupt.sh b/t/t4254-am-corrupt.sh index 9bd7dd2ba1..168739c721 100755 --- a/t/t4254-am-corrupt.sh +++ b/t/t4254-am-corrupt.sh @@ -31,7 +31,7 @@ test_expect_success 'try to apply corrupted patch' ' test_expect_success 'compare diagnostic; ensure file is still here' ' echo "error: git diff header lacks filename information (line 4)" >expected && test_path_is_file f && - test_cmp expected actual + test_i18ncmp expected actual ' test_done diff --git a/t/t5547-push-quarantine.sh b/t/t5547-push-quarantine.sh new file mode 100755 index 0000000000..1e5d32d068 --- /dev/null +++ b/t/t5547-push-quarantine.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +test_description='check quarantine of objects during push' +. ./test-lib.sh + +test_expect_success 'create picky dest repo' ' + git init --bare dest.git && + write_script dest.git/hooks/pre-receive <<-\EOF + while read old new ref; do + test "$(git log -1 --format=%s $new)" = reject && exit 1 + done + exit 0 + EOF +' + +test_expect_success 'accepted objects work' ' + test_commit ok && + git push dest.git HEAD && + commit=$(git rev-parse HEAD) && + git --git-dir=dest.git cat-file commit $commit +' + +test_expect_success 'rejected objects are not installed' ' + test_commit reject && + commit=$(git rev-parse HEAD) && + test_must_fail git push dest.git reject && + test_must_fail git --git-dir=dest.git cat-file commit $commit +' + +test_expect_success 'rejected objects are removed' ' + echo "incoming-*" >expect && + (cd dest.git/objects && echo incoming-*) >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t5613-info-alternate.sh b/t/t5613-info-alternate.sh index 9cd2626dba..895f46bb91 100755 --- a/t/t5613-info-alternate.sh +++ b/t/t5613-info-alternate.sh @@ -6,107 +6,134 @@ test_description='test transitive info/alternate entries' . ./test-lib.sh -# test that a file is not reachable in the current repository -# but that it is after creating a info/alternate entry -reachable_via() { - alternate="$1" - file="$2" - if git cat-file -e "HEAD:$file"; then return 1; fi - echo "$alternate" >> .git/objects/info/alternate - git cat-file -e "HEAD:$file" -} - -test_valid_repo() { - git fsck --full > fsck.log && - test_line_count = 0 fsck.log -} - -base_dir=$(pwd) - -test_expect_success 'preparing first repository' \ -'test_create_repo A && cd A && -echo "Hello World" > file1 && -git add file1 && -git commit -m "Initial commit" file1 && -git repack -a -d && -git prune' - -cd "$base_dir" - -test_expect_success 'preparing second repository' \ -'git clone -l -s A B && cd B && -echo "foo bar" > file2 && -git add file2 && -git commit -m "next commit" file2 && -git repack -a -d -l && -git prune' - -cd "$base_dir" - -test_expect_success 'preparing third repository' \ -'git clone -l -s B C && cd C && -echo "Goodbye, cruel world" > file3 && -git add file3 && -git commit -m "one more" file3 && -git repack -a -d -l && -git prune' - -cd "$base_dir" - -test_expect_success 'creating too deep nesting' \ -'git clone -l -s C D && -git clone -l -s D E && -git clone -l -s E F && -git clone -l -s F G && -git clone --bare -l -s G H' - -test_expect_success 'invalidity of deepest repository' \ -'cd H && { - test_valid_repo - test $? -ne 0 -}' - -cd "$base_dir" +test_expect_success 'preparing first repository' ' + test_create_repo A && ( + cd A && + echo "Hello World" > file1 && + git add file1 && + git commit -m "Initial commit" file1 && + git repack -a -d && + git prune + ) +' -test_expect_success 'validity of third repository' \ -'cd C && -test_valid_repo' +test_expect_success 'preparing second repository' ' + git clone -l -s A B && ( + cd B && + echo "foo bar" > file2 && + git add file2 && + git commit -m "next commit" file2 && + git repack -a -d -l && + git prune + ) +' -cd "$base_dir" +test_expect_success 'preparing third repository' ' + git clone -l -s B C && ( + cd C && + echo "Goodbye, cruel world" > file3 && + git add file3 && + git commit -m "one more" file3 && + git repack -a -d -l && + git prune + ) +' -test_expect_success 'validity of fourth repository' \ -'cd D && -test_valid_repo' +test_expect_success 'count-objects shows the alternates' ' + cat >expect <<-EOF && + alternate: $(pwd)/B/.git/objects + alternate: $(pwd)/A/.git/objects + EOF + git -C C count-objects -v >actual && + grep ^alternate: actual >actual.alternates && + test_cmp expect actual.alternates +' -cd "$base_dir" +# Note: These tests depend on the hard-coded value of 5 as the maximum depth +# we will follow recursion. We start the depth at 0 and count links, not +# repositories. This means that in a chain like: +# +# A --> B --> C --> D --> E --> F --> G --> H +# 0 1 2 3 4 5 6 +# +# we are OK at "G", but break at "H", even though "H" is actually the 8th +# repository, not the 6th, which you might expect. Counting the links allows +# N+1 repositories, and counting from 0 to 5 inclusive allows 6 links. +# +# Note also that we must use "--bare -l" to make the link to H. The "-l" +# ensures we do not do a connectivity check, and the "--bare" makes sure +# we do not try to checkout the result (which needs objects), either of +# which would cause the clone to fail. +test_expect_success 'creating too deep nesting' ' + git clone -l -s C D && + git clone -l -s D E && + git clone -l -s E F && + git clone -l -s F G && + git clone --bare -l -s G H +' -test_expect_success 'breaking of loops' \ -'echo "$base_dir"/B/.git/objects >> "$base_dir"/A/.git/objects/info/alternates&& -cd C && -test_valid_repo' +test_expect_success 'validity of seventh repository' ' + git -C G fsck +' -cd "$base_dir" +test_expect_success 'invalidity of eighth repository' ' + test_must_fail git -C H fsck +' -test_expect_success 'that info/alternates is necessary' \ -'cd C && -rm -f .git/objects/info/alternates && -! (test_valid_repo)' +test_expect_success 'breaking of loops' ' + echo "$(pwd)"/B/.git/objects >>A/.git/objects/info/alternates && + git -C C fsck +' -cd "$base_dir" +test_expect_success 'that info/alternates is necessary' ' + rm -f C/.git/objects/info/alternates && + test_must_fail git -C C fsck +' -test_expect_success 'that relative alternate is possible for current dir' \ -'cd C && -echo "../../../B/.git/objects" > .git/objects/info/alternates && -test_valid_repo' +test_expect_success 'that relative alternate is possible for current dir' ' + echo "../../../B/.git/objects" >C/.git/objects/info/alternates && + git fsck +' -cd "$base_dir" +test_expect_success 'that relative alternate is recursive' ' + git -C D fsck +' -test_expect_success \ - 'that relative alternate is only possible for current dir' ' - cd D && - ! (test_valid_repo) +# we can reach "A" from our new repo both directly, and via "C". +# The deep/subdir is there to make sure we are not doing a stupid +# pure-text comparison of the alternate names. +test_expect_success 'relative duplicates are eliminated' ' + mkdir -p deep/subdir && + git init --bare deep/subdir/duplicate.git && + cat >deep/subdir/duplicate.git/objects/info/alternates <<-\EOF && + ../../../../C/.git/objects + ../../../../A/.git/objects + EOF + cat >expect <<-EOF && + alternate: $(pwd)/C/.git/objects + alternate: $(pwd)/B/.git/objects + alternate: $(pwd)/A/.git/objects + EOF + git -C deep/subdir/duplicate.git count-objects -v >actual && + grep ^alternate: actual >actual.alternates && + test_cmp expect actual.alternates ' -cd "$base_dir" +test_expect_success CASE_INSENSITIVE_FS 'dup finding can be case-insensitive' ' + git init --bare insensitive.git && + # the previous entry for "A" will have used uppercase + cat >insensitive.git/objects/info/alternates <<-\EOF && + ../../C/.git/objects + ../../a/.git/objects + EOF + cat >expect <<-EOF && + alternate: $(pwd)/C/.git/objects + alternate: $(pwd)/B/.git/objects + alternate: $(pwd)/A/.git/objects + EOF + git -C insensitive.git count-objects -v >actual && + grep ^alternate: actual >actual.alternates && + test_cmp expect actual.alternates +' test_done diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index 3e752ce032..969e4e9e52 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -100,4 +100,18 @@ test_expect_success '--bisect and --first-parent can not be combined' ' test_must_fail git rev-list --bisect --first-parent HEAD ' +test_expect_success '--header shows a NUL after each commit' ' + # We know that there is no Q in the true payload; names and + # addresses of the authors and the committers do not have + # any, and object names or header names do not, either. + git rev-list --header --max-count=2 HEAD | + nul_to_q | + grep "^Q" >actual && + cat >expect <<-EOF && + Q$(git rev-parse HEAD~1) + Q + EOF + test_cmp expect actual +' + test_done diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh index e0c5f44cac..31db7b5f91 100755 --- a/t/t6010-merge-base.sh +++ b/t/t6010-merge-base.sh @@ -260,6 +260,12 @@ test_expect_success 'using reflog to find the fork point' ' test_cmp expect3 actual ' +test_expect_success '--fork-point works with empty reflog' ' + git -c core.logallrefupdates=false branch no-reflog base && + git merge-base --fork-point no-reflog derived && + 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 diff --git a/t/t7064-wtstatus-pv2.sh b/t/t7064-wtstatus-pv2.sh index 3012a4d7c0..e319fa2e84 100755 --- a/t/t7064-wtstatus-pv2.sh +++ b/t/t7064-wtstatus-pv2.sh @@ -246,8 +246,8 @@ test_expect_success 'verify --intent-to-add output' ' git add --intent-to-add intent1.add intent2.add && cat >expect <<-EOF && - 1 AM N... 000000 100644 100644 $_z40 $EMPTY_BLOB intent1.add - 1 AM N... 000000 100644 100644 $_z40 $EMPTY_BLOB intent2.add + 1 .A N... 000000 000000 100644 $_z40 $_z40 intent1.add + 1 .A N... 000000 000000 100644 $_z40 $_z40 intent2.add EOF git status --porcelain=v2 >actual && diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh index 6e839f5489..762135adea 100755 --- a/t/t7510-signed-commit.sh +++ b/t/t7510-signed-commit.sh @@ -2,6 +2,7 @@ test_description='signed commit tests' . ./test-lib.sh +GNUPGHOME_NOT_USED=$GNUPGHOME . "$TEST_DIRECTORY/lib-gpg.sh" test_expect_success GPG 'create signed commits' ' @@ -190,7 +191,7 @@ test_expect_success GPG 'show bad signature with custom format' ' test_cmp expect actual ' -test_expect_success GPG 'show unknown signature with custom format' ' +test_expect_success GPG 'show untrusted signature with custom format' ' cat >expect <<-\EOF && U 61092E85B7227189 @@ -200,6 +201,16 @@ test_expect_success GPG 'show unknown signature with custom format' ' test_cmp expect actual ' +test_expect_success GPG 'show unknown signature with custom format' ' + cat >expect <<-\EOF && + E + 61092E85B7227189 + + EOF + GNUPGHOME="$GNUPGHOME_NOT_USED" git log -1 --format="%G?%n%GK%n%GS" eighth-signed-alt >actual && + test_cmp expect actual +' + test_expect_success GPG 'show lack of signature with custom format' ' cat >expect <<-\EOF && N diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index 7217f3968d..6d9f21511f 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -606,4 +606,64 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT git reset --hard master >/dev/null 2>&1 ' +test_expect_success 'diff.orderFile configuration is honored' ' + test_config diff.orderFile order-file && + test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" && + test_config mergetool.myecho.trustExitCode true && + echo b >order-file && + echo a >>order-file && + git checkout -b order-file-start master && + echo start >a && + echo start >b && + git add a b && + git commit -m start && + git checkout -b order-file-side1 order-file-start && + echo side1 >a && + echo side1 >b && + git add a b && + git commit -m side1 && + git checkout -b order-file-side2 order-file-start && + echo side2 >a && + echo side2 >b && + git add a b && + git commit -m side2 && + test_must_fail git merge order-file-side1 && + cat >expect <<-\EOF && + Merging: + b + a + EOF + git mergetool --no-prompt --tool myecho >output && + git grep --no-index -h -A2 Merging: output >actual && + test_cmp expect actual && + git reset --hard >/dev/null +' +test_expect_success 'mergetool -Oorder-file is honored' ' + test_config diff.orderFile order-file && + test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" && + test_config mergetool.myecho.trustExitCode true && + test_must_fail git merge order-file-side1 && + cat >expect <<-\EOF && + Merging: + a + b + EOF + git mergetool -O/dev/null --no-prompt --tool myecho >output && + git grep --no-index -h -A2 Merging: output >actual && + test_cmp expect actual && + git reset --hard >/dev/null 2>&1 && + + git config --unset diff.orderFile && + test_must_fail git merge order-file-side1 && + cat >expect <<-\EOF && + Merging: + b + a + EOF + git mergetool -Oorder-file --no-prompt --tool myecho >output && + git grep --no-index -h -A2 Merging: output >actual && + test_cmp expect actual && + git reset --hard >/dev/null 2>&1 +' + test_done diff --git a/t/t9000/test.pl b/t/t9000/test.pl index 2d05d3eeab..dfeaa9c655 100755 --- a/t/t9000/test.pl +++ b/t/t9000/test.pl @@ -32,15 +32,15 @@ my @success_list = (q[Jane], q["Jane\" Doe" <jdoe@example.com>], q[Doe, jane <jdoe@example.com>], q["Jane Doe <jdoe@example.com>], - q['Jane 'Doe' <jdoe@example.com>]); + q['Jane 'Doe' <jdoe@example.com>], + q[Jane@:;\.,()<>Doe <jdoe@example.com>], + q[Jane <jdoe@example.com> Doe], + q[<jdoe@example.com> Jane Doe]); my @known_failure_list = (q[Jane\ Doe <jdoe@example.com>], q["Doe, Ja"ne <jdoe@example.com>], q["Doe, Katarina" Jane <jdoe@example.com>], - q[Jane@:;\.,()<>Doe <jdoe@example.com>], q[Jane jdoe@example.com], - q[<jdoe@example.com> Jane Doe], - q[Jane <jdoe@example.com> Doe], q["Jane "Kat"a" ri"na" ",Doe" <jdoe@example.com>], q[Jane Doe], q[Jane "Doe <jdoe@example.com>"], diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index b3355d2c70..3dc4a3454d 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -140,6 +140,35 @@ test_expect_success $PREREQ 'Verify commandline' ' test_cmp expected commandline1 ' +test_expect_success $PREREQ 'setup expect for cc trailer' " +cat >expected-cc <<\EOF +!recipient@example.com! +!author@example.com! +!one@example.com! +!two@example.com! +!three@example.com! +!four@example.com! +!five@example.com! +EOF +" + +test_expect_success $PREREQ 'cc trailer with various syntax' ' + test_commit cc-trailer && + test_when_finished "git reset --hard HEAD^" && + git commit --amend -F - <<-EOF && + Test Cc: trailers. + + Cc: one@example.com + Cc: <two@example.com> # this is part of the name + Cc: <three@example.com>, <four@example.com> # not.five@example.com + Cc: "Some # Body" <five@example.com> [part.of.name.too] + EOF + clean_fake_sendmail && + git send-email -1 --to=recipient@example.com \ + --smtp-server="$(pwd)/fake.sendmail" && + test_cmp expected-cc commandline1 +' + test_expect_success $PREREQ 'setup expect' " cat >expected-show-all-headers <<\EOF 0001-Second.patch diff --git a/t/test-lib.sh b/t/test-lib.sh index 11562bde10..b859db61ac 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -54,12 +54,22 @@ case "$GIT_TEST_TEE_STARTED, $* " in done,*) # do not redirect again ;; -*' --tee '*|*' --va'*) +*' --tee '*|*' --va'*|*' --verbose-log '*) mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results" BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" + + # Make this filename available to the sub-process in case it is using + # --verbose-log. + GIT_TEST_TEE_OUTPUT_FILE=$BASE.out + export GIT_TEST_TEE_OUTPUT_FILE + + # Truncate before calling "tee -a" to get rid of the results + # from any previous runs. + >"$GIT_TEST_TEE_OUTPUT_FILE" + (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1; - echo $? > $BASE.exit) | tee $BASE.out - test "$(cat $BASE.exit)" = 0 + echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE" + test "$(cat "$BASE.exit")" = 0 exit ;; esac @@ -246,6 +256,9 @@ do trace=t verbose=t shift ;; + --verbose-log) + verbose_log=t + shift ;; *) echo "error: unknown test option '$1'" >&2; exit 1 ;; esac @@ -308,6 +321,16 @@ say () { say_color info "$*" } +if test -n "$HARNESS_ACTIVE" +then + if test "$verbose" = t || test -n "$verbose_only" + then + printf 'Bail out! %s\n' \ + 'verbose mode forbidden under TAP harness; try --verbose-log' + exit 1 + fi +fi + test "${test_description}" != "" || error "Test script did not set test_description." @@ -319,7 +342,10 @@ fi exec 5>&1 exec 6<&0 -if test "$verbose" = "t" +if test "$verbose_log" = "t" +then + exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3 +elif test "$verbose" = "t" then exec 4>&2 3>&1 else diff --git a/tmp-objdir.c b/tmp-objdir.c new file mode 100644 index 0000000000..64435f23a4 --- /dev/null +++ b/tmp-objdir.c @@ -0,0 +1,275 @@ +#include "cache.h" +#include "tmp-objdir.h" +#include "dir.h" +#include "sigchain.h" +#include "string-list.h" +#include "strbuf.h" +#include "argv-array.h" + +struct tmp_objdir { + struct strbuf path; + struct argv_array env; +}; + +/* + * Allow only one tmp_objdir at a time in a running process, which simplifies + * our signal/atexit cleanup routines. It's doubtful callers will ever need + * more than one, and we can expand later if so. You can have many such + * tmp_objdirs simultaneously in many processes, of course. + */ +static struct tmp_objdir *the_tmp_objdir; + +static void tmp_objdir_free(struct tmp_objdir *t) +{ + strbuf_release(&t->path); + argv_array_clear(&t->env); + free(t); +} + +static int tmp_objdir_destroy_1(struct tmp_objdir *t, int on_signal) +{ + int err; + + if (!t) + return 0; + + if (t == the_tmp_objdir) + the_tmp_objdir = NULL; + + /* + * This may use malloc via strbuf_grow(), but we should + * have pre-grown t->path sufficiently so that this + * doesn't happen in practice. + */ + err = remove_dir_recursively(&t->path, 0); + + /* + * When we are cleaning up due to a signal, we won't bother + * freeing memory; it may cause a deadlock if the signal + * arrived while libc's allocator lock is held. + */ + if (!on_signal) + tmp_objdir_free(t); + return err; +} + +int tmp_objdir_destroy(struct tmp_objdir *t) +{ + return tmp_objdir_destroy_1(t, 0); +} + +static void remove_tmp_objdir(void) +{ + tmp_objdir_destroy(the_tmp_objdir); +} + +static void remove_tmp_objdir_on_signal(int signo) +{ + tmp_objdir_destroy_1(the_tmp_objdir, 1); + sigchain_pop(signo); + raise(signo); +} + +/* + * These env_* functions are for setting up the child environment; the + * "replace" variant overrides the value of any existing variable with that + * "key". The "append" variant puts our new value at the end of a list, + * separated by PATH_SEP (which is what separate values in + * GIT_ALTERNATE_OBJECT_DIRECTORIES). + */ +static void env_append(struct argv_array *env, const char *key, const char *val) +{ + const char *old = getenv(key); + + if (!old) + argv_array_pushf(env, "%s=%s", key, val); + else + argv_array_pushf(env, "%s=%s%c%s", key, old, PATH_SEP, val); +} + +static void env_replace(struct argv_array *env, const char *key, const char *val) +{ + argv_array_pushf(env, "%s=%s", key, val); +} + +static int setup_tmp_objdir(const char *root) +{ + char *path; + int ret = 0; + + path = xstrfmt("%s/pack", root); + ret = mkdir(path, 0777); + free(path); + + return ret; +} + +struct tmp_objdir *tmp_objdir_create(void) +{ + static int installed_handlers; + struct tmp_objdir *t; + + if (the_tmp_objdir) + die("BUG: only one tmp_objdir can be used at a time"); + + t = xmalloc(sizeof(*t)); + strbuf_init(&t->path, 0); + argv_array_init(&t->env); + + strbuf_addf(&t->path, "%s/incoming-XXXXXX", get_object_directory()); + + /* + * Grow the strbuf beyond any filename we expect to be placed in it. + * If tmp_objdir_destroy() is called by a signal handler, then + * we should be able to use the strbuf to remove files without + * having to call malloc. + */ + strbuf_grow(&t->path, 1024); + + if (!mkdtemp(t->path.buf)) { + /* free, not destroy, as we never touched the filesystem */ + tmp_objdir_free(t); + return NULL; + } + + the_tmp_objdir = t; + if (!installed_handlers) { + atexit(remove_tmp_objdir); + sigchain_push_common(remove_tmp_objdir_on_signal); + installed_handlers++; + } + + if (setup_tmp_objdir(t->path.buf)) { + tmp_objdir_destroy(t); + return NULL; + } + + env_append(&t->env, ALTERNATE_DB_ENVIRONMENT, + absolute_path(get_object_directory())); + env_replace(&t->env, DB_ENVIRONMENT, absolute_path(t->path.buf)); + env_replace(&t->env, GIT_QUARANTINE_ENVIRONMENT, + absolute_path(t->path.buf)); + + return t; +} + +/* + * Make sure we copy packfiles and their associated metafiles in the correct + * order. All of these ends_with checks are slightly expensive to do in + * the midst of a sorting routine, but in practice it shouldn't matter. + * We will have a relatively small number of packfiles to order, and loose + * objects exit early in the first line. + */ +static int pack_copy_priority(const char *name) +{ + if (!starts_with(name, "pack")) + return 0; + if (ends_with(name, ".keep")) + return 1; + if (ends_with(name, ".pack")) + return 2; + if (ends_with(name, ".idx")) + return 3; + return 4; +} + +static int pack_copy_cmp(const char *a, const char *b) +{ + return pack_copy_priority(a) - pack_copy_priority(b); +} + +static int read_dir_paths(struct string_list *out, const char *path) +{ + DIR *dh; + struct dirent *de; + + dh = opendir(path); + if (!dh) + return -1; + + while ((de = readdir(dh))) + if (de->d_name[0] != '.') + string_list_append(out, de->d_name); + + closedir(dh); + return 0; +} + +static int migrate_paths(struct strbuf *src, struct strbuf *dst); + +static int migrate_one(struct strbuf *src, struct strbuf *dst) +{ + struct stat st; + + if (stat(src->buf, &st) < 0) + return -1; + if (S_ISDIR(st.st_mode)) { + if (!mkdir(dst->buf, 0777)) { + if (adjust_shared_perm(dst->buf)) + return -1; + } else if (errno != EEXIST) + return -1; + return migrate_paths(src, dst); + } + return finalize_object_file(src->buf, dst->buf); +} + +static int migrate_paths(struct strbuf *src, struct strbuf *dst) +{ + size_t src_len = src->len, dst_len = dst->len; + struct string_list paths = STRING_LIST_INIT_DUP; + int i; + int ret = 0; + + if (read_dir_paths(&paths, src->buf) < 0) + return -1; + paths.cmp = pack_copy_cmp; + string_list_sort(&paths); + + for (i = 0; i < paths.nr; i++) { + const char *name = paths.items[i].string; + + strbuf_addf(src, "/%s", name); + strbuf_addf(dst, "/%s", name); + + ret |= migrate_one(src, dst); + + strbuf_setlen(src, src_len); + strbuf_setlen(dst, dst_len); + } + + string_list_clear(&paths, 0); + return ret; +} + +int tmp_objdir_migrate(struct tmp_objdir *t) +{ + struct strbuf src = STRBUF_INIT, dst = STRBUF_INIT; + int ret; + + if (!t) + return 0; + + strbuf_addbuf(&src, &t->path); + strbuf_addstr(&dst, get_object_directory()); + + ret = migrate_paths(&src, &dst); + + strbuf_release(&src); + strbuf_release(&dst); + + tmp_objdir_destroy(t); + return ret; +} + +const char **tmp_objdir_env(const struct tmp_objdir *t) +{ + if (!t) + return NULL; + return t->env.argv; +} + +void tmp_objdir_add_as_alternate(const struct tmp_objdir *t) +{ + add_to_alternates_memory(t->path.buf); +} diff --git a/tmp-objdir.h b/tmp-objdir.h new file mode 100644 index 0000000000..b1e45b4c75 --- /dev/null +++ b/tmp-objdir.h @@ -0,0 +1,54 @@ +#ifndef TMP_OBJDIR_H +#define TMP_OBJDIR_H + +/* + * This API allows you to create a temporary object directory, advertise it to + * sub-processes via GIT_OBJECT_DIRECTORY and GIT_ALTERNATE_OBJECT_DIRECTORIES, + * and then either migrate its object into the main object directory, or remove + * it. The library handles unexpected signal/exit death by cleaning up the + * temporary directory. + * + * Example: + * + * struct tmp_objdir *t = tmp_objdir_create(); + * if (!run_command_v_opt_cd_env(cmd, 0, NULL, tmp_objdir_env(t)) && + * !tmp_objdir_migrate(t)) + * printf("success!\n"); + * else + * die("failed...tmp_objdir will clean up for us"); + * + */ + +struct tmp_objdir; + +/* + * Create a new temporary object directory; returns NULL on failure. + */ +struct tmp_objdir *tmp_objdir_create(void); + +/* + * Return a list of environment strings, suitable for use with + * child_process.env, that can be passed to child programs to make use of the + * temporary object directory. + */ +const char **tmp_objdir_env(const struct tmp_objdir *); + +/* + * Finalize a temporary object directory by migrating its objects into the main + * object database, removing the temporary directory, and freeing any + * associated resources. + */ +int tmp_objdir_migrate(struct tmp_objdir *); + +/* + * Destroy a temporary object directory, discarding any objects it contains. + */ +int tmp_objdir_destroy(struct tmp_objdir *); + +/* + * Add the temporary object directory as an alternate object store in the + * current process. + */ +void tmp_objdir_add_as_alternate(const struct tmp_objdir *); + +#endif /* TMP_OBJDIR_H */ @@ -416,12 +416,9 @@ static int set_if_missing(struct conf_info *item, const char *value) static void duplicate_conf(struct conf_info *dst, const struct conf_info *src) { *dst = *src; - if (src->name) - dst->name = xstrdup(src->name); - if (src->key) - dst->key = xstrdup(src->key); - if (src->command) - dst->command = xstrdup(src->command); + dst->name = xstrdup_or_null(src->name); + dst->key = xstrdup_or_null(src->key); + dst->command = xstrdup_or_null(src->command); } static struct arg_item *get_conf_item(const char *name) diff --git a/transport.c b/transport.c index a85801042b..d57e8dec28 100644 --- a/transport.c +++ b/transport.c @@ -307,7 +307,9 @@ void transport_update_tracking_ref(struct remote *remote, struct ref *ref, int v } } -static void print_ref_status(char flag, const char *summary, struct ref *to, struct ref *from, const char *msg, int porcelain) +static void print_ref_status(char flag, const char *summary, + struct ref *to, struct ref *from, const char *msg, + int porcelain, int summary_width) { if (porcelain) { if (from) @@ -319,7 +321,7 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str else fprintf(stdout, "%s\n", summary); } else { - fprintf(stderr, " %c %-*s ", flag, TRANSPORT_SUMMARY_WIDTH, summary); + fprintf(stderr, " %c %-*s ", flag, summary_width, summary); if (from) fprintf(stderr, "%s -> %s", prettify_refname(from->name), prettify_refname(to->name)); else @@ -333,15 +335,16 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str } } -static void print_ok_ref_status(struct ref *ref, int porcelain) +static void print_ok_ref_status(struct ref *ref, int porcelain, int summary_width) { if (ref->deletion) - print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain); + print_ref_status('-', "[deleted]", ref, NULL, NULL, + porcelain, summary_width); else if (is_null_oid(&ref->old_oid)) print_ref_status('*', (starts_with(ref->name, "refs/tags/") ? "[new tag]" : "[new branch]"), - ref, ref->peer_ref, NULL, porcelain); + ref, ref->peer_ref, NULL, porcelain, summary_width); else { struct strbuf quickref = STRBUF_INIT; char type; @@ -361,12 +364,14 @@ static void print_ok_ref_status(struct ref *ref, int porcelain) strbuf_add_unique_abbrev(&quickref, ref->new_oid.hash, DEFAULT_ABBREV); - print_ref_status(type, quickref.buf, ref, ref->peer_ref, msg, porcelain); + print_ref_status(type, quickref.buf, ref, ref->peer_ref, msg, + porcelain, summary_width); strbuf_release(&quickref); } } -static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain) +static int print_one_push_status(struct ref *ref, const char *dest, int count, + int porcelain, int summary_width) { if (!count) { char *url = transport_anonymize_url(dest); @@ -376,62 +381,87 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i switch(ref->status) { case REF_STATUS_NONE: - print_ref_status('X', "[no match]", ref, NULL, NULL, porcelain); + print_ref_status('X', "[no match]", ref, NULL, NULL, + porcelain, summary_width); break; case REF_STATUS_REJECT_NODELETE: print_ref_status('!', "[rejected]", ref, NULL, - "remote does not support deleting refs", porcelain); + "remote does not support deleting refs", + porcelain, summary_width); break; case REF_STATUS_UPTODATE: print_ref_status('=', "[up to date]", ref, - ref->peer_ref, NULL, porcelain); + ref->peer_ref, NULL, porcelain, summary_width); break; case REF_STATUS_REJECT_NONFASTFORWARD: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "non-fast-forward", porcelain); + "non-fast-forward", porcelain, summary_width); break; case REF_STATUS_REJECT_ALREADY_EXISTS: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "already exists", porcelain); + "already exists", porcelain, summary_width); break; case REF_STATUS_REJECT_FETCH_FIRST: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "fetch first", porcelain); + "fetch first", porcelain, summary_width); break; case REF_STATUS_REJECT_NEEDS_FORCE: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "needs force", porcelain); + "needs force", porcelain, summary_width); break; case REF_STATUS_REJECT_STALE: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "stale info", porcelain); + "stale info", porcelain, summary_width); break; case REF_STATUS_REJECT_SHALLOW: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "new shallow roots not allowed", porcelain); + "new shallow roots not allowed", + porcelain, summary_width); break; case REF_STATUS_REMOTE_REJECT: print_ref_status('!', "[remote rejected]", ref, - ref->deletion ? NULL : ref->peer_ref, - ref->remote_status, porcelain); + ref->deletion ? NULL : ref->peer_ref, + ref->remote_status, porcelain, summary_width); break; case REF_STATUS_EXPECTING_REPORT: print_ref_status('!', "[remote failure]", ref, - ref->deletion ? NULL : ref->peer_ref, - "remote failed to report status", porcelain); + ref->deletion ? NULL : ref->peer_ref, + "remote failed to report status", + porcelain, summary_width); break; case REF_STATUS_ATOMIC_PUSH_FAILED: print_ref_status('!', "[rejected]", ref, ref->peer_ref, - "atomic push failed", porcelain); + "atomic push failed", porcelain, summary_width); break; case REF_STATUS_OK: - print_ok_ref_status(ref, porcelain); + print_ok_ref_status(ref, porcelain, summary_width); break; } return 1; } +static int measure_abbrev(const struct object_id *oid, int sofar) +{ + char hex[GIT_SHA1_HEXSZ + 1]; + int w = find_unique_abbrev_r(hex, oid->hash, DEFAULT_ABBREV); + + return (w < sofar) ? sofar : w; +} + +int transport_summary_width(const struct ref *refs) +{ + int maxw = -1; + + for (; refs; refs = refs->next) { + maxw = measure_abbrev(&refs->old_oid, maxw); + maxw = measure_abbrev(&refs->new_oid, maxw); + } + if (maxw < 0) + maxw = FALLBACK_DEFAULT_ABBREV; + return (2 * maxw + 3); +} + void transport_print_push_status(const char *dest, struct ref *refs, int verbose, int porcelain, unsigned int *reject_reasons) { @@ -439,25 +469,29 @@ void transport_print_push_status(const char *dest, struct ref *refs, int n = 0; unsigned char head_sha1[20]; char *head; + int summary_width = transport_summary_width(refs); head = resolve_refdup("HEAD", RESOLVE_REF_READING, head_sha1, NULL); if (verbose) { for (ref = refs; ref; ref = ref->next) if (ref->status == REF_STATUS_UPTODATE) - n += print_one_push_status(ref, dest, n, porcelain); + n += print_one_push_status(ref, dest, n, + porcelain, summary_width); } for (ref = refs; ref; ref = ref->next) if (ref->status == REF_STATUS_OK) - n += print_one_push_status(ref, dest, n, porcelain); + n += print_one_push_status(ref, dest, n, + porcelain, summary_width); *reject_reasons = 0; for (ref = refs; ref; ref = ref->next) { if (ref->status != REF_STATUS_NONE && ref->status != REF_STATUS_UPTODATE && ref->status != REF_STATUS_OK) - n += print_one_push_status(ref, dest, n, porcelain); + n += print_one_push_status(ref, dest, n, + porcelain, summary_width); if (ref->status == REF_STATUS_REJECT_NONFASTFORWARD) { if (head != NULL && !strcmp(head, ref->name)) *reject_reasons |= REJECT_NON_FF_HEAD; @@ -1096,9 +1130,7 @@ static int refs_from_alternate_cb(struct alternate_object_database *e, const struct ref *extra; struct alternate_refs_data *cb = data; - e->name[-1] = '\0'; - other = xstrdup(real_path(e->base)); - e->name[-1] = '/'; + other = xstrdup(real_path(e->path)); len = strlen(other); while (other[len-1] == '/') diff --git a/transport.h b/transport.h index 68669f14d0..b8e4ee8099 100644 --- a/transport.h +++ b/transport.h @@ -147,8 +147,7 @@ struct transport { #define TRANSPORT_PUSH_ATOMIC 8192 #define TRANSPORT_PUSH_OPTIONS 16384 -#define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3) -#define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x) +extern int transport_summary_width(const struct ref *refs); /* Returns a transport suitable for the url */ struct transport *transport_get(struct remote *, const char *); diff --git a/upload-pack.c b/upload-pack.c index 5ec21e61d9..e0db8b42be 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -16,6 +16,7 @@ #include "string-list.h" #include "parse-options.h" #include "argv-array.h" +#include "prio-queue.h" static const char * const upload_pack_usage[] = { N_("git upload-pack [<options>] <dir>"), @@ -319,12 +320,12 @@ static int got_sha1(const char *hex, unsigned char *sha1) static int reachable(struct commit *want) { - struct commit_list *work = NULL; + struct prio_queue work = { compare_commits_by_commit_date }; - commit_list_insert_by_date(want, &work); - while (work) { + prio_queue_put(&work, want); + while (work.nr) { struct commit_list *list; - struct commit *commit = pop_commit(&work); + struct commit *commit = prio_queue_get(&work); if (commit->object.flags & THEY_HAVE) { want->object.flags |= COMMON_KNOWN; @@ -340,12 +341,12 @@ static int reachable(struct commit *want) for (list = commit->parents; list; list = list->next) { struct commit *parent = list->item; if (!(parent->object.flags & REACHABLE)) - commit_list_insert_by_date(parent, &work); + prio_queue_put(&work, parent); } } want->object.flags |= REACHABLE; clear_commit_marks(want, REACHABLE); - free_commit_list(work); + clear_prio_queue(&work); return (want->object.flags & COMMON_KNOWN); } @@ -397,13 +398,13 @@ static int get_common_commits(void) if (multi_ack == 2 && got_common && !got_other && ok_to_give_up()) { sent_ready = 1; - packet_write(1, "ACK %s ready\n", last_hex); + packet_write_fmt(1, "ACK %s ready\n", last_hex); } if (have_obj.nr == 0 || multi_ack) - packet_write(1, "NAK\n"); + packet_write_fmt(1, "NAK\n"); if (no_done && sent_ready) { - packet_write(1, "ACK %s\n", last_hex); + packet_write_fmt(1, "ACK %s\n", last_hex); return 0; } if (stateless_rpc) @@ -420,20 +421,20 @@ static int get_common_commits(void) const char *hex = sha1_to_hex(sha1); if (multi_ack == 2) { sent_ready = 1; - packet_write(1, "ACK %s ready\n", hex); + packet_write_fmt(1, "ACK %s ready\n", hex); } else - packet_write(1, "ACK %s continue\n", hex); + packet_write_fmt(1, "ACK %s continue\n", hex); } break; default: got_common = 1; memcpy(last_hex, sha1_to_hex(sha1), 41); if (multi_ack == 2) - packet_write(1, "ACK %s common\n", last_hex); + packet_write_fmt(1, "ACK %s common\n", last_hex); else if (multi_ack) - packet_write(1, "ACK %s continue\n", last_hex); + packet_write_fmt(1, "ACK %s continue\n", last_hex); else if (have_obj.nr == 1) - packet_write(1, "ACK %s\n", last_hex); + packet_write_fmt(1, "ACK %s\n", last_hex); break; } continue; @@ -441,10 +442,10 @@ static int get_common_commits(void) if (!strcmp(line, "done")) { if (have_obj.nr > 0) { if (multi_ack) - packet_write(1, "ACK %s\n", last_hex); + packet_write_fmt(1, "ACK %s\n", last_hex); return 0; } - packet_write(1, "NAK\n"); + packet_write_fmt(1, "NAK\n"); return -1; } die("git upload-pack: expected SHA1 list, got '%s'", line); @@ -637,8 +638,8 @@ static void send_shallow(struct commit_list *result) while (result) { struct object *object = &result->item->object; if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) { - packet_write(1, "shallow %s", - oid_to_hex(&object->oid)); + packet_write_fmt(1, "shallow %s", + oid_to_hex(&object->oid)); register_shallow(object->oid.hash); shallow_nr++; } @@ -654,8 +655,8 @@ static void send_unshallow(const struct object_array *shallows) struct object *object = shallows->objects[i].item; if (object->flags & NOT_SHALLOW) { struct commit_list *parents; - packet_write(1, "unshallow %s", - oid_to_hex(&object->oid)); + packet_write_fmt(1, "unshallow %s", + oid_to_hex(&object->oid)); object->flags &= ~CLIENT_SHALLOW; /* * We want to _register_ "object" as shallow, but we @@ -931,7 +932,7 @@ static int send_ref(const char *refname, const struct object_id *oid, struct strbuf symref_info = STRBUF_INIT; format_symref_info(&symref_info, cb_data); - packet_write(1, "%s %s%c%s%s%s%s%s agent=%s\n", + packet_write_fmt(1, "%s %s%c%s%s%s%s%s agent=%s\n", oid_to_hex(oid), refname_nons, 0, capabilities, (allow_unadvertised_object_request & ALLOW_TIP_SHA1) ? @@ -943,11 +944,11 @@ static int send_ref(const char *refname, const struct object_id *oid, git_user_agent_sanitized()); strbuf_release(&symref_info); } else { - packet_write(1, "%s %s\n", oid_to_hex(oid), refname_nons); + packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), refname_nons); } capabilities = NULL; if (!peel_ref(refname, peeled.hash)) - packet_write(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons); + packet_write_fmt(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons); return 0; } diff --git a/worktree.c b/worktree.c index 5acfe4cd64..f7869f8d60 100644 --- a/worktree.c +++ b/worktree.c @@ -345,6 +345,8 @@ const struct worktree *find_shared_symref(const char *symref, for (i = 0; worktrees[i]; i++) { struct worktree *wt = worktrees[i]; + if (wt->is_bare) + continue; if (wt->is_detached && !strcmp(symref, "HEAD")) { if (is_worktree_being_rebased(wt, target)) { diff --git a/write_or_die.c b/write_or_die.c index 073443247a..eab8c8d0b9 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -1,19 +1,6 @@ #include "cache.h" #include "run-command.h" -static void check_pipe(int err) -{ - if (err == EPIPE) { - if (in_async()) - async_exit(141); - - signal(SIGPIPE, SIG_DFL); - raise(SIGPIPE); - /* Should never happen, but just in case... */ - exit(141); - } -} - /* * Some cases use stdio, but want to flush after the write * to get error handling (and to get better interactive diff --git a/wt-status.c b/wt-status.c index 99d1b0a818..a2e9d332d8 100644 --- a/wt-status.c +++ b/wt-status.c @@ -16,6 +16,7 @@ #include "strbuf.h" #include "utf8.h" #include "worktree.h" +#include "lockfile.h" static const char cut_line[] = "------------------------ >8 ------------------------\n"; @@ -437,7 +438,7 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q, switch (p->status) { case DIFF_STATUS_ADDED: - die("BUG: worktree status add???"); + d->mode_worktree = p->two->mode; break; case DIFF_STATUS_DELETED: @@ -547,6 +548,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s) setup_revisions(0, NULL, &rev, NULL); rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK; DIFF_OPT_SET(&rev.diffopt, DIRTY_SUBMODULES); + rev.diffopt.ita_invisible_in_index = 1; if (!s->show_untracked_files) DIFF_OPT_SET(&rev.diffopt, IGNORE_UNTRACKED_IN_SUBMODULES); if (s->ignore_submodule_arg) { @@ -570,6 +572,7 @@ static void wt_status_collect_changes_index(struct wt_status *s) setup_revisions(0, NULL, &rev, &opt); DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG); + rev.diffopt.ita_invisible_in_index = 1; if (s->ignore_submodule_arg) { handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg); } else { @@ -605,6 +608,8 @@ static void wt_status_collect_changes_initial(struct wt_status *s) if (!ce_path_match(ce, &s->pathspec, NULL)) continue; + if (ce_intent_to_add(ce)) + continue; it = string_list_insert(&s->change, ce->name); d = it->util; if (!d) { @@ -911,6 +916,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s) init_revisions(&rev, NULL); DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV); + rev.diffopt.ita_invisible_in_index = 1; memset(&opt, 0, sizeof(opt)); opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference; @@ -1110,7 +1116,6 @@ static void abbrev_sha1_in_line(struct strbuf *line) split = strbuf_split_max(line, ' ', 3); if (split[0] && split[1]) { unsigned char sha1[20]; - const char *abbrev; /* * strbuf_split_max left a space. Trim it and re-add @@ -1118,9 +1123,10 @@ static void abbrev_sha1_in_line(struct strbuf *line) */ strbuf_trim(split[1]); if (!get_sha1(split[1]->buf, sha1)) { - abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV); strbuf_reset(split[1]); - strbuf_addf(split[1], "%s ", abbrev); + strbuf_add_unique_abbrev(split[1], sha1, + DEFAULT_ABBREV); + strbuf_addch(split[1], ' '); strbuf_reset(line); for (i = 0; split[i]; i++) strbuf_addbuf(line, split[i]); @@ -1343,10 +1349,8 @@ static char *get_branch(const struct worktree *wt, const char *path) else if (starts_with(sb.buf, "refs/")) ; else if (!get_sha1_hex(sb.buf, sha1)) { - const char *abbrev; - abbrev = find_unique_abbrev(sha1, DEFAULT_ABBREV); strbuf_reset(&sb); - strbuf_addstr(&sb, abbrev); + strbuf_add_unique_abbrev(&sb, sha1, DEFAULT_ABBREV); } else if (!strcmp(sb.buf, "detached HEAD")) /* rebase */ goto got_nothing; else /* bisect */ @@ -2208,3 +2212,80 @@ void wt_status_print(struct wt_status *s) break; } } + +/** + * Returns 1 if there are unstaged changes, 0 otherwise. + */ +int has_unstaged_changes(int ignore_submodules) +{ + struct rev_info rev_info; + int result; + + init_revisions(&rev_info, NULL); + if (ignore_submodules) + DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES); + DIFF_OPT_SET(&rev_info.diffopt, QUICK); + diff_setup_done(&rev_info.diffopt); + result = run_diff_files(&rev_info, 0); + return diff_result_code(&rev_info.diffopt, result); +} + +/** + * Returns 1 if there are uncommitted changes, 0 otherwise. + */ +int has_uncommitted_changes(int ignore_submodules) +{ + struct rev_info rev_info; + int result; + + if (is_cache_unborn()) + return 0; + + init_revisions(&rev_info, NULL); + if (ignore_submodules) + DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES); + DIFF_OPT_SET(&rev_info.diffopt, QUICK); + add_head_to_pending(&rev_info); + diff_setup_done(&rev_info.diffopt); + result = run_diff_index(&rev_info, 1); + return diff_result_code(&rev_info.diffopt, result); +} + +/** + * If the work tree has unstaged or uncommitted changes, dies with the + * appropriate message. + */ +int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently) +{ + struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file)); + int err = 0; + + hold_locked_index(lock_file, 0); + refresh_cache(REFRESH_QUIET); + update_index_if_able(&the_index, lock_file); + rollback_lock_file(lock_file); + + if (has_unstaged_changes(ignore_submodules)) { + /* TRANSLATORS: the action is e.g. "pull with rebase" */ + error(_("cannot %s: You have unstaged changes."), _(action)); + err = 1; + } + + if (has_uncommitted_changes(ignore_submodules)) { + if (err) + error(_("additionally, your index contains uncommitted changes.")); + else + error(_("cannot %s: Your index contains uncommitted changes."), + _(action)); + err = 1; + } + + if (err) { + if (hint) + error("%s", hint); + if (!gently) + exit(128); + } + + return err; +} diff --git a/wt-status.h b/wt-status.h index e401837707..54fec77032 100644 --- a/wt-status.h +++ b/wt-status.h @@ -128,4 +128,10 @@ void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, . __attribute__((format (printf, 3, 4))) void status_printf(struct wt_status *s, const char *color, const char *fmt, ...); +/* The following functions expect that the caller took care of reading the index. */ +int has_unstaged_changes(int ignore_submodules); +int has_uncommitted_changes(int ignore_submodules); +int require_clean_work_tree(const char *action, const char *hint, + int ignore_submodules, int gently); + #endif /* STATUS_H */ |