summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Documentation/Makefile10
-rw-r--r--Documentation/RelNotes/1.8.5.4.txt48
-rw-r--r--Documentation/RelNotes/1.8.5.5.txt37
-rw-r--r--Documentation/RelNotes/1.9.0.txt (renamed from Documentation/RelNotes/1.9.txt)97
-rw-r--r--Documentation/config.txt18
-rw-r--r--Documentation/git-am.txt6
-rw-r--r--Documentation/git-blame.txt3
-rw-r--r--Documentation/git-checkout.txt4
-rw-r--r--Documentation/git-cherry-pick.txt7
-rw-r--r--Documentation/git-clone.txt13
-rw-r--r--Documentation/git-column.txt5
-rw-r--r--Documentation/git-commit-tree.txt5
-rw-r--r--Documentation/git-commit.txt4
-rw-r--r--Documentation/git-diff.txt2
-rw-r--r--Documentation/git-for-each-ref.txt10
-rw-r--r--Documentation/git-http-backend.txt8
-rw-r--r--Documentation/git-notes.txt10
-rw-r--r--Documentation/git-p4.txt6
-rw-r--r--Documentation/git-pull.txt4
-rw-r--r--Documentation/git-rebase.txt4
-rw-r--r--Documentation/git-remote-ext.txt5
-rw-r--r--Documentation/git-remote-fd.txt4
-rw-r--r--Documentation/git-remote.txt2
-rw-r--r--Documentation/git-reset.txt5
-rw-r--r--Documentation/git-revert.txt6
-rw-r--r--Documentation/git-show-ref.txt1
-rw-r--r--Documentation/git-submodule.txt46
-rw-r--r--Documentation/git-tag.txt5
-rw-r--r--Documentation/git.txt9
-rw-r--r--Documentation/gitattributes.txt9
-rw-r--r--Documentation/gitcli.txt2
-rw-r--r--Documentation/githooks.txt2
-rw-r--r--Documentation/gitignore.txt2
-rw-r--r--Documentation/gitk.txt16
-rw-r--r--Documentation/gitmodules.txt4
-rw-r--r--Documentation/gitweb.conf.txt4
-rw-r--r--Documentation/howto/maintain-git.txt18
-rw-r--r--Documentation/merge-options.txt9
-rw-r--r--Documentation/merge-strategies.txt2
-rw-r--r--Documentation/revisions.txt2
-rw-r--r--Documentation/technical/api-hash.txt52
-rw-r--r--Documentation/technical/api-hashmap.txt235
-rw-r--r--Documentation/technical/http-protocol.txt225
-rw-r--r--Documentation/user-manual.txt2
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile11
l---------RelNotes2
-rw-r--r--bisect.c2
-rw-r--r--builtin/add.c3
-rw-r--r--builtin/apply.c12
-rw-r--r--builtin/blame.c6
-rw-r--r--builtin/checkout.c3
-rw-r--r--builtin/clean.c27
-rw-r--r--builtin/commit-tree.c12
-rw-r--r--builtin/commit.c17
-rw-r--r--builtin/describe.c53
-rw-r--r--builtin/fetch.c2
-rw-r--r--builtin/gc.c5
-rw-r--r--builtin/grep.c6
-rw-r--r--builtin/init-db.c9
-rw-r--r--builtin/ls-files.c9
-rw-r--r--builtin/ls-tree.c2
-rw-r--r--builtin/merge.c5
-rw-r--r--builtin/repack.c28
-rw-r--r--builtin/reset.c40
-rw-r--r--builtin/rev-parse.c17
-rw-r--r--builtin/revert.c2
-rw-r--r--builtin/rm.c4
-rw-r--r--builtin/update-index.c42
-rw-r--r--cache.h63
-rw-r--r--compat/mingw.c17
-rw-r--r--compat/mingw.h3
-rw-r--r--config.c6
-rw-r--r--contrib/completion/git-completion.bash8
-rwxr-xr-xcontrib/git-resurrect.sh1
-rwxr-xr-xcontrib/subtree/git-subtree.sh22
-rw-r--r--contrib/subtree/git-subtree.txt14
-rw-r--r--diff-lib.c5
-rw-r--r--diff.c71
-rw-r--r--diffcore-rename.c185
-rw-r--r--diffcore.h10
-rw-r--r--dir.c67
-rw-r--r--dir.h24
-rw-r--r--fetch-pack.c2
-rwxr-xr-xgit-am.sh26
-rw-r--r--git-compat-util.h6
-rwxr-xr-xgit-gui/GIT-VERSION-GEN2
-rwxr-xr-xgit-gui/git-gui.sh32
-rw-r--r--git-gui/po/bg.po2694
-rw-r--r--git-gui/po/glossary/bg.po287
-rw-r--r--git-gui/po/glossary/git-gui-glossary.txt29
-rwxr-xr-x[-rw-r--r--]git-gui/po/po2msg.sh0
-rwxr-xr-x[-rw-r--r--]git-gui/windows/git-gui.sh0
-rwxr-xr-xgit-instaweb.sh1
-rwxr-xr-xgit-p4.py17
-rwxr-xr-xgit-pull.sh30
-rwxr-xr-xgit-quiltimport.sh1
-rw-r--r--git-rebase--am.sh8
-rw-r--r--git-rebase--interactive.sh39
-rw-r--r--git-rebase--merge.sh2
-rwxr-xr-xgit-rebase.sh62
-rwxr-xr-xgit-request-pull.sh1
-rwxr-xr-xgit-send-email.perl3
-rw-r--r--git-sh-setup.sh2
-rwxr-xr-xgit-submodule.sh89
-rw-r--r--git.rc4
-rwxr-xr-xgitk-git/gitk73
-rw-r--r--gitk-git/po/bg.po1334
-rwxr-xr-x[-rw-r--r--]gitk-git/po/po2msg.sh0
-rw-r--r--hash.c110
-rw-r--r--hash.h50
-rw-r--r--hashmap.c228
-rw-r--r--hashmap.h71
-rw-r--r--line-log.c26
-rw-r--r--list-objects.c20
-rw-r--r--merge-recursive.c6
-rw-r--r--name-hash.c163
-rw-r--r--path.c2
-rw-r--r--pathspec.c2
-rw-r--r--perl/Git/SVN.pm41
-rw-r--r--po/TEAMS10
-rw-r--r--po/bg.po10404
-rw-r--r--po/da.po3503
-rw-r--r--po/de.po1810
-rw-r--r--po/fr.po1819
-rw-r--r--po/git.pot1719
-rw-r--r--po/nl.po3493
-rw-r--r--po/sv.po1774
-rw-r--r--po/vi.po2482
-rw-r--r--po/zh_CN.po1856
-rw-r--r--preload-index.c3
-rw-r--r--read-cache.c49
-rw-r--r--refs.c98
-rw-r--r--remote.c8
-rw-r--r--rerere.c4
-rw-r--r--resolve-undo.c9
-rw-r--r--revision.c43
-rw-r--r--sequencer.c11
-rw-r--r--sequencer.h2
-rw-r--r--setup.c94
-rw-r--r--sha1_file.c71
-rw-r--r--sha1_name.c117
-rw-r--r--streaming.c2
-rw-r--r--submodule.c25
-rw-r--r--t/lib-git-daemon.sh2
-rw-r--r--t/lib-git-p4.sh23
-rw-r--r--t/lib-httpd.sh2
-rwxr-xr-xt/perf/p0001-rev-list.sh12
-rwxr-xr-xt/t0011-hashmap.sh240
-rwxr-xr-xt/t0060-path-utils.sh21
-rwxr-xr-xt/t1507-rev-parse-upstream.sh37
-rwxr-xr-xt/t1508-at-combinations.sh15
-rwxr-xr-xt/t3004-ls-files-basic.sh17
-rwxr-xr-xt/t3030-merge-recursive.sh47
-rwxr-xr-xt/t4010-diff-pathspec.sh36
-rw-r--r--t/t4034/ada/expect2
-rwxr-xr-xt/t4035-diff-quiet.sh6
-rwxr-xr-xt/t5510-fetch.sh11
-rwxr-xr-xt/t5537-fetch-shallow.sh1
-rwxr-xr-xt/t5538-push-shallow.sh1
-rwxr-xr-xt/t5540-http-push.sh1
-rwxr-xr-xt/t5541-http-push.sh1
-rwxr-xr-xt/t5550-http-fetch.sh1
-rwxr-xr-xt/t5551-http-fetch.sh1
-rwxr-xr-xt/t5561-http-backend.sh1
-rwxr-xr-xt/t5570-git-daemon.sh1
-rwxr-xr-xt/t6000-rev-list-misc.sh17
-rwxr-xr-xt/t6131-pathspec-icase.sh6
-rwxr-xr-xt/t7006-pager.sh2
-rwxr-xr-xt/t7101-reset-empty-subdirs.sh (renamed from t/t7101-reset.sh)0
-rwxr-xr-xt/t7102-reset.sh15
-rwxr-xr-xt/t7104-reset-hard.sh (renamed from t/t7104-reset.sh)0
-rwxr-xr-xt/t7406-submodule-update.sh38
-rwxr-xr-xt/t7501-commit.sh1
-rwxr-xr-xt/t7510-signed-commit.sh25
-rwxr-xr-xt/t7601-merge-pull-config.sh21
-rwxr-xr-xt/t7700-repack.sh2
-rwxr-xr-xt/t9802-git-p4-filetype.sh83
-rwxr-xr-xt/t9805-git-p4-skip-submit-edit.sh6
-rwxr-xr-xt/t9807-git-p4-submit.sh2
-rwxr-xr-xt/t9809-git-p4-client-view.sh16
-rwxr-xr-xt/t9812-git-p4-wildcards.sh50
-rwxr-xr-xt/t9813-git-p4-preserve-users.sh38
-rwxr-xr-xt/t9816-git-p4-locked.sh145
-rw-r--r--test-hashmap.c255
-rw-r--r--transport-helper.c5
-rw-r--r--tree-diff.c27
-rw-r--r--tree-walk.c6
-rw-r--r--tree-walk.h2
-rw-r--r--unpack-trees.c3
-rw-r--r--userdiff.c4
-rw-r--r--wt-status.c6
193 files changed, 24107 insertions, 13802 deletions
diff --git a/.gitignore b/.gitignore
index b5f9def..dc600f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -182,6 +182,7 @@
/test-dump-cache-tree
/test-scrap-cache-tree
/test-genrandom
+/test-hashmap
/test-index-version
/test-line-buffer
/test-match-trees
diff --git a/Documentation/Makefile b/Documentation/Makefile
index 36c58fc..fc6b2cf 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -2,6 +2,9 @@
MAN1_TXT =
MAN5_TXT =
MAN7_TXT =
+TECH_DOCS =
+ARTICLES =
+SP_ARTICLES =
MAN1_TXT += $(filter-out \
$(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
@@ -37,12 +40,12 @@ MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
OBSOLETE_HTML = git-remote-helpers.html
DOC_HTML = $(MAN_HTML) $(OBSOLETE_HTML)
-ARTICLES = howto-index
+ARTICLES += howto-index
ARTICLES += everyday
ARTICLES += git-tools
ARTICLES += git-bisect-lk2009
# with their own formatting rules.
-SP_ARTICLES = user-manual
+SP_ARTICLES += user-manual
SP_ARTICLES += howto/new-command
SP_ARTICLES += howto/revert-branch-rebase
SP_ARTICLES += howto/using-merge-subtree
@@ -60,7 +63,8 @@ SP_ARTICLES += howto/maintain-git
API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
SP_ARTICLES += $(API_DOCS)
-TECH_DOCS = technical/index-format
+TECH_DOCS += technical/http-protocol
+TECH_DOCS += technical/index-format
TECH_DOCS += technical/pack-format
TECH_DOCS += technical/pack-heuristics
TECH_DOCS += technical/pack-protocol
diff --git a/Documentation/RelNotes/1.8.5.4.txt b/Documentation/RelNotes/1.8.5.4.txt
new file mode 100644
index 0000000..d18c403
--- /dev/null
+++ b/Documentation/RelNotes/1.8.5.4.txt
@@ -0,0 +1,48 @@
+Git v1.8.5.4 Release Notes
+==========================
+
+Fixes since v1.8.5.3
+--------------------
+
+ * "git fetch --depth=0" was a no-op, and was silently ignored.
+ Diagnose it as an error.
+
+ * Remote repository URL expressed in scp-style host:path notation are
+ parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks
+ to connect to user's home directory on host at address ::1.
+
+ * SSL-related options were not passed correctly to underlying socket
+ layer in "git send-email".
+
+ * "git commit -v" appends the patch to the log message before
+ editing, and then removes the patch when the editor returned
+ control. However, the patch was not stripped correctly when the
+ first modified path was a submodule.
+
+ * "git mv A B/", when B does not exist as a directory, should error
+ out, but it didn't.
+
+ * When we figure out how many file descriptors to allocate for
+ keeping packfiles open, a system with non-working getrlimit() could
+ cause us to die(), but because we make this call only to get a
+ rough estimate of how many is available and we do not even attempt
+ to use up all file descriptors available ourselves, it is nicer to
+ fall back to a reasonable low value rather than dying.
+
+ * "git log --decorate" did not handle a tag pointed by another tag
+ nicely.
+
+ * "git add -A" (no other arguments) in a totally empty working tree
+ used to emit an error.
+
+ * There is no reason to have a hardcoded upper limit of the number of
+ parents for an octopus merge, created via the graft mechanism, but
+ there was.
+
+ * The implementation of 'git stash $cmd "stash@{...}"' did not quote
+ the stash argument properly and left it split at IFS whitespace.
+
+ * The documentation to "git pull" hinted there is an "-m" option
+ because it incorrectly shared the documentation with "git merge".
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/1.8.5.5.txt b/Documentation/RelNotes/1.8.5.5.txt
new file mode 100644
index 0000000..9191ce9
--- /dev/null
+++ b/Documentation/RelNotes/1.8.5.5.txt
@@ -0,0 +1,37 @@
+Git v1.8.5.5 Release Notes
+==========================
+
+Fixes since v1.8.5.4
+--------------------
+
+ * The pathspec matching code, while comparing two trees (e.g. "git
+ diff A B -- path1 path2") was too aggressive and failed to match
+ some paths when multiple pathspecs were involved.
+
+ * "git repack --max-pack-size=8g" stopped being parsed correctly when
+ the command was reimplemented in C.
+
+ * A recent update to "git send-email" broke platforms where
+ /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path
+ (e.g. Fedora rawhide).
+
+ * A handful of bugs around interpreting $branch@{upstream} notation
+ and its lookalike, when $branch part has interesting characters,
+ e.g. "@", and ":", have been fixed.
+
+ * "git clone" would fail to clone from a repository that has a ref
+ directly under "refs/", e.g. "refs/stash", because different
+ validation paths do different things on such a refname. Loosen the
+ client side's validation to allow such a ref.
+
+ * "git log --left-right A...B" lost the "leftness" of commits
+ reachable from A when A is a tag as a side effect of a recent
+ bugfix. This is a regression in 1.8.4.x series.
+
+ * "git merge-base --octopus" used to leave cleaning up suboptimal
+ result to the caller, but now it does the clean-up itself.
+
+ * "git mv A B/", when B does not exist as a directory, should error
+ out, but it didn't.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/1.9.txt b/Documentation/RelNotes/1.9.0.txt
index 7bcf371..752d791 100644
--- a/Documentation/RelNotes/1.9.txt
+++ b/Documentation/RelNotes/1.9.0.txt
@@ -1,5 +1,5 @@
-Git v1.9 Release Notes
-======================
+Git v1.9.0 Release Notes
+========================
Backward compatibility notes
----------------------------
@@ -7,19 +7,19 @@ Backward compatibility notes
"git submodule foreach $cmd $args" used to treat "$cmd $args" the same
way "ssh" did, concatenating them into a single string and letting the
shell unquote. Careless users who forget to sufficiently quote $args
-gets their argument split at $IFS whitespaces by the shell, and got
+get their argument split at $IFS whitespaces by the shell, and got
unexpected results due to this. Starting from this release, the
command line is passed directly to the shell, if it has an argument.
Read-only support for experimental loose-object format, in which users
-could optionally choose to write in their loose objects for a short
-while between v1.4.3 to v1.5.3 era, has been dropped.
+could optionally choose to write their loose objects for a short
+while between v1.4.3 and v1.5.3 era, has been dropped.
-The meanings of "--tags" option to "git fetch" has changed; the
-command fetches tags _in addition to_ what are fetched by the same
+The meanings of the "--tags" option to "git fetch" has changed; the
+command fetches tags _in addition to_ what is fetched by the same
command line without the option.
-The way "git push $there $what" interprets $what part given on the
+The way "git push $there $what" interprets the $what part given on the
command line, when it does not have a colon that explicitly tells us
what ref at the $there repository is to be updated, has been enhanced.
@@ -27,8 +27,8 @@ A handful of ancient commands that have long been deprecated are
finally gone (repo-config, tar-tree, lost-found, and peek-remote).
-Backward compatibility notes (for Git 2.0)
-------------------------------------------
+Backward compatibility notes (for Git 2.0.0)
+--------------------------------------------
When "git push [$there]" does not say what to push, we have used the
traditional "matching" semantics so far (all your branches were sent
@@ -87,6 +87,8 @@ Foreign interfaces, subsystems and ports.
* The build procedure is aware of MirBSD now.
+ * Various "git p4", "git svn" and "gitk" updates.
+
UI, Workflows & Features
@@ -94,7 +96,7 @@ UI, Workflows & Features
primarily because the codepaths involved were not carefully vetted
and we did not bother supporting such usage. This release attempts
to allow object transfer out of a shallowly-cloned repository in a
- more controlled way (i.e. the receiver become a shallow repository
+ more controlled way (i.e. the receiver becomes a shallow repository
with a truncated history).
* Just like we give a reasonable default for "less" via the LESS
@@ -105,12 +107,12 @@ UI, Workflows & Features
hierarchies, whose variables are predominantly three-level, were
not completed by hitting a <TAB> in bash and zsh completions.
- * Fetching 'frotz' branch with "git fetch", while 'frotz/nitfol'
+ * Fetching a 'frotz' branch with "git fetch", while a 'frotz/nitfol'
remote-tracking branch from an earlier fetch was still there, would
error out, primarily because the command was not told that it is
allowed to lose any information on our side. "git fetch --prune"
- now can be used to remove 'frotz/nitfol' to make room to fetch and
- store 'frotz' remote-tracking branch.
+ now can be used to remove 'frotz/nitfol' to make room for fetching and
+ storing the 'frotz' remote-tracking branch.
* "diff.orderfile=<file>" configuration variable can be used to
pretend as if the "-O<file>" option were given from the command
@@ -215,6 +217,43 @@ Unless otherwise noted, all the fixes since v1.8.5 in the maintenance
track are contained in this release (see the maintenance releases' notes
for details).
+ * The pathspec matching code, while comparing two trees (e.g. "git
+ diff A B -- path1 path2") was too aggressive and failed to match
+ some paths when multiple pathspecs were involved.
+
+ * "git repack --max-pack-size=8g" stopped being parsed correctly when
+ the command was reimplemented in C.
+
+ * An earlier update in v1.8.4.x to "git rev-list --objects" with
+ negative ref had a performance regression.
+ (merge 200abe7 jk/mark-edges-uninteresting later to maint).
+
+ * A recent update to "git send-email" broke platforms where
+ /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path
+ (e.g. Fedora rawhide).
+
+ * A handful of bugs around interpreting $branch@{upstream} notation
+ and its lookalike, when $branch part has interesting characters,
+ e.g. "@", and ":", have been fixed.
+
+ * "git clone" would fail to clone from a repository that has a ref
+ directly under "refs/", e.g. "refs/stash", because different
+ validation paths do different things on such a refname. Loosen the
+ client side's validation to allow such a ref.
+
+ * "git log --left-right A...B" lost the "leftness" of commits
+ reachable from A when A is a tag as a side effect of a recent
+ bugfix. This is a regression in 1.8.4.x series.
+
+ * documentations to "git pull" hinted there is an "-m" option because
+ it incorrectly shared the documentation with "git merge".
+
+ * "git diff A B submod" and "git diff A B submod/" ought to have done
+ the same for a submodule "submod", but didn't.
+
+ * "git clone $origin foo\bar\baz" on Windows failed to create the
+ leading directories (i.e. a moral-equivalent of "mkdir -p").
+
* "submodule.*.update=checkout", when propagated from .gitmodules to
.git/config, turned into a "submodule.*.update=none", which did not
make much sense.
@@ -222,17 +261,14 @@ for details).
* The implementation of 'git stash $cmd "stash@{...}"' did not quote
the stash argument properly and left it split at IFS whitespace.
- (merge 2a07e43 ow/stash-with-ifs later to maint).
* The "--[no-]informative-errors" options to "git daemon" were parsed
a bit too loosely, allowing any other string after these option
names.
- (merge 82246b7 nd/daemon-informative-errors-typofix later to maint).
- * There is no reason to have a hardcoded upper limit of the number of
- parents for an octopus merge, created via the graft mechanism, but
+ * There is no reason to have a hardcoded upper limit for the number of
+ parents of an octopus merge, created via the graft mechanism, but
there was.
- (merge e228c17 js/lift-parent-count-limit later to maint).
* The basic test used to leave unnecessary trash directories in the
t/ directory.
@@ -240,30 +276,24 @@ for details).
* "git merge-base --octopus" used to leave cleaning up suboptimal
result to the caller, but now it does the clean-up itself.
- (merge 8f29299 bm/merge-base-octopus-dedup later to maint).
* A "gc" process running as a different user should be able to stop a
new "gc" process from starting, but it didn't.
- (merge ed7eda8 km/gc-eperm later to maint).
* An earlier "clean-up" introduced an unnecessary memory leak.
- (merge e1c1a32 jk/credential-plug-leak later to maint).
* "git add -A" (no other arguments) in a totally empty working tree
used to emit an error.
- (merge 64ed07c nd/add-empty-fix later to maint).
* "git log --decorate" did not handle a tag pointed by another tag
nicely.
- (merge 5e1361c bc/log-decoration later to maint).
* When we figure out how many file descriptors to allocate for
keeping packfiles open, a system with non-working getrlimit() could
cause us to die(), but because we make this call only to get a
- rough estimate of how many is available and we do not even attempt
- to use up all file descriptors available ourselves, it is nicer to
+ rough estimate of how many are available and we do not even attempt
+ to use up all available file descriptors ourselves, it is nicer to
fall back to a reasonable low value rather than dying.
- (merge 491a8de jh/rlimit-nofile-fallback later to maint).
* read_sha1_file(), that is the workhorse to read the contents given
an object name, honoured object replacements, but there was no
@@ -274,16 +304,13 @@ for details).
* "git cat-file --batch=", an admittedly useless command, did not
behave very well.
- (merge 6554dfa jk/cat-file-regression-fix later to maint).
* "git rev-parse <revs> -- <paths>" did not implement the usual
disambiguation rules the commands in the "git log" family used in
the same way.
- (merge 62f162f jk/rev-parse-double-dashes later to maint).
* "git mv A B/", when B does not exist as a directory, should error
out, but it didn't.
- (merge c57f628 mm/mv-file-to-no-such-dir-with-slash later to maint).
* A workaround to an old bug in glibc prior to glibc 2.17 has been
retired; this would remove a side effect of the workaround that
@@ -291,36 +318,28 @@ for details).
* SSL-related options were not passed correctly to underlying socket
layer in "git send-email".
- (merge 5508f3e tr/send-email-ssl later to maint).
* "git commit -v" appends the patch to the log message before
editing, and then removes the patch when the editor returned
control. However, the patch was not stripped correctly when the
first modified path was a submodule.
- (merge 1a72cfd jl/commit-v-strip-marker later to maint).
* "git fetch --depth=0" was a no-op, and was silently ignored.
Diagnose it as an error.
- (merge 5594bca nd/transport-positive-depth-only later to maint).
- * Remote repository URL expressed in scp-style host:path notation are
+ * Remote repository URLs expressed in scp-style host:path notation are
parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks
to connect to user's home directory on host at address ::1.
- (merge a2036d7 tb/clone-ssh-with-colon-for-port later to maint).
* "git diff -- ':(icase)makefile'" was unnecessarily rejected at the
command line parser.
- (merge 887c6c1 nd/magic-pathspec later to maint).
* "git cat-file --batch-check=ok" did not check the existence of
the named object.
- (merge 4ef8d1d sb/sha1-loose-object-info-check-existence later to maint).
* "git am --abort" sometimes complained about not being able to write
a tree with an 0{40} object in it.
- (merge 77b43ca jk/two-way-merge-corner-case-fix later to maint).
* Two processes creating loose objects at the same time could have
failed unnecessarily when the name of their new objects started
with the same byte value, due to a race condition.
- (merge b2476a6 jh/loose-object-dirs-creation-race later to maint).
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 5f4d793..7eec746 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -992,6 +992,14 @@ commit.cleanup::
have to remove the help lines that begin with `#` in the commit log
template yourself, if you do this).
+commit.gpgsign::
+
+ A boolean to specify whether all commits should be GPG signed.
+ Use of this option when doing operations such as rebase can
+ result in a large number of commits being signed. It may be
+ convenient to use an agent to avoid typing your GPG passphrase
+ several times.
+
commit.status::
A boolean to enable/disable inclusion of status information in the
commit message template when using an editor to prepare the commit
@@ -1881,6 +1889,16 @@ pretty.<name>::
Note that an alias with the same name as a built-in format
will be silently ignored.
+pull.ff::
+ By default, Git does not create an extra merge commit when merging
+ a commit that is a descendant of the current commit. Instead, the
+ tip of the current branch is fast-forwarded. When set to `false`,
+ this variable tells Git to create an extra merge commit in such
+ a case (equivalent to giving the `--no-ff` option from the command
+ line). When set to `only`, only such fast-forward merges are
+ allowed (equivalent to giving the `--ff-only` option from the
+ command line).
+
pull.rebase::
When true, rebase branches on top of the fetched branch, instead
of merging the default branch from the default remote when "git
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 54d8461..17924d0 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -14,7 +14,7 @@ SYNOPSIS
[--ignore-date] [--ignore-space-change | --ignore-whitespace]
[--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
[--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
- [--[no-]scissors]
+ [--[no-]scissors] [-S[<keyid>]]
[(<mbox> | <Maildir>)...]
'git am' (--continue | --skip | --abort)
@@ -119,6 +119,10 @@ default. You can use `--no-utf8` to override this.
Skip the current patch. This is only meaningful when
restarting an aborted patch.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
--continue::
-r::
--resolved::
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index 8e70a61..9f23a86 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -35,7 +35,8 @@ Apart from supporting file annotation, Git also supports searching the
development history for when a code snippet occurred in a change. This makes it
possible to track when a code snippet was added to a file, moved or copied
between files, and eventually deleted or replaced. It works by searching for
-a text string in the diff. A small example:
+a text string in the diff. A small example of the pickaxe interface
+that searches for `blame_usage`:
-----------------------------------------------------------------------------
$ git log --pretty=oneline -S'blame_usage'
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 91294f8..33ad2ad 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -232,8 +232,8 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
commit, your HEAD becomes "detached" and you are no longer on
any branch (see below for details).
+
-As a special case, the `"@{-N}"` syntax for the N-th last branch
-checks out the branch (instead of detaching). You may also specify
+As a special case, the `"@{-N}"` syntax for the N-th last branch/commit
+checks out branches (instead of detaching). You may also specify
`-` which is synonymous with `"@{-1}"`.
+
As a further special case, you may use `"A...B"` as a shortcut for the
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index c205d23..f1e6b2f 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -8,7 +8,8 @@ git-cherry-pick - Apply the changes introduced by some existing commits
SYNOPSIS
--------
[verse]
-'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...
+'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
+ [-S[<keyid>]] <commit>...
'git cherry-pick' --continue
'git cherry-pick' --quit
'git cherry-pick' --abort
@@ -100,6 +101,10 @@ effect to your index in a row.
--signoff::
Add Signed-off-by line at the end of the commit message.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
--ff::
If the current HEAD is the same as the parent of the
cherry-pick'ed commit, then a fast forward to this commit will
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index 4987857..0363d00 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -55,15 +55,12 @@ repository is specified as a URL, then this flag is ignored (and we
never use the local optimizations). Specifying `--no-local` will
override the default when `/path/to/repo` is given, using the regular
Git transport instead.
-+
-To force copying instead of hardlinking (which may be desirable if you
-are trying to make a back-up of your repository), but still avoid the
-usual "Git aware" transport mechanism, `--no-hardlinks` can be used.
--no-hardlinks::
- Optimize the cloning process from a repository on a
- local filesystem by copying files under `.git/objects`
- directory.
+ Force the cloning process from a repository on a local
+ filesystem to copy the files under the `.git/objects`
+ directory instead of using hardlinks. This may be desirable
+ if you are trying to make a back-up of your repository.
--shared::
-s::
@@ -208,7 +205,7 @@ objects from the source repository into a pack in the cloned repository.
--separate-git-dir=<git dir>::
Instead of placing the cloned repository where it is supposed
to be, place the cloned repository at the specified directory,
- then make a filesytem-agnostic Git symbolic link to there.
+ then make a filesystem-agnostic Git symbolic link to there.
The result is Git repository can be separated from working
tree.
diff --git a/Documentation/git-column.txt b/Documentation/git-column.txt
index 5d6f1cc..03d1846 100644
--- a/Documentation/git-column.txt
+++ b/Documentation/git-column.txt
@@ -43,11 +43,6 @@ OPTIONS
--padding=<N>::
The number of spaces between columns. One space by default.
-
-Author
-------
-Written by Nguyen Thai Ngoc Duy <pclouds@gmail.com>
-
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index cafdc96..a469eab 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -55,8 +55,13 @@ OPTIONS
from the standard input.
-S[<keyid>]::
+--gpg-sign[=<keyid>]::
GPG-sign commit.
+--no-gpg-sign::
+ Countermand `commit.gpgsign` configuration variable that is
+ set to force each and every commit to be signed.
+
Commit Information
------------------
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 1a7616c..7c42e9c 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -302,6 +302,10 @@ configuration variable documented in linkgit:git-config[1].
--gpg-sign[=<keyid>]::
GPG-sign commit.
+--no-gpg-sign::
+ Countermand `commit.gpgsign` configuration variable that is
+ set to force each and every commit to be signed.
+
\--::
Do not interpret any more arguments as options.
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt
index 33fbd8c..56fb7e5 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.txt
@@ -44,7 +44,7 @@ two blob objects, or changes between two files on disk.
commit relative to the named <commit>. Typically you
would want comparison with the latest commit, so if you
do not give <commit>, it defaults to HEAD.
- If HEAD does not exist (e.g. unborned branches) and
+ If HEAD does not exist (e.g. unborn branches) and
<commit> is not given, it shows all staged changes.
--staged is a synonym of --cached.
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 94f5c46..4240875 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -219,13 +219,9 @@ eval=`git for-each-ref --shell --format="$fmt" \
eval "$eval"
------------
-Author
-------
-Written by Junio C Hamano <gitster@pobox.com>.
-
-Documentation
--------------
-Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
+SEE ALSO
+--------
+linkgit:git-show-ref[1]
GIT
---
diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt
index e3bcdb5..e8c13f6 100644
--- a/Documentation/git-http-backend.txt
+++ b/Documentation/git-http-backend.txt
@@ -263,14 +263,6 @@ identifying information of the remote user who performed the push.
All CGI environment variables are available to each of the hooks
invoked by the 'git-receive-pack'.
-Author
-------
-Written by Shawn O. Pearce <spearce@spearce.org>.
-
-Documentation
---------------
-Documentation by Shawn O. Pearce <spearce@spearce.org>.
-
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt
index 46ef046..84bb0fe 100644
--- a/Documentation/git-notes.txt
+++ b/Documentation/git-notes.txt
@@ -375,16 +375,6 @@ does not match any refs is silently ignored.
If not set in the environment, the list of notes to copy depends
on the `notes.rewrite.<command>` and `notes.rewriteRef` settings.
-
-Author
-------
-Written by Johannes Schindelin <johannes.schindelin@gmx.de> and
-Johan Herland <johan@herland.net>
-
-Documentation
--------------
-Documentation by Johannes Schindelin and Johan Herland
-
GIT
---
Part of the linkgit:git[7] suite
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index 8cba16d..6ab5f94 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -168,7 +168,8 @@ All commands except clone accept these options.
--git-dir <dir>::
Set the 'GIT_DIR' environment variable. See linkgit:git[1].
---verbose, -v::
+-v::
+--verbose::
Provide more progress information.
Sync options
@@ -279,7 +280,8 @@ These options can be used to modify 'git p4 submit' behavior.
Export tags from Git as p4 labels. Tags found in Git are applied
to the perforce working directory.
---dry-run, -n::
+-n::
+--dry-run::
Show just what commits would be submitted to p4; do not change
state in Git or p4.
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index 6083aab..200eb22 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -99,10 +99,10 @@ must be given before the options meant for 'git fetch'.
Options related to merging
~~~~~~~~~~~~~~~~~~~~~~~~~~
-include::merge-options.txt[]
-
:git-pull: 1
+include::merge-options.txt[]
+
-r::
--rebase[=false|true|preserve]::
When true, rebase the current branch on top of the upstream
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 2889be6..2a93c64 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -281,6 +281,10 @@ which makes little sense.
specified, `-s recursive`. Note the reversal of 'ours' and
'theirs' as noted above for the `-m` option.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
-q::
--quiet::
Be quiet. Implies --no-stat.
diff --git a/Documentation/git-remote-ext.txt b/Documentation/git-remote-ext.txt
index 8cfc748..cd0bb77 100644
--- a/Documentation/git-remote-ext.txt
+++ b/Documentation/git-remote-ext.txt
@@ -116,11 +116,6 @@ begins with `ext::`. Examples:
determined by the helper using environment variables (see
above).
-Documentation
---------------
-Documentation by Ilari Liusvaara, Jonathan Nieder and the Git list
-<git@vger.kernel.org>
-
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-remote-fd.txt b/Documentation/git-remote-fd.txt
index 933c2ad..bcd3766 100644
--- a/Documentation/git-remote-fd.txt
+++ b/Documentation/git-remote-fd.txt
@@ -50,10 +50,6 @@ EXAMPLES
`git push fd::7,8/bar master`::
Same as above.
-Documentation
---------------
-Documentation by Ilari Liusvaara and the Git list <git@vger.kernel.org>
-
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 2507c8b..cb103c8 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -3,7 +3,7 @@ git-remote(1)
NAME
----
-git-remote - manage set of tracked repositories
+git-remote - Manage set of tracked repositories
SYNOPSIS
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt
index f445cb3..a077ba0 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.txt
@@ -10,7 +10,7 @@ SYNOPSIS
[verse]
'git reset' [-q] [<tree-ish>] [--] <paths>...
'git reset' (--patch | -p) [<tree-ish>] [--] [<paths>...]
-'git reset' [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
+'git reset' [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
DESCRIPTION
-----------
@@ -60,6 +60,9 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
Resets the index but not the working tree (i.e., the changed files
are preserved but not marked for commit) and reports what has not
been updated. This is the default action.
++
+If `-N` is specified, removed paths are marked as intent-to-add (see
+linkgit:git-add[1]).
--hard::
Resets the index and working tree. Any changes to tracked files in the
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
index 2de67a5..9eb83f0 100644
--- a/Documentation/git-revert.txt
+++ b/Documentation/git-revert.txt
@@ -8,7 +8,7 @@ git-revert - Revert some existing commits
SYNOPSIS
--------
[verse]
-'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] <commit>...
+'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>...
'git revert' --continue
'git revert' --quit
'git revert' --abort
@@ -80,6 +80,10 @@ more details.
This is useful when reverting more than one commits'
effect to your index in a row.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
-s::
--signoff::
Add Signed-off-by line at the end of the commit message.
diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt
index b0a309b..ffd1b03 100644
--- a/Documentation/git-show-ref.txt
+++ b/Documentation/git-show-ref.txt
@@ -175,6 +175,7 @@ FILES
SEE ALSO
--------
+linkgit:git-for-each-ref[1],
linkgit:git-ls-remote[1],
linkgit:git-update-ref[1],
linkgit:gitrepository-layout[5]
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index bfef8a0..21cb59a 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -15,8 +15,8 @@ SYNOPSIS
'git submodule' [--quiet] init [--] [<path>...]
'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
- [-f|--force] [--rebase] [--reference <repository>] [--depth <depth>]
- [--merge] [--recursive] [--] [<path>...]
+ [-f|--force] [--rebase|--merge|--checkout] [--reference <repository>]
+ [--depth <depth>] [--recursive] [--] [<path>...]
'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
[commit] [--] [<path>...]
'git submodule' [--quiet] foreach [--recursive] <command>
@@ -155,13 +155,31 @@ it contains local modifications.
update::
Update the registered submodules, i.e. clone missing submodules and
- checkout the commit specified in the index of the containing repository.
- This will make the submodules HEAD be detached unless `--rebase` or
- `--merge` is specified or the key `submodule.$name.update` is set to
- `rebase`, `merge` or `none`. `none` can be overridden by specifying
- `--checkout`. Setting the key `submodule.$name.update` to `!command`
- will cause `command` to be run. `command` can be any arbitrary shell
- command that takes a single argument, namely the sha1 to update to.
+ checkout the commit specified in the index of the containing
+ repository. The update mode defaults to `checkout`, but can be
+ configured with the `submodule.<name>.update` setting or the
+ `--rebase`, `--merge`, or `--checkout` options.
++
+For updates that clone missing submodules, checkout-mode updates will
+create submodules with detached HEADs; all other modes will create
+submodules with a local branch named after `submodule.<path>.branch`.
++
+For updates that do not clone missing submodules, the submodule's HEAD
+is only touched when the remote reference does not match the
+submodule's HEAD (for none-mode updates, the submodule is never
+touched). The remote reference is usually the gitlinked commit from
+the superproject's tree, but with `--remote` it is the upstream
+subproject's `submodule.<name>.branch`. This remote reference is
+integrated with the submodule's HEAD using the specified update mode.
+For checkout-mode updates, that will result in a detached HEAD. For
+rebase- and merge-mode updates, the commit referenced by the
+submodule's HEAD may change, but the symbolic reference will remain
+unchanged (i.e. checked-out branches will still be checked-out
+branches, and detached HEADs will still be detached HEADs). If none
+of the builtin modes fit your needs, set `submodule.<name>.update` to
+`!command` to configure a custom integration command. `command` can
+be any arbitrary shell command that takes a single argument, namely
+the sha1 to update to.
+
If the submodule is not yet initialized, and you just want to use the
setting as stored in .gitmodules, you can automatically initialize the
@@ -281,6 +299,16 @@ In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. If you don't want to fetch, you should use `submodule update
--remote --no-fetch`.
++
+Use this option to integrate changes from the upstream subproject with
+your submodule's current HEAD. Alternatively, you can run `git pull`
+from the submodule, which is equivalent except for the remote branch
+name: `update --remote` uses the default upstream repository and
+`submodule.<name>.branch`, while `git pull` uses the submodule's
+`branch.<name>.merge`. Prefer `submodule.<name>.branch` if you want
+to distribute the default upstream branch with the superproject and
+`branch.<name>.merge` if you want a more native feel while working in
+the submodule itself.
-N::
--no-fetch::
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index c418c44..404257d 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -103,8 +103,9 @@ OPTIONS
+
This option is only applicable when listing tags without annotation lines.
---contains <commit>::
- Only list tags which contain the specified commit.
+--contains [<commit>]::
+ Only list tags which contain the specified commit (HEAD if not
+ specified).
--points-at <object>::
Only list tags of the given object.
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 274d816..02bbc08 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,9 +43,16 @@ unreleased) version of Git, that is available from 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
-* link:v1.8.5.3/git.html[documentation for release 1.8.5.3]
+* link:v1.9.0/git.html[documentation for release 1.9.0]
* release notes for
+ link:RelNotes/1.9.0.txt[1.9.0].
+
+* link:v1.8.5.5/git.html[documentation for release 1.8.5.5]
+
+* release notes for
+ link:RelNotes/1.8.5.5.txt[1.8.5.5],
+ link:RelNotes/1.8.5.4.txt[1.8.5.4],
link:RelNotes/1.8.5.3.txt[1.8.5.3],
link:RelNotes/1.8.5.2.txt[1.8.5.2],
link:RelNotes/1.8.5.1.txt[1.8.5.1],
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index b322a26..643c1ba 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -930,9 +930,12 @@ state.
DEFINING MACRO ATTRIBUTES
-------------------------
-Custom macro attributes can be defined only in the `.gitattributes`
-file at the toplevel (i.e. not in any subdirectory). The built-in
-macro attribute "binary" is equivalent to:
+Custom macro attributes can be defined only in top-level gitattributes
+files (`$GIT_DIR/info/attributes`, the `.gitattributes` file at the
+top level of the working tree, or the global or system-wide
+gitattributes files), not in `.gitattributes` files in working tree
+subdirectories. The built-in macro attribute "binary" is equivalent
+to:
------------
[attr]binary -diff -merge -text
diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt
index 3f33ca5..1c3e109 100644
--- a/Documentation/gitcli.txt
+++ b/Documentation/gitcli.txt
@@ -28,7 +28,7 @@ arguments. Here are the rules:
they can be disambiguated by placing `--` between them.
E.g. `git diff -- HEAD` is, "I have a file called HEAD in my work
tree. Please show changes between the version I staged in the index
- and what I have in the work tree for that file". not "show difference
+ and what I have in the work tree for that file", not "show difference
between the HEAD commit and the work tree as a whole". You can say
`git diff HEAD --` to ask for the latter.
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index d48bf4d..d954bf6 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -251,7 +251,7 @@ three parameters:
- the name of the ref being updated,
- the old object name stored in the ref,
- - and the new objectname to be stored in the ref.
+ - and the new object name to be stored in the ref.
A zero exit from the update hook allows the ref to be updated.
Exiting with a non-zero status prevents 'git-receive-pack'
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index 205e80e..b08d34d 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -7,7 +7,7 @@ gitignore - Specifies intentionally untracked files to ignore
SYNOPSIS
--------
-$GIT_DIR/info/exclude, .gitignore
+$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore
DESCRIPTION
-----------
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index d44e14c..1e9e38a 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -98,6 +98,22 @@ linkgit:git-rev-list[1] for a complete list.
(See "History simplification" in linkgit:git-log[1] for a more
detailed explanation.)
+-L<start>,<end>:<file>::
+-L:<regex>:<file>::
+
+ Trace the evolution of the line range given by "<start>,<end>"
+ (or the funcname regex <regex>) within the <file>. You may
+ not give any pathspec limiters. This is currently limited to
+ a walk starting from a single revision, i.e., you may only
+ give zero or one positive revision arguments.
+ You can specify this option more than once.
++
+*Note:* gitk (unlike linkgit:git-log[1]) currently only understands
+this option if you specify it "glued together" with its argument. Do
+*not* put a space after `-L`.
++
+include::line-range-format.txt[]
+
<revision range>::
Limit the revisions to show. This can be either a single revision
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index 347a9f7..f539e3f 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -55,6 +55,10 @@ submodule.<name>.branch::
A remote branch name for tracking updates in the upstream submodule.
If the option is not specified, it defaults to 'master'. See the
`--remote` documentation in linkgit:git-submodule[1] for details.
++
+This branch name is also used for the local branch created by
+non-checkout cloning updates. See the `update` documentation in
+linkgit:git-submodule[1] for details.
submodule.<name>.fetchRecurseSubmodules::
This option can be used to control recursive fetching of this
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index db4154f..952f503 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -630,13 +630,13 @@ need to set this element to empty list i.e. `[]`.
override::
If this field has a true value then the given feature is
- overriddable, which means that it can be configured
+ overridable, which means that it can be configured
(or enabled/disabled) on a per-repository basis.
+
Usually given "<feature>" is configurable via the `gitweb.<feature>`
config variable in the per-repository Git configuration file.
+
-*Note* that no feature is overriddable by default.
+*Note* that no feature is overridable by default.
sub::
Internal detail of implementation. What is important is that
diff --git a/Documentation/howto/maintain-git.txt b/Documentation/howto/maintain-git.txt
index 33ae69c..ca43787 100644
--- a/Documentation/howto/maintain-git.txt
+++ b/Documentation/howto/maintain-git.txt
@@ -39,26 +39,26 @@ The policy on Integration is informally mentioned in "A Note
from the maintainer" message, which is periodically posted to
this mailing list after each feature release is made.
- - Feature releases are numbered as vX.Y.Z and are meant to
+ - Feature releases are numbered as vX.Y.0 and are meant to
contain bugfixes and enhancements in any area, including
functionality, performance and usability, without regression.
- One release cycle for a feature release is expected to last for
eight to ten weeks.
- - Maintenance releases are numbered as vX.Y.Z.W and are meant
- to contain only bugfixes for the corresponding vX.Y.Z feature
- release and earlier maintenance releases vX.Y.Z.V (V < W).
+ - Maintenance releases are numbered as vX.Y.Z and are meant
+ to contain only bugfixes for the corresponding vX.Y.0 feature
+ release and earlier maintenance releases vX.Y.W (W < Z).
- 'master' branch is used to prepare for the next feature
release. In other words, at some point, the tip of 'master'
- branch is tagged with vX.Y.Z.
+ branch is tagged with vX.Y.0.
- 'maint' branch is used to prepare for the next maintenance
- release. After the feature release vX.Y.Z is made, the tip
+ release. After the feature release vX.Y.0 is made, the tip
of 'maint' branch is set to that release, and bugfixes will
accumulate on the branch, and at some point, the tip of the
- branch is tagged with vX.Y.Z.1, vX.Y.Z.2, and so on.
+ branch is tagged with vX.Y.1, vX.Y.2, and so on.
- 'next' branch is used to publish changes (both enhancements
and fixes) that (1) have worthwhile goal, (2) are in a fairly
@@ -86,6 +86,10 @@ this mailing list after each feature release is made.
users are encouraged to test it so that regressions and bugs
are found before new topics are merged to 'master'.
+Note that before v1.9.0 release, the version numbers used to be
+structured slightly differently. vX.Y.Z were feature releases while
+vX.Y.Z.W were maintenance releases for vX.Y.Z.
+
A Typical Git Day
-----------------
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index afba8d4..e134315 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -14,9 +14,12 @@ inspect and further tweak the merge result before committing.
further edit the auto-generated merge message, so that the user
can explain and justify the merge. The `--no-edit` option can be
used to accept the auto-generated message (this is generally
- discouraged). The `--edit` (or `-e`) option is still useful if you are
- giving a draft message with the `-m` option from the command line
- and want to edit it in the editor.
+ discouraged).
+ifndef::git-pull[]
+The `--edit` (or `-e`) option is still useful if you are
+giving a draft message with the `-m` option from the command line
+and want to edit it in the editor.
+endif::git-pull[]
+
Older scripts may depend on the historical behaviour of not allowing the
user to edit the merge log message. They will see an editor opened when
diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt
index fb6e593..3509498 100644
--- a/Documentation/merge-strategies.txt
+++ b/Documentation/merge-strategies.txt
@@ -20,7 +20,7 @@ recursive::
merged tree of the common ancestors and uses that as
the reference tree for the 3-way merge. This has been
reported to result in fewer merge conflicts without
- causing mis-merges by tests done on actual merge commits
+ causing mismerges by tests done on actual merge commits
taken from Linux 2.6 kernel development history.
Additionally this can detect and handle merges involving
renames. This is the default merge strategy when
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 2c06ed3..5a286d0 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -88,7 +88,7 @@ some output processing may assume ref names in UTF-8.
branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'.
'@\{-<n>\}', e.g. '@\{-1\}'::
- The construct '@\{-<n>\}' means the <n>th branch checked out
+ The construct '@\{-<n>\}' means the <n>th branch/commit checked out
before the current one.
'<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}'::
diff --git a/Documentation/technical/api-hash.txt b/Documentation/technical/api-hash.txt
deleted file mode 100644
index e5061e0..0000000
--- a/Documentation/technical/api-hash.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-hash API
-========
-
-The hash API is a collection of simple hash table functions. Users are expected
-to implement their own hashing.
-
-Data Structures
----------------
-
-`struct hash_table`::
-
- The hash table structure. The `array` member points to the hash table
- entries. The `size` member counts the total number of valid and invalid
- entries in the table. The `nr` member keeps track of the number of
- valid entries.
-
-`struct hash_table_entry`::
-
- An opaque structure representing an entry in the hash table. The `hash`
- member is the entry's hash key and the `ptr` member is the entry's
- value.
-
-Functions
----------
-
-`init_hash`::
-
- Initialize the hash table.
-
-`free_hash`::
-
- Release memory associated with the hash table.
-
-`insert_hash`::
-
- Insert a pointer into the hash table. If an entry with that hash
- already exists, a pointer to the existing entry's value is returned.
- Otherwise NULL is returned. This allows callers to implement
- chaining, etc.
-
-`lookup_hash`::
-
- Lookup an entry in the hash table. If an entry with that hash exists
- the entry's value is returned. Otherwise NULL is returned.
-
-`for_each_hash`::
-
- Call a function for each entry in the hash table. The function is
- expected to take the entry's value as its only argument and return an
- int. If the function returns a negative int the loop is aborted
- immediately. Otherwise, the return value is accumulated and the sum
- returned upon completion of the loop.
diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt
new file mode 100644
index 0000000..42ca234
--- /dev/null
+++ b/Documentation/technical/api-hashmap.txt
@@ -0,0 +1,235 @@
+hashmap API
+===========
+
+The hashmap API is a generic implementation of hash-based key-value mappings.
+
+Data Structures
+---------------
+
+`struct hashmap`::
+
+ The hash table structure.
++
+The `size` member keeps track of the total number of entries. The `cmpfn`
+member is a function used to compare two entries for equality. The `table` and
+`tablesize` members store the hash table and its size, respectively.
+
+`struct hashmap_entry`::
+
+ An opaque structure representing an entry in the hash table, which must
+ be used as first member of user data structures. Ideally it should be
+ followed by an int-sized member to prevent unused memory on 64-bit
+ systems due to alignment.
++
+The `hash` member is the entry's hash code and the `next` member points to the
+next entry in case of collisions (i.e. if multiple entries map to the same
+bucket).
+
+`struct hashmap_iter`::
+
+ An iterator structure, to be used with hashmap_iter_* functions.
+
+Types
+-----
+
+`int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key, const void *keydata)`::
+
+ User-supplied function to test two hashmap entries for equality. Shall
+ return 0 if the entries are equal.
++
+This function is always called with non-NULL `entry` / `entry_or_key`
+parameters that have the same hash code. When looking up an entry, the `key`
+and `keydata` parameters to hashmap_get and hashmap_remove are always passed
+as second and third argument, respectively. Otherwise, `keydata` is NULL.
+
+Functions
+---------
+
+`unsigned int strhash(const char *buf)`::
+`unsigned int strihash(const char *buf)`::
+`unsigned int memhash(const void *buf, size_t len)`::
+`unsigned int memihash(const void *buf, size_t len)`::
+
+ Ready-to-use hash functions for strings, using the FNV-1 algorithm (see
+ http://www.isthe.com/chongo/tech/comp/fnv).
++
+`strhash` and `strihash` take 0-terminated strings, while `memhash` and
+`memihash` operate on arbitrary-length memory.
++
+`strihash` and `memihash` are case insensitive versions.
+
+`void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function, size_t initial_size)`::
+
+ Initializes a hashmap structure.
++
+`map` is the hashmap to initialize.
++
+The `equals_function` can be specified to compare two entries for equality.
+If NULL, entries are considered equal if their hash codes are equal.
++
+If the total number of entries is known in advance, the `initial_size`
+parameter may be used to preallocate a sufficiently large table and thus
+prevent expensive resizing. If 0, the table is dynamically resized.
+
+`void hashmap_free(struct hashmap *map, int free_entries)`::
+
+ Frees a hashmap structure and allocated memory.
++
+`map` is the hashmap to free.
++
+If `free_entries` is true, each hashmap_entry in the map is freed as well
+(using stdlib's free()).
+
+`void hashmap_entry_init(void *entry, unsigned int hash)`::
+
+ Initializes a hashmap_entry structure.
++
+`entry` points to the entry to initialize.
++
+`hash` is the hash code of the entry.
+
+`void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata)`::
+
+ Returns the hashmap entry for the specified key, or NULL if not found.
++
+`map` is the hashmap structure.
++
+`key` is a hashmap_entry structure (or user data structure that starts with
+hashmap_entry) that has at least been initialized with the proper hash code
+(via `hashmap_entry_init`).
++
+If an entry with matching hash code is found, `key` and `keydata` are passed
+to `hashmap_cmp_fn` to decide whether the entry matches the key.
+
+`void *hashmap_get_next(const struct hashmap *map, const void *entry)`::
+
+ Returns the next equal hashmap entry, or NULL if not found. This can be
+ used to iterate over duplicate entries (see `hashmap_add`).
++
+`map` is the hashmap structure.
++
+`entry` is the hashmap_entry to start the search from, obtained via a previous
+call to `hashmap_get` or `hashmap_get_next`.
+
+`void hashmap_add(struct hashmap *map, void *entry)`::
+
+ Adds a hashmap entry. This allows to add duplicate entries (i.e.
+ separate values with the same key according to hashmap_cmp_fn).
++
+`map` is the hashmap structure.
++
+`entry` is the entry to add.
+
+`void *hashmap_put(struct hashmap *map, void *entry)`::
+
+ Adds or replaces a hashmap entry. If the hashmap contains duplicate
+ entries equal to the specified entry, only one of them will be replaced.
++
+`map` is the hashmap structure.
++
+`entry` is the entry to add or replace.
++
+Returns the replaced entry, or NULL if not found (i.e. the entry was added).
+
+`void *hashmap_remove(struct hashmap *map, const void *key, const void *keydata)`::
+
+ Removes a hashmap entry matching the specified key. If the hashmap
+ contains duplicate entries equal to the specified key, only one of
+ them will be removed.
++
+`map` is the hashmap structure.
++
+`key` is a hashmap_entry structure (or user data structure that starts with
+hashmap_entry) that has at least been initialized with the proper hash code
+(via `hashmap_entry_init`).
++
+If an entry with matching hash code is found, `key` and `keydata` are
+passed to `hashmap_cmp_fn` to decide whether the entry matches the key.
++
+Returns the removed entry, or NULL if not found.
+
+`void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter)`::
+`void *hashmap_iter_next(struct hashmap_iter *iter)`::
+`void *hashmap_iter_first(struct hashmap *map, struct hashmap_iter *iter)`::
+
+ Used to iterate over all entries of a hashmap.
++
+`hashmap_iter_init` initializes a `hashmap_iter` structure.
++
+`hashmap_iter_next` returns the next hashmap_entry, or NULL if there are no
+more entries.
++
+`hashmap_iter_first` is a combination of both (i.e. initializes the iterator
+and returns the first entry, if any).
+
+Usage example
+-------------
+
+Here's a simple usage example that maps long keys to double values.
+[source,c]
+------------
+struct hashmap map;
+
+struct long2double {
+ struct hashmap_entry ent; /* must be the first member! */
+ long key;
+ double value;
+};
+
+static int long2double_cmp(const struct long2double *e1, const struct long2double *e2, const void *unused)
+{
+ return !(e1->key == e2->key);
+}
+
+void long2double_init(void)
+{
+ hashmap_init(&map, (hashmap_cmp_fn) long2double_cmp, 0);
+}
+
+void long2double_free(void)
+{
+ hashmap_free(&map, 1);
+}
+
+static struct long2double *find_entry(long key)
+{
+ struct long2double k;
+ hashmap_entry_init(&k, memhash(&key, sizeof(long)));
+ k.key = key;
+ return hashmap_get(&map, &k, NULL);
+}
+
+double get_value(long key)
+{
+ struct long2double *e = find_entry(key);
+ return e ? e->value : 0;
+}
+
+void set_value(long key, double value)
+{
+ struct long2double *e = find_entry(key);
+ if (!e) {
+ e = malloc(sizeof(struct long2double));
+ hashmap_entry_init(e, memhash(&key, sizeof(long)));
+ e->key = key;
+ hashmap_add(&map, e);
+ }
+ e->value = value;
+}
+------------
+
+Using variable-sized keys
+-------------------------
+
+The `hashmap_entry_get` and `hashmap_entry_remove` functions expect an ordinary
+`hashmap_entry` structure as key to find the correct entry. If the key data is
+variable-sized (e.g. a FLEX_ARRAY string) or quite large, it is undesirable
+to create a full-fledged entry structure on the heap and copy all the key data
+into the structure.
+
+In this case, the `keydata` parameter can be used to pass
+variable-sized key data directly to the comparison function, and the `key`
+parameter can be a stripped-down, fixed size entry structure allocated on the
+stack.
+
+See test-hashmap.c for an example using arbitrary-length strings as keys.
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index d21d77d..544373b 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -20,13 +20,13 @@ URL syntax documented by RFC 1738, so they are of the form:
http://<host>:<port>/<path>?<searchpart>
-Within this documentation the placeholder $GIT_URL will stand for
+Within this documentation the placeholder `$GIT_URL` will stand for
the http:// repository URL entered by the end-user.
-Servers SHOULD handle all requests to locations matching $GIT_URL, as
+Servers SHOULD handle all requests to locations matching `$GIT_URL`, as
both the "smart" and "dumb" HTTP protocols used by Git operate
by appending additional path components onto the end of the user
-supplied $GIT_URL string.
+supplied `$GIT_URL` string.
An example of a dumb client requesting for a loose object:
@@ -43,10 +43,10 @@ An example of a request to a submodule:
$GIT_URL: http://example.com/git/repo.git/path/submodule.git
URL request: http://example.com/git/repo.git/path/submodule.git/info/refs
-Clients MUST strip a trailing '/', if present, from the user supplied
-$GIT_URL string to prevent empty path tokens ('//') from appearing
+Clients MUST strip a trailing `/`, if present, from the user supplied
+`$GIT_URL` string to prevent empty path tokens (`//`) from appearing
in any URL sent to a server. Compatible clients MUST expand
-'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'.
+`$GIT_URL/info/refs` as `foo/info/refs` and not `foo//info/refs`.
Authentication
@@ -103,14 +103,14 @@ Except where noted, all standard HTTP behavior SHOULD be assumed
by both client and server. This includes (but is not necessarily
limited to):
-If there is no repository at $GIT_URL, or the resource pointed to by a
-location matching $GIT_URL does not exist, the server MUST NOT respond
-with '200 OK' response. A server SHOULD respond with
-'404 Not Found', '410 Gone', or any other suitable HTTP status code
+If there is no repository at `$GIT_URL`, or the resource pointed to by a
+location matching `$GIT_URL` does not exist, the server MUST NOT respond
+with `200 OK` response. A server SHOULD respond with
+`404 Not Found`, `410 Gone`, or any other suitable HTTP status code
which does not imply the resource exists as requested.
-If there is a repository at $GIT_URL, but access is not currently
-permitted, the server MUST respond with the '403 Forbidden' HTTP
+If there is a repository at `$GIT_URL`, but access is not currently
+permitted, the server MUST respond with the `403 Forbidden` HTTP
status code.
Servers SHOULD support both HTTP 1.0 and HTTP 1.1.
@@ -126,9 +126,9 @@ Servers MAY return ETag and/or Last-Modified headers.
Clients MAY revalidate cached entities by including If-Modified-Since
and/or If-None-Match request headers.
-Servers MAY return '304 Not Modified' if the relevant headers appear
+Servers MAY return `304 Not Modified` if the relevant headers appear
in the request and the entity has not changed. Clients MUST treat
-'304 Not Modified' identical to '200 OK' by reusing the cached entity.
+`304 Not Modified` identical to `200 OK` by reusing the cached entity.
Clients MAY reuse a cached entity without revalidation if the
Cache-Control and/or Expires header permits caching. Clients and
@@ -148,7 +148,7 @@ HTTP clients that only support the "dumb" protocol MUST discover
references by making a request for the special info/refs file of
the repository.
-Dumb HTTP clients MUST make a GET request to $GIT_URL/info/refs,
+Dumb HTTP clients MUST make a `GET` request to `$GIT_URL/info/refs`,
without any search/query parameters.
C: GET $GIT_URL/info/refs HTTP/1.0
@@ -161,21 +161,21 @@ without any search/query parameters.
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
The Content-Type of the returned info/refs entity SHOULD be
-"text/plain; charset=utf-8", but MAY be any content type.
+`text/plain; charset=utf-8`, but MAY be any content type.
Clients MUST NOT attempt to validate the returned Content-Type.
Dumb servers MUST NOT return a return type starting with
-"application/x-git-".
+`application/x-git-`.
Cache-Control headers MAY be returned to disable caching of the
returned entity.
When examining the response clients SHOULD only examine the HTTP
-status code. Valid responses are '200 OK', or '304 Not Modified'.
+status code. Valid responses are `200 OK`, or `304 Not Modified`.
The returned content is a UNIX formatted text file describing
each ref and its known value. The file SHOULD be sorted by name
according to the C locale ordering. The file SHOULD NOT include
-the default ref named 'HEAD'.
+the default ref named `HEAD`.
info_refs = *( ref_record )
ref_record = any_ref / peeled_ref
@@ -192,13 +192,14 @@ HTTP clients that support the "smart" protocol (or both the
a parameterized request for the info/refs file of the repository.
The request MUST contain exactly one query parameter,
-'service=$servicename', where $servicename MUST be the service
+`service=$servicename`, where `$servicename` MUST be the service
name the client wishes to contact to complete the operation.
The request MUST NOT contain additional query parameters.
C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
- dumb server reply:
+dumb server reply:
+
S: 200 OK
S:
S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
@@ -206,7 +207,8 @@ The request MUST NOT contain additional query parameters.
S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
- smart server reply:
+smart server reply:
+
S: 200 OK
S: Content-Type: application/x-git-upload-pack-advertisement
S: Cache-Control: no-cache
@@ -228,7 +230,7 @@ Smart Server Response
^^^^^^^^^^^^^^^^^^^^^
If the server does not recognize the requested service name, or the
requested service name has been disabled by the server administrator,
-the server MUST respond with the '403 Forbidden' HTTP status code.
+the server MUST respond with the `403 Forbidden` HTTP status code.
Otherwise, smart servers MUST respond with the smart server reply
format for the requested service name.
@@ -236,35 +238,35 @@ format for the requested service name.
Cache-Control headers SHOULD be used to disable caching of the
returned entity.
-The Content-Type MUST be 'application/x-$servicename-advertisement'.
+The Content-Type MUST be `application/x-$servicename-advertisement`.
Clients SHOULD fall back to the dumb protocol if another content
type is returned. When falling back to the dumb protocol clients
-SHOULD NOT make an additional request to $GIT_URL/info/refs, but
+SHOULD NOT make an additional request to `$GIT_URL/info/refs`, but
instead SHOULD use the response already in hand. Clients MUST NOT
continue if they do not support the dumb protocol.
-Clients MUST validate the status code is either '200 OK' or
-'304 Not Modified'.
+Clients MUST validate the status code is either `200 OK` or
+`304 Not Modified`.
Clients MUST validate the first five bytes of the response entity
-matches the regex "^[0-9a-f]{4}#". If this test fails, clients
+matches the regex `^[0-9a-f]{4}#`. If this test fails, clients
MUST NOT continue.
Clients MUST parse the entire response as a sequence of pkt-line
records.
-Clients MUST verify the first pkt-line is "# service=$servicename".
+Clients MUST verify the first pkt-line is `# service=$servicename`.
Servers MUST set $servicename to be the request parameter value.
Servers SHOULD include an LF at the end of this line.
Clients MUST ignore an LF at the end of the line.
-Servers MUST terminate the response with the magic "0000" end
+Servers MUST terminate the response with the magic `0000` end
pkt-line marker.
The returned response is a pkt-line stream describing each ref and
its known value. The stream SHOULD be sorted by name according to
the C locale ordering. The stream SHOULD include the default ref
-named 'HEAD' as the first ref. The stream MUST include capability
+named `HEAD` as the first ref. The stream MUST include capability
declarations behind a NUL on the first ref.
smart_reply = PKT-LINE("# service=$servicename" LF)
@@ -286,12 +288,13 @@ declarations behind a NUL on the first ref.
peeled_ref = PKT-LINE(obj-id SP name LF)
PKT-LINE(obj-id SP name "^{}" LF
+
Smart Service git-upload-pack
------------------------------
-This service reads from the repository pointed to by $GIT_URL.
+This service reads from the repository pointed to by `$GIT_URL`.
Clients MUST first perform ref discovery with
-'$GIT_URL/info/refs?service=git-upload-pack'.
+`$GIT_URL/info/refs?service=git-upload-pack`.
C: POST $GIT_URL/git-upload-pack HTTP/1.0
C: Content-Type: application/x-git-upload-pack-request
@@ -313,10 +316,10 @@ to prevent caching of the response.
Servers SHOULD support all capabilities defined here.
-Clients MUST send at least one 'want' command in the request body.
-Clients MUST NOT reference an id in a 'want' command which did not
+Clients MUST send at least one "want" command in the request body.
+Clients MUST NOT reference an id in a "want" command which did not
appear in the response obtained through ref discovery unless the
-server advertises capability "allow-tip-sha1-in-want".
+server advertises capability `allow-tip-sha1-in-want`.
compute_request = want_list
have_list
@@ -332,128 +335,128 @@ server advertises capability "allow-tip-sha1-in-want".
have_list = *PKT-LINE("have" SP id LF)
TODO: Document this further.
-TODO: Don't use uppercase for variable names below.
The Negotiation Algorithm
~~~~~~~~~~~~~~~~~~~~~~~~~
The computation to select the minimal pack proceeds as follows
-(c = client, s = server):
+(C = client, S = server):
+
+'init step:'
+
+C: Use ref discovery to obtain the advertised refs.
+
+C: Place any object seen into set `advertised`.
- init step:
- (c) Use ref discovery to obtain the advertised refs.
- (c) Place any object seen into set ADVERTISED.
+C: Build an empty set, `common`, to hold the objects that are later
+ determined to be on both ends.
- (c) Build an empty set, COMMON, to hold the objects that are later
- determined to be on both ends.
- (c) Build a set, WANT, of the objects from ADVERTISED the client
- wants to fetch, based on what it saw during ref discovery.
+C: Build a set, `want`, of the objects from `advertised` the client
+ wants to fetch, based on what it saw during ref discovery.
- (c) Start a queue, C_PENDING, ordered by commit time (popping newest
- first). Add all client refs. When a commit is popped from
- the queue its parents SHOULD be automatically inserted back.
- Commits MUST only enter the queue once.
+C: Start a queue, `c_pending`, ordered by commit time (popping newest
+ first). Add all client refs. When a commit is popped from
+ the queue its parents SHOULD be automatically inserted back.
+ Commits MUST only enter the queue once.
- one compute step:
- (c) Send one $GIT_URL/git-upload-pack request:
+'one compute step:'
- C: 0032want <WANT #1>...............................
- C: 0032want <WANT #2>...............................
+C: Send one `$GIT_URL/git-upload-pack` request:
+
+ C: 0032want <want #1>...............................
+ C: 0032want <want #2>...............................
....
- C: 0032have <COMMON #1>.............................
- C: 0032have <COMMON #2>.............................
+ C: 0032have <common #1>.............................
+ C: 0032have <common #2>.............................
....
- C: 0032have <HAVE #1>...............................
- C: 0032have <HAVE #2>...............................
+ C: 0032have <have #1>...............................
+ C: 0032have <have #2>...............................
....
C: 0000
- The stream is organized into "commands", with each command
- appearing by itself in a pkt-line. Within a command line
- the text leading up to the first space is the command name,
- and the remainder of the line to the first LF is the value.
- Command lines are terminated with an LF as the last byte of
- the pkt-line value.
+The stream is organized into "commands", with each command
+appearing by itself in a pkt-line. Within a command line
+the text leading up to the first space is the command name,
+and the remainder of the line to the first LF is the value.
+Command lines are terminated with an LF as the last byte of
+the pkt-line value.
- Commands MUST appear in the following order, if they appear
- at all in the request stream:
+Commands MUST appear in the following order, if they appear
+at all in the request stream:
- * want
- * have
+* "want"
+* "have"
- The stream is terminated by a pkt-line flush ("0000").
+The stream is terminated by a pkt-line flush (`0000`).
- A single "want" or "have" command MUST have one hex formatted
- SHA-1 as its value. Multiple SHA-1s MUST be sent by sending
- multiple commands.
+A single "want" or "have" command MUST have one hex formatted
+SHA-1 as its value. Multiple SHA-1s MUST be sent by sending
+multiple commands.
- The HAVE list is created by popping the first 32 commits
- from C_PENDING. Less can be supplied if C_PENDING empties.
+The `have` list is created by popping the first 32 commits
+from `c_pending`. Less can be supplied if `c_pending` empties.
- If the client has sent 256 HAVE commits and has not yet
- received one of those back from S_COMMON, or the client has
- emptied C_PENDING it SHOULD include a "done" command to let
- the server know it won't proceed:
+If the client has sent 256 "have" commits and has not yet
+received one of those back from `s_common`, or the client has
+emptied `c_pending` it SHOULD include a "done" command to let
+the server know it won't proceed:
C: 0009done
- (s) Parse the git-upload-pack request:
-
- Verify all objects in WANT are directly reachable from refs.
-
- The server MAY walk backwards through history or through
- the reflog to permit slightly stale requests.
+S: Parse the git-upload-pack request:
- If no WANT objects are received, send an error:
+Verify all objects in `want` are directly reachable from refs.
-TODO: Define error if no want lines are requested.
+The server MAY walk backwards through history or through
+the reflog to permit slightly stale requests.
- If any WANT object is not reachable, send an error:
+If no "want" objects are received, send an error:
+TODO: Define error if no "want" lines are requested.
-TODO: Define error if an invalid want is requested.
+If any "want" object is not reachable, send an error:
+TODO: Define error if an invalid "want" is requested.
- Create an empty list, S_COMMON.
+Create an empty list, `s_common`.
- If 'have' was sent:
+If "have" was sent:
- Loop through the objects in the order supplied by the client.
- For each object, if the server has the object reachable from
- a ref, add it to S_COMMON. If a commit is added to S_COMMON,
- do not add any ancestors, even if they also appear in HAVE.
+Loop through the objects in the order supplied by the client.
- (s) Send the git-upload-pack response:
+For each object, if the server has the object reachable from
+a ref, add it to `s_common`. If a commit is added to `s_common`,
+do not add any ancestors, even if they also appear in `have`.
- If the server has found a closed set of objects to pack or the
- request ends with "done", it replies with the pack.
+S: Send the git-upload-pack response:
+If the server has found a closed set of objects to pack or the
+request ends with "done", it replies with the pack.
TODO: Document the pack based response
- S: PACK...
- The returned stream is the side-band-64k protocol supported
- by the git-upload-pack service, and the pack is embedded into
- stream 1. Progress messages from the server side MAY appear
- in stream 2.
+ S: PACK...
- Here a "closed set of objects" is defined to have at least
- one path from every WANT to at least one COMMON object.
+The returned stream is the side-band-64k protocol supported
+by the git-upload-pack service, and the pack is embedded into
+stream 1. Progress messages from the server side MAY appear
+in stream 2.
- If the server needs more information, it replies with a
- status continue response:
+Here a "closed set of objects" is defined to have at least
+one path from every "want" to at least one "common" object.
+If the server needs more information, it replies with a
+status continue response:
TODO: Document the non-pack response
- (c) Parse the upload-pack response:
-
-TODO: Document parsing response
+C: Parse the upload-pack response:
+ TODO: Document parsing response
- Do another compute step.
+'Do another compute step.'
Smart Service git-receive-pack
------------------------------
-This service reads from the repository pointed to by $GIT_URL.
+This service reads from the repository pointed to by `$GIT_URL`.
Clients MUST first perform ref discovery with
-'$GIT_URL/info/refs?service=git-receive-pack'.
+`$GIT_URL/info/refs?service=git-receive-pack`.
C: POST $GIT_URL/git-receive-pack HTTP/1.0
C: Content-Type: application/x-git-receive-pack-request
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 248dcab..d4f9804 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -3795,7 +3795,7 @@ like so:
$ git update-index filename
-------------------------------------------------
-but to avoid common mistakes with filename globbing etc, the command
+but to avoid common mistakes with filename globbing etc., the command
will not normally add totally new entries or remove old entries,
i.e. it will normally just update existing cache entries.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index e66a5ab..2b97352 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v1.9-rc0
+DEF_VER=v1.9.0
LF='
'
diff --git a/Makefile b/Makefile
index b4af1e2..c3213bd 100644
--- a/Makefile
+++ b/Makefile
@@ -555,6 +555,7 @@ TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
TEST_PROGRAMS_NEED_X += test-genrandom
+TEST_PROGRAMS_NEED_X += test-hashmap
TEST_PROGRAMS_NEED_X += test-index-version
TEST_PROGRAMS_NEED_X += test-line-buffer
TEST_PROGRAMS_NEED_X += test-match-trees
@@ -671,7 +672,7 @@ LIB_H += git-compat-util.h
LIB_H += gpg-interface.h
LIB_H += graph.h
LIB_H += grep.h
-LIB_H += hash.h
+LIB_H += hashmap.h
LIB_H += help.h
LIB_H += http.h
LIB_H += kwset.h
@@ -802,7 +803,7 @@ LIB_OBJS += gettext.o
LIB_OBJS += gpg-interface.o
LIB_OBJS += graph.o
LIB_OBJS += grep.o
-LIB_OBJS += hash.o
+LIB_OBJS += hashmap.o
LIB_OBJS += help.o
LIB_OBJS += hex.o
LIB_OBJS += ident.o
@@ -1773,7 +1774,7 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
git.res: git.rc GIT-VERSION-FILE
$(QUIET_RC)$(RC) \
- $(join -DMAJOR= -DMINOR= -DPATCH=, $(wordlist 1,3,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
+ $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
-DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@
ifndef NO_PERL
@@ -2050,10 +2051,10 @@ git-imap-send$X: imap-send.o GIT-LDFLAGS $(GITLIBS)
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
-git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
+git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(CURL_LIBCURL)
-git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS)
+git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
diff --git a/RelNotes b/RelNotes
index c300119..bb52cf9 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.9.txt \ No newline at end of file
+Documentation/RelNotes/1.9.0.txt \ No newline at end of file
diff --git a/bisect.c b/bisect.c
index 37200b4..8448d27 100644
--- a/bisect.c
+++ b/bisect.c
@@ -685,7 +685,6 @@ static void mark_expected_rev(char *bisect_rev_hex)
static int bisect_checkout(char *bisect_rev_hex, int no_checkout)
{
- int res;
mark_expected_rev(bisect_rev_hex);
@@ -696,6 +695,7 @@ static int bisect_checkout(char *bisect_rev_hex, int no_checkout)
die("update-ref --no-deref HEAD failed on %s",
bisect_rev_hex);
} else {
+ int res;
res = run_command_v_opt(argv_checkout, RUN_GIT_CMD);
if (res)
exit(res);
diff --git a/builtin/add.c b/builtin/add.c
index 2a2722f..672adc0 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -208,8 +208,7 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
i = dir->nr;
while (--i >= 0) {
struct dir_entry *entry = *src++;
- if (match_pathspec_depth(pathspec, entry->name, entry->len,
- prefix, seen))
+ if (dir_path_match(entry, pathspec, prefix, seen))
*dst++ = entry;
else if (flag & WARN_IMPLICIT_DOT)
/*
diff --git a/builtin/apply.c b/builtin/apply.c
index b0d0986..a7e72d5 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -1943,13 +1943,7 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
size - offset - hdrsize, patch);
if (!patchsize) {
- static const char *binhdr[] = {
- "Binary files ",
- "Files ",
- NULL,
- };
static const char git_binary[] = "GIT binary patch\n";
- int i;
int hd = hdrsize + offset;
unsigned long llen = linelen(buffer + hd, size - hd);
@@ -1965,6 +1959,12 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
patchsize = 0;
}
else if (!memcmp(" differ\n", buffer + hd + llen - 8, 8)) {
+ static const char *binhdr[] = {
+ "Binary files ",
+ "Files ",
+ NULL,
+ };
+ int i;
for (i = 0; binhdr[i]; i++) {
int len = strlen(binhdr[i]);
if (len < size - hd &&
diff --git a/builtin/blame.c b/builtin/blame.c
index 1c692d8..e5b5d71 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1557,14 +1557,14 @@ static const char *format_time(unsigned long time, const char *tz_str,
int show_raw_time)
{
static char time_buf[128];
- const char *time_str;
- int time_len;
- int tz;
if (show_raw_time) {
snprintf(time_buf, sizeof(time_buf), "%lu %s", time, tz_str);
}
else {
+ const char *time_str;
+ int time_len;
+ int tz;
tz = atoi(tz_str);
time_str = show_date(time, tz, blame_date_mode);
time_len = strlen(time_str);
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 5df3837..ada51fa 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -297,8 +297,7 @@ static int checkout_paths(const struct checkout_opts *opts,
* match_pathspec() for _all_ entries when
* opts->source_tree != NULL.
*/
- if (match_pathspec_depth(&opts->pathspec, ce->name, ce_namelen(ce),
- 0, ps_matched))
+ if (ce_path_match(ce, &opts->pathspec, ps_matched))
ce->ce_flags |= CE_MATCHED;
}
diff --git a/builtin/clean.c b/builtin/clean.c
index 2f26297..114d7bf 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -154,7 +154,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
DIR *dir;
struct strbuf quoted = STRBUF_INIT;
struct dirent *e;
- int res = 0, ret = 0, gone = 1, original_len = path->len, len, i;
+ int res = 0, ret = 0, gone = 1, original_len = path->len, len;
unsigned char submodule_head[20];
struct string_list dels = STRING_LIST_INIT_DUP;
@@ -242,6 +242,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
}
if (!*dir_gone && !quiet) {
+ int i;
for (i = 0; i < dels.nr; i++)
printf(dry_run ? _(msg_would_remove) : _(msg_remove), dels.items[i].string);
}
@@ -933,36 +934,18 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
for (i = 0; i < dir.nr; i++) {
struct dir_entry *ent = dir.entries[i];
- int len, pos;
int matches = 0;
- const struct cache_entry *ce;
struct stat st;
const char *rel;
- /*
- * Remove the '/' at the end that directory
- * walking adds for directory entries.
- */
- len = ent->len;
- if (len && ent->name[len-1] == '/')
- len--;
- pos = cache_name_pos(ent->name, len);
- if (0 <= pos)
- continue; /* exact match */
- pos = -pos - 1;
- if (pos < active_nr) {
- ce = active_cache[pos];
- if (ce_namelen(ce) == len &&
- !memcmp(ce->name, ent->name, len))
- continue; /* Yup, this one exists unmerged */
- }
+ if (!cache_name_is_other(ent->name, ent->len))
+ continue;
if (lstat(ent->name, &st))
die_errno("Cannot lstat '%s'", ent->name);
if (pathspec.nr)
- matches = match_pathspec_depth(&pathspec, ent->name,
- len, 0, NULL);
+ matches = dir_path_match(ent, &pathspec, 0, NULL);
if (S_ISDIR(st.st_mode)) {
if (remove_directories || (matches == MATCHED_EXACTLY)) {
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index f641ff2..987a4c3 100644
--- a/builtin/commit-tree.c
+++ b/builtin/commit-tree.c
@@ -12,6 +12,8 @@
static const char commit_tree_usage[] = "git commit-tree [(-p <sha1>)...] [-S[<keyid>]] [-m <message>] [-F <file>] <sha1> <changelog";
+static const char *sign_commit;
+
static void new_parent(struct commit *parent, struct commit_list **parents_p)
{
unsigned char *sha1 = parent->object.sha1;
@@ -31,6 +33,10 @@ static int commit_tree_config(const char *var, const char *value, void *cb)
int status = git_gpg_config(var, value, NULL);
if (status)
return status;
+ if (!strcmp(var, "commit.gpgsign")) {
+ sign_commit = git_config_bool(var, value) ? "" : NULL;
+ return 0;
+ }
return git_default_config(var, value, cb);
}
@@ -41,7 +47,6 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
unsigned char tree_sha1[20];
unsigned char commit_sha1[20];
struct strbuf buffer = STRBUF_INIT;
- const char *sign_commit = NULL;
git_config(commit_tree_config, NULL);
@@ -66,6 +71,11 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
continue;
}
+ if (!strcmp(arg, "--no-gpg-sign")) {
+ sign_commit = NULL;
+ continue;
+ }
+
if (!strcmp(arg, "-m")) {
if (argc <= ++i)
usage(commit_tree_usage);
diff --git a/builtin/commit.c b/builtin/commit.c
index 3767478..3783bca 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -234,7 +234,7 @@ static int list_paths(struct string_list *list, const char *with_tree,
if (ce->ce_flags & CE_UPDATE)
continue;
- if (!match_pathspec_depth(pattern, ce->name, ce_namelen(ce), 0, m))
+ if (!ce_path_match(ce, pattern, m))
continue;
item = string_list_insert(list, ce->name);
if (ce_skip_worktree(ce))
@@ -307,7 +307,6 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
int fd;
struct string_list partial;
struct pathspec pathspec;
- char *old_index_env = NULL;
int refresh_flags = REFRESH_QUIET;
if (is_status)
@@ -320,6 +319,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix,
die(_("index file corrupt"));
if (interactive) {
+ char *old_index_env = NULL;
fd = hold_locked_index(&index_lock, 1);
refresh_cache_or_die(refresh_flags);
@@ -600,12 +600,10 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
{
struct stat statbuf;
struct strbuf committer_ident = STRBUF_INIT;
- int commitable, saved_color_setting;
+ int commitable;
struct strbuf sb = STRBUF_INIT;
- char *buffer;
const char *hook_arg1 = NULL;
const char *hook_arg2 = NULL;
- int ident_shown = 0;
int clean_message_contents = (cleanup_mode != CLEANUP_NONE);
int old_display_comment_prefix;
@@ -649,6 +647,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
logfile);
hook_arg1 = "message";
} else if (use_message) {
+ char *buffer;
buffer = strstr(use_message_buffer, "\n\n");
if (!use_editor && (!buffer || buffer[2] == '\0'))
die(_("commit has empty message"));
@@ -753,6 +752,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
/* This checks if committer ident is explicitly given */
strbuf_addstr(&committer_ident, git_committer_info(IDENT_STRICT));
if (use_editor && include_status) {
+ int ident_shown = 0;
+ int saved_color_setting;
char *ai_tmp, *ci_tmp;
if (whence != FROM_COMMIT)
status_printf_ln(s, GIT_COLOR_NORMAL,
@@ -1406,6 +1407,10 @@ static int git_commit_config(const char *k, const char *v, void *cb)
}
if (!strcmp(k, "commit.cleanup"))
return git_config_string(&cleanup_arg, k, v);
+ if (!strcmp(k, "commit.gpgsign")) {
+ sign_commit = git_config_bool(k, v) ? "" : NULL;
+ return 0;
+ }
status = git_gpg_config(k, v, NULL);
if (status)
@@ -1510,7 +1515,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
struct ref_lock *ref_lock;
struct commit_list *parents = NULL, **pptr = &parents;
struct stat statbuf;
- int allow_fast_forward = 1;
struct commit *current_head = NULL;
struct commit_extra_header *extra = NULL;
@@ -1558,6 +1562,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
} else if (whence == FROM_MERGE) {
struct strbuf m = STRBUF_INIT;
FILE *fp;
+ int allow_fast_forward = 1;
if (!reflog_msg)
reflog_msg = "commit (merge)";
diff --git a/builtin/describe.c b/builtin/describe.c
index 7db43da..dadd999 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -6,7 +6,7 @@
#include "exec_cmd.h"
#include "parse-options.h"
#include "diff.h"
-#include "hash.h"
+#include "hashmap.h"
#include "argv-array.h"
#define SEEN (1u << 0)
@@ -25,7 +25,7 @@ static int longformat;
static int first_parent;
static int abbrev = -1; /* unspecified */
static int max_candidates = 10;
-static struct hash_table names;
+static struct hashmap names;
static int have_util;
static const char *pattern;
static int always;
@@ -37,7 +37,7 @@ static const char *diff_index_args[] = {
};
struct commit_name {
- struct commit_name *next;
+ struct hashmap_entry entry;
unsigned char peeled[20];
struct tag *tag;
unsigned prio:2; /* annotated tag = 2, tag = 1, head = 0 */
@@ -50,6 +50,12 @@ static const char *prio_names[] = {
"head", "lightweight", "annotated",
};
+static int commit_name_cmp(const struct commit_name *cn1,
+ const struct commit_name *cn2, const void *peeled)
+{
+ return hashcmp(cn1->peeled, peeled ? peeled : cn2->peeled);
+}
+
static inline unsigned int hash_sha1(const unsigned char *sha1)
{
unsigned int hash;
@@ -59,21 +65,9 @@ static inline unsigned int hash_sha1(const unsigned char *sha1)
static inline struct commit_name *find_commit_name(const unsigned char *peeled)
{
- struct commit_name *n = lookup_hash(hash_sha1(peeled), &names);
- while (n && !!hashcmp(peeled, n->peeled))
- n = n->next;
- return n;
-}
-
-static int set_util(void *chain, void *data)
-{
- struct commit_name *n;
- for (n = chain; n; n = n->next) {
- struct commit *c = lookup_commit_reference_gently(n->peeled, 1);
- if (c)
- c->util = n;
- }
- return 0;
+ struct commit_name key;
+ hashmap_entry_init(&key, hash_sha1(peeled));
+ return hashmap_get(&names, &key, peeled);
}
static int replace_name(struct commit_name *e,
@@ -118,16 +112,10 @@ static void add_to_known_names(const char *path,
struct tag *tag = NULL;
if (replace_name(e, prio, sha1, &tag)) {
if (!e) {
- void **pos;
e = xmalloc(sizeof(struct commit_name));
hashcpy(e->peeled, peeled);
- pos = insert_hash(hash_sha1(peeled), e, &names);
- if (pos) {
- e->next = *pos;
- *pos = e;
- } else {
- e->next = NULL;
- }
+ hashmap_entry_init(e, hash_sha1(peeled));
+ hashmap_add(&names, e);
e->path = NULL;
}
e->tag = tag;
@@ -292,7 +280,14 @@ static void describe(const char *arg, int last_one)
fprintf(stderr, _("searching to describe %s\n"), arg);
if (!have_util) {
- for_each_hash(&names, set_util, NULL);
+ struct hashmap_iter iter;
+ struct commit *c;
+ struct commit_name *n = hashmap_iter_first(&names, &iter);
+ for (; n; n = hashmap_iter_next(&iter)) {
+ c = lookup_commit_reference_gently(n->peeled, 1);
+ if (c)
+ c->util = n;
+ }
have_util = 1;
}
@@ -463,9 +458,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
return cmd_name_rev(args.argc, args.argv, prefix);
}
- init_hash(&names);
+ hashmap_init(&names, (hashmap_cmp_fn) commit_name_cmp, 0);
for_each_rawref(get_name, NULL);
- if (!names.nr && !always)
+ if (!names.size && !always)
die(_("No names found, cannot describe anything."));
if (argc == 0) {
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 025bc3e..55f457c 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1026,7 +1026,6 @@ static int fetch_multiple(struct string_list *list)
static int fetch_one(struct remote *remote, int argc, const char **argv)
{
- int i;
static const char **refs = NULL;
struct refspec *refspec;
int ref_nr = 0;
@@ -1050,6 +1049,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
if (argc > 0) {
int j = 0;
+ int i;
refs = xcalloc(argc + 1, sizeof(const char *));
for (i = 0; i < argc; i++) {
if (!strcmp(argv[i], "tag")) {
diff --git a/builtin/gc.c b/builtin/gc.c
index c19545d..5bbb5e3 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -188,13 +188,12 @@ static int need_to_gc(void)
static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
{
static struct lock_file lock;
- static char locking_host[128];
char my_host[128];
struct strbuf sb = STRBUF_INIT;
struct stat st;
uintmax_t pid;
FILE *fp;
- int fd, should_exit;
+ int fd;
if (pidfile)
/* already locked */
@@ -206,6 +205,8 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
fd = hold_lock_file_for_update(&lock, git_path("gc.pid"),
LOCK_DIE_ON_ERROR);
if (!force) {
+ static char locking_host[128];
+ int should_exit;
fp = fopen(git_path("gc.pid"), "r");
memset(locking_host, 0, sizeof(locking_host));
should_exit =
diff --git a/builtin/grep.c b/builtin/grep.c
index 63f8603..69ac2d8 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -379,7 +379,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
const struct cache_entry *ce = active_cache[nr];
if (!S_ISREG(ce->ce_mode))
continue;
- if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL))
+ if (!ce_path_match(ce, pathspec, NULL))
continue;
/*
* If CE_VALID is on, we assume worktree file and its cache entry
@@ -524,9 +524,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,
fill_directory(&dir, pathspec);
for (i = 0; i < dir.nr; i++) {
- const char *name = dir.entries[i]->name;
- int namelen = strlen(name);
- if (!match_pathspec_depth(pathspec, name, namelen, 0, NULL))
+ if (!dir_path_match(dir.entries[i], pathspec, 0, NULL))
continue;
hit |= grep_file(opt, dir.entries[i]->name);
if (hit && opt->status_only)
diff --git a/builtin/init-db.c b/builtin/init-db.c
index b3f03cf..c7c76bb 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -515,13 +515,14 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
saved = shared_repository;
shared_repository = 0;
switch (safe_create_leading_directories_const(argv[0])) {
- case -3:
+ case SCLD_OK:
+ case SCLD_PERMS:
+ break;
+ case SCLD_EXISTS:
errno = EEXIST;
/* fallthru */
- case -1:
- die_errno(_("cannot mkdir %s"), argv[0]);
- break;
default:
+ die_errno(_("cannot mkdir %s"), argv[0]);
break;
}
shared_repository = saved;
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index e1cf6d8..47c3880 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -64,7 +64,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent)
if (len >= ent->len)
die("git ls-files: internal error - directory entry not superset of prefix");
- if (!match_pathspec_depth(&pathspec, ent->name, ent->len, len, ps_matched))
+ if (!dir_path_match(ent, &pathspec, len, ps_matched))
return;
fputs(tag, stdout);
@@ -139,7 +139,9 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce)
if (len >= ce_namelen(ce))
die("git ls-files: internal error - cache entry not superset of prefix");
- if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), len, ps_matched))
+ if (!match_pathspec(&pathspec, ce->name, ce_namelen(ce),
+ len, ps_matched,
+ S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)))
return;
if (tag && *tag && show_valid_bit &&
@@ -195,7 +197,8 @@ static void show_ru_info(void)
len = strlen(path);
if (len < max_prefix_len)
continue; /* outside of the prefix */
- if (!match_pathspec_depth(&pathspec, path, len, max_prefix_len, ps_matched))
+ if (!match_pathspec(&pathspec, path, len,
+ max_prefix_len, ps_matched, 0))
continue; /* uninterested */
for (i = 0; i < 3; i++) {
if (!ui->mode[i])
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index 65ec931..51184df 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -171,7 +171,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
* show_recursive() rolls its own matching code and is
* generally ignorant of 'struct pathspec'. The magic mask
* cannot be lifted until it is converted to use
- * match_pathspec_depth() or tree_entry_interesting()
+ * match_pathspec() or tree_entry_interesting()
*/
parse_pathspec(&pathspec, PATHSPEC_GLOB | PATHSPEC_ICASE,
PATHSPEC_PREFER_CWD,
diff --git a/builtin/merge.c b/builtin/merge.c
index 4941a6c..f0cf120 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -367,7 +367,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
sha1_to_hex(commit->object.sha1));
pretty_print_commit(&ctx, commit, &out);
}
- if (write(fd, out.buf, out.len) < 0)
+ if (write_in_full(fd, out.buf, out.len) != out.len)
die_errno(_("Writing SQUASH_MSG"));
if (close(fd))
die_errno(_("Finishing SQUASH_MSG"));
@@ -597,6 +597,9 @@ static int git_merge_config(const char *k, const char *v, void *cb)
} else if (!strcmp(k, "merge.defaulttoupstream")) {
default_to_upstream = git_config_bool(k, v);
return 0;
+ } else if (!strcmp(k, "commit.gpgsign")) {
+ sign_commit = git_config_bool(k, v) ? "" : NULL;
+ return 0;
}
status = fmt_merge_msg_config(k, v, cb);
diff --git a/builtin/repack.c b/builtin/repack.c
index ba66c6e..bb2314c 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -129,10 +129,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
/* variables to be filled by option parsing */
int pack_everything = 0;
int delete_redundant = 0;
- char *unpack_unreachable = NULL;
- int window = 0, window_memory = 0;
- int depth = 0;
- int max_pack_size = 0;
+ const char *unpack_unreachable = NULL;
+ const char *window = NULL, *window_memory = NULL;
+ const char *depth = NULL;
+ const char *max_pack_size = NULL;
int no_reuse_delta = 0, no_reuse_object = 0;
int no_update_server_info = 0;
int quiet = 0;
@@ -157,13 +157,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
N_("pass --local to git-pack-objects")),
OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"),
N_("with -A, do not loosen objects older than this")),
- OPT_INTEGER(0, "window", &window,
+ OPT_STRING(0, "window", &window, N_("n"),
N_("size of the window used for delta compression")),
- OPT_INTEGER(0, "window-memory", &window_memory,
+ OPT_STRING(0, "window-memory", &window_memory, N_("bytes"),
N_("same as the above, but limit memory size instead of entries count")),
- OPT_INTEGER(0, "depth", &depth,
+ OPT_STRING(0, "depth", &depth, N_("n"),
N_("limits the maximum delta depth")),
- OPT_INTEGER(0, "max-pack-size", &max_pack_size,
+ OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"),
N_("maximum size of each packfile")),
OPT_END()
};
@@ -185,13 +185,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_push(&cmd_args, "--all");
argv_array_push(&cmd_args, "--reflog");
if (window)
- argv_array_pushf(&cmd_args, "--window=%u", window);
+ argv_array_pushf(&cmd_args, "--window=%s", window);
if (window_memory)
- argv_array_pushf(&cmd_args, "--window-memory=%u", window_memory);
+ argv_array_pushf(&cmd_args, "--window-memory=%s", window_memory);
if (depth)
- argv_array_pushf(&cmd_args, "--depth=%u", depth);
+ argv_array_pushf(&cmd_args, "--depth=%s", depth);
if (max_pack_size)
- argv_array_pushf(&cmd_args, "--max_pack_size=%u", max_pack_size);
+ argv_array_pushf(&cmd_args, "--max-pack-size=%s", max_pack_size);
if (no_reuse_delta)
argv_array_pushf(&cmd_args, "--no-reuse-delta");
if (no_reuse_object)
@@ -258,7 +258,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
for_each_string_list_item(item, &names) {
for (ext = 0; ext < 2; ext++) {
char *fname, *fname_old;
- fname = mkpathdup("%s/%s%s", packdir,
+ fname = mkpathdup("%s/pack-%s%s", packdir,
item->string, exts[ext]);
if (!file_exists(fname)) {
free(fname);
@@ -335,7 +335,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
for_each_string_list_item(item, &names) {
for (ext = 0; ext < 2; ext++) {
char *fname;
- fname = mkpath("%s/old-pack-%s%s",
+ fname = mkpath("%s/old-%s%s",
packdir,
item->string,
exts[ext]);
diff --git a/builtin/reset.c b/builtin/reset.c
index 6004803..4fd1c6c 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -116,25 +116,34 @@ static void update_index_from_diff(struct diff_queue_struct *q,
struct diff_options *opt, void *data)
{
int i;
+ int intent_to_add = *(int *)data;
for (i = 0; i < q->nr; i++) {
struct diff_filespec *one = q->queue[i]->one;
- if (one->mode && !is_null_sha1(one->sha1)) {
- struct cache_entry *ce;
- ce = make_cache_entry(one->mode, one->sha1, one->path,
- 0, 0);
- if (!ce)
- die(_("make_cache_entry failed for path '%s'"),
- one->path);
- add_cache_entry(ce, ADD_CACHE_OK_TO_ADD |
- ADD_CACHE_OK_TO_REPLACE);
- } else
+ int is_missing = !(one->mode && !is_null_sha1(one->sha1));
+ struct cache_entry *ce;
+
+ if (is_missing && !intent_to_add) {
remove_file_from_cache(one->path);
+ continue;
+ }
+
+ ce = make_cache_entry(one->mode, one->sha1, one->path,
+ 0, 0);
+ if (!ce)
+ die(_("make_cache_entry failed for path '%s'"),
+ one->path);
+ if (is_missing) {
+ ce->ce_flags |= CE_INTENT_TO_ADD;
+ set_object_name_for_intent_to_add_entry(ce);
+ }
+ add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
}
}
static int read_from_tree(const struct pathspec *pathspec,
- unsigned char *tree_sha1)
+ unsigned char *tree_sha1,
+ int intent_to_add)
{
struct diff_options opt;
@@ -142,6 +151,7 @@ static int read_from_tree(const struct pathspec *pathspec,
copy_pathspec(&opt.pathspec, pathspec);
opt.output_format = DIFF_FORMAT_CALLBACK;
opt.format_callback = update_index_from_diff;
+ opt.format_callback_data = &intent_to_add;
if (do_diff_cache(tree_sha1, &opt))
return 1;
@@ -258,6 +268,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
const char *rev;
unsigned char sha1[20];
struct pathspec pathspec;
+ int intent_to_add = 0;
const struct option options[] = {
OPT__QUIET(&quiet, N_("be quiet, only report errors")),
OPT_SET_INT(0, "mixed", &reset_type,
@@ -270,6 +281,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
OPT_SET_INT(0, "keep", &reset_type,
N_("reset HEAD but keep local changes"), KEEP),
OPT_BOOL('p', "patch", &patch_mode, N_("select hunks interactively")),
+ OPT_BOOL('N', "intent-to-add", &intent_to_add,
+ N_("record only the fact that removed paths will be added later")),
OPT_END()
};
@@ -327,6 +340,9 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
die(_("%s reset is not allowed in a bare repository"),
_(reset_type_names[reset_type]));
+ if (intent_to_add && reset_type != MIXED)
+ die(_("-N can only be used with --mixed"));
+
/* Soft reset does not touch the index file nor the working tree
* at all, but requires them in a good order. Other resets reset
* the index file to the tree object we are switching to. */
@@ -338,7 +354,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
int newfd = hold_locked_index(lock, 1);
if (reset_type == MIXED) {
int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN;
- if (read_from_tree(&pathspec, sha1))
+ if (read_from_tree(&pathspec, sha1, intent_to_add))
return 1;
refresh_index(&the_index, flags, NULL, NULL,
_("Unstaged changes after reset:"));
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index aaeb611..45901df 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -547,15 +547,17 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
continue;
}
if (!strcmp(arg, "--default")) {
- def = argv[i+1];
- i++;
+ def = argv[++i];
+ if (!def)
+ die("--default requires an argument");
continue;
}
if (!strcmp(arg, "--prefix")) {
- prefix = argv[i+1];
+ prefix = argv[++i];
+ if (!prefix)
+ die("--prefix requires an argument");
startup_info->prefix = prefix;
output_prefix = 1;
- i++;
continue;
}
if (!strcmp(arg, "--revs-only")) {
@@ -738,9 +740,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
continue;
}
if (!strcmp(arg, "--resolve-git-dir")) {
- const char *gitdir = resolve_gitdir(argv[i+1]);
+ const char *gitdir = argv[++i];
if (!gitdir)
- die("not a gitdir '%s'", argv[i+1]);
+ die("--resolve-git-dir requires an argument");
+ gitdir = resolve_gitdir(gitdir);
+ if (!gitdir)
+ die("not a gitdir '%s'", argv[i]);
puts(gitdir);
continue;
}
diff --git a/builtin/revert.c b/builtin/revert.c
index 87659c9..065d88d 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -89,6 +89,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")),
OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
N_("option for merge strategy"), option_parse_x),
+ { OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key id"),
+ N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
OPT_END(),
OPT_END(),
OPT_END(),
diff --git a/builtin/rm.c b/builtin/rm.c
index 3a0e0ea..960634d 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -308,10 +308,10 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
for (i = 0; i < active_nr; i++) {
const struct cache_entry *ce = active_cache[i];
- if (!match_pathspec_depth(&pathspec, ce->name, ce_namelen(ce), 0, seen))
+ if (!ce_path_match(ce, &pathspec, seen))
continue;
ALLOC_GROW(list.entry, list.nr + 1, list.alloc);
- list.entry[list.nr].name = ce->name;
+ list.entry[list.nr].name = xstrdup(ce->name);
list.entry[list.nr].is_submodule = S_ISGITLINK(ce->ce_mode);
if (list.entry[list.nr++].is_submodule &&
!is_staging_gitmodules_ok())
diff --git a/builtin/update-index.c b/builtin/update-index.c
index e3a10d7..d12ad95 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -12,6 +12,7 @@
#include "resolve-undo.h"
#include "parse-options.h"
#include "pathspec.h"
+#include "dir.h"
/*
* Default to not allowing changes to the list of files. The
@@ -274,36 +275,32 @@ static void chmod_path(int flip, const char *path)
die("git update-index: cannot chmod %cx '%s'", flip, path);
}
-static void update_one(const char *path, const char *prefix, int prefix_length)
+static void update_one(const char *path)
{
- const char *p = prefix_path(prefix, prefix_length, path);
- if (!verify_path(p)) {
+ if (!verify_path(path)) {
fprintf(stderr, "Ignoring path %s\n", path);
- goto free_return;
+ return;
}
if (mark_valid_only) {
- if (mark_ce_flags(p, CE_VALID, mark_valid_only == MARK_FLAG))
+ if (mark_ce_flags(path, CE_VALID, mark_valid_only == MARK_FLAG))
die("Unable to mark file %s", path);
- goto free_return;
+ return;
}
if (mark_skip_worktree_only) {
- if (mark_ce_flags(p, CE_SKIP_WORKTREE, mark_skip_worktree_only == MARK_FLAG))
+ if (mark_ce_flags(path, CE_SKIP_WORKTREE, mark_skip_worktree_only == MARK_FLAG))
die("Unable to mark file %s", path);
- goto free_return;
+ return;
}
if (force_remove) {
- if (remove_file_from_cache(p))
+ if (remove_file_from_cache(path))
die("git update-index: unable to remove %s", path);
report("remove '%s'", path);
- goto free_return;
+ return;
}
- if (process_path(p))
+ if (process_path(path))
die("Unable to process path %s", path);
report("add '%s'", path);
- free_return:
- if (p < path || p > path + strlen(path))
- free((char *)p);
}
static void read_index_info(int line_termination)
@@ -563,8 +560,9 @@ static int do_reupdate(int ac, const char **av,
const struct cache_entry *ce = active_cache[pos];
struct cache_entry *old = NULL;
int save_nr;
+ char *path;
- if (ce_stage(ce) || !ce_path_match(ce, &pathspec))
+ if (ce_stage(ce) || !ce_path_match(ce, &pathspec, NULL))
continue;
if (has_head)
old = read_one_ent(NULL, head_sha1,
@@ -579,7 +577,9 @@ static int do_reupdate(int ac, const char **av,
* or worse yet 'allow_replace', active_nr may decrease.
*/
save_nr = active_nr;
- update_one(ce->name + prefix_length, prefix, prefix_length);
+ path = xstrdup(ce->name);
+ update_one(path);
+ free(path);
if (save_nr != active_nr)
goto redo;
}
@@ -836,11 +836,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
setup_work_tree();
p = prefix_path(prefix, prefix_length, path);
- update_one(p, NULL, 0);
+ update_one(p);
if (set_executable_bit)
chmod_path(set_executable_bit, p);
- if (p < path || p > path + strlen(path))
- free((char *)p);
+ free((char *)p);
ctx.argc--;
ctx.argv++;
break;
@@ -879,11 +878,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
strbuf_swap(&buf, &nbuf);
}
p = prefix_path(prefix, prefix_length, buf.buf);
- update_one(p, NULL, 0);
+ update_one(p);
if (set_executable_bit)
chmod_path(set_executable_bit, p);
- if (p < buf.buf || p > buf.buf + buf.len)
- free((char *)p);
+ free((char *)p);
}
strbuf_release(&nbuf);
strbuf_release(&buf);
diff --git a/cache.h b/cache.h
index c9efe88..9f15744 100644
--- a/cache.h
+++ b/cache.h
@@ -3,7 +3,7 @@
#include "git-compat-util.h"
#include "strbuf.h"
-#include "hash.h"
+#include "hashmap.h"
#include "advice.h"
#include "gettext.h"
#include "convert.h"
@@ -130,12 +130,12 @@ struct stat_data {
};
struct cache_entry {
+ struct hashmap_entry ent;
struct stat_data ce_stat_data;
unsigned int ce_mode;
unsigned int ce_flags;
unsigned int ce_namelen;
unsigned char sha1[20];
- struct cache_entry *next;
char name[FLEX_ARRAY]; /* more */
};
@@ -159,7 +159,6 @@ struct cache_entry {
#define CE_ADDED (1 << 19)
#define CE_HASHED (1 << 20)
-#define CE_UNHASHED (1 << 21)
#define CE_WT_REMOVE (1 << 22) /* remove in work directory */
#define CE_CONFLICTED (1 << 23)
@@ -195,17 +194,18 @@ struct pathspec;
* Copy the sha1 and stat state of a cache entry from one to
* another. But we never change the name, or the hash state!
*/
-#define CE_STATE_MASK (CE_HASHED | CE_UNHASHED)
static inline void copy_cache_entry(struct cache_entry *dst,
const struct cache_entry *src)
{
- unsigned int state = dst->ce_flags & CE_STATE_MASK;
+ unsigned int state = dst->ce_flags & CE_HASHED;
/* Don't copy hash chain and name */
- memcpy(dst, src, offsetof(struct cache_entry, next));
+ memcpy(&dst->ce_stat_data, &src->ce_stat_data,
+ offsetof(struct cache_entry, name) -
+ offsetof(struct cache_entry, ce_stat_data));
/* Restore the hash state */
- dst->ce_flags = (dst->ce_flags & ~CE_STATE_MASK) | state;
+ dst->ce_flags = (dst->ce_flags & ~CE_HASHED) | state;
}
static inline unsigned create_ce_flags(unsigned stage)
@@ -277,8 +277,8 @@ struct index_state {
struct cache_time timestamp;
unsigned name_hash_initialized : 1,
initialized : 1;
- struct hash_table name_hash;
- struct hash_table dir_hash;
+ struct hashmap name_hash;
+ struct hashmap dir_hash;
};
extern struct index_state the_index;
@@ -316,7 +316,6 @@ extern void free_name_hash(struct index_state *istate);
#define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options))
#define cache_dir_exists(name, namelen) index_dir_exists(&the_index, (name), (namelen))
#define cache_file_exists(name, namelen, igncase) index_file_exists(&the_index, (name), (namelen), (igncase))
-#define cache_name_exists(name, namelen, igncase) index_name_exists(&the_index, (name), (namelen), (igncase))
#define cache_name_is_other(name, namelen) index_name_is_other(&the_index, (name), (namelen))
#define resolve_undo_clear() resolve_undo_clear_index(&the_index)
#define unmerge_cache_entry_at(at) unmerge_index_entry_at(&the_index, at)
@@ -467,7 +466,6 @@ extern int unmerged_index(const struct index_state *);
extern int verify_path(const char *path);
extern struct cache_entry *index_dir_exists(struct index_state *istate, const char *name, int namelen);
extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
-extern struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int igncase);
extern int index_name_pos(const struct index_state *, const char *name, int namelen);
#define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */
#define ADD_CACHE_OK_TO_REPLACE 2 /* Ok to replace file/directory */
@@ -487,8 +485,9 @@ extern int remove_file_from_index(struct index_state *, const char *path);
#define ADD_CACHE_IMPLICIT_DOT 32 /* internal to "git add -u/-A" */
extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);
extern int add_file_to_index(struct index_state *, const char *path, int flags);
-extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh);
+extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options);
extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b);
+extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce);
extern int index_name_is_other(const struct index_state *, const char *, int);
extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *);
@@ -498,11 +497,13 @@ extern void *read_blob_data_from_index(struct index_state *, const char *, unsig
#define CE_MATCH_RACY_IS_DIRTY 02
/* do stat comparison even if CE_SKIP_WORKTREE is true */
#define CE_MATCH_IGNORE_SKIP_WORKTREE 04
+/* ignore non-existent files during stat update */
+#define CE_MATCH_IGNORE_MISSING 0x08
+/* enable stat refresh */
+#define CE_MATCH_REFRESH 0x10
extern int ie_match_stat(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
extern int ie_modified(const struct index_state *, const struct cache_entry *, struct stat *, unsigned int);
-extern int ce_path_match(const struct cache_entry *ce, const struct pathspec *pathspec);
-
#define HASH_WRITE_OBJECT 1
#define HASH_FORMAT_CHECK 2
extern int index_fd(unsigned char *sha1, int fd, struct stat *st, enum object_type type, const char *path, unsigned flags);
@@ -737,8 +738,29 @@ enum sharedrepo {
};
int git_config_perm(const char *var, const char *value);
int adjust_shared_perm(const char *path);
-int safe_create_leading_directories(char *path);
-int safe_create_leading_directories_const(const char *path);
+
+/*
+ * Create the directory containing the named path, using care to be
+ * somewhat safe against races. Return one of the scld_error values
+ * to indicate success/failure.
+ *
+ * SCLD_VANISHED indicates that one of the ancestor directories of the
+ * path existed at one point during the function call and then
+ * suddenly vanished, probably because another process pruned the
+ * directory while we were working. To be robust against this kind of
+ * race, callers might want to try invoking the function again when it
+ * returns SCLD_VANISHED.
+ */
+enum scld_error {
+ SCLD_OK = 0,
+ SCLD_FAILED = -1,
+ SCLD_PERMS = -2,
+ SCLD_EXISTS = -3,
+ SCLD_VANISHED = -4
+};
+enum scld_error safe_create_leading_directories(char *path);
+enum scld_error safe_create_leading_directories_const(const char *path);
+
int mkdir_in_gitdir(const char *path);
extern void home_config_paths(char **global, char **xdg, char *file);
extern char *expand_user_path(const char *path);
@@ -894,9 +916,12 @@ extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
extern int interpret_branch_name(const char *str, int len, struct strbuf *);
extern int get_sha1_mb(const char *str, unsigned char *sha1);
-extern int refname_match(const char *abbrev_name, const char *full_name, const char **rules);
-extern const char *ref_rev_parse_rules[];
-#define ref_fetch_rules ref_rev_parse_rules
+/*
+ * Return true iff abbrev_name is a possible abbreviation for
+ * full_name according to the rules defined by ref_rev_parse_rules in
+ * refs.c.
+ */
+extern int refname_match(const char *abbrev_name, const char *full_name);
extern int create_symref(const char *ref, const char *refs_heads_master, const char *logmsg);
extern int validate_headref(const char *ref);
diff --git a/compat/mingw.c b/compat/mingw.c
index fecb98b..e9892f8 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -304,23 +304,6 @@ int mingw_open (const char *filename, int oflags, ...)
return fd;
}
-#undef write
-ssize_t mingw_write(int fd, const void *buf, size_t count)
-{
- /*
- * While write() calls to a file on a local disk are translated
- * into WriteFile() calls with a maximum size of 64KB on Windows
- * XP and 256KB on Vista, no such cap is placed on writes to
- * files over the network on Windows XP. Unfortunately, there
- * seems to be a limit of 32MB-28KB on X64 and 64MB-32KB on x86;
- * bigger writes fail on Windows XP.
- * So we cap to a nice 31MB here to avoid write failures over
- * the net without changing the number of WriteFile() calls in
- * the local case.
- */
- return write(fd, buf, min(count, 31 * 1024 * 1024));
-}
-
static BOOL WINAPI ctrl_ignore(DWORD type)
{
return TRUE;
diff --git a/compat/mingw.h b/compat/mingw.h
index 92cd728..e033e72 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -180,9 +180,6 @@ int mingw_rmdir(const char *path);
int mingw_open (const char *filename, int oflags, ...);
#define open mingw_open
-ssize_t mingw_write(int fd, const void *buf, size_t count);
-#define write mingw_write
-
int mingw_fgetc(FILE *stream);
#define fgetc mingw_fgetc
diff --git a/config.c b/config.c
index d969a5a..314d8ee 100644
--- a/config.c
+++ b/config.c
@@ -84,8 +84,12 @@ static int handle_path_include(const char *path, struct config_include_data *inc
{
int ret = 0;
struct strbuf buf = STRBUF_INIT;
- char *expanded = expand_user_path(path);
+ char *expanded;
+ if (!path)
+ return config_error_nonbool("include.path");
+
+ expanded = expand_user_path(path);
if (!expanded)
return error("Could not expand include path '%s'", path);
path = expanded;
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 8aaf214..9525343 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1499,6 +1499,12 @@ _git_mergetool ()
_git_merge_base ()
{
+ case "$cur" in
+ --*)
+ __gitcomp "--octopus --independent --is-ancestor --fork-point"
+ return
+ ;;
+ esac
__gitcomp_nl "$(__git_refs)"
}
@@ -1631,7 +1637,7 @@ _git_rebase ()
--preserve-merges --stat --no-stat
--committer-date-is-author-date --ignore-date
--ignore-whitespace --whitespace=
- --autosquash
+ --autosquash --fork-point --no-fork-point
"
return
diff --git a/contrib/git-resurrect.sh b/contrib/git-resurrect.sh
index a4ed4c3..d7e97bb 100755
--- a/contrib/git-resurrect.sh
+++ b/contrib/git-resurrect.sh
@@ -10,6 +10,7 @@ is rather slow but allows you to resurrect other people's topic
branches."
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC="\
git resurrect $USAGE
--
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 7d7af03..dc59a91 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -9,10 +9,10 @@ if [ $# -eq 0 ]; then
fi
OPTS_SPEC="\
git subtree add --prefix=<prefix> <commit>
-git subtree add --prefix=<prefix> <repository> <commit>
+git subtree add --prefix=<prefix> <repository> <ref>
git subtree merge --prefix=<prefix> <commit>
-git subtree pull --prefix=<prefix> <repository> <refspec...>
-git subtree push --prefix=<prefix> <repository> <refspec...>
+git subtree pull --prefix=<prefix> <repository> <ref>
+git subtree push --prefix=<prefix> <repository> <ref>
git subtree split --prefix=<prefix> <commit...>
--
h,help show the help
@@ -489,6 +489,12 @@ ensure_clean()
fi
}
+ensure_valid_ref_format()
+{
+ git check-ref-format "refs/heads/$1" ||
+ die "'$1' does not look like a ref"
+}
+
cmd_add()
{
if [ -e "$dir" ]; then
@@ -508,8 +514,7 @@ cmd_add()
# specified directory. Allowing a refspec might be
# misleading because we won't do anything with any other
# branches fetched via the refspec.
- git rev-parse -q --verify "$2^{commit}" >/dev/null ||
- die "'$2' does not refer to a commit"
+ ensure_valid_ref_format "$2"
"cmd_add_repository" "$@"
else
@@ -699,7 +704,11 @@ cmd_merge()
cmd_pull()
{
+ if [ $# -ne 2 ]; then
+ die "You must provide <repository> <ref>"
+ fi
ensure_clean
+ ensure_valid_ref_format "$2"
git fetch "$@" || exit $?
revs=FETCH_HEAD
set -- $revs
@@ -709,8 +718,9 @@ cmd_pull()
cmd_push()
{
if [ $# -ne 2 ]; then
- die "You must provide <repository> <refspec>"
+ die "You must provide <repository> <ref>"
fi
+ ensure_valid_ref_format "$2"
if [ -e "$dir" ]; then
repository=$1
refspec=$2
diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt
index e0957ee..02669b1 100644
--- a/contrib/subtree/git-subtree.txt
+++ b/contrib/subtree/git-subtree.txt
@@ -9,10 +9,10 @@ git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
-'git subtree' add -P <prefix> <refspec>
-'git subtree' add -P <prefix> <repository> <refspec>
-'git subtree' pull -P <prefix> <repository> <refspec...>
-'git subtree' push -P <prefix> <repository> <refspec...>
+'git subtree' add -P <prefix> <commit>
+'git subtree' add -P <prefix> <repository> <ref>
+'git subtree' pull -P <prefix> <repository> <ref>
+'git subtree' push -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]
@@ -68,7 +68,7 @@ COMMANDS
--------
add::
Create the <prefix> subtree by importing its contents
- from the given <refspec> or <repository> and remote <refspec>.
+ from the given <commit> or <repository> and remote <ref>.
A new commit is created automatically, joining the imported
project's history with your own. With '--squash', imports
only a single commit from the subproject, rather than its
@@ -90,13 +90,13 @@ merge::
pull::
Exactly like 'merge', but parallels 'git pull' in that
- it fetches the given commit from the specified remote
+ it fetches the given ref from the specified remote
repository.
push::
Does a 'split' (see below) using the <prefix> supplied
and then does a 'git push' to push the result to the
- repository and refspec. This can be used to push your
+ repository and ref. This can be used to push your
subtree to different branches of the remote repository.
split::
diff --git a/diff-lib.c b/diff-lib.c
index 346cac6..2eddc66 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -11,6 +11,7 @@
#include "unpack-trees.h"
#include "refs.h"
#include "submodule.h"
+#include "dir.h"
/*
* diff-files
@@ -108,7 +109,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
if (diff_can_quit_early(&revs->diffopt))
break;
- if (!ce_path_match(ce, &revs->prune_data))
+ if (!ce_path_match(ce, &revs->prune_data, NULL))
continue;
if (ce_stage(ce)) {
@@ -438,7 +439,7 @@ static int oneway_diff(const struct cache_entry * const *src,
if (tree == o->df_conflict_entry)
tree = NULL;
- if (ce_path_match(idx ? idx : tree, &revs->prune_data)) {
+ if (ce_path_match(idx ? idx : tree, &revs->prune_data, NULL)) {
do_oneway_diff(o, idx, tree);
if (diff_can_quit_early(&revs->diffopt)) {
o->exiting_early = 1;
diff --git a/diff.c b/diff.c
index 6b4cd0e..e800666 100644
--- a/diff.c
+++ b/diff.c
@@ -4139,9 +4139,9 @@ void diff_debug_filespec(struct diff_filespec *s, int x, const char *one)
DIFF_FILE_VALID(s) ? "valid" : "invalid",
s->mode,
s->sha1_valid ? sha1_to_hex(s->sha1) : "");
- fprintf(stderr, "queue[%d] %s size %lu flags %d\n",
+ fprintf(stderr, "queue[%d] %s size %lu\n",
x, one ? one : "",
- s->size, s->xfrm_flags);
+ s->size);
}
void diff_debug_filepair(const struct diff_filepair *p, int i)
@@ -4697,6 +4697,38 @@ static int diff_filespec_is_identical(struct diff_filespec *one,
return !memcmp(one->data, two->data, one->size);
}
+static int diff_filespec_check_stat_unmatch(struct diff_filepair *p)
+{
+ if (p->done_skip_stat_unmatch)
+ return p->skip_stat_unmatch_result;
+
+ p->done_skip_stat_unmatch = 1;
+ p->skip_stat_unmatch_result = 0;
+ /*
+ * 1. Entries that come from stat info dirtiness
+ * always have both sides (iow, not create/delete),
+ * one side of the object name is unknown, with
+ * the same mode and size. Keep the ones that
+ * do not match these criteria. They have real
+ * differences.
+ *
+ * 2. At this point, the file is known to be modified,
+ * with the same mode and size, and the object
+ * name of one side is unknown. Need to inspect
+ * the identical contents.
+ */
+ if (!DIFF_FILE_VALID(p->one) || /* (1) */
+ !DIFF_FILE_VALID(p->two) ||
+ (p->one->sha1_valid && p->two->sha1_valid) ||
+ (p->one->mode != p->two->mode) ||
+ diff_populate_filespec(p->one, 1) ||
+ diff_populate_filespec(p->two, 1) ||
+ (p->one->size != p->two->size) ||
+ !diff_filespec_is_identical(p->one, p->two)) /* (2) */
+ p->skip_stat_unmatch_result = 1;
+ return p->skip_stat_unmatch_result;
+}
+
static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
{
int i;
@@ -4707,27 +4739,7 @@ static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
- /*
- * 1. Entries that come from stat info dirtiness
- * always have both sides (iow, not create/delete),
- * one side of the object name is unknown, with
- * the same mode and size. Keep the ones that
- * do not match these criteria. They have real
- * differences.
- *
- * 2. At this point, the file is known to be modified,
- * with the same mode and size, and the object
- * name of one side is unknown. Need to inspect
- * the identical contents.
- */
- if (!DIFF_FILE_VALID(p->one) || /* (1) */
- !DIFF_FILE_VALID(p->two) ||
- (p->one->sha1_valid && p->two->sha1_valid) ||
- (p->one->mode != p->two->mode) ||
- diff_populate_filespec(p->one, 1) ||
- diff_populate_filespec(p->two, 1) ||
- (p->one->size != p->two->size) ||
- !diff_filespec_is_identical(p->one, p->two)) /* (2) */
+ if (diff_filespec_check_stat_unmatch(p))
diff_q(&outq, p);
else {
/*
@@ -4890,6 +4902,7 @@ void diff_change(struct diff_options *options,
unsigned old_dirty_submodule, unsigned new_dirty_submodule)
{
struct diff_filespec *one, *two;
+ struct diff_filepair *p;
if (S_ISGITLINK(old_mode) && S_ISGITLINK(new_mode) &&
is_submodule_ignored(concatpath, options))
@@ -4916,10 +4929,16 @@ void diff_change(struct diff_options *options,
fill_filespec(two, new_sha1, new_sha1_valid, new_mode);
one->dirty_submodule = old_dirty_submodule;
two->dirty_submodule = new_dirty_submodule;
+ p = diff_queue(&diff_queued_diff, one, two);
- diff_queue(&diff_queued_diff, one, two);
- if (!DIFF_OPT_TST(options, DIFF_FROM_CONTENTS))
- DIFF_OPT_SET(options, HAS_CHANGES);
+ if (DIFF_OPT_TST(options, DIFF_FROM_CONTENTS))
+ return;
+
+ if (DIFF_OPT_TST(options, QUICK) && options->skip_stat_unmatch &&
+ !diff_filespec_check_stat_unmatch(p))
+ return;
+
+ DIFF_OPT_SET(options, HAS_CHANGES);
}
struct diff_filepair *diff_unmerge(struct diff_options *options, const char *path)
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 6c7a72f..9b4f068 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -4,7 +4,7 @@
#include "cache.h"
#include "diff.h"
#include "diffcore.h"
-#include "hash.h"
+#include "hashmap.h"
#include "progress.h"
/* Table of rename/copy destinations */
@@ -243,137 +243,82 @@ static int score_compare(const void *a_, const void *b_)
}
struct file_similarity {
- int src_dst, index;
+ struct hashmap_entry entry;
+ int index;
struct diff_filespec *filespec;
- struct file_similarity *next;
};
-static int find_identical_files(struct file_similarity *src,
- struct file_similarity *dst,
+static unsigned int hash_filespec(struct diff_filespec *filespec)
+{
+ unsigned int hash;
+ if (!filespec->sha1_valid) {
+ if (diff_populate_filespec(filespec, 0))
+ return 0;
+ hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1);
+ }
+ memcpy(&hash, filespec->sha1, sizeof(hash));
+ return hash;
+}
+
+static int find_identical_files(struct hashmap *srcs,
+ int dst_index,
struct diff_options *options)
{
int renames = 0;
+ struct diff_filespec *target = rename_dst[dst_index].two;
+ struct file_similarity *p, *best, dst;
+ int i = 100, best_score = -1;
+
/*
- * Walk over all the destinations ...
+ * Find the best source match for specified destination.
*/
- do {
- struct diff_filespec *target = dst->filespec;
- struct file_similarity *p, *best;
- int i = 100, best_score = -1;
-
- /*
- * .. to find the best source match
- */
- best = NULL;
- for (p = src; p; p = p->next) {
- int score;
- struct diff_filespec *source = p->filespec;
-
- /* False hash collision? */
- if (hashcmp(source->sha1, target->sha1))
- continue;
- /* Non-regular files? If so, the modes must match! */
- if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) {
- if (source->mode != target->mode)
- continue;
- }
- /* Give higher scores to sources that haven't been used already */
- score = !source->rename_used;
- if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY)
+ best = NULL;
+ hashmap_entry_init(&dst, hash_filespec(target));
+ for (p = hashmap_get(srcs, &dst, NULL); p; p = hashmap_get_next(srcs, p)) {
+ int score;
+ struct diff_filespec *source = p->filespec;
+
+ /* False hash collision? */
+ if (hashcmp(source->sha1, target->sha1))
+ continue;
+ /* Non-regular files? If so, the modes must match! */
+ if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) {
+ if (source->mode != target->mode)
continue;
- score += basename_same(source, target);
- if (score > best_score) {
- best = p;
- best_score = score;
- if (score == 2)
- break;
- }
-
- /* Too many identical alternatives? Pick one */
- if (!--i)
- break;
}
- if (best) {
- record_rename_pair(dst->index, best->index, MAX_SCORE);
- renames++;
+ /* Give higher scores to sources that haven't been used already */
+ score = !source->rename_used;
+ if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY)
+ continue;
+ score += basename_same(source, target);
+ if (score > best_score) {
+ best = p;
+ best_score = score;
+ if (score == 2)
+ break;
}
- } while ((dst = dst->next) != NULL);
- return renames;
-}
-static void free_similarity_list(struct file_similarity *p)
-{
- while (p) {
- struct file_similarity *entry = p;
- p = p->next;
- free(entry);
+ /* Too many identical alternatives? Pick one */
+ if (!--i)
+ break;
}
-}
-
-static int find_same_files(void *ptr, void *data)
-{
- int ret;
- struct file_similarity *p = ptr;
- struct file_similarity *src = NULL, *dst = NULL;
- struct diff_options *options = data;
-
- /* Split the hash list up into sources and destinations */
- do {
- struct file_similarity *entry = p;
- p = p->next;
- if (entry->src_dst < 0) {
- entry->next = src;
- src = entry;
- } else {
- entry->next = dst;
- dst = entry;
- }
- } while (p);
-
- /*
- * If we have both sources *and* destinations, see if
- * we can match them up
- */
- ret = (src && dst) ? find_identical_files(src, dst, options) : 0;
-
- /* Free the hashes and return the number of renames found */
- free_similarity_list(src);
- free_similarity_list(dst);
- return ret;
-}
-
-static unsigned int hash_filespec(struct diff_filespec *filespec)
-{
- unsigned int hash;
- if (!filespec->sha1_valid) {
- if (diff_populate_filespec(filespec, 0))
- return 0;
- hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1);
+ if (best) {
+ record_rename_pair(dst_index, best->index, MAX_SCORE);
+ renames++;
}
- memcpy(&hash, filespec->sha1, sizeof(hash));
- return hash;
+ return renames;
}
-static void insert_file_table(struct hash_table *table, int src_dst, int index, struct diff_filespec *filespec)
+static void insert_file_table(struct hashmap *table, int index, struct diff_filespec *filespec)
{
- void **pos;
- unsigned int hash;
struct file_similarity *entry = xmalloc(sizeof(*entry));
- entry->src_dst = src_dst;
entry->index = index;
entry->filespec = filespec;
- entry->next = NULL;
-
- hash = hash_filespec(filespec);
- pos = insert_hash(hash, entry, table);
- /* We already had an entry there? */
- if (pos) {
- entry->next = *pos;
- *pos = entry;
- }
+ hashmap_entry_init(entry, hash_filespec(filespec));
+ hashmap_add(table, entry);
}
/*
@@ -385,24 +330,22 @@ static void insert_file_table(struct hash_table *table, int src_dst, int index,
*/
static int find_exact_renames(struct diff_options *options)
{
- int i;
- struct hash_table file_table;
+ int i, renames = 0;
+ struct hashmap file_table;
- init_hash(&file_table);
- preallocate_hash(&file_table, rename_src_nr + rename_dst_nr);
+ /* Add all sources to the hash table */
+ hashmap_init(&file_table, NULL, rename_src_nr);
for (i = 0; i < rename_src_nr; i++)
- insert_file_table(&file_table, -1, i, rename_src[i].p->one);
+ insert_file_table(&file_table, i, rename_src[i].p->one);
+ /* Walk the destinations and find best source match */
for (i = 0; i < rename_dst_nr; i++)
- insert_file_table(&file_table, 1, i, rename_dst[i].two);
-
- /* Find the renames */
- i = for_each_hash(&file_table, find_same_files, options);
+ renames += find_identical_files(&file_table, i, options);
- /* .. and free the hash data structure */
- free_hash(&file_table);
+ /* Free the hash data structure and entries */
+ hashmap_free(&file_table, 1);
- return i;
+ return renames;
}
#define NUM_CANDIDATE_PER_DST 4
diff --git a/diffcore.h b/diffcore.h
index 1c16c85..1315cfd 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -29,10 +29,8 @@ struct diff_filespec {
char *path;
void *data;
void *cnt_data;
- const char *funcname_pattern_ident;
unsigned long size;
int count; /* Reference count */
- int xfrm_flags; /* for use by the xfrm */
int rename_used; /* Count of rename users */
unsigned short mode; /* file mode */
unsigned sha1_valid : 1; /* if true, use sha1 and trust mode;
@@ -43,13 +41,13 @@ struct diff_filespec {
unsigned should_free : 1; /* data should be free()'ed */
unsigned should_munmap : 1; /* data should be munmap()'ed */
unsigned dirty_submodule : 2; /* For submodules: its work tree is dirty */
- unsigned is_stdin : 1;
#define DIRTY_SUBMODULE_UNTRACKED 1
#define DIRTY_SUBMODULE_MODIFIED 2
+ unsigned is_stdin : 1;
unsigned has_more_entries : 1; /* only appear in combined diff */
- struct userdiff_driver *driver;
/* data should be considered "binary"; -1 means "don't know yet" */
- int is_binary;
+ int is_binary : 2;
+ struct userdiff_driver *driver;
};
extern struct diff_filespec *alloc_filespec(const char *);
@@ -70,6 +68,8 @@ struct diff_filepair {
unsigned broken_pair : 1;
unsigned renamed_pair : 1;
unsigned is_unmerged : 1;
+ unsigned done_skip_stat_unmatch : 1;
+ unsigned skip_stat_unmatch_result : 1;
};
#define DIFF_PAIR_UNMERGED(p) ((p)->is_unmerged)
diff --git a/dir.c b/dir.c
index d10a63f..98bb50f 100644
--- a/dir.c
+++ b/dir.c
@@ -195,6 +195,9 @@ int within_depth(const char *name, int namelen,
return 1;
}
+#define DO_MATCH_EXCLUDE 1
+#define DO_MATCH_DIRECTORY 2
+
/*
* Does 'match' match the given name?
* A match is found if
@@ -208,7 +211,7 @@ int within_depth(const char *name, int namelen,
* It returns 0 when there is no match.
*/
static int match_pathspec_item(const struct pathspec_item *item, int prefix,
- const char *name, int namelen)
+ const char *name, int namelen, unsigned flags)
{
/* name/namelen has prefix cut off by caller */
const char *match = item->match + prefix;
@@ -218,7 +221,7 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
* The normal call pattern is:
* 1. prefix = common_prefix_len(ps);
* 2. prune something, or fill_directory
- * 3. match_pathspec_depth()
+ * 3. match_pathspec()
*
* 'prefix' at #1 may be shorter than the command's prefix and
* it's ok for #2 to match extra files. Those extras will be
@@ -257,7 +260,11 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
if (match[matchlen-1] == '/' || name[matchlen] == '/')
return MATCHED_RECURSIVELY;
- }
+ } else if ((flags & DO_MATCH_DIRECTORY) &&
+ match[matchlen - 1] == '/' &&
+ namelen == matchlen - 1 &&
+ !ps_strncmp(item, match, name, namelen))
+ return MATCHED_EXACTLY;
if (item->nowildcard_len < item->len &&
!git_fnmatch(item, match, name,
@@ -282,12 +289,12 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix,
* pathspec did not match any names, which could indicate that the
* user mistyped the nth pathspec.
*/
-static int match_pathspec_depth_1(const struct pathspec *ps,
- const char *name, int namelen,
- int prefix, char *seen,
- int exclude)
+static int do_match_pathspec(const struct pathspec *ps,
+ const char *name, int namelen,
+ int prefix, char *seen,
+ unsigned flags)
{
- int i, retval = 0;
+ int i, retval = 0, exclude = flags & DO_MATCH_EXCLUDE;
GUARD_PATHSPEC(ps,
PATHSPEC_FROMTOP |
@@ -327,7 +334,8 @@ static int match_pathspec_depth_1(const struct pathspec *ps,
*/
if (seen && ps->items[i].magic & PATHSPEC_EXCLUDE)
seen[i] = MATCHED_FNMATCH;
- how = match_pathspec_item(ps->items+i, prefix, name, namelen);
+ how = match_pathspec_item(ps->items+i, prefix, name,
+ namelen, flags);
if (ps->recursive &&
(ps->magic & PATHSPEC_MAXDEPTH) &&
ps->max_depth != -1 &&
@@ -350,15 +358,19 @@ static int match_pathspec_depth_1(const struct pathspec *ps,
return retval;
}
-int match_pathspec_depth(const struct pathspec *ps,
- const char *name, int namelen,
- int prefix, char *seen)
+int match_pathspec(const struct pathspec *ps,
+ const char *name, int namelen,
+ int prefix, char *seen, int is_dir)
{
int positive, negative;
- positive = match_pathspec_depth_1(ps, name, namelen, prefix, seen, 0);
+ unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0;
+ positive = do_match_pathspec(ps, name, namelen,
+ prefix, seen, flags);
if (!(ps->magic & PATHSPEC_EXCLUDE) || !positive)
return positive;
- negative = match_pathspec_depth_1(ps, name, namelen, prefix, seen, 1);
+ negative = do_match_pathspec(ps, name, namelen,
+ prefix, seen,
+ flags | DO_MATCH_EXCLUDE);
return negative ? 0 : positive;
}
@@ -1511,8 +1523,13 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;
dir = opendir(path->buf);
if (!dir) {
- /* an empty dir could be removed even if it is unreadble */
- if (!keep_toplevel)
+ if (errno == ENOENT)
+ return keep_toplevel ? -1 : 0;
+ else if (errno == EACCES && !keep_toplevel)
+ /*
+ * An empty dir could be removable even if it
+ * is unreadable:
+ */
return rmdir(path->buf);
else
return -1;
@@ -1528,13 +1545,21 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
strbuf_setlen(path, len);
strbuf_addstr(path, e->d_name);
- if (lstat(path->buf, &st))
- ; /* fall thru */
- else if (S_ISDIR(st.st_mode)) {
+ if (lstat(path->buf, &st)) {
+ if (errno == ENOENT)
+ /*
+ * file disappeared, which is what we
+ * wanted anyway
+ */
+ continue;
+ /* fall thru */
+ } else if (S_ISDIR(st.st_mode)) {
if (!remove_dir_recurse(path, flag, &kept_down))
continue; /* happy */
- } else if (!only_empty && !unlink(path->buf))
+ } else if (!only_empty &&
+ (!unlink(path->buf) || errno == ENOENT)) {
continue; /* happy, too */
+ }
/* path too long, stat fails, or non-directory still exists */
ret = -1;
@@ -1544,7 +1569,7 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
strbuf_setlen(path, original_len);
if (!ret && !keep_toplevel && !kept_down)
- ret = rmdir(path->buf);
+ ret = (!rmdir(path->buf) || errno == ENOENT) ? 0 : -1;
else if (kept_up)
/*
* report the uplevel that it is not an error that we
diff --git a/dir.h b/dir.h
index 9b7e4e7..55e5345 100644
--- a/dir.h
+++ b/dir.h
@@ -132,9 +132,9 @@ struct dir_struct {
extern int simple_length(const char *match);
extern int no_wildcard(const char *string);
extern char *common_prefix(const struct pathspec *pathspec);
-extern int match_pathspec_depth(const struct pathspec *pathspec,
- const char *name, int namelen,
- int prefix, char *seen);
+extern int match_pathspec(const struct pathspec *pathspec,
+ const char *name, int namelen,
+ int prefix, char *seen, int is_dir);
extern int within_depth(const char *name, int namelen, int depth, int max_depth);
extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec);
@@ -205,4 +205,22 @@ extern int git_fnmatch(const struct pathspec_item *item,
const char *pattern, const char *string,
int prefix);
+static inline int ce_path_match(const struct cache_entry *ce,
+ const struct pathspec *pathspec,
+ char *seen)
+{
+ return match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen,
+ S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode));
+}
+
+static inline int dir_path_match(const struct dir_entry *ent,
+ const struct pathspec *pathspec,
+ int prefix, char *seen)
+{
+ int has_trailing_dir = ent->len && ent->name[ent->len - 1] == '/';
+ int len = has_trailing_dir ? ent->len - 1 : ent->len;
+ return match_pathspec(pathspec, ent->name, len, prefix, seen,
+ has_trailing_dir);
+}
+
#endif
diff --git a/fetch-pack.c b/fetch-pack.c
index d52de74..90fdd49 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -506,7 +506,7 @@ static void filter_refs(struct fetch_pack_args *args,
next = ref->next;
if (!memcmp(ref->name, "refs/", 5) &&
- check_refname_format(ref->name + 5, 0))
+ check_refname_format(ref->name, 0))
; /* trash */
else {
while (i < nr_sought) {
diff --git a/git-am.sh b/git-am.sh
index bbea430..78517f2 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -4,6 +4,7 @@
SUBDIRECTORY_OK=Yes
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=t
OPTIONS_SPEC="\
git am [options] [(<mbox>|<Maildir>)...]
git am [options] (--continue | --skip | --abort)
@@ -37,6 +38,7 @@ abort restore the original branch and abort the patching operation.
committer-date-is-author-date lie about committer date
ignore-date use current timestamp for author date
rerere-autoupdate update the index with reused conflict resolution if possible
+S,gpg-sign? GPG-sign commits
rebasing* (internal use for git-rebase)"
. git-sh-setup
@@ -374,6 +376,7 @@ git_apply_opt=
committer_date_is_author_date=
ignore_date=
allow_rerere_autoupdate=
+gpg_sign_opt=
if test "$(git config --bool --get am.keepcr)" = true
then
@@ -413,14 +416,14 @@ it will be removed. Please do not use it anymore."
abort=t ;;
--rebasing)
rebasing=t threeway=t ;;
- --resolvemsg)
- shift; resolvemsg=$1 ;;
- --whitespace|--directory|--exclude|--include)
- git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
- -C|-p)
- git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
- --patch-format)
- shift ; patch_format="$1" ;;
+ --resolvemsg=*)
+ resolvemsg="${1#--resolvemsg=}" ;;
+ --whitespace=*|--directory=*|--exclude=*|--include=*)
+ git_apply_opt="$git_apply_opt $(sq "$1")" ;;
+ -C*|-p*)
+ git_apply_opt="$git_apply_opt $(sq "$1")" ;;
+ --patch-format=*)
+ patch_format="${1#--patch-format=}" ;;
--reject|--ignore-whitespace|--ignore-space-change)
git_apply_opt="$git_apply_opt $1" ;;
--committer-date-is-author-date)
@@ -435,6 +438,10 @@ it will be removed. Please do not use it anymore."
keepcr=t ;;
--no-keep-cr)
keepcr=f ;;
+ --gpg-sign)
+ gpg_sign_opt=-S ;;
+ --gpg-sign=*)
+ gpg_sign_opt="-S${1#--gpg-sign=}" ;;
--)
shift; break ;;
*)
@@ -899,7 +906,8 @@ did you forget to use 'git add'?"
GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
export GIT_COMMITTER_DATE
fi &&
- git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
+ git commit-tree ${parent:+-p} $parent ${gpg_sign_opt:+"$gpg_sign_opt"} $tree \
+ <"$dotest/final-commit"
) &&
git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
stop_here $this
diff --git a/git-compat-util.h b/git-compat-util.h
index cbd86c3..614a5e9 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -480,9 +480,15 @@ extern FILE *git_fopen(const char*, const char*);
#endif
#ifdef SNPRINTF_RETURNS_BOGUS
+#ifdef snprintf
+#undef snprintf
+#endif
#define snprintf git_snprintf
extern int git_snprintf(char *str, size_t maxsize,
const char *format, ...);
+#ifdef vsnprintf
+#undef vsnprintf
+#endif
#define vsnprintf git_vsnprintf
extern int git_vsnprintf(char *str, size_t maxsize,
const char *format, va_list ap);
diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN
index 0a1f8d4..a9ea218 100755
--- a/git-gui/GIT-VERSION-GEN
+++ b/git-gui/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=0.18.GITGUI
+DEF_VER=0.19.GITGUI
LF='
'
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index db46ac5..cf2209b 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -3224,18 +3224,28 @@ unset i
# -- Diff and Commit Area
#
-${NS}::panedwindow .vpane.lower -orient vertical
-${NS}::frame .vpane.lower.commarea
-${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500
-.vpane.lower add .vpane.lower.diff
-.vpane.lower add .vpane.lower.commarea
-.vpane add .vpane.lower
-if {$use_ttk} {
- .vpane.lower pane .vpane.lower.diff -weight 1
- .vpane.lower pane .vpane.lower.commarea -weight 0
+if {$have_tk85} {
+ ${NS}::panedwindow .vpane.lower -orient vertical
+ ${NS}::frame .vpane.lower.commarea
+ ${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500
+ .vpane.lower add .vpane.lower.diff
+ .vpane.lower add .vpane.lower.commarea
+ .vpane add .vpane.lower
+ if {$use_ttk} {
+ .vpane.lower pane .vpane.lower.diff -weight 1
+ .vpane.lower pane .vpane.lower.commarea -weight 0
+ } else {
+ .vpane.lower paneconfigure .vpane.lower.diff -stretch always
+ .vpane.lower paneconfigure .vpane.lower.commarea -stretch never
+ }
} else {
- .vpane.lower paneconfigure .vpane.lower.diff -stretch always
- .vpane.lower paneconfigure .vpane.lower.commarea -stretch never
+ frame .vpane.lower -height 300 -width 400
+ frame .vpane.lower.commarea
+ frame .vpane.lower.diff -relief sunken -borderwidth 1
+ pack .vpane.lower.diff -fill both -expand 1
+ pack .vpane.lower.commarea -side bottom -fill x
+ .vpane add .vpane.lower
+ .vpane paneconfigure .vpane.lower -sticky nsew
}
# -- Commit Area Buttons
diff --git a/git-gui/po/bg.po b/git-gui/po/bg.po
new file mode 100644
index 0000000..89b3a4e
--- /dev/null
+++ b/git-gui/po/bg.po
@@ -0,0 +1,2694 @@
+# Bulgarian translation of git-gui po-file.
+# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>.
+# This file is distributed under the same license as the git package.
+# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: git-gui master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-01-13 20:45+0200\n"
+"PO-Revision-Date: 2014-01-13 21:31+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: git-gui.sh:859
+#, tcl-format
+msgid "Invalid font specified in %s:"
+msgstr "Указан е неправилен шрифт в %s:"
+
+#: git-gui.sh:912
+msgid "Main Font"
+msgstr "Основен шрифт"
+
+#: git-gui.sh:913
+msgid "Diff/Console Font"
+msgstr "Шрифт за разликите/конзолата"
+
+#: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045
+#: git-gui.sh:1064 git-gui.sh:3115
+msgid "git-gui: fatal error"
+msgstr "git-gui: фатална грешка"
+
+#: git-gui.sh:929
+msgid "Cannot find git in PATH."
+msgstr "Командата git липсва в пътя (PATH)."
+
+#: git-gui.sh:956
+msgid "Cannot parse Git version string:"
+msgstr "Низът с версията на Git не може да бъде интерпретиран:"
+
+#: git-gui.sh:981
+#, tcl-format
+msgid ""
+"Git version cannot be determined.\n"
+"\n"
+"%s claims it is version '%s'.\n"
+"\n"
+"%s requires at least Git 1.5.0 or later.\n"
+"\n"
+"Assume '%s' is version 1.5.0?\n"
+msgstr ""
+"Версията на Git не може да бъде определена.\n"
+"\n"
+"Версията на %s изглежда, че е „%s“.\n"
+"\n"
+"%s изисква Git, версия поне 1.5.0.\n"
+"\n"
+"Да се приеме ли, че „%s“ е версия 1.5.0?\n"
+
+#: git-gui.sh:1278
+msgid "Git directory not found:"
+msgstr "Директорията на Git не е открита:"
+
+#: git-gui.sh:1312
+msgid "Cannot move to top of working directory:"
+msgstr "Не може да се премине към родителската директория."
+
+#: git-gui.sh:1320
+msgid "Cannot use bare repository:"
+msgstr "Голо хранилище не може да се използва:"
+
+#: git-gui.sh:1328
+msgid "No working directory"
+msgstr "Работната директория липсва"
+
+#: git-gui.sh:1500 lib/checkout_op.tcl:306
+msgid "Refreshing file status..."
+msgstr "Обновяване на състоянието на файла…"
+
+#: git-gui.sh:1560
+msgid "Scanning for modified files ..."
+msgstr "Проверка за променени файлове…"
+
+#: git-gui.sh:1632
+msgid "Calling prepare-commit-msg hook..."
+msgstr "Куката prepare-commit-msg се изпълнява в момента…"
+
+#: git-gui.sh:1649
+msgid "Commit declined by prepare-commit-msg hook."
+msgstr "Подаването е отхвърлено от куката prepare-commit-msg."
+
+#: git-gui.sh:1807 lib/browser.tcl:252
+msgid "Ready."
+msgstr "Готово."
+
+#: git-gui.sh:1965
+#, tcl-format
+msgid "Displaying only %s of %s files."
+msgstr "Показване на само %s от %s файла."
+
+#: git-gui.sh:2091
+msgid "Unmodified"
+msgstr "Непроменен"
+
+#: git-gui.sh:2093
+msgid "Modified, not staged"
+msgstr "Променен, но не е в индекса"
+
+#: git-gui.sh:2094 git-gui.sh:2106
+msgid "Staged for commit"
+msgstr "В индекса за подаване"
+
+#: git-gui.sh:2095 git-gui.sh:2107
+msgid "Portions staged for commit"
+msgstr "Части са в индекса за подаване"
+
+#: git-gui.sh:2096 git-gui.sh:2108
+msgid "Staged for commit, missing"
+msgstr "В индекса за подаване, но липсва"
+
+#: git-gui.sh:2098
+msgid "File type changed, not staged"
+msgstr "Видът на файла е сменен, но не е в индекса"
+
+#: git-gui.sh:2099 git-gui.sh:2100
+msgid "File type changed, old type staged for commit"
+msgstr "Видът на файла е сменен, в индекса е старият"
+
+#: git-gui.sh:2101
+msgid "File type changed, staged"
+msgstr "Видът на файла е сменен и е в индекса"
+
+#: git-gui.sh:2102
+msgid "File type change staged, modification not staged"
+msgstr "Видът на файла е сменен, промяната не е в индекса"
+
+#: git-gui.sh:2103
+msgid "File type change staged, file missing"
+msgstr "Видът на файла е сменен, файлът липсва"
+
+#: git-gui.sh:2105
+msgid "Untracked, not staged"
+msgstr "Неследен"
+
+#: git-gui.sh:2110
+msgid "Missing"
+msgstr "Липсващ"
+
+#: git-gui.sh:2111
+msgid "Staged for removal"
+msgstr "В индекса за изтриване"
+
+#: git-gui.sh:2112
+msgid "Staged for removal, still present"
+msgstr "В индекса за изтриване, но още го има"
+
+#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117
+#: git-gui.sh:2118 git-gui.sh:2119
+msgid "Requires merge resolution"
+msgstr "Изисква коригиране при сливане"
+
+#: git-gui.sh:2154
+msgid "Starting gitk... please wait..."
+msgstr "Стартиране на gitk…, изчакайте…"
+
+#: git-gui.sh:2166
+msgid "Couldn't find gitk in PATH"
+msgstr "В пътищата, определени от променливата PATH, липсва изпълним gitk"
+
+#: git-gui.sh:2225
+msgid "Couldn't find git gui in PATH"
+msgstr "В пътищата, определени от променливата PATH, липсва изпълним git gui"
+
+#: git-gui.sh:2644 lib/choose_repository.tcl:40
+msgid "Repository"
+msgstr "Хранилище"
+
+#: git-gui.sh:2645
+msgid "Edit"
+msgstr "Редактиране"
+
+#: git-gui.sh:2647 lib/choose_rev.tcl:567
+msgid "Branch"
+msgstr "Клон"
+
+#: git-gui.sh:2650 lib/choose_rev.tcl:554
+msgid "Commit@@noun"
+msgstr "Подаване"
+
+#: git-gui.sh:2653 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
+msgid "Merge"
+msgstr "Сливане"
+
+#: git-gui.sh:2654 lib/choose_rev.tcl:563
+msgid "Remote"
+msgstr "Отдалечено хранилище"
+
+#: git-gui.sh:2657
+msgid "Tools"
+msgstr "Команди"
+
+#: git-gui.sh:2666
+msgid "Explore Working Copy"
+msgstr "Разглеждане на работното копие"
+
+#: git-gui.sh:2672
+msgid "Git Bash"
+msgstr "Bash на Git"
+
+#: git-gui.sh:2682
+msgid "Browse Current Branch's Files"
+msgstr "Разглеждане на файловете в текущия клон"
+
+#: git-gui.sh:2686
+msgid "Browse Branch Files..."
+msgstr "Разглеждане на текущия клон"
+
+#: git-gui.sh:2691
+msgid "Visualize Current Branch's History"
+msgstr "Визуализация на историята на текущия клон"
+
+#: git-gui.sh:2695
+msgid "Visualize All Branch History"
+msgstr "Визуализация на историята на всички клонове"
+
+#: git-gui.sh:2702
+#, tcl-format
+msgid "Browse %s's Files"
+msgstr "Разглеждане на файловете в %s"
+
+#: git-gui.sh:2704
+#, tcl-format
+msgid "Visualize %s's History"
+msgstr "Визуализация на историята на %s"
+
+#: git-gui.sh:2709 lib/database.tcl:40 lib/database.tcl:66
+msgid "Database Statistics"
+msgstr "Статистика на базата от данни"
+
+#: git-gui.sh:2712 lib/database.tcl:33
+msgid "Compress Database"
+msgstr "Компресиране на базата от данни"
+
+#: git-gui.sh:2715
+msgid "Verify Database"
+msgstr "Проверка на базата от данни"
+
+#: git-gui.sh:2722 git-gui.sh:2726 git-gui.sh:2730 lib/shortcut.tcl:8
+#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
+msgid "Create Desktop Icon"
+msgstr "Добавяне на икона на работния плот"
+
+#: git-gui.sh:2738 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200
+msgid "Quit"
+msgstr "Спиране на програмата"
+
+#: git-gui.sh:2746
+msgid "Undo"
+msgstr "Отмяна"
+
+#: git-gui.sh:2749
+msgid "Redo"
+msgstr "Повторение"
+
+#: git-gui.sh:2753 git-gui.sh:3348
+msgid "Cut"
+msgstr "Отрязване"
+
+#: git-gui.sh:2756 git-gui.sh:3351 git-gui.sh:3425 git-gui.sh:3510
+#: lib/console.tcl:69
+msgid "Copy"
+msgstr "Копиране"
+
+#: git-gui.sh:2759 git-gui.sh:3354
+msgid "Paste"
+msgstr "Поставяне"
+
+#: git-gui.sh:2762 git-gui.sh:3357 lib/remote_branch_delete.tcl:39
+#: lib/branch_delete.tcl:28
+msgid "Delete"
+msgstr "Изтриване"
+
+#: git-gui.sh:2766 git-gui.sh:3361 git-gui.sh:3514 lib/console.tcl:71
+msgid "Select All"
+msgstr "Избиране на всичко"
+
+#: git-gui.sh:2775
+msgid "Create..."
+msgstr "Създаване…"
+
+#: git-gui.sh:2781
+msgid "Checkout..."
+msgstr "Изтегляне…"
+
+#: git-gui.sh:2787
+msgid "Rename..."
+msgstr "Преименуване…"
+
+#: git-gui.sh:2792
+msgid "Delete..."
+msgstr "Изтриване…"
+
+#: git-gui.sh:2797
+msgid "Reset..."
+msgstr "Отмяна на промените…"
+
+#: git-gui.sh:2807
+msgid "Done"
+msgstr "Готово"
+
+#: git-gui.sh:2809
+msgid "Commit@@verb"
+msgstr "Подаване"
+
+#: git-gui.sh:2818 git-gui.sh:3289
+msgid "New Commit"
+msgstr "Подаване"
+
+#: git-gui.sh:2826 git-gui.sh:3296
+msgid "Amend Last Commit"
+msgstr "Поправяне на последното подаване"
+
+#: git-gui.sh:2836 git-gui.sh:3250 lib/remote_branch_delete.tcl:101
+msgid "Rescan"
+msgstr "Обновяване"
+
+#: git-gui.sh:2842
+msgid "Stage To Commit"
+msgstr "Към индекса за подаване"
+
+#: git-gui.sh:2848
+msgid "Stage Changed Files To Commit"
+msgstr "Всички променени файлове към индекса за подаване"
+
+#: git-gui.sh:2854
+msgid "Unstage From Commit"
+msgstr "Изваждане от индекса за подаване"
+
+#: git-gui.sh:2860 lib/index.tcl:442
+msgid "Revert Changes"
+msgstr "Връщане на оригинала"
+
+#: git-gui.sh:2868 git-gui.sh:3561 git-gui.sh:3592
+msgid "Show Less Context"
+msgstr "По-малко контекст"
+
+#: git-gui.sh:2872 git-gui.sh:3565 git-gui.sh:3596
+msgid "Show More Context"
+msgstr "Повече контекст"
+
+#: git-gui.sh:2879 git-gui.sh:3263 git-gui.sh:3372
+msgid "Sign Off"
+msgstr "Подписване"
+
+#: git-gui.sh:2895
+msgid "Local Merge..."
+msgstr "Локално сливане…"
+
+#: git-gui.sh:2900
+msgid "Abort Merge..."
+msgstr "Преустановяване на сливане…"
+
+#: git-gui.sh:2912 git-gui.sh:2940
+msgid "Add..."
+msgstr "Добавяне…"
+
+#: git-gui.sh:2916
+msgid "Push..."
+msgstr "Избутване…"
+
+#: git-gui.sh:2920
+msgid "Delete Branch..."
+msgstr "Изтриване на клон…"
+
+#: git-gui.sh:2930 git-gui.sh:3543
+msgid "Options..."
+msgstr "Опции…"
+
+#: git-gui.sh:2941
+msgid "Remove..."
+msgstr "Премахване…"
+
+#: git-gui.sh:2950 lib/choose_repository.tcl:54
+msgid "Help"
+msgstr "Помощ"
+
+#: git-gui.sh:2954 git-gui.sh:2958 lib/choose_repository.tcl:48
+#: lib/choose_repository.tcl:57 lib/about.tcl:14
+#, tcl-format
+msgid "About %s"
+msgstr "Относно %s"
+
+#: git-gui.sh:2982
+msgid "Online Documentation"
+msgstr "Документация в Интернет"
+
+#: git-gui.sh:2985 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60
+msgid "Show SSH Key"
+msgstr "Показване на ключа за SSH"
+
+#: git-gui.sh:3004 git-gui.sh:3136
+msgid "Usage"
+msgstr "Употреба"
+
+#: git-gui.sh:3085 lib/blame.tcl:573
+msgid "Error"
+msgstr "Грешка"
+
+#: git-gui.sh:3116
+#, tcl-format
+msgid "fatal: cannot stat path %s: No such file or directory"
+msgstr ""
+"фатално: пътят %s не може да бъде открит: такъв файл или директория няма"
+
+#: git-gui.sh:3149
+msgid "Current Branch:"
+msgstr "Текущ клон:"
+
+#: git-gui.sh:3175
+msgid "Staged Changes (Will Commit)"
+msgstr "Промени в индекса (за подаване)"
+
+#: git-gui.sh:3195
+msgid "Unstaged Changes"
+msgstr "Промени извън индекса"
+
+#: git-gui.sh:3256
+msgid "Stage Changed"
+msgstr "Индексът е променен"
+
+#: git-gui.sh:3275 lib/transport.tcl:137 lib/transport.tcl:229
+msgid "Push"
+msgstr "Изтласкване"
+
+#: git-gui.sh:3310
+msgid "Initial Commit Message:"
+msgstr "Първоначално съобщение при подаване:"
+
+#: git-gui.sh:3311
+msgid "Amended Commit Message:"
+msgstr "Поправено съобщение при подаване:"
+
+#: git-gui.sh:3312
+msgid "Amended Initial Commit Message:"
+msgstr "Поправено първоначално съобщение при подаване:"
+
+#: git-gui.sh:3313
+msgid "Amended Merge Commit Message:"
+msgstr "Поправено съобщение при подаване със сливане:"
+
+#: git-gui.sh:3314
+msgid "Merge Commit Message:"
+msgstr "Съобщение при подаване със сливане:"
+
+#: git-gui.sh:3315
+msgid "Commit Message:"
+msgstr "Съобщение при подаване:"
+
+#: git-gui.sh:3364 git-gui.sh:3518 lib/console.tcl:73
+msgid "Copy All"
+msgstr "Копиране на всичко"
+
+#: git-gui.sh:3388 lib/blame.tcl:105
+msgid "File:"
+msgstr "Файл:"
+
+#: git-gui.sh:3506
+msgid "Refresh"
+msgstr "Обновяване"
+
+#: git-gui.sh:3527
+msgid "Decrease Font Size"
+msgstr "По-едър шрифт"
+
+#: git-gui.sh:3531
+msgid "Increase Font Size"
+msgstr "По-дребен шрифт"
+
+#: git-gui.sh:3539 lib/blame.tcl:294
+msgid "Encoding"
+msgstr "Кодиране"
+
+#: git-gui.sh:3550
+msgid "Apply/Reverse Hunk"
+msgstr "Прилагане/връщане на парче"
+
+#: git-gui.sh:3555
+msgid "Apply/Reverse Line"
+msgstr "Прилагане/връщане на ред"
+
+#: git-gui.sh:3574
+msgid "Run Merge Tool"
+msgstr "Изпълнение на програмата за сливане"
+
+#: git-gui.sh:3579
+msgid "Use Remote Version"
+msgstr "Версия от отдалеченото хранилище"
+
+#: git-gui.sh:3583
+msgid "Use Local Version"
+msgstr "Локална версия"
+
+#: git-gui.sh:3587
+msgid "Revert To Base"
+msgstr "Връщане към родителската версия"
+
+#: git-gui.sh:3605
+msgid "Visualize These Changes In The Submodule"
+msgstr "Визуализиране на промените в подмодула"
+
+#: git-gui.sh:3609
+msgid "Visualize Current Branch History In The Submodule"
+msgstr "Визуализация на историята на текущия клон в историята за подмодула"
+
+#: git-gui.sh:3613
+msgid "Visualize All Branch History In The Submodule"
+msgstr "Визуализация на историята на всички клони в историята за подмодула"
+
+#: git-gui.sh:3618
+msgid "Start git gui In The Submodule"
+msgstr "Стартиране на „git gui“ за подмодула"
+
+#: git-gui.sh:3653
+msgid "Unstage Hunk From Commit"
+msgstr "Изваждане на парчето от подаването"
+
+#: git-gui.sh:3655
+msgid "Unstage Lines From Commit"
+msgstr "Изваждане на редовете от подаването"
+
+#: git-gui.sh:3657
+msgid "Unstage Line From Commit"
+msgstr "Изваждане на реда от подаването"
+
+#: git-gui.sh:3660
+msgid "Stage Hunk For Commit"
+msgstr "Добавяне на парчето за подаване"
+
+#: git-gui.sh:3662
+msgid "Stage Lines For Commit"
+msgstr "Добавяне на редовете за подаване"
+
+#: git-gui.sh:3664
+msgid "Stage Line For Commit"
+msgstr "Добавяне на реда за подаване"
+
+#: git-gui.sh:3689
+msgid "Initializing..."
+msgstr "Инициализиране…"
+
+#: git-gui.sh:3832
+#, tcl-format
+msgid ""
+"Possible environment issues exist.\n"
+"\n"
+"The following environment variables are probably\n"
+"going to be ignored by any Git subprocess run\n"
+"by %s:\n"
+"\n"
+msgstr ""
+"Възможно е да има проблем със средата.\n"
+"\n"
+"Най-вероятно следните променливи няма да бъдат\n"
+"взети под внимание от подпроцесите Git изпълнени\n"
+"от %s:\n"
+"\n"
+
+#: git-gui.sh:3861
+msgid ""
+"\n"
+"This is due to a known issue with the\n"
+"Tcl binary distributed by Cygwin."
+msgstr ""
+"\n"
+"Това е познат проблем и се дължи на\n"
+"версията на Tcl включена в Cygwin."
+
+#: git-gui.sh:3866
+#, tcl-format
+msgid ""
+"\n"
+"\n"
+"A good replacement for %s\n"
+"is placing values for the user.name and\n"
+"user.email settings into your personal\n"
+"~/.gitconfig file.\n"
+msgstr ""
+"\n"
+"\n"
+"Добър заместител на %s\n"
+"е да поставите настройките user.name и\n"
+"user.email в личния си файл ~/.gitconfig.\n"
+
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Тази програма за проверка на правописа не се поддържа"
+
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Липсва програма за проверка на правописа"
+
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Неправилни настройки на проверката на правописа"
+
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "Ползване на речник за език „%s“."
+
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "Програмата за правопис даже не стартира успешно."
+
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Непозната програма за проверка на правописа"
+
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "Няма предложения"
+
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "Неочакван край на файл от програмата за проверка на правописа"
+
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Грешка в програмата за проверка на правописа"
+
+#: lib/remote_add.tcl:20
+msgid "Add Remote"
+msgstr "Добавяне на отдалечено хранилище"
+
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "Добавяне на отдалечено хранилище"
+
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
+msgid "Add"
+msgstr "Добавяне"
+
+#: lib/remote_add.tcl:34 lib/browser.tcl:292 lib/branch_checkout.tcl:30
+#: lib/transport.tcl:141 lib/branch_rename.tcl:32 lib/choose_font.tcl:45
+#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202
+#: lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43
+#: lib/checkout_op.tcl:579 lib/branch_create.tcl:37 lib/branch_delete.tcl:34
+#: lib/merge.tcl:174
+msgid "Cancel"
+msgstr "Отказване"
+
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "Данни за отдалеченото хранилище"
+
+#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
+msgid "Name:"
+msgstr "Име:"
+
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Местоположение:"
+
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "Следващо действие"
+
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "Незабавно доставяне"
+
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "Инициализиране на отдалеченото хранилище и изтласкване на промените"
+
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "Да не се прави нищо"
+
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "Задайте име за отдалеченото хранилище."
+
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "Отдалечено хранилище не може да се казва „%s“."
+
+#: lib/remote_add.tcl:124
+#, tcl-format
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Неуспешно добавяне на отдалеченото хранилище „%s“ от адрес „%s“."
+
+#: lib/remote_add.tcl:132 lib/transport.tcl:6
+#, tcl-format
+msgid "fetch %s"
+msgstr "доставяне на „%s“"
+
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "Доставяне на „%s“"
+
+#: lib/remote_add.tcl:156
+#, tcl-format
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано."
+
+#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92
+#: lib/transport.tcl:110
+#, tcl-format
+msgid "push %s"
+msgstr "изтласкване на „%s“"
+
+#: lib/remote_add.tcl:163
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)"
+
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "Стартиране…"
+
+#: lib/browser.tcl:27
+msgid "File Browser"
+msgstr "Файлов браузър"
+
+#: lib/browser.tcl:132 lib/browser.tcl:149
+#, tcl-format
+msgid "Loading %s..."
+msgstr "Зареждане на „%s“…"
+
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[Към родителя]"
+
+#: lib/browser.tcl:275 lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "Разглеждане на файловете в клона"
+
+#: lib/browser.tcl:288 lib/choose_repository.tcl:406
+#: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502
+#: lib/choose_repository.tcl:1029
+msgid "Browse"
+msgstr "Разглеждане"
+
+#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
+msgid "Revision"
+msgstr "Версия"
+
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "За изпълнението на „%s“ трябва да изберете файл."
+
+#: lib/tools.tcl:91
+#, tcl-format
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "Сигурни ли сте, че искате да стартирате „%1$s“ върху „%2$s“?"
+
+#: lib/tools.tcl:95
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "Сигурни ли сте, че искате да стартирате „%s“?"
+
+#: lib/tools.tcl:116
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Команда: %s"
+
+#: lib/tools.tcl:117
+#, tcl-format
+msgid "Running: %s"
+msgstr "Изпълнение: %s"
+
+#: lib/tools.tcl:155
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Командата завърши успешно: %s"
+
+#: lib/tools.tcl:157
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "Командата върна грешка: %s"
+
+#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
+msgid "Checkout Branch"
+msgstr "Клон за изтегляне"
+
+#: lib/branch_checkout.tcl:26
+msgid "Checkout"
+msgstr "Изтегляне"
+
+#: lib/branch_checkout.tcl:39 lib/option.tcl:309 lib/branch_create.tcl:69
+msgid "Options"
+msgstr "Опции"
+
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "Изтегляне на промените от следения клон"
+
+#: lib/branch_checkout.tcl:47
+msgid "Detach From Local Branch"
+msgstr "Изтриване от локалния клон"
+
+#: lib/transport.tcl:7
+#, tcl-format
+msgid "Fetching new changes from %s"
+msgstr "Доставяне на промените от %s"
+
+#: lib/transport.tcl:18
+#, tcl-format
+msgid "remote prune %s"
+msgstr "окастряне на следящите клони към „%s“"
+
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "Окастряне на следящите клони на изтритите клони от „%s“"
+
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "доставяне на всички хранилища"
+
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "Доставяне на промените от всички отдалечени хранилища"
+
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "окастряне на всички клони следящи изтрити клони"
+
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
+msgstr ""
+"Окастряне на следящите клони на изтритите клони от всички отдалечени "
+"хранилища"
+
+#: lib/transport.tcl:55
+#, tcl-format
+msgid "Pushing changes to %s"
+msgstr "Изтласкване на промените към %s"
+
+#: lib/transport.tcl:93
+#, tcl-format
+msgid "Mirroring to %s"
+msgstr "Изтласкване на всичко към „%s“"
+
+#: lib/transport.tcl:111
+#, tcl-format
+msgid "Pushing %s %s to %s"
+msgstr "Изтласкване на %s %s към %s"
+
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "Клони за изтласкване"
+
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "Клони-източници"
+
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "Целево хранилище"
+
+#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
+msgid "Remote:"
+msgstr "Отдалечено хранилище:"
+
+#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
+msgid "Arbitrary Location:"
+msgstr "Произволно местоположение:"
+
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "Настройки при пренасянето"
+
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr ""
+"Изрично презаписване на съществуващ клон (някои промени може да бъдат "
+"загубени)"
+
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Максимална компресия (за бавни мрежови връзки)"
+
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "Включване на етикетите"
+
+#: lib/status_bar.tcl:87
+#, tcl-format
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s… %*i от общо %*i %s (%3i%%)"
+
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "Изтласкване към"
+
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "Премахване на отдалечено хранилище"
+
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "Окастряне от"
+
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "Доставяне от"
+
+#: lib/sshkey.tcl:31
+msgid "No keys found."
+msgstr "Не са открити ключове."
+
+#: lib/sshkey.tcl:34
+#, tcl-format
+msgid "Found a public key in: %s"
+msgstr "Открит е публичен ключ в „%s“"
+
+#: lib/sshkey.tcl:40
+msgid "Generate Key"
+msgstr "Генериране на ключ"
+
+#: lib/sshkey.tcl:55 lib/checkout_op.tcl:146 lib/console.tcl:81
+#: lib/database.tcl:30
+msgid "Close"
+msgstr "Затваряне"
+
+#: lib/sshkey.tcl:58
+msgid "Copy To Clipboard"
+msgstr "Копиране към системния буфер"
+
+#: lib/sshkey.tcl:72
+msgid "Your OpenSSH Public Key"
+msgstr "Публичният ви ключ за OpenSSH"
+
+#: lib/sshkey.tcl:80
+msgid "Generating..."
+msgstr "Генериране…"
+
+#: lib/sshkey.tcl:86
+#, tcl-format
+msgid ""
+"Could not start ssh-keygen:\n"
+"\n"
+"%s"
+msgstr ""
+"Програмата „ssh-keygen“ не може да бъде стартирана:\n"
+"\n"
+"%s"
+
+#: lib/sshkey.tcl:113
+msgid "Generation failed."
+msgstr "Неуспешно генериране."
+
+#: lib/sshkey.tcl:120
+msgid "Generation succeeded, but no keys found."
+msgstr "Генерирането завърши успешно, а не са намерени ключове."
+
+#: lib/sshkey.tcl:123
+#, tcl-format
+msgid "Your key is in: %s"
+msgstr "Ключът ви е в „%s“"
+
+#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
+msgid "Rename Branch"
+msgstr "Преименуване на клон"
+
+#: lib/branch_rename.tcl:28
+msgid "Rename"
+msgstr "Преименуване"
+
+#: lib/branch_rename.tcl:38
+msgid "Branch:"
+msgstr "Клон:"
+
+#: lib/branch_rename.tcl:46
+msgid "New Name:"
+msgstr "Ново име:"
+
+#: lib/branch_rename.tcl:81
+msgid "Please select a branch to rename."
+msgstr "Изберете клон за преименуване."
+
+#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
+msgid "Please supply a branch name."
+msgstr "Дайте име на клона."
+
+#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "Клонът „%s“ вече съществува."
+
+#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
+#, tcl-format
+msgid "'%s' is not an acceptable branch name."
+msgstr "„%s“ не може да се използва за име на клон."
+
+#: lib/branch_rename.tcl:123
+#, tcl-format
+msgid "Failed to rename '%s'."
+msgstr "Неуспешно преименуване на „%s“."
+
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "Избор"
+
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "Шрифт"
+
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "Размер"
+
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "Мостра"
+
+#: lib/choose_font.tcl:105
+msgid ""
+"This is example text.\n"
+"If you like this text, it can be your font."
+msgstr ""
+"Това е примерен текст.\n"
+"Ако ви харесва как изглежда, изберете този шрифт."
+
+#: lib/option.tcl:11
+#, tcl-format
+msgid "Invalid global encoding '%s'"
+msgstr "Неправилно глобално кодиране „%s“"
+
+#: lib/option.tcl:19
+#, tcl-format
+msgid "Invalid repo encoding '%s'"
+msgstr "Неправилно кодиране „%s“ на хранилището"
+
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "Стандартни настройки"
+
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "Запазване"
+
+#: lib/option.tcl:133
+#, tcl-format
+msgid "%s Repository"
+msgstr "Хранилище „%s“"
+
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "Глобално (за всички хранилища)"
+
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "Потребителско име"
+
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "Адрес на е-поща"
+
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "Обобщаване на подаванията при сливане"
+
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "Подробности при сливанията"
+
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "Извеждане на статистика след сливанията"
+
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "Използване на програма за сливане"
+
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "Доверие във времето на промяна на файловете"
+
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Окастряне на следящите клонове при доставяне"
+
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "Напасване на следящите клонове"
+
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Използване на „textconv“ за разликите и анотациите"
+
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "Анотиране на копието само по променените файлове"
+
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "Максимален брой скоро ползвани хранилища"
+
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Минимален брой знаци за анотиране на копието"
+
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "Исторически обхват за анотиране в дни"
+
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "Брой редове за контекста при извеждане на разликите"
+
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "Допълнителни параметри за разликите"
+
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "Широчина на текста на съобщението при подаване"
+
+#: lib/option.tcl:159
+msgid "New Branch Name Template"
+msgstr "Шаблон за името на новите клони"
+
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+msgstr "Стандартно кодиране на файловете"
+
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "Предупреждение при подаване към несвързан връх"
+
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "Добавяне на неследените файлове към индекса"
+
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "Показване на неследените файлове"
+
+#: lib/option.tcl:209
+msgid "Change"
+msgstr "Смяна"
+
+#: lib/option.tcl:253
+msgid "Spelling Dictionary:"
+msgstr "Правописен речник:"
+
+#: lib/option.tcl:283
+msgid "Change Font"
+msgstr "Смяна на шрифта"
+
+#: lib/option.tcl:287
+#, tcl-format
+msgid "Choose %s"
+msgstr "Избор на „%s“"
+
+#: lib/option.tcl:293
+msgid "pt."
+msgstr "тчк."
+
+#: lib/option.tcl:307
+msgid "Preferences"
+msgstr "Настройки"
+
+#: lib/option.tcl:344
+msgid "Failed to completely save options:"
+msgstr "Неуспешно запазване на настройките:"
+
+#: lib/mergetool.tcl:8
+msgid "Force resolution to the base version?"
+msgstr "Да се използва базовата версия"
+
+#: lib/mergetool.tcl:9
+msgid "Force resolution to this branch?"
+msgstr "Да се използва версията от този клон"
+
+#: lib/mergetool.tcl:10
+msgid "Force resolution to the other branch?"
+msgstr "Да се използва версията от другия клон"
+
+#: lib/mergetool.tcl:14
+#, tcl-format
+msgid ""
+"Note that the diff shows only conflicting changes.\n"
+"\n"
+"%s will be overwritten.\n"
+"\n"
+"This operation can be undone only by restarting the merge."
+msgstr ""
+"Разликата показва само разликите с конфликт.\n"
+"\n"
+"Файлът „%s“ ще бъде презаписан.\n"
+"\n"
+"Тази операция може да бъде отменена само чрез започване на сливането наново."
+
+#: lib/mergetool.tcl:45
+#, tcl-format
+msgid "File %s seems to have unresolved conflicts, still stage?"
+msgstr ""
+"Изглежда, че във файла „%s“ все още има некоригирани конфликти. Да се добави "
+"ли файлът към индекса?"
+
+#: lib/mergetool.tcl:60
+#, tcl-format
+msgid "Adding resolution for %s"
+msgstr "Добавяне на корекция на конфликтите в „%s“"
+
+#: lib/mergetool.tcl:141
+msgid "Cannot resolve deletion or link conflicts using a tool"
+msgstr ""
+"Конфликтите при символни връзки или изтриване не могат да бъдат коригирани с "
+"външна програма."
+
+#: lib/mergetool.tcl:146
+msgid "Conflict file does not exist"
+msgstr "Файлът, в който е конфликтът, не съществува"
+
+#: lib/mergetool.tcl:246
+#, tcl-format
+msgid "Not a GUI merge tool: '%s'"
+msgstr "Това не е графична програма за сливане: „%s“"
+
+#: lib/mergetool.tcl:275
+#, tcl-format
+msgid "Unsupported merge tool '%s'"
+msgstr "Неподдържана програма за сливане: „%s“"
+
+#: lib/mergetool.tcl:310
+msgid "Merge tool is already running, terminate it?"
+msgstr "Програмата за сливане вече е стартирана. Да бъде ли изключена?"
+
+#: lib/mergetool.tcl:330
+#, tcl-format
+msgid ""
+"Error retrieving versions:\n"
+"%s"
+msgstr ""
+"Грешка при изтеглянето на версии:\n"
+"%s"
+
+#: lib/mergetool.tcl:350
+#, tcl-format
+msgid ""
+"Could not start the merge tool:\n"
+"\n"
+"%s"
+msgstr ""
+"Програмата за сливане не може да бъде стартирана:\n"
+"\n"
+"%s"
+
+#: lib/mergetool.tcl:354
+msgid "Running merge tool..."
+msgstr "Стартиране на програмата за сливане…"
+
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
+msgid "Merge tool failed."
+msgstr "Грешка в програмата за сливане."
+
+#: lib/tools_dlg.tcl:22
+msgid "Add Tool"
+msgstr "Добавяне на команда"
+
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Добавяне на команда"
+
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "Глобално добавяне"
+
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "Подробности за командата"
+
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "За създаване на подменюта използвайте за разделител знака „/“:"
+
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "Команда:"
+
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "Преди изпълнение да се извежда диалогов прозорец"
+
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Потребителят да укаже версия (задаване на променливата $REVISION)"
+
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr ""
+"Потребителят да укаже допълнителни аргументи (задаване на променливата $ARGS)"
+
+#: lib/tools_dlg.tcl:89
+msgid "Don't show the command output window"
+msgstr "Без показване на прозорец с изхода от командата"
+
+#: lib/tools_dlg.tcl:94
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr ""
+"Стартиране само след избор на разлика (променливата $FILENAME не е празна)"
+
+#: lib/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "Задайте име за командата."
+
+#: lib/tools_dlg.tcl:126
+#, tcl-format
+msgid "Tool '%s' already exists."
+msgstr "Командата „%s“ вече съществува."
+
+#: lib/tools_dlg.tcl:148
+#, tcl-format
+msgid ""
+"Could not add tool:\n"
+"%s"
+msgstr ""
+"Командата не може да бъде добавена:\n"
+"%s"
+
+#: lib/tools_dlg.tcl:187
+msgid "Remove Tool"
+msgstr "Премахване на команда"
+
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "Премахване на команди"
+
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "Премахване"
+
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(команди към локалното хранилище са обозначени в синьо)"
+
+#: lib/tools_dlg.tcl:292
+#, tcl-format
+msgid "Run Command: %s"
+msgstr "Изпълнение на командата „%s“"
+
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "Аргументи"
+
+#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166
+msgid "Visualize"
+msgstr "Визуализация"
+
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "Добре"
+
+#: lib/search.tcl:48
+msgid "Find:"
+msgstr "Търсене:"
+
+#: lib/search.tcl:50
+msgid "Next"
+msgstr "Следваща поява"
+
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr "Предишна поява"
+
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "Рег. изр."
+
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "Регистър"
+
+#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
+msgid "Cannot write shortcut:"
+msgstr "Клавишната комбинация не може да бъде запазена:"
+
+#: lib/shortcut.tcl:137
+msgid "Cannot write icon:"
+msgstr "Иконата не може да бъде запазена:"
+
+#: lib/diff.tcl:64
+#, tcl-format
+msgid ""
+"No differences detected.\n"
+"\n"
+"%s has no changes.\n"
+"\n"
+"The modification date of this file was updated by another application, but "
+"the content within the file was not changed.\n"
+"\n"
+"A rescan will be automatically started to find other files which may have "
+"the same state."
+msgstr ""
+"Не са открити разлики.\n"
+"\n"
+"Няма промени в „%s“.\n"
+"\n"
+"Времето на промяна на файла е бил зададен от друга програма, но съдържанието "
+"му не е променено.\n"
+"\n"
+"Автоматично ще започне нова проверка дали няма други файлове в това "
+"състояние."
+
+#: lib/diff.tcl:104
+#, tcl-format
+msgid "Loading diff of %s..."
+msgstr "Зареждане на разликите в „%s“…"
+
+#: lib/diff.tcl:125
+msgid ""
+"LOCAL: deleted\n"
+"REMOTE:\n"
+msgstr ""
+"ЛОКАЛНО: изтрит\n"
+"ОТДАЛЕЧЕНО:\n"
+
+#: lib/diff.tcl:130
+msgid ""
+"REMOTE: deleted\n"
+"LOCAL:\n"
+msgstr ""
+"ОТДАЛЕЧЕНО: изтрит\n"
+"ЛОКАЛНО:\n"
+
+#: lib/diff.tcl:137
+msgid "LOCAL:\n"
+msgstr "ЛОКАЛНО:\n"
+
+#: lib/diff.tcl:140
+msgid "REMOTE:\n"
+msgstr "ОТДАЛЕЧЕНО:\n"
+
+#: lib/diff.tcl:202 lib/diff.tcl:337
+#, tcl-format
+msgid "Unable to display %s"
+msgstr "Не може да бъде показан файлът „%s“"
+
+#: lib/diff.tcl:203
+msgid "Error loading file:"
+msgstr "Грешка при зареждане на файл:"
+
+#: lib/diff.tcl:210
+msgid "Git Repository (subproject)"
+msgstr "Хранилище на Git (подпроект)"
+
+#: lib/diff.tcl:222
+msgid "* Binary file (not showing content)."
+msgstr "⁃ Двоичен файл (съдържанието не се показва)."
+
+#: lib/diff.tcl:227
+#, tcl-format
+msgid ""
+"* Untracked file is %d bytes.\n"
+"* Showing only first %d bytes.\n"
+msgstr ""
+"⁃ Неследеният файл е %d байта.\n"
+"⁃ Показват се само първите %d байта.\n"
+
+#: lib/diff.tcl:233
+#, tcl-format
+msgid ""
+"\n"
+"* Untracked file clipped here by %s.\n"
+"* To see the entire file, use an external editor.\n"
+msgstr ""
+"\n"
+"⁃ Неследеният файл е отрязан дотук %s.\n"
+"⁃ Използвайте външен редактор, за да видите целия файл.\n"
+
+#: lib/diff.tcl:338 lib/blame.tcl:1128
+msgid "Error loading diff:"
+msgstr "Грешка при зареждане на разлика:"
+
+#: lib/diff.tcl:557
+msgid "Failed to unstage selected hunk."
+msgstr "Избраното парче не може да бъде извадено от индекса."
+
+#: lib/diff.tcl:564
+msgid "Failed to stage selected hunk."
+msgstr "Избраното парче не може да бъде добавен към индекса."
+
+#: lib/diff.tcl:643
+msgid "Failed to unstage selected line."
+msgstr "Избраният ред не може да бъде изваден от индекса."
+
+#: lib/diff.tcl:651
+msgid "Failed to stage selected line."
+msgstr "Избраният ред не може да бъде добавен към индекса."
+
+#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
+msgid "Delete Branch Remotely"
+msgstr "Изтриване на отдалечения клон"
+
+#: lib/remote_branch_delete.tcl:48
+msgid "From Repository"
+msgstr "От хранилище"
+
+#: lib/remote_branch_delete.tcl:88
+msgid "Branches"
+msgstr "Клонове"
+
+#: lib/remote_branch_delete.tcl:110
+msgid "Delete Only If"
+msgstr "Изтриване, само ако"
+
+#: lib/remote_branch_delete.tcl:112
+msgid "Merged Into:"
+msgstr "Слят в:"
+
+#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
+msgid "Always (Do not perform merge checks)"
+msgstr "Винаги (без проверка за сливане)"
+
+#: lib/remote_branch_delete.tcl:153
+msgid "A branch is required for 'Merged Into'."
+msgstr "За данните „Слят в“ е необходимо да зададете клон."
+
+#: lib/remote_branch_delete.tcl:185
+#, tcl-format
+msgid ""
+"The following branches are not completely merged into %s:\n"
+"\n"
+" - %s"
+msgstr ""
+"Следните клони не са слети напълно в „%s“:\n"
+"\n"
+" ⁃ %s"
+
+#: lib/remote_branch_delete.tcl:190
+#, tcl-format
+msgid ""
+"One or more of the merge tests failed because you have not fetched the "
+"necessary commits. Try fetching from %s first."
+msgstr ""
+"Поне една от пробите за сливане е неуспешна, защото не сте доставили всички "
+"необходими подавания. Пробвайте първо да доставите подаванията от „%s“."
+
+#: lib/remote_branch_delete.tcl:208
+msgid "Please select one or more branches to delete."
+msgstr "Изберете поне един клон за изтриване."
+
+#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr ""
+"Възстановяването на изтрити клони може да е трудно.\n"
+"\n"
+"Сигурни ли сте, че искате да триете?"
+
+#: lib/remote_branch_delete.tcl:227
+#, tcl-format
+msgid "Deleting branches from %s"
+msgstr "Изтриване на клони от „%s“"
+
+#: lib/remote_branch_delete.tcl:300
+msgid "No repository selected."
+msgstr "Не е избрано хранилище."
+
+#: lib/remote_branch_delete.tcl:305
+#, tcl-format
+msgid "Scanning %s..."
+msgstr "Претърсване на „%s“…"
+
+#: lib/choose_repository.tcl:32
+msgid "Git Gui"
+msgstr "ГПИ на Git"
+
+#: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396
+msgid "Create New Repository"
+msgstr "Създаване на ново хранилище"
+
+#: lib/choose_repository.tcl:97
+msgid "New..."
+msgstr "Ново…"
+
+#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480
+msgid "Clone Existing Repository"
+msgstr "Клониране на съществуващо хранилище"
+
+#: lib/choose_repository.tcl:115
+msgid "Clone..."
+msgstr "Клониране…"
+
+#: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019
+msgid "Open Existing Repository"
+msgstr "Отваряне на съществуващо хранилище"
+
+#: lib/choose_repository.tcl:128
+msgid "Open..."
+msgstr "Отваряне…"
+
+#: lib/choose_repository.tcl:141
+msgid "Recent Repositories"
+msgstr "Скоро ползвани"
+
+#: lib/choose_repository.tcl:147
+msgid "Open Recent Repository:"
+msgstr "Отваряне на хранилище ползвано наскоро:"
+
+#: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322
+#: lib/choose_repository.tcl:329
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Неуспешно създаване на хранилището „%s“:"
+
+#: lib/choose_repository.tcl:391 lib/branch_create.tcl:33
+msgid "Create"
+msgstr "Създаване"
+
+#: lib/choose_repository.tcl:401
+msgid "Directory:"
+msgstr "Директория:"
+
+#: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552
+#: lib/choose_repository.tcl:1053
+msgid "Git Repository"
+msgstr "Хранилище на Git"
+
+#: lib/choose_repository.tcl:456
+#, tcl-format
+msgid "Directory %s already exists."
+msgstr "Вече съществува директория „%s“."
+
+#: lib/choose_repository.tcl:460
+#, tcl-format
+msgid "File %s already exists."
+msgstr "Вече съществува файл „%s“."
+
+#: lib/choose_repository.tcl:475
+msgid "Clone"
+msgstr "Клониране"
+
+#: lib/choose_repository.tcl:488
+msgid "Source Location:"
+msgstr "Адрес на източника:"
+
+#: lib/choose_repository.tcl:497
+msgid "Target Directory:"
+msgstr "Целева директория:"
+
+#: lib/choose_repository.tcl:507
+msgid "Clone Type:"
+msgstr "Вид клониране:"
+
+#: lib/choose_repository.tcl:512
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)"
+
+#: lib/choose_repository.tcl:517
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Пълно (бавно, пълноценно резервно копие)"
+
+#: lib/choose_repository.tcl:522
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)"
+
+#: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605
+#: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821
+#: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067
+#, tcl-format
+msgid "Not a Git repository: %s"
+msgstr "Това не е хранилище на Git: %s"
+
+#: lib/choose_repository.tcl:594
+msgid "Standard only available for local repository."
+msgstr "Само локални хранилища могат да се клонират стандартно"
+
+#: lib/choose_repository.tcl:598
+msgid "Shared only available for local repository."
+msgstr "Само локални хранилища могат да се клонират споделено"
+
+#: lib/choose_repository.tcl:619
+#, tcl-format
+msgid "Location %s already exists."
+msgstr "Вече съществува местоположението „%s“."
+
+#: lib/choose_repository.tcl:630
+msgid "Failed to configure origin"
+msgstr "Неуспешно настройване на хранилището-източник"
+
+#: lib/choose_repository.tcl:642
+msgid "Counting objects"
+msgstr "Преброяване на обекти"
+
+#: lib/choose_repository.tcl:643
+msgid "buckets"
+msgstr "клетки"
+
+#: lib/choose_repository.tcl:667
+#, tcl-format
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s"
+
+#: lib/choose_repository.tcl:703
+#, tcl-format
+msgid "Nothing to clone from %s."
+msgstr "Няма какво да се клонира от „%s“."
+
+#: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919
+#: lib/choose_repository.tcl:931
+msgid "The 'master' branch has not been initialized."
+msgstr "Основният клон — „master“ не е инициализиран."
+
+#: lib/choose_repository.tcl:718
+msgid "Hardlinks are unavailable. Falling back to copying."
+msgstr "Не се поддържат твърди връзки. Преминава се към копиране."
+
+#: lib/choose_repository.tcl:730
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "Клониране на „%s“"
+
+#: lib/choose_repository.tcl:761
+msgid "Copying objects"
+msgstr "Копиране на обекти"
+
+#: lib/choose_repository.tcl:762
+msgid "KiB"
+msgstr "KiB"
+
+#: lib/choose_repository.tcl:786
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "Неуспешно копиране на обект: %s"
+
+#: lib/choose_repository.tcl:796
+msgid "Linking objects"
+msgstr "Създаване на връзки към обектите"
+
+#: lib/choose_repository.tcl:797
+msgid "objects"
+msgstr "обекти"
+
+#: lib/choose_repository.tcl:805
+#, tcl-format
+msgid "Unable to hardlink object: %s"
+msgstr "Неуспешно създаване на твърда връзка към обект: %s"
+
+#: lib/choose_repository.tcl:860
+msgid "Cannot fetch branches and objects. See console output for details."
+msgstr ""
+"Клоните и обектите не могат да бъдат изтеглени. За повече информация "
+"погледнете изхода на конзолата."
+
+#: lib/choose_repository.tcl:871
+msgid "Cannot fetch tags. See console output for details."
+msgstr ""
+"Етикетите не могат да бъдат изтеглени. За повече информация погледнете "
+"изхода на конзолата."
+
+#: lib/choose_repository.tcl:895
+msgid "Cannot determine HEAD. See console output for details."
+msgstr ""
+"Върхът HEAD не може да бъде определен. За повече информация погледнете "
+"изхода на конзолата."
+
+#: lib/choose_repository.tcl:904
+#, tcl-format
+msgid "Unable to cleanup %s"
+msgstr "Не може да се зачисти „%s“"
+
+#: lib/choose_repository.tcl:910
+msgid "Clone failed."
+msgstr "Неуспешно клониране."
+
+#: lib/choose_repository.tcl:917
+msgid "No default branch obtained."
+msgstr "Не е получен клон по подразбиране."
+
+#: lib/choose_repository.tcl:928
+#, tcl-format
+msgid "Cannot resolve %s as a commit."
+msgstr "Няма подаване отговарящо на „%s“."
+
+#: lib/choose_repository.tcl:940
+msgid "Creating working directory"
+msgstr "Създаване на работната директория"
+
+#: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136
+#: lib/index.tcl:207
+msgid "files"
+msgstr "файлове"
+
+#: lib/choose_repository.tcl:970
+msgid "Initial file checkout failed."
+msgstr "Неуспешно първоначално изтегляне."
+
+#: lib/choose_repository.tcl:1014
+msgid "Open"
+msgstr "Отваряне"
+
+#: lib/choose_repository.tcl:1024
+msgid "Repository:"
+msgstr "Хранилище:"
+
+#: lib/choose_repository.tcl:1073
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Неуспешно отваряне на хранилището „%s“:"
+
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui — графичен интерфейс за Git."
+
+#: lib/checkout_op.tcl:85
+#, tcl-format
+msgid "Fetching %s from %s"
+msgstr "Доставяне на „%s“ от „%s“"
+
+#: lib/checkout_op.tcl:133
+#, tcl-format
+msgid "fatal: Cannot resolve %s"
+msgstr "фатална грешка: „%s“ не може да се открие"
+
+#: lib/checkout_op.tcl:175
+#, tcl-format
+msgid "Branch '%s' does not exist."
+msgstr "Клонът „%s“ не съществува."
+
+#: lib/checkout_op.tcl:194
+#, tcl-format
+msgid "Failed to configure simplified git-pull for '%s'."
+msgstr "Неуспешно настройване на опростен git-pull за „%s“."
+
+#: lib/checkout_op.tcl:229
+#, tcl-format
+msgid ""
+"Branch '%s' already exists.\n"
+"\n"
+"It cannot fast-forward to %s.\n"
+"A merge is required."
+msgstr ""
+"Клонът „%s“ съществува.\n"
+"\n"
+"Той не може да бъде тривиално превъртян до %s.\n"
+"Необходимо е сливане."
+
+#: lib/checkout_op.tcl:243
+#, tcl-format
+msgid "Merge strategy '%s' not supported."
+msgstr "Стратегия за сливане „%s“ не се поддържа."
+
+#: lib/checkout_op.tcl:262
+#, tcl-format
+msgid "Failed to update '%s'."
+msgstr "Неуспешно обновяване на „%s“."
+
+#: lib/checkout_op.tcl:274
+msgid "Staging area (index) is already locked."
+msgstr "Индексът вече е заключен."
+
+#: lib/checkout_op.tcl:289
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan. A "
+"rescan must be performed before the current branch can be changed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"Състоянието при последната проверка не отговаря на състоянието на "
+"хранилището.\n"
+"\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено, преди да се премине към нов клон.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
+
+#: lib/checkout_op.tcl:345
+#, tcl-format
+msgid "Updating working directory to '%s'..."
+msgstr "Работната директория се привежда към „%s“…"
+
+#: lib/checkout_op.tcl:346
+msgid "files checked out"
+msgstr "файла са изтеглени"
+
+#: lib/checkout_op.tcl:376
+#, tcl-format
+msgid "Aborted checkout of '%s' (file level merging is required)."
+msgstr ""
+"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)."
+
+#: lib/checkout_op.tcl:377
+msgid "File level merge required."
+msgstr "Необходимо е пофайлово сливане."
+
+#: lib/checkout_op.tcl:381
+#, tcl-format
+msgid "Staying on branch '%s'."
+msgstr "Оставане върху клона „%s“."
+
+#: lib/checkout_op.tcl:452
+msgid ""
+"You are no longer on a local branch.\n"
+"\n"
+"If you wanted to be on a branch, create one now starting from 'This Detached "
+"Checkout'."
+msgstr ""
+"Вече не сте на локален клон.\n"
+"\n"
+"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“."
+
+#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507
+#, tcl-format
+msgid "Checked out '%s'."
+msgstr "„%s“ е изтеглен."
+
+#: lib/checkout_op.tcl:535
+#, tcl-format
+msgid "Resetting '%s' to '%s' will lose the following commits:"
+msgstr ""
+"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:"
+
+#: lib/checkout_op.tcl:557
+msgid "Recovering lost commits may not be easy."
+msgstr "Възстановяването на загубените подавания може да е трудно."
+
+#: lib/checkout_op.tcl:562
+#, tcl-format
+msgid "Reset '%s'?"
+msgstr "Зануляване на „%s“?"
+
+#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85
+msgid "Reset"
+msgstr "Отначало"
+
+#: lib/checkout_op.tcl:635
+#, tcl-format
+msgid ""
+"Failed to set current branch.\n"
+"\n"
+"This working directory is only partially switched. We successfully updated "
+"your files, but failed to update an internal Git file.\n"
+"\n"
+"This should not have occurred. %s will now close and give up."
+msgstr ""
+"Неуспешно задаване на текущия клон.\n"
+"\n"
+"Работната директория е само частично обновена: файловете са обновени "
+"успешно, но някой от вътрешните, служебни файлове на Git не е бил.\n"
+"\n"
+"Това състояние е аварийно и не трябва да се случва. Програмата „%s“ ще "
+"преустанови работа."
+
+#: lib/branch_create.tcl:23
+msgid "Create Branch"
+msgstr "Създаване на клон"
+
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "Създаване на нов клон"
+
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "Име на клона"
+
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "Съвпадане по името на следения клон"
+
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Начална версия"
+
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Обновяване на съществуващ клон:"
+
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "Не"
+
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Само тривиално превъртащо сливане"
+
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "Преминаване към клона след създаването му"
+
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "Изберете клон за следени."
+
+#: lib/branch_create.tcl:141
+#, tcl-format
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "Клонът, който се следи „%s“ не съществува в отдалеченото хранилище."
+
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "В момента се извършва действие, изчакайте…"
+
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "Успех"
+
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Грешка: неуспешно изпълнение на команда"
+
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "Това несвързано изтегляне"
+
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Израз за версия"
+
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "Локален клон"
+
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "Следящ клон"
+
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "Етикет"
+
+#: lib/choose_rev.tcl:321
+#, tcl-format
+msgid "Invalid revision: %s"
+msgstr "Неправилна версия: %s"
+
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "Не е избрана версия."
+
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "Изразът за версия е празен."
+
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "Обновен"
+
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "Адрес"
+
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "Към ред:"
+
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "Придвижване"
+
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit. There is no commit before this "
+"to amend.\n"
+msgstr ""
+"Няма какво да се поправи.\n"
+"\n"
+"Ще създадете първоначалното подаване. Преди него няма други подавания, които "
+"да поправите.\n"
+
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully "
+"completed. You cannot amend the prior commit unless you first abort the "
+"current merge activity.\n"
+msgstr ""
+"По време на сливане не може да поправяте.\n"
+"\n"
+"В момента все още не сте завършили операция по сливане. Не може да поправите "
+"предишното подаване, освен ако първо не преустановите текущото сливане.\n"
+
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "Грешка при зареждане на данните от подаване, които да се поправят:"
+
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "Идентификацията ви не може да бъде определена:"
+
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "Неправилно поле GIT_COMMITTER_IDENT:"
+
+#: lib/commit.tcl:129
+#, tcl-format
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "предупреждение: Tcl не поддържа кодирането „%s“."
+
+#: lib/commit.tcl:149
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan. A "
+"rescan must be performed before another commit can be created.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"Състоянието при последната проверка не отговаря на състоянието на "
+"хранилището.\n"
+"\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено преди ново подаване.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
+
+#: lib/commit.tcl:173
+#, tcl-format
+msgid ""
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts. You must resolve them and stage the file "
+"before committing.\n"
+msgstr ""
+"Неслетите файлове не могат да бъдат подавани.\n"
+"\n"
+"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да "
+"коригирате конфликтите и да добавите файла към индекса за подаване.\n"
+
+#: lib/commit.tcl:181
+#, tcl-format
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
+msgstr ""
+"Непознато състояние на файл „%s“.\n"
+"\n"
+"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n"
+
+#: lib/commit.tcl:189
+msgid ""
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
+msgstr ""
+"Няма промени за подаване.\n"
+"\n"
+"Трябва да добавите поне 1 файл към индекса, преди да подадете.\n"
+
+#: lib/commit.tcl:204
+msgid ""
+"Please supply a commit message.\n"
+"\n"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
+msgstr ""
+"Задайте добро съобщение при подаване.\n"
+"\n"
+"Използвайте следния формат:\n"
+"\n"
+"⁃ Първи ред: описание в едно изречение на промяната.\n"
+"⁃ Втори ред: празен.\n"
+"⁃ Останалите редове: опишете защо се налага тази промяна.\n"
+
+#: lib/commit.tcl:235
+msgid "Calling pre-commit hook..."
+msgstr "Изпълняване на куката преди подаване…"
+
+#: lib/commit.tcl:250
+msgid "Commit declined by pre-commit hook."
+msgstr "Подаването е отхвърлено от куката преди подаване."
+
+#: lib/commit.tcl:269
+msgid ""
+"You are about to commit on a detached head. This is a potentially dangerous "
+"thing to do because if you switch to another branch you will lose your "
+"changes and it can be difficult to retrieve them later from the reflog. You "
+"should probably cancel this commit and create a new branch to continue.\n"
+" \n"
+" Do you really want to proceed with your Commit?"
+msgstr ""
+"Ще подадете към несвързан връх. Това действие е опасно, защото при "
+"преминаването към който и да е клон ще загубите промените си и не е сигурно, "
+"че ще можете по-късно да ги възстановите чрез журнала на указателите. Най-"
+"вероятно трябва първо да създадете клон базиран на текущото състояние и да "
+"подадете към него.\n"
+" \n"
+"Сигурни ли сте, че искате да подадете точно сега?"
+
+#: lib/commit.tcl:290
+msgid "Calling commit-msg hook..."
+msgstr "Изпълняване на куката за съобщението при подаване…"
+
+#: lib/commit.tcl:305
+msgid "Commit declined by commit-msg hook."
+msgstr "Подаването е отхвърлено от куката за съобщението при подаване."
+
+#: lib/commit.tcl:318
+msgid "Committing changes..."
+msgstr "Подаване на промените."
+
+#: lib/commit.tcl:334
+msgid "write-tree failed:"
+msgstr "неуспешно запазване на дървото (write-tree):"
+
+#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400
+msgid "Commit failed."
+msgstr "Неуспешно подаване."
+
+#: lib/commit.tcl:352
+#, tcl-format
+msgid "Commit %s appears to be corrupt"
+msgstr "Подаването „%s“ изглежда повредено"
+
+#: lib/commit.tcl:357
+msgid ""
+"No changes to commit.\n"
+"\n"
+"No files were modified by this commit and it was not a merge commit.\n"
+"\n"
+"A rescan will be automatically started now.\n"
+msgstr ""
+"Няма промени за подаване.\n"
+"\n"
+"В това подаване не са променяни никакви файлове, а и не е подаване със "
+"сливане.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
+
+#: lib/commit.tcl:364
+msgid "No changes to commit."
+msgstr "Няма промени за подаване."
+
+#: lib/commit.tcl:378
+msgid "commit-tree failed:"
+msgstr "неуспешно подаване на дървото (commit-tree):"
+
+#: lib/commit.tcl:399
+msgid "update-ref failed:"
+msgstr "неуспешно обновяване на указателите (update-ref):"
+
+#: lib/commit.tcl:492
+#, tcl-format
+msgid "Created commit %s: %s"
+msgstr "Успешно подаване %s: %s"
+
+#: lib/branch_delete.tcl:16
+msgid "Delete Branch"
+msgstr "Изтриване на клон"
+
+#: lib/branch_delete.tcl:21
+msgid "Delete Local Branch"
+msgstr "Изтриване на локален клон"
+
+#: lib/branch_delete.tcl:39
+msgid "Local Branches"
+msgstr "Локални клони"
+
+#: lib/branch_delete.tcl:51
+msgid "Delete Only If Merged Into"
+msgstr "Изтриване, само ако промените са слети и другаде"
+
+#: lib/branch_delete.tcl:103
+#, tcl-format
+msgid "The following branches are not completely merged into %s:"
+msgstr "Не всички промени в клоните са слети в %s:"
+
+#: lib/branch_delete.tcl:141
+#, tcl-format
+msgid ""
+"Failed to delete branches:\n"
+"%s"
+msgstr ""
+"Неуспешно триене на клони:\n"
+"%s"
+
+#: lib/blame.tcl:73
+msgid "File Viewer"
+msgstr "Преглед на файлове"
+
+#: lib/blame.tcl:79
+msgid "Commit:"
+msgstr "Подаване:"
+
+#: lib/blame.tcl:280
+msgid "Copy Commit"
+msgstr "Копиране на подаване"
+
+#: lib/blame.tcl:284
+msgid "Find Text..."
+msgstr "Търсене на текст…"
+
+#: lib/blame.tcl:288
+msgid "Goto Line..."
+msgstr "Към ред…"
+
+#: lib/blame.tcl:297
+msgid "Do Full Copy Detection"
+msgstr "Пълно търсене на копиране"
+
+#: lib/blame.tcl:301
+msgid "Show History Context"
+msgstr "Показване на контекста от историята"
+
+#: lib/blame.tcl:304
+msgid "Blame Parent Commit"
+msgstr "Анотиране на родителското подаване"
+
+#: lib/blame.tcl:466
+#, tcl-format
+msgid "Reading %s..."
+msgstr "%s се чете…"
+
+#: lib/blame.tcl:594
+msgid "Loading copy/move tracking annotations..."
+msgstr "Зареждане на анотациите за проследяване на копирането/преместването…"
+
+#: lib/blame.tcl:614
+msgid "lines annotated"
+msgstr "реда анотирани"
+
+#: lib/blame.tcl:806
+msgid "Loading original location annotations..."
+msgstr "Зареждане на анотациите за първоначалното местоположение…"
+
+#: lib/blame.tcl:809
+msgid "Annotation complete."
+msgstr "Анотирането завърши."
+
+#: lib/blame.tcl:839
+msgid "Busy"
+msgstr "Операцията не е завършила"
+
+#: lib/blame.tcl:840
+msgid "Annotation process is already running."
+msgstr "В момента тече процес на анотиране."
+
+#: lib/blame.tcl:879
+msgid "Running thorough copy detection..."
+msgstr "Изпълнява се цялостен процес на откриване на копиране…"
+
+#: lib/blame.tcl:947
+msgid "Loading annotation..."
+msgstr "Зареждане на анотации…"
+
+#: lib/blame.tcl:1000
+msgid "Author:"
+msgstr "Автор:"
+
+#: lib/blame.tcl:1004
+msgid "Committer:"
+msgstr "Подал:"
+
+#: lib/blame.tcl:1009
+msgid "Original File:"
+msgstr "Първоначален файл:"
+
+#: lib/blame.tcl:1057
+msgid "Cannot find HEAD commit:"
+msgstr "Подаването за връх HEAD не може да се открие:"
+
+#: lib/blame.tcl:1112
+msgid "Cannot find parent commit:"
+msgstr "Родителското подаване не може да бъде открито"
+
+#: lib/blame.tcl:1127
+msgid "Unable to display parent"
+msgstr "Родителят не може да бъде показан"
+
+#: lib/blame.tcl:1269
+msgid "Originally By:"
+msgstr "Първоначално от:"
+
+#: lib/blame.tcl:1275
+msgid "In File:"
+msgstr "Във файл:"
+
+#: lib/blame.tcl:1280
+msgid "Copied Or Moved Here By:"
+msgstr "Копирано или преместено тук от:"
+
+#: lib/index.tcl:6
+msgid "Unable to unlock the index."
+msgstr "Индексът не може да бъде отключен."
+
+#: lib/index.tcl:17
+msgid "Index Error"
+msgstr "Грешка в индекса"
+
+#: lib/index.tcl:19
+msgid ""
+"Updating the Git index failed. A rescan will be automatically started to "
+"resynchronize git-gui."
+msgstr ""
+"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка "
+"за синхронизирането на git-gui."
+
+#: lib/index.tcl:30
+msgid "Continue"
+msgstr "Продължаване"
+
+#: lib/index.tcl:33
+msgid "Unlock Index"
+msgstr "Отключване на индекса"
+
+#: lib/index.tcl:298
+#, tcl-format
+msgid "Unstaging %s from commit"
+msgstr "Изваждане на %s от подаването"
+
+#: lib/index.tcl:337
+msgid "Ready to commit."
+msgstr "Готовност за подаване."
+
+#: lib/index.tcl:350
+#, tcl-format
+msgid "Adding %s"
+msgstr "Добавяне на „%s“"
+
+#: lib/index.tcl:380
+#, tcl-format
+msgid "Stage %d untracked files?"
+msgstr "Да се добавят ли %d на брой неследени файла към индекса?"
+
+#: lib/index.tcl:428
+#, tcl-format
+msgid "Revert changes in file %s?"
+msgstr "Да се махнат ли промените във файла „%s“?"
+
+#: lib/index.tcl:430
+#, tcl-format
+msgid "Revert changes in these %i files?"
+msgstr "Да се махнат ли промените в тези %i файла?"
+
+#: lib/index.tcl:438
+msgid "Any unstaged changes will be permanently lost by the revert."
+msgstr ""
+"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно "
+"загубени."
+
+#: lib/index.tcl:441
+msgid "Do Nothing"
+msgstr "Нищо да не се прави"
+
+#: lib/index.tcl:459
+msgid "Reverting selected files"
+msgstr "Махане на промените в избраните файлове"
+
+#: lib/index.tcl:463
+#, tcl-format
+msgid "Reverting %s"
+msgstr "Махане на промените в „%s“"
+
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "Стандартното"
+
+#: lib/encoding.tcl:448
+#, tcl-format
+msgid "System (%s)"
+msgstr "Системното (%s)"
+
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "Друго"
+
+#: lib/date.tcl:25
+#, tcl-format
+msgid "Invalid date from Git: %s"
+msgstr "Неправилни данни от Git: %s"
+
+#: lib/database.tcl:42
+msgid "Number of loose objects"
+msgstr "Брой непакетирани обекти"
+
+#: lib/database.tcl:43
+msgid "Disk space used by loose objects"
+msgstr "Дисково пространство заето от непакетирани обекти"
+
+#: lib/database.tcl:44
+msgid "Number of packed objects"
+msgstr "Брой пакетирани обекти"
+
+#: lib/database.tcl:45
+msgid "Number of packs"
+msgstr "Брой пакети"
+
+#: lib/database.tcl:46
+msgid "Disk space used by packed objects"
+msgstr "Дисково пространство заето от пакетирани обекти"
+
+#: lib/database.tcl:47
+msgid "Packed objects waiting for pruning"
+msgstr "Пакетирани обекти за окастряне"
+
+#: lib/database.tcl:48
+msgid "Garbage files"
+msgstr "Файлове за боклука"
+
+#: lib/database.tcl:72
+msgid "Compressing the object database"
+msgstr "Компресиране на базата с данни за обектите"
+
+#: lib/database.tcl:83
+msgid "Verifying the object database with fsck-objects"
+msgstr "Проверка на базата с данни за обектите с програмата fsck-objects"
+
+#: lib/database.tcl:107
+#, tcl-format
+msgid ""
+"This repository currently has approximately %i loose objects.\n"
+"\n"
+"To maintain optimal performance it is strongly recommended that you compress "
+"the database.\n"
+"\n"
+"Compress the database now?"
+msgstr ""
+"В това хранилище в момента има към %i непакетирани обекти.\n"
+"\n"
+"Зd добра производителност се препоръчва да компресирате базата с данни за "
+"обектите.\n"
+"\n"
+"Да се започне ли компресирането?"
+
+#: lib/error.tcl:20 lib/error.tcl:116
+msgid "error"
+msgstr "грешка"
+
+#: lib/error.tcl:36
+msgid "warning"
+msgstr "предупреждение"
+
+#: lib/error.tcl:96
+msgid "You must correct the above errors before committing."
+msgstr "Преди да можете да подадете, оправете горните грешки."
+
+#: lib/merge.tcl:13
+msgid ""
+"Cannot merge while amending.\n"
+"\n"
+"You must finish amending this commit before starting any type of merge.\n"
+msgstr ""
+"По време на поправяне не може да сливане.\n"
+"\n"
+"Трябва да завършите поправянето на текущото подаване, преди да започнете "
+"сливане.\n"
+
+#: lib/merge.tcl:27
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan. A "
+"rescan must be performed before a merge can be performed.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"Последно установеното състояние не отговаря на това в хранилището.\n"
+"\n"
+"Някой друг процес за Git е променил хранилището междувременно. Състоянието "
+"трябва да бъде проверено, преди да се извърши сливане.\n"
+"\n"
+"Автоматично ще започне нова проверка.\n"
+"\n"
+
+#: lib/merge.tcl:45
+#, tcl-format
+msgid ""
+"You are in the middle of a conflicted merge.\n"
+"\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current "
+"merge. Only then can you begin another merge.\n"
+msgstr ""
+"В момента тече сливане, но има конфликти.\n"
+"\n"
+"Погледнете файла „%s“.\n"
+"\n"
+"Трябва да коригирате конфликтите в него, да го добавите към индекса и да "
+"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново "
+"сливане.\n"
+
+#: lib/merge.tcl:55
+#, tcl-format
+msgid ""
+"You are in the middle of a change.\n"
+"\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge. Doing so "
+"will help you abort a failed merge, should the need arise.\n"
+msgstr ""
+"В момента тече подаване.\n"
+"\n"
+"Файлът „%s“ е променен.\n"
+"\n"
+"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще "
+"можете лесно да преустановите сливането, ако възникне нужда.\n"
+
+#: lib/merge.tcl:108
+#, tcl-format
+msgid "%s of %s"
+msgstr "%s от общо %s"
+
+#: lib/merge.tcl:122
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "Сливане на „%s“ и „%s“…"
+
+#: lib/merge.tcl:133
+msgid "Merge completed successfully."
+msgstr "Сливането завърши успешно."
+
+#: lib/merge.tcl:135
+msgid "Merge failed. Conflict resolution is required."
+msgstr "Неуспешно сливане — има конфликти за коригиране."
+
+#: lib/merge.tcl:160
+#, tcl-format
+msgid "Merge Into %s"
+msgstr "Сливане в „%s“"
+
+#: lib/merge.tcl:179
+msgid "Revision To Merge"
+msgstr "Версия за сливане"
+
+#: lib/merge.tcl:214
+msgid ""
+"Cannot abort while amending.\n"
+"\n"
+"You must finish amending this commit.\n"
+msgstr ""
+"Поправянето не може да бъде преустановено.\n"
+"\n"
+"Трябва да завършите поправката на това подаване.\n"
+
+#: lib/merge.tcl:224
+msgid ""
+"Abort merge?\n"
+"\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with aborting the current merge?"
+msgstr ""
+"Да се преустанови ли сливането?\n"
+"\n"
+"В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n"
+"\n"
+"Наистина ли да се преустанови сливането?"
+
+#: lib/merge.tcl:230
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr ""
+"Да се занулят ли промените?\n"
+"\n"
+"В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n"
+"\n"
+"Наистина ли да се занулят промените?"
+
+#: lib/merge.tcl:241
+msgid "Aborting"
+msgstr "Преустановяване"
+
+#: lib/merge.tcl:241
+msgid "files reset"
+msgstr "файла със занулени промени"
+
+#: lib/merge.tcl:269
+msgid "Abort failed."
+msgstr "Неуспешно преустановяване."
+
+#: lib/merge.tcl:271
+msgid "Abort completed. Ready."
+msgstr "Успешно преустановяване. Готовност за следващо действие."
diff --git a/git-gui/po/glossary/bg.po b/git-gui/po/glossary/bg.po
new file mode 100644
index 0000000..8b71fad
--- /dev/null
+++ b/git-gui/po/glossary/bg.po
@@ -0,0 +1,287 @@
+# Bulgarian translation of git-gui-glossary po-file.
+# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>.
+# This file is distributed under the same license as the git package.
+# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: git-gui-glossary master\n"
+"POT-Creation-Date: 2014-01-13 21:39+0200\n"
+"PO-Revision-Date: 2014-01-13 21:39+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
+msgid ""
+"English Term (Dear translator: This file will never be visible to the user!)"
+msgstr "Термин"
+
+#. ""
+msgid "amend"
+msgstr "поправям"
+
+#. ""
+msgid "annotate"
+msgstr "анотирам"
+
+#. "A 'branch' is an active line of development."
+msgid "branch [noun]"
+msgstr "клон, разклонение [съществително]"
+
+#. ""
+msgid "branch [verb]"
+msgstr "разклонявам [глагол]"
+
+#. ""
+msgid "checkout [noun]"
+msgstr "изтегляне [съществително]"
+
+#. "The action of updating the working tree to a revision which was stored in the object database."
+msgid "checkout [verb]"
+msgstr "изтегляне [глагол]"
+
+#. ""
+msgid "clone [verb]"
+msgstr "клонирам [глагол]"
+
+#. "A single point in the git history."
+msgid "commit [noun]"
+msgstr "подаване [съществително]"
+
+#. "The action of storing a new snapshot of the project's state in the git history."
+msgid "commit [verb]"
+msgstr "подавам [съществително]"
+
+#. ""
+msgid "diff [noun]"
+msgstr "разлика/промени [съществително]"
+
+#. ""
+msgid "diff [verb]"
+msgstr "изчислявам разлика/промени [глагол]"
+
+#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have."
+msgid "fast forward merge"
+msgstr "превъртащо/директно/тривиално сливане"
+
+#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too."
+msgid "fetch"
+msgstr "доставяне"
+
+#. "One context of consecutive lines in a whole patch, which consists of many such hunks"
+msgid "hunk"
+msgstr "парче"
+
+#. "A collection of files. The index is a stored version of your working tree."
+msgid "index (in git-gui: staging area)"
+msgstr "скеле/индекс/изба"
+
+#. "A successful merge results in the creation of a new commit representing the result of the merge."
+msgid "merge [noun]"
+msgstr "сливане/обединяване [съществително]"
+
+#. "To bring the contents of another branch into the current branch."
+msgid "merge [verb]"
+msgstr "сливам/обединявам [глагол]"
+
+#. ""
+msgid "message"
+msgstr "съобщение"
+
+#. "Deletes all stale tracking branches under <name>. These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in 'remotes/<name>'."
+msgid "prune"
+msgstr "окастрям"
+
+#. "Pulling a branch means to fetch it and merge it."
+msgid "pull"
+msgstr "издърпвам"
+
+#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)"
+msgid "push"
+msgstr "изтласквам"
+
+#. ""
+msgid "redo"
+msgstr "повтарям/правя наново"
+
+#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks."
+msgid "remote"
+msgstr "отдалечено хранилище"
+
+#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)"
+msgid "repository"
+msgstr "хранилище"
+
+#. ""
+msgid "reset"
+msgstr "занулявам/отменям"
+
+#. ""
+msgid "revert"
+msgstr "връщам/отменям"
+
+#. "A particular state of files and directories which was stored in the object database."
+msgid "revision"
+msgstr "версия"
+
+#. ""
+msgid "sign off"
+msgstr "подписвам"
+
+#. ""
+msgid "staging area"
+msgstr "скеле/индекс/изба"
+
+#. ""
+msgid "status"
+msgstr "състояние"
+
+#. "A ref pointing to a tag or commit object"
+msgid "tag [noun]"
+msgstr "етикет [съществително]"
+
+#. ""
+msgid "tag [verb]"
+msgstr "задавам етикет [глагол]"
+
+#. "A regular git branch that is used to follow changes from another repository."
+msgid "tracking branch"
+msgstr "следящ клон"
+
+#. ""
+msgid "undo"
+msgstr "отменям"
+
+#. ""
+msgid "update"
+msgstr "обновявам"
+
+#. ""
+msgid "verify"
+msgstr "проверявам"
+
+#. "The tree of actual checked out files."
+msgid "working copy, working tree"
+msgstr "работно копие/работно дърво"
+
+#. "a commit that succeeds the current one in git's graph of commits (not necessarily directly)"
+msgid "ancestor"
+msgstr "предшественик"
+
+#. "prematurely stop and abandon an operation"
+msgid "abort"
+msgstr "преустановявам"
+
+#. "a repository with only .git directory, without working directory"
+msgid "bare repository"
+msgstr "голо хранилище"
+
+#. "a parent version of the current file"
+msgid "base"
+msgstr "родителска версия"
+
+#. "get the authors responsible for each line in a file"
+msgid "blame"
+msgstr "анотирам/анотиране"
+
+#. "to select and apply a single commit without merging"
+msgid "cherry-pick"
+msgstr "отбирам"
+
+#. "a commit that directly succeeds the current one in git's graph of commits"
+msgid "child"
+msgstr "дете"
+
+#. "clean the state of the git repository, often after manually stopped operation"
+msgid "cleanup"
+msgstr "зачиствам"
+
+#. "a message that gets attached with any commit"
+msgid "commit message"
+msgstr "съобщение при подаване"
+
+#. "a commit that precedes the current one in git's graph of commits (not necessarily directly)"
+msgid "descendant"
+msgstr "наследник"
+
+#. "checkout of a revision rather than a some head"
+msgid "detached checkout"
+msgstr "несвързано изтегляне"
+
+#. "any merge strategy that works on a file by file basis"
+msgid "file level merging"
+msgstr "пофайлово сливане"
+
+#. "the last revision in a branch"
+msgid "head"
+msgstr "глава/връх (на клон, разработка)"
+
+#. "script that gets executed automatically on some event"
+msgid "hook"
+msgstr "кука/автоматичен скрипт"
+
+#. "the first checkout during a clone operation"
+msgid "initial checkout"
+msgstr "първоначално изтегляне"
+
+#. "a branch that resides in the local git repository"
+msgid "local branch"
+msgstr "локален клон"
+
+#. "a Git object that is not part of any pack"
+msgid "loose object"
+msgstr "непакетиран обект"
+
+#. "a branch called by convention 'master' that exists in a newly created git repository"
+msgid "master branch"
+msgstr "основен клон"
+
+#. "a remote called by convention 'origin' that the current git repository has been cloned from"
+msgid "origin"
+msgstr "хранилище-източник"
+
+#. "a file containing many git objects packed together"
+msgid "pack [noun]"
+msgstr "етикет"
+
+#. "a Git object part of some pack"
+msgid "packed object"
+msgstr "пакетиран обект"
+
+#. "a commit that directly precedes the current one in git's graph of commits"
+msgid "parent"
+msgstr "родител"
+
+#. "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)"
+msgid "reflog"
+msgstr "журнал на указателите"
+
+#. "decide which changes from alternative versions of a file should persist in Git"
+msgid "resolve (a conflict)"
+msgstr "коригирам (конфликт)"
+
+#. "abandon changes and go to pristine version"
+msgid "revert changes"
+msgstr "връщане на оригинала"
+
+#. "expression that signifies a revision in git"
+msgid "revision expression"
+msgstr "израз за версия"
+
+#. "add some content of files and directories to the staging area in preparation for a commit"
+msgid "stage/unstage"
+msgstr "(добавяне) към скелето за подаване/изваждане от скелето за подаване"
+
+#. "temporarily save changes in a stack without committing"
+msgid "stash"
+msgstr "скатавам промени"
+
+#. "file whose content is tracked/not tracked by git"
+msgid "tracked/untracked"
+msgstr "следен/неследен"
diff --git a/git-gui/po/glossary/git-gui-glossary.txt b/git-gui/po/glossary/git-gui-glossary.txt
index 9b31f69..4093046 100644
--- a/git-gui/po/glossary/git-gui-glossary.txt
+++ b/git-gui/po/glossary/git-gui-glossary.txt
@@ -36,3 +36,32 @@
"update" ""
"verify" ""
"working copy, working tree" "The tree of actual checked out files."
+"ancestor" "a commit that succeeds the current one in git's graph of commits (not necessarily directly)"
+"abort" "prematurely stop and abandon an operation"
+"bare repository" "a repository with only .git directory, without working directory"
+"base" "a parent version of the current file"
+"blame" "get the authors responsible for each line in a file"
+"cherry-pick" "to select and apply a single commit without merging"
+"child" "a commit that directly succeeds the current one in git's graph of commits"
+"cleanup" "clean the state of the git repository, often after manually stopped operation"
+"commit message" "a message that gets attached with any commit"
+"descendant" "a commit that precedes the current one in git's graph of commits (not necessarily directly)"
+"detached checkout" "checkout of a revision rather than a some head"
+"file level merging" "any merge strategy that works on a file by file basis"
+"head" "the last revision in a branch"
+"hook" "script that gets executed automatically on some event"
+"initial checkout" "the first checkout during a clone operation"
+"local branch" "a branch that resides in the local git repository"
+"loose object" "a Git object that is not part of any pack"
+"master branch" "a branch called by convention 'master' that exists in a newly created git repository"
+"origin" "a remote called by convention 'origin' that the current git repository has been cloned from"
+"pack [noun]" "a file containing many git objects packed together"
+"packed object" "a Git object part of some pack"
+"parent" "a commit that directly precedes the current one in git's graph of commits"
+"reflog" "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)"
+"resolve (a conflict)" "decide which changes from alternative versions of a file should persist in Git"
+"revert changes" "abandon changes and go to pristine version"
+"revision expression" "expression that signifies a revision in git"
+"stage/unstage" "add some content of files and directories to the staging area in preparation for a commit"
+"stash" "temporarily save changes in a stack without committing"
+"tracked/untracked" "file whose content is tracked/not tracked by git"
diff --git a/git-gui/po/po2msg.sh b/git-gui/po/po2msg.sh
index 1e9f992..1e9f992 100644..100755
--- a/git-gui/po/po2msg.sh
+++ b/git-gui/po/po2msg.sh
diff --git a/git-gui/windows/git-gui.sh b/git-gui/windows/git-gui.sh
index b1845c5..b1845c5 100644..100755
--- a/git-gui/windows/git-gui.sh
+++ b/git-gui/windows/git-gui.sh
diff --git a/git-instaweb.sh b/git-instaweb.sh
index e93a238..4aa3eb8 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -5,6 +5,7 @@
PERL='@@PERL@@'
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC="\
git instaweb [options] (--start | --stop | --restart)
--
diff --git a/git-p4.py b/git-p4.py
index 5ea8bb8..cdfa2df 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -310,8 +310,8 @@ def split_p4_type(p4type):
#
# return the raw p4 type of a file (text, text+ko, etc)
#
-def p4_type(file):
- results = p4CmdList(["fstat", "-T", "headType", file])
+def p4_type(f):
+ results = p4CmdList(["fstat", "-T", "headType", wildcard_encode(f)])
return results[0]['headType']
#
@@ -1220,7 +1220,7 @@ class P4Submit(Command, P4UserMap):
editor = os.environ.get("P4EDITOR")
else:
editor = read_pipe("git var GIT_EDITOR").strip()
- system(editor + " " + template_file)
+ system([editor, template_file])
# If the file was not saved, prompt to see if this patch should
# be skipped. But skip this verification step if configured so.
@@ -1871,7 +1871,7 @@ class View(object):
# assume error is "... file(s) not in client view"
continue
if "clientFile" not in res:
- die("No clientFile from 'p4 where %s'" % depot_path)
+ die("No clientFile in 'p4 where' output")
if "unmap" in res:
# it will list all of them, but only one not unmap-ped
continue
@@ -2075,7 +2075,14 @@ class P4Sync(Command, P4UserMap):
# p4 print on a symlink sometimes contains "target\n";
# if it does, remove the newline
data = ''.join(contents)
- if data[-1] == '\n':
+ if not data:
+ # Some version of p4 allowed creating a symlink that pointed
+ # to nothing. This causes p4 errors when checking out such
+ # a change, and errors here too. Work around it by ignoring
+ # the bad symlink; hopefully a future change fixes it.
+ print "\nIgnoring empty symlink in %s" % file['depotFile']
+ return
+ elif data[-1] == '\n':
contents = [data[:-1]]
else:
contents = [data]
diff --git a/git-pull.sh b/git-pull.sh
index 0a5aa2c..6cd8ebc 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -4,7 +4,7 @@
#
# Fetch one or more remote refs and merge it/them into the current HEAD.
-USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [--[no-]rebase|--rebase=preserve] [-s strategy]... [<fetch-options>] <repo> <head>...'
+USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff|--ff-only] [--[no-]rebase|--rebase=preserve] [-s strategy]... [<fetch-options>] <repo> <head>...'
LONG_USAGE='Fetch one or more remote refs and integrate it/them with the current HEAD.'
SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
@@ -52,6 +52,21 @@ if test -z "$rebase"
then
rebase=$(bool_or_string_config pull.rebase)
fi
+
+# Setup default fast-forward options via `pull.ff`
+pull_ff=$(git config pull.ff)
+case "$pull_ff" in
+false)
+ no_ff=--no-ff
+ break
+ ;;
+only)
+ ff_only=--ff-only
+ break
+ ;;
+esac
+
+
dry_run=
while :
do
@@ -138,6 +153,15 @@ do
--no-verify-signatures)
verify_signatures=--no-verify-signatures
;;
+ --gpg-sign|-S)
+ gpg_sign_args=-S
+ ;;
+ --gpg-sign=*)
+ gpg_sign_args=$(git rev-parse --sq-quote "-S${1#--gpg-sign=}")
+ ;;
+ -S*)
+ gpg_sign_args=$(git rev-parse --sq-quote "$1")
+ ;;
--d|--dr|--dry|--dry-|--dry-r|--dry-ru|--dry-run)
dry_run=--dry-run
;;
@@ -305,11 +329,13 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
case "$rebase" in
true)
eval="git-rebase $diffstat $strategy_args $merge_args $rebase_args $verbosity"
+ eval="$eval $gpg_sign_args"
eval="$eval --onto $merge_head ${oldremoteref:-$merge_head}"
;;
*)
eval="git-merge $diffstat $no_commit $verify_signatures $edit $squash $no_ff $ff_only"
- eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress"
+ eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress"
+ eval="$eval $gpg_sign_args"
eval="$eval \"\$merge_name\" HEAD $merge_head"
;;
esac
diff --git a/git-quiltimport.sh b/git-quiltimport.sh
index 8e17525..167d79f 100755
--- a/git-quiltimport.sh
+++ b/git-quiltimport.sh
@@ -1,5 +1,6 @@
#!/bin/sh
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC="\
git quiltimport [options]
--
diff --git a/git-rebase--am.sh b/git-rebase--am.sh
index a4f683a..df46f4c 100644
--- a/git-rebase--am.sh
+++ b/git-rebase--am.sh
@@ -6,7 +6,8 @@
case "$action" in
continue)
- git am --resolved --resolvemsg="$resolvemsg" &&
+ git am --resolved --resolvemsg="$resolvemsg" \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} &&
move_to_original_branch
return
;;
@@ -26,7 +27,7 @@ then
# empty commits and even if it didn't the format doesn't really lend
# itself well to recording empty patches. fortunately, cherry-pick
# makes this easy
- git cherry-pick --allow-empty "$revisions"
+ git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty "$revisions"
ret=$?
else
rm -f "$GIT_DIR/rebased-patches"
@@ -60,7 +61,8 @@ else
return $?
fi
- git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" <"$GIT_DIR/rebased-patches"
+ git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} <"$GIT_DIR/rebased-patches"
ret=$?
rm -f "$GIT_DIR/rebased-patches"
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 43c19e0..a1adae8 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -179,9 +179,10 @@ exit_with_patch () {
echo "$1" > "$state_dir"/stopped-sha
make_patch $1
git rev-parse --verify HEAD > "$amend"
+ gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
warn "You can amend the commit now, with"
warn
- warn " git commit --amend"
+ warn " git commit --amend $gpg_sign_opt_quoted"
warn
warn "Once you are satisfied with your changes, run"
warn
@@ -248,7 +249,9 @@ pick_one () {
test -d "$rewritten" &&
pick_one_preserving_merges "$@" && return
- output eval git cherry-pick "$strategy_args" $empty_args $ff "$@"
+ output eval git cherry-pick \
+ ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
+ "$strategy_args" $empty_args $ff "$@"
}
pick_one_preserving_merges () {
@@ -351,7 +354,8 @@ pick_one_preserving_merges () {
new_parents=${new_parents# $first_parent}
merge_args="--no-log --no-ff"
if ! do_with_author output eval \
- 'git merge $merge_args $strategy_args -m "$msg_content" $new_parents'
+ 'git merge ${gpg_sign_opt:+"$gpg_sign_opt"} \
+ $merge_args $strategy_args -m "$msg_content" $new_parents'
then
printf "%s\n" "$msg_content" > "$GIT_DIR"/MERGE_MSG
die_with_patch $sha1 "Error redoing merge $sha1"
@@ -359,7 +363,9 @@ pick_one_preserving_merges () {
echo "$sha1 $(git rev-parse HEAD^0)" >> "$rewritten_list"
;;
*)
- output eval git cherry-pick "$strategy_args" "$@" ||
+ output eval git cherry-pick \
+ ${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")} \
+ "$strategy_args" "$@" ||
die_with_patch $sha1 "Could not pick $sha1"
;;
esac
@@ -470,7 +476,8 @@ do_pick () {
--no-post-rewrite -n -q -C $1 &&
pick_one -n $1 &&
git commit --allow-empty --allow-empty-message \
- --amend --no-post-rewrite -n -q -C $1 ||
+ --amend --no-post-rewrite -n -q -C $1 \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die_with_patch $1 "Could not apply $1... $2"
else
pick_one $1 ||
@@ -497,7 +504,7 @@ do_next () {
mark_action_done
do_pick $sha1 "$rest"
- git commit --amend --no-post-rewrite || {
+ git commit --amend --no-post-rewrite ${gpg_sign_opt:+"$gpg_sign_opt"} || {
warn "Could not amend commit after successfully picking $sha1... $rest"
warn "This is most likely due to an empty commit message, or the pre-commit hook"
warn "failed. If the pre-commit hook failed, you may need to resolve the issue before"
@@ -542,19 +549,22 @@ do_next () {
squash|s|fixup|f)
# This is an intermediate commit; its message will only be
# used in case of trouble. So use the long version:
- do_with_author output git commit --amend --no-verify -F "$squash_msg" ||
+ do_with_author output git commit --amend --no-verify -F "$squash_msg" \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die_failed_squash $sha1 "$rest"
;;
*)
# This is the final command of this squash/fixup group
if test -f "$fixup_msg"
then
- do_with_author git commit --amend --no-verify -F "$fixup_msg" ||
+ do_with_author git commit --amend --no-verify -F "$fixup_msg" \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die_failed_squash $sha1 "$rest"
else
cp "$squash_msg" "$GIT_DIR"/SQUASH_MSG || exit
rm -f "$GIT_DIR"/MERGE_MSG
- do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e ||
+ do_with_author git commit --amend --no-verify -F "$GIT_DIR"/SQUASH_MSG -e \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die_failed_squash $sha1 "$rest"
fi
rm -f "$squash_msg" "$fixup_msg"
@@ -819,14 +829,15 @@ continue)
else
if ! test -f "$author_script"
then
+ gpg_sign_opt_quoted=${gpg_sign_opt:+$(git rev-parse --sq-quote "$gpg_sign_opt")}
die "You have staged changes in your working tree. If these changes are meant to be
squashed into the previous commit, run:
- git commit --amend
+ git commit --amend $gpg_sign_opt_quoted
If they are meant to go into a new commit, run:
- git commit
+ git commit $gpg_sign_opt_quoted
In both case, once you're done, continue with:
@@ -842,10 +853,12 @@ In both case, once you're done, continue with:
die "\
You have uncommitted changes in your working tree. Please, commit them
first and then run 'git rebase --continue' again."
- do_with_author git commit --amend --no-verify -F "$msg" -e ||
+ do_with_author git commit --amend --no-verify -F "$msg" -e \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die "Could not commit staged changes."
else
- do_with_author git commit --no-verify -F "$msg" -e ||
+ do_with_author git commit --no-verify -F "$msg" -e \
+ ${gpg_sign_opt:+"$gpg_sign_opt"} ||
die "Could not commit staged changes."
fi
fi
diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
index e7d96de..5381857 100644
--- a/git-rebase--merge.sh
+++ b/git-rebase--merge.sh
@@ -27,7 +27,7 @@ continue_merge () {
cmt=`cat "$state_dir/current"`
if ! git diff-index --quiet --ignore-submodules HEAD --
then
- if ! git commit --no-verify -C "$cmt"
+ if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} --no-verify -C "$cmt"
then
echo "Commit failed, please do not call \"git commit\""
echo "directly, but instead do one of the following: "
diff --git a/git-rebase.sh b/git-rebase.sh
index 8a3efa2..5f6732b 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -5,6 +5,7 @@
SUBDIRECTORY_OK=Yes
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=t
OPTIONS_SPEC="\
git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
@@ -36,6 +37,7 @@ ignore-date! passed to 'git am'
whitespace=! passed to 'git apply'
ignore-whitespace! passed to 'git apply'
C=! passed to 'git apply'
+S,gpg-sign? GPG-sign commits
Actions:
continue! continue
abort! abort and check out the original branch
@@ -84,6 +86,7 @@ preserve_merges=
autosquash=
keep_empty=
test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
+gpg_sign_opt=
read_basic_state () {
test -f "$state_dir/head-name" &&
@@ -106,6 +109,8 @@ read_basic_state () {
strategy_opts="$(cat "$state_dir"/strategy_opts)"
test -f "$state_dir"/allow_rerere_autoupdate &&
allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
+ test -f "$state_dir"/gpg_sign_opt &&
+ gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
}
write_basic_state () {
@@ -119,6 +124,7 @@ write_basic_state () {
"$state_dir"/strategy_opts
test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
"$state_dir"/allow_rerere_autoupdate
+ test -n "$gpg_sign_opt" && echo "$gpg_sign_opt" > "$state_dir"/gpg_sign_opt
}
output () {
@@ -236,23 +242,19 @@ do
test $total_argc -eq 2 || usage
action=${1##--}
;;
- --onto)
- test 2 -le "$#" || usage
- onto="$2"
- shift
+ --onto=*)
+ onto="${1#--onto=}"
;;
- -x)
- test 2 -le "$#" || usage
- cmd="${cmd}exec $2${LF}"
- shift
+ --exec=*)
+ cmd="${cmd}exec ${1#--exec=}${LF}"
;;
- -i)
+ --interactive)
interactive_rebase=explicit
;;
- -k)
+ --keep-empty)
keep_empty=yes
;;
- -p)
+ --preserve-merges)
preserve_merges=t
test -z "$interactive_rebase" && interactive_rebase=implied
;;
@@ -268,21 +270,19 @@ do
--no-fork-point)
fork_point=
;;
- -M|-m)
+ --merge)
do_merge=t
;;
- -X)
- shift
- strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--$1")"
+ --strategy-option=*)
+ strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}")"
do_merge=t
test -z "$strategy" && strategy=recursive
;;
- -s)
- shift
- strategy="$1"
+ --strategy=*)
+ strategy="${1#--strategy=}"
do_merge=t
;;
- -n)
+ --no-stat)
diffstat=
;;
--stat)
@@ -291,21 +291,20 @@ do
--autostash)
autostash=true
;;
- -v)
+ --verbose)
verbose=t
diffstat=t
GIT_QUIET=
;;
- -q)
+ --quiet)
GIT_QUIET=t
git_am_opt="$git_am_opt -q"
verbose=
diffstat=
;;
- --whitespace)
- shift
- git_am_opt="$git_am_opt --whitespace=$1"
- case "$1" in
+ --whitespace=*)
+ git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
+ case "${1#--whitespace=}" in
fix|strip)
force_rebase=t
;;
@@ -318,19 +317,24 @@ do
git_am_opt="$git_am_opt $1"
force_rebase=t
;;
- -C)
- shift
- git_am_opt="$git_am_opt -C$1"
+ -C*)
+ git_am_opt="$git_am_opt $1"
;;
--root)
rebase_root=t
;;
- -f|--no-ff)
+ --force-rebase|--no-ff)
force_rebase=t
;;
--rerere-autoupdate|--no-rerere-autoupdate)
allow_rerere_autoupdate="$1"
;;
+ --gpg-sign)
+ gpg_sign_opt=-S
+ ;;
+ --gpg-sign=*)
+ gpg_sign_opt="-S${1#--gpg-sign=}"
+ ;;
--)
shift
break
diff --git a/git-request-pull.sh b/git-request-pull.sh
index fe21d5d..cf4f150 100755
--- a/git-request-pull.sh
+++ b/git-request-pull.sh
@@ -9,6 +9,7 @@ LONG_USAGE='Summarizes the changes between two commits to the standard output,
and includes the given URL in the generated summary.'
SUBDIRECTORY_OK='Yes'
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC='git request-pull [options] start url [end]
--
p show patch text as well
diff --git a/git-send-email.perl b/git-send-email.perl
index 2016d9c..fdb0029 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1095,7 +1095,8 @@ sub ssl_verify_params {
}
if (!defined $smtp_ssl_cert_path) {
- $smtp_ssl_cert_path = "/etc/ssl/certs";
+ # use the OpenSSL defaults
+ return (SSL_verify_mode => SSL_VERIFY_PEER());
}
if ($smtp_ssl_cert_path eq "") {
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index fffa3c7..5f28b32 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -72,6 +72,8 @@ if test -n "$OPTIONS_SPEC"; then
parseopt_extra=
[ -n "$OPTIONS_KEEPDASHDASH" ] &&
parseopt_extra="--keep-dashdash"
+ [ -n "$OPTIONS_STUCKLONG" ] &&
+ parseopt_extra="$parseopt_extra --stuck-long"
eval "$(
echo "$OPTIONS_SPEC" |
diff --git a/git-submodule.sh b/git-submodule.sh
index 4a30087..a33f68d 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -241,6 +241,15 @@ module_name()
#
# Clone a submodule
#
+# $1 = submodule path
+# $2 = submodule name
+# $3 = URL to clone
+# $4 = reference repository to reuse (empty for independent)
+# $5 = depth argument for shallow clones (empty for deep)
+# $6 = (remote-tracking) starting point for the local branch (empty for HEAD)
+# $7 = local branch to create (empty for a detached HEAD, unless $6 is
+# also empty, in which case the local branch is left unchanged)
+#
# Prior to calling, cmd_update checks that a possibly existing
# path is not a git repository.
# Likewise, cmd_add checks that path does not exist at all,
@@ -253,6 +262,8 @@ module_clone()
url=$3
reference="$4"
depth="$5"
+ start_point="$6"
+ local_branch="$7"
quiet=
if test -n "$GIT_QUIET"
then
@@ -306,7 +317,16 @@ module_clone()
echo "gitdir: $rel/$a" >"$sm_path/.git"
rel=$(echo $a | sed -e 's|[^/][^/]*|..|g')
- (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b")
+ (
+ clear_local_git_env
+ cd "$sm_path" &&
+ GIT_WORK_TREE=. git config core.worktree "$rel/$b" &&
+ # ash fails to wordsplit ${local_branch:+-B "$local_branch"...}
+ case "$local_branch" in
+ '') git checkout -f -q ${start_point:+"$start_point"} ;;
+ ?*) git checkout -f -q -B "$local_branch" ${start_point:+"$start_point"} ;;
+ esac
+ ) || die "$(eval_gettext "Unable to setup cloned submodule '\$sm_path'")"
}
isnumber()
@@ -469,16 +489,15 @@ Use -f if you really want to add it." >&2
echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
fi
fi
- module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit
- (
- clear_local_git_env
- cd "$sm_path" &&
- # ash fails to wordsplit ${branch:+-b "$branch"...}
- case "$branch" in
- '') git checkout -f -q ;;
- ?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
- esac
- ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")"
+ if test -n "$branch"
+ then
+ start_point="origin/$branch"
+ local_branch="$branch"
+ else
+ start_point=""
+ local_branch=""
+ fi
+ module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" "$start_point" "$local_branch" || exit
fi
git config submodule."$sm_name".url "$realrepo"
@@ -799,32 +818,35 @@ cmd_update()
fi
name=$(module_name "$sm_path") || exit
url=$(git config submodule."$name".url)
- branch=$(get_submodule_config "$name" branch master)
+ config_branch=$(get_submodule_config "$name" branch)
+ branch="${config_branch:-master}"
+ local_branch="$branch"
if ! test -z "$update"
then
update_module=$update
else
update_module=$(git config submodule."$name".update)
- case "$update_module" in
- '')
- ;; # Unset update mode
- checkout | rebase | merge | none)
- ;; # Known update modes
- !*)
- ;; # Custom update command
- *)
- die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
- ;;
- esac
+ if test -z "$update_module"
+ then
+ update_module="checkout"
+ fi
fi
displaypath=$(relative_path "$prefix$sm_path")
- if test "$update_module" = "none"
- then
+ case "$update_module" in
+ none)
echo "Skipping submodule '$displaypath'"
continue
- fi
+ ;;
+ checkout)
+ local_branch=""
+ ;;
+ rebase | merge | !*)
+ ;;
+ *)
+ die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
+ esac
if test -z "$url"
then
@@ -838,7 +860,8 @@ Maybe you want to use 'update --init'?")"
if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git
then
- module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit
+ start_point="origin/${branch}"
+ module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$start_point" "$local_branch" || exit
cloned_modules="$cloned_modules;$name"
subsha1=
else
@@ -884,11 +907,16 @@ Maybe you want to use 'update --init'?")"
case ";$cloned_modules;" in
*";$name;"*)
# then there is no local change to integrate
- update_module= ;;
+ update_module='!git reset --hard -q'
esac
must_die_on_failure=
case "$update_module" in
+ checkout)
+ command="git checkout $subforce -q"
+ die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
+ say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
+ ;;
rebase)
command="git rebase"
die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$displaypath'")"
@@ -908,10 +936,7 @@ Maybe you want to use 'update --init'?")"
must_die_on_failure=yes
;;
*)
- command="git checkout $subforce -q"
- die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
- say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
- ;;
+ die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
esac
if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
diff --git a/git.rc b/git.rc
index bce6db9..33aafb7 100644
--- a/git.rc
+++ b/git.rc
@@ -1,6 +1,6 @@
1 VERSIONINFO
-FILEVERSION MAJOR,MINOR,PATCH,0
-PRODUCTVERSION MAJOR,MINOR,PATCH,0
+FILEVERSION MAJOR,MINOR,0,0
+PRODUCTVERSION MAJOR,MINOR,0,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 33c3a6c..90764e8 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -2,7 +2,7 @@
# Tcl ignores the next line -*- tcl -*- \
exec wish "$0" -- "$@"
-# Copyright © 2005-2011 Paul Mackerras. All rights reserved.
+# Copyright © 2005-2014 Paul Mackerras. All rights reserved.
# This program is free software; it may be used, copied, modified
# and distributed under the terms of the GNU General Public Licence,
# either version 2, or (at your option) any later version.
@@ -2263,9 +2263,35 @@ proc makewindow {} {
# build up the bottom bar of upper window
${NS}::label .tf.lbar.flabel -text "[mc "Find"] "
- ${NS}::button .tf.lbar.fnext -text [mc "next"] -command {dofind 1 1}
- ${NS}::button .tf.lbar.fprev -text [mc "prev"] -command {dofind -1 1}
+
+ set bm_down_data {
+ #define down_width 16
+ #define down_height 16
+ static unsigned char down_bits[] = {
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x87, 0xe1, 0x8e, 0x71, 0x9c, 0x39, 0xb8, 0x1d,
+ 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01};
+ }
+ image create bitmap bm-down -data $bm_down_data -foreground $uifgcolor
+ ${NS}::button .tf.lbar.fnext -width 26 -command {dofind 1 1}
+ .tf.lbar.fnext configure -image bm-down
+
+ set bm_up_data {
+ #define up_width 16
+ #define up_height 16
+ static unsigned char up_bits[] = {
+ 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
+ 0xb8, 0x1d, 0x9c, 0x39, 0x8e, 0x71, 0x87, 0xe1,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01};
+ }
+ image create bitmap bm-up -data $bm_up_data -foreground $uifgcolor
+ ${NS}::button .tf.lbar.fprev -width 26 -command {dofind -1 1}
+ .tf.lbar.fprev configure -image bm-up
+
${NS}::label .tf.lbar.flab2 -text " [mc "commit"] "
+
pack .tf.lbar.flabel .tf.lbar.fnext .tf.lbar.fprev .tf.lbar.flab2 \
-side left -fill y
set gdttype [mc "containing:"]
@@ -2403,7 +2429,7 @@ proc makewindow {} {
$ctext tag conf msep -font textfontbold
$ctext tag conf found -back $foundbgcolor
$ctext tag conf currentsearchhit -back $currentsearchhitbgcolor
- $ctext tag conf wwrap -wrap word
+ $ctext tag conf wwrap -wrap word -lmargin2 1c
$ctext tag conf bold -font textfontbold
.pwbottom add .bleft
@@ -2761,14 +2787,17 @@ proc savestuff {w} {
global linkfgcolor circleoutlinecolor
global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk
global hideremotes want_ttk maxrefs
+ global config_file config_file_tmp
if {$stuffsaved} return
if {![winfo viewable .]} return
catch {
- if {[file exists ~/.gitk-new]} {file delete -force ~/.gitk-new}
- set f [open "~/.gitk-new" w]
+ if {[file exists $config_file_tmp]} {
+ file delete -force $config_file_tmp
+ }
+ set f [open $config_file_tmp w]
if {$::tcl_platform(platform) eq {windows}} {
- file attributes "~/.gitk-new" -hidden true
+ file attributes $config_file_tmp -hidden true
}
puts $f [list set mainfont $mainfont]
puts $f [list set textfont $textfont]
@@ -2845,7 +2874,7 @@ proc savestuff {w} {
}
puts $f "}"
close $f
- file rename -force "~/.gitk-new" "~/.gitk"
+ file rename -force $config_file_tmp $config_file
}
set stuffsaved 1
}
@@ -2947,7 +2976,7 @@ proc about {} {
message $w.m -text [mc "
Gitk - a commit viewer for git
-Copyright \u00a9 2005-2011 Paul Mackerras
+Copyright \u00a9 2005-2014 Paul Mackerras
Use and redistribute under the terms of the GNU General Public License"] \
-justify center -aspect 400 -border 2 -bg white -relief groove
@@ -7922,7 +7951,7 @@ proc blobdiffmaybeseehere {ateof} {
if {$diffseehere >= 0} {
mark_ctext_line [lindex [split $diffseehere .] 0]
}
- maybe_scroll_ctext ateof
+ maybe_scroll_ctext $ateof
}
proc getblobdiffline {bdf ids} {
@@ -12058,7 +12087,29 @@ namespace import ::msgcat::mc
## And eventually load the actual message catalog
::msgcat::mcload $gitk_msgsdir
-catch {source ~/.gitk}
+catch {
+ # follow the XDG base directory specification by default. See
+ # http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+ if {[info exists env(XDG_CONFIG_HOME)] && $env(XDG_CONFIG_HOME) ne ""} {
+ # XDG_CONFIG_HOME environment variable is set
+ set config_file [file join $env(XDG_CONFIG_HOME) git gitk]
+ set config_file_tmp [file join $env(XDG_CONFIG_HOME) git gitk-tmp]
+ } else {
+ # default XDG_CONFIG_HOME
+ set config_file "~/.config/git/gitk"
+ set config_file_tmp "~/.config/git/gitk-tmp"
+ }
+ if {![file exists $config_file]} {
+ # for backward compatibility use the old config file if it exists
+ if {[file exists "~/.gitk"]} {
+ set config_file "~/.gitk"
+ set config_file_tmp "~/.gitk-tmp"
+ } elseif {![file exists [file dirname $config_file]]} {
+ file mkdir [file dirname $config_file]
+ }
+ }
+ source $config_file
+}
parsefont mainfont $mainfont
eval font create mainfont [fontflags mainfont]
diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po
new file mode 100644
index 0000000..782397e
--- /dev/null
+++ b/gitk-git/po/bg.po
@@ -0,0 +1,1334 @@
+# Bulgarian translation of gitk po-file.
+# Copyright (C) 2014 Alexander Shopov <ash@kambanaria.org>.
+# This file is distributed under the same license as the git package.
+# Alexander Shopov <ash@kambanaria.org>, 2014.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gitk master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-26 15:47-0800\n"
+"PO-Revision-Date: 2014-01-08 08:03+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: gitk:140
+msgid "Couldn't get list of unmerged files:"
+msgstr "Списъкът с неслети файлове не може да бъде получен:"
+
+#: gitk:212 gitk:2353
+msgid "Color words"
+msgstr "Оцветяване на думите"
+
+#: gitk:217 gitk:2353 gitk:8103 gitk:8136
+msgid "Markup words"
+msgstr "Отбелязване на думите"
+
+#: gitk:322
+msgid "Error parsing revisions:"
+msgstr "Грешка при разбор на версиите:"
+
+#: gitk:378
+msgid "Error executing --argscmd command:"
+msgstr "Грешка при изпълнение на командата с „--argscmd“."
+
+#: gitk:391
+msgid "No files selected: --merge specified but no files are unmerged."
+msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове."
+
+#: gitk:394
+msgid ""
+"No files selected: --merge specified but no unmerged files are within file "
+"limit."
+msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове в ограниченията."
+
+#: gitk:416 gitk:564
+msgid "Error executing git log:"
+msgstr "Грешка при изпълнение на „git log“:"
+
+#: gitk:434 gitk:580
+msgid "Reading"
+msgstr "Прочитане"
+
+#: gitk:494 gitk:4429
+msgid "Reading commits..."
+msgstr "Прочитане на подаванията…"
+
+#: gitk:497 gitk:1635 gitk:4432
+msgid "No commits selected"
+msgstr "Не са избрани подавания"
+
+#: gitk:1509
+msgid "Can't parse git log output:"
+msgstr "Изходът от „git log“ не може да се анализира:"
+
+#: gitk:1738
+msgid "No commit information available"
+msgstr "Липсва информация за подавания"
+
+#: gitk:1895
+msgid "mc"
+msgstr "mc"
+
+#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401
+msgid "OK"
+msgstr "Добре"
+
+#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554
+#: gitk:11123 gitk:11402
+msgid "Cancel"
+msgstr "Отказ"
+
+#: gitk:2067
+msgid "Update"
+msgstr "Обновяване"
+
+#: gitk:2068
+msgid "Reload"
+msgstr "Презареждане"
+
+#: gitk:2069
+msgid "Reread references"
+msgstr "Наново прочитане на настройките"
+
+#: gitk:2070
+msgid "List references"
+msgstr "Изброяване на указателите"
+
+#: gitk:2072
+msgid "Start git gui"
+msgstr "Стартиране на git gui"
+
+#: gitk:2074
+msgid "Quit"
+msgstr "Спиране на програмата"
+
+#: gitk:2066
+msgid "File"
+msgstr "Файл"
+
+#: gitk:2078
+msgid "Preferences"
+msgstr "Настройки"
+
+#: gitk:2077
+msgid "Edit"
+msgstr "Редактиране"
+
+#: gitk:2082
+msgid "New view..."
+msgstr "Нов изглед…"
+
+#: gitk:2083
+msgid "Edit view..."
+msgstr "Редактиране на изгледа…"
+
+#: gitk:2084
+msgid "Delete view"
+msgstr "Изтриване на изгледа"
+
+#: gitk:2086
+msgid "All files"
+msgstr "Всички файлове"
+
+#: gitk:2081 gitk:3975
+msgid "View"
+msgstr "Изглед"
+
+#: gitk:2091 gitk:2101 gitk:2945
+msgid "About gitk"
+msgstr "Относно gitk"
+
+#: gitk:2092 gitk:2106
+msgid "Key bindings"
+msgstr "Клавишни комбинации"
+
+#: gitk:2090 gitk:2105
+msgid "Help"
+msgstr "Помощ"
+
+#: gitk:2183 gitk:8535
+msgid "SHA1 ID:"
+msgstr "SHA1:"
+
+#: gitk:2227
+msgid "Row"
+msgstr "Ред"
+
+#: gitk:2265
+msgid "Find"
+msgstr "Търсене"
+
+#: gitk:2266
+msgid "next"
+msgstr "следващо"
+
+#: gitk:2267
+msgid "prev"
+msgstr "предишно"
+
+#: gitk:2268
+msgid "commit"
+msgstr "подаване"
+
+#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725
+#: gitk:6810
+msgid "containing:"
+msgstr "съдържащо:"
+
+#: gitk:2274 gitk:3457 gitk:3462 gitk:4666
+msgid "touching paths:"
+msgstr "засягащо пътищата:"
+
+#: gitk:2275 gitk:4680
+msgid "adding/removing string:"
+msgstr "добавящо/премахващо низ"
+
+#: gitk:2276 gitk:4682
+msgid "changing lines matching:"
+msgstr "променящо редове напасващи:"
+
+#: gitk:2285 gitk:2287 gitk:4669
+msgid "Exact"
+msgstr "Точно"
+
+#: gitk:2287 gitk:4757 gitk:6621
+msgid "IgnCase"
+msgstr "Без регистър"
+
+#: gitk:2287 gitk:4639 gitk:4755 gitk:6617
+msgid "Regexp"
+msgstr "Рег. изр."
+
+#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814
+msgid "All fields"
+msgstr "Всички полета"
+
+#: gitk:2290 gitk:4774 gitk:4807 gitk:6684
+msgid "Headline"
+msgstr "Първи ред"
+
+#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283
+msgid "Comments"
+msgstr "Коментари"
+
+#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713
+#: gitk:8728
+msgid "Author"
+msgstr "Автор"
+
+#: gitk:2291 gitk:4774 gitk:6684 gitk:7220
+msgid "Committer"
+msgstr "Подаващ"
+
+#: gitk:2322
+msgid "Search"
+msgstr "Търсене"
+
+#: gitk:2330
+msgid "Diff"
+msgstr "Разлики"
+
+#: gitk:2332
+msgid "Old version"
+msgstr "Стара версия"
+
+#: gitk:2334
+msgid "New version"
+msgstr "Нова версия"
+
+#: gitk:2336
+msgid "Lines of context"
+msgstr "Контекст в редове"
+
+#: gitk:2346
+msgid "Ignore space change"
+msgstr "Празните знаци без значение"
+
+#: gitk:2350 gitk:2352 gitk:7842 gitk:8089
+msgid "Line diff"
+msgstr "Поредови разлики"
+
+#: gitk:2417
+msgid "Patch"
+msgstr "Кръпка"
+
+#: gitk:2419
+msgid "Tree"
+msgstr "Дърво"
+
+#: gitk:2577 gitk:2597
+msgid "Diff this -> selected"
+msgstr "Разлики между това и избраното"
+
+#: gitk:2578 gitk:2598
+msgid "Diff selected -> this"
+msgstr "Разлики между избраното и това"
+
+#: gitk:2579 gitk:2599
+msgid "Make patch"
+msgstr "Създаване на кръпка"
+
+#: gitk:2580 gitk:9137
+msgid "Create tag"
+msgstr "Създаване на етикет"
+
+#: gitk:2581 gitk:9254
+msgid "Write commit to file"
+msgstr "Запазване на подаването във файл"
+
+#: gitk:2582 gitk:9311
+msgid "Create new branch"
+msgstr "Създаване на нов клон"
+
+#: gitk:2583
+msgid "Cherry-pick this commit"
+msgstr "Отбиране на това подаване"
+
+#: gitk:2584
+msgid "Reset HEAD branch to here"
+msgstr "Привеждане на върха на клона към текущото подаване"
+
+#: gitk:2585
+msgid "Mark this commit"
+msgstr "Отбелязване на това подаване"
+
+#: gitk:2586
+msgid "Return to mark"
+msgstr "Връщане към отбелязаното подаване"
+
+#: gitk:2587
+msgid "Find descendant of this and mark"
+msgstr "Откриване и отбелязване на наследниците"
+
+#: gitk:2588
+msgid "Compare with marked commit"
+msgstr "Сравнение с отбелязаното подаване"
+
+#: gitk:2589 gitk:2600
+msgid "Diff this -> marked commit"
+msgstr "Разлики между това и отбелязаното"
+
+#: gitk:2590 gitk:2601
+msgid "Diff marked commit -> this"
+msgstr "Разлики между отбелязаното и това"
+
+#: gitk:2591
+msgid "Revert this commit"
+msgstr "Отмяна на това подаване"
+
+#: gitk:2607
+msgid "Check out this branch"
+msgstr "Изтегляне на този клон"
+
+#: gitk:2608
+msgid "Remove this branch"
+msgstr "Изтриване на този клон"
+
+#: gitk:2615
+msgid "Highlight this too"
+msgstr "Отбелязване и на това"
+
+#: gitk:2616
+msgid "Highlight this only"
+msgstr "Отбелязване само на това"
+
+#: gitk:2617
+msgid "External diff"
+msgstr "Външна програма за разлики"
+
+#: gitk:2618
+msgid "Blame parent commit"
+msgstr "Анотиране на родителското подаване"
+
+#: gitk:2625
+msgid "Show origin of this line"
+msgstr "Показване на произхода на този ред"
+
+#: gitk:2626
+msgid "Run git gui blame on this line"
+msgstr "Изпълнение на „git gui blame“ върху този ред"
+
+#: gitk:2947
+msgid ""
+"\n"
+"Gitk - a commit viewer for git\n"
+"\n"
+"Copyright © 2005-2011 Paul Mackerras\n"
+"\n"
+"Use and redistribute under the terms of the GNU General Public License"
+msgstr ""
+"\n"
+"Gitk — визуализация на подаванията в Git\n"
+"\n"
+"Авторски права: © 2005-2011 Paul Mackerras\n"
+"\n"
+"Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
+
+#: gitk:2955 gitk:3020 gitk:9738
+msgid "Close"
+msgstr "Затваряне"
+
+#: gitk:2976
+msgid "Gitk key bindings"
+msgstr "Клавишни комбинации"
+
+#: gitk:2979
+msgid "Gitk key bindings:"
+msgstr "Клавишни комбинации:"
+
+#: gitk:2981
+#, tcl-format
+msgid "<%s-Q>\t\tQuit"
+msgstr "<%s-Q>\t\tСпиране на програмата"
+
+#: gitk:2982
+#, tcl-format
+msgid "<%s-W>\t\tClose window"
+msgstr "<%s-W>\t\tЗатваряне на прозореца"
+
+#: gitk:2983
+msgid "<Home>\t\tMove to first commit"
+msgstr "<Home>\t\tКъм първото подаване"
+
+#: gitk:2984
+msgid "<End>\t\tMove to last commit"
+msgstr "<End>\t\tКъм последното подаване"
+
+#: gitk:2985
+msgid "<Up>, p, k\tMove up one commit"
+msgstr "<Up>, p, k\tЕдно подаване нагоре"
+
+#: gitk:2986
+msgid "<Down>, n, j\tMove down one commit"
+msgstr "<Down>, n, j\tЕдно подаване надолу"
+
+#: gitk:2987
+msgid "<Left>, z, h\tGo back in history list"
+msgstr "<Left>, z, h\tНазад в историята"
+
+#: gitk:2988
+msgid "<Right>, x, l\tGo forward in history list"
+msgstr "<Right>, x, l\tНапред в историята"
+
+#: gitk:2989
+msgid "<PageUp>\tMove up one page in commit list"
+msgstr "<PageUp>\tЕдна страница нагоре в списъка с подаванията"
+
+#: gitk:2990
+msgid "<PageDown>\tMove down one page in commit list"
+msgstr "<PageDown>\tЕдна страница надолу в списъка с подаванията"
+
+#: gitk:2991
+#, tcl-format
+msgid "<%s-Home>\tScroll to top of commit list"
+msgstr "<%s-Home>\tКъм началото на списъка с подаванията"
+
+#: gitk:2992
+#, tcl-format
+msgid "<%s-End>\tScroll to bottom of commit list"
+msgstr "<%s-End>\tКъм края на списъка с подаванията"
+
+#: gitk:2993
+#, tcl-format
+msgid "<%s-Up>\tScroll commit list up one line"
+msgstr "<%s-Up>\tПридвижване на списъка с подавания с един ред нагоре"
+
+#: gitk:2994
+#, tcl-format
+msgid "<%s-Down>\tScroll commit list down one line"
+msgstr "<%s-Down>\tПридвижване на списъка с подавания с един ред надолу"
+
+#: gitk:2995
+#, tcl-format
+msgid "<%s-PageUp>\tScroll commit list up one page"
+msgstr "<%s-PageUp>\tПридвижване на списъка с подавания с една страница нагоре"
+
+#: gitk:2996
+#, tcl-format
+msgid "<%s-PageDown>\tScroll commit list down one page"
+msgstr "<%s-PageDown>\tПридвижване на списъка с подавания с една страница надолу"
+
+#: gitk:2997
+msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
+msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)"
+
+#: gitk:2998
+msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
+msgstr "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
+
+#: gitk:2999
+msgid "<Delete>, b\tScroll diff view up one page"
+msgstr "<Delete>, b\tПридвижване на изгледа за разлики една страница нагоре"
+
+#: gitk:3000
+msgid "<Backspace>\tScroll diff view up one page"
+msgstr "<Backspace>\tПридвижване на изгледа за разлики една страница нагоре"
+
+#: gitk:3001
+msgid "<Space>\t\tScroll diff view down one page"
+msgstr "<Space>\t\tПридвижване на изгледа за разлики една страница надолу"
+
+#: gitk:3002
+msgid "u\t\tScroll diff view up 18 lines"
+msgstr "u\t\tПридвижване на изгледа за разлики 18 реда нагоре"
+
+#: gitk:3003
+msgid "d\t\tScroll diff view down 18 lines"
+msgstr "d\t\tПридвижване на изгледа за разлики 18 реда надолу"
+
+#: gitk:3004
+#, tcl-format
+msgid "<%s-F>\t\tFind"
+msgstr "<%s-F>\t\tТърсене"
+
+#: gitk:3005
+#, tcl-format
+msgid "<%s-G>\t\tMove to next find hit"
+msgstr "<%s-G>\t\tКъм следващата поява"
+
+#: gitk:3006
+msgid "<Return>\tMove to next find hit"
+msgstr "<Return>\tКъм следващата поява"
+
+#: gitk:3007
+msgid "/\t\tFocus the search box"
+msgstr "/\t\tФокус върху полето за търсене"
+
+#: gitk:3008
+msgid "?\t\tMove to previous find hit"
+msgstr "?\t\tКъм предишната поява"
+
+#: gitk:3009
+msgid "f\t\tScroll diff view to next file"
+msgstr "f\t\tПридвижване на изгледа за разлики към следващия ред"
+
+#: gitk:3010
+#, tcl-format
+msgid "<%s-S>\t\tSearch for next hit in diff view"
+msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики"
+
+#: gitk:3011
+#, tcl-format
+msgid "<%s-R>\t\tSearch for previous hit in diff view"
+msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики"
+
+#: gitk:3012
+#, tcl-format
+msgid "<%s-KP+>\tIncrease font size"
+msgstr "<%s-KP+>\tПо-голям размер на шрифта"
+
+#: gitk:3013
+#, tcl-format
+msgid "<%s-plus>\tIncrease font size"
+msgstr "<%s-plus>\tПо-голям размер на шрифта"
+
+#: gitk:3014
+#, tcl-format
+msgid "<%s-KP->\tDecrease font size"
+msgstr "<%s-KP->\tПо-малък размер на шрифта"
+
+#: gitk:3015
+#, tcl-format
+msgid "<%s-minus>\tDecrease font size"
+msgstr "<%s-minus>\tПо-малък размер на шрифта"
+
+#: gitk:3016
+msgid "<F5>\t\tUpdate"
+msgstr "<F5>\t\tОбновяване"
+
+#: gitk:3471 gitk:3480
+#, tcl-format
+msgid "Error creating temporary directory %s:"
+msgstr "Грешка при създаването на временната директория „%s“:"
+
+#: gitk:3493
+#, tcl-format
+msgid "Error getting \"%s\" from %s:"
+msgstr "Грешка при получаването на „%s“ от %s:"
+
+#: gitk:3556
+msgid "command failed:"
+msgstr "неуспешно изпълнение на команда:"
+
+#: gitk:3705
+msgid "No such commit"
+msgstr "Такова подаване няма"
+
+#: gitk:3719
+msgid "git gui blame: command failed:"
+msgstr "git gui blame: неуспешно изпълнение на команда:"
+
+#: gitk:3750
+#, tcl-format
+msgid "Couldn't read merge head: %s"
+msgstr "Върхът за сливане не може да бъде прочетен: %s"
+
+#: gitk:3758
+#, tcl-format
+msgid "Error reading index: %s"
+msgstr "Грешка при прочитане на индекса: %s"
+
+#: gitk:3783
+#, tcl-format
+msgid "Couldn't start git blame: %s"
+msgstr "Командата „git blame“ не може да бъде стартирана: %s"
+
+#: gitk:3786 gitk:6652
+msgid "Searching"
+msgstr "Търсене"
+
+#: gitk:3818
+#, tcl-format
+msgid "Error running git blame: %s"
+msgstr "Грешка при изпълнението на „git blame“: %s"
+
+#: gitk:3846
+#, tcl-format
+msgid "That line comes from commit %s, which is not in this view"
+msgstr "Този ред идва от подаването %s, което не е в изгледа"
+
+#: gitk:3860
+msgid "External diff viewer failed:"
+msgstr "Неуспешно изпълнение на външната програма за разлики:"
+
+#: gitk:3978
+msgid "Gitk view definition"
+msgstr "Дефиниция на изглед в Gitk"
+
+#: gitk:3982
+msgid "Remember this view"
+msgstr "Запазване на този изглед"
+
+#: gitk:3983
+msgid "References (space separated list):"
+msgstr "Указатели (списък с разделител интервал):"
+
+#: gitk:3984
+msgid "Branches & tags:"
+msgstr "Клони и етикети:"
+
+#: gitk:3985
+msgid "All refs"
+msgstr "Всички указатели"
+
+#: gitk:3986
+msgid "All (local) branches"
+msgstr "Всички (локални) клони"
+
+#: gitk:3987
+msgid "All tags"
+msgstr "Всички етикети"
+
+#: gitk:3988
+msgid "All remote-tracking branches"
+msgstr "Всички следящи клони"
+
+#: gitk:3989
+msgid "Commit Info (regular expressions):"
+msgstr "Информация за подаване (рег. изр.):"
+
+#: gitk:3990
+msgid "Author:"
+msgstr "Автор:"
+
+#: gitk:3991
+msgid "Committer:"
+msgstr "Подал:"
+
+#: gitk:3992
+msgid "Commit Message:"
+msgstr "Съобщение при подаване:"
+
+#: gitk:3993
+msgid "Matches all Commit Info criteria"
+msgstr "Съвпадение по коя да е информация за подаването"
+
+#: gitk:3994
+msgid "Changes to Files:"
+msgstr "Промени по файловете:"
+
+#: gitk:3995
+msgid "Fixed String"
+msgstr "Дословен низ"
+
+#: gitk:3996
+msgid "Regular Expression"
+msgstr "Регулярен израз"
+
+#: gitk:3997
+msgid "Search string:"
+msgstr "Низ за търсене:"
+
+#: gitk:3998
+msgid ""
+"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
+"15:27:38\"):"
+msgstr "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, „March 17, 2009 15:27:38“):"
+
+#: gitk:3999
+msgid "Since:"
+msgstr "От:"
+
+#: gitk:4000
+msgid "Until:"
+msgstr "До:"
+
+#: gitk:4001
+msgid "Limit and/or skip a number of revisions (positive integer):"
+msgstr "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло число):"
+
+#: gitk:4002
+msgid "Number to show:"
+msgstr "Брой показани:"
+
+#: gitk:4003
+msgid "Number to skip:"
+msgstr "Брой прескочени:"
+
+#: gitk:4004
+msgid "Miscellaneous options:"
+msgstr "Разни:"
+
+#: gitk:4005
+msgid "Strictly sort by date"
+msgstr "Подреждане по дата"
+
+#: gitk:4006
+msgid "Mark branch sides"
+msgstr "Отбелязване на страните по клона"
+
+#: gitk:4007
+msgid "Limit to first parent"
+msgstr "Само първият родител"
+
+#: gitk:4008
+msgid "Simple history"
+msgstr "Опростена история"
+
+#: gitk:4009
+msgid "Additional arguments to git log:"
+msgstr "Допълнителни аргументи към „git log“:"
+
+#: gitk:4010
+msgid "Enter files and directories to include, one per line:"
+msgstr "Въведете файловете и директориите за включване, по елемент на ред"
+
+#: gitk:4011
+msgid "Command to generate more commits to include:"
+msgstr "Команда за генерирането на допълнителни подавания, които да бъдат включени:"
+
+#: gitk:4135
+msgid "Gitk: edit view"
+msgstr "Gitk: редактиране на изглед"
+
+#: gitk:4143
+msgid "-- criteria for selecting revisions"
+msgstr "— критерии за избор на версии"
+
+#: gitk:4148
+msgid "View Name"
+msgstr "Име на изглед"
+
+#: gitk:4223
+msgid "Apply (F5)"
+msgstr "Прилагане (F5)"
+
+#: gitk:4261
+msgid "Error in commit selection arguments:"
+msgstr "Грешка в аргументите за избор на подавания:"
+
+#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185
+msgid "None"
+msgstr "Няма"
+
+#: gitk:4924 gitk:4929
+msgid "Descendant"
+msgstr "Наследник"
+
+#: gitk:4925
+msgid "Not descendant"
+msgstr "Не е наследник"
+
+#: gitk:4932 gitk:4937
+msgid "Ancestor"
+msgstr "Предшественик"
+
+#: gitk:4933
+msgid "Not ancestor"
+msgstr "Не е предшественик"
+
+#: gitk:5223
+msgid "Local changes checked in to index but not committed"
+msgstr "Локални промени добавени към индекса, но неподадени"
+
+#: gitk:5259
+msgid "Local uncommitted changes, not checked in to index"
+msgstr "Локални промени извън индекса"
+
+#: gitk:7032
+msgid "and many more"
+msgstr "и още много"
+
+#: gitk:7035
+msgid "many"
+msgstr "много"
+
+#: gitk:7222
+msgid "Tags:"
+msgstr "Етикети:"
+
+#: gitk:7239 gitk:7245 gitk:8708
+msgid "Parent"
+msgstr "Родител"
+
+#: gitk:7250
+msgid "Child"
+msgstr "Дете"
+
+#: gitk:7259
+msgid "Branch"
+msgstr "Клон"
+
+#: gitk:7262
+msgid "Follows"
+msgstr "Следва"
+
+#: gitk:7265
+msgid "Precedes"
+msgstr "Предшества"
+
+#: gitk:7849
+#, tcl-format
+msgid "Error getting diffs: %s"
+msgstr "Грешка при получаването на разликите: %s"
+
+#: gitk:8533
+msgid "Goto:"
+msgstr "Към ред:"
+
+#: gitk:8554
+#, tcl-format
+msgid "Short SHA1 id %s is ambiguous"
+msgstr "Съкратената SHA1 %s не е еднозначна"
+
+#: gitk:8561
+#, tcl-format
+msgid "Revision %s is not known"
+msgstr "Непозната версия %s"
+
+#: gitk:8571
+#, tcl-format
+msgid "SHA1 id %s is not known"
+msgstr "Непозната SHA1 %s"
+
+#: gitk:8573
+#, tcl-format
+msgid "Revision %s is not in the current view"
+msgstr "Версия %s не е в текущия изглед"
+
+#: gitk:8715 gitk:8730
+msgid "Date"
+msgstr "Дата"
+
+#: gitk:8718
+msgid "Children"
+msgstr "Деца"
+
+#: gitk:8781
+#, tcl-format
+msgid "Reset %s branch to here"
+msgstr "Зануляване на клона „%s“ към текущото подаване"
+
+#: gitk:8783
+msgid "Detached head: can't reset"
+msgstr "Несвързан връх: невъзможно зануляване"
+
+#: gitk:8888 gitk:8894
+msgid "Skipping merge commit "
+msgstr "Пропускане на подаването на сливането"
+
+#: gitk:8903 gitk:8908
+msgid "Error getting patch ID for "
+msgstr "Грешка при получаването на идентификатора на "
+
+#: gitk:8904 gitk:8909
+msgid " - stopping\n"
+msgstr " — спиране\n"
+
+#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948
+msgid "Commit "
+msgstr "Подаване"
+
+#: gitk:8918
+msgid ""
+" is the same patch as\n"
+" "
+msgstr ""
+" е същата кръпка като\n"
+" "
+
+#: gitk:8926
+msgid ""
+" differs from\n"
+" "
+msgstr ""
+" се различава от\n"
+" "
+
+#: gitk:8928
+msgid ""
+"Diff of commits:\n"
+"\n"
+msgstr "Разлика между подаванията:\n\n"
+
+#: gitk:8940 gitk:8949
+#, tcl-format
+msgid " has %s children - stopping\n"
+msgstr " има %s деца — спиране\n"
+
+#: gitk:8968
+#, tcl-format
+msgid "Error writing commit to file: %s"
+msgstr "Грешка при запазването на подаването във файл: %s"
+
+#: gitk:8974
+#, tcl-format
+msgid "Error diffing commits: %s"
+msgstr "Грешка при изчисляването на разликите между подаванията: %s"
+
+#: gitk:9020
+msgid "Top"
+msgstr "Най-горе"
+
+#: gitk:9021
+msgid "From"
+msgstr "От"
+
+#: gitk:9026
+msgid "To"
+msgstr "До"
+
+#: gitk:9050
+msgid "Generate patch"
+msgstr "Генериране на кръпка"
+
+#: gitk:9052
+msgid "From:"
+msgstr "От:"
+
+#: gitk:9061
+msgid "To:"
+msgstr "До:"
+
+#: gitk:9070
+msgid "Reverse"
+msgstr "Обръщане"
+
+#: gitk:9072 gitk:9268
+msgid "Output file:"
+msgstr "Запазване във файла:"
+
+#: gitk:9078
+msgid "Generate"
+msgstr "Генериране"
+
+#: gitk:9116
+msgid "Error creating patch:"
+msgstr "Грешка при създаването на кръпка:"
+
+#: gitk:9139 gitk:9256 gitk:9313
+msgid "ID:"
+msgstr "Идентификатор:"
+
+#: gitk:9148
+msgid "Tag name:"
+msgstr "Име на етикет:"
+
+#: gitk:9151
+msgid "Tag message is optional"
+msgstr "Съобщението за етикет е незадължително"
+
+#: gitk:9153
+msgid "Tag message:"
+msgstr "Съобщение за етикет:"
+
+#: gitk:9157 gitk:9322
+msgid "Create"
+msgstr "Създаване"
+
+#: gitk:9175
+msgid "No tag name specified"
+msgstr "Липсва име на етикет"
+
+#: gitk:9179
+#, tcl-format
+msgid "Tag \"%s\" already exists"
+msgstr "Етикетът „%s“ вече съществува"
+
+#: gitk:9189
+msgid "Error creating tag:"
+msgstr "Грешка при създаването на етикет:"
+
+#: gitk:9265
+msgid "Command:"
+msgstr "Команда:"
+
+#: gitk:9273
+msgid "Write"
+msgstr "Pdmdpldke"
+
+#: gitk:9291
+msgid "Error writing commit:"
+msgstr "Грешка при запазването на подаването:"
+
+#: gitk:9318
+msgid "Name:"
+msgstr "Име:"
+
+#: gitk:9341
+msgid "Please specify a name for the new branch"
+msgstr "Укажете име за новия клон"
+
+#: gitk:9346
+#, tcl-format
+msgid "Branch '%s' already exists. Overwrite?"
+msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?"
+
+#: gitk:9413
+#, tcl-format
+msgid "Commit %s is already included in branch %s -- really re-apply it?"
+msgstr "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
+
+#: gitk:9418
+msgid "Cherry-picking"
+msgstr "Отбиране"
+
+#: gitk:9427
+#, tcl-format
+msgid ""
+"Cherry-pick failed because of local changes to file '%s'.\n"
+"Please commit, reset or stash your changes and try again."
+msgstr ""
+"Неуспешно отбиране, защото във файла „%s“ има локални промени.\n"
+"Подайте, занулете или ги скатайте и пробвайте отново."
+
+#: gitk:9433
+msgid ""
+"Cherry-pick failed because of merge conflict.\n"
+"Do you wish to run git citool to resolve it?"
+msgstr ""
+"Неуспешно отбиране поради конфликти при сливане.\n"
+"Искате ли да ги коригирате чрез „git citool“?"
+
+#: gitk:9449 gitk:9507
+msgid "No changes committed"
+msgstr "Не са подадени промени"
+
+#: gitk:9476
+#, tcl-format
+msgid "Commit %s is not included in branch %s -- really revert it?"
+msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?"
+
+#: gitk:9481
+msgid "Reverting"
+msgstr "Отмяна"
+
+#: gitk:9489
+#, tcl-format
+msgid ""
+"Revert failed because of local changes to the following files:%s Please "
+"commit, reset or stash your changes and try again."
+msgstr ""
+"Неуспешна отмяна, защото във файла „%s“ има локални промени.\n"
+"Подайте, занулете или ги скатайте и пробвайте отново.<"
+
+#: gitk:9493
+msgid ""
+"Revert failed because of merge conflict.\n"
+" Do you wish to run git citool to resolve it?"
+msgstr ""
+"Неуспешно отмяна поради конфликти при сливане.\n"
+"Искате ли да ги коригирате чрез „git citool“?"
+
+#: gitk:9536
+msgid "Confirm reset"
+msgstr "Потвърждаване на зануляването"
+
+#: gitk:9538
+#, tcl-format
+msgid "Reset branch %s to %s?"
+msgstr "Да се занули ли клона „%s“ към „%s“?"
+
+#: gitk:9540
+msgid "Reset type:"
+msgstr "Вид зануляване:"
+
+#: gitk:9543
+msgid "Soft: Leave working tree and index untouched"
+msgstr "Слабо: работното дърво и индекса остават същите"
+
+#: gitk:9546
+msgid "Mixed: Leave working tree untouched, reset index"
+msgstr "Смесено: работното дърво остава същото, индексът се занулява"
+
+#: gitk:9549
+msgid ""
+"Hard: Reset working tree and index\n"
+"(discard ALL local changes)"
+msgstr ""
+"Силно: зануляване и на работното дърво, и на индекса\n"
+"(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)"
+
+#: gitk:9566
+msgid "Resetting"
+msgstr "Зануляване"
+
+#: gitk:9626
+msgid "Checking out"
+msgstr "Изтегляне"
+
+#: gitk:9679
+msgid "Cannot delete the currently checked-out branch"
+msgstr "Текущо изтегленият клон не може да бъде изтрит"
+
+#: gitk:9685
+#, tcl-format
+msgid ""
+"The commits on branch %s aren't on any other branch.\n"
+"Really delete branch %s?"
+msgstr ""
+"Подаванията на клона „%s“ не са на никой друг клон.\n"
+"Наистина ли да се изтрие клона „%s“?"
+
+#: gitk:9716
+#, tcl-format
+msgid "Tags and heads: %s"
+msgstr "Етикети и върхове: %s"
+
+#: gitk:9731
+msgid "Filter"
+msgstr "Филтриране"
+
+#: gitk:10027
+msgid ""
+"Error reading commit topology information; branch and preceding/following "
+"tag information will be incomplete."
+msgstr "Грешка при прочитането на топологията на подаванията. Информацията за клона и предшестващите/следващите етикети ще е непълна."
+
+#: gitk:11004
+msgid "Tag"
+msgstr "Етикет"
+
+#: gitk:11008
+msgid "Id"
+msgstr "Идентификатор"
+
+#: gitk:11091
+msgid "Gitk font chooser"
+msgstr "Избор на шрифт за Gitk"
+
+#: gitk:11108
+msgid "B"
+msgstr "Ч"
+
+#: gitk:11111
+msgid "I"
+msgstr "К"
+
+#: gitk:11229
+msgid "Commit list display options"
+msgstr "Настройки на списъка с подавания"
+
+#: gitk:11232
+msgid "Maximum graph width (lines)"
+msgstr "Максимална широчина на графа (в редове)"
+
+#: gitk:11235
+#, tcl-format
+msgid "Maximum graph width (% of pane)"
+msgstr "Максимална широчина на графа (% от панела)"
+
+#: gitk:11238
+msgid "Show local changes"
+msgstr "Показване на локалните промени"
+
+#: gitk:11241
+msgid "Auto-select SHA1 (length)"
+msgstr "Автоматично избиране на SHA1 (дължина)"
+
+#: gitk:11245
+msgid "Hide remote refs"
+msgstr "Скриване на отдалечените указатели"
+
+#: gitk:11249
+msgid "Diff display options"
+msgstr "Настройки на показването на разликите"
+
+#: gitk:11251
+msgid "Tab spacing"
+msgstr "Широчина на табулатора"
+
+#: gitk:11254
+msgid "Display nearby tags/heads"
+msgstr "Извеждане на близките етикети и върхове"
+
+#: gitk:11257
+msgid "Maximum # tags/heads to show"
+msgstr "Максимален брой етикети/върхове за показване"
+
+#: gitk:11260
+msgid "Limit diffs to listed paths"
+msgstr "Разлика само в избраните пътища"
+
+#: gitk:11263
+msgid "Support per-file encodings"
+msgstr "Поддръжка на различни кодирания за всеки файл"
+
+#: gitk:11269 gitk:11416
+msgid "External diff tool"
+msgstr "Външен инструмент за разлики"
+
+#: gitk:11270
+msgid "Choose..."
+msgstr "Избор…"
+
+#: gitk:11275
+msgid "General options"
+msgstr "Общи настройки"
+
+#: gitk:11278
+msgid "Use themed widgets"
+msgstr "Използване на тема за графичните обекти"
+
+#: gitk:11280
+msgid "(change requires restart)"
+msgstr "(промяната изисква рестартиране на Gitk)"
+
+#: gitk:11282
+msgid "(currently unavailable)"
+msgstr "(в момента недостъпно)"
+
+#: gitk:11293
+msgid "Colors: press to choose"
+msgstr "Цветове: избира се с натискане"
+
+#: gitk:11296
+msgid "Interface"
+msgstr "Интерфейс"
+
+#: gitk:11297
+msgid "interface"
+msgstr "интерфейс"
+
+#: gitk:11300
+msgid "Background"
+msgstr "Фон"
+
+#: gitk:11301 gitk:11331
+msgid "background"
+msgstr "Фон"
+
+#: gitk:11304
+msgid "Foreground"
+msgstr "Знаци"
+
+#: gitk:11305
+msgid "foreground"
+msgstr "знаци"
+
+#: gitk:11308
+msgid "Diff: old lines"
+msgstr "Разлика: стари редове"
+
+#: gitk:11309
+msgid "diff old lines"
+msgstr "разлика, стари редове"
+
+#: gitk:11313
+msgid "Diff: new lines"
+msgstr "Разлика: нови редове"
+
+#: gitk:11314
+msgid "diff new lines"
+msgstr "разлика, нови редове"
+
+#: gitk:11318
+msgid "Diff: hunk header"
+msgstr "Разлика: начало на парче"
+
+#: gitk:11320
+msgid "diff hunk header"
+msgstr "разлика, начало на парче"
+
+#: gitk:11324
+msgid "Marked line bg"
+msgstr "Фон на отбелязан ред"
+
+#: gitk:11326
+msgid "marked line background"
+msgstr "Фон на отбелязан ред"
+
+#: gitk:11330
+msgid "Select bg"
+msgstr "Избор на фон"
+
+#: gitk:11339
+msgid "Fonts: press to choose"
+msgstr "Шрифтове: избира се с натискане"
+
+#: gitk:11341
+msgid "Main font"
+msgstr "Основен шрифт"
+
+#: gitk:11342
+msgid "Diff display font"
+msgstr "Шрифт за разликите"
+
+#: gitk:11343
+msgid "User interface font"
+msgstr "Шрифт на интерфейса"
+
+#: gitk:11365
+msgid "Gitk preferences"
+msgstr "Настройки на Gitk"
+
+#: gitk:11374
+msgid "General"
+msgstr "Общи"
+
+#: gitk:11375
+msgid "Colors"
+msgstr "Цветове"
+
+#: gitk:11376
+msgid "Fonts"
+msgstr "Шрифтове"
+
+#: gitk:11426
+#, tcl-format
+msgid "Gitk: choose color for %s"
+msgstr "Gitk: избор на цвят на %s"
+
+#: gitk:12080
+msgid "Cannot find a git repository here."
+msgstr "Тук липсва хранилище на Git."
+
+#: gitk:12127
+#, tcl-format
+msgid "Ambiguous argument '%s': both revision and filename"
+msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл"
+
+#: gitk:12139
+msgid "Bad arguments to gitk:"
+msgstr "Неправилни аргументи на gitk:"
+
+#: gitk:12242
+msgid "Command line"
+msgstr "Команден ред"
diff --git a/gitk-git/po/po2msg.sh b/gitk-git/po/po2msg.sh
index c63248e..c63248e 100644..100755
--- a/gitk-git/po/po2msg.sh
+++ b/gitk-git/po/po2msg.sh
diff --git a/hash.c b/hash.c
deleted file mode 100644
index 749ecfe..0000000
--- a/hash.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Some generic hashing helpers.
- */
-#include "cache.h"
-#include "hash.h"
-
-/*
- * Look up a hash entry in the hash table. Return the pointer to
- * the existing entry, or the empty slot if none existed. The caller
- * can then look at the (*ptr) to see whether it existed or not.
- */
-static struct hash_table_entry *lookup_hash_entry(unsigned int hash, const struct hash_table *table)
-{
- unsigned int size = table->size, nr = hash % size;
- struct hash_table_entry *array = table->array;
-
- while (array[nr].ptr) {
- if (array[nr].hash == hash)
- break;
- nr++;
- if (nr >= size)
- nr = 0;
- }
- return array + nr;
-}
-
-
-/*
- * Insert a new hash entry pointer into the table.
- *
- * If that hash entry already existed, return the pointer to
- * the existing entry (and the caller can create a list of the
- * pointers or do anything else). If it didn't exist, return
- * NULL (and the caller knows the pointer has been inserted).
- */
-static void **insert_hash_entry(unsigned int hash, void *ptr, struct hash_table *table)
-{
- struct hash_table_entry *entry = lookup_hash_entry(hash, table);
-
- if (!entry->ptr) {
- entry->ptr = ptr;
- entry->hash = hash;
- table->nr++;
- return NULL;
- }
- return &entry->ptr;
-}
-
-static void grow_hash_table(struct hash_table *table)
-{
- unsigned int i;
- unsigned int old_size = table->size, new_size;
- struct hash_table_entry *old_array = table->array, *new_array;
-
- new_size = alloc_nr(old_size);
- new_array = xcalloc(sizeof(struct hash_table_entry), new_size);
- table->size = new_size;
- table->array = new_array;
- table->nr = 0;
- for (i = 0; i < old_size; i++) {
- unsigned int hash = old_array[i].hash;
- void *ptr = old_array[i].ptr;
- if (ptr)
- insert_hash_entry(hash, ptr, table);
- }
- free(old_array);
-}
-
-void *lookup_hash(unsigned int hash, const struct hash_table *table)
-{
- if (!table->array)
- return NULL;
- return lookup_hash_entry(hash, table)->ptr;
-}
-
-void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table)
-{
- unsigned int nr = table->nr;
- if (nr >= table->size/2)
- grow_hash_table(table);
- return insert_hash_entry(hash, ptr, table);
-}
-
-int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data)
-{
- int sum = 0;
- unsigned int i;
- unsigned int size = table->size;
- struct hash_table_entry *array = table->array;
-
- for (i = 0; i < size; i++) {
- void *ptr = array->ptr;
- array++;
- if (ptr) {
- int val = fn(ptr, data);
- if (val < 0)
- return val;
- sum += val;
- }
- }
- return sum;
-}
-
-void free_hash(struct hash_table *table)
-{
- free(table->array);
- table->array = NULL;
- table->size = 0;
- table->nr = 0;
-}
diff --git a/hash.h b/hash.h
deleted file mode 100644
index 1d43ac0..0000000
--- a/hash.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef HASH_H
-#define HASH_H
-
-/*
- * These are some simple generic hash table helper functions.
- * Not necessarily suitable for all users, but good for things
- * where you want to just keep track of a list of things, and
- * have a good hash to use on them.
- *
- * It keeps the hash table at roughly 50-75% free, so the memory
- * cost of the hash table itself is roughly
- *
- * 3 * 2*sizeof(void *) * nr_of_objects
- *
- * bytes.
- *
- * FIXME: on 64-bit architectures, we waste memory. It would be
- * good to have just 32-bit pointers, requiring a special allocator
- * for hashed entries or something.
- */
-struct hash_table_entry {
- unsigned int hash;
- void *ptr;
-};
-
-struct hash_table {
- unsigned int size, nr;
- struct hash_table_entry *array;
-};
-
-extern void *lookup_hash(unsigned int hash, const struct hash_table *table);
-extern void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table);
-extern int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data);
-extern void free_hash(struct hash_table *table);
-
-static inline void init_hash(struct hash_table *table)
-{
- table->size = 0;
- table->nr = 0;
- table->array = NULL;
-}
-
-static inline void preallocate_hash(struct hash_table *table, unsigned int elts)
-{
- assert(table->size == 0 && table->nr == 0 && table->array == NULL);
- table->size = elts * 2;
- table->array = xcalloc(sizeof(struct hash_table_entry), table->size);
-}
-
-#endif
diff --git a/hashmap.c b/hashmap.c
new file mode 100644
index 0000000..d1b8056
--- /dev/null
+++ b/hashmap.c
@@ -0,0 +1,228 @@
+/*
+ * Generic implementation of hash-based key value mappings.
+ */
+#include "cache.h"
+#include "hashmap.h"
+
+#define FNV32_BASE ((unsigned int) 0x811c9dc5)
+#define FNV32_PRIME ((unsigned int) 0x01000193)
+
+unsigned int strhash(const char *str)
+{
+ unsigned int c, hash = FNV32_BASE;
+ while ((c = (unsigned char) *str++))
+ hash = (hash * FNV32_PRIME) ^ c;
+ return hash;
+}
+
+unsigned int strihash(const char *str)
+{
+ unsigned int c, hash = FNV32_BASE;
+ while ((c = (unsigned char) *str++)) {
+ if (c >= 'a' && c <= 'z')
+ c -= 'a' - 'A';
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+unsigned int memhash(const void *buf, size_t len)
+{
+ unsigned int hash = FNV32_BASE;
+ unsigned char *ucbuf = (unsigned char *) buf;
+ while (len--) {
+ unsigned int c = *ucbuf++;
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+unsigned int memihash(const void *buf, size_t len)
+{
+ unsigned int hash = FNV32_BASE;
+ unsigned char *ucbuf = (unsigned char *) buf;
+ while (len--) {
+ unsigned int c = *ucbuf++;
+ if (c >= 'a' && c <= 'z')
+ c -= 'a' - 'A';
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+#define HASHMAP_INITIAL_SIZE 64
+/* grow / shrink by 2^2 */
+#define HASHMAP_RESIZE_BITS 2
+/* load factor in percent */
+#define HASHMAP_LOAD_FACTOR 80
+
+static void alloc_table(struct hashmap *map, unsigned int size)
+{
+ map->tablesize = size;
+ map->table = xcalloc(size, sizeof(struct hashmap_entry *));
+
+ /* calculate resize thresholds for new size */
+ map->grow_at = (unsigned int) ((uint64_t) size * HASHMAP_LOAD_FACTOR / 100);
+ if (size <= HASHMAP_INITIAL_SIZE)
+ map->shrink_at = 0;
+ else
+ /*
+ * The shrink-threshold must be slightly smaller than
+ * (grow-threshold / resize-factor) to prevent erratic resizing,
+ * thus we divide by (resize-factor + 1).
+ */
+ map->shrink_at = map->grow_at / ((1 << HASHMAP_RESIZE_BITS) + 1);
+}
+
+static inline int entry_equals(const struct hashmap *map,
+ const struct hashmap_entry *e1, const struct hashmap_entry *e2,
+ const void *keydata)
+{
+ return (e1 == e2) || (e1->hash == e2->hash && !map->cmpfn(e1, e2, keydata));
+}
+
+static inline unsigned int bucket(const struct hashmap *map,
+ const struct hashmap_entry *key)
+{
+ return key->hash & (map->tablesize - 1);
+}
+
+static void rehash(struct hashmap *map, unsigned int newsize)
+{
+ unsigned int i, oldsize = map->tablesize;
+ struct hashmap_entry **oldtable = map->table;
+
+ alloc_table(map, newsize);
+ for (i = 0; i < oldsize; i++) {
+ struct hashmap_entry *e = oldtable[i];
+ while (e) {
+ struct hashmap_entry *next = e->next;
+ unsigned int b = bucket(map, e);
+ e->next = map->table[b];
+ map->table[b] = e;
+ e = next;
+ }
+ }
+ free(oldtable);
+}
+
+static inline struct hashmap_entry **find_entry_ptr(const struct hashmap *map,
+ const struct hashmap_entry *key, const void *keydata)
+{
+ struct hashmap_entry **e = &map->table[bucket(map, key)];
+ while (*e && !entry_equals(map, *e, key, keydata))
+ e = &(*e)->next;
+ return e;
+}
+
+static int always_equal(const void *unused1, const void *unused2, const void *unused3)
+{
+ return 0;
+}
+
+void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
+ size_t initial_size)
+{
+ unsigned int size = HASHMAP_INITIAL_SIZE;
+ map->size = 0;
+ map->cmpfn = equals_function ? equals_function : always_equal;
+
+ /* calculate initial table size and allocate the table */
+ initial_size = (unsigned int) ((uint64_t) initial_size * 100
+ / HASHMAP_LOAD_FACTOR);
+ while (initial_size > size)
+ size <<= HASHMAP_RESIZE_BITS;
+ alloc_table(map, size);
+}
+
+void hashmap_free(struct hashmap *map, int free_entries)
+{
+ if (!map || !map->table)
+ return;
+ if (free_entries) {
+ struct hashmap_iter iter;
+ struct hashmap_entry *e;
+ hashmap_iter_init(map, &iter);
+ while ((e = hashmap_iter_next(&iter)))
+ free(e);
+ }
+ free(map->table);
+ memset(map, 0, sizeof(*map));
+}
+
+void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata)
+{
+ return *find_entry_ptr(map, key, keydata);
+}
+
+void *hashmap_get_next(const struct hashmap *map, const void *entry)
+{
+ struct hashmap_entry *e = ((struct hashmap_entry *) entry)->next;
+ for (; e; e = e->next)
+ if (entry_equals(map, entry, e, NULL))
+ return e;
+ return NULL;
+}
+
+void hashmap_add(struct hashmap *map, void *entry)
+{
+ unsigned int b = bucket(map, entry);
+
+ /* add entry */
+ ((struct hashmap_entry *) entry)->next = map->table[b];
+ map->table[b] = entry;
+
+ /* fix size and rehash if appropriate */
+ map->size++;
+ if (map->size > map->grow_at)
+ rehash(map, map->tablesize << HASHMAP_RESIZE_BITS);
+}
+
+void *hashmap_remove(struct hashmap *map, const void *key, const void *keydata)
+{
+ struct hashmap_entry *old;
+ struct hashmap_entry **e = find_entry_ptr(map, key, keydata);
+ if (!*e)
+ return NULL;
+
+ /* remove existing entry */
+ old = *e;
+ *e = old->next;
+ old->next = NULL;
+
+ /* fix size and rehash if appropriate */
+ map->size--;
+ if (map->size < map->shrink_at)
+ rehash(map, map->tablesize >> HASHMAP_RESIZE_BITS);
+ return old;
+}
+
+void *hashmap_put(struct hashmap *map, void *entry)
+{
+ struct hashmap_entry *old = hashmap_remove(map, entry, NULL);
+ hashmap_add(map, entry);
+ return old;
+}
+
+void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter)
+{
+ iter->map = map;
+ iter->tablepos = 0;
+ iter->next = NULL;
+}
+
+void *hashmap_iter_next(struct hashmap_iter *iter)
+{
+ struct hashmap_entry *current = iter->next;
+ for (;;) {
+ if (current) {
+ iter->next = current->next;
+ return current;
+ }
+
+ if (iter->tablepos >= iter->map->tablesize)
+ return NULL;
+
+ current = iter->map->table[iter->tablepos++];
+ }
+}
diff --git a/hashmap.h b/hashmap.h
new file mode 100644
index 0000000..a816ad4
--- /dev/null
+++ b/hashmap.h
@@ -0,0 +1,71 @@
+#ifndef HASHMAP_H
+#define HASHMAP_H
+
+/*
+ * Generic implementation of hash-based key-value mappings.
+ * See Documentation/technical/api-hashmap.txt.
+ */
+
+/* FNV-1 functions */
+
+extern unsigned int strhash(const char *buf);
+extern unsigned int strihash(const char *buf);
+extern unsigned int memhash(const void *buf, size_t len);
+extern unsigned int memihash(const void *buf, size_t len);
+
+/* data structures */
+
+struct hashmap_entry {
+ struct hashmap_entry *next;
+ unsigned int hash;
+};
+
+typedef int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key,
+ const void *keydata);
+
+struct hashmap {
+ struct hashmap_entry **table;
+ hashmap_cmp_fn cmpfn;
+ unsigned int size, tablesize, grow_at, shrink_at;
+};
+
+struct hashmap_iter {
+ struct hashmap *map;
+ struct hashmap_entry *next;
+ unsigned int tablepos;
+};
+
+/* hashmap functions */
+
+extern void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
+ size_t initial_size);
+extern void hashmap_free(struct hashmap *map, int free_entries);
+
+/* hashmap_entry functions */
+
+static inline void hashmap_entry_init(void *entry, unsigned int hash)
+{
+ struct hashmap_entry *e = entry;
+ e->hash = hash;
+ e->next = NULL;
+}
+extern void *hashmap_get(const struct hashmap *map, const void *key,
+ const void *keydata);
+extern void *hashmap_get_next(const struct hashmap *map, const void *entry);
+extern void hashmap_add(struct hashmap *map, void *entry);
+extern void *hashmap_put(struct hashmap *map, void *entry);
+extern void *hashmap_remove(struct hashmap *map, const void *key,
+ const void *keydata);
+
+/* hashmap_iter functions */
+
+extern void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter);
+extern void *hashmap_iter_next(struct hashmap_iter *iter);
+static inline void *hashmap_iter_first(struct hashmap *map,
+ struct hashmap_iter *iter)
+{
+ hashmap_iter_init(map, iter);
+ return hashmap_iter_next(iter);
+}
+
+#endif
diff --git a/line-log.c b/line-log.c
index 717638b..1500101 100644
--- a/line-log.c
+++ b/line-log.c
@@ -766,16 +766,6 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list
}
}
-static void load_tree_desc(struct tree_desc *desc, void **tree,
- const unsigned char *sha1)
-{
- unsigned long size;
- *tree = read_object_with_reference(sha1, tree_type, &size, NULL);
- if (!*tree)
- die("Unable to read tree (%s)", sha1_to_hex(sha1));
- init_tree_desc(desc, *tree, size);
-}
-
static int count_parents(struct commit *commit)
{
struct commit_list *parents = commit->parents;
@@ -842,18 +832,11 @@ static void queue_diffs(struct line_log_data *range,
struct diff_queue_struct *queue,
struct commit *commit, struct commit *parent)
{
- void *tree1 = NULL, *tree2 = NULL;
- struct tree_desc desc1, desc2;
-
assert(commit);
- load_tree_desc(&desc2, &tree2, commit->tree->object.sha1);
- if (parent)
- load_tree_desc(&desc1, &tree1, parent->tree->object.sha1);
- else
- init_tree_desc(&desc1, "", 0);
DIFF_QUEUE_CLEAR(&diff_queued_diff);
- diff_tree(&desc1, &desc2, "", opt);
+ diff_tree_sha1(parent ? parent->tree->object.sha1 : NULL,
+ commit->tree->object.sha1, "", opt);
if (opt->detect_rename) {
filter_diffs_for_paths(range, 1);
if (diff_might_be_rename())
@@ -861,11 +844,6 @@ static void queue_diffs(struct line_log_data *range,
filter_diffs_for_paths(range, 0);
}
move_diff_queue(queue, &diff_queued_diff);
-
- if (tree1)
- free(tree1);
- if (tree2)
- free(tree2);
}
static char *get_nth_line(long line, unsigned long *ends, void *data)
diff --git a/list-objects.c b/list-objects.c
index 6cbedf0..206816f 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -162,15 +162,17 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)
}
mark_edge_parents_uninteresting(commit, revs, show_edge);
}
- for (i = 0; i < revs->cmdline.nr; i++) {
- struct object *obj = revs->cmdline.rev[i].item;
- struct commit *commit = (struct commit *)obj;
- if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING))
- continue;
- mark_tree_uninteresting(commit->tree);
- if (revs->edge_hint && !(obj->flags & SHOWN)) {
- obj->flags |= SHOWN;
- show_edge(commit);
+ if (revs->edge_hint) {
+ for (i = 0; i < revs->cmdline.nr; i++) {
+ struct object *obj = revs->cmdline.rev[i].item;
+ struct commit *commit = (struct commit *)obj;
+ if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING))
+ continue;
+ mark_tree_uninteresting(commit->tree);
+ if (!(obj->flags & SHOWN)) {
+ obj->flags |= SHOWN;
+ show_edge(commit);
+ }
}
}
}
diff --git a/merge-recursive.c b/merge-recursive.c
index a18bd15..4177092 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -201,7 +201,9 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
const char *path, int stage, int refresh, int options)
{
struct cache_entry *ce;
- ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, refresh);
+ ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage,
+ (refresh ? (CE_MATCH_REFRESH |
+ CE_MATCH_IGNORE_MISSING) : 0 ));
if (!ce)
return error(_("addinfo_cache failed for path '%s'"), path);
return add_cache_entry(ce, options);
@@ -693,7 +695,7 @@ static int make_room_for_path(struct merge_options *o, const char *path)
/* Make sure leading directories are created */
status = safe_create_leading_directories_const(path);
if (status) {
- if (status == -3) {
+ if (status == SCLD_EXISTS) {
/* something else exists */
error(msg, path, _(": perhaps a D/F conflict?"));
return -1;
diff --git a/name-hash.c b/name-hash.c
index e5b6e1a..97444d0 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -8,49 +8,28 @@
#define NO_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h"
-/*
- * This removes bit 5 if bit 6 is set.
- *
- * That will make US-ASCII characters hash to their upper-case
- * equivalent. We could easily do this one whole word at a time,
- * but that's for future worries.
- */
-static inline unsigned char icase_hash(unsigned char c)
-{
- return c & ~((c & 0x40) >> 1);
-}
-
-static unsigned int hash_name(const char *name, int namelen)
-{
- unsigned int hash = 0x123;
-
- while (namelen--) {
- unsigned char c = *name++;
- c = icase_hash(c);
- hash = hash*101 + c;
- }
- return hash;
-}
-
struct dir_entry {
- struct dir_entry *next;
+ struct hashmap_entry ent;
struct dir_entry *parent;
struct cache_entry *ce;
int nr;
unsigned int namelen;
};
+static int dir_entry_cmp(const struct dir_entry *e1,
+ const struct dir_entry *e2, const char *name)
+{
+ return e1->namelen != e2->namelen || strncasecmp(e1->ce->name,
+ name ? name : e2->ce->name, e1->namelen);
+}
+
static struct dir_entry *find_dir_entry(struct index_state *istate,
const char *name, unsigned int namelen)
{
- unsigned int hash = hash_name(name, namelen);
- struct dir_entry *dir;
-
- for (dir = lookup_hash(hash, &istate->dir_hash); dir; dir = dir->next)
- if (dir->namelen == namelen &&
- !strncasecmp(dir->ce->name, name, namelen))
- return dir;
- return NULL;
+ struct dir_entry key;
+ hashmap_entry_init(&key, memihash(name, namelen));
+ key.namelen = namelen;
+ return hashmap_get(&istate->dir_hash, &key, name);
}
static struct dir_entry *hash_dir_entry(struct index_state *istate,
@@ -84,18 +63,11 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate,
dir = find_dir_entry(istate, ce->name, namelen);
if (!dir) {
/* not found, create it and add to hash table */
- void **pdir;
- unsigned int hash = hash_name(ce->name, namelen);
-
dir = xcalloc(1, sizeof(struct dir_entry));
+ hashmap_entry_init(dir, memihash(ce->name, namelen));
dir->namelen = namelen;
dir->ce = ce;
-
- pdir = insert_hash(hash, dir, &istate->dir_hash);
- if (pdir) {
- dir->next = *pdir;
- *pdir = dir;
- }
+ hashmap_add(&istate->dir_hash, dir);
/* recursively add missing parent directories */
dir->parent = hash_dir_entry(istate, ce, namelen);
@@ -114,45 +86,50 @@ static void add_dir_entry(struct index_state *istate, struct cache_entry *ce)
static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce)
{
/*
- * Release reference to the directory entry (and parents if 0).
- *
- * Note: we do not remove / free the entry because there's no
- * hash.[ch]::remove_hash and dir->next may point to other entries
- * that are still valid, so we must not free the memory.
+ * Release reference to the directory entry. If 0, remove and continue
+ * with parent directory.
*/
struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce));
- while (dir && dir->nr && !(--dir->nr))
- dir = dir->parent;
+ while (dir && !(--dir->nr)) {
+ struct dir_entry *parent = dir->parent;
+ hashmap_remove(&istate->dir_hash, dir, NULL);
+ free(dir);
+ dir = parent;
+ }
}
static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
{
- void **pos;
- unsigned int hash;
-
if (ce->ce_flags & CE_HASHED)
return;
ce->ce_flags |= CE_HASHED;
- ce->next = NULL;
- hash = hash_name(ce->name, ce_namelen(ce));
- pos = insert_hash(hash, ce, &istate->name_hash);
- if (pos) {
- ce->next = *pos;
- *pos = ce;
- }
+ hashmap_entry_init(ce, memihash(ce->name, ce_namelen(ce)));
+ hashmap_add(&istate->name_hash, ce);
- if (ignore_case && !(ce->ce_flags & CE_UNHASHED))
+ if (ignore_case)
add_dir_entry(istate, ce);
}
+static int cache_entry_cmp(const struct cache_entry *ce1,
+ const struct cache_entry *ce2, const void *remove)
+{
+ /*
+ * For remove_name_hash, find the exact entry (pointer equality); for
+ * index_file_exists, find all entries with matching hash code and
+ * decide whether the entry matches in same_name.
+ */
+ return remove ? !(ce1 == ce2) : 0;
+}
+
static void lazy_init_name_hash(struct index_state *istate)
{
int nr;
if (istate->name_hash_initialized)
return;
- if (istate->cache_nr)
- preallocate_hash(&istate->name_hash, istate->cache_nr);
+ hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp,
+ istate->cache_nr);
+ hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0);
for (nr = 0; nr < istate->cache_nr; nr++)
hash_index_entry(istate, istate->cache[nr]);
istate->name_hash_initialized = 1;
@@ -160,31 +137,19 @@ static void lazy_init_name_hash(struct index_state *istate)
void add_name_hash(struct index_state *istate, struct cache_entry *ce)
{
- /* if already hashed, add reference to directory entries */
- if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_STATE_MASK)
- add_dir_entry(istate, ce);
-
- ce->ce_flags &= ~CE_UNHASHED;
if (istate->name_hash_initialized)
hash_index_entry(istate, ce);
}
-/*
- * We don't actually *remove* it, we can just mark it invalid so that
- * we won't find it in lookups.
- *
- * Not only would we have to search the lists (simple enough), but
- * we'd also have to rehash other hash buckets in case this makes the
- * hash bucket empty (common). So it's much better to just mark
- * it.
- */
void remove_name_hash(struct index_state *istate, struct cache_entry *ce)
{
- /* if already hashed, release reference to directory entries */
- if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_HASHED)
- remove_dir_entry(istate, ce);
+ if (!istate->name_hash_initialized || !(ce->ce_flags & CE_HASHED))
+ return;
+ ce->ce_flags &= ~CE_HASHED;
+ hashmap_remove(&istate->name_hash, ce, ce);
- ce->ce_flags |= CE_UNHASHED;
+ if (ignore_case)
+ remove_dir_entry(istate, ce);
}
static int slow_same_name(const char *name1, int len1, const char *name2, int len2)
@@ -247,49 +212,27 @@ struct cache_entry *index_dir_exists(struct index_state *istate, const char *nam
struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
{
- unsigned int hash = hash_name(name, namelen);
struct cache_entry *ce;
+ struct hashmap_entry key;
lazy_init_name_hash(istate);
- ce = lookup_hash(hash, &istate->name_hash);
+ hashmap_entry_init(&key, memihash(name, namelen));
+ ce = hashmap_get(&istate->name_hash, &key, NULL);
while (ce) {
- if (!(ce->ce_flags & CE_UNHASHED)) {
- if (same_name(ce, name, namelen, icase))
- return ce;
- }
- ce = ce->next;
+ if (same_name(ce, name, namelen, icase))
+ return ce;
+ ce = hashmap_get_next(&istate->name_hash, ce);
}
return NULL;
}
-struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int icase)
-{
- if (namelen > 0 && name[namelen - 1] == '/')
- return index_dir_exists(istate, name, namelen - 1);
- return index_file_exists(istate, name, namelen, icase);
-}
-
-static int free_dir_entry(void *entry, void *unused)
-{
- struct dir_entry *dir = entry;
- while (dir) {
- struct dir_entry *next = dir->next;
- free(dir);
- dir = next;
- }
- return 0;
-}
-
void free_name_hash(struct index_state *istate)
{
if (!istate->name_hash_initialized)
return;
istate->name_hash_initialized = 0;
- if (ignore_case)
- /* free directory entries */
- for_each_hash(&istate->dir_hash, free_dir_entry, NULL);
- free_hash(&istate->name_hash);
- free_hash(&istate->dir_hash);
+ hashmap_free(&istate->name_hash, 0);
+ hashmap_free(&istate->dir_hash, 1);
}
diff --git a/path.c b/path.c
index 24594c4..f9c5062 100644
--- a/path.c
+++ b/path.c
@@ -265,12 +265,12 @@ static struct passwd *getpw_str(const char *username, size_t len)
char *expand_user_path(const char *path)
{
struct strbuf user_path = STRBUF_INIT;
- const char *first_slash = strchrnul(path, '/');
const char *to_copy = path;
if (path == NULL)
goto return_null;
if (path[0] == '~') {
+ const char *first_slash = strchrnul(path, '/');
const char *username = path + 1;
size_t username_len = first_slash - username;
if (username_len == 0) {
diff --git a/pathspec.c b/pathspec.c
index 6cb9fd3..8043099 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -33,7 +33,7 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec,
return;
for (i = 0; i < active_nr; i++) {
const struct cache_entry *ce = active_cache[i];
- match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, seen);
+ ce_path_match(ce, pathspec, seen);
}
}
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 5273ee8..6e804a2 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -1599,6 +1599,7 @@ sub tie_for_persistent_memoization {
my %lookup_svn_merge_cache;
my %check_cherry_pick_cache;
my %has_no_changes_cache;
+ my %_rev_list_cache;
tie_for_persistent_memoization(\%lookup_svn_merge_cache,
"$cache_path/lookup_svn_merge");
@@ -1620,6 +1621,14 @@ sub tie_for_persistent_memoization {
SCALAR_CACHE => ['HASH' => \%has_no_changes_cache],
LIST_CACHE => 'FAULT',
;
+
+ tie_for_persistent_memoization(\%_rev_list_cache,
+ "$cache_path/_rev_list");
+ memoize '_rev_list',
+ SCALAR_CACHE => 'FAULT',
+ LIST_CACHE => ['HASH' => \%_rev_list_cache],
+ ;
+
}
sub unmemoize_svn_mergeinfo_functions {
@@ -1629,6 +1638,7 @@ sub tie_for_persistent_memoization {
Memoize::unmemoize 'lookup_svn_merge';
Memoize::unmemoize 'check_cherry_pick';
Memoize::unmemoize 'has_no_changes';
+ Memoize::unmemoize '_rev_list';
}
sub clear_memoized_mergeinfo_caches {
@@ -1959,11 +1969,25 @@ sub rebuild_from_rev_db {
unlink $path or croak "unlink: $!";
}
+#define a global associate map to record rebuild status
+my %rebuild_status;
+#define a global associate map to record rebuild verify status
+my %rebuild_verify_status;
+
sub rebuild {
my ($self) = @_;
my $map_path = $self->map_path;
my $partial = (-e $map_path && ! -z $map_path);
- return unless ::verify_ref($self->refname.'^0');
+ my $verify_key = $self->refname.'^0';
+ if (!$rebuild_verify_status{$verify_key}) {
+ my $verify_result = ::verify_ref($verify_key);
+ if ($verify_result) {
+ $rebuild_verify_status{$verify_key} = 1;
+ }
+ }
+ if (!$rebuild_verify_status{$verify_key}) {
+ return;
+ }
if (!$partial && ($self->use_svm_props || $self->no_metadata)) {
my $rev_db = $self->rev_db_path;
$self->rebuild_from_rev_db($rev_db);
@@ -1977,10 +2001,21 @@ sub rebuild {
print "Rebuilding $map_path ...\n" if (!$partial);
my ($base_rev, $head) = ($partial ? $self->rev_map_max_norebuild(1) :
(undef, undef));
+ my $key_value = ($head ? "$head.." : "") . $self->refname;
+ if (exists $rebuild_status{$key_value}) {
+ print "Done rebuilding $map_path\n" if (!$partial || !$head);
+ my $rev_db_path = $self->rev_db_path;
+ if (-f $self->rev_db_path) {
+ unlink $self->rev_db_path or croak "unlink: $!";
+ }
+ $self->unlink_rev_db_symlink;
+ return;
+ }
my ($log, $ctx) =
- command_output_pipe(qw/rev-list --pretty=raw --reverse/,
- ($head ? "$head.." : "") . $self->refname,
+ command_output_pipe(qw/rev-list --pretty=raw --reverse/,
+ $key_value,
'--');
+ $rebuild_status{$key_value} = 1;
my $metadata_url = $self->metadata_url;
remove_username($metadata_url);
my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid;
diff --git a/po/TEAMS b/po/TEAMS
index f9a99ed..f75a174 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -1,9 +1,9 @@
Core Git translation language teams
(please keep the list sorted alphabetically on language field)
-Language: da (Danish)
-Repository: https://github.com/git-da/git-po/
-Leader: Byrial Jensen <byrial@vip.cybercity.dk>
+Language: bg (Bulgarian)
+Repository: https://github.com/git-l10n/git-po
+Leader: Alexander Shopov <ash@kambanaria.org>
Language: de (German)
Repository: https://github.com/ralfth/git-po-de
@@ -25,10 +25,6 @@ Repository: https://github.com/quizzlo/git-po-it/
Leader: Marco Paolone <marcopaolone AT gmail.com>
Members: Stefano Lattarini <stefano.lattarini AT gmail.com>
-Language: nl (Dutch)
-Repository: https://github.com/vfr-nl/git-po/
-Leader: Vincent van Ravesteijn <vfr@lyx.org>
-
Language: pt_PT (Portuguese - Portugal)
Repository: https://github.com/marcomsousa/git-l10n-pt_PT/
Leader: Marco Sousa <marcomsousa AT gmail.com>
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..fb450b2
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,10404 @@
+# Bulgarian translation of git po-file.
+# Copyright (C) 2014 Alexander Shopov <ash@kambanaria.org>.
+# This file is distributed under the same license as the git package.
+# Alexander Shopov <ash@kambanaria.org>, 2014.
+#
+# ========================
+# DICTIONARY TO MERGE IN GIT GUI
+# ------------------------
+# range интервал
+# unreachable object недостижим обект
+# dangling objects обект извън клон
+# fast-forward тривиално сливане
+# stale remote старо хранилище
+# rebase пребазирам
+# force (push) принудително изтласквам
+# stash/index индекс
+# ========================
+# RECHECK
+# ------------------------
+# HEAD as a reference vs head of a branch
+#
+# ========================
+# GENERATE STATS
+# ------------------------
+# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
+# sort -u OUT > UNIQUE
+# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
+# ========================
+# DONE strings
+# ------------------------
+# 222
+# ========================
+# REMAINING strings
+# ------------------------
+# 1988
+# ========================
+# DONE alphabetical ordering
+# ------------------------
+#
+# advice, fsck, gc, help, parse-options, reflog, remote, rm, run-command
+#
+# ========================
+# REMAINING alphabetical ordering
+# ------------------------
+#
+# add, apply, archive, attr, bisect--helper, blame, branch, bundle, cat-file, check-attr, check-ignore, check-mailmap,
+# checkout, checkout-index, clean, clone, column, commit, common-cmds, config, connected, count-objects, date, describe,
+# diff, diffcore-order, fast-export, fetch, fmt-merge-msg, for-each-ref, git, git-am, git-bisect, git-pull, git-rebase,
+# git-stash, git-submodule, gpg-interface, grep, hash-object, index-pack, init-db, log, ls-files, ls-tree, merge,
+# merge-base, merge-file, merge-recursive, mktree, mv, name-rev, notes, notes-utils, object, obstack, pack-objects,
+# pack-refs, pathspec, precompose_utf8, prune, prune-packed, push, read-tree, repack, replace, rerere, reset, revert,
+# rev-parse, sequencer, sha1_name, shortlog, show-branch, show-ref, submodule, symbolic-ref, tag, update-index,
+# update-ref, update-server-info, urlmatch, verify-pack, verify-tag, wrapper, write-tree, wt-status
+#
+#
+# ========================
+# MOST IMPORTANT strings ordering
+# ------------------------
+# 144 [remote] 68 fetch 28 blame 16 [parse-options]
+# 137 commit 64 grep 27 git-rebase 12 [gc]
+# 115 branch 46 push 24 revert 12 [fsck]
+# 102 wt-status 38 add 21 common-cmds 3 reflog
+# 78 checkout 34 config 21 [rm]
+# 77 log 33 reset 21 mv
+# 69 clone 29 git-stash 13 diff
+#
+# ========================
+# WHOLE STATISTICS strings ordering
+# ------------------------
+# 144 remote 54 git-submodule 27 ls-files 12 pathspec 8 replace 3 prune-packed
+# 137 commit 48 push 27 git-rebase 12 name-rev 8 git-pull 3 pack-refs
+# 115 branch 41 help 24 revert 12 gc 8 fmt-merge-msg 3 count-objects
+# 111 apply 40 pack-objects 24 mv 12 fsck 7 symbolic-ref 3 connected
+# 102 wt-status 39 init-db 21 rm 12 checkout-index 6 gpg-interface 3 bisect--helper
+# 100 notes 38 add 21 common-cmds 11 date 6 check-attr 2 verify-tag
+# 97 merge 35 archive 19 show-branch 11 column 5 write-tree 2 update-server-info
+# 78 checkout 34 config 19 read-tree 10 urlmatch 5 sha1_name 2 run-command
+# 77 log 33 reset 19 bundle 10 shortlog 5 rev-parse 2 rerere
+# 69 clone 32 clean 17 repack 10 merge-file 5 prune 2 obstack
+# 68 index-pack 30 git-am 16 parse-options 10 merge-base 4 wrapper 2 advice
+# 68 fetch 30 describe 14 submodule 10 ls-tree 4 notes-utils 1 precompose_utf8
+# 64 grep 29 git-stash 14 show-ref 10 hash-object 4 mktree 1 object
+# 58 tag 29 git-bisect 14 fast-export 10 for-each-ref 4 check-mailmap 1 git
+# 56 sequencer 28 update-index 13 diff 10 cat-file 3 verify-pack 1 diffcore-order
+# 55 merge-recursive 28 blame 13 check-ignore 9 update-ref 3 reflog 1 attr
+msgid ""
+msgstr ""
+"Project-Id-Version: git master\n"
+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
+"POT-Creation-Date: 2014-01-18 07:42+0800\n"
+"PO-Revision-Date: 2014-01-28 19:05+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: advice.c:57
+#, c-format
+msgid "hint: %.*s\n"
+msgstr "Подсказка: %.*s\n"
+
+#.
+#. * Message used both when 'git commit' fails and when
+#. * other commands doing a merge do.
+#.
+#: advice.c:87
+msgid ""
+"Fix them up in the work tree,\n"
+"and then use 'git add/rm <file>' as\n"
+"appropriate to mark resolution and make a commit,\n"
+"or use 'git commit -a'."
+msgstr ""
+"Редактирайте ги в работното дърво,\n"
+"и тогава ползвайте „git add/rm <file>“,\n"
+"за да отбележите коригирането им и ги\n"
+"подадете или просто ползвайте „git commit -a“."
+
+#: archive.c:10
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr ""
+
+#: archive.c:11
+msgid "git archive --list"
+msgstr ""
+
+#: archive.c:12
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
+msgstr ""
+
+#: archive.c:13
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr ""
+
+#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "пътят „%s“ не съвпада с никой файл"
+
+#: archive.c:327
+msgid "fmt"
+msgstr ""
+
+#: archive.c:327
+msgid "archive format"
+msgstr ""
+
+#: archive.c:328 builtin/log.c:1193
+msgid "prefix"
+msgstr ""
+
+#: archive.c:329
+msgid "prepend prefix to each pathname in the archive"
+msgstr ""
+
+#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
+#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
+#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
+#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+msgid "file"
+msgstr "файл"
+
+#: archive.c:331 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr ""
+
+#: archive.c:333
+msgid "read .gitattributes in working directory"
+msgstr ""
+
+#: archive.c:334
+msgid "report archived files on stderr"
+msgstr ""
+
+#: archive.c:335
+msgid "store only"
+msgstr ""
+
+#: archive.c:336
+msgid "compress faster"
+msgstr ""
+
+#: archive.c:344
+msgid "compress better"
+msgstr ""
+
+#: archive.c:347
+msgid "list supported archive formats"
+msgstr ""
+
+#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+msgid "repo"
+msgstr ""
+
+#: archive.c:350 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr ""
+
+#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+msgid "command"
+msgstr ""
+
+#: archive.c:352 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr ""
+
+#: attr.c:259
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+
+#: branch.c:60
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr ""
+
+#: branch.c:82
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+
+#: branch.c:83
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr ""
+
+#: branch.c:87
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+
+#: branch.c:88
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr ""
+
+#: branch.c:92
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+
+#: branch.c:93
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr ""
+
+#: branch.c:97
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+
+#: branch.c:98
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr ""
+
+#: branch.c:118
+#, c-format
+msgid "Tracking not set up: name too long: %s"
+msgstr ""
+
+#: branch.c:137
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr ""
+
+#: branch.c:182
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr ""
+
+#: branch.c:187
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr ""
+
+#: branch.c:195
+msgid "Cannot force update the current branch."
+msgstr ""
+
+#: branch.c:215
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+
+#: branch.c:217
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr ""
+
+#: branch.c:219
+msgid ""
+"\n"
+"If you are planning on basing your work on an upstream\n"
+"branch that already exists at the remote, you may need to\n"
+"run \"git fetch\" to retrieve it.\n"
+"\n"
+"If you are planning to push out a new local branch that\n"
+"will track its remote counterpart, you may want to use\n"
+"\"git push -u\" to set the upstream config as you push."
+msgstr ""
+
+#: branch.c:264
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr ""
+
+#: branch.c:284
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr ""
+
+#: branch.c:289
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr ""
+
+#: branch.c:295
+msgid "Failed to lock ref for update"
+msgstr ""
+
+#: branch.c:313
+msgid "Failed to write ref"
+msgstr ""
+
+#: bundle.c:37
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr ""
+
+#: bundle.c:64
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr ""
+
+#: bundle.c:90 builtin/commit.c:706
+#, c-format
+msgid "could not open '%s'"
+msgstr ""
+
+#: bundle.c:141
+msgid "Repository lacks these prerequisite commits:"
+msgstr ""
+
+#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
+#: builtin/shortlog.c:158
+msgid "revision walk setup failed"
+msgstr ""
+
+#: bundle.c:187
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bundle.c:194
+msgid "The bundle records a complete history."
+msgstr ""
+
+#: bundle.c:196
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bundle.c:296
+msgid "rev-list died"
+msgstr ""
+
+#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr ""
+
+#: bundle.c:337
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr ""
+
+#: bundle.c:382
+msgid "Refusing to create empty bundle."
+msgstr ""
+
+#: bundle.c:398
+msgid "Could not spawn pack-objects"
+msgstr ""
+
+#: bundle.c:416
+msgid "pack-objects died"
+msgstr ""
+
+#: bundle.c:419
+#, c-format
+msgid "cannot create '%s'"
+msgstr ""
+
+#: bundle.c:441
+msgid "index-pack died"
+msgstr ""
+
+#: commit.c:53
+#, c-format
+msgid "could not parse %s"
+msgstr ""
+
+#: commit.c:55
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr ""
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr ""
+
+#: connected.c:70
+msgid "Could not run 'git rev-list'"
+msgstr ""
+
+#: connected.c:90
+#, c-format
+msgid "failed write to rev-list: %s"
+msgstr ""
+
+#: connected.c:98
+#, c-format
+msgid "failed to close rev-list's stdin: %s"
+msgstr ""
+
+#: date.c:95
+msgid "in the future"
+msgstr ""
+
+#: date.c:101
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:108
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:115
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:122
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:128
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:135
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:146
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:149
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: date.c:154 date.c:159
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] ""
+msgstr[1] ""
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr ""
+
+#: diff.c:113
+#, c-format
+msgid " Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr ""
+
+#: diff.c:118
+#, c-format
+msgid " Unknown dirstat parameter '%s'\n"
+msgstr ""
+
+#: diff.c:213
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr ""
+
+#: diff.c:263
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+
+#: diff.c:3509
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+
+#: diff.c:3523
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr ""
+
+#: gpg-interface.c:59 gpg-interface.c:131
+msgid "could not run gpg."
+msgstr ""
+
+#: gpg-interface.c:71
+msgid "gpg did not accept the data"
+msgstr ""
+
+#: gpg-interface.c:82
+msgid "gpg failed to sign the data"
+msgstr ""
+
+#: gpg-interface.c:115
+#, c-format
+msgid "could not create temporary file '%s': %s"
+msgstr ""
+
+#: gpg-interface.c:118
+#, c-format
+msgid "failed writing detached signature to '%s': %s"
+msgstr ""
+
+#: grep.c:1695
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr ""
+
+#: grep.c:1712
+#, c-format
+msgid "'%s': %s"
+msgstr ""
+
+#: grep.c:1723
+#, c-format
+msgid "'%s': short read %s"
+msgstr ""
+
+#: help.c:210
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "налични команди на git от „%s“"
+
+#: help.c:217
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "команди на git от други директории от пътя „$PATH“"
+
+#: help.c:233
+msgid "The most commonly used git commands are:"
+msgstr "Най-често употребяваните команди на git са:"
+
+#: help.c:290
+#, c-format
+msgid ""
+"'%s' appears to be a git command, but we were not\n"
+"able to execute it. Maybe git-%s is broken?"
+msgstr ""
+"Изглежда, че „%s“ е команда на git, но тя не може да\n"
+"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
+
+#: help.c:347
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
+
+#: help.c:369
+#, c-format
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: Пробвахте да изпълните команда на Git на име „%s“, а такава "
+"не\n"
+"съществува. Изпълнението автоматично продължава, като се счита, че имате "
+"предвид „%s“"
+
+#: help.c:374
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "след %0.1f секунди…"
+
+#: help.c:381
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: „%s“ не е команда на git. Вижте изхода от „git --help“."
+
+#: help.c:385 help.c:444
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"Команда с подобно име е:"
+msgstr[1] ""
+"\n"
+"Команди с подобно име са:"
+
+#: help.c:440
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s — %s"
+
+#: merge.c:56
+msgid "failed to read the cache"
+msgstr ""
+
+#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: builtin/clone.c:661
+msgid "unable to write new index file"
+msgstr ""
+
+#: merge-recursive.c:190
+#, c-format
+msgid "(bad commit)\n"
+msgstr ""
+
+#: merge-recursive.c:206
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr ""
+
+#: merge-recursive.c:269
+msgid "error building trees"
+msgstr ""
+
+#: merge-recursive.c:673
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr ""
+
+#: merge-recursive.c:684
+#, c-format
+msgid "Removing %s to make room for subdirectory\n"
+msgstr ""
+
+#. something else exists
+#. .. but not some other error (who really cares what?)
+#: merge-recursive.c:698 merge-recursive.c:719
+msgid ": perhaps a D/F conflict?"
+msgstr ""
+
+#: merge-recursive.c:709
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
+msgstr ""
+
+#: merge-recursive.c:749
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr ""
+
+#: merge-recursive.c:751
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr ""
+
+#: merge-recursive.c:774 builtin/clone.c:317
+#, c-format
+msgid "failed to open '%s'"
+msgstr ""
+
+#: merge-recursive.c:782
+#, c-format
+msgid "failed to symlink '%s'"
+msgstr ""
+
+#: merge-recursive.c:785
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr ""
+
+#: merge-recursive.c:923
+msgid "Failed to execute internal merge"
+msgstr ""
+
+#: merge-recursive.c:927
+#, c-format
+msgid "Unable to add %s to database"
+msgstr ""
+
+#: merge-recursive.c:943
+msgid "unsupported object type in the tree"
+msgstr ""
+
+#: merge-recursive.c:1022 merge-recursive.c:1036
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+
+#: merge-recursive.c:1028 merge-recursive.c:1041
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+
+#: merge-recursive.c:1082
+msgid "rename"
+msgstr ""
+
+#: merge-recursive.c:1082 wt-status.c:283
+msgid "renamed"
+msgstr ""
+
+#: merge-recursive.c:1138
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr ""
+
+#: merge-recursive.c:1160
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+
+#: merge-recursive.c:1165
+msgid " (left unresolved)"
+msgstr ""
+
+#: merge-recursive.c:1219
+#, c-format
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+
+#: merge-recursive.c:1249
+#, c-format
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr ""
+
+#: merge-recursive.c:1448
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr ""
+
+#: merge-recursive.c:1458
+#, c-format
+msgid "Adding merged %s"
+msgstr ""
+
+#: merge-recursive.c:1463 merge-recursive.c:1661
+#, c-format
+msgid "Adding as %s instead"
+msgstr ""
+
+#: merge-recursive.c:1514
+#, c-format
+msgid "cannot read object %s"
+msgstr ""
+
+#: merge-recursive.c:1517
+#, c-format
+msgid "object %s is not a blob"
+msgstr ""
+
+#: merge-recursive.c:1565
+msgid "modify"
+msgstr ""
+
+#: merge-recursive.c:1565 wt-status.c:281
+msgid "modified"
+msgstr ""
+
+#: merge-recursive.c:1575
+msgid "content"
+msgstr ""
+
+#: merge-recursive.c:1582
+msgid "add/add"
+msgstr ""
+
+#: merge-recursive.c:1616
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr ""
+
+#: merge-recursive.c:1630
+#, c-format
+msgid "Auto-merging %s"
+msgstr ""
+
+#: merge-recursive.c:1634 git-submodule.sh:1148
+msgid "submodule"
+msgstr ""
+
+#: merge-recursive.c:1635
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr ""
+
+#: merge-recursive.c:1725
+#, c-format
+msgid "Removing %s"
+msgstr ""
+
+#: merge-recursive.c:1750
+msgid "file/directory"
+msgstr ""
+
+#: merge-recursive.c:1756
+msgid "directory/file"
+msgstr ""
+
+#: merge-recursive.c:1761
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+
+#: merge-recursive.c:1771
+#, c-format
+msgid "Adding %s"
+msgstr ""
+
+#: merge-recursive.c:1788
+msgid "Fatal merge failure, shouldn't happen."
+msgstr ""
+
+#: merge-recursive.c:1807
+msgid "Already up-to-date!"
+msgstr ""
+
+#: merge-recursive.c:1816
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr ""
+
+#: merge-recursive.c:1846
+#, c-format
+msgid "Unprocessed path??? %s"
+msgstr ""
+
+#: merge-recursive.c:1891
+msgid "Merging:"
+msgstr ""
+
+#: merge-recursive.c:1904
+#, c-format
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: merge-recursive.c:1941
+msgid "merge returned no commit"
+msgstr ""
+
+#: merge-recursive.c:1998
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr ""
+
+#: merge-recursive.c:2010 builtin/merge.c:665
+msgid "Unable to write index."
+msgstr ""
+
+#: notes-utils.c:40
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr ""
+
+#: notes-utils.c:81
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr ""
+
+#: notes-utils.c:91
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr ""
+
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:118
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr ""
+
+#: object.c:202
+#, c-format
+msgid "unable to parse object: %s"
+msgstr ""
+
+#: parse-options.c:537
+msgid "..."
+msgstr "…"
+
+#: parse-options.c:555
+#, c-format
+msgid "usage: %s"
+msgstr "употреба: %s"
+
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:559
+#, c-format
+msgid " or: %s"
+msgstr " или: %s"
+
+#: parse-options.c:562
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: parse-options.c:596
+msgid "-NUM"
+msgstr "-ЧИСЛО"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr ""
+
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr ""
+
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr ""
+
+#: pathspec.c:187
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr ""
+
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr ""
+
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr ""
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr ""
+
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr ""
+
+#.
+#. * We may want to substitute "this command" with a command
+#. * name. E.g. when add--interactive dies when running
+#. * "checkout -p"
+#.
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr ""
+
+#: pathspec.c:433
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr ""
+
+#: pathspec.c:442
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+
+#: remote.c:753
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
+
+#: remote.c:757
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "„%s“ обикновено следи „%s“, а не „%s“"
+
+#: remote.c:761
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "„%s“ следи както „%s“, така и „%s“"
+
+#.
+#. * This last possibility doesn't occur because
+#. * FETCH_HEAD_IGNORE entries always appear at
+#. * the end of the list.
+#.
+#: remote.c:769
+msgid "Internal error"
+msgstr "Вътрешна грешка"
+
+#: remote.c:1871
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
+
+#: remote.c:1875
+msgid " (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr " (за да коригирате това използвайте „git branch --unset-upstream“)\n"
+
+#: remote.c:1878
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "Клонът е актуализиран както „%s“.\n"
+
+#: remote.c:1882
+#, c-format
+msgid "Your branch is ahead of '%s' by %d commit.\n"
+msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
+msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
+msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
+
+#: remote.c:1888
+msgid " (use \"git push\" to publish your local commits)\n"
+msgstr " (публикувайте локалните си промени чрез „git push“)\n"
+
+#: remote.c:1891
+#, c-format
+msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Клонът ви е с %2$d подаване след „%1$s“ и може да бъде тривиално слят.\n"
+msgstr[1] ""
+"Клонът ви е с %2$d подавания след „%1$s“ и може да бъде тривиално слят.\n"
+
+#: remote.c:1899
+msgid " (use \"git pull\" to update your local branch)\n"
+msgstr " (обновете локалния си клон чрез „git pull“)\n"
+
+#: remote.c:1902
+#, c-format
+msgid ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commit each, respectively.\n"
+msgid_plural ""
+"Your branch and '%s' have diverged,\n"
+"and have %d and %d different commits each, respectively.\n"
+msgstr[0] ""
+"Текущият клон се е отделил от „%s“,\n"
+"двата имат съответно по %d и %d несъвпадащи подавания.\n"
+msgstr[1] ""
+"Текущият клон се е отделил от „%s“,\n"
+"двата имат съответно по %d и %d несъвпадащи подавания.\n"
+
+#: remote.c:1912
+msgid " (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n"
+
+#: run-command.c:80
+msgid "open /dev/null failed"
+msgstr "неуспешно отваряне на „/dev/null“"
+
+#: run-command.c:82
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "неуспешно изпълнение на dup2(%d,%d)"
+
+#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
+#: builtin/merge.c:1006 builtin/merge.c:1016
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr ""
+
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
+#: builtin/merge.c:1008 builtin/merge.c:1021
+#, c-format
+msgid "Could not write to '%s'"
+msgstr ""
+
+#: sequencer.c:229
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+
+#: sequencer.c:232
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+
+#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#, c-format
+msgid "Could not write to %s"
+msgstr ""
+
+#: sequencer.c:248
+#, c-format
+msgid "Error wrapping up %s"
+msgstr ""
+
+#: sequencer.c:263
+msgid "Your local changes would be overwritten by cherry-pick."
+msgstr ""
+
+#: sequencer.c:265
+msgid "Your local changes would be overwritten by revert."
+msgstr ""
+
+#: sequencer.c:268
+msgid "Commit your changes or stash them to proceed."
+msgstr ""
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:325
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr ""
+
+#: sequencer.c:356
+msgid "Could not resolve HEAD commit\n"
+msgstr ""
+
+#: sequencer.c:378
+msgid "Unable to update cache tree\n"
+msgstr ""
+
+#: sequencer.c:423
+#, c-format
+msgid "Could not parse commit %s\n"
+msgstr ""
+
+#: sequencer.c:428
+#, c-format
+msgid "Could not parse parent commit %s\n"
+msgstr ""
+
+#: sequencer.c:494
+msgid "Your index file is unmerged."
+msgstr ""
+
+#: sequencer.c:513
+#, c-format
+msgid "Commit %s is a merge but no -m option was given."
+msgstr ""
+
+#: sequencer.c:521
+#, c-format
+msgid "Commit %s does not have parent %d"
+msgstr ""
+
+#: sequencer.c:525
+#, c-format
+msgid "Mainline was specified but commit %s is not a merge."
+msgstr ""
+
+#. TRANSLATORS: The first %s will be "revert" or
+#. "cherry-pick", the second %s a SHA1
+#: sequencer.c:538
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr ""
+
+#: sequencer.c:542
+#, c-format
+msgid "Cannot get commit message for %s"
+msgstr ""
+
+#: sequencer.c:628
+#, c-format
+msgid "could not revert %s... %s"
+msgstr ""
+
+#: sequencer.c:629
+#, c-format
+msgid "could not apply %s... %s"
+msgstr ""
+
+#: sequencer.c:665
+msgid "empty commit set passed"
+msgstr ""
+
+#: sequencer.c:673
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr ""
+
+#: sequencer.c:678
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr ""
+
+#: sequencer.c:736
+#, c-format
+msgid "Cannot %s during a %s"
+msgstr ""
+
+#: sequencer.c:758
+#, c-format
+msgid "Could not parse line %d."
+msgstr ""
+
+#: sequencer.c:763
+msgid "No commits parsed."
+msgstr ""
+
+#: sequencer.c:776
+#, c-format
+msgid "Could not open %s"
+msgstr ""
+
+#: sequencer.c:780
+#, c-format
+msgid "Could not read %s."
+msgstr ""
+
+#: sequencer.c:787
+#, c-format
+msgid "Unusable instruction sheet: %s"
+msgstr ""
+
+#: sequencer.c:815
+#, c-format
+msgid "Invalid key: %s"
+msgstr ""
+
+#: sequencer.c:818
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr ""
+
+#: sequencer.c:830
+#, c-format
+msgid "Malformed options sheet: %s"
+msgstr ""
+
+#: sequencer.c:851
+msgid "a cherry-pick or revert is already in progress"
+msgstr ""
+
+#: sequencer.c:852
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr ""
+
+#: sequencer.c:856
+#, c-format
+msgid "Could not create sequencer directory %s"
+msgstr ""
+
+#: sequencer.c:872 sequencer.c:957
+#, c-format
+msgid "Error wrapping up %s."
+msgstr ""
+
+#: sequencer.c:891 sequencer.c:1025
+msgid "no cherry-pick or revert in progress"
+msgstr ""
+
+#: sequencer.c:893
+msgid "cannot resolve HEAD"
+msgstr ""
+
+#: sequencer.c:895
+msgid "cannot abort from a branch yet to be born"
+msgstr ""
+
+#: sequencer.c:917 builtin/apply.c:4061
+#, c-format
+msgid "cannot open %s: %s"
+msgstr ""
+
+#: sequencer.c:920
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: sequencer.c:921
+msgid "unexpected end of file"
+msgstr ""
+
+#: sequencer.c:927
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr ""
+
+#: sequencer.c:950
+#, c-format
+msgid "Could not format %s."
+msgstr ""
+
+#: sequencer.c:1093
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr ""
+
+#: sequencer.c:1096
+#, c-format
+msgid "%s: bad revision"
+msgstr ""
+
+#: sequencer.c:1130
+msgid "Can't revert as initial commit"
+msgstr ""
+
+#: sequencer.c:1131
+msgid "Can't cherry-pick into empty head"
+msgstr ""
+
+#: sha1_name.c:439
+msgid ""
+"Git normally never creates a ref that ends with 40 hex characters\n"
+"because it will be ignored when you just specify 40-hex. These refs\n"
+"may be created by mistake. For example,\n"
+"\n"
+" git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+"examine these refs and maybe delete them. Turn this message off by\n"
+"running \"git config advice.objectNameWarning false\""
+msgstr ""
+
+#: sha1_name.c:1109
+msgid "HEAD does not point to a branch"
+msgstr ""
+
+#: sha1_name.c:1112
+#, c-format
+msgid "No such branch: '%s'"
+msgstr ""
+
+#: sha1_name.c:1114
+#, c-format
+msgid "No upstream configured for branch '%s'"
+msgstr ""
+
+#: sha1_name.c:1118
+#, c-format
+msgid "Upstream branch '%s' not stored as a remote-tracking branch"
+msgstr ""
+
+#: submodule.c:64 submodule.c:98
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+
+#: submodule.c:68 submodule.c:102
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr ""
+
+#. Maybe the user already did that, don't error out here
+#: submodule.c:76
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr ""
+
+#. Maybe the user already did that, don't error out here
+#: submodule.c:109
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr ""
+
+#: submodule.c:127
+msgid "could not find .gitmodules in index"
+msgstr ""
+
+#: submodule.c:133
+msgid "reading updated .gitmodules failed"
+msgstr ""
+
+#: submodule.c:135
+msgid "unable to stat updated .gitmodules"
+msgstr ""
+
+#: submodule.c:139
+msgid "unable to remove .gitmodules from index"
+msgstr ""
+
+#: submodule.c:141
+msgid "adding updated .gitmodules failed"
+msgstr ""
+
+#: submodule.c:143
+msgid "staging updated .gitmodules failed"
+msgstr ""
+
+#: submodule.c:1144 builtin/init-db.c:363
+#, c-format
+msgid "Could not create git link %s"
+msgstr ""
+
+#: submodule.c:1155
+#, c-format
+msgid "Could not set core.worktree in %s"
+msgstr ""
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr ""
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr ""
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr ""
+
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr ""
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr ""
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr ""
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr ""
+
+#: wrapper.c:422
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr ""
+
+#: wrapper.c:443
+#, c-format
+msgid "unable to access '%s'"
+msgstr ""
+
+#: wrapper.c:454
+#, c-format
+msgid "unable to look up current user in the passwd file: %s"
+msgstr ""
+
+#: wrapper.c:455
+msgid "no such user"
+msgstr ""
+
+#: wt-status.c:150
+msgid "Unmerged paths:"
+msgstr ""
+
+#: wt-status.c:177 wt-status.c:204
+#, c-format
+msgid " (use \"git reset %s <file>...\" to unstage)"
+msgstr ""
+
+#: wt-status.c:179 wt-status.c:206
+msgid " (use \"git rm --cached <file>...\" to unstage)"
+msgstr ""
+
+#: wt-status.c:183
+msgid " (use \"git add <file>...\" to mark resolution)"
+msgstr ""
+
+#: wt-status.c:185 wt-status.c:189
+msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+
+#: wt-status.c:187
+msgid " (use \"git rm <file>...\" to mark resolution)"
+msgstr ""
+
+#: wt-status.c:198
+msgid "Changes to be committed:"
+msgstr ""
+
+#: wt-status.c:216
+msgid "Changes not staged for commit:"
+msgstr ""
+
+#: wt-status.c:220
+msgid " (use \"git add <file>...\" to update what will be committed)"
+msgstr ""
+
+#: wt-status.c:222
+msgid " (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr ""
+
+#: wt-status.c:223
+msgid ""
+" (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+
+#: wt-status.c:225
+msgid " (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+
+#: wt-status.c:237
+#, c-format
+msgid " (use \"git %s <file>...\" to include in what will be committed)"
+msgstr ""
+
+#: wt-status.c:254
+msgid "bug"
+msgstr ""
+
+#: wt-status.c:259
+msgid "both deleted:"
+msgstr ""
+
+#: wt-status.c:260
+msgid "added by us:"
+msgstr ""
+
+#: wt-status.c:261
+msgid "deleted by them:"
+msgstr ""
+
+#: wt-status.c:262
+msgid "added by them:"
+msgstr ""
+
+#: wt-status.c:263
+msgid "deleted by us:"
+msgstr ""
+
+#: wt-status.c:264
+msgid "both added:"
+msgstr ""
+
+#: wt-status.c:265
+msgid "both modified:"
+msgstr ""
+
+#: wt-status.c:275
+msgid "new file"
+msgstr ""
+
+#: wt-status.c:277
+msgid "copied"
+msgstr ""
+
+#: wt-status.c:279
+msgid "deleted"
+msgstr ""
+
+#: wt-status.c:285
+msgid "typechange"
+msgstr ""
+
+#: wt-status.c:287
+msgid "unknown"
+msgstr ""
+
+#: wt-status.c:289
+msgid "unmerged"
+msgstr ""
+
+#: wt-status.c:336
+msgid "new commits, "
+msgstr ""
+
+#: wt-status.c:338
+msgid "modified content, "
+msgstr ""
+
+#: wt-status.c:340
+msgid "untracked content, "
+msgstr ""
+
+#: wt-status.c:357
+#, c-format
+msgid "bug: unhandled diff status %c"
+msgstr ""
+
+#: wt-status.c:732
+msgid "Submodules changed but not updated:"
+msgstr ""
+
+#: wt-status.c:734
+msgid "Submodule changes to be committed:"
+msgstr ""
+
+#: wt-status.c:836
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+
+#: wt-status.c:899
+msgid "You have unmerged paths."
+msgstr ""
+
+#: wt-status.c:902
+msgid " (fix conflicts and run \"git commit\")"
+msgstr ""
+
+#: wt-status.c:905
+msgid "All conflicts fixed but you are still merging."
+msgstr ""
+
+#: wt-status.c:908
+msgid " (use \"git commit\" to conclude merge)"
+msgstr ""
+
+#: wt-status.c:918
+msgid "You are in the middle of an am session."
+msgstr ""
+
+#: wt-status.c:921
+msgid "The current patch is empty."
+msgstr ""
+
+#: wt-status.c:925
+msgid " (fix conflicts and then run \"git am --continue\")"
+msgstr ""
+
+#: wt-status.c:927
+msgid " (use \"git am --skip\" to skip this patch)"
+msgstr ""
+
+#: wt-status.c:929
+msgid " (use \"git am --abort\" to restore the original branch)"
+msgstr ""
+
+#: wt-status.c:989 wt-status.c:1006
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr ""
+
+#: wt-status.c:994 wt-status.c:1011
+msgid "You are currently rebasing."
+msgstr ""
+
+#: wt-status.c:997
+msgid " (fix conflicts and then run \"git rebase --continue\")"
+msgstr ""
+
+#: wt-status.c:999
+msgid " (use \"git rebase --skip\" to skip this patch)"
+msgstr ""
+
+#: wt-status.c:1001
+msgid " (use \"git rebase --abort\" to check out the original branch)"
+msgstr ""
+
+#: wt-status.c:1014
+msgid " (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+
+#: wt-status.c:1018
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+
+#: wt-status.c:1023
+msgid "You are currently splitting a commit during a rebase."
+msgstr ""
+
+#: wt-status.c:1026
+msgid " (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr ""
+
+#: wt-status.c:1030
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr ""
+
+#: wt-status.c:1035
+msgid "You are currently editing a commit during a rebase."
+msgstr ""
+
+#: wt-status.c:1038
+msgid " (use \"git commit --amend\" to amend the current commit)"
+msgstr ""
+
+#: wt-status.c:1040
+msgid ""
+" (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+
+#: wt-status.c:1050
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr ""
+
+#: wt-status.c:1055
+msgid " (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr ""
+
+#: wt-status.c:1058
+msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+
+#: wt-status.c:1060
+msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr ""
+
+#: wt-status.c:1069
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr ""
+
+#: wt-status.c:1074
+msgid " (fix conflicts and run \"git revert --continue\")"
+msgstr ""
+
+#: wt-status.c:1077
+msgid " (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+
+#: wt-status.c:1079
+msgid " (use \"git revert --abort\" to cancel the revert operation)"
+msgstr ""
+
+#: wt-status.c:1090
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr ""
+
+#: wt-status.c:1094
+msgid "You are currently bisecting."
+msgstr ""
+
+#: wt-status.c:1097
+msgid " (use \"git bisect reset\" to get back to the original branch)"
+msgstr ""
+
+#: wt-status.c:1272
+msgid "On branch "
+msgstr ""
+
+#: wt-status.c:1279
+msgid "rebase in progress; onto "
+msgstr ""
+
+#: wt-status.c:1286
+msgid "HEAD detached at "
+msgstr ""
+
+#: wt-status.c:1288
+msgid "HEAD detached from "
+msgstr ""
+
+#: wt-status.c:1291
+msgid "Not currently on any branch."
+msgstr ""
+
+#: wt-status.c:1308
+msgid "Initial commit"
+msgstr ""
+
+#: wt-status.c:1322
+msgid "Untracked files"
+msgstr ""
+
+#: wt-status.c:1324
+msgid "Ignored files"
+msgstr ""
+
+#: wt-status.c:1328
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+
+#: wt-status.c:1334
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr ""
+
+#: wt-status.c:1336
+msgid " (use -u option to show untracked files)"
+msgstr ""
+
+#: wt-status.c:1342
+msgid "No changes"
+msgstr ""
+
+#: wt-status.c:1347
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+
+#: wt-status.c:1350
+#, c-format
+msgid "no changes added to commit\n"
+msgstr ""
+
+#: wt-status.c:1353
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+
+#: wt-status.c:1356
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr ""
+
+#: wt-status.c:1359
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+
+#: wt-status.c:1362 wt-status.c:1367
+#, c-format
+msgid "nothing to commit\n"
+msgstr ""
+
+#: wt-status.c:1365
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+
+#: wt-status.c:1369
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr ""
+
+#: wt-status.c:1478
+msgid "HEAD (no branch)"
+msgstr ""
+
+#: wt-status.c:1484
+msgid "Initial commit on "
+msgstr ""
+
+#: wt-status.c:1514
+msgid "gone"
+msgstr ""
+
+#: wt-status.c:1516
+msgid "behind "
+msgstr ""
+
+#: wt-status.c:1519 wt-status.c:1522
+msgid "ahead "
+msgstr ""
+
+#: wt-status.c:1524
+msgid ", behind "
+msgstr ""
+
+#: compat/precompose_utf8.c:55 builtin/clone.c:356
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr ""
+
+#: builtin/add.c:20
+msgid "git add [options] [--] <pathspec>..."
+msgstr ""
+
+#.
+#. * To be consistent with "git add -p" and most Git
+#. * commands, we should default to being tree-wide, but
+#. * this is not the original behavior and can't be
+#. * changed until users trained themselves not to type
+#. * "git add -u" or "git add -A". For now, we warn and
+#. * keep the old behavior. Later, the behavior can be changed
+#. * to tree-wide, keeping the warning for a while, and
+#. * eventually we can drop the warning.
+#.
+#: builtin/add.c:58
+#, c-format
+msgid ""
+"The behavior of 'git add %s (or %s)' with no path argument from a\n"
+"subdirectory of the tree will change in Git 2.0 and should not be used "
+"anymore.\n"
+"To add content for the whole tree, run:\n"
+"\n"
+" git add %s :/\n"
+" (or git add %s :/)\n"
+"\n"
+"To restrict the command to the current directory, run:\n"
+"\n"
+" git add %s .\n"
+" (or git add %s .)\n"
+"\n"
+"With the current Git version, the command is restricted to the current "
+"directory.\n"
+msgstr ""
+
+#: builtin/add.c:100
+#, c-format
+msgid ""
+"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
+"Paths like '%s' that are\n"
+"removed from your working tree are ignored with this version of Git.\n"
+"\n"
+"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+" ignores paths you removed from your working tree.\n"
+"\n"
+"* 'git add --all <pathspec>' will let you also record the removals.\n"
+"\n"
+"Run 'git status' to check the paths you removed from your working tree.\n"
+msgstr ""
+
+#: builtin/add.c:144
+#, c-format
+msgid "unexpected diff status %c"
+msgstr ""
+
+#: builtin/add.c:149 builtin/commit.c:260
+msgid "updating files failed"
+msgstr ""
+
+#: builtin/add.c:163
+#, c-format
+msgid "remove '%s'\n"
+msgstr ""
+
+#: builtin/add.c:237
+msgid "Unstaged changes after refreshing the index:"
+msgstr ""
+
+#: builtin/add.c:299
+msgid "Could not read the index"
+msgstr ""
+
+#: builtin/add.c:310
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr ""
+
+#: builtin/add.c:314
+msgid "Could not write patch"
+msgstr ""
+
+#: builtin/add.c:319
+#, c-format
+msgid "Could not stat '%s'"
+msgstr ""
+
+#: builtin/add.c:321
+msgid "Empty patch. Aborted."
+msgstr ""
+
+#: builtin/add.c:327
+#, c-format
+msgid "Could not apply '%s'"
+msgstr ""
+
+#: builtin/add.c:337
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr ""
+
+#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: builtin/rm.c:269
+msgid "dry run"
+msgstr "пробно изпълнeние"
+
+#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
+msgid "be verbose"
+msgstr "повече подробности"
+
+#: builtin/add.c:357
+msgid "interactive picking"
+msgstr ""
+
+#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+msgid "select hunks interactively"
+msgstr ""
+
+#: builtin/add.c:359
+msgid "edit current diff and apply"
+msgstr ""
+
+#: builtin/add.c:360
+msgid "allow adding otherwise ignored files"
+msgstr ""
+
+#: builtin/add.c:361
+msgid "update tracked files"
+msgstr ""
+
+#: builtin/add.c:362
+msgid "record only the fact that the path will be added later"
+msgstr ""
+
+#: builtin/add.c:363
+msgid "add changes from all tracked and untracked files"
+msgstr ""
+
+#. takes no arguments
+#: builtin/add.c:366
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr ""
+
+#: builtin/add.c:368
+msgid "don't add, only refresh the index"
+msgstr ""
+
+#: builtin/add.c:369
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+
+#: builtin/add.c:370
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+
+#: builtin/add.c:392
+#, c-format
+msgid "Use -f if you really want to add them.\n"
+msgstr ""
+
+#: builtin/add.c:393
+msgid "no files added"
+msgstr ""
+
+#: builtin/add.c:399
+msgid "adding files failed"
+msgstr ""
+
+#: builtin/add.c:438
+msgid "-A and -u are mutually incompatible"
+msgstr ""
+
+#: builtin/add.c:456
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+
+#: builtin/add.c:486
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr ""
+
+#: builtin/add.c:487
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr ""
+
+#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+msgid "index file corrupt"
+msgstr "файлът с индекса е повреден"
+
+#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+msgid "Unable to write new index file"
+msgstr "Новият файл с индекса не може да бъде записан"
+
+#: builtin/apply.c:57
+msgid "git apply [options] [<patch>...]"
+msgstr ""
+
+#: builtin/apply.c:110
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr ""
+
+#: builtin/apply.c:125
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr ""
+
+#: builtin/apply.c:823
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr ""
+
+#: builtin/apply.c:832
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr ""
+
+#: builtin/apply.c:913
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr ""
+
+#: builtin/apply.c:945
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr ""
+
+#: builtin/apply.c:949
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr ""
+
+#: builtin/apply.c:950
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr ""
+
+#: builtin/apply.c:957
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr ""
+
+#: builtin/apply.c:1422
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr ""
+
+#: builtin/apply.c:1479
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr ""
+
+#: builtin/apply.c:1496
+#, c-format
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/apply.c:1656
+msgid "new file depends on old contents"
+msgstr ""
+
+#: builtin/apply.c:1658
+msgid "deleted file still has contents"
+msgstr ""
+
+#: builtin/apply.c:1684
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr ""
+
+#: builtin/apply.c:1720
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr ""
+
+#: builtin/apply.c:1722
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr ""
+
+#: builtin/apply.c:1725
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr ""
+
+#: builtin/apply.c:1871
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr ""
+
+#. there has to be one hunk (forward hunk)
+#: builtin/apply.c:1900
+#, c-format
+msgid "unrecognized binary patch at line %d"
+msgstr ""
+
+#: builtin/apply.c:1986
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr ""
+
+#: builtin/apply.c:2076
+#, c-format
+msgid "unable to read symlink %s"
+msgstr ""
+
+#: builtin/apply.c:2080
+#, c-format
+msgid "unable to open or read %s"
+msgstr ""
+
+#: builtin/apply.c:2688
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr ""
+
+#: builtin/apply.c:2806
+#, c-format
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/apply.c:2818
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr ""
+
+#: builtin/apply.c:2824
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+
+#: builtin/apply.c:2843
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr ""
+
+#: builtin/apply.c:2946
+#, c-format
+msgid "binary patch does not apply to '%s'"
+msgstr ""
+
+#: builtin/apply.c:2952
+#, c-format
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+
+#: builtin/apply.c:2973
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr ""
+
+#: builtin/apply.c:3095
+#, c-format
+msgid "cannot checkout %s"
+msgstr ""
+
+#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
+#, c-format
+msgid "read of %s failed"
+msgstr ""
+
+#: builtin/apply.c:3174 builtin/apply.c:3396
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr ""
+
+#: builtin/apply.c:3255 builtin/apply.c:3410
+#, c-format
+msgid "%s: does not exist in index"
+msgstr ""
+
+#: builtin/apply.c:3259 builtin/apply.c:3402 builtin/apply.c:3424
+#, c-format
+msgid "%s: %s"
+msgstr ""
+
+#: builtin/apply.c:3264 builtin/apply.c:3418
+#, c-format
+msgid "%s: does not match index"
+msgstr ""
+
+#: builtin/apply.c:3366
+msgid "removal patch leaves file contents"
+msgstr ""
+
+#: builtin/apply.c:3435
+#, c-format
+msgid "%s: wrong type"
+msgstr ""
+
+#: builtin/apply.c:3437
+#, c-format
+msgid "%s has type %o, expected %o"
+msgstr ""
+
+#: builtin/apply.c:3538
+#, c-format
+msgid "%s: already exists in index"
+msgstr ""
+
+#: builtin/apply.c:3541
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr ""
+
+#: builtin/apply.c:3561
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr ""
+
+#: builtin/apply.c:3566
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr ""
+
+#: builtin/apply.c:3574
+#, c-format
+msgid "%s: patch does not apply"
+msgstr ""
+
+#: builtin/apply.c:3587
+#, c-format
+msgid "Checking patch %s..."
+msgstr ""
+
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr ""
+
+#: builtin/apply.c:3823
+#, c-format
+msgid "unable to remove %s from index"
+msgstr ""
+
+#: builtin/apply.c:3851
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr ""
+
+#: builtin/apply.c:3855
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr ""
+
+#: builtin/apply.c:3860
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr ""
+
+#: builtin/apply.c:3863 builtin/apply.c:3971
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr ""
+
+#: builtin/apply.c:3896
+#, c-format
+msgid "closing file '%s'"
+msgstr ""
+
+#: builtin/apply.c:3945
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr ""
+
+#: builtin/apply.c:4032
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr ""
+
+#: builtin/apply.c:4040
+msgid "internal error"
+msgstr ""
+
+#. Say this even without --verbose
+#: builtin/apply.c:4043
+#, c-format
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/apply.c:4053
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
+msgstr ""
+
+#: builtin/apply.c:4074
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr ""
+
+#: builtin/apply.c:4077
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr ""
+
+#: builtin/apply.c:4227
+msgid "unrecognized input"
+msgstr ""
+
+#: builtin/apply.c:4238
+msgid "unable to read index file"
+msgstr ""
+
+#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
+#: builtin/fetch.c:78
+msgid "path"
+msgstr ""
+
+#: builtin/apply.c:4358
+msgid "don't apply changes matching the given path"
+msgstr ""
+
+#: builtin/apply.c:4361
+msgid "apply changes matching the given path"
+msgstr ""
+
+#: builtin/apply.c:4363
+msgid "num"
+msgstr ""
+
+#: builtin/apply.c:4364
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr ""
+
+#: builtin/apply.c:4367
+msgid "ignore additions made by the patch"
+msgstr ""
+
+#: builtin/apply.c:4369
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr ""
+
+#: builtin/apply.c:4373
+msgid "show number of added and deleted lines in decimal notation"
+msgstr ""
+
+#: builtin/apply.c:4375
+msgid "instead of applying the patch, output a summary for the input"
+msgstr ""
+
+#: builtin/apply.c:4377
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr ""
+
+#: builtin/apply.c:4379
+msgid "make sure the patch is applicable to the current index"
+msgstr ""
+
+#: builtin/apply.c:4381
+msgid "apply a patch without touching the working tree"
+msgstr ""
+
+#: builtin/apply.c:4383
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr ""
+
+#: builtin/apply.c:4385
+msgid "attempt three-way merge if a patch does not apply"
+msgstr ""
+
+#: builtin/apply.c:4387
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+msgid "paths are separated with NUL character"
+msgstr ""
+
+#: builtin/apply.c:4392
+#, fuzzy
+msgid "ensure at least <n> lines of context match"
+msgstr "<брой>"
+
+#: builtin/apply.c:4393
+msgid "action"
+msgstr ""
+
+#: builtin/apply.c:4394
+msgid "detect new or modified lines that have whitespace errors"
+msgstr ""
+
+#: builtin/apply.c:4397 builtin/apply.c:4400
+msgid "ignore changes in whitespace when finding context"
+msgstr ""
+
+#: builtin/apply.c:4403
+msgid "apply the patch in reverse"
+msgstr ""
+
+#: builtin/apply.c:4405
+msgid "don't expect at least one line of context"
+msgstr ""
+
+#: builtin/apply.c:4407
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
+
+#: builtin/apply.c:4409
+msgid "allow overlapping hunks"
+msgstr ""
+
+#: builtin/apply.c:4412
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr ""
+
+#: builtin/apply.c:4415
+msgid "do not trust the line counts in the hunk headers"
+msgstr ""
+
+#: builtin/apply.c:4417
+msgid "root"
+msgstr ""
+
+#: builtin/apply.c:4418
+msgid "prepend <root> to all filenames"
+msgstr ""
+
+#: builtin/apply.c:4440
+msgid "--3way outside a repository"
+msgstr ""
+
+#: builtin/apply.c:4448
+msgid "--index outside a repository"
+msgstr ""
+
+#: builtin/apply.c:4451
+msgid "--cached outside a repository"
+msgstr ""
+
+#: builtin/apply.c:4467
+#, c-format
+msgid "can't open patch '%s'"
+msgstr ""
+
+#: builtin/apply.c:4481
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/apply.c:4487 builtin/apply.c:4497
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/archive.c:17
+#, c-format
+msgid "could not create archive file '%s'"
+msgstr ""
+
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr ""
+
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr ""
+
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr ""
+
+#: builtin/archive.c:61
+#, c-format
+msgid "git archive: NACK %s"
+msgstr ""
+
+#: builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr ""
+
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr ""
+
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr ""
+
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr ""
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr ""
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr ""
+
+#: builtin/blame.c:27
+msgid "git blame [options] [rev-opts] [rev] [--] file"
+msgstr ""
+
+#: builtin/blame.c:32
+msgid "[rev-opts] are documented in git-rev-list(1)"
+msgstr ""
+
+#: builtin/blame.c:2249
+msgid "Show blame entries as we find them, incrementally"
+msgstr ""
+
+# FIXME
+#: builtin/blame.c:2250
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2251
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2252
+msgid "Show work cost statistics"
+msgstr ""
+
+#: builtin/blame.c:2253
+msgid "Show output score for blame entries"
+msgstr ""
+
+#: builtin/blame.c:2254
+msgid "Show original filename (Default: auto)"
+msgstr ""
+
+#: builtin/blame.c:2255
+msgid "Show original linenumber (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2256
+msgid "Show in a format designed for machine consumption"
+msgstr ""
+
+#: builtin/blame.c:2257
+msgid "Show porcelain format with per-line commit information"
+msgstr ""
+
+#: builtin/blame.c:2258
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2259
+msgid "Show raw timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2260
+msgid "Show long commit SHA1 (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2261
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2262
+msgid "Show author email instead of name (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2263
+msgid "Ignore whitespace differences"
+msgstr ""
+
+#: builtin/blame.c:2264
+msgid "Spend extra cycles to find better match"
+msgstr ""
+
+#: builtin/blame.c:2265
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr ""
+
+#: builtin/blame.c:2266
+msgid "Use <file>'s contents as the final image"
+msgstr ""
+
+#: builtin/blame.c:2267 builtin/blame.c:2268
+msgid "score"
+msgstr ""
+
+#: builtin/blame.c:2267
+msgid "Find line copies within and across files"
+msgstr ""
+
+#: builtin/blame.c:2268
+msgid "Find line movements within and across files"
+msgstr ""
+
+#: builtin/blame.c:2269
+msgid "n,m"
+msgstr ""
+
+#: builtin/blame.c:2269
+msgid "Process only line range n,m, counting from 1"
+msgstr ""
+
+#: builtin/branch.c:24
+msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
+msgstr ""
+
+#: builtin/branch.c:25
+msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
+msgstr ""
+
+#: builtin/branch.c:26
+msgid "git branch [options] [-r] (-d | -D) <branchname>..."
+msgstr ""
+
+#: builtin/branch.c:27
+msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
+msgstr ""
+
+#: builtin/branch.c:150
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+" '%s', but not yet merged to HEAD."
+msgstr ""
+
+#: builtin/branch.c:154
+#, c-format
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+" '%s', even though it is merged to HEAD."
+msgstr ""
+
+#: builtin/branch.c:168
+#, c-format
+msgid "Couldn't look up commit object for '%s'"
+msgstr ""
+
+#: builtin/branch.c:172
+#, c-format
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
+msgstr ""
+
+#: builtin/branch.c:185
+msgid "Update of config-file failed"
+msgstr ""
+
+#: builtin/branch.c:213
+msgid "cannot use -a with -d"
+msgstr ""
+
+#: builtin/branch.c:219
+msgid "Couldn't look up commit object for HEAD"
+msgstr ""
+
+#: builtin/branch.c:227
+#, c-format
+msgid "Cannot delete the branch '%s' which you are currently on."
+msgstr ""
+
+#: builtin/branch.c:240
+#, c-format
+msgid "remote branch '%s' not found."
+msgstr ""
+
+#: builtin/branch.c:241
+#, c-format
+msgid "branch '%s' not found."
+msgstr ""
+
+#: builtin/branch.c:255
+#, c-format
+msgid "Error deleting remote branch '%s'"
+msgstr ""
+
+#: builtin/branch.c:256
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr ""
+
+#: builtin/branch.c:263
+#, c-format
+msgid "Deleted remote branch %s (was %s).\n"
+msgstr ""
+
+#: builtin/branch.c:264
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
+msgstr ""
+
+#: builtin/branch.c:366
+#, c-format
+msgid "branch '%s' does not point at a commit"
+msgstr ""
+
+#: builtin/branch.c:454
+#, c-format
+msgid "[%s: gone]"
+msgstr ""
+
+#: builtin/branch.c:459
+#, c-format
+msgid "[%s]"
+msgstr ""
+
+#: builtin/branch.c:464
+#, c-format
+msgid "[%s: behind %d]"
+msgstr ""
+
+#: builtin/branch.c:466
+#, c-format
+msgid "[behind %d]"
+msgstr ""
+
+#: builtin/branch.c:470
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr ""
+
+#: builtin/branch.c:472
+#, c-format
+msgid "[ahead %d]"
+msgstr ""
+
+#: builtin/branch.c:475
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr ""
+
+#: builtin/branch.c:478
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr ""
+
+#: builtin/branch.c:502
+msgid " **** invalid ref ****"
+msgstr ""
+
+#: builtin/branch.c:594
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr ""
+
+#: builtin/branch.c:597
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr ""
+
+#: builtin/branch.c:600
+#, c-format
+msgid "(detached from %s)"
+msgstr ""
+
+#: builtin/branch.c:603
+msgid "(no branch)"
+msgstr ""
+
+#: builtin/branch.c:649
+#, c-format
+msgid "object '%s' does not point to a commit"
+msgstr ""
+
+#: builtin/branch.c:681
+msgid "some refs could not be read"
+msgstr ""
+
+#: builtin/branch.c:694
+msgid "cannot rename the current branch while not on any."
+msgstr ""
+
+#: builtin/branch.c:704
+#, c-format
+msgid "Invalid branch name: '%s'"
+msgstr ""
+
+#: builtin/branch.c:719
+msgid "Branch rename failed"
+msgstr ""
+
+#: builtin/branch.c:723
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
+msgstr ""
+
+#: builtin/branch.c:727
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
+msgstr ""
+
+#: builtin/branch.c:734
+msgid "Branch is renamed, but update of config-file failed"
+msgstr ""
+
+#: builtin/branch.c:749
+#, c-format
+msgid "malformed object name %s"
+msgstr ""
+
+#: builtin/branch.c:773
+#, c-format
+msgid "could not write branch description template: %s"
+msgstr ""
+
+#: builtin/branch.c:803
+msgid "Generic options"
+msgstr ""
+
+#: builtin/branch.c:805
+msgid "show hash and subject, give twice for upstream branch"
+msgstr ""
+
+#: builtin/branch.c:806
+msgid "suppress informational messages"
+msgstr ""
+
+#: builtin/branch.c:807
+msgid "set up tracking mode (see git-pull(1))"
+msgstr ""
+
+#: builtin/branch.c:809
+msgid "change upstream info"
+msgstr ""
+
+#: builtin/branch.c:813
+msgid "use colored output"
+msgstr ""
+
+#: builtin/branch.c:814
+msgid "act on remote-tracking branches"
+msgstr ""
+
+#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
+#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461
+#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+msgid "commit"
+msgstr ""
+
+#: builtin/branch.c:818 builtin/branch.c:824
+msgid "print only branches that contain the commit"
+msgstr ""
+
+#: builtin/branch.c:830
+msgid "Specific git-branch actions:"
+msgstr ""
+
+#: builtin/branch.c:831
+msgid "list both remote-tracking and local branches"
+msgstr ""
+
+#: builtin/branch.c:833
+msgid "delete fully merged branch"
+msgstr ""
+
+#: builtin/branch.c:834
+msgid "delete branch (even if not merged)"
+msgstr ""
+
+#: builtin/branch.c:835
+msgid "move/rename a branch and its reflog"
+msgstr ""
+
+#: builtin/branch.c:836
+msgid "move/rename a branch, even if target exists"
+msgstr ""
+
+#: builtin/branch.c:837
+msgid "list branch names"
+msgstr ""
+
+#: builtin/branch.c:838
+msgid "create the branch's reflog"
+msgstr ""
+
+#: builtin/branch.c:840
+msgid "edit the description for the branch"
+msgstr ""
+
+#: builtin/branch.c:841
+msgid "force creation (when already exists)"
+msgstr ""
+
+#: builtin/branch.c:844
+msgid "print only not merged branches"
+msgstr ""
+
+#: builtin/branch.c:850
+msgid "print only merged branches"
+msgstr ""
+
+#: builtin/branch.c:854
+msgid "list branches in columns"
+msgstr ""
+
+#: builtin/branch.c:867
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr ""
+
+#: builtin/branch.c:872 builtin/clone.c:635
+msgid "HEAD not found below refs/heads!"
+msgstr ""
+
+#: builtin/branch.c:896
+msgid "--column and --verbose are incompatible"
+msgstr ""
+
+#: builtin/branch.c:902 builtin/branch.c:941
+msgid "branch name required"
+msgstr ""
+
+#: builtin/branch.c:917
+msgid "Cannot give description to detached HEAD"
+msgstr ""
+
+#: builtin/branch.c:922
+msgid "cannot edit description of more than one branch"
+msgstr ""
+
+#: builtin/branch.c:929
+#, c-format
+msgid "No commit on branch '%s' yet."
+msgstr ""
+
+#: builtin/branch.c:932
+#, c-format
+msgid "No branch named '%s'."
+msgstr ""
+
+#: builtin/branch.c:947
+msgid "too many branches for a rename operation"
+msgstr ""
+
+#: builtin/branch.c:952
+msgid "too many branches to set new upstream"
+msgstr ""
+
+#: builtin/branch.c:956
+#, c-format
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
+msgstr ""
+
+#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
+#, c-format
+msgid "no such branch '%s'"
+msgstr ""
+
+#: builtin/branch.c:963
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr ""
+
+#: builtin/branch.c:975
+msgid "too many branches to unset upstream"
+msgstr ""
+
+#: builtin/branch.c:979
+msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgstr ""
+
+#: builtin/branch.c:985
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr ""
+
+#: builtin/branch.c:999
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr ""
+
+#: builtin/branch.c:1005
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+msgstr ""
+
+#: builtin/branch.c:1008
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+
+#: builtin/branch.c:1025
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+
+#: builtin/branch.c:1026
+#, c-format
+msgid " git branch -d %s\n"
+msgstr ""
+
+#: builtin/branch.c:1027
+#, c-format
+msgid " git branch --set-upstream-to %s\n"
+msgstr ""
+
+#: builtin/bundle.c:47
+#, c-format
+msgid "%s is okay\n"
+msgstr ""
+
+#: builtin/bundle.c:56
+msgid "Need a repository to create a bundle."
+msgstr ""
+
+#: builtin/bundle.c:60
+msgid "Need a repository to unbundle."
+msgstr ""
+
+#: builtin/cat-file.c:328
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr ""
+
+#: builtin/cat-file.c:329
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr ""
+
+#: builtin/cat-file.c:366
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr ""
+
+#: builtin/cat-file.c:367
+msgid "show object type"
+msgstr ""
+
+#: builtin/cat-file.c:368
+msgid "show object size"
+msgstr ""
+
+#: builtin/cat-file.c:370
+msgid "exit with zero when there's no error"
+msgstr ""
+
+#: builtin/cat-file.c:371
+msgid "pretty-print object's content"
+msgstr ""
+
+#: builtin/cat-file.c:373
+msgid "for blob objects, run textconv on object's content"
+msgstr ""
+
+#: builtin/cat-file.c:375
+msgid "show info and content of objects fed from the standard input"
+msgstr ""
+
+#: builtin/cat-file.c:378
+msgid "show info about objects fed from the standard input"
+msgstr ""
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | attr...] [--] pathname..."
+msgstr ""
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"
+msgstr ""
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr ""
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr ""
+
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
+msgid "read file names from stdin"
+msgstr ""
+
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr ""
+
+#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+msgid "suppress progress reporting"
+msgstr "без показване на напредъка"
+
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr ""
+
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr ""
+
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr ""
+
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr ""
+
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr ""
+
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr ""
+
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr ""
+
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr ""
+
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [options] <contact>..."
+msgstr ""
+
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr ""
+
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr ""
+
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr ""
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [options] [--] [<file>...]"
+msgstr ""
+
+#: builtin/checkout-index.c:187
+msgid "check out all files in the index"
+msgstr ""
+
+#: builtin/checkout-index.c:188
+msgid "force overwrite of existing files"
+msgstr ""
+
+#: builtin/checkout-index.c:190
+msgid "no warning for existing files and files not in index"
+msgstr ""
+
+#: builtin/checkout-index.c:192
+msgid "don't checkout new files"
+msgstr ""
+
+#: builtin/checkout-index.c:194
+msgid "update stat information in the index file"
+msgstr ""
+
+#: builtin/checkout-index.c:200
+msgid "read list of paths from the standard input"
+msgstr ""
+
+#: builtin/checkout-index.c:202
+msgid "write the content to temporary files"
+msgstr ""
+
+#: builtin/checkout-index.c:203 builtin/column.c:30
+msgid "string"
+msgstr ""
+
+#: builtin/checkout-index.c:204
+msgid "when creating files, prepend <string>"
+msgstr ""
+
+#: builtin/checkout-index.c:207
+msgid "copy out the files from named stage"
+msgstr ""
+
+#: builtin/checkout.c:25
+msgid "git checkout [options] <branch>"
+msgstr ""
+
+#: builtin/checkout.c:26
+msgid "git checkout [options] [<branch>] -- <file>..."
+msgstr ""
+
+#: builtin/checkout.c:114 builtin/checkout.c:147
+#, c-format
+msgid "path '%s' does not have our version"
+msgstr ""
+
+#: builtin/checkout.c:116 builtin/checkout.c:149
+#, c-format
+msgid "path '%s' does not have their version"
+msgstr ""
+
+#: builtin/checkout.c:132
+#, c-format
+msgid "path '%s' does not have all necessary versions"
+msgstr ""
+
+#: builtin/checkout.c:176
+#, c-format
+msgid "path '%s' does not have necessary versions"
+msgstr ""
+
+#: builtin/checkout.c:193
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr ""
+
+#: builtin/checkout.c:210
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr ""
+
+#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
+#: builtin/checkout.c:241
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr ""
+
+#: builtin/checkout.c:244 builtin/checkout.c:247
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr ""
+
+#: builtin/checkout.c:250
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr ""
+
+#: builtin/checkout.c:261 builtin/checkout.c:451
+msgid "corrupt index file"
+msgstr ""
+
+#: builtin/checkout.c:322 builtin/checkout.c:329
+#, c-format
+msgid "path '%s' is unmerged"
+msgstr ""
+
+#: builtin/checkout.c:473
+msgid "you need to resolve your current index first"
+msgstr ""
+
+#: builtin/checkout.c:594
+#, c-format
+msgid "Can not do reflog for '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:632
+msgid "HEAD is now at"
+msgstr ""
+
+#: builtin/checkout.c:639
+#, c-format
+msgid "Reset branch '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:642
+#, c-format
+msgid "Already on '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:646
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:648 builtin/checkout.c:1033
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:650
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr ""
+
+#: builtin/checkout.c:706
+#, c-format
+msgid " ... and %d more.\n"
+msgstr ""
+
+#. The singular version
+#: builtin/checkout.c:712
+#, c-format
+msgid ""
+"Warning: you are leaving %d commit behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgid_plural ""
+"Warning: you are leaving %d commits behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/checkout.c:730
+#, c-format
+msgid ""
+"If you want to keep them by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch new_branch_name %s\n"
+"\n"
+msgstr ""
+
+#: builtin/checkout.c:760
+msgid "internal error in revision walk"
+msgstr ""
+
+#: builtin/checkout.c:764
+msgid "Previous HEAD position was"
+msgstr ""
+
+#: builtin/checkout.c:791 builtin/checkout.c:1028
+msgid "You are on a branch yet to be born"
+msgstr ""
+
+#: builtin/checkout.c:935
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr ""
+
+#: builtin/checkout.c:974
+#, c-format
+msgid "invalid reference: %s"
+msgstr ""
+
+#. case (1): want a tree
+#: builtin/checkout.c:1003
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr ""
+
+#: builtin/checkout.c:1042
+msgid "paths cannot be used with switching branches"
+msgstr ""
+
+#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr ""
+
+#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
+#: builtin/checkout.c:1064
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr ""
+
+#: builtin/checkout.c:1069
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr ""
+
+#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/remote.c:159 builtin/remote.c:161
+msgid "branch"
+msgstr "клон"
+
+#: builtin/checkout.c:1092
+msgid "create and checkout a new branch"
+msgstr ""
+
+#: builtin/checkout.c:1094
+msgid "create/reset and checkout a branch"
+msgstr ""
+
+#: builtin/checkout.c:1095
+msgid "create reflog for new branch"
+msgstr ""
+
+#: builtin/checkout.c:1096
+msgid "detach the HEAD at named commit"
+msgstr ""
+
+#: builtin/checkout.c:1097
+msgid "set upstream info for new branch"
+msgstr ""
+
+#: builtin/checkout.c:1099
+msgid "new branch"
+msgstr ""
+
+#: builtin/checkout.c:1099
+msgid "new unparented branch"
+msgstr ""
+
+#: builtin/checkout.c:1100
+msgid "checkout our version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1102
+msgid "checkout their version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1104
+msgid "force checkout (throw away local modifications)"
+msgstr ""
+
+#: builtin/checkout.c:1105
+msgid "perform a 3-way merge with the new branch"
+msgstr ""
+
+#: builtin/checkout.c:1106 builtin/merge.c:225
+msgid "update ignored files (default)"
+msgstr ""
+
+#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+msgid "style"
+msgstr "стил"
+
+#: builtin/checkout.c:1108
+msgid "conflict style (merge or diff3)"
+msgstr ""
+
+#: builtin/checkout.c:1111
+msgid "do not limit pathspecs to sparse entries only"
+msgstr ""
+
+#: builtin/checkout.c:1113
+msgid "second guess 'git checkout no-such-branch'"
+msgstr ""
+
+#: builtin/checkout.c:1136
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr ""
+
+#: builtin/checkout.c:1153
+msgid "--track needs a branch name"
+msgstr ""
+
+#: builtin/checkout.c:1160
+msgid "Missing branch name; try -b"
+msgstr ""
+
+#: builtin/checkout.c:1197
+msgid "invalid path specification"
+msgstr ""
+
+#: builtin/checkout.c:1204
+#, c-format
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgstr ""
+
+#: builtin/checkout.c:1209
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr ""
+
+#: builtin/checkout.c:1213
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+
+#: builtin/clean.c:26
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
+
+#: builtin/clean.c:30
+#, c-format
+msgid "Removing %s\n"
+msgstr ""
+
+#: builtin/clean.c:31
+#, c-format
+msgid "Would remove %s\n"
+msgstr ""
+
+#: builtin/clean.c:32
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr ""
+
+#: builtin/clean.c:33
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr ""
+
+#: builtin/clean.c:34
+#, c-format
+msgid "failed to remove %s"
+msgstr ""
+
+#: builtin/clean.c:294
+msgid ""
+"Prompt help:\n"
+"1 - select a numbered item\n"
+"foo - select item based on unique prefix\n"
+" - (empty) select nothing"
+msgstr ""
+
+#: builtin/clean.c:298
+msgid ""
+"Prompt help:\n"
+"1 - select a single item\n"
+"3-5 - select a range of items\n"
+"2-3,6-9 - select multiple ranges\n"
+"foo - select item based on unique prefix\n"
+"-... - unselect specified items\n"
+"* - choose all items\n"
+" - (empty) finish selecting"
+msgstr ""
+
+#: builtin/clean.c:516
+#, c-format
+msgid "Huh (%s)?"
+msgstr ""
+
+#: builtin/clean.c:659
+#, c-format
+msgid "Input ignore patterns>> "
+msgstr ""
+
+#: builtin/clean.c:696
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr ""
+
+#: builtin/clean.c:717
+msgid "Select items to delete"
+msgstr ""
+
+#: builtin/clean.c:757
+#, c-format
+msgid "remove %s? "
+msgstr ""
+
+#: builtin/clean.c:782
+msgid "Bye."
+msgstr ""
+
+#: builtin/clean.c:790
+msgid ""
+"clean - start cleaning\n"
+"filter by pattern - exclude items from deletion\n"
+"select by numbers - select items to be deleted by numbers\n"
+"ask each - confirm each deletion (like \"rm -i\")\n"
+"quit - stop cleaning\n"
+"help - this screen\n"
+"? - help for prompt selection"
+msgstr ""
+
+#: builtin/clean.c:817
+msgid "*** Commands ***"
+msgstr ""
+
+#: builtin/clean.c:818
+msgid "What now"
+msgstr ""
+
+#: builtin/clean.c:826
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/clean.c:843
+msgid "No more files to clean, exiting."
+msgstr ""
+
+#: builtin/clean.c:874
+msgid "do not print names of files removed"
+msgstr ""
+
+#: builtin/clean.c:876
+msgid "force"
+msgstr ""
+
+#: builtin/clean.c:877
+msgid "interactive cleaning"
+msgstr ""
+
+#: builtin/clean.c:879
+msgid "remove whole directories"
+msgstr ""
+
+#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
+#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+msgid "pattern"
+msgstr ""
+
+#: builtin/clean.c:881
+msgid "add <pattern> to ignore rules"
+msgstr ""
+
+#: builtin/clean.c:882
+msgid "remove ignored files, too"
+msgstr ""
+
+#: builtin/clean.c:884
+msgid "remove only ignored files"
+msgstr ""
+
+#: builtin/clean.c:902
+msgid "-x and -X cannot be used together"
+msgstr ""
+
+#: builtin/clean.c:906
+msgid ""
+"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean"
+msgstr ""
+
+#: builtin/clean.c:909
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"refusing to clean"
+msgstr ""
+
+#: builtin/clone.c:36
+msgid "git clone [options] [--] <repo> [<dir>]"
+msgstr ""
+
+#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
+#: builtin/push.c:521
+msgid "force progress reporting"
+msgstr ""
+
+#: builtin/clone.c:66
+msgid "don't create a checkout"
+msgstr ""
+
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+msgid "create a bare repository"
+msgstr ""
+
+#: builtin/clone.c:71
+msgid "create a mirror repository (implies bare)"
+msgstr ""
+
+#: builtin/clone.c:73
+msgid "to clone from a local repository"
+msgstr ""
+
+#: builtin/clone.c:75
+msgid "don't use local hardlinks, always copy"
+msgstr ""
+
+#: builtin/clone.c:77
+msgid "setup as shared repository"
+msgstr ""
+
+#: builtin/clone.c:79 builtin/clone.c:81
+msgid "initialize submodules in the clone"
+msgstr ""
+
+#: builtin/clone.c:82 builtin/init-db.c:485
+msgid "template-directory"
+msgstr ""
+
+#: builtin/clone.c:83 builtin/init-db.c:486
+msgid "directory from which templates will be used"
+msgstr ""
+
+#: builtin/clone.c:85
+msgid "reference repository"
+msgstr ""
+
+#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr ""
+
+#: builtin/clone.c:87
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr ""
+
+#: builtin/clone.c:89
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr ""
+
+#: builtin/clone.c:91
+msgid "path to git-upload-pack on the remote"
+msgstr ""
+
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+msgid "depth"
+msgstr ""
+
+#: builtin/clone.c:93
+msgid "create a shallow clone of that depth"
+msgstr ""
+
+#: builtin/clone.c:95
+msgid "clone only one branch, HEAD or --branch"
+msgstr ""
+
+#: builtin/clone.c:96 builtin/init-db.c:494
+msgid "gitdir"
+msgstr ""
+
+#: builtin/clone.c:97 builtin/init-db.c:495
+msgid "separate git dir from working tree"
+msgstr ""
+
+#: builtin/clone.c:98
+msgid "key=value"
+msgstr ""
+
+#: builtin/clone.c:99
+msgid "set config inside the new repository"
+msgstr ""
+
+#: builtin/clone.c:252
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr ""
+
+#: builtin/clone.c:256
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr ""
+
+#: builtin/clone.c:259
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr ""
+
+#: builtin/clone.c:321
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr ""
+
+#: builtin/clone.c:323 builtin/diff.c:83
+#, c-format
+msgid "failed to stat '%s'"
+msgstr ""
+
+#: builtin/clone.c:325
+#, c-format
+msgid "%s exists and is not a directory"
+msgstr ""
+
+#: builtin/clone.c:339
+#, c-format
+msgid "failed to stat %s\n"
+msgstr ""
+
+#: builtin/clone.c:361
+#, c-format
+msgid "failed to create link '%s'"
+msgstr ""
+
+#: builtin/clone.c:365
+#, c-format
+msgid "failed to copy file to '%s'"
+msgstr ""
+
+#: builtin/clone.c:388 builtin/clone.c:565
+#, c-format
+msgid "done.\n"
+msgstr ""
+
+#: builtin/clone.c:401
+msgid ""
+"Clone succeeded, but checkout failed.\n"
+"You can inspect what was checked out with 'git status'\n"
+"and retry the checkout with 'git checkout -f HEAD'\n"
+msgstr ""
+
+#: builtin/clone.c:480
+#, c-format
+msgid "Could not find remote branch %s to clone."
+msgstr ""
+
+#: builtin/clone.c:560
+#, c-format
+msgid "Checking connectivity... "
+msgstr ""
+
+#: builtin/clone.c:563
+msgid "remote did not send all necessary objects"
+msgstr ""
+
+#: builtin/clone.c:626
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgstr ""
+
+#: builtin/clone.c:657
+msgid "unable to checkout working tree"
+msgstr ""
+
+#: builtin/clone.c:765
+msgid "Too many arguments."
+msgstr ""
+
+#: builtin/clone.c:769
+msgid "You must specify a repository to clone."
+msgstr ""
+
+#: builtin/clone.c:780
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
+msgstr ""
+
+#: builtin/clone.c:783
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr ""
+
+#: builtin/clone.c:796
+#, c-format
+msgid "repository '%s' does not exist"
+msgstr ""
+
+#: builtin/clone.c:802
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr ""
+
+#: builtin/clone.c:805
+msgid "source repository is shallow, ignoring --local"
+msgstr ""
+
+#: builtin/clone.c:810
+msgid "--local is ignored"
+msgstr ""
+
+#: builtin/clone.c:814 builtin/fetch.c:1119
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr ""
+
+#: builtin/clone.c:824
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr ""
+
+#: builtin/clone.c:834
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr ""
+
+#: builtin/clone.c:847 builtin/clone.c:859
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr ""
+
+#: builtin/clone.c:850
+#, c-format
+msgid "could not create work tree dir '%s'."
+msgstr ""
+
+#: builtin/clone.c:869
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr ""
+
+#: builtin/clone.c:871
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr ""
+
+#: builtin/clone.c:906
+#, c-format
+msgid "Don't know how to clone %s"
+msgstr ""
+
+#: builtin/clone.c:957 builtin/clone.c:965
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr ""
+
+#: builtin/clone.c:968
+msgid "You appear to have cloned an empty repository."
+msgstr ""
+
+#: builtin/column.c:9
+msgid "git column [options]"
+msgstr ""
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr ""
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr ""
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr ""
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr ""
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr ""
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr ""
+
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr ""
+
+#: builtin/commit.c:36
+msgid "git commit [options] [--] <pathspec>..."
+msgstr ""
+
+#: builtin/commit.c:41
+msgid "git status [options] [--] <pathspec>..."
+msgstr ""
+
+#: builtin/commit.c:46
+msgid ""
+"Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly:\n"
+"\n"
+" git config --global user.name \"Your Name\"\n"
+" git config --global user.email you@example.com\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+" git commit --amend --reset-author\n"
+msgstr ""
+
+#: builtin/commit.c:58
+msgid ""
+"You asked to amend the most recent commit, but doing so would make\n"
+"it empty. You can repeat your command with --allow-empty, or you can\n"
+"remove the commit entirely with \"git reset HEAD^\".\n"
+msgstr ""
+
+#: builtin/commit.c:63
+msgid ""
+"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
+"If you wish to commit it anyway, use:\n"
+"\n"
+" git commit --allow-empty\n"
+"\n"
+msgstr ""
+
+#: builtin/commit.c:70
+msgid "Otherwise, please use 'git reset'\n"
+msgstr ""
+
+#: builtin/commit.c:73
+msgid ""
+"If you wish to skip this commit, use:\n"
+"\n"
+" git reset\n"
+"\n"
+"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
+"the remaining commits.\n"
+msgstr ""
+
+#: builtin/commit.c:287
+msgid "failed to unpack HEAD tree object"
+msgstr ""
+
+#: builtin/commit.c:329
+msgid "unable to create temporary index"
+msgstr ""
+
+#: builtin/commit.c:335
+msgid "interactive add failed"
+msgstr ""
+
+#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+msgid "unable to write new_index file"
+msgstr ""
+
+#: builtin/commit.c:420
+msgid "cannot do a partial commit during a merge."
+msgstr ""
+
+#: builtin/commit.c:422
+msgid "cannot do a partial commit during a cherry-pick."
+msgstr ""
+
+#: builtin/commit.c:432
+msgid "cannot read the index"
+msgstr ""
+
+#: builtin/commit.c:452
+msgid "unable to write temporary index file"
+msgstr ""
+
+#: builtin/commit.c:543 builtin/commit.c:549
+#, c-format
+msgid "invalid commit: %s"
+msgstr ""
+
+#: builtin/commit.c:571
+msgid "malformed --author parameter"
+msgstr ""
+
+#: builtin/commit.c:591
+#, c-format
+msgid "Malformed ident string: '%s'"
+msgstr ""
+
+#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#, c-format
+msgid "could not lookup commit %s"
+msgstr ""
+
+#: builtin/commit.c:642 builtin/shortlog.c:273
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr ""
+
+#: builtin/commit.c:644
+msgid "could not read log from standard input"
+msgstr ""
+
+#: builtin/commit.c:648
+#, c-format
+msgid "could not read log file '%s'"
+msgstr ""
+
+#: builtin/commit.c:654
+msgid "commit has empty message"
+msgstr ""
+
+#: builtin/commit.c:670
+msgid "could not read MERGE_MSG"
+msgstr ""
+
+#: builtin/commit.c:674
+msgid "could not read SQUASH_MSG"
+msgstr ""
+
+#: builtin/commit.c:678
+#, c-format
+msgid "could not read '%s'"
+msgstr ""
+
+#: builtin/commit.c:749
+msgid "could not write commit template"
+msgstr ""
+
+# FIXME
+#: builtin/commit.c:760
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a merge.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+
+# FIXME
+#: builtin/commit.c:765
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a cherry-pick.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+
+#: builtin/commit.c:777
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be ignored, and an empty message aborts the commit.\n"
+msgstr ""
+
+#: builtin/commit.c:782
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be kept; you may remove them yourself if you want to.\n"
+"An empty message aborts the commit.\n"
+msgstr ""
+
+#: builtin/commit.c:795
+#, c-format
+msgid "%sAuthor: %s"
+msgstr ""
+
+#: builtin/commit.c:802
+#, c-format
+msgid "%sCommitter: %s"
+msgstr ""
+
+#: builtin/commit.c:822
+msgid "Cannot read index"
+msgstr ""
+
+#: builtin/commit.c:865
+msgid "Error building trees"
+msgstr ""
+
+#: builtin/commit.c:880 builtin/tag.c:359
+#, c-format
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr ""
+
+#: builtin/commit.c:982
+#, c-format
+msgid "No existing author found with '%s'"
+msgstr ""
+
+#: builtin/commit.c:997 builtin/commit.c:1237
+#, c-format
+msgid "Invalid untracked files mode '%s'"
+msgstr ""
+
+#: builtin/commit.c:1034
+msgid "--long and -z are incompatible"
+msgstr ""
+
+#: builtin/commit.c:1064
+msgid "Using both --reset-author and --author does not make sense"
+msgstr ""
+
+#: builtin/commit.c:1075
+msgid "You have nothing to amend."
+msgstr ""
+
+#: builtin/commit.c:1078
+msgid "You are in the middle of a merge -- cannot amend."
+msgstr ""
+
+#: builtin/commit.c:1080
+msgid "You are in the middle of a cherry-pick -- cannot amend."
+msgstr ""
+
+#: builtin/commit.c:1083
+msgid "Options --squash and --fixup cannot be used together"
+msgstr ""
+
+#: builtin/commit.c:1093
+msgid "Only one of -c/-C/-F/--fixup can be used."
+msgstr ""
+
+#: builtin/commit.c:1095
+msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+msgstr ""
+
+#: builtin/commit.c:1103
+msgid "--reset-author can be used only with -C, -c or --amend."
+msgstr ""
+
+#: builtin/commit.c:1120
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
+msgstr ""
+
+#: builtin/commit.c:1122
+msgid "No paths with --include/--only does not make sense."
+msgstr ""
+
+#: builtin/commit.c:1124
+msgid "Clever... amending the last one with dirty index."
+msgstr ""
+
+#: builtin/commit.c:1126
+msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+msgstr ""
+
+#: builtin/commit.c:1136 builtin/tag.c:572
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr ""
+
+#: builtin/commit.c:1141
+msgid "Paths with -a does not make sense."
+msgstr ""
+
+#: builtin/commit.c:1251 builtin/commit.c:1482
+msgid "show status concisely"
+msgstr ""
+
+#: builtin/commit.c:1253 builtin/commit.c:1484
+msgid "show branch information"
+msgstr ""
+
+#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+msgid "machine-readable output"
+msgstr ""
+
+#: builtin/commit.c:1258 builtin/commit.c:1488
+msgid "show status in long format (default)"
+msgstr ""
+
+#: builtin/commit.c:1261 builtin/commit.c:1491
+msgid "terminate entries with NUL"
+msgstr ""
+
+#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:459
+msgid "mode"
+msgstr ""
+
+#: builtin/commit.c:1264 builtin/commit.c:1494
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1267
+msgid "show ignored files"
+msgstr ""
+
+#: builtin/commit.c:1268 parse-options.h:156
+msgid "when"
+msgstr "кога"
+
+#: builtin/commit.c:1269
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1271
+msgid "list untracked files in columns"
+msgstr ""
+
+#: builtin/commit.c:1340
+msgid "couldn't look up newly created commit"
+msgstr ""
+
+#: builtin/commit.c:1342
+msgid "could not parse newly created commit"
+msgstr ""
+
+#: builtin/commit.c:1383
+msgid "detached HEAD"
+msgstr ""
+
+#: builtin/commit.c:1385
+msgid " (root-commit)"
+msgstr ""
+
+#: builtin/commit.c:1452
+msgid "suppress summary after successful commit"
+msgstr ""
+
+#: builtin/commit.c:1453
+msgid "show diff in commit message template"
+msgstr ""
+
+#: builtin/commit.c:1455
+msgid "Commit message options"
+msgstr ""
+
+#: builtin/commit.c:1456 builtin/tag.c:457
+msgid "read message from file"
+msgstr ""
+
+#: builtin/commit.c:1457
+msgid "author"
+msgstr ""
+
+#: builtin/commit.c:1457
+msgid "override author for commit"
+msgstr ""
+
+#: builtin/commit.c:1458 builtin/gc.c:261
+msgid "date"
+msgstr "дата"
+
+#: builtin/commit.c:1458
+msgid "override date for commit"
+msgstr ""
+
+#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
+#: builtin/notes.c:562 builtin/tag.c:455
+msgid "message"
+msgstr ""
+
+#: builtin/commit.c:1459
+msgid "commit message"
+msgstr ""
+
+#: builtin/commit.c:1460
+msgid "reuse and edit message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1461
+msgid "reuse message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1462
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+
+#: builtin/commit.c:1463
+msgid "use autosquash formatted message to squash specified commit"
+msgstr ""
+
+#: builtin/commit.c:1464
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr ""
+
+#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr ""
+
+#: builtin/commit.c:1466
+msgid "use specified template file"
+msgstr ""
+
+#: builtin/commit.c:1467
+msgid "force edit of commit"
+msgstr ""
+
+#: builtin/commit.c:1468
+msgid "default"
+msgstr ""
+
+#: builtin/commit.c:1468 builtin/tag.c:460
+msgid "how to strip spaces and #comments from message"
+msgstr ""
+
+#: builtin/commit.c:1469
+msgid "include status in commit message template"
+msgstr ""
+
+#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
+msgid "key id"
+msgstr ""
+
+#: builtin/commit.c:1471 builtin/merge.c:224
+msgid "GPG sign commit"
+msgstr ""
+
+#. end commit message options
+#: builtin/commit.c:1474
+msgid "Commit contents options"
+msgstr ""
+
+#: builtin/commit.c:1475
+msgid "commit all changed files"
+msgstr ""
+
+#: builtin/commit.c:1476
+msgid "add specified files to index for commit"
+msgstr ""
+
+#: builtin/commit.c:1477
+msgid "interactively add files"
+msgstr ""
+
+#: builtin/commit.c:1478
+msgid "interactively add changes"
+msgstr ""
+
+#: builtin/commit.c:1479
+msgid "commit only specified files"
+msgstr ""
+
+#: builtin/commit.c:1480
+msgid "bypass pre-commit hook"
+msgstr ""
+
+#: builtin/commit.c:1481
+msgid "show what would be committed"
+msgstr ""
+
+#: builtin/commit.c:1492
+msgid "amend previous commit"
+msgstr ""
+
+#: builtin/commit.c:1493
+msgid "bypass post-rewrite hook"
+msgstr ""
+
+#: builtin/commit.c:1498
+msgid "ok to record an empty change"
+msgstr ""
+
+#: builtin/commit.c:1500
+msgid "ok to record a change with an empty message"
+msgstr ""
+
+#: builtin/commit.c:1529
+msgid "could not parse HEAD commit"
+msgstr ""
+
+#: builtin/commit.c:1567 builtin/merge.c:518
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr ""
+
+#: builtin/commit.c:1574
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr ""
+
+#: builtin/commit.c:1581
+msgid "could not read MERGE_MODE"
+msgstr ""
+
+#: builtin/commit.c:1600
+#, c-format
+msgid "could not read commit message: %s"
+msgstr ""
+
+#: builtin/commit.c:1611
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
+msgstr ""
+
+#: builtin/commit.c:1616
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
+msgstr ""
+
+#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+msgid "failed to write commit object"
+msgstr ""
+
+#: builtin/commit.c:1652
+msgid "cannot lock HEAD ref"
+msgstr ""
+
+#: builtin/commit.c:1656
+msgid "cannot update HEAD ref"
+msgstr ""
+
+#: builtin/commit.c:1667
+msgid ""
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full or quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
+msgstr ""
+
+#: builtin/config.c:8
+msgid "git config [options]"
+msgstr ""
+
+#: builtin/config.c:54
+msgid "Config file location"
+msgstr ""
+
+#: builtin/config.c:55
+msgid "use global config file"
+msgstr ""
+
+#: builtin/config.c:56
+msgid "use system config file"
+msgstr ""
+
+#: builtin/config.c:57
+msgid "use repository config file"
+msgstr ""
+
+#: builtin/config.c:58
+msgid "use given config file"
+msgstr ""
+
+#: builtin/config.c:59
+msgid "blob-id"
+msgstr ""
+
+#: builtin/config.c:59
+msgid "read config from given blob object"
+msgstr ""
+
+#: builtin/config.c:60
+msgid "Action"
+msgstr ""
+
+#: builtin/config.c:61
+msgid "get value: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:62
+msgid "get all values: key [value-regex]"
+msgstr ""
+
+#: builtin/config.c:63
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr ""
+
+#: builtin/config.c:64
+msgid "get value specific for the URL: section[.var] URL"
+msgstr ""
+
+#: builtin/config.c:65
+msgid "replace all matching variables: name value [value_regex]"
+msgstr ""
+
+#: builtin/config.c:66
+msgid "add a new variable: name value"
+msgstr ""
+
+#: builtin/config.c:67
+msgid "remove a variable: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:68
+msgid "remove all matches: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:69
+msgid "rename section: old-name new-name"
+msgstr ""
+
+#: builtin/config.c:70
+msgid "remove a section: name"
+msgstr ""
+
+#: builtin/config.c:71
+msgid "list all"
+msgstr ""
+
+#: builtin/config.c:72
+msgid "open an editor"
+msgstr ""
+
+#: builtin/config.c:73 builtin/config.c:74
+msgid "slot"
+msgstr ""
+
+#: builtin/config.c:73
+msgid "find the color configured: [default]"
+msgstr ""
+
+#: builtin/config.c:74
+msgid "find the color setting: [stdout-is-tty]"
+msgstr ""
+
+#: builtin/config.c:75
+msgid "Type"
+msgstr ""
+
+#: builtin/config.c:76
+msgid "value is \"true\" or \"false\""
+msgstr ""
+
+#: builtin/config.c:77
+msgid "value is decimal number"
+msgstr ""
+
+#: builtin/config.c:78
+msgid "value is --bool or --int"
+msgstr ""
+
+#: builtin/config.c:79
+msgid "value is a path (file or directory name)"
+msgstr ""
+
+#: builtin/config.c:80
+msgid "Other"
+msgstr ""
+
+#: builtin/config.c:81
+msgid "terminate values with NUL byte"
+msgstr ""
+
+#: builtin/config.c:82
+msgid "respect include directives on lookup"
+msgstr ""
+
+#: builtin/count-objects.c:82
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr ""
+
+#: builtin/count-objects.c:97
+msgid "print sizes in human readable format"
+msgstr ""
+
+#: builtin/describe.c:16
+msgid "git describe [options] <commit-ish>*"
+msgstr ""
+
+#: builtin/describe.c:17
+msgid "git describe [options] --dirty"
+msgstr ""
+
+#: builtin/describe.c:237
+#, c-format
+msgid "annotated tag %s not available"
+msgstr ""
+
+#: builtin/describe.c:241
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr ""
+
+#: builtin/describe.c:243
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr ""
+
+#: builtin/describe.c:270
+#, c-format
+msgid "Not a valid object name %s"
+msgstr ""
+
+#: builtin/describe.c:273
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr ""
+
+#: builtin/describe.c:290
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr ""
+
+#: builtin/describe.c:292
+#, c-format
+msgid "searching to describe %s\n"
+msgstr ""
+
+#: builtin/describe.c:332
+#, c-format
+msgid "finished search at %s\n"
+msgstr ""
+
+#: builtin/describe.c:359
+#, c-format
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+msgstr ""
+
+#: builtin/describe.c:363
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+msgstr ""
+
+#: builtin/describe.c:384
+#, c-format
+msgid "traversed %lu commits\n"
+msgstr ""
+
+#: builtin/describe.c:387
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+msgstr ""
+
+#: builtin/describe.c:409
+msgid "find the tag that comes after the commit"
+msgstr ""
+
+#: builtin/describe.c:410
+msgid "debug search strategy on stderr"
+msgstr ""
+
+#: builtin/describe.c:411
+msgid "use any ref"
+msgstr ""
+
+#: builtin/describe.c:412
+msgid "use any tag, even unannotated"
+msgstr ""
+
+#: builtin/describe.c:413
+msgid "always use long format"
+msgstr ""
+
+#: builtin/describe.c:414
+msgid "only follow first parent"
+msgstr ""
+
+#: builtin/describe.c:417
+msgid "only output exact matches"
+msgstr ""
+
+#: builtin/describe.c:419
+#, fuzzy
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "<брой>"
+
+#: builtin/describe.c:421
+msgid "only consider tags matching <pattern>"
+msgstr ""
+
+#: builtin/describe.c:423 builtin/name-rev.c:321
+msgid "show abbreviated commit object as fallback"
+msgstr ""
+
+#: builtin/describe.c:424
+msgid "mark"
+msgstr ""
+
+#: builtin/describe.c:425
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr ""
+
+#: builtin/describe.c:443
+msgid "--long is incompatible with --abbrev=0"
+msgstr ""
+
+#: builtin/describe.c:469
+msgid "No names found, cannot describe anything."
+msgstr ""
+
+#: builtin/describe.c:489
+msgid "--dirty is incompatible with commit-ishes"
+msgstr ""
+
+#: builtin/diff.c:85
+#, c-format
+msgid "'%s': not a regular file or symlink"
+msgstr ""
+
+#: builtin/diff.c:236
+#, c-format
+msgid "invalid option: %s"
+msgstr ""
+
+#: builtin/diff.c:357
+msgid "Not a git repository"
+msgstr ""
+
+#: builtin/diff.c:400
+#, c-format
+msgid "invalid object '%s' given."
+msgstr ""
+
+#: builtin/diff.c:409
+#, c-format
+msgid "more than two blobs given: '%s'"
+msgstr ""
+
+#: builtin/diff.c:416
+#, c-format
+msgid "unhandled object '%s' given."
+msgstr ""
+
+#: builtin/fast-export.c:22
+msgid "git fast-export [rev-list-opts]"
+msgstr ""
+
+#: builtin/fast-export.c:673
+#, fuzzy
+msgid "show progress after <n> objects"
+msgstr "<брой>"
+
+#: builtin/fast-export.c:675
+msgid "select handling of signed tags"
+msgstr ""
+
+#: builtin/fast-export.c:678
+msgid "select handling of tags that tag filtered objects"
+msgstr ""
+
+#: builtin/fast-export.c:681
+msgid "Dump marks to this file"
+msgstr ""
+
+#: builtin/fast-export.c:683
+msgid "Import marks from this file"
+msgstr ""
+
+#: builtin/fast-export.c:685
+msgid "Fake a tagger when tags lack one"
+msgstr ""
+
+#: builtin/fast-export.c:687
+msgid "Output full tree for each commit"
+msgstr ""
+
+#: builtin/fast-export.c:689
+msgid "Use the done feature to terminate the stream"
+msgstr ""
+
+#: builtin/fast-export.c:690
+msgid "Skip output of blob data"
+msgstr ""
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr ""
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr ""
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr ""
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr ""
+
+#: builtin/fetch.c:75
+msgid "fetch from all remotes"
+msgstr ""
+
+#: builtin/fetch.c:77
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr ""
+
+#: builtin/fetch.c:79
+msgid "path to upload pack on remote end"
+msgstr ""
+
+#: builtin/fetch.c:80
+msgid "force overwrite of local branch"
+msgstr ""
+
+#: builtin/fetch.c:82
+msgid "fetch from multiple remotes"
+msgstr ""
+
+#: builtin/fetch.c:84
+msgid "fetch all tags and associated objects"
+msgstr ""
+
+#: builtin/fetch.c:86
+msgid "do not fetch all tags (--no-tags)"
+msgstr ""
+
+#: builtin/fetch.c:88
+msgid "prune remote-tracking branches no longer on remote"
+msgstr ""
+
+#: builtin/fetch.c:89
+msgid "on-demand"
+msgstr ""
+
+#: builtin/fetch.c:90
+msgid "control recursive fetching of submodules"
+msgstr ""
+
+#: builtin/fetch.c:94
+msgid "keep downloaded pack"
+msgstr ""
+
+#: builtin/fetch.c:96
+msgid "allow updating of HEAD ref"
+msgstr ""
+
+#: builtin/fetch.c:99
+msgid "deepen history of shallow clone"
+msgstr ""
+
+#: builtin/fetch.c:101
+msgid "convert to a complete repository"
+msgstr ""
+
+#: builtin/fetch.c:103 builtin/log.c:1197
+msgid "dir"
+msgstr ""
+
+#: builtin/fetch.c:104
+msgid "prepend this to submodule path output"
+msgstr ""
+
+#: builtin/fetch.c:107
+msgid "default mode for recursion"
+msgstr ""
+
+#: builtin/fetch.c:109
+msgid "accept refs that update .git/shallow"
+msgstr ""
+
+#: builtin/fetch.c:347
+msgid "Couldn't find remote ref HEAD"
+msgstr ""
+
+#: builtin/fetch.c:411
+#, c-format
+msgid "object %s not found"
+msgstr ""
+
+#: builtin/fetch.c:416
+msgid "[up to date]"
+msgstr ""
+
+#: builtin/fetch.c:430
+#, c-format
+msgid "! %-*s %-*s -> %s (can't fetch in current branch)"
+msgstr ""
+
+#: builtin/fetch.c:431 builtin/fetch.c:517
+msgid "[rejected]"
+msgstr ""
+
+#: builtin/fetch.c:442
+msgid "[tag update]"
+msgstr ""
+
+#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
+msgid " (unable to update local ref)"
+msgstr ""
+
+#: builtin/fetch.c:462
+msgid "[new tag]"
+msgstr ""
+
+#: builtin/fetch.c:465
+msgid "[new branch]"
+msgstr ""
+
+#: builtin/fetch.c:468
+msgid "[new ref]"
+msgstr ""
+
+#: builtin/fetch.c:513
+msgid "unable to update local ref"
+msgstr ""
+
+#: builtin/fetch.c:513
+msgid "forced update"
+msgstr ""
+
+#: builtin/fetch.c:519
+msgid "(non-fast-forward)"
+msgstr ""
+
+#: builtin/fetch.c:552 builtin/fetch.c:785
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr ""
+
+#: builtin/fetch.c:561
+#, c-format
+msgid "%s did not send all necessary objects\n"
+msgstr ""
+
+#: builtin/fetch.c:579
+#, c-format
+msgid "reject %s because shallow roots are not allowed to be updated"
+msgstr ""
+
+#: builtin/fetch.c:667 builtin/fetch.c:750
+#, c-format
+msgid "From %.*s\n"
+msgstr ""
+
+#: builtin/fetch.c:678
+#, c-format
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
+msgstr ""
+
+#: builtin/fetch.c:730
+#, c-format
+msgid " (%s will become dangling)"
+msgstr ""
+
+#: builtin/fetch.c:731
+#, c-format
+msgid " (%s has become dangling)"
+msgstr ""
+
+#: builtin/fetch.c:755
+msgid "[deleted]"
+msgstr ""
+
+#: builtin/fetch.c:756 builtin/remote.c:1050
+msgid "(none)"
+msgstr "(нищо)"
+
+#: builtin/fetch.c:775
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgstr ""
+
+#: builtin/fetch.c:794
+#, c-format
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
+msgstr ""
+
+#: builtin/fetch.c:797
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr ""
+
+#: builtin/fetch.c:853
+#, c-format
+msgid "Don't know how to fetch from %s"
+msgstr ""
+
+#: builtin/fetch.c:1015
+#, c-format
+msgid "Fetching %s\n"
+msgstr ""
+
+#: builtin/fetch.c:1017 builtin/remote.c:90
+#, c-format
+msgid "Could not fetch %s"
+msgstr "„%s“ не може да се достави"
+
+#: builtin/fetch.c:1036
+msgid ""
+"No remote repository specified. Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
+msgstr ""
+
+#: builtin/fetch.c:1059
+msgid "You need to specify a tag name."
+msgstr ""
+
+#: builtin/fetch.c:1107
+msgid "--depth and --unshallow cannot be used together"
+msgstr ""
+
+#: builtin/fetch.c:1109
+msgid "--unshallow on a complete repository does not make sense"
+msgstr ""
+
+#: builtin/fetch.c:1132
+msgid "fetch --all does not take a repository argument"
+msgstr ""
+
+#: builtin/fetch.c:1134
+msgid "fetch --all does not make sense with refspecs"
+msgstr ""
+
+#: builtin/fetch.c:1145
+#, c-format
+msgid "No such remote or remote group: %s"
+msgstr ""
+
+#: builtin/fetch.c:1153
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:13
+#, fuzzy
+msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
+msgstr "<брой>"
+
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
+#: builtin/merge.c:196 builtin/show-branch.c:654 builtin/show-ref.c:178
+#: builtin/tag.c:446 parse-options.h:135 parse-options.h:242
+msgid "n"
+msgstr "брой"
+
+#: builtin/fmt-merge-msg.c:664
+#, fuzzy
+msgid "populate log with at most <n> entries from shortlog"
+msgstr "<брой>"
+
+#: builtin/fmt-merge-msg.c:667
+msgid "alias for --log (deprecated)"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:670
+msgid "text"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:671
+msgid "use <text> as start of message"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:672
+msgid "file to read from"
+msgstr ""
+
+#: builtin/for-each-ref.c:1063
+msgid "git for-each-ref [options] [<pattern>]"
+msgstr ""
+
+#: builtin/for-each-ref.c:1078
+msgid "quote placeholders suitably for shells"
+msgstr ""
+
+#: builtin/for-each-ref.c:1080
+msgid "quote placeholders suitably for perl"
+msgstr ""
+
+#: builtin/for-each-ref.c:1082
+msgid "quote placeholders suitably for python"
+msgstr ""
+
+#: builtin/for-each-ref.c:1084
+msgid "quote placeholders suitably for tcl"
+msgstr ""
+
+#: builtin/for-each-ref.c:1087
+#, fuzzy
+msgid "show only <n> matched refs"
+msgstr "<брой>"
+
+#: builtin/for-each-ref.c:1088 builtin/replace.c:177
+msgid "format"
+msgstr ""
+
+#: builtin/for-each-ref.c:1088
+msgid "format to use for the output"
+msgstr ""
+
+#: builtin/for-each-ref.c:1089
+msgid "key"
+msgstr ""
+
+#: builtin/for-each-ref.c:1090
+msgid "field name to sort on"
+msgstr ""
+
+#: builtin/fsck.c:607
+msgid "git fsck [options] [<object>...]"
+msgstr "git fsck [ОПЦИИ] [<ОБЕКТ>…]"
+
+#: builtin/fsck.c:613
+msgid "show unreachable objects"
+msgstr "показване на недостижимите обекти"
+
+#: builtin/fsck.c:614
+msgid "show dangling objects"
+msgstr "показване на обектите извън клоните"
+
+#: builtin/fsck.c:615
+msgid "report tags"
+msgstr "показване на етикетите"
+
+#: builtin/fsck.c:616
+msgid "report root nodes"
+msgstr "показване на кореновите възли"
+
+#: builtin/fsck.c:617
+msgid "make index objects head nodes"
+msgstr "задаване на обекти от индекса да са коренови"
+
+#: builtin/fsck.c:618
+#, fuzzy
+msgid "make reflogs head nodes (default)"
+msgstr "проследяване на указателите от журнала като глави (стандартно)"
+
+#: builtin/fsck.c:619
+#, fuzzy
+msgid "also consider packs and alternate objects"
+msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
+
+#: builtin/fsck.c:620
+msgid "enable more strict checking"
+msgstr "по-строги проверки"
+
+#: builtin/fsck.c:622
+msgid "write dangling objects in .git/lost-found"
+msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“"
+
+#: builtin/fsck.c:623 builtin/prune.c:144
+msgid "show progress"
+msgstr "показване на напредъка"
+
+#: builtin/gc.c:24
+msgid "git gc [options]"
+msgstr "git gc [ОПЦИИ]"
+
+#: builtin/gc.c:80
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "Неправилна стойност за „%s“: „%s“"
+
+#: builtin/gc.c:107
+#, c-format
+msgid "insanely long object directory %.*s"
+msgstr "прекалено дълга директория с обекти „%.*s“"
+
+#: builtin/gc.c:262
+msgid "prune unreferenced objects"
+msgstr "окастряне на обектите, към които нищо не сочи"
+
+#: builtin/gc.c:264
+msgid "be more thorough (increased runtime)"
+msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
+
+#: builtin/gc.c:265
+msgid "enable auto-gc mode"
+msgstr "включване на автоматичното събиране на боклука (auto-gc)"
+
+#: builtin/gc.c:266
+msgid "force running gc even if there may be another gc running"
+msgstr ""
+"изрично стартиране на събирането на боклука, дори и ако вече работи друго "
+"събиране"
+
+#: builtin/gc.c:306
+#, c-format
+msgid ""
+"Auto packing the repository for optimum performance. You may also\n"
+"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+msgstr ""
+"Автоматично пакетиране на хранилището за най-добра производителност. Можете "
+"и\n"
+"ръчно да стартирате „git gc“. За подробности погледнете помощта: „git help "
+"gc“.\n"
+
+#. be quiet on --auto
+#: builtin/gc.c:316
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+msgstr ""
+"събирането на боклука вече е стартирано на машината „%s“ с идентификатор на\n"
+"процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
+"опцията „--force“)"
+
+#: builtin/gc.c:341
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr ""
+"Има прекалено много недостижими, непакетирани обекти. Използвайте „git "
+"prune“, за да\n"
+"ги окастрите."
+
+#: builtin/grep.c:23
+msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr ""
+
+#: builtin/grep.c:218
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr ""
+
+#: builtin/grep.c:365
+#, c-format
+msgid "Failed to chdir: %s"
+msgstr ""
+
+#: builtin/grep.c:443 builtin/grep.c:478
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr ""
+
+#: builtin/grep.c:493
+#, c-format
+msgid "unable to grep from object of type %s"
+msgstr ""
+
+#: builtin/grep.c:551
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr ""
+
+#: builtin/grep.c:568
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: builtin/grep.c:642
+msgid "search in index instead of in the work tree"
+msgstr ""
+
+#: builtin/grep.c:644
+msgid "find in contents not managed by git"
+msgstr ""
+
+#: builtin/grep.c:646
+msgid "search in both tracked and untracked files"
+msgstr ""
+
+#: builtin/grep.c:648
+msgid "search also in ignored files"
+msgstr ""
+
+#: builtin/grep.c:651
+msgid "show non-matching lines"
+msgstr ""
+
+#: builtin/grep.c:653
+msgid "case insensitive matching"
+msgstr ""
+
+#: builtin/grep.c:655
+msgid "match patterns only at word boundaries"
+msgstr ""
+
+#: builtin/grep.c:657
+msgid "process binary files as text"
+msgstr ""
+
+#: builtin/grep.c:659
+msgid "don't match patterns in binary files"
+msgstr ""
+
+#: builtin/grep.c:662
+msgid "process binary files with textconv filters"
+msgstr ""
+
+#: builtin/grep.c:664
+msgid "descend at most <depth> levels"
+msgstr ""
+
+#: builtin/grep.c:668
+msgid "use extended POSIX regular expressions"
+msgstr ""
+
+#: builtin/grep.c:671
+msgid "use basic POSIX regular expressions (default)"
+msgstr ""
+
+#: builtin/grep.c:674
+msgid "interpret patterns as fixed strings"
+msgstr ""
+
+#: builtin/grep.c:677
+msgid "use Perl-compatible regular expressions"
+msgstr ""
+
+#: builtin/grep.c:680
+msgid "show line numbers"
+msgstr ""
+
+#: builtin/grep.c:681
+msgid "don't show filenames"
+msgstr ""
+
+#: builtin/grep.c:682
+msgid "show filenames"
+msgstr ""
+
+#: builtin/grep.c:684
+msgid "show filenames relative to top directory"
+msgstr ""
+
+#: builtin/grep.c:686
+msgid "show only filenames instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:688
+msgid "synonym for --files-with-matches"
+msgstr ""
+
+#: builtin/grep.c:691
+msgid "show only the names of files without match"
+msgstr ""
+
+#: builtin/grep.c:693
+msgid "print NUL after filenames"
+msgstr ""
+
+#: builtin/grep.c:695
+msgid "show the number of matches instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:696
+msgid "highlight matches"
+msgstr ""
+
+#: builtin/grep.c:698
+msgid "print empty line between matches from different files"
+msgstr ""
+
+#: builtin/grep.c:700
+msgid "show filename only once above matches from same file"
+msgstr ""
+
+#: builtin/grep.c:703
+#, fuzzy
+msgid "show <n> context lines before and after matches"
+msgstr "<брой>"
+
+#: builtin/grep.c:706
+#, fuzzy
+msgid "show <n> context lines before matches"
+msgstr "<брой>"
+
+#: builtin/grep.c:708
+#, fuzzy
+msgid "show <n> context lines after matches"
+msgstr "<брой>"
+
+#: builtin/grep.c:709
+msgid "shortcut for -C NUM"
+msgstr ""
+
+#: builtin/grep.c:712
+msgid "show a line with the function name before matches"
+msgstr ""
+
+#: builtin/grep.c:714
+msgid "show the surrounding function"
+msgstr ""
+
+#: builtin/grep.c:717
+msgid "read patterns from file"
+msgstr ""
+
+#: builtin/grep.c:719
+msgid "match <pattern>"
+msgstr ""
+
+#: builtin/grep.c:721
+msgid "combine patterns specified with -e"
+msgstr ""
+
+#: builtin/grep.c:733
+msgid "indicate hit with exit status without output"
+msgstr ""
+
+#: builtin/grep.c:735
+msgid "show only matches from files that match all patterns"
+msgstr ""
+
+#: builtin/grep.c:737
+msgid "show parse tree for grep expression"
+msgstr ""
+
+#: builtin/grep.c:741
+msgid "pager"
+msgstr ""
+
+#: builtin/grep.c:741
+msgid "show matching files in the pager"
+msgstr ""
+
+#: builtin/grep.c:744
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr ""
+
+#: builtin/grep.c:745 builtin/show-ref.c:187
+msgid "show usage"
+msgstr ""
+
+#: builtin/grep.c:812
+msgid "no pattern given."
+msgstr ""
+
+#: builtin/grep.c:870
+msgid "--open-files-in-pager only works on the worktree"
+msgstr ""
+
+#: builtin/grep.c:893
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr ""
+
+#: builtin/grep.c:898
+msgid "--no-index or --untracked cannot be used with revs."
+msgstr ""
+
+#: builtin/grep.c:901
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
+msgstr ""
+
+#: builtin/grep.c:909
+msgid "both --cached and trees are given."
+msgstr ""
+
+#: builtin/hash-object.c:60
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
+"<file>..."
+msgstr ""
+
+#: builtin/hash-object.c:61
+msgid "git hash-object --stdin-paths < <list-of-paths>"
+msgstr ""
+
+#: builtin/hash-object.c:72
+msgid "type"
+msgstr ""
+
+#: builtin/hash-object.c:72
+msgid "object type"
+msgstr ""
+
+#: builtin/hash-object.c:73
+msgid "write the object into the object database"
+msgstr ""
+
+#: builtin/hash-object.c:74
+msgid "read the object from stdin"
+msgstr ""
+
+#: builtin/hash-object.c:76
+msgid "store file as is without filters"
+msgstr ""
+
+#: builtin/hash-object.c:77
+msgid "process file as it were from this path"
+msgstr ""
+
+#: builtin/help.c:41
+msgid "print all available commands"
+msgstr "показване на всички налични команди"
+
+#: builtin/help.c:42
+msgid "print list of useful guides"
+msgstr "показване на списък с пътеводители"
+
+#: builtin/help.c:43
+msgid "show man page"
+msgstr "показване на страница от ръководството"
+
+#: builtin/help.c:44
+msgid "show manual in web browser"
+msgstr "показване на страница от ръководството в уеб браузър"
+
+#: builtin/help.c:46
+msgid "show info page"
+msgstr "показване на информационна страница"
+
+#: builtin/help.c:52
+msgid "git help [--all] [--guides] [--man|--web|--info] [command]"
+msgstr "git help [--all] [--guides] [--man|--web|--info] [КОМАНДА]"
+
+#: builtin/help.c:64
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "непознат формат на помощта „%s“"
+
+#: builtin/help.c:92
+msgid "Failed to start emacsclient."
+msgstr "Неуспешно стартиране на „emacsclient“."
+
+#: builtin/help.c:105
+msgid "Failed to parse emacsclient version."
+msgstr "Версията на „emacsclient“ не може да се анализира."
+
+#: builtin/help.c:113
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)."
+
+#: builtin/help.c:131 builtin/help.c:159 builtin/help.c:168 builtin/help.c:176
+#, c-format
+msgid "failed to exec '%s': %s"
+msgstr "неуспешно изпълнение на „%s“: %s"
+
+#: builtin/help.c:216
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
+msgstr ""
+"„%s“: път към неподдържана програма за разглеждане на\n"
+" ръководството. Вместо нея пробвайте „man.<tool>.cmd“."
+
+#: builtin/help.c:228
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"„%s“: команда за поддържана програма за разглеждане на\n"
+" ръководството. Вместо нея пробвайте „man.<tool>.path“."
+
+#: builtin/help.c:353
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "„%s“: непозната програма за преглед на ръководството."
+
+#: builtin/help.c:370
+msgid "no man viewer handled the request"
+msgstr "никоя програма за ръководство не успя да обработи заявката"
+
+#: builtin/help.c:378
+msgid "no info viewer handled the request"
+msgstr "никоя програма за информационни страници не успя да обработи заявката"
+
+#: builtin/help.c:424
+msgid "Defining attributes per path"
+msgstr "Указване на атрибути към път"
+
+#: builtin/help.c:425
+msgid "A Git glossary"
+msgstr "Речник с термините на Git"
+
+#: builtin/help.c:426
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани"
+
+#: builtin/help.c:427
+msgid "Defining submodule properties"
+msgstr "Дефиниране на свойствата на подмодулите"
+
+#: builtin/help.c:428
+msgid "Specifying revisions and ranges for Git"
+msgstr "Указване на версии и интервали в Git"
+
+#: builtin/help.c:429
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+msgstr "Въвеждащ урок за Git (версии поне 1.5.1)"
+
+#: builtin/help.c:430
+msgid "An overview of recommended workflows with Git"
+msgstr "Общ преглед на препоръчваните начини за работа с Git"
+
+#: builtin/help.c:442
+msgid "The common Git guides are:\n"
+msgstr "Популярните пътеводители в Git са:\n"
+
+#: builtin/help.c:463 builtin/help.c:480
+#, c-format
+msgid "usage: %s%s"
+msgstr "употреба: %s%s"
+
+#: builtin/help.c:496
+#, c-format
+msgid "`git %s' is aliased to `%s'"
+msgstr "„git %s“ е синоним на „%s“"
+
+#: builtin/index-pack.c:184
+#, c-format
+msgid "object type mismatch at %s"
+msgstr ""
+
+#: builtin/index-pack.c:204
+msgid "object of unexpected type"
+msgstr ""
+
+#: builtin/index-pack.c:244
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:254
+msgid "early EOF"
+msgstr ""
+
+#: builtin/index-pack.c:255
+msgid "read error on input"
+msgstr ""
+
+#: builtin/index-pack.c:267
+msgid "used more bytes than were available"
+msgstr ""
+
+#: builtin/index-pack.c:274
+msgid "pack too large for current definition of off_t"
+msgstr ""
+
+#: builtin/index-pack.c:290
+#, c-format
+msgid "unable to create '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:295
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:309
+msgid "pack signature mismatch"
+msgstr ""
+
+#: builtin/index-pack.c:311
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr ""
+
+#: builtin/index-pack.c:329
+#, c-format
+msgid "pack has bad object at offset %lu: %s"
+msgstr ""
+
+#: builtin/index-pack.c:451
+#, c-format
+msgid "inflate returned %d"
+msgstr ""
+
+#: builtin/index-pack.c:500
+msgid "offset value overflow for delta base object"
+msgstr ""
+
+#: builtin/index-pack.c:508
+msgid "delta base offset is out of bound"
+msgstr ""
+
+#: builtin/index-pack.c:516
+#, c-format
+msgid "unknown object type %d"
+msgstr ""
+
+#: builtin/index-pack.c:547
+msgid "cannot pread pack file"
+msgstr ""
+
+#: builtin/index-pack.c:549
+#, c-format
+msgid "premature end of pack file, %lu byte missing"
+msgid_plural "premature end of pack file, %lu bytes missing"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:575
+msgid "serious inflate inconsistency"
+msgstr ""
+
+#: builtin/index-pack.c:666 builtin/index-pack.c:672 builtin/index-pack.c:695
+#: builtin/index-pack.c:729 builtin/index-pack.c:738
+#, c-format
+msgid "SHA1 COLLISION FOUND WITH %s !"
+msgstr ""
+
+#: builtin/index-pack.c:669 builtin/pack-objects.c:171
+#: builtin/pack-objects.c:263
+#, c-format
+msgid "unable to read %s"
+msgstr ""
+
+#: builtin/index-pack.c:735
+#, c-format
+msgid "cannot read existing object %s"
+msgstr ""
+
+#: builtin/index-pack.c:749
+#, c-format
+msgid "invalid blob object %s"
+msgstr ""
+
+#: builtin/index-pack.c:763
+#, c-format
+msgid "invalid %s"
+msgstr ""
+
+#: builtin/index-pack.c:766
+msgid "Error in object"
+msgstr ""
+
+#: builtin/index-pack.c:768
+#, c-format
+msgid "Not all child objects of %s are reachable"
+msgstr ""
+
+#: builtin/index-pack.c:839 builtin/index-pack.c:869
+msgid "failed to apply delta"
+msgstr ""
+
+#: builtin/index-pack.c:1010
+msgid "Receiving objects"
+msgstr ""
+
+#: builtin/index-pack.c:1010
+msgid "Indexing objects"
+msgstr ""
+
+#: builtin/index-pack.c:1036
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr ""
+
+#: builtin/index-pack.c:1041
+msgid "cannot fstat packfile"
+msgstr ""
+
+#: builtin/index-pack.c:1044
+msgid "pack has junk at the end"
+msgstr ""
+
+#: builtin/index-pack.c:1055
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr ""
+
+#: builtin/index-pack.c:1078
+msgid "Resolving deltas"
+msgstr ""
+
+#: builtin/index-pack.c:1088
+#, c-format
+msgid "unable to create thread: %s"
+msgstr ""
+
+#: builtin/index-pack.c:1130
+msgid "confusion beyond insanity"
+msgstr ""
+
+#: builtin/index-pack.c:1138
+#, c-format
+msgid "completed with %d local objects"
+msgstr ""
+
+#: builtin/index-pack.c:1148
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr ""
+
+#: builtin/index-pack.c:1152
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:1177
+#, c-format
+msgid "unable to deflate appended object (%d)"
+msgstr ""
+
+#: builtin/index-pack.c:1256
+#, c-format
+msgid "local object %s is corrupt"
+msgstr ""
+
+#: builtin/index-pack.c:1280
+msgid "error while closing pack file"
+msgstr ""
+
+#: builtin/index-pack.c:1293
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:1301
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:1314
+msgid "cannot store pack file"
+msgstr ""
+
+#: builtin/index-pack.c:1325
+msgid "cannot store index file"
+msgstr ""
+
+#: builtin/index-pack.c:1358
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr ""
+
+#: builtin/index-pack.c:1364
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr ""
+
+#: builtin/index-pack.c:1368 builtin/index-pack.c:1546
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr ""
+
+#: builtin/index-pack.c:1426
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:1428
+#, c-format
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr ""
+
+#: builtin/index-pack.c:1475
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:1482
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: builtin/index-pack.c:1510
+msgid "Cannot come back to cwd"
+msgstr ""
+
+#: builtin/index-pack.c:1558 builtin/index-pack.c:1561
+#: builtin/index-pack.c:1573 builtin/index-pack.c:1577
+#, c-format
+msgid "bad %s"
+msgstr ""
+
+#: builtin/index-pack.c:1591
+msgid "--fix-thin cannot be used without --stdin"
+msgstr ""
+
+#: builtin/index-pack.c:1595 builtin/index-pack.c:1605
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr ""
+
+#: builtin/index-pack.c:1614
+msgid "--verify with no packfile name given"
+msgstr ""
+
+#: builtin/init-db.c:35
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr ""
+
+#: builtin/init-db.c:62
+#, c-format
+msgid "insanely long template name %s"
+msgstr ""
+
+#: builtin/init-db.c:67
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: builtin/init-db.c:73
+#, c-format
+msgid "cannot stat template '%s'"
+msgstr ""
+
+#: builtin/init-db.c:80
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr ""
+
+#: builtin/init-db.c:97
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr ""
+
+#: builtin/init-db.c:99
+#, c-format
+msgid "insanely long symlink %s"
+msgstr ""
+
+#: builtin/init-db.c:102
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr ""
+
+#: builtin/init-db.c:106
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr ""
+
+#: builtin/init-db.c:110
+#, c-format
+msgid "ignoring template %s"
+msgstr ""
+
+#: builtin/init-db.c:133
+#, c-format
+msgid "insanely long template path %s"
+msgstr ""
+
+#: builtin/init-db.c:141
+#, c-format
+msgid "templates not found %s"
+msgstr ""
+
+#: builtin/init-db.c:154
+#, c-format
+msgid "not copying templates of a wrong format version %d from '%s'"
+msgstr ""
+
+#: builtin/init-db.c:192
+#, c-format
+msgid "insane git directory %s"
+msgstr ""
+
+#: builtin/init-db.c:323 builtin/init-db.c:326
+#, c-format
+msgid "%s already exists"
+msgstr ""
+
+#: builtin/init-db.c:355
+#, c-format
+msgid "unable to handle file type %d"
+msgstr ""
+
+#: builtin/init-db.c:358
+#, c-format
+msgid "unable to move %s to %s"
+msgstr ""
+
+#.
+#. * TRANSLATORS: The first '%s' is either "Reinitialized
+#. * existing" or "Initialized empty", the second " shared" or
+#. * "", and the last '%s%s' is the verbatim directory name.
+#.
+#: builtin/init-db.c:420
+#, c-format
+msgid "%s%s Git repository in %s%s\n"
+msgstr ""
+
+#: builtin/init-db.c:421
+msgid "Reinitialized existing"
+msgstr ""
+
+#: builtin/init-db.c:421
+msgid "Initialized empty"
+msgstr ""
+
+#: builtin/init-db.c:422
+msgid " shared"
+msgstr ""
+
+#: builtin/init-db.c:441
+msgid "cannot tell cwd"
+msgstr ""
+
+#: builtin/init-db.c:467
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [directory]"
+msgstr ""
+
+#: builtin/init-db.c:490
+msgid "permissions"
+msgstr ""
+
+#: builtin/init-db.c:491
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr ""
+
+#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+msgid "be quiet"
+msgstr ""
+
+#: builtin/init-db.c:522 builtin/init-db.c:529
+#, c-format
+msgid "cannot mkdir %s"
+msgstr ""
+
+#: builtin/init-db.c:533
+#, c-format
+msgid "cannot chdir to %s"
+msgstr ""
+
+#: builtin/init-db.c:555
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+
+#: builtin/init-db.c:579
+msgid "Cannot access current working directory"
+msgstr ""
+
+#: builtin/init-db.c:586
+#, c-format
+msgid "Cannot access work tree '%s'"
+msgstr ""
+
+#: builtin/log.c:41
+msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
+msgstr ""
+
+#: builtin/log.c:42
+msgid " or: git show [options] <object>..."
+msgstr ""
+
+#: builtin/log.c:125
+msgid "suppress diff output"
+msgstr ""
+
+#: builtin/log.c:126
+msgid "show source"
+msgstr ""
+
+#: builtin/log.c:127
+msgid "Use mail map file"
+msgstr ""
+
+#: builtin/log.c:128
+msgid "decorate options"
+msgstr ""
+
+#: builtin/log.c:231
+#, c-format
+msgid "Final output: %d %s\n"
+msgstr ""
+
+#: builtin/log.c:473 builtin/log.c:565
+#, c-format
+msgid "Could not read object %s"
+msgstr ""
+
+#: builtin/log.c:589
+#, c-format
+msgid "Unknown type: %d"
+msgstr ""
+
+#: builtin/log.c:689
+msgid "format.headers without value"
+msgstr ""
+
+#: builtin/log.c:771
+msgid "name of output directory is too long"
+msgstr ""
+
+#: builtin/log.c:787
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr ""
+
+#: builtin/log.c:801
+msgid "Need exactly one range."
+msgstr ""
+
+#: builtin/log.c:809
+msgid "Not a range."
+msgstr ""
+
+#: builtin/log.c:911
+msgid "Cover letter needs email format"
+msgstr ""
+
+#: builtin/log.c:987
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr ""
+
+#: builtin/log.c:1015
+msgid "git format-patch [options] [<since> | <revision range>]"
+msgstr ""
+
+#: builtin/log.c:1060
+msgid "Two output directories?"
+msgstr ""
+
+#: builtin/log.c:1175
+msgid "use [PATCH n/m] even with a single patch"
+msgstr ""
+
+#: builtin/log.c:1178
+msgid "use [PATCH] even with multiple patches"
+msgstr ""
+
+#: builtin/log.c:1182
+msgid "print patches to standard out"
+msgstr ""
+
+#: builtin/log.c:1184
+msgid "generate a cover letter"
+msgstr ""
+
+#: builtin/log.c:1186
+msgid "use simple number sequence for output file names"
+msgstr ""
+
+#: builtin/log.c:1187
+msgid "sfx"
+msgstr ""
+
+#: builtin/log.c:1188
+msgid "use <sfx> instead of '.patch'"
+msgstr ""
+
+#: builtin/log.c:1190
+#, fuzzy
+msgid "start numbering patches at <n> instead of 1"
+msgstr "<брой>"
+
+#: builtin/log.c:1192
+msgid "mark the series as Nth re-roll"
+msgstr ""
+
+#: builtin/log.c:1194
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1197
+msgid "store resulting files in <dir>"
+msgstr ""
+
+#: builtin/log.c:1200
+msgid "don't strip/add [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1203
+msgid "don't output binary diffs"
+msgstr ""
+
+#: builtin/log.c:1205
+msgid "don't include a patch matching a commit upstream"
+msgstr ""
+
+#: builtin/log.c:1207
+msgid "show patch format instead of default (patch + stat)"
+msgstr ""
+
+#: builtin/log.c:1209
+msgid "Messaging"
+msgstr ""
+
+#: builtin/log.c:1210
+msgid "header"
+msgstr ""
+
+#: builtin/log.c:1211
+msgid "add email header"
+msgstr ""
+
+#: builtin/log.c:1212 builtin/log.c:1214
+msgid "email"
+msgstr ""
+
+#: builtin/log.c:1212
+msgid "add To: header"
+msgstr ""
+
+#: builtin/log.c:1214
+msgid "add Cc: header"
+msgstr ""
+
+#: builtin/log.c:1216
+msgid "ident"
+msgstr ""
+
+#: builtin/log.c:1217
+msgid "set From address to <ident> (or committer ident if absent)"
+msgstr ""
+
+#: builtin/log.c:1219
+msgid "message-id"
+msgstr ""
+
+#: builtin/log.c:1220
+msgid "make first mail a reply to <message-id>"
+msgstr ""
+
+#: builtin/log.c:1221 builtin/log.c:1224
+msgid "boundary"
+msgstr ""
+
+#: builtin/log.c:1222
+msgid "attach the patch"
+msgstr ""
+
+#: builtin/log.c:1225
+msgid "inline the patch"
+msgstr ""
+
+#: builtin/log.c:1229
+msgid "enable message threading, styles: shallow, deep"
+msgstr ""
+
+#: builtin/log.c:1231
+msgid "signature"
+msgstr ""
+
+#: builtin/log.c:1232
+msgid "add a signature"
+msgstr ""
+
+#: builtin/log.c:1233
+msgid "don't print the patch filenames"
+msgstr ""
+
+#: builtin/log.c:1307
+#, c-format
+msgid "invalid ident line: %s"
+msgstr ""
+
+#: builtin/log.c:1322
+msgid "-n and -k are mutually exclusive."
+msgstr ""
+
+#: builtin/log.c:1324
+msgid "--subject-prefix and -k are mutually exclusive."
+msgstr ""
+
+#: builtin/log.c:1332
+msgid "--name-only does not make sense"
+msgstr ""
+
+#: builtin/log.c:1334
+msgid "--name-status does not make sense"
+msgstr ""
+
+#: builtin/log.c:1336
+msgid "--check does not make sense"
+msgstr ""
+
+#: builtin/log.c:1359
+msgid "standard output, or directory, which one?"
+msgstr ""
+
+#: builtin/log.c:1361
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr ""
+
+#: builtin/log.c:1509
+msgid "Failed to create output files"
+msgstr ""
+
+#: builtin/log.c:1558
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr ""
+
+#: builtin/log.c:1613
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+msgstr ""
+
+#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
+#, c-format
+msgid "Unknown commit %s"
+msgstr ""
+
+#: builtin/ls-files.c:398
+msgid "git ls-files [options] [<file>...]"
+msgstr ""
+
+#: builtin/ls-files.c:455
+msgid "identify the file status with tags"
+msgstr ""
+
+#: builtin/ls-files.c:457
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr ""
+
+#: builtin/ls-files.c:459
+msgid "show cached files in the output (default)"
+msgstr ""
+
+#: builtin/ls-files.c:461
+msgid "show deleted files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:463
+msgid "show modified files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:465
+msgid "show other files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:467
+msgid "show ignored files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:470
+msgid "show staged contents' object name in the output"
+msgstr ""
+
+#: builtin/ls-files.c:472
+msgid "show files on the filesystem that need to be removed"
+msgstr ""
+
+#: builtin/ls-files.c:474
+msgid "show 'other' directories' name only"
+msgstr ""
+
+#: builtin/ls-files.c:477
+msgid "don't show empty directories"
+msgstr ""
+
+#: builtin/ls-files.c:480
+msgid "show unmerged files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:482
+msgid "show resolve-undo information"
+msgstr ""
+
+#: builtin/ls-files.c:484
+msgid "skip files matching pattern"
+msgstr ""
+
+#: builtin/ls-files.c:487
+msgid "exclude patterns are read from <file>"
+msgstr ""
+
+#: builtin/ls-files.c:490
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr ""
+
+#: builtin/ls-files.c:492
+msgid "add the standard git exclusions"
+msgstr ""
+
+#: builtin/ls-files.c:495
+msgid "make the output relative to the project top directory"
+msgstr ""
+
+#: builtin/ls-files.c:498
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr ""
+
+#: builtin/ls-files.c:499
+msgid "tree-ish"
+msgstr ""
+
+#: builtin/ls-files.c:500
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr ""
+
+#: builtin/ls-files.c:502
+msgid "show debugging data"
+msgstr ""
+
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr ""
+
+#: builtin/ls-tree.c:126
+msgid "only show trees"
+msgstr ""
+
+#: builtin/ls-tree.c:128
+msgid "recurse into subtrees"
+msgstr ""
+
+#: builtin/ls-tree.c:130
+msgid "show trees when recursing"
+msgstr ""
+
+#: builtin/ls-tree.c:133
+msgid "terminate entries with NUL byte"
+msgstr ""
+
+#: builtin/ls-tree.c:134
+msgid "include object size"
+msgstr ""
+
+#: builtin/ls-tree.c:136 builtin/ls-tree.c:138
+msgid "list only filenames"
+msgstr ""
+
+#: builtin/ls-tree.c:141
+msgid "use full path names"
+msgstr ""
+
+#: builtin/ls-tree.c:143
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr ""
+
+#: builtin/merge.c:43
+msgid "git merge [options] [<commit>...]"
+msgstr ""
+
+#: builtin/merge.c:44
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr ""
+
+#: builtin/merge.c:45
+msgid "git merge --abort"
+msgstr ""
+
+#: builtin/merge.c:98
+msgid "switch `m' requires a value"
+msgstr ""
+
+#: builtin/merge.c:135
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr ""
+
+#: builtin/merge.c:136
+#, c-format
+msgid "Available strategies are:"
+msgstr ""
+
+#: builtin/merge.c:141
+#, c-format
+msgid "Available custom strategies are:"
+msgstr ""
+
+#: builtin/merge.c:191
+msgid "do not show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:194
+msgid "show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:195
+msgid "(synonym to --stat)"
+msgstr ""
+
+#: builtin/merge.c:197
+#, fuzzy
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr "<брой>"
+
+#: builtin/merge.c:200
+msgid "create a single commit instead of doing a merge"
+msgstr ""
+
+#: builtin/merge.c:202
+msgid "perform a commit if the merge succeeds (default)"
+msgstr ""
+
+#: builtin/merge.c:204
+msgid "edit message before committing"
+msgstr ""
+
+#: builtin/merge.c:205
+msgid "allow fast-forward (default)"
+msgstr ""
+
+#: builtin/merge.c:207
+msgid "abort if fast-forward is not possible"
+msgstr ""
+
+#: builtin/merge.c:211
+msgid "Verify that the named commit has a valid GPG signature"
+msgstr ""
+
+#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+msgid "strategy"
+msgstr ""
+
+#: builtin/merge.c:213
+msgid "merge strategy to use"
+msgstr ""
+
+#: builtin/merge.c:214
+msgid "option=value"
+msgstr ""
+
+#: builtin/merge.c:215
+msgid "option for selected merge strategy"
+msgstr ""
+
+#: builtin/merge.c:217
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr ""
+
+#: builtin/merge.c:221
+msgid "abort the current in-progress merge"
+msgstr ""
+
+#: builtin/merge.c:250
+msgid "could not run stash."
+msgstr ""
+
+#: builtin/merge.c:255
+msgid "stash failed"
+msgstr ""
+
+#: builtin/merge.c:260
+#, c-format
+msgid "not a valid object: %s"
+msgstr ""
+
+#: builtin/merge.c:279 builtin/merge.c:296
+msgid "read-tree failed"
+msgstr ""
+
+#: builtin/merge.c:326
+msgid " (nothing to squash)"
+msgstr ""
+
+#: builtin/merge.c:339
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr ""
+
+#: builtin/merge.c:371
+msgid "Writing SQUASH_MSG"
+msgstr ""
+
+#: builtin/merge.c:373
+msgid "Finishing SQUASH_MSG"
+msgstr ""
+
+#: builtin/merge.c:396
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
+msgstr ""
+
+#: builtin/merge.c:446
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr ""
+
+#: builtin/merge.c:558
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr ""
+
+#: builtin/merge.c:650
+msgid "git write-tree failed to write a tree"
+msgstr ""
+
+#: builtin/merge.c:678
+msgid "Not handling anything other than two heads merge."
+msgstr ""
+
+#: builtin/merge.c:692
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr ""
+
+#: builtin/merge.c:706
+#, c-format
+msgid "unable to write %s"
+msgstr ""
+
+#: builtin/merge.c:795
+#, c-format
+msgid "Could not read from '%s'"
+msgstr ""
+
+#: builtin/merge.c:804
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+msgstr ""
+
+#: builtin/merge.c:810
+#, c-format
+msgid ""
+"Please enter a commit message to explain why this merge is necessary,\n"
+"especially if it merges an updated upstream into a topic branch.\n"
+"\n"
+"Lines starting with '%c' will be ignored, and an empty message aborts\n"
+"the commit.\n"
+msgstr ""
+
+#: builtin/merge.c:834
+msgid "Empty commit message."
+msgstr ""
+
+#: builtin/merge.c:846
+#, c-format
+msgid "Wonderful.\n"
+msgstr ""
+
+#: builtin/merge.c:911
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgstr ""
+
+#: builtin/merge.c:927
+#, c-format
+msgid "'%s' is not a commit"
+msgstr ""
+
+#: builtin/merge.c:968
+msgid "No current branch."
+msgstr ""
+
+#: builtin/merge.c:970
+msgid "No remote for the current branch."
+msgstr ""
+
+#: builtin/merge.c:972
+msgid "No default upstream defined for the current branch."
+msgstr ""
+
+#: builtin/merge.c:977
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
+msgstr ""
+
+#: builtin/merge.c:1133
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr ""
+
+#: builtin/merge.c:1149 git-pull.sh:31
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+
+#: builtin/merge.c:1152 git-pull.sh:34
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
+msgstr ""
+
+#: builtin/merge.c:1156
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you can merge."
+msgstr ""
+
+#: builtin/merge.c:1159
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+msgstr ""
+
+#: builtin/merge.c:1168
+msgid "You cannot combine --squash with --no-ff."
+msgstr ""
+
+#: builtin/merge.c:1177
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr ""
+
+#: builtin/merge.c:1209
+msgid "Can merge only exactly one commit into empty head"
+msgstr ""
+
+#: builtin/merge.c:1212
+msgid "Squash commit into empty head not supported yet"
+msgstr ""
+
+#: builtin/merge.c:1214
+msgid "Non-fast-forward commit does not make sense into an empty head"
+msgstr ""
+
+#: builtin/merge.c:1219
+#, c-format
+msgid "%s - not something we can merge"
+msgstr ""
+
+#: builtin/merge.c:1270
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr ""
+
+#: builtin/merge.c:1273
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr ""
+
+#. 'N'
+#: builtin/merge.c:1276
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr ""
+
+#: builtin/merge.c:1279
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr ""
+
+#: builtin/merge.c:1363
+#, c-format
+msgid "Updating %s..%s\n"
+msgstr ""
+
+#: builtin/merge.c:1402
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr ""
+
+#: builtin/merge.c:1409
+#, c-format
+msgid "Nope.\n"
+msgstr ""
+
+#: builtin/merge.c:1441
+msgid "Not possible to fast-forward, aborting."
+msgstr ""
+
+#: builtin/merge.c:1464 builtin/merge.c:1543
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr ""
+
+#: builtin/merge.c:1468
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr ""
+
+#: builtin/merge.c:1534
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr ""
+
+#: builtin/merge.c:1536
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr ""
+
+#: builtin/merge.c:1545
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
+msgstr ""
+
+#: builtin/merge.c:1557
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr ""
+
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a|--all] <commit> <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a|--all] --octopus <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr ""
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr ""
+
+#: builtin/merge-base.c:214
+msgid "output all common ancestors"
+msgstr ""
+
+#: builtin/merge-base.c:216
+msgid "find ancestors for a single n-way merge"
+msgstr ""
+
+#: builtin/merge-base.c:218
+msgid "list revs not reachable from others"
+msgstr ""
+
+#: builtin/merge-base.c:220
+msgid "is the first one ancestor of the other?"
+msgstr ""
+
+#: builtin/merge-base.c:222
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr ""
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
+"file2"
+msgstr ""
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr ""
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr ""
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr ""
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr ""
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr ""
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr ""
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr ""
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig_file/file2"
+msgstr ""
+
+#: builtin/mktree.c:67
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr ""
+
+#: builtin/mktree.c:153
+msgid "input is NUL terminated"
+msgstr ""
+
+#: builtin/mktree.c:154 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr ""
+
+#: builtin/mktree.c:155
+msgid "allow creation of more than one tree"
+msgstr ""
+
+#: builtin/mv.c:15
+msgid "git mv [options] <source>... <destination>"
+msgstr ""
+
+#: builtin/mv.c:71
+msgid "force move/rename even if target exists"
+msgstr ""
+
+#: builtin/mv.c:72
+msgid "skip move/rename errors"
+msgstr ""
+
+#: builtin/mv.c:122
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr ""
+
+#: builtin/mv.c:126
+msgid "bad source"
+msgstr ""
+
+#: builtin/mv.c:129
+msgid "can not move directory into itself"
+msgstr ""
+
+#: builtin/mv.c:132
+msgid "cannot move directory over file"
+msgstr ""
+
+#: builtin/mv.c:138
+#, c-format
+msgid "Huh? Directory %s is in index and no submodule?"
+msgstr ""
+
+#: builtin/mv.c:140 builtin/rm.c:318
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr ""
+"За да продължите или вкарайте промените по файла „.gitmodules“ в индекса, "
+"или\n"
+"ги скътайте"
+
+#: builtin/mv.c:156
+#, c-format
+msgid "Huh? %.*s is in index?"
+msgstr ""
+
+#: builtin/mv.c:168
+msgid "source directory is empty"
+msgstr ""
+
+#: builtin/mv.c:200
+msgid "not under version control"
+msgstr ""
+
+#: builtin/mv.c:202
+msgid "destination exists"
+msgstr ""
+
+#: builtin/mv.c:210
+#, c-format
+msgid "overwriting '%s'"
+msgstr ""
+
+#: builtin/mv.c:213
+msgid "Cannot overwrite"
+msgstr ""
+
+#: builtin/mv.c:216
+msgid "multiple sources for the same target"
+msgstr ""
+
+#: builtin/mv.c:218
+msgid "destination directory does not exist"
+msgstr ""
+
+#: builtin/mv.c:233
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr ""
+
+#: builtin/mv.c:243
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr ""
+
+#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "неуспешно преименуване на „%s“"
+
+#: builtin/name-rev.c:258
+msgid "git name-rev [options] <commit>..."
+msgstr ""
+
+#: builtin/name-rev.c:259
+msgid "git name-rev [options] --all"
+msgstr ""
+
+#: builtin/name-rev.c:260
+msgid "git name-rev [options] --stdin"
+msgstr ""
+
+# FIXME
+#: builtin/name-rev.c:312
+msgid "print only names (no SHA-1)"
+msgstr ""
+
+#: builtin/name-rev.c:313
+msgid "only use tags to name the commits"
+msgstr ""
+
+#: builtin/name-rev.c:315
+msgid "only use refs matching <pattern>"
+msgstr ""
+
+#: builtin/name-rev.c:317
+msgid "list all commits reachable from all refs"
+msgstr ""
+
+#: builtin/name-rev.c:318
+msgid "read from stdin"
+msgstr ""
+
+#: builtin/name-rev.c:319
+msgid "allow to print `undefined` names (default)"
+msgstr ""
+
+#: builtin/name-rev.c:325
+msgid "dereference tags in the input (internal use)"
+msgstr ""
+
+#: builtin/notes.c:24
+msgid "git notes [--ref <notes_ref>] [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:25
+msgid ""
+"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:26
+msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:27
+msgid ""
+"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:28
+msgid "git notes [--ref <notes_ref>] edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes_ref>] show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:30
+msgid ""
+"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:31
+msgid "git notes merge --commit [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:32
+msgid "git notes merge --abort [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:33
+msgid "git notes [--ref <notes_ref>] remove [<object>...]"
+msgstr ""
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
+msgstr ""
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes_ref>] get-ref"
+msgstr ""
+
+#: builtin/notes.c:40
+msgid "git notes [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:45
+msgid "git notes add [<options>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:50
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:51
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr ""
+
+#: builtin/notes.c:56
+msgid "git notes append [<options>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:61
+msgid "git notes edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:66
+msgid "git notes show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:71
+msgid "git notes merge [<options>] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:72
+msgid "git notes merge --commit [<options>]"
+msgstr ""
+
+#: builtin/notes.c:73
+msgid "git notes merge --abort [<options>]"
+msgstr ""
+
+#: builtin/notes.c:78
+msgid "git notes remove [<object>]"
+msgstr ""
+
+#: builtin/notes.c:83
+msgid "git notes prune [<options>]"
+msgstr ""
+
+#: builtin/notes.c:88
+msgid "git notes get-ref"
+msgstr ""
+
+#: builtin/notes.c:137
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr ""
+
+#: builtin/notes.c:141
+msgid "could not read 'show' output"
+msgstr ""
+
+#: builtin/notes.c:149
+#, c-format
+msgid "failed to finish 'show' for object '%s'"
+msgstr ""
+
+#: builtin/notes.c:167 builtin/tag.c:341
+#, c-format
+msgid "could not create file '%s'"
+msgstr ""
+
+#: builtin/notes.c:186
+msgid "Please supply the note contents using either -m or -F option"
+msgstr ""
+
+#: builtin/notes.c:207 builtin/notes.c:844
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr ""
+
+#: builtin/notes.c:212
+msgid "unable to write note object"
+msgstr ""
+
+#: builtin/notes.c:214
+#, c-format
+msgid "The note contents has been left in %s"
+msgstr ""
+
+#: builtin/notes.c:248 builtin/tag.c:537
+#, c-format
+msgid "cannot read '%s'"
+msgstr ""
+
+#: builtin/notes.c:250 builtin/tag.c:540
+#, c-format
+msgid "could not open or read '%s'"
+msgstr ""
+
+#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
+#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
+#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
+#: builtin/notes.c:839 builtin/tag.c:553
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr ""
+
+#: builtin/notes.c:272
+#, c-format
+msgid "Failed to read object '%s'."
+msgstr ""
+
+#: builtin/notes.c:312
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr ""
+
+#: builtin/notes.c:327
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr ""
+
+#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
+#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
+#: builtin/notes.c:904
+msgid "too many parameters"
+msgstr ""
+
+#: builtin/notes.c:384 builtin/notes.c:643
+#, c-format
+msgid "No note found for object %s."
+msgstr ""
+
+#: builtin/notes.c:406 builtin/notes.c:563
+msgid "note contents as a string"
+msgstr ""
+
+#: builtin/notes.c:409 builtin/notes.c:566
+msgid "note contents in a file"
+msgstr ""
+
+#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
+#: builtin/notes.c:571 builtin/tag.c:474
+msgid "object"
+msgstr ""
+
+#: builtin/notes.c:412 builtin/notes.c:569
+msgid "reuse and edit specified note object"
+msgstr ""
+
+#: builtin/notes.c:415 builtin/notes.c:572
+msgid "reuse specified note object"
+msgstr ""
+
+#: builtin/notes.c:417 builtin/notes.c:485
+msgid "replace existing notes"
+msgstr ""
+
+#: builtin/notes.c:451
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+
+#: builtin/notes.c:456 builtin/notes.c:533
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
+msgstr ""
+
+#: builtin/notes.c:486
+msgid "read objects from stdin"
+msgstr ""
+
+#: builtin/notes.c:488
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr ""
+
+#: builtin/notes.c:506
+msgid "too few parameters"
+msgstr ""
+
+#: builtin/notes.c:527
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+
+#: builtin/notes.c:539
+#, c-format
+msgid "Missing notes on source object %s. Cannot copy."
+msgstr ""
+
+#: builtin/notes.c:588
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+msgstr ""
+
+#: builtin/notes.c:735
+msgid "General options"
+msgstr ""
+
+#: builtin/notes.c:737
+msgid "Merge options"
+msgstr ""
+
+#: builtin/notes.c:739
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+
+#: builtin/notes.c:741
+msgid "Committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:743
+msgid "finalize notes merge by committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:745
+msgid "Aborting notes merge resolution"
+msgstr ""
+
+#: builtin/notes.c:747
+msgid "abort notes merge"
+msgstr ""
+
+#: builtin/notes.c:842
+#, c-format
+msgid "Object %s has no note\n"
+msgstr ""
+
+#: builtin/notes.c:854
+msgid "attempt to remove non-existent note is not an error"
+msgstr ""
+
+#: builtin/notes.c:857
+msgid "read object names from the standard input"
+msgstr ""
+
+#: builtin/notes.c:938
+msgid "notes_ref"
+msgstr ""
+
+#: builtin/notes.c:939
+msgid "use notes from <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:974 builtin/remote.c:1593
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "Непозната подкоманда: %s"
+
+#: builtin/pack-objects.c:23
+msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgstr ""
+
+#: builtin/pack-objects.c:24
+msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgstr ""
+
+#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#, c-format
+msgid "deflate error (%d)"
+msgstr ""
+
+#: builtin/pack-objects.c:2396
+#, c-format
+msgid "unsupported index version %s"
+msgstr ""
+
+#: builtin/pack-objects.c:2400
+#, c-format
+msgid "bad index version '%s'"
+msgstr ""
+
+#: builtin/pack-objects.c:2423
+#, c-format
+msgid "option %s does not accept negative form"
+msgstr ""
+
+#: builtin/pack-objects.c:2427
+#, c-format
+msgid "unable to parse value '%s' for option %s"
+msgstr ""
+
+#: builtin/pack-objects.c:2446
+msgid "do not show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2448
+msgid "show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2450
+msgid "show progress meter during object writing phase"
+msgstr ""
+
+#: builtin/pack-objects.c:2453
+msgid "similar to --all-progress when progress meter is shown"
+msgstr ""
+
+#: builtin/pack-objects.c:2454
+msgid "version[,offset]"
+msgstr ""
+
+#: builtin/pack-objects.c:2455
+msgid "write the pack index file in the specified idx format version"
+msgstr ""
+
+#: builtin/pack-objects.c:2458
+msgid "maximum size of each output pack file"
+msgstr ""
+
+#: builtin/pack-objects.c:2460
+msgid "ignore borrowed objects from alternate object store"
+msgstr ""
+
+#: builtin/pack-objects.c:2462
+msgid "ignore packed objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2464
+msgid "limit pack window by objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2466
+msgid "limit pack window by memory in addition to object limit"
+msgstr ""
+
+#: builtin/pack-objects.c:2468
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr ""
+
+#: builtin/pack-objects.c:2470
+msgid "reuse existing deltas"
+msgstr ""
+
+#: builtin/pack-objects.c:2472
+msgid "reuse existing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2474
+msgid "use OFS_DELTA objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2476
+msgid "use threads when searching for best delta matches"
+msgstr ""
+
+#: builtin/pack-objects.c:2478
+msgid "do not create an empty pack output"
+msgstr ""
+
+#: builtin/pack-objects.c:2480
+msgid "read revision arguments from standard input"
+msgstr ""
+
+#: builtin/pack-objects.c:2482
+msgid "limit the objects to those that are not yet packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2485
+msgid "include objects reachable from any reference"
+msgstr ""
+
+#: builtin/pack-objects.c:2488
+msgid "include objects referred by reflog entries"
+msgstr ""
+
+#: builtin/pack-objects.c:2491
+msgid "output pack to stdout"
+msgstr ""
+
+#: builtin/pack-objects.c:2493
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2495
+msgid "keep unreachable objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2496 parse-options.h:143
+msgid "time"
+msgstr "време"
+
+#: builtin/pack-objects.c:2497
+msgid "unpack unreachable objects newer than <time>"
+msgstr ""
+
+#: builtin/pack-objects.c:2500
+msgid "create thin packs"
+msgstr ""
+
+#: builtin/pack-objects.c:2502
+msgid "ignore packs that have companion .keep file"
+msgstr ""
+
+#: builtin/pack-objects.c:2504
+msgid "pack compression level"
+msgstr ""
+
+#: builtin/pack-objects.c:2506
+msgid "do not hide commits by grafts"
+msgstr ""
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [options]"
+msgstr ""
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr ""
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr ""
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
+msgstr ""
+
+#: builtin/prune.c:12
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr ""
+
+#: builtin/prune.c:142
+msgid "do not remove, show only"
+msgstr ""
+
+#: builtin/prune.c:143
+msgid "report pruned objects"
+msgstr ""
+
+#: builtin/prune.c:146
+msgid "expire objects older than <time>"
+msgstr ""
+
+#: builtin/push.c:14
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr ""
+
+#: builtin/push.c:86
+msgid "tag shorthand without <tag>"
+msgstr ""
+
+#: builtin/push.c:96
+msgid "--delete only accepts plain target ref names"
+msgstr ""
+
+#: builtin/push.c:141
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr ""
+
+#: builtin/push.c:144
+#, c-format
+msgid ""
+"The upstream branch of your current branch does not match\n"
+"the name of your current branch. To push to the upstream branch\n"
+"on the remote, use\n"
+"\n"
+" git push %s HEAD:%s\n"
+"\n"
+"To push to the branch of the same name on the remote, use\n"
+"\n"
+" git push %s %s\n"
+"%s"
+msgstr ""
+
+#: builtin/push.c:159
+#, c-format
+msgid ""
+"You are not currently on a branch.\n"
+"To push the history leading to the current (detached HEAD)\n"
+"state now, use\n"
+"\n"
+" git push %s HEAD:<name-of-remote-branch>\n"
+msgstr ""
+
+#: builtin/push.c:173
+#, c-format
+msgid ""
+"The current branch %s has no upstream branch.\n"
+"To push the current branch and set the remote as upstream, use\n"
+"\n"
+" git push --set-upstream %s %s\n"
+msgstr ""
+
+#: builtin/push.c:181
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr ""
+
+#: builtin/push.c:184
+#, c-format
+msgid ""
+"You are pushing to remote '%s', which is not the upstream of\n"
+"your current branch '%s', without telling me what to push\n"
+"to update which remote branch."
+msgstr ""
+
+#: builtin/push.c:207
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+" git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+" git config --global push.default simple\n"
+"\n"
+"When push.default is set to 'matching', git will push local branches\n"
+"to the remote branches that already exist with the same name.\n"
+"\n"
+"In Git 2.0, Git will default to the more conservative 'simple'\n"
+"behavior, which only pushes the current branch to the corresponding\n"
+"remote branch that 'git pull' uses to update the current branch.\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+
+#: builtin/push.c:274
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr ""
+
+#: builtin/push.c:281
+msgid ""
+"Updates were rejected because the tip of your current branch is behind\n"
+"its remote counterpart. Integrate the remote changes (e.g.\n"
+"'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+
+#: builtin/push.c:287
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. If you did not intend to push that branch, you may want to\n"
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
+msgstr ""
+
+#: builtin/push.c:293
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. Check out this branch and integrate the remote changes\n"
+"(e.g. 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+
+#: builtin/push.c:299
+msgid ""
+"Updates were rejected because the remote contains work that you do\n"
+"not have locally. This is usually caused by another repository pushing\n"
+"to the same ref. You may want to first integrate the remote changes\n"
+"(e.g., 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+
+#: builtin/push.c:306
+msgid "Updates were rejected because the tag already exists in the remote."
+msgstr ""
+
+#: builtin/push.c:309
+msgid ""
+"You cannot update a remote ref that points at a non-commit object,\n"
+"or update a remote ref to make it point at a non-commit object,\n"
+"without using the '--force' option.\n"
+msgstr ""
+
+#: builtin/push.c:375
+#, c-format
+msgid "Pushing to %s\n"
+msgstr ""
+
+#: builtin/push.c:379
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr ""
+
+#: builtin/push.c:412
+#, c-format
+msgid "bad repository '%s'"
+msgstr ""
+
+#: builtin/push.c:413
+msgid ""
+"No configured push destination.\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
+"\n"
+" git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+" git push <name>\n"
+msgstr ""
+
+#: builtin/push.c:428
+msgid "--all and --tags are incompatible"
+msgstr ""
+
+#: builtin/push.c:429
+msgid "--all can't be combined with refspecs"
+msgstr ""
+
+#: builtin/push.c:434
+msgid "--mirror and --tags are incompatible"
+msgstr ""
+
+#: builtin/push.c:435
+msgid "--mirror can't be combined with refspecs"
+msgstr ""
+
+#: builtin/push.c:440
+msgid "--all and --mirror are incompatible"
+msgstr ""
+
+#: builtin/push.c:500
+msgid "repository"
+msgstr ""
+
+#: builtin/push.c:501
+msgid "push all refs"
+msgstr ""
+
+#: builtin/push.c:502
+msgid "mirror all refs"
+msgstr ""
+
+#: builtin/push.c:504
+msgid "delete refs"
+msgstr ""
+
+#: builtin/push.c:505
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr ""
+
+#: builtin/push.c:508
+msgid "force updates"
+msgstr ""
+
+#: builtin/push.c:510
+msgid "refname>:<expect"
+msgstr ""
+
+#: builtin/push.c:511
+msgid "require old value of ref to be at this value"
+msgstr ""
+
+#: builtin/push.c:513
+msgid "check"
+msgstr ""
+
+#: builtin/push.c:514
+msgid "control recursive pushing of submodules"
+msgstr ""
+
+#: builtin/push.c:516
+msgid "use thin pack"
+msgstr ""
+
+#: builtin/push.c:517 builtin/push.c:518
+msgid "receive pack program"
+msgstr ""
+
+#: builtin/push.c:519
+msgid "set upstream for git pull/status"
+msgstr ""
+
+#: builtin/push.c:522
+msgid "prune locally removed refs"
+msgstr ""
+
+#: builtin/push.c:524
+msgid "bypass pre-push hook"
+msgstr ""
+
+#: builtin/push.c:525
+msgid "push missing but relevant tags"
+msgstr ""
+
+#: builtin/push.c:535
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr ""
+
+#: builtin/push.c:537
+msgid "--delete doesn't make sense without any refs"
+msgstr ""
+
+#: builtin/read-tree.c:36
+msgid ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+
+#: builtin/read-tree.c:109
+msgid "write resulting index to <file>"
+msgstr ""
+
+#: builtin/read-tree.c:112
+msgid "only empty the index"
+msgstr ""
+
+#: builtin/read-tree.c:114
+msgid "Merging"
+msgstr ""
+
+#: builtin/read-tree.c:116
+msgid "perform a merge in addition to a read"
+msgstr ""
+
+#: builtin/read-tree.c:118
+msgid "3-way merge if no file level merging required"
+msgstr ""
+
+#: builtin/read-tree.c:120
+msgid "3-way merge in presence of adds and removes"
+msgstr ""
+
+#: builtin/read-tree.c:122
+msgid "same as -m, but discard unmerged entries"
+msgstr ""
+
+#: builtin/read-tree.c:123
+msgid "<subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:124
+msgid "read the tree into the index under <subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:127
+msgid "update working tree with merge result"
+msgstr ""
+
+#: builtin/read-tree.c:129
+msgid "gitignore"
+msgstr ""
+
+#: builtin/read-tree.c:130
+msgid "allow explicitly ignored files to be overwritten"
+msgstr ""
+
+#: builtin/read-tree.c:133
+msgid "don't check the working tree after merging"
+msgstr ""
+
+#: builtin/read-tree.c:134
+msgid "don't update the index or the work tree"
+msgstr ""
+
+#: builtin/read-tree.c:136
+msgid "skip applying sparse checkout filter"
+msgstr ""
+
+#: builtin/read-tree.c:138
+msgid "debug unpack-trees"
+msgstr ""
+
+# FIXME
+#: builtin/reflog.c:499
+#, c-format
+msgid "%s' for '%s' is not a valid timestamp"
+msgstr "„%s“ не е правилна стойност за време за „%s“"
+
+#: builtin/reflog.c:615 builtin/reflog.c:620
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "„%s“ не е правилна стойност за време"
+
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
+
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+"git remote add [-t <КЛОН>] [-m <ОСНОВЕН_КЛОН>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <ИМЕ> <АДРЕС>"
+
+#: builtin/remote.c:14 builtin/remote.c:33
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <СТАРО_ИМЕ> <НОВО_ИМЕ>"
+
+#: builtin/remote.c:15 builtin/remote.c:38
+msgid "git remote remove <name>"
+msgstr "git remote remove <ИМЕ>"
+
+#: builtin/remote.c:16
+msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
+msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete |<КЛОН>)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <ИМЕ>"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <ИМЕ>"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<ГРУПА> | "
+"<ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ>)…]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <ИМЕ> <КЛОН>…"
+
+#: builtin/remote.c:21 builtin/remote.c:69
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <ИМЕ> <НОВ_АДРЕС> [<СТАР_АДРЕС>]"
+
+#: builtin/remote.c:22 builtin/remote.c:70
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <ИМЕ> <НОВ_АДРЕС>"
+
+#: builtin/remote.c:23 builtin/remote.c:71
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <ИМЕ> <АДРЕС>"
+
+#: builtin/remote.c:28
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<ОПЦИИ>] <ИМЕ> <АДРЕС>"
+
+#: builtin/remote.c:43
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete | <КЛОН>)"
+
+#: builtin/remote.c:48
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <ИМЕ> <КЛОН>…"
+
+#: builtin/remote.c:49
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <ИМЕ> <КЛОН>…"
+
+#: builtin/remote.c:54
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<ОПЦИИ>] <ИМЕ>"
+
+#: builtin/remote.c:59
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<ОПЦИИ>] <ИМЕ>"
+
+#: builtin/remote.c:64
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<ОПЦИИ>] [<ГРУПА> | <ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ>]…"
+
+#: builtin/remote.c:88
+#, c-format
+msgid "Updating %s"
+msgstr "Обновяване на „%s“"
+
+#: builtin/remote.c:120
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"Използването само на „--mirror“ е опасно. Вместо това\n"
+"\tползвайте „--mirror=fetch“ или „--mirror=push“"
+
+#: builtin/remote.c:137
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "неправилна стойност за „--mirror“: %s"
+
+#: builtin/remote.c:153
+msgid "fetch the remote branches"
+msgstr "отдалечените клони не могат да бъдат доставени"
+
+#: builtin/remote.c:155
+msgid "import all tags and associated objects when fetching"
+msgstr "внасяне на всички етикети и принадлежащите им обекти при доставяне"
+
+#: builtin/remote.c:158
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "може и да не се доставят никакви етикети (чрез опцията „--no-tags“)"
+
+#: builtin/remote.c:160
+msgid "branch(es) to track"
+msgstr "клон/и за следене"
+
+#: builtin/remote.c:161
+msgid "master branch"
+msgstr "основен клон"
+
+#: builtin/remote.c:162
+msgid "push|fetch"
+msgstr "издърпване|доставяне"
+
+#: builtin/remote.c:163
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr ""
+"настройване на отдалечено хранилище, от което да се издърпва или доставя"
+
+#: builtin/remote.c:175
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr ""
+"няма смисъл да се указва основен клон при използване на опцията „--mirror“"
+
+#: builtin/remote.c:177
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr ""
+"указването на следени клони е смислено само за отдалечени хранилища, от "
+"които се доставя"
+
+#: builtin/remote.c:185 builtin/remote.c:641
+#, c-format
+msgid "remote %s already exists."
+msgstr "вече съществува отдалечено хранилище с име „%s“."
+
+#: builtin/remote.c:189 builtin/remote.c:645
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "„%s“ е неправилно име за отдалечено хранилище"
+
+#: builtin/remote.c:233
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "Основният клон „%s“ не може да бъде настроен"
+
+#: builtin/remote.c:289
+#, c-format
+msgid "more than one %s"
+msgstr "повече от едно отдалечено хранилище на име „%s“"
+
+#: builtin/remote.c:334
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr "Обектите за доставяне за указателя „%s“ не могат да бъдат получени"
+
+#: builtin/remote.c:435 builtin/remote.c:443
+msgid "(matching)"
+msgstr "(съвпадащи)"
+
+#: builtin/remote.c:447
+msgid "(delete)"
+msgstr "(за изтриване)"
+
+#: builtin/remote.c:590 builtin/remote.c:596 builtin/remote.c:602
+#, c-format
+msgid "Could not append '%s' to '%s'"
+msgstr "„%s“ не може да се добави към „%s“"
+
+#: builtin/remote.c:634 builtin/remote.c:787 builtin/remote.c:885
+#, c-format
+msgid "No such remote: %s"
+msgstr "Такова отдалечено хранилище няма: %s"
+
+#: builtin/remote.c:651
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "Секцията в настройките „%s“ не може да бъде преименувана на „%s“"
+
+#: builtin/remote.c:657 builtin/remote.c:794
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "Секцията в настройките „%s“ не може да бъде изтрита"
+
+# FIXME
+#: builtin/remote.c:672
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
+msgstr ""
+"Нестандартните указатели за доставяне няма да бъдат обновени\n"
+" %s\n"
+" Променете настройките ръчно, ако е необходимо."
+
+#: builtin/remote.c:678
+#, c-format
+msgid "Could not append '%s'"
+msgstr "Секцията „%s“ не може да бъде добавена в настройките"
+
+#: builtin/remote.c:689
+#, c-format
+msgid "Could not set '%s'"
+msgstr "Секцията „%s“ не може да бъде зададена в настройките"
+
+#: builtin/remote.c:711
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "неуспешно изтриване на „%s“"
+
+#: builtin/remote.c:745
+#, c-format
+msgid "creating '%s' failed"
+msgstr "неуспешно създаване на „%s“"
+
+#: builtin/remote.c:759
+#, c-format
+msgid "Could not remove branch %s"
+msgstr "Клонът „%s“ не може да бъде изтрит"
+
+#: builtin/remote.c:829
+msgid ""
+"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
+"to delete it, use:"
+msgid_plural ""
+"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
+"to delete them, use:"
+msgstr[0] ""
+"Бележка: Клон извън йерархията „refs/remotes/“ не бе изтрит.\n"
+"Изтрийте го чрез командата:"
+msgstr[1] ""
+"Бележка: Няколко клона извън йерархията „refs/remotes/“ не бяха изтрити.\n"
+"Изтрийте ги чрез командата:"
+
+#: builtin/remote.c:938
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr " нов (следващото доставяне ще го разположи в „remotes/%s“)"
+
+#: builtin/remote.c:941
+msgid " tracked"
+msgstr " следен"
+
+#: builtin/remote.c:943
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " стар (изтрийте чрез „git remote prune“)"
+
+#: builtin/remote.c:945
+msgid " ???"
+msgstr " неясно"
+
+# CHECK
+#: builtin/remote.c:986
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr ""
+"неправилен клон за сливане „%s“. Невъзможно е да пребазирате върху повече от "
+"1 клон"
+
+#: builtin/remote.c:993
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "пребазиране върху отдалечения клон „%s“"
+
+#: builtin/remote.c:996
+#, c-format
+msgid " merges with remote %s"
+msgstr " сливане с отдалечения клон „%s“"
+
+#: builtin/remote.c:997
+msgid " and with remote"
+msgstr " и с отдалечения клон"
+
+#: builtin/remote.c:999
+#, c-format
+msgid "merges with remote %s"
+msgstr "сливане с отдалечения клон „%s“"
+
+#: builtin/remote.c:1000
+msgid " and with remote"
+msgstr " и с отдалечения клон"
+
+#: builtin/remote.c:1046
+msgid "create"
+msgstr "създаден"
+
+#: builtin/remote.c:1049
+msgid "delete"
+msgstr "изтрит"
+
+#: builtin/remote.c:1053
+msgid "up to date"
+msgstr "актуален"
+
+#: builtin/remote.c:1056
+msgid "fast-forwardable"
+msgstr "може да се слее тривиално"
+
+#: builtin/remote.c:1059
+msgid "local out of date"
+msgstr "локалният е остарял"
+
+#: builtin/remote.c:1066
+#, c-format
+msgid " %-*s forces to %-*s (%s)"
+msgstr " %-*s принудително изтласква към %-*s (%s)"
+
+#: builtin/remote.c:1069
+#, c-format
+msgid " %-*s pushes to %-*s (%s)"
+msgstr " %-*s изтласква към %-*s (%s)"
+
+#: builtin/remote.c:1073
+#, c-format
+msgid " %-*s forces to %s"
+msgstr " %-*s принудително изтласква към %s"
+
+#: builtin/remote.c:1076
+#, c-format
+msgid " %-*s pushes to %s"
+msgstr " %-*s изтласква към %s"
+
+#: builtin/remote.c:1144
+msgid "do not query remotes"
+msgstr "без заявки към отдалечените хранилища"
+
+#: builtin/remote.c:1171
+#, c-format
+msgid "* remote %s"
+msgstr "* отдалечено хранилище „%s“"
+
+#: builtin/remote.c:1172
+#, c-format
+msgid " Fetch URL: %s"
+msgstr " Адрес за доставяне: %s"
+
+#: builtin/remote.c:1173 builtin/remote.c:1318
+msgid "(no URL)"
+msgstr "(без адрес)"
+
+#: builtin/remote.c:1182 builtin/remote.c:1184
+#, c-format
+msgid " Push URL: %s"
+msgstr " Адрес за изтласкване: %s"
+
+#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
+#, c-format
+msgid " HEAD branch: %s"
+msgstr " клон в HEAD: %s"
+
+#: builtin/remote.c:1192
+#, c-format
+msgid ""
+" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgstr ""
+" клон в HEAD (клонът указан във файла HEAD от отдалеченото хранилище е\n"
+" нееднозначен и е някой от следните):\n"
+
+#: builtin/remote.c:1204
+#, c-format
+msgid " Remote branch:%s"
+msgid_plural " Remote branches:%s"
+msgstr[0] " Отдалечен клон: %s"
+msgstr[1] " Отдалечени клони: %s"
+
+#: builtin/remote.c:1207 builtin/remote.c:1234
+msgid " (status not queried)"
+msgstr " (състоянието не бе проверено)"
+
+#: builtin/remote.c:1216
+msgid " Local branch configured for 'git pull':"
+msgid_plural " Local branches configured for 'git pull':"
+msgstr[0] " Локален клон настроен за издърпване чрез „git pull“:"
+msgstr[1] " Локални клони настроени за издърпване чрез „git pull“:"
+
+#: builtin/remote.c:1224
+msgid " Local refs will be mirrored by 'git push'"
+msgstr " Локалните указатели ще бъдат пренесени чрез „ push“"
+
+#: builtin/remote.c:1231
+#, c-format
+msgid " Local ref configured for 'git push'%s:"
+msgid_plural " Local refs configured for 'git push'%s:"
+msgstr[0] " Локалният указател, настроен за „git push“%s:"
+msgstr[1] " Локалните указатели, настроени за „git push“%s:"
+
+#: builtin/remote.c:1252
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "задаване на refs/remotes/<ИМЕ>/HEAD според отдалеченото хранилище"
+