From: Junio C Hamano Date: Fri, 11 Nov 2016 21:56:30 +0000 (-0800) Subject: Merge branch 'js/prepare-sequencer' X-Git-Tag: v2.11.0-rc1~5 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5de732f647609de15f51e98b9c9de07115b58b5c?hp=2ae38f2a65abae910ff7ad62861414d4333d01fc Merge branch 'js/prepare-sequencer' Silence a clang warning introduced by a recently graduated topic. * js/prepare-sequencer: sequencer: silence -Wtautological-constant-out-of-range-compare --- 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 new file mode 100644 index 0000000000..c4d4397023 --- /dev/null +++ b/Documentation/RelNotes/2.10.2.txt @@ -0,0 +1,111 @@ +Git v2.10.2 Release Notes +========================= + +Fixes since v2.10.1 +------------------- + + * The code that parses the format parameter of for-each-ref command + has seen a micro-optimization. + + * 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. + + * 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. + + * Doc update to clarify what "log -3 --reverse" does. + + * 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. + + * The original command line syntax for "git merge", which was "git + merge HEAD ...", 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. + + * Codepaths that read from an on-disk loose object were too loose in + 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. + + * "git worktree", even though it used the default_abbrev setting that + 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. + + * 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. + + * 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 " 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..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..url next to + each other as if both belong to .git/config. This has been fixed. + + * Recent git allows submodule..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 44992687a2..01056d9e7a 100644 --- a/Documentation/RelNotes/2.11.0.txt +++ b/Documentation/RelNotes/2.11.0.txt @@ -1,11 +1,38 @@ 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"' by + mistake (when the user meant to give "$path"), 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 HEAD ..." + 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 repository 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. @@ -18,10 +45,10 @@ UI, Workflows & Features which was not intuitive, given that "git nosuchcommand" said "git: 'nosuchcommand' is not a git command". - * "git clone --resurse-submodules --reference $path $URL" is a way to + * "git clone --recurse-submodules --reference $path $URL" is a way to reduce network transfer cost by borrowing objects in an existing $path repository when cloning the superproject from $URL; it - learned to also peek into $path for presense of corresponding + learned to also peek into $path for presence of corresponding repositories of submodules and borrow objects from there when able. * The "git diff --submodule={short,log}" mechanism has been enhanced @@ -46,7 +73,7 @@ UI, Workflows & Features * In some projects, it is common to use "[RFC PATCH]" as the subject prefix for a patch meant for discussion rather than application. A - new option "--rfc" was a short-hand for "--subject-prefix=RFC PATCH" + new option "--rfc" is a short-hand for "--subject-prefix=RFC PATCH" to help the participants of such projects. * "git add --chmod=+x " added recently only toggled the @@ -69,8 +96,8 @@ UI, Workflows & Features * When given an abbreviated object name that is not (or more realistically, "no longer") unique, we gave a fatal error - "ambiguous argument". This error is now accompanied by hints that - lists the objects that begins with the given prefix. During the + "ambiguous argument". This error is now accompanied by a hint that + lists the objects beginning with the given prefix. During the course of development of this new feature, numerous minor bugs were uncovered and corrected, the most notable one of which is that we gave "short SHA1 xxxx is ambiguous." twice without good reason. @@ -86,6 +113,50 @@ UI, Workflows & Features to selectively allow enabling this. (merge 26a7b23429 ps/http-gssapi-cred-delegation later to maint). + * "git mergetool" learned to honor "-O" to control the + order of paths to present to the end user. + + * "git diff/log --ws-error-highlight=" 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. + + * The smudge/clean filter API expect an external process is spawned + to filter the contents for each path that has a filter defined. A + new type of "process" filter API has been added to allow the first + request to run the filter for a path to spawn a single process, and + all filtering need is served by this single process for multiple + paths, reducing the process creation overhead. + + * The user always has to say "stash@{$N}" when naming a single + element in the default location of the stash, i.e. reflogs in + refs/stash. The "git stash" command learned to accept "git stash + apply 4" as a short-hand for "git stash apply stash@{4}". + Performance, Internal Implementation, Development Support etc. @@ -133,6 +204,58 @@ Performance, Internal Implementation, Development Support etc. * The codepath in "git fsck" to detect malformed tree objects has been updated not to die but keep going after detecting them. + * We call "qsort(array, nelem, sizeof(array[0]), fn)", and most of + the time third parameter is redundant. A new QSORT() macro lets us + omit it. + + * "git pack-objects" in a repository with many packfiles used to + spend a lot of time looking for/at objects in them; the accesses to + the packfiles are now optimized by checking the most-recently-used + 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. + + * Git generally does not explicitly close file descriptors that were + open in the parent process when spawning a child process, but most + of the time the child does not want to access them. As Windows does + not allow removing or renaming a file that has a file descriptor + open, a slow-to-exit child can even break the parent process by + holding onto them. Use O_CLOEXEC flag to open files in various + codepaths. + + * Update "interpret-trailers" machinery and teaches it that people in + real world write all sorts of crufts in the "trailer" that was + originally designed to have the neat-o "Mail-Header: like thing" + and nothing else. + Also contains various documentation updates and code clean-ups. @@ -174,35 +297,28 @@ notes for details). we are sending an object C, we want a tag B that directly points at C but also a tag A that points at the tag B. We used to miss the intermediate tag B in some cases. - (merge b773dde jk/pack-tag-of-tag later to maint). * Update Japanese translation for "git-gui". - (merge 02748bc sy/git-gui-i18n-ja later to maint). * "git fetch http::/site/path" did not die correctly and segfaulted instead. - (merge d63ed6e jk/fix-remote-curl-url-wo-proto later to maint). * "git commit-tree" stopped reading commit.gpgsign configuration variable that was meant for Porcelain "git commit" in Git 2.9; we forgot to update "git gui" to look at the configuration to match this change. - (merge f14a310 js/git-gui-commit-gpgsign later to maint). * "git add --chmod=+x" added recently lacked documentation, which has been corrected. - (merge 7ef7903 et/add-chmod-x later to maint). * "git log --cherry-pick" used to include merge commits as candidates to be matched up with other commits, resulting a lot of wasted time. The patch-id generation logic has been updated to ignore merges to avoid the wastage. - (merge 7c81040 jk/patch-ids-no-merges later to maint). * The http transport (with curl-multi option, which is the default these days) failed to remove curl-easy handle from a curlm session, which led to unnecessary API failures. - (merge 2abc848 ew/http-do-not-forget-to-call-curl-multi-remove-handle later to maint). * There were numerous corner cases in which the configuration files are read and used or not read at all depending on the directory a @@ -214,23 +330,19 @@ notes for details). * "git diff -W" output needs to extend the context backward to include the header line of the current function and also forward to 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 + line of the next one. This process may have to merge two 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 configuration. - (merge cd5c281 ks/perf-build-with-autoconf later to maint). * "git format-patch --base=..." feature that was recently added showed the base commit information after "-- " e-mail signature line, which turned out to be inconvenient. The base information has been moved above the signature line. - (merge 480871e jt/format-patch-base-info-above-sig later to maint). * 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 @@ -239,13 +351,11 @@ notes for details). than nice. As the underlying commands used inside "git rebase" would fail with a more meaningful error message and advice text when the bogus ident matters, this extra check was removed. - (merge 1e461c4 jk/rebase-i-drop-ident-check later to maint). * "git gc --aggressive" used to limit the delta-chain length to 250, which is way too deep for gaining additional space savings and is detrimental for runtime performance. The limit has been reduced to 50. - (merge 07e7dbf jk/reduce-gc-aggressive-depth later to maint). * Documentation for individual configuration variables to control use of color (like `color.grep`) said that their default value is @@ -253,16 +363,13 @@ notes for details). When we updated the default value for color.ui from 'false' to 'auto' quite a while ago, all of them broke. This has been corrected. - (merge 14d16e2 mm/config-color-ui-default-to-auto later to maint). * 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). * A shell script example in check-ref-format documentation has been fixed. - (merge 92dece7 ep/doc-check-ref-format-example later to maint). * "git checkout " does not follow the usual disambiguation rules when the can be both a rev and a path, to allow @@ -270,28 +377,23 @@ notes for details). file 'foo' in the working tree without having to disambiguate. This was poorly documented and the check was incorrect when the command was run from a subdirectory. - (merge b829b94 nd/checkout-disambiguation later to maint). * Some codepaths in "git diff" used regexec(3) on a buffer that was mmap(2)ed, which may not have a terminating NUL, leading to a read beyond the end of the mapped region. This was fixed by introducing a regexec_buf() helper that takes a pair with REG_STARTEND extension. - (merge b7d36ff 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 no-no. The procedure has been updated to ask HomeBrew things we need to know to fix this. - (merge f86f49b ls/travis-homebrew-path-fix later to maint). * When "git rebase -i" is given a broken instruction, it told the user to fix it with "--edit-todo", but didn't say what the step after that was (i.e. "--continue"). - (merge 37875b4 rt/rebase-i-broken-insn-advise later to maint). * Documentation around tools to import from CVS was fairly outdated. - (merge 106b672 jk/doc-cvs-update later to maint). * "git clone --recurse-submodules" lost the progress eye-candy in recent update, which has been corrected. @@ -299,25 +401,21 @@ 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 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. - (merge 06b3d386e0 jt/fetch-pack-in-vain-count-with-stateless later to maint). * In the codepath that comes up with the hostname to be used in an e-mail when the user didn't tell us, we looked at ai_canonname field in struct addrinfo without making sure it is not NULL first. - (merge c375a7efa3 jk/ident-ai-canonname-could-be-null later to maint). * "git worktree", even though it used the default_abbrev setting that 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 @@ -330,43 +428,151 @@ 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 HEAD ...", 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 + 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. + + * The command-line completion script (in contrib/) learned to + complete "git cmd ^mas" to complete the negative end of + reference to "git cmd ^master". + (merge 49416ad22a cp/completion-negative-refs later to maint). + + * The existing "git fetch --depth=" option was hard to use + correctly when making the history of an existing shallow clone + deeper. A new option, "--deepen=", has been added to make this + easier to use. "git clone" also learned "--shallow-since=" + and "--shallow-exclude=" options to make it easier to specify + "I am interested only in the recent N months worth of history" and + "Give me only the history since that version". + (merge cccf74e2da nd/shallow-deepen later to maint). + + * It is a common mistake to say "git blame --reverse OLD path", + expecting that the command line is dwimmed as if asking how lines + in path in an old revision OLD have survived up to the current + 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. + + * "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 " 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..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..url next to + each other as if both belong to .git/config. This has been fixed. + + * 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. + + * Protect our code from over-eager compilers. + + * Recent git allows submodule..branch to use a special token + "." instead of the branch name; the documentation has been updated + to describe it. + + * A hot-fix for a test added by a recent topic that went to both + 'master' and 'maint' already. + + * "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 # 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. + + * Some AsciiDoc formatter mishandles a displayed illustration with + tabs in it. Adjust a few of them in merge-base documentation to + work around them. + + * 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). + + * Recent update to git-sh-setup (a library of shell functions that + are used by our in-tree scripted Porcelain commands) included + another shell library git-sh-i18n without specifying where it is, + relying on the $PATH. This has been fixed to be more explicit by + prefixing $(git --exec-path) output in front. + (merge 1073094f30 ak/sh-setup-dot-source-i18n-fix later to maint). * Other minor doc, test and build updates and code cleanups. - (merge e78d57e bw/pathspec-remove-unused-extern-decl later to maint). - (merge ce25e4c rs/checkout-some-states-are-const later to maint). - (merge a8342a4 rs/strbuf-remove-fix later to maint). - (merge b56aa5b rs/unpack-trees-reduce-file-scope-global later to maint). - (merge 5efc60c mr/vcs-svn-printf-ulong later to maint). - (merge a22ae75 rs/cocci later to maint). - (merge 45ccef87b3 rs/copy-array later to maint). - (merge 8201688ecd dt/mailinfo later to maint). + (merge 5c238e29a8 jk/common-main later to maint). + (merge 5a5749e45b ak/pre-receive-hook-template-modefix later to maint). + (merge 6d834ac8f1 jk/rebase-config-insn-fmt-docfix later to maint). + (merge de9f7fa3b0 rs/commit-pptr-simplify later to maint). + (merge 4259d693fc sc/fmt-merge-msg-doc-markup-fix later to maint). + (merge 28fab7b23d nd/test-helpers later to maint). + (merge c2bb0c1d1e rs/cocci later to maint). diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index 02cb6845cd..2669b87c9d 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -28,12 +28,13 @@ include::line-range-format.txt[] -S :: Use revisions from revs-file instead of calling linkgit:git-rev-list[1]. ---reverse:: +--reverse ..:: Walk history forward instead of backward. Instead of showing the revision in which a line appeared, this shows the last revision in which a line has existed. This requires a range of revision like START..END where the path to blame exists in - START. + START. `git blame --reverse START` is taken as `git blame + --reverse START..HEAD` for convenience. -p:: --porcelain:: diff --git a/Documentation/config.txt b/Documentation/config.txt index a17947462a..a0ab66aae7 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2450,7 +2450,7 @@ rebase.missingCommitsCheck:: command in the todo-list. Defaults to "ignore". -rebase.instructionFormat +rebase.instructionFormat:: A format string, as specified in linkgit:git-log[1], to be used for the instruction list during an interactive rebase. The format will automatically have the long commit hash prepended to the format. @@ -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..path:: submodule..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..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=` 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=:: 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/fetch-options.txt b/Documentation/fetch-options.txt index 9eab1f5fa4..fb6bebbc61 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -14,6 +14,20 @@ linkgit:git-clone[1]), deepen or shorten the history to the specified number of commits. Tags for the deepened commits are not fetched. +--deepen=:: + Similar to --depth, except it specifies the number of commits + from the current shallow boundary instead of from the tip of + each remote branch history. + +--shallow-since=:: + Deepen or shorten the history of a shallow repository to + include all reachable commits after . + +--shallow-exclude=:: + Deepen or shorten the history of a shallow repository to + exclude commits reachable from a specified remote branch or tag. + This option can be specified multiple times. + --unshallow:: If the source repository is complete, convert a shallow repository to a complete one, removing all the limitations diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index 9dccb3319b..fdc3aea30a 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L ] [-S ] [-M] [-C] [-C] [-C] [--since=] - [--progress] [--abbrev=] [ | --contents | --reverse ] + [--progress] [--abbrev=] [ | --contents | --reverse ..] [--] DESCRIPTION diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index e316c4bd51..35cc34b2fb 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -197,6 +197,14 @@ objects from the source repository into a pack in the cloned repository. tips of all branches. If you want to clone submodules shallowly, also pass `--shallow-submodules`. +--shallow-since=:: + Create a shallow clone with a history after the specified time. + +--shallow-exclude=:: + Create a shallow clone with a history, excluding commits + reachable from a specified remote branch or tag. This option + can be specified multiple times. + --[no-]single-branch:: Clone only the history leading to the tip of a single branch, either specified by the `--branch` option or the primary 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-fetch-pack.txt b/Documentation/git-fetch-pack.txt index 24417ee3a6..d45f6adc69 100644 --- a/Documentation/git-fetch-pack.txt +++ b/Documentation/git-fetch-pack.txt @@ -87,6 +87,20 @@ be in a separate packet, and the list must end with a flush packet. 'git-upload-pack' treats the special depth 2147483647 as infinite even if there is an ancestor-chain that long. +--shallow-since=:: + Deepen or shorten the history of a shallow'repository to + include all reachable commits after . + +--shallow-exclude=:: + Deepen or shorten the history of a shallow repository to + exclude commits reachable from a specified remote branch or tag. + This option can be specified multiple times. + +--deepen-relative:: + Argument --depth specifies the number of commits from the + current shallow boundary instead of from the tip of each + remote branch history. + --no-progress:: Do not show the progress. diff --git a/Documentation/git-fmt-merge-msg.txt b/Documentation/git-fmt-merge-msg.txt index 6526b178e8..44892c447e 100644 --- a/Documentation/git-fmt-merge-msg.txt +++ b/Documentation/git-fmt-merge-msg.txt @@ -60,10 +60,10 @@ merge.summary:: EXAMPLE ------- --- +--------- $ git fetch origin master $ git fmt-merge-msg --log <$GIT_DIR/FETCH_HEAD --- +--------- Print a log message describing a merge of the "master" branch from the "origin" remote. diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt index 93d1db6528..e99bda6add 100644 --- a/Documentation/git-interpret-trailers.txt +++ b/Documentation/git-interpret-trailers.txt @@ -48,19 +48,21 @@ with only spaces at the end of the commit message part, one blank line will be added before the new trailer. Existing trailers are extracted from the input message by looking for -a group of one or more lines that contain a colon (by default), where -the group is preceded by one or more empty (or whitespace-only) lines. +a group of one or more lines that (i) are all trailers, or (ii) contains at +least one Git-generated trailer and consists of at least 25% trailers. +The group must be preceded by one or more empty (or whitespace-only) lines. The group must either be at the end of the message or be the last non-whitespace lines before a line that starts with '---'. Such three minus signs start the patch part of the message. -When reading trailers, there can be whitespaces before and after the +When reading trailers, there can be whitespaces after the token, the separator and the value. There can also be whitespaces -inside the token and the value. +inside the token and the value. The value may be split over multiple lines with +each subsequent line starting with whitespace, like the "folding" in RFC 822. Note that 'trailers' do not follow and are not intended to follow many -rules for RFC 822 headers. For example they do not follow the line -folding rules, the encoding rules and probably many other rules. +rules for RFC 822 headers. For example they do not follow +the encoding rules and probably many other rules. OPTIONS ------- 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=] [--exclude-standard] [--error-unmatch] [--with-tree=] - [--full-name] [--abbrev] [--] [...] + [--full-name] [--recurse-submodules] + [--abbrev] [--] [...] 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[=]:: 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:: + Process files in the order specified in the + , 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-stash.txt b/Documentation/git-stash.txt index 92df596e5f..2e9cef06e6 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -39,7 +39,8 @@ The latest stash you created is stored in `refs/stash`; older stashes are found in the reflog of this reference and can be named using the usual reflog syntax (e.g. `stash@{0}` is the most recently created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}` -is also possible). +is also possible). Stashes may also be referenced by specifying just the +stash index (e.g. the integer `n` is equivalent to `stash@{n}`). OPTIONS ------- 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..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[=]] [--html-path] [--man-path] [--info-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=] [--work-tree=] [--namespace=] + [--super-prefix=] [] 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=:: + 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..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..required` flag, mimicking the +behavior of the `filter..clean` / `filter..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..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..clean` +or `filter..smudge` command with `filter..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..update:: submodule..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..fetchRecurseSubmodules:: This option can be used to control recursive fetching of this diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt index a4de50ad22..9e8681f9e1 100644 --- a/Documentation/gitremote-helpers.txt +++ b/Documentation/gitremote-helpers.txt @@ -415,6 +415,17 @@ set by Git if the remote helper has the 'option' capability. 'option depth' :: Deepens the history of a shallow repository. +'option deepen-since :: + Deepens the history of a shallow repository based on time. + +'option deepen-not :: + Deepens the history of a shallow repository excluding ref. + Multiple options add up. + +'option deepen-relative {'true'|'false'}:: + Deepens the history of a shallow repository relative to + current boundary. Only valid when used with "option depth". + 'option followtags' {'true'|'false'}:: If enabled the helper should automatically fetch annotated tag objects if the object the tag points at was transferred 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 diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt index 736f3894a8..c59ac9936a 100644 --- a/Documentation/technical/pack-protocol.txt +++ b/Documentation/technical/pack-protocol.txt @@ -219,7 +219,9 @@ out of what the server said it could do with the first 'want' line. shallow-line = PKT-LINE("shallow" SP obj-id) - depth-request = PKT-LINE("deepen" SP depth) + depth-request = PKT-LINE("deepen" SP depth) / + PKT-LINE("deepen-since" SP timestamp) / + PKT-LINE("deepen-not" SP ref) first-want = PKT-LINE("want" SP obj-id SP capability-list) additional-want = PKT-LINE("want" SP obj-id) diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt index 4c28d3a8ae..26dcc6f502 100644 --- a/Documentation/technical/protocol-capabilities.txt +++ b/Documentation/technical/protocol-capabilities.txt @@ -179,6 +179,31 @@ This capability adds "deepen", "shallow" and "unshallow" commands to the fetch-pack/upload-pack protocol so clients can request shallow clones. +deepen-since +------------ + +This capability adds "deepen-since" command to fetch-pack/upload-pack +protocol so the client can request shallow clones that are cut at a +specific time, instead of depth. Internally it's equivalent of doing +"rev-list --max-age=" on the server side. "deepen-since" +cannot be used with "deepen". + +deepen-not +---------- + +This capability adds "deepen-not" command to fetch-pack/upload-pack +protocol so the client can request shallow clones that are cut at a +specific revision, instead of depth. Internally it's equivalent of +doing "rev-list --not " on the server side. "deepen-not" +cannot be used with "deepen", but can be used with "deepen-since". + +deepen-relative +--------------- + +If this capability is requested by the client, the semantics of +"deepen" command is changed. The "depth" argument is the depth from +the current shallow boundary, instead of the depth from remote refs. + no-progress ----------- diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 55e88b02d4..feddf2326b 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.10.0.GIT +DEF_VER=v2.11.0-rc0 LF=' ' diff --git a/Makefile b/Makefile index 1aad150b34..9d6c245031 100644 --- a/Makefile +++ b/Makefile @@ -467,6 +467,7 @@ SPATCH = spatch export TCL_PATH TCLTK_PATH SPARSE_FLAGS = +SPATCH_FLAGS = --all-includes @@ -831,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 @@ -2314,7 +2316,7 @@ C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ)) %.cocci.patch: %.cocci $(C_SOURCES) @echo ' ' SPATCH $<; \ for f in $(C_SOURCES); do \ - $(SPATCH) --sp-file $< $$f; \ + $(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS); \ done >$@ 2>$@.log; \ if test -s $@; \ then \ diff --git a/apply.c b/apply.c index b03d274b52..705cf562f0 100644 --- a/apply.c +++ b/apply.c @@ -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.", diff --git a/attr.c b/attr.c index eec5d7d15a..1fcf042b87 100644 --- a/attr.c +++ b/attr.c @@ -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/bisect.c b/bisect.c index 6f512c2063..21bc6daa43 100644 --- a/bisect.c +++ b/bisect.c @@ -215,7 +215,7 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n array[cnt].distance = distance; cnt++; } - qsort(array, cnt, sizeof(*array), compare_commit_dist); + QSORT(array, cnt, compare_commit_dist); for (p = list, i = 0; i < cnt; i++) { char buf[100]; /* enough for dist=%d */ struct object *obj = &(array[i].commit->object); 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/blame.c b/builtin/blame.c index da44b36ff5..4ddfadb71f 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -2456,6 +2456,41 @@ static char *prepare_final(struct scoreboard *sb) return xstrdup_or_null(name); } +static const char *dwim_reverse_initial(struct scoreboard *sb) +{ + /* + * DWIM "git blame --reverse ONE -- PATH" as + * "git blame --reverse ONE..HEAD -- PATH" but only do so + * when it makes sense. + */ + struct object *obj; + struct commit *head_commit; + unsigned char head_sha1[20]; + + if (sb->revs->pending.nr != 1) + return NULL; + + /* Is that sole rev a committish? */ + obj = sb->revs->pending.objects[0].item; + obj = deref_tag(obj, NULL, 0); + if (obj->type != OBJ_COMMIT) + return NULL; + + /* Do we have HEAD? */ + if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_sha1, NULL)) + return NULL; + head_commit = lookup_commit_reference_gently(head_sha1, 1); + if (!head_commit) + return NULL; + + /* Turn "ONE" into "ONE..HEAD" then */ + obj->flags |= UNINTERESTING; + add_pending_object(sb->revs, &head_commit->object, "HEAD"); + + sb->final = (struct commit *)obj; + return sb->revs->pending.objects[0].name; +} + static char *prepare_initial(struct scoreboard *sb) { int i; @@ -2474,14 +2509,17 @@ static char *prepare_initial(struct scoreboard *sb) if (obj->type != OBJ_COMMIT) die("Non commit %s?", revs->pending.objects[i].name); if (sb->final) - die("More than one commit to dig down to %s and %s?", + die("More than one commit to dig up from, %s and %s?", revs->pending.objects[i].name, final_commit_name); sb->final = (struct commit *) obj; final_commit_name = revs->pending.objects[i].name; } + + if (!final_commit_name) + final_commit_name = dwim_reverse_initial(sb); if (!final_commit_name) - die("No commit to dig down to?"); + die("No commit to dig up from?"); return xstrdup(final_commit_name); } diff --git a/builtin/cat-file.c b/builtin/cat-file.c index cca97a86c0..30383e9eb4 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -53,7 +53,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name, char *buf; unsigned long size; struct object_context obj_context; - struct object_info oi = {NULL}; + struct object_info oi = OBJECT_INFO_INIT; struct strbuf sb = STRBUF_INIT; unsigned flags = LOOKUP_REPLACE_OBJECT; const char *path = force_path; @@ -449,8 +449,7 @@ static int batch_objects(struct batch_options *opt) data.split_on_whitespace = 1; if (opt->all_objects) { - struct object_info empty; - memset(&empty, 0, sizeof(empty)); + struct object_info empty = OBJECT_INFO_INIT; if (!memcmp(&data.info, &empty, sizeof(empty))) data.skip_object_info = 1; } diff --git a/builtin/clone.c b/builtin/clone.c index fb75f7ee64..6c76a6ed66 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -41,9 +41,11 @@ static const char * const builtin_clone_usage[] = { static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1; static int option_local = -1, option_no_hardlinks, option_shared, option_recursive; static int option_shallow_submodules; -static char *option_template, *option_depth; +static int deepen; +static char *option_template, *option_depth, *option_since; static char *option_origin = NULL; static char *option_branch = NULL; +static struct string_list option_not = STRING_LIST_INIT_NODUP; static const char *real_git_dir; static char *option_upload_pack = "git-upload-pack"; static int option_verbosity; @@ -94,6 +96,10 @@ static struct option builtin_clone_options[] = { N_("path to git-upload-pack on the remote")), OPT_STRING(0, "depth", &option_depth, N_("depth"), N_("create a shallow clone of that depth")), + OPT_STRING(0, "shallow-since", &option_since, N_("time"), + N_("create a shallow clone since a specific time")), + OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("revision"), + N_("deepen history of shallow clone by excluding rev")), OPT_BOOL(0, "single-branch", &option_single_branch, N_("clone only one branch, HEAD or --branch")), OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules, @@ -345,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); @@ -861,8 +870,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) usage_msg_opt(_("You must specify a repository to clone."), builtin_clone_usage, builtin_clone_options); + if (option_depth || option_since || option_not.nr) + deepen = 1; if (option_single_branch == -1) - option_single_branch = option_depth ? 1 : 0; + option_single_branch = deepen ? 1 : 0; if (option_mirror) option_bare = 1; @@ -1006,6 +1017,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (is_local) { if (option_depth) warning(_("--depth is ignored in local clones; use file:// instead.")); + if (option_since) + warning(_("--shallow-since is ignored in local clones; use file:// instead.")); + if (option_not.nr) + warning(_("--shallow-exclude is ignored in local clones; use file:// instead.")); if (!access(mkpath("%s/shallow", path), F_OK)) { if (option_local > 0) warning(_("source repository is shallow, ignoring --local")); @@ -1024,6 +1039,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (option_depth) transport_set_option(transport, TRANS_OPT_DEPTH, option_depth); + if (option_since) + transport_set_option(transport, TRANS_OPT_DEEPEN_SINCE, + option_since); + if (option_not.nr) + transport_set_option(transport, TRANS_OPT_DEEPEN_NOT, + (const char *)&option_not); if (option_single_branch) transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1"); @@ -1031,7 +1052,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) transport_set_option(transport, TRANS_OPT_UPLOADPACK, option_upload_pack); - if (transport->smart_options && !option_depth) + if (transport->smart_options && !deepen) transport->smart_options->check_self_contained_and_connected = 1; refs = transport_get_remote_refs(transport); diff --git a/builtin/commit.c b/builtin/commit.c index 9fddb195c5..8976c3d29b 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -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); @@ -1637,7 +1642,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) const char *index_file, *reflog_msg; char *nl; unsigned char sha1[20]; - struct commit_list *parents = NULL, **pptr = &parents; + struct commit_list *parents = NULL; struct stat statbuf; struct commit *current_head = NULL; struct commit_extra_header *extra = NULL; @@ -1683,20 +1688,18 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (!reflog_msg) reflog_msg = "commit (initial)"; } else if (amend) { - struct commit_list *c; - if (!reflog_msg) reflog_msg = "commit (amend)"; - for (c = current_head->parents; c; c = c->next) - pptr = &commit_list_insert(c->item, pptr)->next; + parents = copy_commit_list(current_head->parents); } else if (whence == FROM_MERGE) { struct strbuf m = STRBUF_INIT; FILE *fp; int allow_fast_forward = 1; + struct commit_list **pptr = &parents; if (!reflog_msg) reflog_msg = "commit (merge)"; - pptr = &commit_list_insert(current_head, pptr)->next; + pptr = commit_list_append(current_head, pptr); fp = fopen(git_path_merge_head(), "r"); if (fp == NULL) die_errno(_("could not open '%s' for reading"), @@ -1707,7 +1710,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) parent = get_merge_parent(m.buf); if (!parent) die(_("Corrupt MERGE_HEAD file (%s)"), m.buf); - pptr = &commit_list_insert(parent, pptr)->next; + pptr = commit_list_append(parent, pptr); } fclose(fp); strbuf_release(&m); @@ -1724,7 +1727,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) reflog_msg = (whence == FROM_CHERRY_PICK) ? "commit (cherry-pick)" : "commit"; - pptr = &commit_list_insert(current_head, pptr)->next; + commit_list_insert(current_head, &parents); } /* Finally, get the commit message */ 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/describe.c b/builtin/describe.c index 8a25abe0a0..01490a157e 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -352,7 +352,7 @@ static void describe(const char *arg, int last_one) oid_to_hex(oid)); } - qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt); + QSORT(all_matches, match_cnt, compare_pt); if (gave_up_on) { commit_list_insert_by_date(gave_up_on, &list); diff --git a/builtin/fast-export.c b/builtin/fast-export.c index c0652a7ed0..1e815b5577 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -347,7 +347,7 @@ static void show_filemodify(struct diff_queue_struct *q, * Handle files below a directory first, in case they are all deleted * and the directory changes to a file or symlink. */ - qsort(q->queue, q->nr, sizeof(q->queue[0]), depth_first); + QSORT(q->queue, q->nr, depth_first); for (i = 0; i < q->nr; i++) { struct diff_filespec *ospec = q->queue[i]->one; diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index bfd0be44a9..cfe9e447c2 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -51,6 +51,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) struct child_process *conn; struct fetch_pack_args args; struct sha1_array shallow = SHA1_ARRAY_INIT; + struct string_list deepen_not = STRING_LIST_INIT_DUP; packet_trace_identity("fetch-pack"); @@ -60,12 +61,12 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) for (i = 1; i < argc && *argv[i] == '-'; i++) { const char *arg = argv[i]; - if (starts_with(arg, "--upload-pack=")) { - args.uploadpack = arg + 14; + if (skip_prefix(arg, "--upload-pack=", &arg)) { + args.uploadpack = arg; continue; } - if (starts_with(arg, "--exec=")) { - args.uploadpack = arg + 7; + if (skip_prefix(arg, "--exec=", &arg)) { + args.uploadpack = arg; continue; } if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) { @@ -101,8 +102,20 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) args.verbose = 1; continue; } - if (starts_with(arg, "--depth=")) { - args.depth = strtol(arg + 8, NULL, 0); + if (skip_prefix(arg, "--depth=", &arg)) { + args.depth = strtol(arg, NULL, 0); + continue; + } + if (skip_prefix(arg, "--shallow-since=", &arg)) { + args.deepen_since = xstrdup(arg); + continue; + } + if (skip_prefix(arg, "--shallow-exclude=", &arg)) { + string_list_append(&deepen_not, arg); + continue; + } + if (!strcmp(arg, "--deepen-relative")) { + args.deepen_relative = 1; continue; } if (!strcmp("--no-progress", arg)) { @@ -132,6 +145,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) } usage(fetch_pack_usage); } + if (deepen_not.nr) + args.deepen_not = &deepen_not; if (i < argc) dest = argv[i++]; diff --git a/builtin/fetch.c b/builtin/fetch.c index 164623bb6f..b6a5597cbf 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -35,13 +35,15 @@ static int fetch_prune_config = -1; /* unspecified */ static int prune = -1; /* unspecified */ #define PRUNE_BY_DEFAULT 0 /* do we prune by default? */ -static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity; +static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity, deepen_relative; static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT; -static int tags = TAGS_DEFAULT, unshallow, update_shallow; +static int tags = TAGS_DEFAULT, unshallow, update_shallow, deepen; static int max_children = -1; static enum transport_family family; static const char *depth; +static const char *deepen_since; static const char *upload_pack; +static struct string_list deepen_not = STRING_LIST_INIT_NODUP; static struct strbuf default_rla = STRBUF_INIT; static struct transport *gtransport; static struct transport *gsecondary; @@ -117,6 +119,12 @@ static struct option builtin_fetch_options[] = { OPT_BOOL(0, "progress", &progress, N_("force progress reporting")), OPT_STRING(0, "depth", &depth, N_("depth"), N_("deepen history of shallow clone")), + OPT_STRING(0, "shallow-since", &deepen_since, N_("time"), + N_("deepen history of shallow repository based on time")), + OPT_STRING_LIST(0, "shallow-exclude", &deepen_not, N_("revision"), + N_("deepen history of shallow clone by excluding rev")), + OPT_INTEGER(0, "deepen", &deepen_relative, + N_("deepen history of shallow clone")), { OPTION_SET_INT, 0, "unshallow", &unshallow, NULL, N_("convert to a complete repository"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, NULL, 1 }, @@ -233,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; @@ -248,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; @@ -268,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; @@ -566,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 @@ -580,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; @@ -594,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; } @@ -608,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; } @@ -618,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; } @@ -651,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; } @@ -667,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) { @@ -682,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; } } @@ -718,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) @@ -827,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"), @@ -875,7 +892,7 @@ static int quickfetch(struct ref *ref_map) * really need to perform. Claiming failure now will ensure * we perform the network exchange to deepen our history. */ - if (depth) + if (deepen) return -1; opt.quiet = 1; return check_connected(iterate_ref_map, &rm, &opt); @@ -900,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)"); @@ -935,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); @@ -983,7 +1002,7 @@ static void set_option(struct transport *transport, const char *name, const char name, transport->url); } -static struct transport *prepare_transport(struct remote *remote) +static struct transport *prepare_transport(struct remote *remote, int deepen) { struct transport *transport; transport = transport_get(remote, NULL); @@ -995,6 +1014,13 @@ static struct transport *prepare_transport(struct remote *remote) set_option(transport, TRANS_OPT_KEEP, "yes"); if (depth) set_option(transport, TRANS_OPT_DEPTH, depth); + if (deepen && deepen_since) + set_option(transport, TRANS_OPT_DEEPEN_SINCE, deepen_since); + if (deepen && deepen_not.nr) + set_option(transport, TRANS_OPT_DEEPEN_NOT, + (const char *)&deepen_not); + if (deepen_relative) + set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, "yes"); if (update_shallow) set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes"); return transport; @@ -1002,13 +1028,25 @@ static struct transport *prepare_transport(struct remote *remote) static void backfill_tags(struct transport *transport, struct ref *ref_map) { - if (transport->cannot_reuse) { - gsecondary = prepare_transport(transport->remote); + int cannot_reuse; + + /* + * Once we have set TRANS_OPT_DEEPEN_SINCE, we can't unset it + * when remote helper is used (setting it to an empty string + * is not unsetting). We could extend the remote helper + * protocol for that, but for now, just force a new connection + * without deepen-since. Similar story for deepen-not. + */ + cannot_reuse = transport->cannot_reuse || + deepen_since || deepen_not.nr; + if (cannot_reuse) { + gsecondary = prepare_transport(transport->remote, 0); transport = gsecondary; } transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL); transport_set_option(transport, TRANS_OPT_DEPTH, "0"); + transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL); fetch_refs(transport, ref_map); if (gsecondary) { @@ -1219,7 +1257,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv) die(_("No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched.")); - gtransport = prepare_transport(remote); + gtransport = prepare_transport(remote, 1); if (prune < 0) { /* no command line request */ @@ -1279,6 +1317,13 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, builtin_fetch_options, builtin_fetch_usage, 0); + if (deepen_relative) { + if (deepen_relative < 0) + die(_("Negative depth in --deepen is not supported")); + if (depth) + die(_("--deepen and --depth are mutually exclusive")); + depth = xstrfmt("%d", deepen_relative); + } if (unshallow) { if (depth) die(_("--depth and --unshallow cannot be used together")); @@ -1291,6 +1336,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) /* no need to be strict, transport_set_option() will validate it again */ if (depth && atoi(depth) < 1) die(_("depth %s is not a positive number"), depth); + if (depth || deepen_since || deepen_not.nr) + deepen = 1; if (recurse_submodules != RECURSE_SUBMODULES_OFF) { if (recurse_submodules_default) { diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index dc2e9e420d..efab62fd85 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -314,14 +314,10 @@ static void add_people_info(struct strbuf *out, struct string_list *authors, struct string_list *committers) { - if (authors->nr) - qsort(authors->items, - authors->nr, sizeof(authors->items[0]), - cmp_string_list_util_as_integral); - if (committers->nr) - qsort(committers->items, - committers->nr, sizeof(committers->items[0]), - cmp_string_list_util_as_integral); + QSORT(authors->items, authors->nr, + cmp_string_list_util_as_integral); + QSORT(committers->items, committers->nr, + cmp_string_list_util_as_integral); credit_people(out, authors, 'a'); credit_people(out, committers, 'c'); 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/index-pack.c b/builtin/index-pack.c index 4a8b4aebba..0a27bab11b 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1190,10 +1190,8 @@ static void resolve_deltas(void) return; /* Sort deltas by base SHA1/offset for fast searching */ - qsort(ofs_deltas, nr_ofs_deltas, sizeof(struct ofs_delta_entry), - compare_ofs_delta_entry); - qsort(ref_deltas, nr_ref_deltas, sizeof(struct ref_delta_entry), - compare_ref_delta_entry); + QSORT(ofs_deltas, nr_ofs_deltas, compare_ofs_delta_entry); + QSORT(ref_deltas, nr_ref_deltas, compare_ref_delta_entry); if (verbose || show_resolving_progress) progress = start_progress(_("Resolving deltas"), @@ -1356,7 +1354,7 @@ static void fix_unresolved_deltas(struct sha1file *f) ALLOC_ARRAY(sorted_by_pos, nr_ref_deltas); for (i = 0; i < nr_ref_deltas; i++) sorted_by_pos[i] = &ref_deltas[i]; - qsort(sorted_by_pos, nr_ref_deltas, sizeof(*sorted_by_pos), delta_pos_compare); + QSORT(sorted_by_pos, nr_ref_deltas, delta_pos_compare); for (i = 0; i < nr_ref_deltas; i++) { struct ref_delta_entry *d = sorted_by_pos[i]; @@ -1533,8 +1531,7 @@ static void read_v2_anomalous_offsets(struct packed_git *p, opts->anomaly[opts->anomaly_nr++] = ntohl(idx2[off * 2 + 1]); } - if (1 < opts->anomaly_nr) - qsort(opts->anomaly, opts->anomaly_nr, sizeof(uint32_t), cmp_uint32); + QSORT(opts->anomaly, opts->anomaly_nr, cmp_uint32); } static void read_idx_option(struct pack_idx_option *opts, const char *pack_name) 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; @@ -67,12 +71,25 @@ 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 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/mktree.c b/builtin/mktree.c index 4282b62c59..de9b40fc63 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -46,7 +46,7 @@ static void write_tree(unsigned char *sha1) size_t size; int i; - qsort(entries, used, sizeof(*entries), ent_compare); + QSORT(entries, used, ent_compare); for (size = i = 0; i < used; i++) size += 32 + entries[i]->len; diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 57be35faf5..cd89d48b65 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -195,8 +195,7 @@ static const char *get_exact_ref_match(const struct object *o) return NULL; if (!tip_table.sorted) { - qsort(tip_table.table, tip_table.nr, sizeof(*tip_table.table), - tipcmp); + QSORT(tip_table.table, tip_table.nr, tipcmp); tip_table.sorted = 1; } diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 166e52c700..0fd52bd6b4 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -23,6 +23,7 @@ #include "reachable.h" #include "sha1-array.h" #include "argv-array.h" +#include "mru.h" static const char *pack_usage[] = { N_("git pack-objects --stdout [...] [< | < ]"), @@ -719,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); @@ -994,7 +995,7 @@ static int want_object_in_pack(const unsigned char *sha1, struct packed_git **found_pack, off_t *found_offset) { - struct packed_git *p; + struct mru_entry *entry; int want; if (!exclude && local && has_loose_object_nonlocal(sha1)) @@ -1011,7 +1012,8 @@ static int want_object_in_pack(const unsigned char *sha1, return want; } - for (p = packed_git; p; p = p->next) { + for (entry = packed_git_mru->head; entry; entry = entry->next) { + struct packed_git *p = entry->item; off_t offset; if (p == *found_pack) @@ -1027,6 +1029,8 @@ static int want_object_in_pack(const unsigned char *sha1, *found_pack = p; } want = want_found_object(exclude, p); + if (!exclude && want > 0) + mru_mark(packed_git_mru, entry); if (want != -1) return want; } @@ -1527,6 +1531,83 @@ static int pack_offset_sort(const void *_a, const void *_b) (a->in_pack_offset > b->in_pack_offset); } +/* + * Drop an on-disk delta we were planning to reuse. Naively, this would + * just involve blanking out the "delta" field, but we have to deal + * with some extra book-keeping: + * + * 1. Removing ourselves from the delta_sibling linked list. + * + * 2. Updating our size/type to the non-delta representation. These were + * either not recorded initially (size) or overwritten with the delta type + * (type) when check_object() decided to reuse the delta. + */ +static void drop_reused_delta(struct object_entry *entry) +{ + struct object_entry **p = &entry->delta->delta_child; + struct object_info oi = OBJECT_INFO_INIT; + + while (*p) { + if (*p == entry) + *p = (*p)->delta_sibling; + else + p = &(*p)->delta_sibling; + } + entry->delta = NULL; + + oi.sizep = &entry->size; + oi.typep = &entry->type; + if (packed_object_info(entry->in_pack, entry->in_pack_offset, &oi) < 0) { + /* + * We failed to get the info from this pack for some reason; + * fall back to sha1_object_info, which may find another copy. + * And if that fails, the error will be recorded in entry->type + * and dealt with in prepare_pack(). + */ + entry->type = sha1_object_info(entry->idx.sha1, &entry->size); + } +} + +/* + * Follow the chain of deltas from this entry onward, throwing away any links + * that cause us to hit a cycle (as determined by the DFS state flags in + * the entries). + */ +static void break_delta_chains(struct object_entry *entry) +{ + /* If it's not a delta, it can't be part of a cycle. */ + if (!entry->delta) { + entry->dfs_state = DFS_DONE; + return; + } + + switch (entry->dfs_state) { + case DFS_NONE: + /* + * This is the first time we've seen the object. We mark it as + * part of the active potential cycle and recurse. + */ + entry->dfs_state = DFS_ACTIVE; + break_delta_chains(entry->delta); + entry->dfs_state = DFS_DONE; + break; + + case DFS_DONE: + /* object already examined, and not part of a cycle */ + break; + + case DFS_ACTIVE: + /* + * We found a cycle that needs broken. It would be correct to + * break any link in the chain, but it's convenient to + * break this one. + */ + drop_reused_delta(entry); + entry->dfs_state = DFS_DONE; + break; + } +} + static void get_object_details(void) { uint32_t i; @@ -1535,7 +1616,7 @@ static void get_object_details(void) sorted_by_offset = xcalloc(to_pack.nr_objects, sizeof(struct object_entry *)); for (i = 0; i < to_pack.nr_objects; i++) sorted_by_offset[i] = to_pack.objects + i; - qsort(sorted_by_offset, to_pack.nr_objects, sizeof(*sorted_by_offset), pack_offset_sort); + QSORT(sorted_by_offset, to_pack.nr_objects, pack_offset_sort); for (i = 0; i < to_pack.nr_objects; i++) { struct object_entry *entry = sorted_by_offset[i]; @@ -1544,6 +1625,13 @@ static void get_object_details(void) entry->no_try_delta = 1; } + /* + * This must happen in a second pass, since we rely on the delta + * information for the whole list being completed. + */ + for (i = 0; i < to_pack.nr_objects; i++) + break_delta_chains(&to_pack.objects[i]); + free(sorted_by_offset); } @@ -2257,7 +2345,7 @@ static void prepare_pack(int window, int depth) if (progress) progress_state = start_progress(_("Compressing objects"), nr_deltas); - qsort(delta_list, n, sizeof(*delta_list), type_size_sort); + QSORT(delta_list, n, type_size_sort); ll_find_deltas(delta_list, n, window+1, depth, &nr_done); stop_progress(&progress_state); if (nr_done != nr_deltas) @@ -2449,8 +2537,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs) } if (in_pack.nr) { - qsort(in_pack.array, in_pack.nr, sizeof(in_pack.array[0]), - ofscmp); + QSORT(in_pack.array, in_pack.nr, ofscmp); for (i = 0; i < in_pack.nr; i++) { struct object *o = in_pack.array[i].object; add_object_entry(o->oid.hash, o->type, "", 0); 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, @@ -325,73 +326,6 @@ static int git_pull_config(const char *var, const char *value, void *cb) return git_default_config(var, value, 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 "), @@ -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/remote.c b/builtin/remote.c index 9f6a6b3a9c..e52cf3925b 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -1197,8 +1197,7 @@ static int show(int argc, const char **argv) info.width = info.width2 = 0; for_each_string_list(&states.push, add_push_to_show_info, &info); - qsort(info.list->items, info.list->nr, - sizeof(*info.list->items), cmp_string_with_push); + QSORT(info.list->items, info.list->nr, cmp_string_with_push); if (info.list->nr) printf_ln(Q_(" Local ref configured for 'git push'%s:", " Local refs configured for 'git push'%s:", 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] []"), - N_("git reset [-q] [--] ..."), + N_("git reset [-q] [] [--] ..."), N_("git reset --patch [] [--] [...]"), 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/shortlog.c b/builtin/shortlog.c index 25fa8a6aed..ba0e1154a9 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -308,7 +308,7 @@ void shortlog_output(struct shortlog *log) struct strbuf sb = STRBUF_INIT; if (log->sort_by_number) - qsort(log->list.items, log->list.nr, sizeof(struct string_list_item), + QSORT(log->list.items, log->list.nr, log->summary ? compare_by_counter : compare_by_list); for (i = 0; i < log->list.nr; i++) { const struct string_list_item *item = &log->list.items[i]; diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 623ca563a2..974f3403ab 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -353,8 +353,7 @@ static int compare_ref_name(const void *a_, const void *b_) static void sort_ref_range(int bottom, int top) { - qsort(ref_name + bottom, top - bottom, sizeof(ref_name[0]), - compare_ref_name); + QSORT(ref_name + bottom, top - bottom, compare_ref_name); } static int append_ref(const char *refname, const struct object_id *oid, @@ -540,8 +539,7 @@ static void append_one_rev(const char *av) if (saved_matches == ref_name_cnt && ref_name_cnt < MAX_REVS) error(_("no matching refs with %s"), av); - if (saved_matches + 1 < ref_name_cnt) - sort_ref_range(saved_matches, ref_name_cnt); + sort_ref_range(saved_matches, ref_name_cnt); return; } die("bad sha1 reference %s", av); 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//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) { diff --git a/cache.h b/cache.h index 1604e29878..a50a61a197 100644 --- a/cache.h +++ b/cache.h @@ -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); @@ -1602,7 +1645,15 @@ struct object_info { } packed; } u; }; + +/* + * Initializer for a "struct object_info" that wants no items. You may + * also memset() the memory to all-zeroes. + */ +#define OBJECT_INFO_INIT {NULL} + extern int sha1_object_info_extended(const unsigned char *, struct object_info *, unsigned flags); +extern int packed_object_info(struct packed_git *pack, off_t offset, struct object_info *); /* Dumb servers support */ extern int update_server_info(int); 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/commit.h b/commit.h index 32e1a113e5..afd14f318c 100644 --- a/commit.h +++ b/commit.h @@ -267,6 +267,8 @@ extern int for_each_commit_graft(each_commit_graft_fn, void *); extern int is_repository_shallow(void); extern struct commit_list *get_shallow_commits(struct object_array *heads, int depth, int shallow_flag, int not_shallow_flag); +extern struct commit_list *get_shallow_commits_by_rev_list( + int ac, const char **av, int shallow_flag, int not_shallow_flag); extern void set_alternate_shallow_file(const char *path, int override); extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol, const struct sha1_array *extra); diff --git a/configure.ac b/configure.ac index aa9c91d20d..0b15f04b10 100644 --- a/configure.ac +++ b/configure.ac @@ -528,16 +528,6 @@ AC_CHECK_LIB([curl], [curl_global_init], [NO_CURL=], [NO_CURL=YesPlease]) -if test -z "${NO_CURL}" && test -z "${NO_OPENSSL}"; then - -AC_CHECK_LIB([curl], [Curl_ssl_init], -[NEEDS_SSL_WITH_CURL=YesPlease], -[NEEDS_SSL_WITH_CURL=]) - -GIT_CONF_SUBST([NEEDS_SSL_WITH_CURL]) - -fi - GIT_UNSTASH_FLAGS($CURLDIR) GIT_CONF_SUBST([NO_CURL]) @@ -550,6 +540,17 @@ AC_CHECK_PROG([CURL_CONFIG], [curl-config], if test $CURL_CONFIG != no; then GIT_CONF_SUBST([CURL_CONFIG]) + if test -z "${NO_OPENSSL}"; then + AC_MSG_CHECKING([if Curl supports SSL]) + if test $(curl-config --features|grep SSL) = SSL; then + NEEDS_SSL_WITH_CURL=YesPlease + AC_MSG_RESULT([yes]) + else + NEEDS_SSL_WITH_CURL= + AC_MSG_RESULT([no]) + fi + GIT_CONF_SUBST([NEEDS_SSL_WITH_CURL]) + fi fi fi @@ -835,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 @@ -846,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 diff --git a/connect.c b/connect.c index d99d6435fd..8cb93b0720 100644 --- a/connect.c +++ b/connect.c @@ -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/object_id.cocci b/contrib/coccinelle/object_id.cocci index 0307624a03..09afdbf994 100644 --- a/contrib/coccinelle/object_id.cocci +++ b/contrib/coccinelle/object_id.cocci @@ -17,10 +17,13 @@ expression E1; + oid_to_hex(&E1) @@ +identifier f != oid_to_hex; expression E1; @@ + f(...) {... - sha1_to_hex(E1->hash) + oid_to_hex(E1) + ...} @@ expression E1, E2; @@ -29,10 +32,13 @@ expression E1, E2; + oid_to_hex_r(E1, &E2) @@ +identifier f != oid_to_hex_r; expression E1, E2; @@ + f(...) {... - sha1_to_hex_r(E1, E2->hash) + oid_to_hex_r(E1, E2) + ...} @@ expression E1; @@ -41,10 +47,13 @@ expression E1; + oidclr(&E1) @@ +identifier f != oidclr; expression E1; @@ + f(...) {... - hashclr(E1->hash) + oidclr(E1) + ...} @@ expression E1, E2; @@ -53,10 +62,13 @@ expression E1, E2; + oidcmp(&E1, &E2) @@ +identifier f != oidcmp; expression E1, E2; @@ + f(...) {... - hashcmp(E1->hash, E2->hash) + oidcmp(E1, E2) + ...} @@ expression E1, E2; @@ -77,10 +89,13 @@ expression E1, E2; + oidcpy(&E1, &E2) @@ +identifier f != oidcpy; expression E1, E2; @@ + f(...) {... - hashcpy(E1->hash, E2->hash) + oidcpy(E1, E2) + ...} @@ expression E1, E2; diff --git a/contrib/coccinelle/qsort.cocci b/contrib/coccinelle/qsort.cocci new file mode 100644 index 0000000000..22b93a9966 --- /dev/null +++ b/contrib/coccinelle/qsort.cocci @@ -0,0 +1,37 @@ +@@ +expression base, nmemb, compar; +@@ +- qsort(base, nmemb, sizeof(*base), compar); ++ QSORT(base, nmemb, compar); + +@@ +expression base, nmemb, compar; +@@ +- qsort(base, nmemb, sizeof(base[0]), compar); ++ QSORT(base, nmemb, compar); + +@@ +type T; +T *base; +expression nmemb, compar; +@@ +- qsort(base, nmemb, sizeof(T), compar); ++ QSORT(base, nmemb, compar); + +@@ +expression base, nmemb, compar; +@@ +- if (nmemb) + QSORT(base, nmemb, compar); + +@@ +expression base, nmemb, compar; +@@ +- if (nmemb > 0) + QSORT(base, nmemb, compar); + +@@ +expression base, nmemb, compar; +@@ +- if (nmemb > 1) + QSORT(base, nmemb, compar); 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/completion/git-completion.bash b/contrib/completion/git-completion.bash index 9c8f7380d0..21016bf8df 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -338,7 +338,7 @@ __git_tags () __git_refs () { local i hash dir="$(__gitdir "${1-}")" track="${2-}" - local format refs + local format refs pfx if [ -d "$dir" ]; then case "$cur" in refs|refs/*) @@ -347,14 +347,15 @@ __git_refs () track="" ;; *) + [[ "$cur" == ^* ]] && pfx="^" for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do - if [ -e "$dir/$i" ]; then echo $i; fi + if [ -e "$dir/$i" ]; then echo $pfx$i; fi done format="refname:short" refs="refs/tags refs/heads refs/remotes" ;; esac - git --git-dir="$dir" for-each-ref --format="%($format)" \ + git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \ $refs if [ -n "$track" ]; then # employ the heuristic used by git checkout 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 + * 2012 Philipp A. Hartmann + * 2016 Mantas Mikulėnas + * + * 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 +#include +#include +#include +#include + +/* + * 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! + +} diff --git a/convert.c b/convert.c index 077f5e601e..be91358462 100644 --- a/convert.c +++ b/convert.c @@ -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=" 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, diff --git a/daemon.c b/daemon.c index 425aad0507..473e6b6b63 100644 --- a/daemon.c +++ b/daemon.c @@ -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); diff --git a/diff.c b/diff.c index be11e4ef2b..8981477c43 100644 --- a/diff.c +++ b/diff.c @@ -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; @@ -2019,7 +2066,7 @@ static void show_dirstat(struct diff_options *options) return; /* Show all directories with more than x% of the changes */ - qsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare); + QSORT(dir.files, dir.nr, dirstat_compare); gather_dirstat(options, &dir, changed, "", 0); } @@ -2063,7 +2110,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o return; /* Show all directories with more than x% of the changes */ - qsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare); + QSORT(dir.files, dir.nr, dirstat_compare); gather_dirstat(options, &dir, changed, "", 0); } @@ -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) @@ -4923,7 +4982,7 @@ static int diffnamecmp(const void *a_, const void *b_) void diffcore_fix_diff_index(struct diff_options *options) { struct diff_queue_struct *q = &diff_queued_diff; - qsort(q->queue, q->nr, sizeof(q->queue[0]), diffnamecmp); + QSORT(q->queue, q->nr, diffnamecmp); } void diffcore_std(struct diff_options *options) diff --git a/diff.h b/diff.h index 25ae60d5ff..e9ccb38c26 100644 --- a/diff.h +++ b/diff.h @@ -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 diff --git a/diffcore-delta.c b/diffcore-delta.c index 4159748a70..2ebedb32d1 100644 --- a/diffcore-delta.c +++ b/diffcore-delta.c @@ -158,10 +158,7 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one) n = 0; accum1 = accum2 = 0; } - qsort(hash->data, - 1ul << hash->alloc_log2, - sizeof(hash->data[0]), - spanhash_cmp); + QSORT(hash->data, 1ul << hash->alloc_log2, spanhash_cmp); return hash; } diff --git a/diffcore-order.c b/diffcore-order.c index 69d41f7a57..1957f822a5 100644 --- a/diffcore-order.c +++ b/diffcore-order.c @@ -101,7 +101,7 @@ void order_objects(const char *orderfile, obj_path_fn_t obj_path, objs[i].orig_order = i; objs[i].order = match_order(obj_path(objs[i].obj)); } - qsort(objs, nr, sizeof(*objs), compare_objs_order); + QSORT(objs, nr, compare_objs_order); } static const char *pair_pathtwo(void *obj) diff --git a/diffcore-rename.c b/diffcore-rename.c index 73d003a08a..54a2396653 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -580,7 +580,7 @@ void diffcore_rename(struct diff_options *options) stop_progress(&progress); /* cost matrix sorted by most to least similar pair */ - qsort(mx, dst_cnt * NUM_CANDIDATE_PER_DST, sizeof(*mx), score_compare); + QSORT(mx, dst_cnt * NUM_CANDIDATE_PER_DST, score_compare); rename_count += find_renames(mx, dst_cnt, minimum_score, 0); if (detect_rename == DIFF_DETECT_COPY) diff --git a/dir.c b/dir.c index 9e09bcbd02..bfa8c8a9a5 100644 --- a/dir.c +++ b/dir.c @@ -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) @@ -2005,8 +2047,8 @@ int read_directory(struct dir_struct *dir, const char *path, int len, const stru if (!len || treat_leading_path(dir, path, len, simplify)) read_directory_recursive(dir, path, len, untracked, 0, simplify); free_simplify(simplify); - qsort(dir->entries, dir->nr, sizeof(struct dir_entry *), cmp_name); - qsort(dir->ignored, dir->ignored_nr, sizeof(struct dir_entry *), cmp_name); + QSORT(dir->entries, dir->nr, cmp_name); + QSORT(dir->ignored, dir->ignored_nr, cmp_name); if (dir->untracked) { static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS); trace_printf_key(&trace_untracked_stats, @@ -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) diff --git a/dir.h b/dir.h index da1a858b3a..97c83bb383 100644 --- a/dir.h +++ b/dir.h @@ -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/fast-import.c b/fast-import.c index bf53ac95da..cb545d7df5 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1460,9 +1460,9 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b) unsigned int i; if (!v) - qsort(t->entries,t->entry_count,sizeof(t->entries[0]),tecmp0); + QSORT(t->entries, t->entry_count, tecmp0); else - qsort(t->entries,t->entry_count,sizeof(t->entries[0]),tecmp1); + QSORT(t->entries, t->entry_count, tecmp1); for (i = 0; i < t->entry_count; i++) { if (t->entries[i]->versions[v].mode) diff --git a/fetch-pack.c b/fetch-pack.c index 413937e740..cb45c346ea 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -21,6 +21,8 @@ static int fetch_unpack_limit = -1; static int unpack_limit = 100; static int prefer_ofs_delta = 1; static int no_done; +static int deepen_since_ok; +static int deepen_not_ok; static int fetch_fsck_objects = -1; static int transfer_fsck_objects = -1; static int agent_supported; @@ -50,6 +52,21 @@ static int non_common_revs, multi_ack, use_sideband; #define ALLOW_REACHABLE_SHA1 02 static unsigned int allow_unadvertised_object_request; +__attribute__((format (printf, 2, 3))) +static inline void print_verbose(const struct fetch_pack_args *args, + const char *fmt, ...) +{ + va_list params; + + if (!args->verbose) + return; + + va_start(params, fmt); + vfprintf(stderr, fmt, params); + va_end(params); + fputc('\n', stderr); +} + static void rev_list_push(struct commit *commit, int mark) { if (!(commit->object.flags & mark)) { @@ -182,7 +199,7 @@ enum ack_type { static void consume_shallow_list(struct fetch_pack_args *args, int fd) { - if (args->stateless_rpc && args->depth > 0) { + if (args->stateless_rpc && args->deepen) { /* If we sent a depth we will get back "duplicate" * shallow and unshallow commands every time there * is a block of have lines exchanged. @@ -193,7 +210,7 @@ static void consume_shallow_list(struct fetch_pack_args *args, int fd) continue; if (starts_with(line, "unshallow ")) continue; - die("git fetch-pack: expected shallow list"); + die(_("git fetch-pack: expected shallow list")); } } } @@ -205,7 +222,7 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1) const char *arg; if (!len) - die("git fetch-pack: expected ACK/NAK, got EOF"); + die(_("git fetch-pack: expected ACK/NAK, got EOF")); if (!strcmp(line, "NAK")) return NAK; if (skip_prefix(line, "ACK ", &arg)) { @@ -223,7 +240,7 @@ static enum ack_type get_ack(int fd, unsigned char *result_sha1) return ACK; } } - die("git fetch_pack: expected ACK/NAK, got '%s'", line); + die(_("git fetch_pack: expected ACK/NAK, got '%s'"), line); } static void send_request(struct fetch_pack_args *args, @@ -275,7 +292,7 @@ static int find_common(struct fetch_pack_args *args, size_t state_len = 0; if (args->stateless_rpc && multi_ack == 1) - die("--stateless-rpc requires multi_ack_detailed"); + die(_("--stateless-rpc requires multi_ack_detailed")); if (marked) for_each_ref(clear_marks, NULL); marked = 1; @@ -312,10 +329,13 @@ static int find_common(struct fetch_pack_args *args, if (no_done) strbuf_addstr(&c, " no-done"); if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k"); if (use_sideband == 1) strbuf_addstr(&c, " side-band"); + if (args->deepen_relative) strbuf_addstr(&c, " deepen-relative"); if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack"); if (args->no_progress) strbuf_addstr(&c, " no-progress"); if (args->include_tag) strbuf_addstr(&c, " include-tag"); if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta"); + if (deepen_since_ok) strbuf_addstr(&c, " deepen-since"); + if (deepen_not_ok) strbuf_addstr(&c, " deepen-not"); if (agent_supported) strbuf_addf(&c, " agent=%s", git_user_agent_sanitized()); packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf); @@ -335,10 +355,21 @@ static int find_common(struct fetch_pack_args *args, write_shallow_commits(&req_buf, 1, NULL); if (args->depth > 0) packet_buf_write(&req_buf, "deepen %d", args->depth); + if (args->deepen_since) { + unsigned long max_age = approxidate(args->deepen_since); + packet_buf_write(&req_buf, "deepen-since %lu", max_age); + } + if (args->deepen_not) { + int i; + for (i = 0; i < args->deepen_not->nr; i++) { + struct string_list_item *s = args->deepen_not->items + i; + packet_buf_write(&req_buf, "deepen-not %s", s->string); + } + } packet_buf_flush(&req_buf); state_len = req_buf.len; - if (args->depth > 0) { + if (args->deepen) { char *line; const char *arg; unsigned char sha1[20]; @@ -347,23 +378,23 @@ static int find_common(struct fetch_pack_args *args, while ((line = packet_read_line(fd[0], NULL))) { if (skip_prefix(line, "shallow ", &arg)) { if (get_sha1_hex(arg, sha1)) - die("invalid shallow line: %s", line); + die(_("invalid shallow line: %s"), line); register_shallow(sha1); continue; } if (skip_prefix(line, "unshallow ", &arg)) { if (get_sha1_hex(arg, sha1)) - die("invalid unshallow line: %s", line); + die(_("invalid unshallow line: %s"), line); if (!lookup_object(sha1)) - die("object not found: %s", line); + die(_("object not found: %s"), line); /* make sure that it is parsed as shallow */ if (!parse_object(sha1)) - die("error in object: %s", line); + die(_("error in object: %s"), line); if (unregister_shallow(sha1)) - die("no shallow found: %s", line); + die(_("no shallow found: %s"), line); continue; } - die("expected shallow/unshallow, got %s", line); + die(_("expected shallow/unshallow, got %s"), line); } } else if (!args->stateless_rpc) send_request(args, fd[1], &req_buf); @@ -380,8 +411,7 @@ static int find_common(struct fetch_pack_args *args, retval = -1; while ((sha1 = get_rev())) { packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1)); - if (args->verbose) - fprintf(stderr, "have %s\n", sha1_to_hex(sha1)); + print_verbose(args, "have %s", sha1_to_hex(sha1)); in_vain++; if (flush_at <= ++count) { int ack; @@ -402,9 +432,9 @@ static int find_common(struct fetch_pack_args *args, consume_shallow_list(args, fd[0]); do { ack = get_ack(fd[0], result_sha1); - if (args->verbose && ack) - fprintf(stderr, "got ack %d %s\n", ack, - sha1_to_hex(result_sha1)); + if (ack) + print_verbose(args, _("got %s %d %s"), "ack", + ack, sha1_to_hex(result_sha1)); switch (ack) { case ACK: flushes = 0; @@ -417,7 +447,7 @@ static int find_common(struct fetch_pack_args *args, struct commit *commit = lookup_commit(result_sha1); if (!commit) - die("invalid commit %s", sha1_to_hex(result_sha1)); + die(_("invalid commit %s"), sha1_to_hex(result_sha1)); if (args->stateless_rpc && ack == ACK_common && !(commit->object.flags & COMMON)) { @@ -450,8 +480,7 @@ static int find_common(struct fetch_pack_args *args, } while (ack); flushes--; if (got_continue && MAX_IN_VAIN < in_vain) { - if (args->verbose) - fprintf(stderr, "giving up\n"); + print_verbose(args, _("giving up")); break; /* give up */ } } @@ -461,8 +490,7 @@ static int find_common(struct fetch_pack_args *args, packet_buf_write(&req_buf, "done\n"); send_request(args, fd[1], &req_buf); } - if (args->verbose) - fprintf(stderr, "done\n"); + print_verbose(args, _("done")); if (retval != 0) { multi_ack = 0; flushes++; @@ -474,9 +502,8 @@ static int find_common(struct fetch_pack_args *args, while (flushes || multi_ack) { int ack = get_ack(fd[0], result_sha1); if (ack) { - if (args->verbose) - fprintf(stderr, "got ack (%d) %s\n", ack, - sha1_to_hex(result_sha1)); + print_verbose(args, _("got %s (%d) %s"), "ack", + ack, sha1_to_hex(result_sha1)); if (ack == ACK) return 0; multi_ack = 1; @@ -521,9 +548,8 @@ static void mark_recent_complete_commits(struct fetch_pack_args *args, unsigned long cutoff) { while (complete && cutoff <= complete->item->date) { - if (args->verbose) - fprintf(stderr, "Marking %s as complete\n", - oid_to_hex(&complete->item->object.oid)); + print_verbose(args, _("Marking %s as complete"), + oid_to_hex(&complete->item->object.oid)); pop_most_recent_commit(&complete, COMPLETE); } } @@ -559,7 +585,7 @@ static void filter_refs(struct fetch_pack_args *args, } if (!keep && args->fetch_all && - (!args->depth || !starts_with(ref->name, "refs/tags/"))) + (!args->deepen || !starts_with(ref->name, "refs/tags/"))) keep = 1; if (keep) { @@ -629,7 +655,7 @@ static int everything_local(struct fetch_pack_args *args, } } - if (!args->depth) { + if (!args->deepen) { for_each_ref(mark_complete_oid, NULL); for_each_alternate_ref(mark_alternate_complete, NULL); commit_list_sort_by_date(&complete); @@ -664,18 +690,12 @@ static int everything_local(struct fetch_pack_args *args, o = lookup_object(remote); if (!o || !(o->flags & COMPLETE)) { retval = 0; - if (!args->verbose) - continue; - fprintf(stderr, - "want %s (%s)\n", sha1_to_hex(remote), - ref->name); + print_verbose(args, "want %s (%s)", sha1_to_hex(remote), + ref->name); continue; } - if (!args->verbose) - continue; - fprintf(stderr, - "already have %s (%s)\n", sha1_to_hex(remote), - ref->name); + print_verbose(args, _("already have %s (%s)"), sha1_to_hex(remote), + ref->name); } return retval; } @@ -712,8 +732,7 @@ static int get_pack(struct fetch_pack_args *args, demux.out = -1; demux.isolate_sigpipe = 1; if (start_async(&demux)) - die("fetch-pack: unable to fork off sideband" - " demultiplexer"); + die(_("fetch-pack: unable to fork off sideband demultiplexer")); } else demux.out = xd[0]; @@ -721,7 +740,7 @@ static int get_pack(struct fetch_pack_args *args, if (!args->keep_pack && unpack_limit) { if (read_pack_header(demux.out, &header)) - die("protocol error: bad pack header"); + die(_("protocol error: bad pack header")); pass_header = 1; if (ntohl(header.hdr_entries) < unpack_limit) do_keep = 0; @@ -777,7 +796,7 @@ static int get_pack(struct fetch_pack_args *args, cmd.in = demux.out; cmd.git_cmd = 1; if (start_command(&cmd)) - die("fetch-pack: unable to fork off %s", cmd_name); + die(_("fetch-pack: unable to fork off %s"), cmd_name); if (do_keep && pack_lockfile) { *pack_lockfile = index_pack_lockfile(cmd.out); close(cmd.out); @@ -793,9 +812,9 @@ static int get_pack(struct fetch_pack_args *args, args->check_self_contained_and_connected && ret == 0; else - die("%s failed", cmd_name); + die(_("%s failed"), cmd_name); if (use_sideband && finish_async(&demux)) - die("error in sideband demultiplexer"); + die(_("error in sideband demultiplexer")); return 0; } @@ -819,44 +838,39 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, int agent_len; sort_ref_list(&ref, ref_compare_name); - qsort(sought, nr_sought, sizeof(*sought), cmp_ref_by_name); + QSORT(sought, nr_sought, cmp_ref_by_name); if ((args->depth > 0 || is_repository_shallow()) && !server_supports("shallow")) - die("Server does not support shallow clients"); + die(_("Server does not support shallow clients")); + if (args->depth > 0 || args->deepen_since || args->deepen_not) + args->deepen = 1; if (server_supports("multi_ack_detailed")) { - if (args->verbose) - fprintf(stderr, "Server supports multi_ack_detailed\n"); + print_verbose(args, _("Server supports multi_ack_detailed")); multi_ack = 2; if (server_supports("no-done")) { - if (args->verbose) - fprintf(stderr, "Server supports no-done\n"); + print_verbose(args, _("Server supports no-done")); if (args->stateless_rpc) no_done = 1; } } else if (server_supports("multi_ack")) { - if (args->verbose) - fprintf(stderr, "Server supports multi_ack\n"); + print_verbose(args, _("Server supports multi_ack")); multi_ack = 1; } if (server_supports("side-band-64k")) { - if (args->verbose) - fprintf(stderr, "Server supports side-band-64k\n"); + print_verbose(args, _("Server supports side-band-64k")); use_sideband = 2; } else if (server_supports("side-band")) { - if (args->verbose) - fprintf(stderr, "Server supports side-band\n"); + print_verbose(args, _("Server supports side-band")); use_sideband = 1; } if (server_supports("allow-tip-sha1-in-want")) { - if (args->verbose) - fprintf(stderr, "Server supports allow-tip-sha1-in-want\n"); + print_verbose(args, _("Server supports allow-tip-sha1-in-want")); allow_unadvertised_object_request |= ALLOW_TIP_SHA1; } if (server_supports("allow-reachable-sha1-in-want")) { - if (args->verbose) - fprintf(stderr, "Server supports allow-reachable-sha1-in-want\n"); + print_verbose(args, _("Server supports allow-reachable-sha1-in-want")); allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1; } if (!server_supports("thin-pack")) @@ -865,18 +879,27 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, args->no_progress = 0; if (!server_supports("include-tag")) args->include_tag = 0; - if (server_supports("ofs-delta")) { - if (args->verbose) - fprintf(stderr, "Server supports ofs-delta\n"); - } else + if (server_supports("ofs-delta")) + print_verbose(args, _("Server supports ofs-delta")); + else prefer_ofs_delta = 0; if ((agent_feature = server_feature_value("agent", &agent_len))) { agent_supported = 1; - if (args->verbose && agent_len) - fprintf(stderr, "Server version is %.*s\n", - agent_len, agent_feature); + if (agent_len) + print_verbose(args, _("Server version is %.*s"), + agent_len, agent_feature); } + if (server_supports("deepen-since")) + deepen_since_ok = 1; + else if (args->deepen_since) + die(_("Server does not support --shallow-since")); + if (server_supports("deepen-not")) + deepen_not_ok = 1; + else if (args->deepen_not) + die(_("Server does not support --shallow-exclude")); + if (!server_supports("deepen-relative") && args->deepen_relative) + die(_("Server does not support --deepen")); if (everything_local(args, &ref, sought, nr_sought)) { packet_flush(fd[1]); @@ -887,11 +910,11 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, /* When cloning, it is not unusual to have * no common commit. */ - warning("no common commits"); + warning(_("no common commits")); if (args->stateless_rpc) packet_flush(fd[1]); - if (args->depth > 0) + if (args->deepen) setup_alternate_shallow(&shallow_lock, &alternate_shallow_file, NULL); else if (si->nr_ours || si->nr_theirs) @@ -899,7 +922,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args, else alternate_shallow_file = NULL; if (get_pack(args, fd, pack_lockfile)) - die("git fetch-pack: fetch failed."); + die(_("git fetch-pack: fetch failed.")); all_done: return ref; @@ -958,7 +981,7 @@ static void update_shallow(struct fetch_pack_args *args, int *status; int i; - if (args->depth > 0 && alternate_shallow_file) { + if (args->deepen && alternate_shallow_file) { if (*alternate_shallow_file == '\0') { /* --unshallow */ unlink_or_warn(git_path_shallow()); rollback_lock_file(&shallow_lock); @@ -1061,7 +1084,7 @@ struct ref *fetch_pack(struct fetch_pack_args *args, if (!ref) { packet_flush(fd[1]); - die("no matching remote head"); + die(_("no matching remote head")); } prepare_shallow_info(&si, shallow); ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, diff --git a/fetch-pack.h b/fetch-pack.h index bb7fd76e59..c912e3d321 100644 --- a/fetch-pack.h +++ b/fetch-pack.h @@ -10,6 +10,9 @@ struct fetch_pack_args { const char *uploadpack; int unpacklimit; int depth; + const char *deepen_since; + const struct string_list *deepen_not; + unsigned deepen_relative:1; unsigned quiet:1; unsigned keep_pack:1; unsigned lock_pack:1; @@ -25,6 +28,7 @@ struct fetch_pack_args { unsigned self_contained_and_connected:1; unsigned cloning:1; unsigned update_shallow:1; + unsigned deepen:1; }; /* diff --git a/git-compat-util.h b/git-compat-util.h index 0ce2cdfb98..87237b092b 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; @@ -985,6 +980,14 @@ void git_qsort(void *base, size_t nmemb, size_t size, #define qsort git_qsort #endif +#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar) +static inline void sane_qsort(void *base, size_t nmemb, size_t size, + int(*compar)(const void *, const void *)) +{ + if (nmemb > 1) + qsort(base, nmemb, size, compar); +} + #ifndef REG_STARTEND #error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd" #endif @@ -1098,6 +1101,6 @@ struct tm *git_gmtime_r(const time_t *, struct tm *); #define getc_unlocked(fh) getc(fh) #endif -#endif - extern int cmd_main(int, const char **); + +#endif 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 "toggle_or_diff $i %x %y; break" - bind $i <$M1B-Button-1> "add_one_to_selection $i %x %y; break" - bind $i "add_range_to_selection $i %x %y; break" + bind $i { toggle_or_diff click %W %x %y; break } + bind $i <$M1B-Button-1> { add_one_to_selection %W %x %y; break } + bind $i { add_range_to_selection %W %x %y; break } + bind $i { toggle_or_diff up %W; break } + bind $i { 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 "grab $w; focus $w.buttons.close" bind $w [list destroy $w] bind $w [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 "grab $w; focus $w" bind $w "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 {%W instate !disabled {%W state active}} + bind EntryFrame {%W state !active} + bind EntryFrame <> { + 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 {[winfo parent %W] state focus} + bind $w {[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 "grab $w; focus $w.buttons.create" bind $w "destroy $w" bind $w [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 . +# Copyright (C) 2012, 2013, 2014, 2015, 2016 Alexander Shopov . # This file is distributed under the same license as the git package. -# Alexander Shopov , 2012, 2013, 2014, 2015. +# Alexander Shopov , 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 \n" "Language-Team: Bulgarian \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 "Данни за отдалеченото хранилище" - -#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44 -msgid "Name:" -msgstr "Име:" +msgid "%s (%s): File Viewer" +msgstr "%s (%s): Преглед на файлове" -#: 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 +#: lib/branch_create.tcl:23 #, tcl-format -msgid "Fetching new changes from %s" -msgstr "Доставяне на промените от „%s“" +msgid "%s (%s): Create Branch" +msgstr "%s (%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/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,426 +898,777 @@ 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/browser.tcl:17 +msgid "Starting..." +msgstr "Стартиране…" -#: lib/choose_font.tcl:76 -msgid "Font Size" -msgstr "Размер" +#: lib/browser.tcl:27 +#, tcl-format +msgid "%s (%s): File Browser" +msgstr "%s (%s): Файлов браузър" -#: lib/choose_font.tcl:93 -msgid "Font Example" -msgstr "Мостра" +#: lib/browser.tcl:132 lib/browser.tcl:149 +#, tcl-format +msgid "Loading %s..." +msgstr "Зареждане на „%s“…" -#: 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:193 +msgid "[Up To Parent]" +msgstr "[Към родителя]" -#: lib/option.tcl:11 +#: lib/browser.tcl:275 #, tcl-format -msgid "Invalid global encoding '%s'" -msgstr "Неправилно глобално кодиране „%s“" +msgid "%s (%s): Browse Branch Files" +msgstr "%s (%s): Разглеждане на файловете в клона" -#: lib/option.tcl:19 -#, tcl-format -msgid "Invalid repo encoding '%s'" -msgstr "Неправилно кодиране „%s“ на хранилището" +#: lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Разглеждане на файловете в клона" -#: lib/option.tcl:119 -msgid "Restore Defaults" -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:123 -msgid "Save" -msgstr "Запазване" +#: lib/checkout_op.tcl:85 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "Доставяне на „%s“ от „%s“" -#: lib/option.tcl:133 +#: lib/checkout_op.tcl:133 #, tcl-format -msgid "%s Repository" -msgstr "Хранилище „%s“" +msgid "fatal: Cannot resolve %s" +msgstr "фатална грешка: „%s“ не може да се открие" -#: lib/option.tcl:134 -msgid "Global (All Repositories)" -msgstr "Глобално (за всички хранилища)" +#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30 +#: lib/sshkey.tcl:55 +msgid "Close" +msgstr "Затваряне" -#: lib/option.tcl:140 -msgid "User Name" -msgstr "Потребителско име" +#: lib/checkout_op.tcl:175 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Клонът „%s“ не съществува." -#: lib/option.tcl:141 -msgid "Email Address" -msgstr "Адрес на е-поща" +#: lib/checkout_op.tcl:194 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "Неуспешно настройване на опростен git-pull за „%s“." -#: lib/option.tcl:143 -msgid "Summarize Merge Commits" -msgstr "Обобщаване на подаванията при сливане" +#: 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/option.tcl:144 -msgid "Merge Verbosity" -msgstr "Подробности при сливанията" +#: lib/checkout_op.tcl:243 +#, tcl-format +msgid "Merge strategy '%s' not supported." +msgstr "Стратегия за сливане „%s“ не се поддържа." -#: lib/option.tcl:145 -msgid "Show Diffstat After Merge" -msgstr "Извеждане на статистика след сливанията" +#: lib/checkout_op.tcl:262 +#, tcl-format +msgid "Failed to update '%s'." +msgstr "Неуспешно обновяване на „%s“." -#: lib/option.tcl:146 -msgid "Use Merge Tool" -msgstr "Използване на програма за сливане" +#: lib/checkout_op.tcl:274 +msgid "Staging area (index) is already locked." +msgstr "Индексът вече е заключен." -#: lib/option.tcl:148 -msgid "Trust File Modification Timestamps" -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/option.tcl:149 -msgid "Prune Tracking Branches During Fetch" -msgstr "Окастряне на следящите клонове при доставяне" +#: lib/checkout_op.tcl:345 +#, tcl-format +msgid "Updating working directory to '%s'..." +msgstr "Работната директория се привежда към „%s“…" -#: lib/option.tcl:150 -msgid "Match Tracking Branches" -msgstr "Напасване на следящите клонове" +#: lib/checkout_op.tcl:346 +msgid "files checked out" +msgstr "файла са изтеглени" -#: lib/option.tcl:151 -msgid "Use Textconv For Diffs and Blames" +#: lib/checkout_op.tcl:376 +#, tcl-format +msgid "Aborted checkout of '%s' (file level merging is required)." msgstr "" -"Преобразуване на текста с „textconv“ при анотиране и извеждане на разлики" +"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)." -#: lib/option.tcl:152 -msgid "Blame Copy Only On Changed Files" -msgstr "Анотиране на копието само по променените файлове" +#: lib/checkout_op.tcl:377 +msgid "File level merge required." +msgstr "Необходимо е пофайлово сливане." -#: lib/option.tcl:153 -msgid "Maximum Length of Recent Repositories List" -msgstr "Максимална дължина на списъка със скоро ползвани хранилища" +#: lib/checkout_op.tcl:381 +#, tcl-format +msgid "Staying on branch '%s'." +msgstr "Оставане върху клона „%s“." -#: lib/option.tcl:154 -msgid "Minimum Letters To Blame Copy On" -msgstr "Минимален брой знаци за анотиране на копието" +#: 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/option.tcl:155 -msgid "Blame History Context Radius (days)" -msgstr "Исторически обхват за анотиране в дни" +#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 +#, tcl-format +msgid "Checked out '%s'." +msgstr "„%s“ е изтеглен." -#: lib/option.tcl:156 -msgid "Number of Diff Context Lines" -msgstr "Брой редове за контекста при извеждане на разликите" +#: lib/checkout_op.tcl:535 +#, tcl-format +msgid "Resetting '%s' to '%s' will lose the following commits:" +msgstr "" +"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:" -#: lib/option.tcl:157 -msgid "Additional Diff Parameters" -msgstr "Допълнителни аргументи към „git diff“" +#: lib/checkout_op.tcl:557 +msgid "Recovering lost commits may not be easy." +msgstr "Възстановяването на загубените подавания може да е трудно." -#: lib/option.tcl:158 -msgid "Commit Message Text Width" -msgstr "Широчина на текста на съобщението при подаване" +#: lib/checkout_op.tcl:562 +#, tcl-format +msgid "Reset '%s'?" +msgstr "Зануляване на „%s“?" -#: lib/option.tcl:159 -msgid "New Branch Name Template" -msgstr "Шаблон за името на новите клони" +#: lib/checkout_op.tcl:567 lib/merge.tcl:170 lib/tools_dlg.tcl:336 +msgid "Visualize" +msgstr "Визуализация" -#: lib/option.tcl:160 -msgid "Default File Contents Encoding" -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/option.tcl:161 -msgid "Warn before committing to a detached head" -msgstr "Предупреждаване при подаването при несвързан връх" +#: lib/choose_font.tcl:41 +msgid "Select" +msgstr "Избор" -#: lib/option.tcl:162 -msgid "Staging of untracked files" -msgstr "Вкарване на неследени файлове в индекса" +#: lib/choose_font.tcl:55 +msgid "Font Family" +msgstr "Шрифт" -#: lib/option.tcl:163 -msgid "Show untracked files" -msgstr "Показване на неследените файлове" +#: lib/choose_font.tcl:76 +msgid "Font Size" +msgstr "Размер" -#: lib/option.tcl:164 -msgid "Tab spacing" -msgstr "Размер на табулацията в интервали" +#: lib/choose_font.tcl:93 +msgid "Font Example" +msgstr "Мостра" -#: lib/option.tcl:210 -msgid "Change" -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/choose_repository.tcl:33 +msgid "Git Gui" +msgstr "ГПИ на Git" + +#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412 +msgid "Create New Repository" +msgstr "Създаване на ново хранилище" + +#: lib/choose_repository.tcl:98 +msgid "New..." +msgstr "Ново…" + +#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496 +msgid "Clone Existing Repository" +msgstr "Клониране на съществуващо хранилище" + +#: lib/choose_repository.tcl:116 +msgid "Clone..." +msgstr "Клониране…" + +#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064 +msgid "Open Existing Repository" +msgstr "Отваряне на съществуващо хранилище" + +#: lib/choose_repository.tcl:129 +msgid "Open..." +msgstr "Отваряне…" + +#: lib/choose_repository.tcl:142 +msgid "Recent Repositories" +msgstr "Скоро ползвани" + +#: lib/choose_repository.tcl:148 +msgid "Open Recent Repository:" +msgstr "Отваряне на хранилище ползвано наскоро:" + +#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323 +#: lib/choose_repository.tcl:330 +#, tcl-format +msgid "Failed to create repository %s:" +msgstr "Неуспешно създаване на хранилището „%s“:" + +#: lib/choose_repository.tcl:417 +msgid "Directory:" +msgstr "Директория:" + +#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573 +#: lib/choose_repository.tcl:1098 +msgid "Git Repository" +msgstr "Хранилище на Git" + +#: lib/choose_repository.tcl:472 +#, tcl-format +msgid "Directory %s already exists." +msgstr "Вече съществува директория „%s“." + +#: lib/choose_repository.tcl:476 +#, tcl-format +msgid "File %s already exists." +msgstr "Вече съществува файл „%s“." + +#: lib/choose_repository.tcl:491 +msgid "Clone" +msgstr "Клониране" + +#: lib/choose_repository.tcl:504 +msgid "Source Location:" +msgstr "Адрес на източника:" + +#: lib/choose_repository.tcl:513 +msgid "Target Directory:" +msgstr "Целева директория:" + +#: lib/choose_repository.tcl:523 +msgid "Clone Type:" +msgstr "Вид клониране:" + +#: lib/choose_repository.tcl:528 +msgid "Standard (Fast, Semi-Redundant, Hardlinks)" +msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)" + +#: lib/choose_repository.tcl:533 +msgid "Full Copy (Slower, Redundant Backup)" +msgstr "Пълно (бавно, пълноценно резервно копие)" + +#: lib/choose_repository.tcl:538 +msgid "Shared (Fastest, Not Recommended, No Backup)" +msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)" + +#: lib/choose_repository.tcl:545 +msgid "Recursively clone submodules too" +msgstr "Рекурсивно клониране и на подмодулите" + +#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626 +#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842 +#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112 +#, tcl-format +msgid "Not a Git repository: %s" +msgstr "Това не е хранилище на Git: %s" + +#: lib/choose_repository.tcl:615 +msgid "Standard only available for local repository." +msgstr "Само локални хранилища могат да се клонират стандартно" + +#: lib/choose_repository.tcl:619 +msgid "Shared only available for local repository." +msgstr "Само локални хранилища могат да се клонират споделено" + +#: lib/choose_repository.tcl:640 +#, tcl-format +msgid "Location %s already exists." +msgstr "Местоположението „%s“ вече съществува." + +#: lib/choose_repository.tcl:651 +msgid "Failed to configure origin" +msgstr "Неуспешно настройване на хранилището-източник" + +#: lib/choose_repository.tcl:663 +msgid "Counting objects" +msgstr "Преброяване на обекти" + +#: lib/choose_repository.tcl:664 +msgid "buckets" +msgstr "клетки" + +#: lib/choose_repository.tcl:688 +#, tcl-format +msgid "Unable to copy objects/info/alternates: %s" +msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s" + +#: lib/choose_repository.tcl:724 +#, tcl-format +msgid "Nothing to clone from %s." +msgstr "Няма какво да се клонира от „%s“." + +#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940 +#: lib/choose_repository.tcl:952 +msgid "The 'master' branch has not been initialized." +msgstr "Основният клон — „master“ не е инициализиран." + +#: lib/choose_repository.tcl:739 +msgid "Hardlinks are unavailable. Falling back to copying." +msgstr "Не се поддържат твърди връзки. Преминава се към копиране." + +#: lib/choose_repository.tcl:751 +#, tcl-format +msgid "Cloning from %s" +msgstr "Клониране на „%s“" + +#: lib/choose_repository.tcl:782 +msgid "Copying objects" +msgstr "Копиране на обекти" + +#: lib/choose_repository.tcl:783 +msgid "KiB" +msgstr "KiB" + +#: lib/choose_repository.tcl:807 +#, tcl-format +msgid "Unable to copy object: %s" +msgstr "Неуспешно копиране на обект: %s" + +#: lib/choose_repository.tcl:817 +msgid "Linking objects" +msgstr "Създаване на връзки към обектите" + +#: lib/choose_repository.tcl:818 +msgid "objects" +msgstr "обекти" + +#: lib/choose_repository.tcl:826 +#, tcl-format +msgid "Unable to hardlink object: %s" +msgstr "Неуспешно създаване на твърда връзка към обект: %s" + +#: lib/choose_repository.tcl:881 +msgid "Cannot fetch branches and objects. See console output for details." +msgstr "" +"Клоните и обектите не могат да бъдат изтеглени. За повече информация " +"погледнете изхода на конзолата." + +#: lib/choose_repository.tcl:892 +msgid "Cannot fetch tags. See console output for details." +msgstr "" +"Етикетите не могат да бъдат изтеглени. За повече информация погледнете " +"изхода на конзолата." + +#: lib/choose_repository.tcl:916 +msgid "Cannot determine HEAD. See console output for details." +msgstr "" +"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете " +"изхода на конзолата." + +#: lib/choose_repository.tcl:925 +#, tcl-format +msgid "Unable to cleanup %s" +msgstr "„%s“ не може да се зачисти" + +#: lib/choose_repository.tcl:931 +msgid "Clone failed." +msgstr "Неуспешно клониране." + +#: lib/choose_repository.tcl:938 +msgid "No default branch obtained." +msgstr "Не е получен клон по подразбиране." + +#: lib/choose_repository.tcl:949 +#, tcl-format +msgid "Cannot resolve %s as a commit." +msgstr "Няма подаване отговарящо на „%s“." + +#: lib/choose_repository.tcl:961 +msgid "Creating working directory" +msgstr "Създаване на работната директория" + +#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136 +#: lib/index.tcl:207 +msgid "files" +msgstr "файлове" + +#: lib/choose_repository.tcl:981 +msgid "Cannot clone submodules." +msgstr "Подмодулите не могат да се клонират." + +#: lib/choose_repository.tcl:990 +msgid "Cloning submodules" +msgstr "Клониране на подмодули" + +#: lib/choose_repository.tcl:1015 +msgid "Initial file checkout failed." +msgstr "Неуспешно първоначално изтегляне." + +#: lib/choose_repository.tcl:1059 +msgid "Open" +msgstr "Отваряне" + +#: lib/choose_repository.tcl:1069 +msgid "Repository:" +msgstr "Хранилище:" + +#: lib/choose_repository.tcl:1118 +#, tcl-format +msgid "Failed to open repository %s:" +msgstr "Неуспешно отваряне на хранилището „%s“:" + +#: lib/choose_rev.tcl:52 +msgid "This Detached Checkout" +msgstr "Това несвързано изтегляне" + +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" +msgstr "Израз за версия:" + +#: lib/choose_rev.tcl:72 +msgid "Local Branch" +msgstr "Локален клон" -#: lib/option.tcl:254 -msgid "Spelling Dictionary:" -msgstr "Правописен речник:" +#: lib/choose_rev.tcl:77 +msgid "Tracking Branch" +msgstr "Следящ клон" -#: lib/option.tcl:284 -msgid "Change Font" -msgstr "Смяна на шрифта" +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 +msgid "Tag" +msgstr "Етикет" -#: lib/option.tcl:288 +#: lib/choose_rev.tcl:321 #, tcl-format -msgid "Choose %s" -msgstr "Избор на „%s“" +msgid "Invalid revision: %s" +msgstr "Неправилна версия: %s" -#: lib/option.tcl:294 -msgid "pt." -msgstr "тчк." +#: lib/choose_rev.tcl:342 +msgid "No revision selected." +msgstr "Не е избрана версия." -#: lib/option.tcl:308 -msgid "Preferences" -msgstr "Настройки" +#: lib/choose_rev.tcl:350 +msgid "Revision expression is empty." +msgstr "Изразът за версия е празен." -#: lib/option.tcl:345 -msgid "Failed to completely save options:" -msgstr "Неуспешно запазване на настройките:" +#: lib/choose_rev.tcl:537 +msgid "Updated" +msgstr "Обновен" -#: lib/encoding.tcl:443 -msgid "Default" -msgstr "Стандартното" +#: lib/choose_rev.tcl:565 +msgid "URL" +msgstr "Адрес" -#: lib/encoding.tcl:448 -#, tcl-format -msgid "System (%s)" -msgstr "Системното (%s)" +#: lib/commit.tcl:9 +msgid "" +"There is nothing to amend.\n" +"\n" +"You are about to create the initial commit. There is no commit before this " +"to amend.\n" +msgstr "" +"Няма какво да се поправи.\n" +"\n" +"Ще създадете първоначалното подаване. Преди него няма други подавания, които " +"да поправите.\n" -#: lib/encoding.tcl:459 lib/encoding.tcl:465 -msgid "Other" -msgstr "Друго" +#: lib/commit.tcl:18 +msgid "" +"Cannot amend while merging.\n" +"\n" +"You are currently in the middle of a merge that has not been fully " +"completed. You cannot amend the prior commit unless you first abort the " +"current merge activity.\n" +msgstr "" +"По време на сливане не може да поправяте.\n" +"\n" +"В момента все още не сте завършили операция по сливане. Не може да поправите " +"предишното подаване, освен ако първо не преустановите текущото сливане.\n" -#: lib/mergetool.tcl:8 -msgid "Force resolution to the base version?" -msgstr "Да се използва базовата версия" +#: lib/commit.tcl:48 +msgid "Error loading commit data for amend:" +msgstr "Грешка при зареждане на данните от подаване, които да се поправят:" -#: lib/mergetool.tcl:9 -msgid "Force resolution to this branch?" -msgstr "Да се използва версията от този клон" +#: lib/commit.tcl:75 +msgid "Unable to obtain your identity:" +msgstr "Идентификацията ви не може да бъде определена:" -#: lib/mergetool.tcl:10 -msgid "Force resolution to the other branch?" -msgstr "Да се използва версията от другия клон" +#: lib/commit.tcl:80 +msgid "Invalid GIT_COMMITTER_IDENT:" +msgstr "Неправилно поле „GIT_COMMITTER_IDENT“:" -#: lib/mergetool.tcl:14 +#: lib/commit.tcl:129 #, tcl-format +msgid "warning: Tcl does not support encoding '%s'." +msgstr "предупреждение: Tcl не поддържа кодирането „%s“." + +#: lib/commit.tcl:149 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 another commit can be created.\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" -"Тази операция може да бъде отменена само чрез започване на сливането наново." +"Автоматично ще започне нова проверка.\n" -#: lib/mergetool.tcl:45 +#: lib/commit.tcl:173 #, tcl-format -msgid "File %s seems to have unresolved conflicts, still stage?" +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 "" -"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави " -"ли файлът към индекса?" +"Неслетите файлове не могат да бъдат подавани.\n" +"\n" +"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да " +"коригирате конфликтите и да добавите файла към индекса за подаване.\n" -#: lib/mergetool.tcl:60 +#: lib/commit.tcl:181 #, tcl-format -msgid "Adding resolution for %s" -msgstr "Добавяне на корекция на конфликтите в „%s“" - -#: lib/mergetool.tcl:141 -msgid "Cannot resolve deletion or link conflicts using a tool" +msgid "" +"Unknown file state %s detected.\n" +"\n" +"File %s cannot be committed by this program.\n" 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 "Програмата за сливане вече е стартирана. Да бъде ли изключена?" +"Непознато състояние на файл „%s“.\n" +"\n" +"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n" -#: lib/mergetool.tcl:330 -#, tcl-format +#: lib/commit.tcl:189 msgid "" -"Error retrieving versions:\n" -"%s" +"No changes to commit.\n" +"\n" +"You must stage at least 1 file before you can commit.\n" msgstr "" -"Грешка при изтеглянето на версии:\n" -"%s" +"Няма промени за подаване.\n" +"\n" +"Трябва да добавите поне един файл към индекса, за да подадете.\n" -#: lib/mergetool.tcl:350 -#, tcl-format +#: lib/commit.tcl:204 msgid "" -"Could not start the merge tool:\n" +"Please supply a commit message.\n" "\n" -"%s" +"A good commit message has the following format:\n" +"\n" +"- First line: Describe in one sentence what you did.\n" +"- Second line: Blank\n" +"- Remaining lines: Describe why this change is good.\n" msgstr "" -"Програмата за сливане не може да бъде стартирана:\n" +"Задайте добро съобщение при подаване.\n" "\n" -"%s" - -#: lib/mergetool.tcl:354 -msgid "Running merge tool..." -msgstr "Стартиране на програмата за сливане…" +"Използвайте следния формат:\n" +"\n" +"● Първи ред: описание в едно изречение на промяната.\n" +"● Втори ред: празен.\n" +"● Останалите редове: опишете защо се налага тази промяна.\n" -#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 -msgid "Merge tool failed." -msgstr "Грешка в програмата за сливане." +#: lib/commit.tcl:235 +msgid "Calling pre-commit hook..." +msgstr "Изпълняване на куката преди подаване…" -#: lib/tools_dlg.tcl:22 -msgid "Add Tool" -msgstr "Добавяне на команда" +#: lib/commit.tcl:250 +msgid "Commit declined by pre-commit hook." +msgstr "Подаването е отхвърлено от куката преди подаване." -#: lib/tools_dlg.tcl:28 -msgid "Add New Tool Command" -msgstr "Добавяне на команда" +#: lib/commit.tcl:269 +msgid "" +"You are about to commit on a detached head. This is a potentially dangerous " +"thing to do because if you switch to another branch you will lose your " +"changes and it can be difficult to retrieve them later from the reflog. You " +"should probably cancel this commit and create a new branch to continue.\n" +" \n" +" Do you really want to proceed with your Commit?" +msgstr "" +"Ще подадете към несвързан, отделѐн указател „HEAD“. Това е опасно, защото " +"при преминаването към клон ще загубите промените си, като единственият начин " +"да ги върнете ще е чрез журнала на указателите (reflog). Най-вероятно трябва " +"да не правите това подаване, а да създадете нов клон, преди да продължите.\n" +" \n" +"Сигурни ли сте, че искате да извършите текущото подаване?" -#: lib/tools_dlg.tcl:34 -msgid "Add globally" -msgstr "Глобално добавяне" +#: lib/commit.tcl:290 +msgid "Calling commit-msg hook..." +msgstr "Изпълняване на куката за съобщението при подаване…" -#: lib/tools_dlg.tcl:46 -msgid "Tool Details" -msgstr "Подробности за командата" +#: lib/commit.tcl:305 +msgid "Commit declined by commit-msg hook." +msgstr "Подаването е отхвърлено от куката за съобщението при подаване." -#: lib/tools_dlg.tcl:49 -msgid "Use '/' separators to create a submenu tree:" -msgstr "За създаване на подменюта използвайте знака „/“ за разделител:" +#: lib/commit.tcl:318 +msgid "Committing changes..." +msgstr "Подаване на промените…" -#: lib/tools_dlg.tcl:60 -msgid "Command:" -msgstr "Команда:" +#: lib/commit.tcl:334 +msgid "write-tree failed:" +msgstr "неуспешно запазване на дървото (write-tree):" -#: lib/tools_dlg.tcl:71 -msgid "Show a dialog before running" -msgstr "Преди изпълнение да се извежда диалогов прозорец" +#: lib/commit.tcl:335 lib/commit.tcl:382 lib/commit.tcl:403 +msgid "Commit failed." +msgstr "Неуспешно подаване." -#: lib/tools_dlg.tcl:77 -msgid "Ask the user to select a revision (sets $REVISION)" -msgstr "Потребителят да укаже версия (задаване на променливата $REVISION)" +#: lib/commit.tcl:352 +#, tcl-format +msgid "Commit %s appears to be corrupt" +msgstr "Подаването „%s“ изглежда повредено" -#: lib/tools_dlg.tcl:82 -msgid "Ask the user for additional arguments (sets $ARGS)" +#: lib/commit.tcl:357 +msgid "" +"No changes to commit.\n" +"\n" +"No files were modified by this commit and it was not a merge commit.\n" +"\n" +"A rescan will be automatically started now.\n" msgstr "" -"Потребителят да укаже допълнителни аргументи (задаване на променливата $ARGS)" +"Няма промени за подаване.\n" +"\n" +"В това подаване не са променяни никакви файлове, а и не е подаване със " +"сливане.\n" +"\n" +"Автоматично ще започне нова проверка.\n" -#: lib/tools_dlg.tcl:89 -msgid "Don't show the command output window" -msgstr "Без показване на прозорец с изхода от командата" +#: lib/commit.tcl:364 +msgid "No changes to commit." +msgstr "Няма промени за подаване." -#: lib/tools_dlg.tcl:94 -msgid "Run only if a diff is selected ($FILENAME not empty)" -msgstr "" -"Стартиране само след избор на разлика (променливата $FILENAME не е празна)" +#: lib/commit.tcl:381 +msgid "commit-tree failed:" +msgstr "неуспешно подаване на дървото (commit-tree):" -#: lib/tools_dlg.tcl:118 -msgid "Please supply a name for the tool." -msgstr "Задайте име за командата." +#: lib/commit.tcl:402 +msgid "update-ref failed:" +msgstr "неуспешно обновяване на указателите (update-ref):" -#: lib/tools_dlg.tcl:126 +#: lib/commit.tcl:495 #, tcl-format -msgid "Tool '%s' already exists." -msgstr "Командата „%s“ вече съществува." +msgid "Created commit %s: %s" +msgstr "Успешно подаване %s: %s" -#: lib/tools_dlg.tcl:148 -#, tcl-format -msgid "" -"Could not add tool:\n" -"%s" -msgstr "" -"Командата не може да бъде добавена:\n" -"%s" +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "В момента се извършва действие, изчакайте…" -#: lib/tools_dlg.tcl:187 -msgid "Remove Tool" -msgstr "Премахване на команда" +#: lib/console.tcl:186 +msgid "Success" +msgstr "Успех" -#: lib/tools_dlg.tcl:193 -msgid "Remove Tool Commands" -msgstr "Премахване на команди" +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Грешка: неуспешно изпълнение на команда" -#: lib/tools_dlg.tcl:198 -msgid "Remove" -msgstr "Премахване" +#: lib/database.tcl:42 +msgid "Number of loose objects" +msgstr "Брой непакетирани обекти" -#: lib/tools_dlg.tcl:231 -msgid "(Blue denotes repository-local tools)" -msgstr "(командите към локалното хранилище са обозначени в синьо)" +#: lib/database.tcl:43 +msgid "Disk space used by loose objects" +msgstr "Дисково пространство заето от непакетирани обекти" -#: lib/tools_dlg.tcl:292 -#, tcl-format -msgid "Run Command: %s" -msgstr "Изпълнение на командата „%s“" +#: lib/database.tcl:44 +msgid "Number of packed objects" +msgstr "Брой пакетирани обекти" -#: lib/tools_dlg.tcl:306 -msgid "Arguments" -msgstr "Аргументи" +#: lib/database.tcl:45 +msgid "Number of packs" +msgstr "Брой пакети" -#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166 -msgid "Visualize" -msgstr "Визуализация" +#: lib/database.tcl:46 +msgid "Disk space used by packed objects" +msgstr "Дисково пространство заето от пакетирани обекти" -#: lib/tools_dlg.tcl:341 -msgid "OK" -msgstr "Добре" +#: lib/database.tcl:47 +msgid "Packed objects waiting for pruning" +msgstr "Пакетирани обекти за окастряне" -#: lib/search.tcl:48 -msgid "Find:" -msgstr "Търсене:" +#: lib/database.tcl:48 +msgid "Garbage files" +msgstr "Файлове за боклука" -#: lib/search.tcl:50 -msgid "Next" -msgstr "Следваща поява" +#: lib/database.tcl:57 lib/option.tcl:182 lib/option.tcl:197 lib/option.tcl:220 +#: lib/option.tcl:282 +#, tcl-format +msgid "%s:" +msgstr "%s:" -#: lib/search.tcl:51 -msgid "Prev" -msgstr "Предишна поява" +#: lib/database.tcl:66 +#, tcl-format +msgid "%s (%s): Database Statistics" +msgstr "%s (%s): Статистика на базата от данни" -#: lib/search.tcl:52 -msgid "RegExp" -msgstr "Рег. израз" +#: lib/database.tcl:72 +msgid "Compressing the object database" +msgstr "Компресиране на базата с данни за обектите" -#: lib/search.tcl:54 -msgid "Case" -msgstr "Регистър" +#: lib/database.tcl:83 +msgid "Verifying the object database with fsck-objects" +msgstr "Проверка на базата с данни за обектите с програмата „fsck-objects“" -#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 -msgid "Cannot write shortcut:" -msgstr "Клавишната комбинация не може да бъде запазена:" +#: 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/shortcut.tcl:137 -msgid "Cannot write icon:" -msgstr "Иконата не може да бъде запазена:" +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Неправилни данни от Git: %s" #: lib/diff.tcl:77 #, tcl-format @@ -1443,7 +1698,7 @@ msgstr "" msgid "Loading diff of %s..." msgstr "Зареждане на разликите в „%s“…" -#: lib/diff.tcl:140 +#: lib/diff.tcl:143 msgid "" "LOCAL: deleted\n" "REMOTE:\n" @@ -1451,7 +1706,7 @@ msgstr "" "ЛОКАЛНО: изтрит\n" "ОТДАЛЕЧЕНО:\n" -#: lib/diff.tcl:145 +#: lib/diff.tcl:148 msgid "" "REMOTE: deleted\n" "LOCAL:\n" @@ -1459,32 +1714,32 @@ msgstr "" "ОТДАЛЕЧЕНО: изтрит\n" "ЛОКАЛНО:\n" -#: lib/diff.tcl:152 +#: lib/diff.tcl:155 msgid "LOCAL:\n" msgstr "ЛОКАЛНО:\n" -#: lib/diff.tcl:155 +#: lib/diff.tcl:158 msgid "REMOTE:\n" msgstr "ОТДАЛЕЧЕНО:\n" -#: lib/diff.tcl:217 lib/diff.tcl:355 +#: lib/diff.tcl:220 lib/diff.tcl:357 #, tcl-format msgid "Unable to display %s" msgstr "Файлът „%s“ не може да бъде показан" -#: lib/diff.tcl:218 +#: lib/diff.tcl:221 msgid "Error loading file:" msgstr "Грешка при зареждане на файл:" -#: lib/diff.tcl:225 +#: lib/diff.tcl:227 msgid "Git Repository (subproject)" msgstr "Хранилище на Git (подмодул)" -#: lib/diff.tcl:237 +#: lib/diff.tcl:239 msgid "* Binary file (not showing content)." msgstr "● Двоичен файл (съдържанието не се показва)." -#: lib/diff.tcl:242 +#: lib/diff.tcl:244 #, tcl-format msgid "" "* Untracked file is %d bytes.\n" @@ -1493,1222 +1748,1060 @@ msgstr "" "● Неследеният файл е %d байта.\n" "● Показват се само първите %d байта.\n" -#: lib/diff.tcl:248 -#, tcl-format -msgid "" -"\n" -"* Untracked file clipped here by %s.\n" -"* To see the entire file, use an external editor.\n" -msgstr "" -"\n" -"● Неследеният файл е отрязан дотук от програмата „%s“.\n" -"● Използвайте външен редактор, за да видите целия файл.\n" - -#: lib/diff.tcl: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 "Винаги (без проверка за сливане)" - -#: 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 +#: lib/diff.tcl:250 #, tcl-format msgid "" -"One or more of the merge tests failed because you have not fetched the " -"necessary commits. Try fetching from %s first." -msgstr "" -"Поне една от пробите за сливане е неуспешна, защото не сте доставили всички " -"необходими подавания. Пробвайте първо да доставите подаванията от „%s“." - -#: lib/remote_branch_delete.tcl:208 -msgid "Please select one or more branches to delete." -msgstr "Изберете поне един клон за изтриване." - -#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 -msgid "" -"Recovering deleted branches is difficult.\n" -"\n" -"Delete the selected branches?" -msgstr "" -"Възстановяването на изтрити клони може да е трудно.\n" "\n" -"Сигурни ли сте, че искате да триете?" - -#: lib/remote_branch_delete.tcl:227 -#, tcl-format -msgid "Deleting branches from %s" -msgstr "Изтриване на клони от „%s“" - -#: lib/remote_branch_delete.tcl:300 -msgid "No repository selected." -msgstr "Не е избрано хранилище." - -#: lib/remote_branch_delete.tcl:305 -#, tcl-format -msgid "Scanning %s..." -msgstr "Претърсване на „%s“…" - -#: lib/choose_repository.tcl:33 -msgid "Git Gui" -msgstr "ГПИ на Git" - -#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412 -msgid "Create New Repository" -msgstr "Създаване на ново хранилище" - -#: lib/choose_repository.tcl:98 -msgid "New..." -msgstr "Ново…" - -#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496 -msgid "Clone Existing Repository" -msgstr "Клониране на съществуващо хранилище" +"* Untracked file clipped here by %s.\n" +"* To see the entire file, use an external editor.\n" +msgstr "" +"\n" +"● Неследеният файл е отрязан дотук от програмата „%s“.\n" +"● Използвайте външен редактор, за да видите целия файл.\n" -#: lib/choose_repository.tcl:116 -msgid "Clone..." -msgstr "Клониране…" +#: lib/diff.tcl:580 +msgid "Failed to unstage selected hunk." +msgstr "Избраното парче не може да бъде извадено от индекса." -#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064 -msgid "Open Existing Repository" -msgstr "Отваряне на съществуващо хранилище" +#: lib/diff.tcl:587 +msgid "Failed to stage selected hunk." +msgstr "Избраното парче не може да бъде добавено към индекса." -#: lib/choose_repository.tcl:129 -msgid "Open..." -msgstr "Отваряне…" +#: lib/diff.tcl:666 +msgid "Failed to unstage selected line." +msgstr "Избраният ред не може да бъде изваден от индекса." -#: lib/choose_repository.tcl:142 -msgid "Recent Repositories" -msgstr "Скоро ползвани" +#: lib/diff.tcl:674 +msgid "Failed to stage selected line." +msgstr "Избраният ред не може да бъде добавен към индекса." -#: lib/choose_repository.tcl:148 -msgid "Open Recent Repository:" -msgstr "Отваряне на хранилище ползвано наскоро:" +#: lib/encoding.tcl:443 +msgid "Default" +msgstr "Стандартното" -#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323 -#: lib/choose_repository.tcl:330 +#: lib/encoding.tcl:448 #, tcl-format -msgid "Failed to create repository %s:" -msgstr "Неуспешно създаване на хранилището „%s“:" - -#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33 -msgid "Create" -msgstr "Създаване" +msgid "System (%s)" +msgstr "Системното (%s)" -#: lib/choose_repository.tcl:417 -msgid "Directory:" -msgstr "Директория:" +#: lib/encoding.tcl:459 lib/encoding.tcl:465 +msgid "Other" +msgstr "Друго" -#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573 -#: lib/choose_repository.tcl:1098 -msgid "Git Repository" -msgstr "Хранилище на Git" +#: lib/error.tcl:20 +#, tcl-format +msgid "%s: error" +msgstr "%s: грешка" -#: lib/choose_repository.tcl:472 +#: lib/error.tcl:36 #, tcl-format -msgid "Directory %s already exists." -msgstr "Вече съществува директория „%s“." +msgid "%s: warning" +msgstr "%s: предупреждение" -#: lib/choose_repository.tcl:476 +#: lib/error.tcl:80 #, tcl-format -msgid "File %s already exists." -msgstr "Вече съществува файл „%s“." +msgid "%s hook failed:" +msgstr "%s: грешка от куката" -#: lib/choose_repository.tcl:491 -msgid "Clone" -msgstr "Клониране" +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." +msgstr "Преди да можете да подадете, коригирайте горните грешки." -#: lib/choose_repository.tcl:504 -msgid "Source Location:" -msgstr "Адрес на източника:" +#: lib/error.tcl:116 +#, tcl-format +msgid "%s (%s): error" +msgstr "%s (%s): грешка" -#: lib/choose_repository.tcl:513 -msgid "Target Directory:" -msgstr "Целева директория:" +#: lib/index.tcl:6 +msgid "Unable to unlock the index." +msgstr "Индексът не може да бъде отключен." -#: lib/choose_repository.tcl:523 -msgid "Clone Type:" -msgstr "Вид клониране:" +#: lib/index.tcl:17 +msgid "Index Error" +msgstr "Грешка в индекса" -#: lib/choose_repository.tcl:528 -msgid "Standard (Fast, Semi-Redundant, Hardlinks)" -msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)" +#: lib/index.tcl:19 +msgid "" +"Updating the Git index failed. A rescan will be automatically started to " +"resynchronize git-gui." +msgstr "" +"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка " +"за синхронизирането на git-gui." -#: lib/choose_repository.tcl:533 -msgid "Full Copy (Slower, Redundant Backup)" -msgstr "Пълно (бавно, пълноценно резервно копие)" +#: lib/index.tcl:30 +msgid "Continue" +msgstr "Продължаване" -#: lib/choose_repository.tcl:538 -msgid "Shared (Fastest, Not Recommended, No Backup)" -msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)" +#: lib/index.tcl:33 +msgid "Unlock Index" +msgstr "Отключване на индекса" -#: lib/choose_repository.tcl:545 -msgid "Recursively clone submodules too" -msgstr "Рекурсивно клониране и на подмодулите" +#: lib/index.tcl:294 +msgid "Unstaging selected files from commit" +msgstr "Изваждане на избраните файлове от подаването" -#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626 -#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842 -#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112 +#: lib/index.tcl:298 #, tcl-format -msgid "Not a Git repository: %s" -msgstr "Това не е хранилище на Git: %s" +msgid "Unstaging %s from commit" +msgstr "Изваждане на „%s“ от подаването" -#: lib/choose_repository.tcl:615 -msgid "Standard only available for local repository." -msgstr "Само локални хранилища могат да се клонират стандартно" +#: lib/index.tcl:337 +msgid "Ready to commit." +msgstr "Готовност за подаване." -#: lib/choose_repository.tcl:619 -msgid "Shared only available for local repository." -msgstr "Само локални хранилища могат да се клонират споделено" +#: lib/index.tcl:346 +msgid "Adding selected files" +msgstr "Добавяне на избраните файлове" -#: lib/choose_repository.tcl:640 +#: lib/index.tcl:350 #, tcl-format -msgid "Location %s already exists." -msgstr "Местоположението „%s“ вече съществува." - -#: lib/choose_repository.tcl:651 -msgid "Failed to configure origin" -msgstr "Неуспешно настройване на хранилището-източник" +msgid "Adding %s" +msgstr "Добавяне на „%s“" -#: lib/choose_repository.tcl:663 -msgid "Counting objects" -msgstr "Преброяване на обекти" +#: lib/index.tcl:380 +#, tcl-format +msgid "Stage %d untracked files?" +msgstr "Да се добавят ли %d неследени файла към индекса?" -#: lib/choose_repository.tcl:664 -msgid "buckets" -msgstr "клетки" +#: lib/index.tcl:388 +msgid "Adding all changed files" +msgstr "Добавяне на всички променени файлове" -#: lib/choose_repository.tcl:688 +#: lib/index.tcl:428 #, tcl-format -msgid "Unable to copy objects/info/alternates: %s" -msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s" +msgid "Revert changes in file %s?" +msgstr "Да се махнат ли промените във файла „%s“?" -#: lib/choose_repository.tcl:724 +#: lib/index.tcl:430 #, tcl-format -msgid "Nothing to clone from %s." -msgstr "Няма какво да се клонира от „%s“." - -#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940 -#: lib/choose_repository.tcl:952 -msgid "The 'master' branch has not been initialized." -msgstr "Основният клон — „master“ не е инициализиран." - -#: lib/choose_repository.tcl:739 -msgid "Hardlinks are unavailable. Falling back to copying." -msgstr "Не се поддържат твърди връзки. Преминава се към копиране." +msgid "Revert changes in these %i files?" +msgstr "Да се махнат ли промените в тези %i файла?" -#: lib/choose_repository.tcl:751 -#, tcl-format -msgid "Cloning from %s" -msgstr "Клониране на „%s“" +#: lib/index.tcl:438 +msgid "Any unstaged changes will be permanently lost by the revert." +msgstr "" +"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно " +"загубени." -#: lib/choose_repository.tcl:782 -msgid "Copying objects" -msgstr "Копиране на обекти" +#: lib/index.tcl:441 +msgid "Do Nothing" +msgstr "Нищо да не се прави" -#: lib/choose_repository.tcl:783 -msgid "KiB" -msgstr "KiB" +#: lib/index.tcl:459 +msgid "Reverting selected files" +msgstr "Махане на промените в избраните файлове" -#: lib/choose_repository.tcl:807 +#: lib/index.tcl:463 #, tcl-format -msgid "Unable to copy object: %s" -msgstr "Неуспешно копиране на обект: %s" +msgid "Reverting %s" +msgstr "Махане на промените в „%s“" -#: lib/choose_repository.tcl:817 -msgid "Linking objects" -msgstr "Създаване на връзки към обектите" +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "Към ред:" -#: lib/choose_repository.tcl:818 -msgid "objects" -msgstr "обекти" +#: lib/line.tcl:23 +msgid "Go" +msgstr "Придвижване" -#: lib/choose_repository.tcl:826 -#, tcl-format -msgid "Unable to hardlink object: %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" -#: lib/choose_repository.tcl:881 -msgid "Cannot fetch branches and objects. See console output for details." +#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" msgstr "" -"Клоните и обектите не могат да бъдат изтеглени. За повече информация " -"погледнете изхода на конзолата." +"Последно установеното състояние не отговаря на това в хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено, преди да се извърши сливане.\n" +"\n" +"Автоматично ще започне нова проверка.\n" +"\n" -#: lib/choose_repository.tcl:892 -msgid "Cannot fetch tags. See console output for details." +#: lib/merge.tcl:45 +#, tcl-format +msgid "" +"You are in the middle of a conflicted merge.\n" +"\n" +"File %s has merge conflicts.\n" +"\n" +"You must resolve them, stage the file, and commit to complete the current " +"merge. Only then can you begin another merge.\n" msgstr "" -"Етикетите не могат да бъдат изтеглени. За повече информация погледнете " -"изхода на конзолата." +"В момента тече сливане, но има конфликти.\n" +"\n" +"Погледнете файла „%s“.\n" +"\n" +"Трябва да коригирате конфликтите в него, да го добавите към индекса и да " +"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново " +"сливане.\n" -#: lib/choose_repository.tcl:916 -msgid "Cannot determine HEAD. See console output for details." +#: lib/merge.tcl:55 +#, tcl-format +msgid "" +"You are in the middle of a change.\n" +"\n" +"File %s is modified.\n" +"\n" +"You should complete the current commit before starting a merge. Doing so " +"will help you abort a failed merge, should the need arise.\n" msgstr "" -"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете " -"изхода на конзолата." +"В момента тече подаване.\n" +"\n" +"Файлът „%s“ е променен.\n" +"\n" +"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще " +"можете лесно да преустановите сливането, ако възникне нужда.\n" -#: lib/choose_repository.tcl:925 +#: lib/merge.tcl:108 #, tcl-format -msgid "Unable to cleanup %s" -msgstr "„%s“ не може да се зачисти" +msgid "%s of %s" +msgstr "%s от общо %s" -#: lib/choose_repository.tcl:931 -msgid "Clone failed." -msgstr "Неуспешно клониране." +#: lib/merge.tcl:126 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "Сливане на „%s“ и „%s“…" -#: lib/choose_repository.tcl:938 -msgid "No default branch obtained." -msgstr "Не е получен клон по подразбиране." +#: lib/merge.tcl:137 +msgid "Merge completed successfully." +msgstr "Сливането завърши успешно." -#: lib/choose_repository.tcl:949 -#, tcl-format -msgid "Cannot resolve %s as a commit." -msgstr "Няма подаване отговарящо на „%s“." +#: lib/merge.tcl:139 +msgid "Merge failed. Conflict resolution is required." +msgstr "Неуспешно сливане — има конфликти за коригиране." -#: lib/choose_repository.tcl:961 -msgid "Creating working directory" -msgstr "Създаване на работната директория" +#: lib/merge.tcl:156 +#, tcl-format +msgid "%s (%s): Merge" +msgstr "%s (%s): Сливане" -#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136 -#: lib/index.tcl:207 -msgid "files" -msgstr "файлове" +#: lib/merge.tcl:164 +#, tcl-format +msgid "Merge Into %s" +msgstr "Сливане в „%s“" -#: lib/choose_repository.tcl:981 -msgid "Cannot clone submodules." -msgstr "Подмодулите не могат да се клонират." +#: lib/merge.tcl:183 +msgid "Revision To Merge" +msgstr "Версия за сливане" -#: lib/choose_repository.tcl:990 -msgid "Cloning submodules" -msgstr "Клониране на подмодулите" +#: lib/merge.tcl:218 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"Поправянето не може да бъде преустановено.\n" +"\n" +"Трябва да завършите поправката на това подаване.\n" -#: lib/choose_repository.tcl:1015 -msgid "Initial file checkout failed." -msgstr "Неуспешно първоначално изтегляне." +#: lib/merge.tcl:228 +msgid "" +"Abort merge?\n" +"\n" +"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with aborting the current merge?" +msgstr "" +"Да се преустанови ли сливането?\n" +"\n" +"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"Наистина ли да се преустанови сливането?" -#: lib/choose_repository.tcl:1059 -msgid "Open" -msgstr "Отваряне" +#: lib/merge.tcl:234 +msgid "" +"Reset changes?\n" +"\n" +"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with resetting the current changes?" +msgstr "" +"Да се занулят ли промените?\n" +"\n" +"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"Наистина ли да се занулят промените?" -#: lib/choose_repository.tcl:1069 -msgid "Repository:" -msgstr "Хранилище:" +#: lib/merge.tcl:245 +msgid "Aborting" +msgstr "Преустановяване" -#: lib/choose_repository.tcl:1118 -#, tcl-format -msgid "Failed to open repository %s:" -msgstr "Неуспешно отваряне на хранилището „%s“:" +#: lib/merge.tcl:245 +msgid "files reset" +msgstr "файла със занулени промени" -#: lib/about.tcl:26 -msgid "git-gui - a graphical user interface for Git." -msgstr "git-gui — графичен интерфейс за Git." +#: lib/merge.tcl:273 +msgid "Abort failed." +msgstr "Неуспешно преустановяване." -#: lib/checkout_op.tcl:85 -#, tcl-format -msgid "Fetching %s from %s" -msgstr "Доставяне на „%s“ от „%s“" +#: lib/merge.tcl:275 +msgid "Abort completed. Ready." +msgstr "Успешно преустановяване. Готовност за следващо действие." -#: lib/checkout_op.tcl:133 -#, tcl-format -msgid "fatal: Cannot resolve %s" -msgstr "фатална грешка: „%s“ не може да се открие" +#: lib/mergetool.tcl:8 +msgid "Force resolution to the base version?" +msgstr "Да се използва базовата версия" -#: lib/checkout_op.tcl:175 -#, tcl-format -msgid "Branch '%s' does not exist." -msgstr "Клонът „%s“ не съществува." +#: lib/mergetool.tcl:9 +msgid "Force resolution to this branch?" +msgstr "Да се използва версията от този клон" -#: lib/checkout_op.tcl:194 -#, tcl-format -msgid "Failed to configure simplified git-pull for '%s'." -msgstr "Неуспешно настройване на опростен git-pull за „%s“." +#: lib/mergetool.tcl:10 +msgid "Force resolution to the other branch?" +msgstr "Да се използва версията от другия клон" -#: lib/checkout_op.tcl:229 +#: lib/mergetool.tcl:14 #, tcl-format msgid "" -"Branch '%s' already exists.\n" +"Note that the diff shows only conflicting changes.\n" "\n" -"It cannot fast-forward to %s.\n" -"A merge is required." +"%s will be overwritten.\n" +"\n" +"This operation can be undone only by restarting the merge." msgstr "" -"Клонът „%s“ съществува.\n" +"Разликата показва само разликите с конфликт.\n" "\n" -"Той не може да бъде тривиално слят до „%s“.\n" -"Необходимо е сливане." +"Файлът „%s“ ще бъде презаписан.\n" +"\n" +"Тази операция може да бъде отменена само чрез започване на сливането наново." -#: lib/checkout_op.tcl:243 +#: lib/mergetool.tcl:45 #, tcl-format -msgid "Merge strategy '%s' not supported." -msgstr "Стратегия за сливане „%s“ не се поддържа." +msgid "File %s seems to have unresolved conflicts, still stage?" +msgstr "" +"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави " +"ли файлът към индекса?" -#: lib/checkout_op.tcl:262 +#: lib/mergetool.tcl:60 #, tcl-format -msgid "Failed to update '%s'." -msgstr "Неуспешно обновяване на „%s“." - -#: lib/checkout_op.tcl:274 -msgid "Staging area (index) is already locked." -msgstr "Индексът вече е заключен." +msgid "Adding resolution for %s" +msgstr "Добавяне на корекция на конфликтите в „%s“" -#: 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" +#: lib/mergetool.tcl:141 +msgid "Cannot resolve deletion or link conflicts using a tool" msgstr "" -"Състоянието при последната проверка не отговаря на състоянието на " -"хранилището.\n" -"\n" -"Някой друг процес за Git е променил хранилището междувременно. Състоянието " -"трябва да бъде проверено, преди да се премине към нов клон.\n" -"\n" -"Автоматично ще започне нова проверка.\n" +"Конфликтите при символни връзки или изтриване не могат да бъдат коригирани с " +"външна програма." -#: lib/checkout_op.tcl:345 -#, tcl-format -msgid "Updating working directory to '%s'..." -msgstr "Работната директория се привежда към „%s“…" +#: lib/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "Файлът, в който е конфликтът, не съществува" -#: lib/checkout_op.tcl:346 -msgid "files checked out" -msgstr "файла са изтеглени" +#: lib/mergetool.tcl:246 +#, tcl-format +msgid "Not a GUI merge tool: '%s'" +msgstr "Това не е графична програма за сливане: „%s“" -#: lib/checkout_op.tcl:376 +#: lib/mergetool.tcl:275 #, tcl-format -msgid "Aborted checkout of '%s' (file level merging is required)." -msgstr "" -"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)." +msgid "Unsupported merge tool '%s'" +msgstr "Неподдържана програма за сливане: „%s“" -#: lib/checkout_op.tcl:377 -msgid "File level merge required." -msgstr "Необходимо е пофайлово сливане." +#: lib/mergetool.tcl:310 +msgid "Merge tool is already running, terminate it?" +msgstr "Програмата за сливане вече е стартирана. Да бъде ли изключена?" -#: lib/checkout_op.tcl:381 +#: lib/mergetool.tcl:330 #, tcl-format -msgid "Staying on branch '%s'." -msgstr "Оставане върху клона „%s“." +msgid "" +"Error retrieving versions:\n" +"%s" +msgstr "" +"Грешка при изтеглянето на версии:\n" +"%s" -#: lib/checkout_op.tcl:452 +#: lib/mergetool.tcl:350 +#, tcl-format msgid "" -"You are no longer on a local branch.\n" +"Could not start the merge tool:\n" "\n" -"If you wanted to be on a branch, create one now starting from 'This Detached " -"Checkout'." +"%s" msgstr "" -"Вече не сте на локален клон.\n" +"Програмата за сливане не може да бъде стартирана:\n" "\n" -"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“." +"%s" -#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 +#: 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 "Checked out '%s'." -msgstr "„%s“ е изтеглен." +msgid "Invalid global encoding '%s'" +msgstr "Неправилно глобално кодиране „%s“" -#: lib/checkout_op.tcl:535 +#: lib/option.tcl:19 #, tcl-format -msgid "Resetting '%s' to '%s' will lose the following commits:" -msgstr "" -"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:" +msgid "Invalid repo encoding '%s'" +msgstr "Неправилно кодиране „%s“ на хранилището" -#: lib/checkout_op.tcl:557 -msgid "Recovering lost commits may not be easy." -msgstr "Възстановяването на загубените подавания може да е трудно." +#: lib/option.tcl:119 +msgid "Restore Defaults" +msgstr "Стандартни настройки" -#: lib/checkout_op.tcl:562 +#: lib/option.tcl:123 +msgid "Save" +msgstr "Запазване" + +#: lib/option.tcl:133 #, tcl-format -msgid "Reset '%s'?" -msgstr "Зануляване на „%s“?" +msgid "%s Repository" +msgstr "Хранилище „%s“" -#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 -msgid "Reset" -msgstr "Отначало" +#: lib/option.tcl:134 +msgid "Global (All Repositories)" +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/option.tcl:140 +msgid "User Name" +msgstr "Потребителско име" -#: lib/branch_create.tcl:23 -msgid "Create Branch" -msgstr "Създаване на клон" +#: lib/option.tcl:141 +msgid "Email Address" +msgstr "Адрес на е-поща" -#: lib/branch_create.tcl:28 -msgid "Create New Branch" -msgstr "Създаване на нов клон" +#: lib/option.tcl:143 +msgid "Summarize Merge Commits" +msgstr "Обобщаване на подаванията при сливане" -#: lib/branch_create.tcl:42 -msgid "Branch Name" -msgstr "Име на клона" +#: lib/option.tcl:144 +msgid "Merge Verbosity" +msgstr "Подробности при сливанията" -#: lib/branch_create.tcl:57 -msgid "Match Tracking Branch Name" -msgstr "Съвпадане по името на следения клон" +#: lib/option.tcl:145 +msgid "Show Diffstat After Merge" +msgstr "Извеждане на статистика след сливанията" -#: lib/branch_create.tcl:66 -msgid "Starting Revision" -msgstr "Начална версия" +#: lib/option.tcl:146 +msgid "Use Merge Tool" +msgstr "Използване на програма за сливане" -#: lib/branch_create.tcl:72 -msgid "Update Existing Branch:" -msgstr "Обновяване на съществуващ клон:" +#: lib/option.tcl:148 +msgid "Trust File Modification Timestamps" +msgstr "Доверие във времето на промяна на файловете" -#: lib/branch_create.tcl:75 -msgid "No" -msgstr "Не" +#: lib/option.tcl:149 +msgid "Prune Tracking Branches During Fetch" +msgstr "Окастряне на следящите клонове при доставяне" -#: lib/branch_create.tcl:80 -msgid "Fast Forward Only" -msgstr "Само тривиално превъртащо сливане" +#: lib/option.tcl:150 +msgid "Match Tracking Branches" +msgstr "Напасване на следящите клонове" -#: lib/branch_create.tcl:97 -msgid "Checkout After Creation" -msgstr "Преминаване към клона след създаването му" +#: lib/option.tcl:151 +msgid "Use Textconv For Diffs and Blames" +msgstr "Използване на „textconv“ за разликите и анотирането" -#: lib/branch_create.tcl:132 -msgid "Please select a tracking branch." -msgstr "Изберете клон за следени." +#: lib/option.tcl:152 +msgid "Blame Copy Only On Changed Files" +msgstr "Анотиране на копието само по променените файлове" -#: lib/branch_create.tcl:141 -#, tcl-format -msgid "Tracking branch %s is not a branch in the remote repository." -msgstr "Следящият клон — „%s“, не съществува в отдалеченото хранилище." +#: lib/option.tcl:153 +msgid "Maximum Length of Recent Repositories List" +msgstr "Максимален брой на списъка „Скоро ползвани“ хранилища" -#: lib/console.tcl:59 -msgid "Working... please wait..." -msgstr "В момента се извършва действие, изчакайте…" +#: lib/option.tcl:154 +msgid "Minimum Letters To Blame Copy On" +msgstr "Минимален брой знаци за анотиране на копието" -#: lib/console.tcl:186 -msgid "Success" -msgstr "Успех" +#: lib/option.tcl:155 +msgid "Blame History Context Radius (days)" +msgstr "Исторически обхват за анотиране в дни" -#: lib/console.tcl:200 -msgid "Error: Command Failed" -msgstr "Грешка: неуспешно изпълнение на команда" +#: lib/option.tcl:156 +msgid "Number of Diff Context Lines" +msgstr "Брой редове за контекста на разликите" -#: lib/choose_rev.tcl:52 -msgid "This Detached Checkout" -msgstr "Това несвързано изтегляне" +#: lib/option.tcl:157 +msgid "Additional Diff Parameters" +msgstr "Аргументи към командата за разликите" -#: lib/choose_rev.tcl:60 -msgid "Revision Expression:" -msgstr "Израз за версия:" +#: lib/option.tcl:158 +msgid "Commit Message Text Width" +msgstr "Широчина на текста на съобщението при подаване" -#: lib/choose_rev.tcl:72 -msgid "Local Branch" -msgstr "Локален клон" +#: lib/option.tcl:159 +msgid "New Branch Name Template" +msgstr "Шаблон за името на новите клони" -#: lib/choose_rev.tcl:77 -msgid "Tracking Branch" -msgstr "Следящ клон" +#: lib/option.tcl:160 +msgid "Default File Contents Encoding" +msgstr "Кодиране на файловете" -#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 -msgid "Tag" -msgstr "Етикет" +#: lib/option.tcl:161 +msgid "Warn before committing to a detached head" +msgstr "Предупреждаване при подаване към несвързан указател" -#: lib/choose_rev.tcl:321 -#, tcl-format -msgid "Invalid revision: %s" -msgstr "Неправилна версия: %s" +#: lib/option.tcl:162 +msgid "Staging of untracked files" +msgstr "Добавяне на неследените файлове към индекса" -#: lib/choose_rev.tcl:342 -msgid "No revision selected." -msgstr "Не е избрана версия." +#: lib/option.tcl:163 +msgid "Show untracked files" +msgstr "Показване на неследените файлове" -#: lib/choose_rev.tcl:350 -msgid "Revision expression is empty." -msgstr "Изразът за версия е празен." +#: lib/option.tcl:164 +msgid "Tab spacing" +msgstr "Ширина на табулацията" -#: lib/choose_rev.tcl:537 -msgid "Updated" -msgstr "Обновен" +#: lib/option.tcl:210 +msgid "Change" +msgstr "Смяна" -#: lib/choose_rev.tcl:565 -msgid "URL" -msgstr "Адрес" +#: lib/option.tcl:254 +msgid "Spelling Dictionary:" +msgstr "Правописен речник:" -#: lib/line.tcl:17 -msgid "Goto Line:" -msgstr "Към ред:" +#: lib/option.tcl:284 +msgid "Change Font" +msgstr "Смяна на шрифта" -#: lib/line.tcl:23 -msgid "Go" -msgstr "Придвижване" +#: lib/option.tcl:288 +#, tcl-format +msgid "Choose %s" +msgstr "Избор на „%s“" -#: lib/commit.tcl:9 -msgid "" -"There is nothing to amend.\n" -"\n" -"You are about to create the initial commit. There is no commit before this " -"to amend.\n" -msgstr "" -"Няма какво да се поправи.\n" -"\n" -"Ще създадете първоначалното подаване. Преди него няма други подавания, които " -"да поправите.\n" +#: lib/option.tcl:294 +msgid "pt." +msgstr "тчк." -#: lib/commit.tcl:18 -msgid "" -"Cannot amend while merging.\n" -"\n" -"You are currently in the middle of a merge that has not been fully " -"completed. You cannot amend the prior commit unless you first abort the " -"current merge activity.\n" -msgstr "" -"По време на сливане не може да поправяте.\n" -"\n" -"В момента все още не сте завършили операция по сливане. Не може да поправите " -"предишното подаване, освен ако първо не преустановите текущото сливане.\n" +#: lib/option.tcl:308 +msgid "Preferences" +msgstr "Настройки" -#: lib/commit.tcl:48 -msgid "Error loading commit data for amend:" -msgstr "Грешка при зареждане на данните от подаване, които да се поправят:" +#: lib/option.tcl:345 +msgid "Failed to completely save options:" +msgstr "Неуспешно запазване на настройките:" -#: lib/commit.tcl:75 -msgid "Unable to obtain your identity:" -msgstr "Идентификацията ви не може да бъде определена:" +#: lib/remote.tcl:200 +msgid "Push to" +msgstr "Изтласкване към" -#: lib/commit.tcl:80 -msgid "Invalid GIT_COMMITTER_IDENT:" -msgstr "Неправилно поле „GIT_COMMITTER_IDENT“:" +#: lib/remote.tcl:218 +msgid "Remove Remote" +msgstr "Премахване на отдалечено хранилище" -#: lib/commit.tcl:129 -#, tcl-format -msgid "warning: Tcl does not support encoding '%s'." -msgstr "предупреждение: Tcl не поддържа кодирането „%s“." +#: lib/remote.tcl:223 +msgid "Prune from" +msgstr "Окастряне от" + +#: lib/remote.tcl:228 +msgid "Fetch from" +msgstr "Доставяне от" -#: lib/commit.tcl:149 -msgid "" -"Last scanned state does not match repository state.\n" -"\n" -"Another Git program has modified this repository since the last scan. A " -"rescan must be performed before another commit can be created.\n" -"\n" -"The rescan will be automatically started now.\n" -msgstr "" -"Състоянието при последната проверка не отговаря на състоянието на " -"хранилището.\n" -"\n" -"Някой друг процес за Git е променил хранилището междувременно. Състоянието " -"трябва да бъде проверено преди ново подаване.\n" -"\n" -"Автоматично ще започне нова проверка.\n" +#: lib/remote.tcl:253 lib/remote.tcl:258 +msgid "All" +msgstr "Всички" -#: lib/commit.tcl:173 +#: lib/remote_add.tcl:20 #, 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" +msgid "%s (%s): Add Remote" +msgstr "%s (%s): Добавяне на отдалечено хранилище" -#: lib/commit.tcl:181 -#, tcl-format -msgid "" -"Unknown file state %s detected.\n" -"\n" -"File %s cannot be committed by this program.\n" -msgstr "" -"Непознато състояние на файл „%s“.\n" -"\n" -"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n" +#: lib/remote_add.tcl:25 +msgid "Add New Remote" +msgstr "Добавяне на отдалечено хранилище" -#: lib/commit.tcl:189 -msgid "" -"No changes to commit.\n" -"\n" -"You must stage at least 1 file before you can commit.\n" -msgstr "" -"Няма промени за подаване.\n" -"\n" -"Трябва да добавите поне един файл към индекса, за да подадете.\n" +#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 +msgid "Add" +msgstr "Добавяне" -#: lib/commit.tcl:204 -msgid "" -"Please supply a commit message.\n" -"\n" -"A good commit message has the following format:\n" -"\n" -"- First line: Describe in one sentence what you did.\n" -"- Second line: Blank\n" -"- Remaining lines: Describe why this change is good.\n" -msgstr "" -"Задайте добро съобщение при подаване.\n" -"\n" -"Използвайте следния формат:\n" -"\n" -"● Първи ред: описание в едно изречение на промяната.\n" -"● Втори ред: празен.\n" -"● Останалите редове: опишете защо се налага тази промяна.\n" +#: lib/remote_add.tcl:39 +msgid "Remote Details" +msgstr "Данни за отдалеченото хранилище" -#: lib/commit.tcl:235 -msgid "Calling pre-commit hook..." -msgstr "Изпълняване на куката преди подаване…" +#: lib/remote_add.tcl:50 +msgid "Location:" +msgstr "Местоположение:" -#: lib/commit.tcl:250 -msgid "Commit declined by pre-commit hook." -msgstr "Подаването е отхвърлено от куката преди подаване." +#: lib/remote_add.tcl:60 +msgid "Further Action" +msgstr "Следващо действие" -#: lib/commit.tcl:269 -msgid "" -"You are about to commit on a detached head. This is a potentially dangerous " -"thing to do because if you switch to another branch you will lose your " -"changes and it can be difficult to retrieve them later from the reflog. You " -"should probably cancel this commit and create a new branch to continue.\n" -" \n" -" Do you really want to proceed with your Commit?" -msgstr "" -"Ще подавате към несвързан връх. Това е опасно — при изтеглянето на друг клон " -"ще изгубите промените си. След това може да е невъзможно да ги възстановите " -"от журнала на указателите „reflog“. Най-вероятно трябва да отмените това " -"подаване и да създадете клон, в който да подадете.\n" -" \n" -"Сигурни ли сте, че искате да подадете към несвързан връх?" +#: lib/remote_add.tcl:63 +msgid "Fetch Immediately" +msgstr "Незабавно доставяне" -#: lib/commit.tcl:290 -msgid "Calling commit-msg hook..." -msgstr "Изпълняване на куката за съобщението при подаване…" +#: lib/remote_add.tcl:69 +msgid "Initialize Remote Repository and Push" +msgstr "Инициализиране на отдалеченото хранилище и изтласкване на промените" -#: lib/commit.tcl:305 -msgid "Commit declined by commit-msg hook." -msgstr "Подаването е отхвърлено от куката за съобщението при подаване." +#: lib/remote_add.tcl:75 +msgid "Do Nothing Else Now" +msgstr "Да не се прави нищо" -#: lib/commit.tcl:318 -msgid "Committing changes..." -msgstr "Подаване на промените…" +#: lib/remote_add.tcl:100 +msgid "Please supply a remote name." +msgstr "Задайте име за отдалеченото хранилище." -#: lib/commit.tcl:334 -msgid "write-tree failed:" -msgstr "неуспешно запазване на дървото (write-tree):" +#: lib/remote_add.tcl:113 +#, tcl-format +msgid "'%s' is not an acceptable remote name." +msgstr "Отдалечено хранилище не може да се казва „%s“." -#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 -msgid "Commit failed." -msgstr "Неуспешно подаване." +#: lib/remote_add.tcl:124 +#, tcl-format +msgid "Failed to add remote '%s' of location '%s'." +msgstr "Неуспешно добавяне на отдалеченото хранилище „%s“ от адрес „%s“." -#: lib/commit.tcl:352 +#: lib/remote_add.tcl:132 lib/transport.tcl:6 #, tcl-format -msgid "Commit %s appears to be corrupt" -msgstr "Подаването „%s“ изглежда повредено" +msgid "fetch %s" +msgstr "доставяне на „%s“" -#: lib/commit.tcl:357 -msgid "" -"No changes to commit.\n" -"\n" -"No files were modified by this commit and it was not a merge commit.\n" -"\n" -"A rescan will be automatically started now.\n" -msgstr "" -"Няма промени за подаване.\n" -"\n" -"В това подаване не са променяни никакви файлове, а и не е подаване със " -"сливане.\n" -"\n" -"Автоматично ще започне нова проверка.\n" +#: lib/remote_add.tcl:133 +#, tcl-format +msgid "Fetching the %s" +msgstr "Доставяне на „%s“" -#: lib/commit.tcl:364 -msgid "No changes to commit." -msgstr "Няма промени за подаване." +#: lib/remote_add.tcl:156 +#, tcl-format +msgid "Do not know how to initialize repository at location '%s'." +msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано." -#: lib/commit.tcl:378 -msgid "commit-tree failed:" -msgstr "неуспешно подаване на дървото (commit-tree):" +#: 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/commit.tcl:399 -msgid "update-ref failed:" -msgstr "неуспешно обновяване на указателите (update-ref):" +#: lib/remote_add.tcl:163 +#, tcl-format +msgid "Setting up the %s (at %s)" +msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)" -#: lib/commit.tcl:492 +#: lib/remote_branch_delete.tcl:29 #, tcl-format -msgid "Created commit %s: %s" -msgstr "Успешно подаване %s: %s" +msgid "%s (%s): Delete Branch Remotely" +msgstr "%s (%s): Изтриване на отдалечения клон" -#: lib/branch_delete.tcl:16 -msgid "Delete Branch" -msgstr "Изтриване на клон" +#: lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "Изтриване на отдалечения клон" -#: lib/branch_delete.tcl:21 -msgid "Delete Local Branch" -msgstr "Изтриване на локален клон" +#: lib/remote_branch_delete.tcl:48 +msgid "From Repository" +msgstr "От хранилище" -#: lib/branch_delete.tcl:39 -msgid "Local Branches" -msgstr "Локални клони" +#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:165 +msgid "Remote:" +msgstr "Отдалечено хранилище:" -#: lib/branch_delete.tcl:51 -msgid "Delete Only If Merged Into" -msgstr "Изтриване, само ако промените са слети и другаде" +#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187 +msgid "Arbitrary Location:" +msgstr "Произволно местоположение:" -#: lib/branch_delete.tcl:103 -#, tcl-format -msgid "The following branches are not completely merged into %s:" -msgstr "Не всички промени в клоните са слети в „%s“:" +#: lib/remote_branch_delete.tcl:88 +msgid "Branches" +msgstr "Клони" -#: lib/branch_delete.tcl:141 +#: 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 "" -"Failed to delete branches:\n" -"%s" +"The following branches are not completely merged into %s:\n" +"\n" +" - %s" msgstr "" -"Неуспешно триене на клони:\n" -"%s" +"Следните клони не са слети напълно в „%s“:\n" +"\n" +" ● %s" -#: lib/blame.tcl:73 -msgid "File Viewer" -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/blame.tcl:79 -msgid "Commit:" -msgstr "Подаване:" +#: lib/remote_branch_delete.tcl:208 +msgid "Please select one or more branches to delete." +msgstr "Изберете поне един клон за изтриване." -#: lib/blame.tcl:280 -msgid "Copy Commit" -msgstr "Копиране на подаване" +#: lib/remote_branch_delete.tcl:227 +#, tcl-format +msgid "Deleting branches from %s" +msgstr "Изтриване на клони от „%s“" -#: lib/blame.tcl:284 -msgid "Find Text..." -msgstr "Търсене на текст…" +#: lib/remote_branch_delete.tcl:300 +msgid "No repository selected." +msgstr "Не е избрано хранилище." -#: lib/blame.tcl:288 -msgid "Goto Line..." -msgstr "Към ред…" +#: lib/remote_branch_delete.tcl:305 +#, tcl-format +msgid "Scanning %s..." +msgstr "Претърсване на „%s“…" -#: lib/blame.tcl:297 -msgid "Do Full Copy Detection" -msgstr "Пълно търсене на копиране" +#: lib/search.tcl:48 +msgid "Find:" +msgstr "Търсене:" -#: lib/blame.tcl:301 -msgid "Show History Context" -msgstr "Показване на контекста от историята" +#: lib/search.tcl:50 +msgid "Next" +msgstr "Следваща поява" -#: lib/blame.tcl:304 -msgid "Blame Parent Commit" -msgstr "Анотиране на родителското подаване" +#: lib/search.tcl:51 +msgid "Prev" +msgstr "Предишна поява" -#: lib/blame.tcl:466 -#, tcl-format -msgid "Reading %s..." -msgstr "Чете се „%s“…" +#: lib/search.tcl:52 +msgid "RegExp" +msgstr "РегИзр" -#: lib/blame.tcl:594 -msgid "Loading copy/move tracking annotations..." -msgstr "Зареждане на анотациите за проследяване на копирането/преместването…" +#: lib/search.tcl:54 +msgid "Case" +msgstr "Главни/малки" -#: lib/blame.tcl:614 -msgid "lines annotated" -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/blame.tcl:806 -msgid "Loading original location annotations..." -msgstr "Зареждане на анотациите за първоначалното местоположение…" +#: lib/shortcut.tcl:24 lib/shortcut.tcl:65 +msgid "Cannot write shortcut:" +msgstr "Клавишната комбинация не може да бъде запазена:" -#: lib/blame.tcl:809 -msgid "Annotation complete." -msgstr "Анотирането завърши." +#: lib/shortcut.tcl:140 +msgid "Cannot write icon:" +msgstr "Иконата не може да бъде запазена:" -#: lib/blame.tcl:839 -msgid "Busy" -msgstr "Операцията не е завършила" +#: lib/spellcheck.tcl:57 +msgid "Unsupported spell checker" +msgstr "Тази програма за проверка на правописа не се поддържа" -#: lib/blame.tcl:840 -msgid "Annotation process is already running." -msgstr "В момента тече процес на анотиране." +#: lib/spellcheck.tcl:65 +msgid "Spell checking is unavailable" +msgstr "Липсва програма за проверка на правописа" -#: lib/blame.tcl:879 -msgid "Running thorough copy detection..." -msgstr "Изпълнява се цялостен процес на откриване на копиране…" +#: lib/spellcheck.tcl:68 +msgid "Invalid spell checking configuration" +msgstr "Неправилни настройки на проверката на правописа" -#: lib/blame.tcl:947 -msgid "Loading annotation..." -msgstr "Зареждане на анотации…" +#: lib/spellcheck.tcl:70 +#, tcl-format +msgid "Reverting dictionary to %s." +msgstr "Ползване на речник за език „%s“." -#: lib/blame.tcl:1000 -msgid "Author:" -msgstr "Автор:" +#: lib/spellcheck.tcl:73 +msgid "Spell checker silently failed on startup" +msgstr "Програмата за правопис даже не стартира успешно." -#: lib/blame.tcl:1004 -msgid "Committer:" -msgstr "Подал:" +#: lib/spellcheck.tcl:80 +msgid "Unrecognized spell checker" +msgstr "Непозната програма за проверка на правописа" -#: lib/blame.tcl:1009 -msgid "Original File:" -msgstr "Първоначален файл:" +#: lib/spellcheck.tcl:186 +msgid "No Suggestions" +msgstr "Няма предложения" -#: lib/blame.tcl:1057 -msgid "Cannot find HEAD commit:" -msgstr "Подаването за връх „HEAD“ не може да се открие:" +#: lib/spellcheck.tcl:388 +msgid "Unexpected EOF from spell checker" +msgstr "Неочакван край на файл от програмата за проверка на правописа" -#: lib/blame.tcl:1112 -msgid "Cannot find parent commit:" -msgstr "Родителското подаване не може да бъде открито" +#: lib/spellcheck.tcl:392 +msgid "Spell Checker Failed" +msgstr "Грешка в програмата за проверка на правописа" -#: lib/blame.tcl:1127 -msgid "Unable to display parent" -msgstr "Родителят не може да бъде показан" +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Не са открити ключове." -#: lib/blame.tcl:1269 -msgid "Originally By:" -msgstr "Първоначално от:" +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Открит е публичен ключ в „%s“" -#: lib/blame.tcl:1275 -msgid "In File:" -msgstr "Във файл:" +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Генериране на ключ" -#: lib/blame.tcl:1280 -msgid "Copied Or Moved Here By:" -msgstr "Копирано или преместено тук от:" +#: lib/sshkey.tcl:58 +msgid "Copy To Clipboard" +msgstr "Копиране към системния буфер" -#: lib/index.tcl:6 -msgid "Unable to unlock the index." -msgstr "Индексът не може да бъде отключен." +#: lib/sshkey.tcl:72 +msgid "Your OpenSSH Public Key" +msgstr "Публичният ви ключ за OpenSSH" -#: lib/index.tcl:17 -msgid "Index Error" -msgstr "Грешка в индекса" +#: lib/sshkey.tcl:80 +msgid "Generating..." +msgstr "Генериране…" -#: lib/index.tcl:19 +#: lib/sshkey.tcl:86 +#, tcl-format msgid "" -"Updating the Git index failed. A rescan will be automatically started to " -"resynchronize git-gui." +"Could not start ssh-keygen:\n" +"\n" +"%s" msgstr "" -"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка " -"за синхронизирането на git-gui." +"Програмата „ssh-keygen“ не може да бъде стартирана:\n" +"\n" +"%s" -#: lib/index.tcl:30 -msgid "Continue" -msgstr "Продължаване" +#: lib/sshkey.tcl:113 +msgid "Generation failed." +msgstr "Неуспешно генериране." -#: lib/index.tcl:33 -msgid "Unlock Index" -msgstr "Отключване на индекса" +#: lib/sshkey.tcl:120 +msgid "Generation succeeded, but no keys found." +msgstr "Генерирането завърши успешно, а не са намерени ключове." -#: lib/index.tcl:298 +#: lib/sshkey.tcl:123 #, tcl-format -msgid "Unstaging %s from commit" -msgstr "Изваждане на „%s“ от подаването" +msgid "Your key is in: %s" +msgstr "Ключът ви е в „%s“" -#: lib/index.tcl:337 -msgid "Ready to commit." -msgstr "Готовност за подаване." +#: lib/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s… %*i от общо %*i %s (%3i%%)" -#: lib/index.tcl:350 +#: lib/tools.tcl:76 #, tcl-format -msgid "Adding %s" -msgstr "Добавяне на „%s“" +msgid "Running %s requires a selected file." +msgstr "За изпълнението на „%s“ трябва да изберете файл." -#: lib/index.tcl:380 +#: lib/tools.tcl:92 #, tcl-format -msgid "Stage %d untracked files?" -msgstr "Да се вкарат ли %d неследени файла в индекса?" +msgid "Are you sure you want to run %1$s on file \"%2$s\"?" +msgstr "Сигурни ли сте, че искате да изпълните „%1$s“ върху файла „%2$s“?" -#: lib/index.tcl:428 +#: lib/tools.tcl:96 #, tcl-format -msgid "Revert changes in file %s?" -msgstr "Да се махнат ли промените във файла „%s“?" +msgid "Are you sure you want to run %s?" +msgstr "Сигурни ли сте, че искате да изпълните „%s“?" -#: lib/index.tcl:430 +#: lib/tools.tcl:118 #, tcl-format -msgid "Revert changes in these %i files?" -msgstr "Да се махнат ли промените в тези %i файла?" +msgid "Tool: %s" +msgstr "Команда: %s" -#: lib/index.tcl:438 -msgid "Any unstaged changes will be permanently lost by the revert." +#: 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/index.tcl:441 -msgid "Do Nothing" -msgstr "Нищо да не се прави" +#: 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/index.tcl:459 -msgid "Reverting selected files" -msgstr "Махане на промените в избраните файлове" +#: lib/tools_dlg.tcl:118 +msgid "Please supply a name for the tool." +msgstr "Задайте име за командата." -#: lib/index.tcl:463 +#: lib/tools_dlg.tcl:126 #, tcl-format -msgid "Reverting %s" -msgstr "Махане на промените в „%s“" +msgid "Tool '%s' already exists." +msgstr "Командата „%s“ вече съществува." -#: lib/date.tcl:25 +#: lib/tools_dlg.tcl:148 #, tcl-format -msgid "Invalid date from Git: %s" -msgstr "Неправилни данни от Git: %s" - -#: lib/database.tcl:42 -msgid "Number of loose objects" -msgstr "Брой непакетирани обекти" +msgid "" +"Could not add tool:\n" +"%s" +msgstr "" +"Командата не може да бъде добавена:\n" +"%s" -#: lib/database.tcl:43 -msgid "Disk space used by loose objects" -msgstr "Дисково пространство заето от непакетирани обекти" +#: lib/tools_dlg.tcl:187 +#, tcl-format +msgid "%s (%s): Remove Tool" +msgstr "%s (%s): Премахване на команда" -#: lib/database.tcl:44 -msgid "Number of packed objects" -msgstr "Брой пакетирани обекти" +#: lib/tools_dlg.tcl:193 +msgid "Remove Tool Commands" +msgstr "Премахване на команди" -#: lib/database.tcl:45 -msgid "Number of packs" -msgstr "Брой пакети" +#: lib/tools_dlg.tcl:198 +msgid "Remove" +msgstr "Премахване" -#: lib/database.tcl:46 -msgid "Disk space used by packed objects" -msgstr "Дисково пространство заето от пакетирани обекти" +#: lib/tools_dlg.tcl:231 +msgid "(Blue denotes repository-local tools)" +msgstr "(командите към локалното хранилище са обозначени в синьо)" -#: lib/database.tcl:47 -msgid "Packed objects waiting for pruning" -msgstr "Пакетирани обекти за окастряне" +#: lib/tools_dlg.tcl:283 +#, tcl-format +msgid "%s (%s):" +msgstr "%s (%s):" -#: lib/database.tcl:48 -msgid "Garbage files" -msgstr "Файлове за боклука" +#: lib/tools_dlg.tcl:292 +#, tcl-format +msgid "Run Command: %s" +msgstr "Изпълнение на командата „%s“" -#: lib/database.tcl:72 -msgid "Compressing the object database" -msgstr "Компресиране на базата с данни за обектите" +#: lib/tools_dlg.tcl:306 +msgid "Arguments" +msgstr "Аргументи" -#: lib/database.tcl:83 -msgid "Verifying the object database with fsck-objects" -msgstr "Проверка на базата с данни за обектите с програмата „fsck-objects“" +#: lib/tools_dlg.tcl:341 +msgid "OK" +msgstr "Добре" -#: lib/database.tcl:107 +#: lib/transport.tcl:7 #, 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" -"Да се започне ли компресирането?" +msgid "Fetching new changes from %s" +msgstr "Доставяне на промените от „%s“" -#: lib/error.tcl:20 lib/error.tcl:116 -msgid "error" -msgstr "грешка" +#: lib/transport.tcl:18 +#, tcl-format +msgid "remote prune %s" +msgstr "окастряне на следящите клони към „%s“" -#: lib/error.tcl:36 -msgid "warning" -msgstr "предупреждение" +#: lib/transport.tcl:19 +#, tcl-format +msgid "Pruning tracking branches deleted from %s" +msgstr "Окастряне на следящите клони на изтритите клони от „%s“" -#: lib/error.tcl:96 -msgid "You must correct the above errors before committing." -msgstr "Преди да можете да подадете, коригирайте горните грешки." +#: lib/transport.tcl:25 +msgid "fetch all remotes" +msgstr "доставяне от всички отдалечени" -#: lib/merge.tcl:13 -msgid "" -"Cannot merge while amending.\n" -"\n" -"You must finish amending this commit before starting any type of merge.\n" -msgstr "" -"По време на поправяне не може да сливане.\n" -"\n" -"Трябва да завършите поправянето на текущото подаване, преди да започнете " -"сливане.\n" +#: lib/transport.tcl:26 +msgid "Fetching new changes from all remotes" +msgstr "Доставяне на промените от всички отдалечени хранилища" -#: lib/merge.tcl:27 -msgid "" -"Last scanned state does not match repository state.\n" -"\n" -"Another Git program has modified this repository since the last scan. A " -"rescan must be performed before a merge can be performed.\n" -"\n" -"The rescan will be automatically started now.\n" -msgstr "" -"Последно установеното състояние не отговаря на това в хранилището.\n" -"\n" -"Някой друг процес за Git е променил хранилището междувременно. Състоянието " -"трябва да бъде проверено, преди да се извърши сливане.\n" -"\n" -"Автоматично ще започне нова проверка.\n" -"\n" +#: lib/transport.tcl:40 +msgid "remote prune all remotes" +msgstr "окастряне на следящите изтрити" -#: lib/merge.tcl:45 -#, tcl-format -msgid "" -"You are in the middle of a conflicted merge.\n" -"\n" -"File %s has merge conflicts.\n" -"\n" -"You must resolve them, stage the file, and commit to complete the current " -"merge. Only then can you begin another merge.\n" +#: lib/transport.tcl:41 +msgid "Pruning tracking branches deleted from all remotes" msgstr "" -"В момента тече сливане, но има конфликти.\n" -"\n" -"Погледнете файла „%s“.\n" -"\n" -"Трябва да коригирате конфликтите в него, да го добавите към индекса и да " -"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново " -"сливане.\n" +"Окастряне на следящите клони на изтритите клони от всички отдалечени " +"хранилища" -#: lib/merge.tcl:55 +#: lib/transport.tcl:55 #, tcl-format -msgid "" -"You are in the middle of a change.\n" -"\n" -"File %s is modified.\n" -"\n" -"You should complete the current commit before starting a merge. Doing so " -"will help you abort a failed merge, should the need arise.\n" -msgstr "" -"В момента тече подаване.\n" -"\n" -"Файлът „%s“ е променен.\n" -"\n" -"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще " -"можете лесно да преустановите сливането, ако възникне нужда.\n" +msgid "Pushing changes to %s" +msgstr "Изтласкване на промените към „%s“" -#: lib/merge.tcl:108 +#: lib/transport.tcl:93 #, tcl-format -msgid "%s of %s" -msgstr "%s от общо %s" +msgid "Mirroring to %s" +msgstr "Изтласкване на всичко към „%s“" -#: lib/merge.tcl:122 +#: lib/transport.tcl:111 #, tcl-format -msgid "Merging %s and %s..." -msgstr "Сливане на „%s“ и „%s“…" - -#: lib/merge.tcl:133 -msgid "Merge completed successfully." -msgstr "Сливането завърши успешно." - -#: lib/merge.tcl:135 -msgid "Merge failed. Conflict resolution is required." -msgstr "Неуспешно сливане — има конфликти за коригиране." +msgid "Pushing %s %s to %s" +msgstr "Изтласкване на %s „%s“ към „%s“" -#: lib/merge.tcl:160 -#, tcl-format -msgid "Merge Into %s" -msgstr "Сливане в „%s“" +#: lib/transport.tcl:132 +msgid "Push Branches" +msgstr "Клони за изтласкване" -#: lib/merge.tcl:179 -msgid "Revision To Merge" -msgstr "Версия за сливане" +#: lib/transport.tcl:147 +msgid "Source Branches" +msgstr "Клони-източници" -#: lib/merge.tcl:214 -msgid "" -"Cannot abort while amending.\n" -"\n" -"You must finish amending this commit.\n" -msgstr "" -"Поправянето не може да бъде преустановено.\n" -"\n" -"Трябва да завършите поправката на това подаване.\n" +#: lib/transport.tcl:162 +msgid "Destination Repository" +msgstr "Целево хранилище" -#: lib/merge.tcl:224 -msgid "" -"Abort merge?\n" -"\n" -"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" -"\n" -"Continue with aborting the current merge?" -msgstr "" -"Да се преустанови ли сливането?\n" -"\n" -"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" -"\n" -"Наистина ли да се преустанови сливането?" +#: lib/transport.tcl:205 +msgid "Transfer Options" +msgstr "Настройки при пренасянето" -#: lib/merge.tcl:230 -msgid "" -"Reset changes?\n" -"\n" -"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" -"\n" -"Continue with resetting the current changes?" +#: lib/transport.tcl:207 +msgid "Force overwrite existing branch (may discard changes)" msgstr "" -"Да се занулят ли промените?\n" -"\n" -"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" -"\n" -"Наистина ли да се занулят промените?" - -#: lib/merge.tcl:241 -msgid "Aborting" -msgstr "Преустановяване" +"Изрично презаписване на съществуващ клон (някои промени може да бъдат " +"загубени)" -#: lib/merge.tcl:241 -msgid "files reset" -msgstr "файла със занулени промени" +#: lib/transport.tcl:211 +msgid "Use thin pack (for slow network connections)" +msgstr "Максимална компресия (за бавни мрежови връзки)" -#: lib/merge.tcl:269 -msgid "Abort failed." -msgstr "Неуспешно преустановяване." +#: lib/transport.tcl:215 +msgid "Include tags" +msgstr "Включване на етикетите" -#: lib/merge.tcl:271 -msgid "Abort completed. Ready." -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 , 2007. -# +# Translators: +# Dimitriy Ryazantcev , 2015-2016 +# Irina Riesen , 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 \n" -"Language-Team: Russian Translation \n" +"PO-Revision-Date: 2016-06-30 12:39+0000\n" +"Last-Translator: Dimitriy Ryazantcev \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] [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-sh-setup.sh b/git-sh-setup.sh index a8a4576342..240c7ebcd1 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -2,9 +2,6 @@ # to set up some variables pointing at the normal git directories and # a few helper shell functions. -# Source git-sh-i18n for gettext support. -. git-sh-i18n - # Having this variable in your environment would break scripts because # you would cause "cd" to be taken to unexpected places. If you # like CDPATH, define it for your interactive shell sessions without @@ -46,6 +43,9 @@ git_broken_path_fix () { # @@BROKEN_PATH_FIX@@ +# Source git-sh-i18n for gettext support. +. "$(git --exec-path)/git-sh-i18n" + die () { die_with_status 1 "$@" } diff --git a/git-stash.sh b/git-stash.sh index 90d63f293e..4546abaaef 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -384,9 +384,8 @@ parse_flags_and_rev() i_tree= u_tree= - REV=$(git rev-parse --no-flags --symbolic --sq "$@") || exit 1 - FLAGS= + REV= for opt do case "$opt" in @@ -404,6 +403,9 @@ parse_flags_and_rev() die "$(eval_gettext "unknown option: \$opt")" FLAGS="${FLAGS}${FLAGS:+ }$opt" ;; + *) + REV="${REV}${REV:+ }'$opt'" + ;; esac done @@ -422,6 +424,15 @@ parse_flags_and_rev() ;; esac + case "$1" in + *[!0-9]*) + : + ;; + *) + set -- "${ref_stash}@{$1}" + ;; + esac + REV=$(git rev-parse --symbolic --verify --quiet "$1") || { reference="$1" die "$(eval_gettext "\$reference is not a valid reference")" 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 @@ 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}; diff --git a/git.c b/git.c index ab5c99cf70..efa1059fe0 100644 --- a/git.c +++ b/git.c @@ -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 + (?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); + } } } } diff --git a/help.c b/help.c index 2ff3b5a774..53e2a67e00 100644 --- a/help.c +++ b/help.c @@ -170,8 +170,7 @@ void load_command_list(const char *prefix, if (exec_path) { list_commands_in_dir(main_cmds, exec_path, prefix); - qsort(main_cmds->names, main_cmds->cnt, - sizeof(*main_cmds->names), cmdname_compare); + QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare); uniq(main_cmds); } @@ -190,8 +189,7 @@ void load_command_list(const char *prefix, } free(paths); - qsort(other_cmds->names, other_cmds->cnt, - sizeof(*other_cmds->names), cmdname_compare); + QSORT(other_cmds->names, other_cmds->cnt, cmdname_compare); uniq(other_cmds); } exclude_cmds(other_cmds, main_cmds); @@ -238,8 +236,7 @@ void list_common_cmds_help(void) longest = strlen(common_cmds[i].name); } - qsort(common_cmds, ARRAY_SIZE(common_cmds), - sizeof(common_cmds[0]), cmd_group_cmp); + QSORT(common_cmds, ARRAY_SIZE(common_cmds), cmd_group_cmp); puts(_("These are common Git commands used in various situations:")); @@ -324,8 +321,7 @@ const char *help_unknown_cmd(const char *cmd) add_cmd_list(&main_cmds, &aliases); add_cmd_list(&main_cmds, &other_cmds); - qsort(main_cmds.names, main_cmds.cnt, - sizeof(*main_cmds.names), cmdname_compare); + QSORT(main_cmds.names, main_cmds.cnt, cmdname_compare); uniq(&main_cmds); /* This abuses cmdname->len for levenshtein distance */ @@ -359,8 +355,7 @@ const char *help_unknown_cmd(const char *cmd) levenshtein(cmd, candidate, 0, 2, 1, 3) + 1; } - qsort(main_cmds.names, main_cmds.cnt, - sizeof(*main_cmds.names), levenshtein_compare); + QSORT(main_cmds.names, main_cmds.cnt, levenshtein_compare); if (!main_cmds.cnt) die(_("Uh oh. Your system reports no Git commands at all.")); diff --git a/hex.c b/hex.c index ab2610e498..845b01a874 100644 --- a/hex.c +++ b/hex.c @@ -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; diff --git a/http.c b/http.c index 0c65639881..4c4a812fcc 100644 --- a/http.c +++ b/http.c @@ -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 0f5f4760e9..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); @@ -1410,6 +1408,7 @@ static CURL *setup_curl(struct imap_server_conf *srvc) curl_easy_setopt(curl, CURLOPT_USERNAME, server.user); curl_easy_setopt(curl, CURLOPT_PASSWORD, server.pass); + strbuf_addstr(&path, server.use_ssl ? "imaps://" : "imap://"); strbuf_addstr(&path, server.host); if (!path.len || path.buf[path.len - 1] != '/') strbuf_addch(&path, '/'); diff --git a/line-log.c b/line-log.c index 916e724870..65f3558b3b 100644 --- a/line-log.c +++ b/line-log.c @@ -113,7 +113,7 @@ void sort_and_merge_range_set(struct range_set *rs) int i; int o = 0; /* output cursor */ - qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp); + QSORT(rs->ranges, rs->nr, range_cmp); for (i = 0; i < rs->nr; i++) { if (rs->ranges[i].start == rs->ranges[i].end) diff --git a/mailmap.c b/mailmap.c index b5c521fdea..c1a79c100c 100644 --- a/mailmap.c +++ b/mailmap.c @@ -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/object.h b/object.h index f8b644263f..614a006756 100644 --- a/object.h +++ b/object.h @@ -31,7 +31,7 @@ struct object_array { * revision.h: 0---------10 26 * fetch-pack.c: 0---4 * walker.c: 0-2 - * upload-pack.c: 11----------------19 + * upload-pack.c: 4 11----------------19 * builtin/blame.c: 12-13 * bisect.c: 16 * bundle.c: 16 diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c index c30bcd06cb..9705596014 100644 --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@ -385,8 +385,7 @@ void bitmap_writer_select_commits(struct commit **indexed_commits, { unsigned int i = 0, j, next; - qsort(indexed_commits, indexed_commits_nr, sizeof(indexed_commits[0]), - date_compare); + QSORT(indexed_commits, indexed_commits_nr, date_compare); if (writer.show_progress) writer.progress = start_progress("Selecting bitmap commits", 0); 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/pack-check.c b/pack-check.c index c5c7763323..27f70d345f 100644 --- a/pack-check.c +++ b/pack-check.c @@ -96,7 +96,7 @@ static int verify_packfile(struct packed_git *p, entries[i].offset = nth_packed_object_offset(p, i); entries[i].nr = i; } - qsort(entries, nr_objects, sizeof(*entries), compare_entries); + QSORT(entries, nr_objects, compare_entries); for (i = 0; i < nr_objects; i++) { void *data; diff --git a/pack-objects.h b/pack-objects.h index d1b98b30ff..cc9b9a9b90 100644 --- a/pack-objects.h +++ b/pack-objects.h @@ -27,6 +27,15 @@ struct object_entry { unsigned no_try_delta:1; unsigned tagged:1; /* near the very tip of refs */ unsigned filled:1; /* assigned write-order */ + + /* + * State flags for depth-first search used for analyzing delta cycles. + */ + enum { + DFS_NONE = 0, + DFS_ACTIVE, + DFS_DONE + } dfs_state; }; struct packing_data { diff --git a/pack-write.c b/pack-write.c index ea0b788130..88bc7f9f7d 100644 --- a/pack-write.c +++ b/pack-write.c @@ -61,8 +61,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec if (objects[i]->offset > last_obj_offset) last_obj_offset = objects[i]->offset; } - qsort(sorted_by_sha, nr_objects, sizeof(sorted_by_sha[0]), - sha1_compare); + QSORT(sorted_by_sha, nr_objects, sha1_compare); } else sorted_by_sha = list = last = NULL; 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); diff --git a/path.c b/path.c index a8e72955f6..52d889c88e 100644 --- a/path.c +++ b/path.c @@ -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 49a53607bb..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); @@ -446,8 +453,7 @@ void parse_pathspec(struct pathspec *pathspec, if (pathspec->magic & PATHSPEC_MAXDEPTH) { if (flags & PATHSPEC_KEEP_ORDER) die("BUG: PATHSPEC_MAXDEPTH_VALID and PATHSPEC_KEEP_ORDER are incompatible"); - qsort(pathspec->items, pathspec->nr, - sizeof(struct pathspec_item), pathspec_item_cmp); + QSORT(pathspec->items, pathspec->nr, pathspec_item_cmp); } } 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 @@ =head1 SYNOPSIS 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 @@ sub ident_person { =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 @@ package Git::SVN::Editor; 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 @@ package Git::SVN::Fetcher; 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 @@ package Git::SVN::Migration; 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 <> 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 diff --git a/po/de.po b/po/de.po index d50cb1b608..0755cdf6cd 100644 --- a/po/de.po +++ b/po/de.po @@ -1,13 +1,13 @@ # German translations for Git. -# Copyright (C) 2010-2015 Ralf Thielow +# Copyright (C) 2010-2016 Ralf Thielow # This file is distributed under the same license as the Git package. -# Ralf Thielow , 2010-2015. +# Ralf Thielow , 2010-2016. # msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List \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 \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 '\n" "as appropriate to mark resolution and make a commit." @@ -31,18 +56,52 @@ msgstr "" "dann 'git add/rm ', 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 \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 \n" +"\n" + #: archive.c:12 msgid "git archive [] [...]" msgstr "git archive [] [...]" @@ -62,7 +121,7 @@ msgstr "" msgid "git archive --remote [--exec ] --list" msgstr "git archive --remote [--exec ] --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 " msgstr "Archiv vom Remote-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 " 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 ' oder 'git rm '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:724 +#: 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: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 -- ...' to specify paths that do not exist locally." +msgstr "" +"%s: kein solcher Pfad im Arbeitsverzeichnis.\n" +"Benutzen Sie 'git -- ...' 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 [...] -- [...]'" +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 [...] -- [...]'" + +#: setup.c:223 +#, c-format +msgid "" +"ambiguous argument '%s': both revision and filename\n" +"Use '--' to separate paths from revisions, like this:\n" +"'git [...] -- [...]'" +msgstr "" +"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n" +"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n" +"'git [...] -- [...]'" -#: 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 ...\" to mark resolution)" msgstr "" " (benutzen Sie \"git add/rm ...\", 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 [] [--] ..." 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 [] [(|)...]" msgstr "git am [] [(|)...]" -#: builtin/am.c:2239 +#: builtin/am.c:2226 msgid "git am [] (--continue | --skip | --abort)" msgstr "git am [] (--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 [] [...]" msgstr "git apply [] [...]" -#: 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 -msgid "don't apply changes matching the given path" -msgstr "keine Änderungen im angegebenen Pfad anwenden" +#: 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 leading slashes from traditional diff paths" msgstr "" " 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 lines of context match" msgstr "" "sicher stellen, dass mindestens 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 to all filenames" msgstr " 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 [] [] [] [--] " msgid " are documented in git-rev-list(1)" msgstr " 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 instead of calling git-rev-list" msgstr "Commits von benutzen, anstatt \"git-rev-list\" aufzurufen" -#: builtin/blame.c:2549 +#: builtin/blame.c:2554 msgid "Use 's contents as the final image" msgstr "Inhalte der 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|" "|--textconv) " @@ -4351,60 +4741,60 @@ msgstr "" "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|" "|--textconv) " -#: 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 " can be one of: blob, tree, commit, tag" msgstr " 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 %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 '" msgstr "second guess 'git checkout '" -#: 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 [] [--] []" 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 " 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 ' and matches no existing author" msgstr "" "--author '%s' ist nicht im Format 'Name ' 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 []" msgstr "git config []" -#: 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 [] [ [...]]" msgstr "git fetch [] [ [...]]" -#: builtin/fetch.c:21 +#: builtin/fetch.c:22 msgid "git fetch [] " msgstr "git fetch [] " -#: builtin/fetch.c:22 +#: builtin/fetch.c:23 msgid "git fetch --multiple [] [( | )...]" msgstr "git fetch --multiple [] [( | )...]" -#: builtin/fetch.c:23 +#: builtin/fetch.c:24 msgid "git fetch --all []" msgstr "git fetch --all []" -#: 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 [] [...]" msgstr "git fsck [] [...]" -#: 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 % unsupported" msgstr "Paketversion % 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 %: %s" +msgstr "Paket hat ein ungültiges Objekt bei Versatz %: %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, % byte missing" +msgid_plural "premature end of pack file, % bytes missing" +msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse % Byte" +msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse % 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=%" msgstr "\"pack.indexversion=%\" 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=] [--" "shared[=]] []" @@ -7692,25 +8074,25 @@ msgstr "" "git init [-q | --quiet] [--bare] [--template=] [--" "shared[=]] []" -#: 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=) not allowed without specifying %s (or --git-" @@ -7719,7 +8101,7 @@ msgstr "" "%s (oder --work-tree=) nicht erlaubt ohne Spezifizierung von %s " "(oder --git-dir=)" -#: 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 [] [] [[--] ...]" msgstr "git log [] [] [[--] ...]" -#: builtin/log.c:44 +#: builtin/log.c:45 msgid "git show [] ..." msgstr "git show [] ..." -#: 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 [] [ | ]" msgstr "git format-patch [] [ | ]" -#: 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=' 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 instead of '.patch'" msgstr " anstatt '.patch' verwenden" -#: builtin/log.c:1392 +#: builtin/log.c:1419 msgid "start numbering patches at instead of 1" msgstr "die Nummerierung der Patches bei 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 [] instead of [PATCH]" msgstr "[] anstatt [PATCH] verwenden" -#: builtin/log.c:1399 +#: builtin/log.c:1426 msgid "store resulting files in " msgstr "erzeugte Dateien in 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 (or committer ident if absent)" msgstr "" "\"From\"-Adresse auf 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 " msgstr "aus erster E-Mail eine Antwort zu 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] [ [ []]]" msgstr "git cherry [-v] [ [ []]]" -#: builtin/log.c:1846 +#: builtin/log.c:1872 #, c-format msgid "" "Could not find a tracked remote branch, please specify manually.\n" @@ -8084,104 +8466,104 @@ msgstr "" "Konnte gefolgten Remote-Branch nicht finden, bitte geben Sie " "manuell an.\n" -#: builtin/ls-files.c:378 +#: builtin/ls-files.c:379 msgid "git ls-files [] [...]" msgstr "git ls-files [] [...]" -#: 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 " msgstr "Muster, gelesen von , ausschließen" -#: builtin/ls-files.c:463 +#: builtin/ls-files.c:464 msgid "read additional per-directory exclude patterns in " msgstr "zusätzliche pro-Verzeichnis Auschlussmuster aus 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 is not in the index, treat this as an error" msgstr "als Fehler behandeln, wenn sich eine 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 are still present" msgstr "" "vorgeben, dass Pfade, die seit 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 [] [...]" msgstr "git merge [] [...]" -#: builtin/merge.c:46 +#: builtin/merge.c:47 msgid "git merge [] HEAD " msgstr "git merge [] HEAD " -#: 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 ) entries from shortlog to merge commit message" msgstr "" "(höchstens ) 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 []" 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 (implies --stdin)" msgstr "" "Konfiguration für 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 " msgstr "Notizen von 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 [...] [< | < " "]" -#: 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